mirror of
https://github.com/u0u0/Cocos2d-Lua-Community.git
synced 2026-07-01 01:14:18 +08:00
add mac console window.
This commit is contained in:
@@ -94,14 +94,17 @@ elseif(APPLE)
|
||||
)
|
||||
elseif(MACOSX)
|
||||
list(APPEND GAME_HEADER
|
||||
${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/ConsoleWindowController.h
|
||||
)
|
||||
set(APP_UI_RES
|
||||
${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/Icon.icns
|
||||
${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/Info.plist
|
||||
${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/ConsoleWindow.xib
|
||||
)
|
||||
list(APPEND GAME_SOURCE
|
||||
${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/main.cpp
|
||||
${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/main.mm
|
||||
${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/Prefix.pch
|
||||
${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/ConsoleWindowController.m
|
||||
${APP_UI_RES}
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment defaultVersion="1070" identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4510"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="ConsoleWindowController">
|
||||
<connections>
|
||||
<outlet property="checkScroll" destination="50" id="70"/>
|
||||
<outlet property="textView" destination="6" id="20"/>
|
||||
<outlet property="topCheckBox" destination="60" id="69"/>
|
||||
<outlet property="window" destination="1" id="3"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application"/>
|
||||
<window title="Console" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" wantsToBeColor="NO" animationBehavior="default" id="1">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="40" y="40" width="854" height="400"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/>
|
||||
<view key="contentView" id="2">
|
||||
<rect key="frame" x="0.0" y="0.0" width="854" height="400"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5">
|
||||
<rect key="frame" x="-1" y="-1" width="854" height="371"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<clipView key="contentView" id="ddW-qo-Qe9">
|
||||
<rect key="frame" x="1" y="1" width="837" height="369"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textView editable="NO" importsGraphics="NO" richText="NO" findStyle="panel" verticallyResizable="YES" allowsNonContiguousLayout="YES" id="6">
|
||||
<rect key="frame" x="0.0" y="0.0" width="837" height="369"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="minSize" width="837" height="369"/>
|
||||
<size key="maxSize" width="888" height="10000000"/>
|
||||
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="minSize" width="837" height="369"/>
|
||||
<size key="maxSize" width="888" height="10000000"/>
|
||||
</textView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" id="7">
|
||||
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" id="8">
|
||||
<rect key="frame" x="838" y="1" width="15" height="369"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="46">
|
||||
<rect key="frame" x="-1" y="367" width="73" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="push" title="Clear" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="47">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="onClear:" target="-2" id="57"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="50">
|
||||
<rect key="frame" x="731" y="376" width="113" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="109" id="56"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="check" title="scroll bottom" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="51">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="onScrollChange:" target="-2" id="59"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="60">
|
||||
<rect key="frame" x="632" y="375" width="95" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="91" id="64"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="check" title="always top" bezelStyle="regularSquare" imagePosition="left" inset="2" id="61">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="onTopChange:" target="-2" id="67"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="5" secondAttribute="trailing" constant="1" id="41"/>
|
||||
<constraint firstAttribute="bottom" secondItem="5" secondAttribute="bottom" constant="-1" id="42"/>
|
||||
<constraint firstItem="5" firstAttribute="top" secondItem="2" secondAttribute="top" constant="30" id="43"/>
|
||||
<constraint firstItem="5" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="-1" id="44"/>
|
||||
<constraint firstItem="46" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="5" id="49"/>
|
||||
<constraint firstItem="50" firstAttribute="baseline" secondItem="46" secondAttribute="baseline" id="52"/>
|
||||
<constraint firstAttribute="trailing" secondItem="50" secondAttribute="trailing" constant="12" id="53"/>
|
||||
<constraint firstItem="5" firstAttribute="top" secondItem="50" secondAttribute="bottom" constant="8" symbolic="YES" id="54"/>
|
||||
<constraint firstItem="60" firstAttribute="centerY" secondItem="46" secondAttribute="centerY" id="63"/>
|
||||
<constraint firstItem="50" firstAttribute="leading" secondItem="60" secondAttribute="trailing" constant="8" symbolic="YES" id="66"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="4"/>
|
||||
</connections>
|
||||
</window>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,24 @@
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface ConsoleWindowController : NSWindowController
|
||||
{
|
||||
NSTextView *textView;
|
||||
IBOutlet NSButton *checkScroll;
|
||||
IBOutlet NSButton *topCheckBox;
|
||||
NSMutableArray *linesCount;
|
||||
|
||||
NSFileHandle *readHandle;
|
||||
}
|
||||
|
||||
@property (assign) IBOutlet NSTextView *textView;
|
||||
|
||||
- (void) trace:(NSString*)msg;
|
||||
- (IBAction)onClear:(id)sender;
|
||||
- (IBAction)onScrollChange:(id)sender;
|
||||
- (IBAction)onTopChange:(id)sender;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
|
||||
#import "ConsoleWindowController.h"
|
||||
|
||||
@interface ConsoleWindowController ()
|
||||
|
||||
@end
|
||||
|
||||
#define MAX_LINES_COUNT 200
|
||||
|
||||
@implementation ConsoleWindowController
|
||||
@synthesize textView;
|
||||
|
||||
- (id)initWithWindow:(NSWindow *)window
|
||||
{
|
||||
self = [super initWithWindow:window];
|
||||
if (self)
|
||||
{
|
||||
// Initialization code here.
|
||||
linesCount = [[NSMutableArray arrayWithCapacity:MAX_LINES_COUNT + 1] retain];
|
||||
// init pipe
|
||||
NSPipe *pipe = [NSPipe pipe];
|
||||
readHandle = [pipe fileHandleForReading];
|
||||
int outfd = [[pipe fileHandleForWriting] fileDescriptor];
|
||||
if (dup2(outfd, fileno(stderr)) != fileno(stderr) || dup2(outfd, fileno(stdout)) != fileno(stdout)) {
|
||||
perror("Unable to redirect output");
|
||||
} else {
|
||||
[[NSNotificationCenter defaultCenter] addObserver: self
|
||||
selector: @selector(handleNotification:)
|
||||
name: NSFileHandleReadCompletionNotification
|
||||
object: readHandle];
|
||||
[readHandle readInBackgroundAndNotify];
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[linesCount release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)windowDidLoad
|
||||
{
|
||||
[super windowDidLoad];
|
||||
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
|
||||
}
|
||||
|
||||
- (void)handleNotification:(NSNotification *)note
|
||||
{
|
||||
[readHandle readInBackgroundAndNotify];
|
||||
NSData *data = [[note userInfo] objectForKey:NSFileHandleNotificationDataItem];
|
||||
NSString *str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
|
||||
if (str) {
|
||||
[self trace:str];
|
||||
} else {
|
||||
NSLog(@"Received non utf8 data, can't print");
|
||||
}
|
||||
}
|
||||
|
||||
- (void) trace:(NSString*)msg
|
||||
{
|
||||
NSFont *font = [NSFont fontWithName:@"Monaco" size:12.0];
|
||||
NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
|
||||
NSAttributedString *string = [[[NSAttributedString alloc] initWithString:msg attributes:attrsDictionary] autorelease];
|
||||
NSNumber *len = [NSNumber numberWithUnsignedInteger:[string length]];
|
||||
[linesCount addObject:len];
|
||||
|
||||
NSTextStorage *storage = [textView textStorage];
|
||||
[storage beginEditing];
|
||||
[storage appendAttributedString:string];
|
||||
|
||||
if ([linesCount count] >= MAX_LINES_COUNT)
|
||||
{
|
||||
len = [linesCount objectAtIndex:0];
|
||||
[storage deleteCharactersInRange:NSMakeRange(0, [len unsignedIntegerValue])];
|
||||
[linesCount removeObjectAtIndex:0];
|
||||
}
|
||||
|
||||
[storage endEditing];
|
||||
[textView setTextColor:[NSColor systemBlueColor]];// log text color
|
||||
[self changeScroll];
|
||||
}
|
||||
|
||||
- (void) changeScroll
|
||||
{
|
||||
BOOL scroll = [checkScroll state] == NSControlStateValueOn;
|
||||
if(scroll)
|
||||
{
|
||||
[self.textView scrollRangeToVisible: NSMakeRange(self.textView.string.length, 0)];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)onClear:(id)sender
|
||||
{
|
||||
NSTextStorage *storage = [textView textStorage];
|
||||
[storage setAttributedString:[[[NSAttributedString alloc] initWithString:@""] autorelease]];
|
||||
}
|
||||
|
||||
- (IBAction)onScrollChange:(id)sender
|
||||
{
|
||||
[self changeScroll];
|
||||
}
|
||||
|
||||
- (IBAction)onTopChange:(id)sender
|
||||
{
|
||||
BOOL isTop = [topCheckBox state] == NSControlStateValueOn;
|
||||
if(isTop)
|
||||
{
|
||||
[self.window setLevel:NSFloatingWindowLevel];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self.window setLevel:NSNormalWindowLevel];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,12 +0,0 @@
|
||||
|
||||
#include "AppDelegate.h"
|
||||
#include "cocos2d.h"
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
AppDelegate app;
|
||||
return Application::getInstance()->run();
|
||||
}
|
||||
|
||||
20
templates/frameworks/runtime-src/proj.ios_mac/mac/main.mm
Normal file
20
templates/frameworks/runtime-src/proj.ios_mac/mac/main.mm
Normal file
@@ -0,0 +1,20 @@
|
||||
#import "ConsoleWindowController.h"
|
||||
#include "AppDelegate.h"
|
||||
#include "cocos2d.h"
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
// uncomment below line, open debug console.
|
||||
#define USE_CONSOLE_WINDOW
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
AppDelegate app;
|
||||
|
||||
#ifdef USE_CONSOLE_WINDOW
|
||||
ConsoleWindowController *consoleController = [[ConsoleWindowController alloc] initWithWindowNibName:@"ConsoleWindow"];
|
||||
[consoleController.window orderFrontRegardless];
|
||||
#endif
|
||||
|
||||
return Application::getInstance()->run();
|
||||
}
|
||||
Reference in New Issue
Block a user