diff options
26 files changed, 2454 insertions, 2807 deletions
| diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index c96f2191f3..2a8eea88b6 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -67,7 +67,7 @@ using namespace llsd;  #	include <sys/sysctl.h>  #	include <sys/utsname.h>  #	include <stdint.h> -#	include <Carbon/Carbon.h> +#	include <CoreServices/CoreServices.h>  #   include <stdexcept>  #	include <mach/host_info.h>  #	include <mach/mach_host.h> diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 341bddfffd..84e0169826 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -75,11 +75,14 @@ if (DARWIN)      llkeyboardmacosx.cpp      llwindowmacosx.cpp      llwindowmacosx-objc.mm +    llopenglview-objc.mm      )    list(APPEND llwindow_HEADER_FILES      llkeyboardmacosx.h      llwindowmacosx.h      llwindowmacosx-objc.h +    llopenglview-objc.h +    llappdelegate-objc.h      )    # We use a bunch of deprecated system APIs. diff --git a/indra/llwindow/llappdelegate-objc.h b/indra/llwindow/llappdelegate-objc.h new file mode 100644 index 0000000000..56b7a30797 --- /dev/null +++ b/indra/llwindow/llappdelegate-objc.h @@ -0,0 +1,22 @@ +// +//  LLAppDelegate.h +//  SecondLife +// +//  Created by Geenz on 12/16/12. +// +// + +#import <Cocoa/Cocoa.h> +#import "llopenglview-objc.h" +#include "llwindowmacosx-objc.h" + +@interface LLAppDelegate : NSObject <NSApplicationDelegate> { +	LLNSWindow *window; +	NSTimer *frameTimer; +} + +@property (assign) IBOutlet LLNSWindow *window; + +- (void) mainLoop; + +@end diff --git a/indra/llwindow/llkeyboardmacosx.cpp b/indra/llwindow/llkeyboardmacosx.cpp index 7f8f303517..59cc2acaec 100644 --- a/indra/llwindow/llkeyboardmacosx.cpp +++ b/indra/llwindow/llkeyboardmacosx.cpp @@ -30,7 +30,7 @@  #include "llkeyboardmacosx.h"  #include "llwindowcallbacks.h" -#include <Carbon/Carbon.h> +#include "llwindowmacosx-objc.h"  LLKeyboardMacOSX::LLKeyboardMacOSX()  { @@ -162,23 +162,25 @@ LLKeyboardMacOSX::LLKeyboardMacOSX()  void LLKeyboardMacOSX::resetMaskKeys()  { -	U32 mask = GetCurrentEventKeyModifiers(); +	U32 mask = getModifiers();  	// MBW -- XXX -- This mirrors the operation of the Windows version of resetMaskKeys().  	//    It looks a bit suspicious, as it won't correct for keys that have been released.  	//    Is this the way it's supposed to work? +	 +	// We apply the modifier masks directly within getModifiers.  So check to see which masks we've applied. -	if(mask & shiftKey) +	if(mask & MAC_SHIFT_KEY)  	{  		mKeyLevel[KEY_SHIFT] = TRUE;  	} -	if(mask & (controlKey)) +	if(mask & MAC_CTRL_KEY)  	{  		mKeyLevel[KEY_CONTROL] = TRUE;  	} -	if(mask & optionKey) +	if(mask & MAC_ALT_KEY)  	{  		mKeyLevel[KEY_ALT] = TRUE;  	} @@ -201,17 +203,17 @@ MASK LLKeyboardMacOSX::updateModifiers(const U32 mask)  	// translate the mask  	MASK out_mask = 0; -	if(mask & shiftKey) +	if(mask & MAC_SHIFT_KEY)  	{  		out_mask |= MASK_SHIFT;  	} -	if(mask & (controlKey | cmdKey)) +	if(mask & MAC_CTRL_KEY || mask & MAC_CMD_KEY)  	{  		out_mask |= MASK_CONTROL;  	} -	if(mask & optionKey) +	if(mask & MAC_ALT_KEY)  	{  		out_mask |= MASK_ALT;  	} @@ -231,7 +233,7 @@ BOOL LLKeyboardMacOSX::handleKeyDown(const U16 key, const U32 mask)  	{  		handled = handleTranslatedKeyDown(translated_key, translated_mask);  	} - +	  	return handled;  } @@ -246,6 +248,7 @@ BOOL LLKeyboardMacOSX::handleKeyUp(const U16 key, const U32 mask)  	if(translateNumpadKey(key, &translated_key))  	{ +		LL_INFOS("Keyboard") << "Handled key!" << LL_ENDL;  		handled = handleTranslatedKeyUp(translated_key, translated_mask);  	} @@ -255,18 +258,18 @@ BOOL LLKeyboardMacOSX::handleKeyUp(const U16 key, const U32 mask)  MASK LLKeyboardMacOSX::currentMask(BOOL for_mouse_event)  {  	MASK result = MASK_NONE; -	U32 mask = GetCurrentEventKeyModifiers(); +	U32 mask = getModifiers(); -	if (mask & shiftKey)			result |= MASK_SHIFT; -	if (mask & controlKey)			result |= MASK_CONTROL; -	if (mask & optionKey)			result |= MASK_ALT; +	if (mask & MAC_SHIFT_KEY)			result |= MASK_SHIFT; +	if (mask & MAC_CTRL_KEY)			result |= MASK_CONTROL; +	if (mask & MAC_ALT_KEY)			result |= MASK_ALT;  	// For keyboard events, consider Command equivalent to Control  	if (!for_mouse_event)  	{ -		if (mask & cmdKey) result |= MASK_CONTROL; +		if (mask & MAC_CMD_KEY) result |= MASK_CONTROL;  	} - +	  	return result;  } diff --git a/indra/llwindow/llkeyboardmacosx.h b/indra/llwindow/llkeyboardmacosx.h index f09ff720ce..6e1f4d3b96 100644 --- a/indra/llwindow/llkeyboardmacosx.h +++ b/indra/llwindow/llkeyboardmacosx.h @@ -29,6 +29,15 @@  #include "llkeyboard.h" +// These more or less mirror their equivalents in NSEvent.h. +enum EMacEventKeys { +	MAC_SHIFT_KEY = 1 << 17, +	MAC_CTRL_KEY = 1 << 18, +	MAC_ALT_KEY = 1 << 19, +	MAC_CMD_KEY = 1 << 20, +	MAC_FN_KEY = 1 << 23 +}; +  class LLKeyboardMacOSX : public LLKeyboard  {  public: diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h new file mode 100644 index 0000000000..cc1618b3bc --- /dev/null +++ b/indra/llwindow/llopenglview-objc.h @@ -0,0 +1,64 @@ +// +//  LLOpenGLView.h +//  SecondLife +// +//  Created by Geenz on 10/2/12. +// +// + +#import <Cocoa/Cocoa.h> +#include "llwindowmacosx-objc.h" + +// Some nasty shovelling of LLOpenGLView from LLNativeBindings to prevent any C++ <-> Obj-C interop oddities. +// Redraw callback handling removed (for now) due to being unneeded in the patch that preceeds this addition. + +@interface LLOpenGLView : NSOpenGLView +{ +	std::string mLastDraggedUrl; +} + +- (id) initWithFrame:(NSRect)frame withSamples:(NSUInteger)samples andVsync:(BOOL)vsync; + +// rebuildContext +// Destroys and recreates a context with the view's internal format set via setPixelFormat; +// Use this in event of needing to rebuild a context for whatever reason, without needing to assign a new pixel format. +- (BOOL) rebuildContext; + +// rebuildContextWithFormat +// Destroys and recreates a context with the specified pixel format. +- (BOOL) rebuildContextWithFormat:(NSOpenGLPixelFormat *)format; + +// These are mostly just for C++ <-> Obj-C interop.  We can manipulate the CGLContext from C++ without reprecussions. +- (CGLContextObj) getCGLContextObj; +- (CGLPixelFormatObj*)getCGLPixelFormatObj; + +@end + +@interface LLNSWindow : NSWindow { +	float mMousePos[2]; +	unsigned int mModifiers; +} + +- (NSPoint)convertToScreenFromLocalPoint:(NSPoint)point relativeToView:(NSView *)view; +- (NSPoint)flipPoint:(NSPoint)aPoint; + +@end + +@interface NSScreen (PointConversion) + +/* + Returns the screen where the mouse resides + */ ++ (NSScreen *)currentScreenForMouseLocation; + +/* + Allows you to convert a point from global coordinates to the current screen coordinates. + */ +- (NSPoint)convertPointToScreenCoordinates:(NSPoint)aPoint; + +/* + Allows to flip the point coordinates, so y is 0 at the top instead of the bottom. x remains the same + */ +- (NSPoint)flipPoint:(NSPoint)aPoint; + +@end diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm new file mode 100644 index 0000000000..b79b7b3fa5 --- /dev/null +++ b/indra/llwindow/llopenglview-objc.mm @@ -0,0 +1,473 @@ +// +//  LLOpenGLView.m +//  SecondLife +// +//  Created by Geenz on 10/2/12. +// +// + +#import "llopenglview-objc.h" + +@implementation NSScreen (PointConversion) + ++ (NSScreen *)currentScreenForMouseLocation +{ +    NSPoint mouseLocation = [NSEvent mouseLocation]; +     +    NSEnumerator *screenEnumerator = [[NSScreen screens] objectEnumerator]; +    NSScreen *screen; +    while ((screen = [screenEnumerator nextObject]) && !NSMouseInRect(mouseLocation, screen.frame, NO)) +        ; +     +    return screen; +} + +- (NSPoint)convertPointToScreenCoordinates:(NSPoint)aPoint +{ +    float normalizedX = fabs(fabs(self.frame.origin.x) - fabs(aPoint.x)); +    float normalizedY = aPoint.y - self.frame.origin.y; +     +    return NSMakePoint(normalizedX, normalizedY); +} + +- (NSPoint)flipPoint:(NSPoint)aPoint +{ +    return NSMakePoint(aPoint.x, self.frame.size.height - aPoint.y); +} + +@end + +@implementation LLOpenGLView + +- (void)viewDidMoveToWindow +{ +	[[NSNotificationCenter defaultCenter] addObserver:self +											 selector:@selector(windowResized:) name:NSWindowDidResizeNotification +											   object:[self window]]; +} + +- (void)windowResized:(NSNotification *)notification; +{ +	NSSize size = [self frame].size; +	 +	callResize(size.width, size.height); +} + +- (void)dealloc +{ +	[[NSNotificationCenter defaultCenter] removeObserver:self]; +	[super dealloc]; +} + +- (id) init +{ +	//[self registerForDraggedTypes:[NSArray arrayWithObjects:NSURLPboardType, NSFilenamesPboardType, nil]]; +	return [self initWithFrame:[self bounds] withSamples:2 andVsync:TRUE]; +} + +- (id) initWithFrame:(NSRect)frame withSamples:(NSUInteger)samples andVsync:(BOOL)vsync +{ +	[self registerForDraggedTypes:[NSArray arrayWithObject:NSURLPboardType]]; +	[self initWithFrame:frame]; +	 +	// Initialize with a default "safe" pixel format that will work with versions dating back to OS X 10.6. +	// Any specialized pixel formats, i.e. a core profile pixel format, should be initialized through rebuildContextWithFormat. +	// 10.7 and 10.8 don't really care if we're defining a profile or not.  If we don't explicitly request a core or legacy profile, it'll always assume a legacy profile (for compatibility reasons). +	NSOpenGLPixelFormatAttribute attrs[] = { +        NSOpenGLPFANoRecovery, +		NSOpenGLPFADoubleBuffer, +		NSOpenGLPFAClosestPolicy, +		NSOpenGLPFAAccelerated, +		NSOpenGLPFASampleBuffers, (samples > 0 ? 1 : 0), +		NSOpenGLPFASamples, samples, +		NSOpenGLPFAStencilSize, 8, +		NSOpenGLPFADepthSize, 24, +		NSOpenGLPFAAlphaSize, 8, +		NSOpenGLPFAColorSize, 24, +		0 +    }; +	 +	NSOpenGLPixelFormat *pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attrs] autorelease]; +	 +	if (pixelFormat == nil) +	{ +		NSLog(@"Failed to create pixel format!", nil); +		return nil; +	} +	 +	NSOpenGLContext *glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil]; +	 +	if (glContext == nil) +	{ +		NSLog(@"Failed to create OpenGL context!", nil); +		return nil; +	} +	 +	[self setPixelFormat:pixelFormat]; +	 +	[self setOpenGLContext:glContext]; +	 +	[glContext setView:self]; +	 +	[glContext makeCurrentContext]; +	 +	if (vsync) +	{ +		[glContext setValues:(const GLint*)1 forParameter:NSOpenGLCPSwapInterval]; +	} else { +		[glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval]; +	} +	 +	return self; +} + +- (BOOL) rebuildContext +{ +	return [self rebuildContextWithFormat:[self pixelFormat]]; +} + +- (BOOL) rebuildContextWithFormat:(NSOpenGLPixelFormat *)format +{ +	NSOpenGLContext *ctx = [self openGLContext]; +	 +	[ctx clearDrawable]; +	[ctx initWithFormat:format shareContext:nil]; +	 +	if (ctx == nil) +	{ +		NSLog(@"Failed to create OpenGL context!", nil); +		return false; +	} +	 +	[self setOpenGLContext:ctx]; +	[ctx setView:self]; +	[ctx makeCurrentContext]; +	return true; +} + +- (CGLContextObj)getCGLContextObj +{ +	NSOpenGLContext *ctx = [self openGLContext]; +	return (CGLContextObj)[ctx CGLContextObj]; +} + +- (CGLPixelFormatObj*)getCGLPixelFormatObj +{ +	NSOpenGLPixelFormat *fmt = [self pixelFormat]; +	return (CGLPixelFormatObj*)[fmt	CGLPixelFormatObj]; +} + +// Various events can be intercepted by our view, thus not reaching our window. +// Intercept these events, and pass them to the window as needed. - Geenz + +- (void) mouseDragged:(NSEvent *)theEvent +{ +	[_window mouseDragged:theEvent]; +} + +- (void) scrollWheel:(NSEvent *)theEvent +{ +	[_window scrollWheel:theEvent]; +} + +- (void) mouseDown:(NSEvent *)theEvent +{ +	[_window mouseDown:theEvent]; +} + +- (void) mouseUp:(NSEvent *)theEvent +{ +	[_window mouseUp:theEvent]; +} + +- (void) rightMouseDown:(NSEvent *)theEvent +{ +	[_window rightMouseDown:theEvent]; +} + +- (void) rightMouseUp:(NSEvent *)theEvent +{ +	[_window rightMouseUp:theEvent]; +} + +- (void) otherMouseDown:(NSEvent *)theEvent +{ +	[_window otherMouseDown:theEvent]; +} + +- (void) otherMouseUp:(NSEvent *)theEvent +{ +	[_window otherMouseUp:theEvent]; +} + +- (void) keyUp:(NSEvent *)theEvent +{ +	[_window keyUp:theEvent]; +} + +- (void) keyDown:(NSEvent *)theEvent +{ +	[_window keyDown:theEvent]; +} + +- (void) mouseMoved:(NSEvent *)theEvent +{ +	[_window mouseMoved:theEvent]; +} + +- (void) flagsChanged:(NSEvent *)theEvent +{ +	[_window flagsChanged:theEvent]; +} + +- (void) mouseExited:(NSEvent *)theEvent +{ +	[_window mouseExited:theEvent]; +} + +- (BOOL) becomeFirstResponder +{ +	return [_window becomeFirstResponder]; +} + +- (BOOL) resignFirstResponder +{ +	return [_window resignFirstResponder]; +} + +- (NSDragOperation) draggingEntered:(id<NSDraggingInfo>)sender +{ +	NSPasteboard *pboard; +    NSDragOperation sourceDragMask; +	 +	sourceDragMask = [sender draggingSourceOperationMask]; +	 +	pboard = [sender draggingPasteboard]; +	 +	if ([[pboard types] containsObject:NSURLPboardType]) +	{ +		if (sourceDragMask & NSDragOperationLink) { +			NSURL *fileUrl = [[pboard readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] options:[NSDictionary dictionary]] objectAtIndex:0]; +			mLastDraggedUrl = [[fileUrl absoluteString] UTF8String]; +            return NSDragOperationLink; +        } +	} +	return NSDragOperationNone; +} + +- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender +{ +	callHandleDragUpdated(mLastDraggedUrl); +	 +	return NSDragOperationLink; +} + +- (void) draggingExited:(id<NSDraggingInfo>)sender +{ +	callHandleDragExited(mLastDraggedUrl); +} + +- (BOOL)prepareForDragOperation:(id < NSDraggingInfo >)sender +{ +	return YES; +} + +- (BOOL) performDragOperation:(id<NSDraggingInfo>)sender +{ +	callHandleDragDropped(mLastDraggedUrl); +	return true; +} + +@end + +// We use a custom NSWindow for our event handling. +// Why not an NSWindowController you may ask? +// Answer: this is easier. + +@implementation LLNSWindow + +- (id) init +{ +	 +	return self; +} + +- (void) keyDown:(NSEvent *)theEvent +{ +	uint keycode = [theEvent keyCode]; +	 +	switch (keycode) { +		case 0x7b: +		case 0x7c: +		case 0x7d: +		case 0x7e: +			callKeyDown(keycode, mModifiers); +			break; +			 +		default: +			callKeyDown(keycode, mModifiers); +			NSString *chars = [theEvent characters]; +			for (uint i = 0; i < [chars length]; i++) { +				// Enter and Return are special cases. +				unichar returntest = [chars characterAtIndex:i]; +				if ((returntest == NSCarriageReturnCharacter || returntest == NSEnterCharacter) && +					!([theEvent modifierFlags] & NSCommandKeyMask) && +					!([theEvent modifierFlags] & NSAlternateKeyMask) && +					!([theEvent modifierFlags] & NSControlKeyMask)) +				{ +					callUnicodeCallback(13, 0); +				} else { +					// The command key being pressed is also a special case. +					// Control + <character> produces an ASCII control character code. +					// Command + <character> produces just the character's code. +					// Check to see if the command key is pressed, then filter through the different character ranges that are relevant to control characters, and subtract the appropriate range. +					if ([theEvent modifierFlags] & NSCommandKeyMask) +					{ +						if (returntest >= 64 && returntest <= 95) +						{ +							callUnicodeCallback(returntest - 63, mModifiers); +						} else if (returntest >= 97 && returntest <= 122) +						{ +							callUnicodeCallback(returntest - 96, mModifiers); +						} +					} else { +						callUnicodeCallback(returntest, mModifiers); +					} +				} +			} +			break; +	} +} + +- (void) keyUp:(NSEvent *)theEvent { +	callKeyUp([theEvent keyCode], mModifiers); +} + +- (void)flagsChanged:(NSEvent *)theEvent { +	mModifiers = [theEvent modifierFlags]; +} + +- (void) mouseDown:(NSEvent *)theEvent +{ +	if ([theEvent clickCount] >= 2) +	{ +		callDoubleClick(mMousePos, mModifiers); +	} else if ([theEvent clickCount] == 1) { +		callLeftMouseDown(mMousePos, mModifiers); +	} +} + +- (void) mouseUp:(NSEvent *)theEvent +{ +	callLeftMouseUp(mMousePos, mModifiers); +} + +- (void) rightMouseDown:(NSEvent *)theEvent +{ +	callRightMouseDown(mMousePos, mModifiers); +} + +- (void) rightMouseUp:(NSEvent *)theEvent +{ +	callRightMouseUp(mMousePos, mModifiers); +} + +- (void)mouseMoved:(NSEvent *)theEvent +{ +	float mouseDeltas[2] = { +		[theEvent deltaX], +		[theEvent deltaY] +	}; +	 +	callDeltaUpdate(mouseDeltas, 0); +	 +	NSPoint mPoint = [theEvent locationInWindow]; +	mMousePos[0] = mPoint.x; +	mMousePos[1] = mPoint.y; +	callMouseMoved(mMousePos, 0); +} + +// NSWindow doesn't trigger mouseMoved when the mouse is being clicked and dragged. +// Use mouseDragged for situations like this to trigger our movement callback instead. + +- (void) mouseDragged:(NSEvent *)theEvent +{ +	// Trust the deltas supplied by NSEvent. +	// The old CoreGraphics APIs we previously relied on are now flagged as obsolete. +	// NSEvent isn't obsolete, and provides us with the correct deltas. +	float mouseDeltas[2] = { +		[theEvent deltaX], +		[theEvent deltaY] +	}; +	 +	callDeltaUpdate(mouseDeltas, 0); +	 +	NSPoint mPoint = [theEvent locationInWindow]; +	mMousePos[0] = mPoint.x; +	mMousePos[1] = mPoint.y; +	callMouseMoved(mMousePos, 0); +} + +- (void) otherMouseDown:(NSEvent *)theEvent +{ +	callMiddleMouseDown(mMousePos, mModifiers); +} + +- (void) otherMouseUp:(NSEvent *)theEvent +{ +	callMiddleMouseUp(mMousePos, mModifiers); +} + +- (void) otherMouseDragged:(NSEvent *)theEvent +{ +	 +} + +- (void) scrollWheel:(NSEvent *)theEvent +{ +	callScrollMoved(-[theEvent deltaY]); +} + +- (void) mouseExited:(NSEvent *)theEvent +{ +	callMouseExit(); +} + + + +- (NSPoint)convertToScreenFromLocalPoint:(NSPoint)point relativeToView:(NSView *)view +{ +	NSScreen *currentScreen = [NSScreen currentScreenForMouseLocation]; +	if(currentScreen) +	{ +		NSPoint windowPoint = [view convertPoint:point toView:nil]; +		NSPoint screenPoint = [[view window] convertBaseToScreen:windowPoint]; +		NSPoint flippedScreenPoint = [currentScreen flipPoint:screenPoint]; +		flippedScreenPoint.y += [currentScreen frame].origin.y; +		 +		return flippedScreenPoint; +	} +	 +	return NSZeroPoint; +} + +- (NSPoint)flipPoint:(NSPoint)aPoint +{ +    return NSMakePoint(aPoint.x, self.frame.size.height - aPoint.y); +} + +- (BOOL) becomeFirstResponder +{ +	NSLog(@"Window gained focus!"); +	callFocus(); +	return true; +} + +- (BOOL) resignFirstResponder +{ +	NSLog(@"Window lost focus!"); +	callFocus(); +	return true; +} + +@end diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h index 7893dedda4..ebc1633f9d 100644 --- a/indra/llwindow/llwindowmacosx-objc.h +++ b/indra/llwindow/llwindowmacosx-objc.h @@ -25,13 +25,84 @@   * $/LicenseInfo$   */ -  // This will actually hold an NSCursor*, but that type is only available in objective C.  typedef void *CursorRef; +typedef void *NSWindowRef; +typedef void *GLViewRef; + +// These are defined in llappviewermacosx.cpp. +bool initViewer(); +void handleQuit(); +bool runMainLoop(); +void initMainLoop(); +void cleanupViewer();  /* Defined in llwindowmacosx-objc.mm: */ +int createNSApp(int argc, const char **argv);  void setupCocoa(); +bool pasteBoardAvailable(); +bool copyToPBoard(const unsigned short *str, unsigned int len); +const unsigned short *copyFromPBoard();  CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY); -OSErr releaseImageCursor(CursorRef ref); -OSErr setImageCursor(CursorRef ref); +short releaseImageCursor(CursorRef ref); +short setImageCursor(CursorRef ref); +void setArrowCursor(); +void setIBeamCursor(); +void setPointingHandCursor(); +void setCopyCursor(); +void setCrossCursor(); +void setNotAllowedCursor(); +void hideNSCursor(); +void showNSCursor(); +void hideNSCursorTillMove(bool hide); + +NSWindowRef createNSWindow(int x, int y, int width, int height); + +#include <OpenGL/OpenGL.h> +GLViewRef createOpenGLView(NSWindowRef window); +void glSwapBuffers(void* context); +CGLContextObj getCGLContextObj(GLViewRef view); +void getContentViewBounds(NSWindowRef window, float* bounds); +void getWindowSize(NSWindowRef window, float* size); +void setWindowSize(NSWindowRef window, int width, int height); +void getCursorPos(NSWindowRef window, float* pos); +void makeWindowOrderFront(NSWindowRef window); +void convertScreenToWindow(NSWindowRef window, float *coord); +void convertWindowToScreen(NSWindowRef window, float *coord); +void convertScreenToView(NSWindowRef window, float *coord); +void setWindowPos(NSWindowRef window, float* pos); +void closeWindow(NSWindowRef window); +void removeGLView(GLViewRef view); + +// These are all implemented in llwindowmacosx.cpp. +// This is largely for easier interop between Obj-C and C++ (at least in the viewer's case due to the BOOL vs. BOOL conflict) +void callKeyUp(unsigned short key, unsigned int mask); +void callKeyDown(unsigned short key, unsigned int mask); +void callUnicodeCallback(wchar_t character, unsigned int mask); +void callRightMouseDown(float *pos, unsigned int mask); +void callRightMouseUp(float *pos, unsigned int mask); +void callLeftMouseDown(float *pos, unsigned int mask); +void callLeftMouseUp(float *pos, unsigned int mask); +void callDoubleClick(float *pos, unsigned int mask); +void callResize(unsigned int width, unsigned int height); +void callMouseMoved(float *pos, unsigned int mask); +void callScrollMoved(float delta); +void callMouseExit(); +void callWindowFocus(); +void callWindowUnfocus(); +void callDeltaUpdate(float *delta, unsigned int mask); +void callMiddleMouseDown(float *pos, unsigned int mask); +void callMiddleMouseUp(float *pos, unsigned int mask); +void callFocus(); +void callFocusLost(); + +#include <string> +void callHandleDragEntered(std::string url); +void callHandleDragExited(std::string url); +void callHandleDragUpdated(std::string url); +void callHandleDragDropped(std::string url); + +NSWindowRef getMainAppWindow(); +GLViewRef getGLView(); +unsigned int getModifiers(); diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index bebb537cd8..b123ba0711 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -26,6 +26,10 @@   */  #include <AppKit/AppKit.h> +#include <Cocoa/Cocoa.h> +#include "llwindowmacosx-objc.h" +#include "llopenglview-objc.h" +#include "llappdelegate-objc.h"  /*   * These functions are broken out into a separate file because the @@ -34,7 +38,10 @@   * linden headers with any objective-C++ source.   */ -#include "llwindowmacosx-objc.h" +int createNSApp(int argc, const char *argv[]) +{ +	return NSApplicationMain(argc, argv); +}  void setupCocoa()  { @@ -48,15 +55,6 @@ void setupCocoa()  		// ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr'   		// when init'ing the Cocoa App window.		  		[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; -		 -		// This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor": -		//   http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html -		 -		//	Needed for Carbon based applications which call into Cocoa -		NSApplicationLoad(); - -		//	Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image -		[[[NSWindow alloc] init] release];  		[pool release]; @@ -64,6 +62,41 @@ void setupCocoa()  	}  } +bool copyToPBoard(const unsigned short *str, unsigned int len) +{ +	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; +	NSPasteboard *pboard = [NSPasteboard generalPasteboard]; +	[pboard clearContents]; +	 +	NSArray *contentsToPaste = [[NSArray alloc] initWithObjects:[NSString stringWithCharacters:str length:len], nil]; +	[pool release]; +	return [pboard writeObjects:contentsToPaste]; +} + +bool pasteBoardAvailable() +{ +	NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; +	return [[NSPasteboard generalPasteboard] canReadObjectForClasses:classArray options:[NSDictionary dictionary]]; +} + +const unsigned short *copyFromPBoard() +{ +	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; +	NSPasteboard *pboard = [NSPasteboard generalPasteboard]; +	NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; +	NSString *str = NULL; +	BOOL ok = [pboard canReadObjectForClasses:classArray options:[NSDictionary dictionary]]; +	if (ok) +	{ +		NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]]; +		str = [objToPaste objectAtIndex:0]; +	} +	unichar* temp = (unichar*)calloc([str length], sizeof(unichar)); +	[str getCharacters:temp]; +	[pool release]; +	return temp; +} +  CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)  {  	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; @@ -83,6 +116,57 @@ CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)  	return (CursorRef)cursor;  } +void setArrowCursor() +{ +	NSCursor *cursor = [NSCursor arrowCursor]; +	[cursor set]; +} + +void setIBeamCursor() +{ +	NSCursor *cursor = [NSCursor IBeamCursor]; +	[cursor set]; +} + +void setPointingHandCursor() +{ +	NSCursor *cursor = [NSCursor pointingHandCursor]; +	[cursor set]; +} + +void setCopyCursor() +{ +	NSCursor *cursor = [NSCursor dragCopyCursor]; +	[cursor set]; +} + +void setCrossCursor() +{ +	NSCursor *cursor = [NSCursor crosshairCursor]; +	[cursor set]; +} + +void setNotAllowedCursor() +{ +	NSCursor *cursor = [NSCursor operationNotAllowedCursor]; +	[cursor set]; +} + +void hideNSCursor() +{ +	[NSCursor hide]; +} + +void showNSCursor() +{ +	[NSCursor unhide]; +} + +void hideNSCursorTillMove(bool hide) +{ +	[NSCursor setHiddenUntilMouseMoves:hide]; +} +  // This is currently unused, since we want all our cursors to persist for the life of the app, but I've included it for completeness.  OSErr releaseImageCursor(CursorRef ref)  { @@ -118,3 +202,137 @@ OSErr setImageCursor(CursorRef ref)  	return noErr;  } +// Now for some unholy juggling between generic pointers and casting them to Obj-C objects! +// Note: things can get a bit hairy from here.  This is not for the faint of heart. + +NSWindowRef createNSWindow(int x, int y, int width, int height) +{ +	LLNSWindow *window = [[LLNSWindow alloc]initWithContentRect:NSMakeRect(x, y, width, height) +						styleMask:NSTitledWindowMask | NSResizableWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSTexturedBackgroundWindowMask backing:NSBackingStoreBuffered defer:NO]; +	[window makeKeyAndOrderFront:nil]; +	[window setAcceptsMouseMovedEvents:TRUE]; +	return window; +} + +GLViewRef createOpenGLView(NSWindowRef window) +{ +	LLOpenGLView *glview = [[LLOpenGLView alloc]initWithFrame:[(LLNSWindow*)window frame] withSamples:0 andVsync:FALSE]; +	[(LLNSWindow*)window setContentView:glview]; +	return glview; +} + +void glSwapBuffers(void* context) +{ +	[(NSOpenGLContext*)context flushBuffer]; +} + +CGLContextObj getCGLContextObj(GLViewRef view) +{ +	return [(LLOpenGLView *)view getCGLContextObj]; +} + +CGLPixelFormatObj* getCGLPixelFormatObj(NSWindowRef window) +{ +	LLOpenGLView *glview = [(LLNSWindow*)window contentView]; +	return [glview getCGLPixelFormatObj]; +} + +void getContentViewBounds(NSWindowRef window, float* bounds) +{ +	bounds[0] = [[(LLNSWindow*)window contentView] bounds].origin.x; +	bounds[1] = [[(LLNSWindow*)window contentView] bounds].origin.y; +	bounds[2] = [[(LLNSWindow*)window contentView] bounds].size.width; +	bounds[3] = [[(LLNSWindow*)window contentView] bounds].size.height; +} + +void getWindowSize(NSWindowRef window, float* size) +{ +	NSRect frame = [(LLNSWindow*)window frame]; +	size[0] = frame.origin.x; +	size[1] = frame.origin.y; +	size[2] = frame.size.width; +	size[3] = frame.size.height; +} + +void setWindowSize(NSWindowRef window, int width, int height) +{ +	NSRect frame = [(LLNSWindow*)window frame]; +	frame.size.width = width; +	frame.size.height = height; +	[(LLNSWindow*)window setFrame:frame display:TRUE]; +} + +void setWindowPos(NSWindowRef window, float* pos) +{ +	NSPoint point; +	point.x = pos[0]; +	point.y = pos[1]; +	[(LLNSWindow*)window setFrameOrigin:point]; +} + +void getCursorPos(NSWindowRef window, float* pos) +{ +	NSPoint mLoc; +	mLoc = [(LLNSWindow*)window mouseLocationOutsideOfEventStream]; +	pos[0] = mLoc.x; +	pos[1] = mLoc.y; +} + +void makeWindowOrderFront(NSWindowRef window) +{ +	[(LLNSWindow*)window makeKeyAndOrderFront:nil]; +} + +void convertScreenToWindow(NSWindowRef window, float *coord) +{ +	NSPoint point; +	point.x = coord[0]; +	point.y = coord[1]; +	point = [(LLNSWindow*)window convertScreenToBase:point]; +	coord[0] = point.x; +	coord[1] = point.y; +} + +void convertScreenToView(NSWindowRef window, float *coord) +{ +	NSRect point; +	point.origin.x = coord[0]; +	point.origin.y = coord[1]; +	point.origin = [(LLNSWindow*)window convertScreenToBase:point.origin]; +	point.origin = [[(LLNSWindow*)window contentView] convertPoint:point.origin fromView:nil]; +} + +void convertWindowToScreen(NSWindowRef window, float *coord) +{ +	NSPoint point; +	point.x = coord[0]; +	point.y = coord[1]; +	point = [(LLNSWindow*)window convertToScreenFromLocalPoint:point relativeToView:[(LLNSWindow*)window contentView]]; +	coord[0] = point.x; +	coord[1] = point.y; +} + +void closeWindow(NSWindowRef window) +{ +	[(LLNSWindow*)window close]; +	[(LLNSWindow*)window release]; +} + +void removeGLView(GLViewRef view) +{ +	[(LLOpenGLView*)view removeFromSuperview]; +	[(LLOpenGLView*)view release]; +} + +NSWindowRef getMainAppWindow() +{ +	LLNSWindow *winRef = [(LLAppDelegate*)[[NSApplication sharedApplication] delegate] window]; +	 +	[winRef setAcceptsMouseMovedEvents:TRUE]; +	return winRef; +} + +unsigned int getModifiers() +{ +	return [NSEvent modifierFlags]; +} diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 97637c937f..f25fc82896 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -30,7 +30,6 @@  #include "llkeyboardmacosx.h"  #include "llwindowcallbacks.h" -#include "llwindowmacosx-objc.h"  #include "llpreeditor.h"  #include "llerror.h" @@ -39,7 +38,6 @@  #include "lldir.h"  #include "indra_constants.h" -#include <Carbon/Carbon.h>  #include <OpenGL/OpenGL.h>  extern BOOL gDebugWindowProc; @@ -58,7 +56,6 @@ const S32	MAX_NUM_RESOLUTIONS = 32;  //  BOOL LLWindowMacOSX::sUseMultGL = FALSE; -WindowRef LLWindowMacOSX::sMediaWindow = NULL;  // Cross-platform bits: @@ -98,105 +95,9 @@ BOOL check_for_card(const char* RENDERER, const char* bad_card)  // We may want to base this on the setting of _DEBUG...  #define CAPTURE_ALL_DISPLAYS 0 -static double getDictDouble (CFDictionaryRef refDict, CFStringRef key); +//static double getDictDouble (CFDictionaryRef refDict, CFStringRef key);  static long getDictLong (CFDictionaryRef refDict, CFStringRef key); - - - -// CarbonEvents we're interested in. -static EventTypeSpec WindowHandlerEventList[] = -{ -	// Window-related events -	{ kEventClassWindow, kEventWindowActivated }, -	{ kEventClassWindow, kEventWindowDeactivated }, -	{ kEventClassWindow, kEventWindowShown }, -	{ kEventClassWindow, kEventWindowHidden }, -	{ kEventClassWindow, kEventWindowCollapsed }, -	{ kEventClassWindow, kEventWindowExpanded }, -	{ kEventClassWindow, kEventWindowGetClickActivation }, -	{ kEventClassWindow, kEventWindowClose }, -	{ kEventClassWindow, kEventWindowBoundsChanging }, -	{ kEventClassWindow, kEventWindowBoundsChanged }, -	{ kEventClassWindow, kEventWindowGetIdealSize }, - -	// Mouse events -	{ kEventClassMouse, kEventMouseDown }, -	{ kEventClassMouse, kEventMouseUp }, -	{ kEventClassMouse, kEventMouseDragged }, -	{ kEventClassMouse, kEventMouseWheelMoved }, -	{ kEventClassMouse, kEventMouseMoved }, - -	// Keyboard events -	// No longer handle raw key down events directly. -	// When text input events come in, extract the raw key events from them and process at that point. -	// This allows input methods to eat keystrokes the way they're supposed to. -//	{ kEventClassKeyboard, kEventRawKeyDown }, -//	{ kEventClassKeyboard, kEventRawKeyRepeat }, -	{ kEventClassKeyboard, kEventRawKeyUp }, -	{ kEventClassKeyboard, kEventRawKeyModifiersChanged }, - -	// Text input events -	{ kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }, -	{ kEventClassTextInput, kEventTextInputUpdateActiveInputArea }, -	{ kEventClassTextInput, kEventTextInputOffsetToPos }, -	{ kEventClassTextInput, kEventTextInputPosToOffset }, -	{ kEventClassTextInput, kEventTextInputShowHideBottomWindow }, -	{ kEventClassTextInput, kEventTextInputGetSelectedText }, -	{ kEventClassTextInput, kEventTextInputFilterText }, - -	// TSM Document Access events (advanced input method support) -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetLength }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetSelectedRange }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetCharacters }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetFont }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetGlyphInfo }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessLockDocument }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessUnlockDocument } -}; - -static EventTypeSpec GlobalHandlerEventList[] = -{ -	// Mouse events -	{ kEventClassMouse, kEventMouseDown }, -	{ kEventClassMouse, kEventMouseUp }, -	{ kEventClassMouse, kEventMouseDragged }, -	{ kEventClassMouse, kEventMouseWheelMoved }, -	{ kEventClassMouse, kEventMouseMoved }, - -	// Keyboard events -	// No longer handle raw key down events directly. -	// When text input events come in, extract the raw key events from them and process at that point. -	// This allows input methods to eat keystrokes the way they're supposed to. -//	{ kEventClassKeyboard, kEventRawKeyDown }, -//	{ kEventClassKeyboard, kEventRawKeyRepeat }, -	{ kEventClassKeyboard, kEventRawKeyUp }, -	{ kEventClassKeyboard, kEventRawKeyModifiersChanged }, - -	// Text input events -	{ kEventClassTextInput, kEventTextInputUpdateActiveInputArea }, -	{ kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }, -	{ kEventClassTextInput, kEventTextInputOffsetToPos }, -	{ kEventClassTextInput, kEventTextInputPosToOffset }, -	{ kEventClassTextInput, kEventTextInputShowHideBottomWindow }, -	{ kEventClassTextInput, kEventTextInputGetSelectedText }, -	{ kEventClassTextInput, kEventTextInputFilterText }, - -	// TSM Document Access events (advanced input method support) -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetLength }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetSelectedRange }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetCharacters }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetFont }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessGetGlyphInfo }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessLockDocument }, -	{ kEventClassTSMDocumentAccess, kEventTSMDocumentAccessUnlockDocument } -}; - -static EventTypeSpec CommandHandlerEventList[] = -{ -	{ kEventClassCommand, kEventCommandProcess } -}; -  // MBW -- HACK ALERT  // On the Mac, to put up an OS dialog in full screen mode, we must first switch OUT of full screen mode.  // The proper way to do this is to bracket the dialog with calls to beforeDialog() and afterDialog(), but these @@ -204,8 +105,6 @@ static EventTypeSpec CommandHandlerEventList[] =  // This assumes that there will be only one object of this class at any time.  Hopefully this is true.  static LLWindowMacOSX *gWindowImplementation = NULL; - -  LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,  							   const std::string& title, const std::string& name, S32 x, S32 y, S32 width,  							   S32 height, U32 flags, @@ -233,8 +132,6 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,  	mContext = NULL;  	mPixelFormat = NULL;  	mDisplay = CGMainDisplayID(); -	mOldDisplayMode = NULL; -	mTimer = NULL;  	mSimulatedRightClick = FALSE;  	mLastModifiers = 0;  	mHandsOffEvents = FALSE; @@ -246,12 +143,8 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,  	mOverrideAspectRatio = 0.f;  	mMaximized = FALSE;  	mMinimized = FALSE; -	mTSMDocument = NULL; // Just in case.  	mLanguageTextInputAllowed = FALSE; -	mTSMScriptCode = 0; -	mTSMLangCode = 0;  	mPreeditor = NULL; -	mRawKeyEvent = NULL;  	mFSAASamples = fsaa_samples;  	mForceRebuild = FALSE; @@ -263,43 +156,23 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,  	mOriginalAspectRatio = (double)CGDisplayPixelsWide(mDisplay) / (double)CGDisplayPixelsHigh(mDisplay);  	// Stash the window title -	strcpy((char*)mWindowTitle + 1, title.c_str()); /* Flawfinder: ignore */ -	mWindowTitle[0] = title.length(); - -	mEventHandlerUPP = NewEventHandlerUPP(staticEventHandler); -	mMoveEventCampartorUPP = NewEventComparatorUPP(staticMoveEventComparator); -	mGlobalHandlerRef = NULL; -	mWindowHandlerRef = NULL; +	mWindowTitle = title; +	//mWindowTitle[0] = title.length();  	mDragOverrideCursor = -1; -	// We're not clipping yet -	SetRect( &mOldMouseClip, 0, 0, 0, 0 ); -  	// Set up global event handlers (the fullscreen case needs this) -	InstallStandardEventHandler(GetApplicationEventTarget()); +	//InstallStandardEventHandler(GetApplicationEventTarget());  	// Stash an object pointer for OSMessageBox()  	gWindowImplementation = this; -  	// Create the GL context and set it up for windowed or fullscreen, as appropriate. +	LL_INFOS("Window") << "Creating context..." << LL_ENDL;  	if(createContext(x, y, width, height, 32, fullscreen, disable_vsync))  	{  		if(mWindow != NULL)  		{ -			// MBW -- XXX -- I think we can now do this here? -			// Constrain the window to the screen it's mostly on, resizing if necessary. -			ConstrainWindowToScreen( -				mWindow, -				kWindowStructureRgn, -				kWindowConstrainMayResize | -				//				kWindowConstrainStandardOptions | -				0, -				NULL, -				NULL); - -			MacShowWindow(mWindow); -			BringToFront(mWindow); +			makeWindowOrderFront(mWindow);  		}  		if (!gGLManager.initGL()) @@ -321,463 +194,231 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,  	mCallbacks = callbacks;  	stop_glerror(); +	 +	  } -BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync) -{ -	OSStatus		err; -	BOOL			glNeedsInit = FALSE; - -	if(mGlobalHandlerRef == NULL) -	{ -		InstallApplicationEventHandler(mEventHandlerUPP, GetEventTypeCount (CommandHandlerEventList), CommandHandlerEventList, (void*)this, &mGlobalHandlerRef); -	} +// These functions are used as wrappers for our internal event handling callbacks. +// It's a good idea to wrap these to avoid reworking more code than we need to within LLWindow. -	mFullscreen = fullscreen; +void callKeyUp(unsigned short key, unsigned int mask) +{ +	gKeyboard->handleKeyUp(key, mask); +} -	if (mFullscreen && (mOldDisplayMode == NULL)) -	{ -		LL_INFOS("Window") << "createContext: setting up fullscreen " << width << "x" << height << LL_ENDL; +void callKeyDown(unsigned short key, unsigned int mask) +{ +	gKeyboard->handleKeyDown(key, mask); +} -		// NOTE: The refresh rate will be REPORTED AS 0 for many DVI and notebook displays.  Plan accordingly. -		double refresh = getDictDouble (CGDisplayCurrentMode (mDisplay),  kCGDisplayRefreshRate); +void callUnicodeCallback(wchar_t character, unsigned int mask) +{ +	gWindowImplementation->getCallbacks()->handleUnicodeChar(character, mask); +} -		// If the requested width or height is 0, find the best default for the monitor. -		if((width == 0) || (height == 0)) -		{ -			// Scan through the list of modes, looking for one which has: -			//		height between 700 and 800 -			//		aspect ratio closest to the user's original mode -			S32 resolutionCount = 0; -			LLWindowResolution *resolutionList = getSupportedResolutions(resolutionCount); +void callFocus() +{ +	gWindowImplementation->getCallbacks()->handleFocus(gWindowImplementation); +} -			if(resolutionList != NULL) -			{ -				F32 closestAspect = 0; -				U32 closestHeight = 0; -				U32 closestWidth = 0; -				int i; +void callFocusLost() +{ +	gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation); +} -				LL_DEBUGS("Window") << "createContext: searching for a display mode, original aspect is " << mOriginalAspectRatio << LL_ENDL; +void callRightMouseDown(float *pos, MASK mask) +{ +	LLCoordGL		outCoords; +	outCoords.mX = llround(pos[0]); +	outCoords.mY = llround(pos[1]); +	gWindowImplementation->getCallbacks()->handleRightMouseDown(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE)); +} -				for(i=0; i < resolutionCount; i++) -				{ -					F32 aspect = (F32)resolutionList[i].mWidth / (F32)resolutionList[i].mHeight; +void callRightMouseUp(float *pos, MASK mask) +{ +	LLCoordGL		outCoords; +	outCoords.mX = llround(pos[0]); +	outCoords.mY = llround(pos[1]); +	gWindowImplementation->getCallbacks()->handleRightMouseUp(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE)); +} -					LL_DEBUGS("Window") << "createContext: width " << resolutionList[i].mWidth << " height " << resolutionList[i].mHeight << " aspect " << aspect << LL_ENDL; +void callLeftMouseDown(float *pos, MASK mask) +{ +	LLCoordGL		outCoords; +	outCoords.mX = llround(pos[0]); +	outCoords.mY = llround(pos[1]); +	gWindowImplementation->getCallbacks()->handleMouseDown(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE)); +} -					if( (resolutionList[i].mHeight >= 700) && (resolutionList[i].mHeight <= 800) && -						(fabs(aspect - mOriginalAspectRatio) < fabs(closestAspect - mOriginalAspectRatio))) -					{ -						LL_DEBUGS("Window") << " (new closest mode) " << LL_ENDL; +void callLeftMouseUp(float *pos, MASK mask) +{ +	LLCoordGL		outCoords; +	outCoords.mX = llround(pos[0]); +	outCoords.mY = llround(pos[1]); +	gWindowImplementation->getCallbacks()->handleMouseUp(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE)); +	 +} -						// This is the closest mode we've seen yet. -						closestWidth = resolutionList[i].mWidth; -						closestHeight = resolutionList[i].mHeight; -						closestAspect = aspect; -					} -				} +void callDoubleClick(float *pos, MASK mask) +{ +	LLCoordGL	outCoords; +	outCoords.mX = llround(pos[0]); +	outCoords.mY = llround(pos[1]); +	gWindowImplementation->getCallbacks()->handleDoubleClick(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE)); +} -				width = closestWidth; -				height = closestHeight; -			} -		} +void callResize(unsigned int width, unsigned int height) +{ +	if (gWindowImplementation != NULL) +	{ +		gWindowImplementation->getCallbacks()->handleResize(gWindowImplementation, width, height); +	} +} -		if((width == 0) || (height == 0)) -		{ -			// Mode search failed for some reason.  Use the old-school default. -			width = 1024; -			height = 768; -		} +void callMouseMoved(float *pos, MASK mask) +{ +	LLCoordGL		outCoords; +	outCoords.mX = llround(pos[0]); +	outCoords.mY = llround(pos[1]); +	float deltas[2]; +	gWindowImplementation->getMouseDeltas(deltas); +	outCoords.mX += deltas[0]; +	outCoords.mY += deltas[1]; +	gWindowImplementation->getCallbacks()->handleMouseMove(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE)); +	gWindowImplementation->getCallbacks()->handleScrollWheel(gWindowImplementation, 0); +} -		if (true) -		{ -			// Fullscreen support -			CFDictionaryRef refDisplayMode = 0; -			boolean_t exactMatch = false; - -#if CAPTURE_ALL_DISPLAYS -			// Capture all displays (may want to do this for final build) -			CGCaptureAllDisplays (); -#else -			// Capture only the main display (useful for debugging) -			CGDisplayCapture (mDisplay); -#endif +void callScrollMoved(float delta) +{ +	gWindowImplementation->getCallbacks()->handleScrollWheel(gWindowImplementation, delta); +} -			// Switch the display to the desired resolution and refresh -			refDisplayMode = CGDisplayBestModeForParametersAndRefreshRate( -				mDisplay, -				BITS_PER_PIXEL, -				width, -				height, -				refresh, -				&exactMatch); +void callMouseExit() +{ +	gWindowImplementation->getCallbacks()->handleMouseLeave(gWindowImplementation); +} -			if (refDisplayMode) -			{ -				LL_DEBUGS("Window") << "createContext: switching display resolution" << LL_ENDL; -				mOldDisplayMode = CGDisplayCurrentMode (mDisplay); -				CGDisplaySwitchToMode (mDisplay, refDisplayMode); -				//				CFRelease(refDisplayMode); +void callWindowFocus() +{ +	gWindowImplementation->getCallbacks()->handleFocus(gWindowImplementation); +} -				AddEventTypesToHandler(mGlobalHandlerRef, GetEventTypeCount (GlobalHandlerEventList), GlobalHandlerEventList); -			} +void callWindowUnfocus() +{ +	gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation); +} +void callDeltaUpdate(float *delta, MASK mask) +{ +	gWindowImplementation->updateMouseDeltas(delta); +} -			mFullscreen = TRUE; -			mFullscreenWidth   = CGDisplayPixelsWide(mDisplay); -			mFullscreenHeight  = CGDisplayPixelsHigh(mDisplay); -			mFullscreenBits    = CGDisplayBitsPerPixel(mDisplay); -			mFullscreenRefresh = llround(getDictDouble (CGDisplayCurrentMode (mDisplay),  kCGDisplayRefreshRate)); +void callMiddleMouseDown(float *pos, MASK mask) +{ +	LLCoordGL		outCoords; +	outCoords.mX = llround(pos[0]); +	outCoords.mY = llround(pos[1]); +	float deltas[2]; +	gWindowImplementation->getMouseDeltas(deltas); +	outCoords.mX += deltas[0]; +	outCoords.mY += deltas[1]; +	gWindowImplementation->getCallbacks()->handleMiddleMouseDown(gWindowImplementation, outCoords, mask); +} -			LL_INFOS("Window") << "Running at " << mFullscreenWidth -				<< "x"   << mFullscreenHeight -				<< "x"   << mFullscreenBits -				<< " @ " << mFullscreenRefresh -				<< LL_ENDL; -		} -		else -		{ -			// No fullscreen support -			mFullscreen = FALSE; -			mFullscreenWidth   = -1; -			mFullscreenHeight  = -1; -			mFullscreenBits    = -1; -			mFullscreenRefresh = -1; - -			std::string error= llformat("Unable to run fullscreen at %d x %d.\nRunning in window.", width, height); -			OSMessageBox(error, "Error", OSMB_OK); -		} -	} +void callMiddleMouseUp(float *pos, MASK mask) +{ +	LLCoordGL outCoords; +	outCoords.mX = llround(pos[0]); +	outCoords.mY = llround(pos[1]); +	float deltas[2]; +	gWindowImplementation->getMouseDeltas(deltas); +	outCoords.mX += deltas[0]; +	outCoords.mY += deltas[1]; +	gWindowImplementation->getCallbacks()->handleMiddleMouseUp(gWindowImplementation, outCoords, mask); +} -	if(!mFullscreen && (mWindow == NULL)) -	{ -		//int				displayWidth = CGDisplayPixelsWide(mDisplay); -		//int				displayHeight = CGDisplayPixelsHigh(mDisplay); -		//const int		menuBarPlusTitleBar = 44;   // Ugly magic number. +void callHandleDragEntered(std::string url) +{ +	gWindowImplementation->handleDragNDrop(url, LLWindowCallbacks::DNDA_START_TRACKING); +} -		LL_DEBUGS("Window") << "createContext: creating window" << LL_ENDL; +void callHandleDragExited(std::string url) +{ +	gWindowImplementation->handleDragNDrop(url, LLWindowCallbacks::DNDA_STOP_TRACKING); +} -		mPreviousWindowRect.left = (long) x; -		mPreviousWindowRect.right = (long) x + width; -		mPreviousWindowRect.top = (long) y; -		mPreviousWindowRect.bottom = (long) y + height; +void callHandleDragUpdated(std::string url) +{ +	gWindowImplementation->handleDragNDrop(url, LLWindowCallbacks::DNDA_TRACK); +} -		//----------------------------------------------------------------------- -		// Create the window -		//----------------------------------------------------------------------- -		mWindow = NewCWindow( -			NULL, -			&mPreviousWindowRect, -			mWindowTitle, -			false,				// Create the window invisible.  Whoever calls createContext() should show it after any moving/resizing. -			//		noGrowDocProc,		// Window with no grow box and no zoom box -			zoomDocProc,		// Window with a grow box and a zoom box -			//		zoomNoGrow,			// Window with a zoom box but no grow box -			kFirstWindowOfClass, -			true, -			(long)this); +void callHandleDragDropped(std::string url) +{ +	gWindowImplementation->handleDragNDrop(url, LLWindowCallbacks::DNDA_DROPPED); +} -		if (!mWindow) +void LLWindowMacOSX::updateMouseDeltas(float* deltas) +{ +	if (mCursorDecoupled) +	{ +		mCursorLastEventDeltaX = llround(deltas[0]); +		mCursorLastEventDeltaY = llround(-deltas[1]); +		 +		if (mCursorIgnoreNextDelta)  		{ -			setupFailure("Window creation error", "Error", OSMB_OK); -			return FALSE; +			mCursorLastEventDeltaX = 0; +			mCursorLastEventDeltaY = 0; +			mCursorIgnoreNextDelta = FALSE;  		} +	} else { +		mCursorLastEventDeltaX = 0; +		mCursorLastEventDeltaY = 0; +	} +} -		// Turn on live resize. -		// For this to work correctly, we need to be able to call LLViewerWindow::draw from -		// the event handler for kEventWindowBoundsChanged.  It's not clear that we have access from here. -		//	err = ChangeWindowAttributes(mWindow, kWindowLiveResizeAttribute, 0); +void LLWindowMacOSX::getMouseDeltas(float* delta) +{ +	delta[0] = mCursorLastEventDeltaX; +	delta[1] = mCursorLastEventDeltaY; +} -		// Set up window event handlers (some window-related events ONLY go to window handlers.) -		InstallStandardEventHandler(GetWindowEventTarget(mWindow)); -		InstallWindowEventHandler(mWindow, mEventHandlerUPP, GetEventTypeCount (WindowHandlerEventList), WindowHandlerEventList, (void*)this, &mWindowHandlerRef); // add event handler -#if LL_OS_DRAGDROP_ENABLED -		InstallTrackingHandler( dragTrackingHandler, mWindow, (void*)this ); -		InstallReceiveHandler( dragReceiveHandler, mWindow, (void*)this ); -#endif // LL_OS_DRAGDROP_ENABLED -	} +BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync) +{ +	BOOL			glNeedsInit = FALSE; +	mFullscreen = fullscreen; +	 +	if (mWindow == NULL)  	{ -		// Create and initialize our TSM document for language text input. -		// If an error occured, we can do nothing better than simply ignore it. -		// mTSMDocument will be kept NULL in case. -		if (mTSMDocument) -		{ -			DeactivateTSMDocument(mTSMDocument); -			DeleteTSMDocument(mTSMDocument); -			mTSMDocument = NULL; -		} -		static InterfaceTypeList types = { kUnicodeDocument }; -		err = NewTSMDocument(1, types, &mTSMDocument, 0); -		if (err != noErr) -		{ -			LL_WARNS("Window") << "createContext: couldn't create a TSMDocument (" << err << ")" << LL_ENDL; -		} -		if (mTSMDocument) -		{ -			ActivateTSMDocument(mTSMDocument); -			allowLanguageTextInput(NULL, FALSE); -		} +		LL_INFOS("Window") << "Creating window..." << LL_ENDL; +		mWindow = getMainAppWindow();  	}  	if(mContext == NULL)  	{ -		AGLRendererInfo rendererInfo = NULL; - -		//----------------------------------------------------------------------- -		// Create GL drawing context -		//----------------------------------------------------------------------- - -		if(mPixelFormat == NULL) -		{ -			if(mFullscreen) -			{ -				GLint fullscreenAttrib[] = -				{ -					AGL_RGBA, -					AGL_FULLSCREEN, -					AGL_NO_RECOVERY, -					AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, -					AGL_SAMPLES_ARB, mFSAASamples, -					AGL_DOUBLEBUFFER, -					AGL_CLOSEST_POLICY, -					AGL_ACCELERATED, -					AGL_RED_SIZE, 8, -					AGL_GREEN_SIZE, 8, -					AGL_BLUE_SIZE, 8, -					AGL_ALPHA_SIZE, 8, -					AGL_DEPTH_SIZE, 24, -					AGL_STENCIL_SIZE, 8, -					AGL_NONE -				}; - -				LL_DEBUGS("Window") << "createContext: creating fullscreen pixelformat" << LL_ENDL; - -				GDHandle gdhDisplay = NULL; -				err = DMGetGDeviceByDisplayID ((DisplayIDType)mDisplay, &gdhDisplay, false); - -				mPixelFormat = aglChoosePixelFormat(&gdhDisplay, 1, fullscreenAttrib); -				rendererInfo = aglQueryRendererInfo(&gdhDisplay, 1); -			} -			else -			{ -				// NOTE from Leslie: -				// -				// AGL_NO_RECOVERY, when combined with AGL_ACCELERATED prevents software rendering -				// fallback which means we won't hvae shaders that compile and link but then don't -				// work.  The drawback is that our shader compilation will be a bit more finicky though. - -				GLint windowedAttrib[] = -				{ -					AGL_RGBA, -					AGL_NO_RECOVERY, -					AGL_DOUBLEBUFFER, -					AGL_CLOSEST_POLICY, -					AGL_ACCELERATED, -					AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, -					AGL_SAMPLES_ARB, mFSAASamples, -					AGL_RED_SIZE, 8, -					AGL_GREEN_SIZE, 8, -					AGL_BLUE_SIZE, 8, -					AGL_ALPHA_SIZE, 8, -					AGL_DEPTH_SIZE, 24, -					AGL_STENCIL_SIZE, 8, -					AGL_NONE -				}; - -				LL_DEBUGS("Window") << "createContext: creating windowed pixelformat" << LL_ENDL; - -				mPixelFormat = aglChoosePixelFormat(NULL, 0, windowedAttrib); - -				GDHandle gdhDisplay = GetMainDevice(); -				rendererInfo = aglQueryRendererInfo(&gdhDisplay, 1); -			} - -			// May want to get the real error text like this: -			// (char *) aglErrorString(aglGetError()); - -			if(aglGetError() != AGL_NO_ERROR) -			{ -				setupFailure("Can't find suitable pixel format", "Error", OSMB_OK); -				return FALSE; -			} -		} - -		if(mPixelFormat) -		{ -			LL_DEBUGS("Window") << "createContext: creating GL context" << LL_ENDL; -			mContext = aglCreateContext(mPixelFormat, NULL); -		} - -		if(mContext == NULL) -		{ -			setupFailure("Can't make GL context", "Error", OSMB_OK); -			return FALSE; -		} - -		gGLManager.mVRAM = 0; - -		if(rendererInfo != NULL) -		{ -			GLint result; - -			if(aglDescribeRenderer(rendererInfo, AGL_VIDEO_MEMORY, &result)) -			{ -				//				llinfos << "createContext: aglDescribeRenderer(AGL_VIDEO_MEMORY) returned " << result << llendl; -				gGLManager.mVRAM = result / (1024 * 1024); -			} -			else -			{ -				//				llinfos << "createContext: aglDescribeRenderer(AGL_VIDEO_MEMORY) failed." << llendl; -			} - -			// This could be useful at some point, if it takes into account the memory already used by screen buffers, etc... -			if(aglDescribeRenderer(rendererInfo, AGL_TEXTURE_MEMORY, &result)) -			{ -				//				llinfos << "createContext: aglDescribeRenderer(AGL_TEXTURE_MEMORY) returned " << result << llendl; -			} -			else -			{ -				//				llinfos << "createContext: aglDescribeRenderer(AGL_TEXTURE_MEMORY) failed." << llendl; -			} - -			aglDestroyRendererInfo(rendererInfo); -		} - +		LL_INFOS("Window") << "Creating GL view..." << LL_ENDL; +		// Our OpenGL view is already defined within SecondLife.xib. +		// Get the view instead. +		mGLView = createOpenGLView(mWindow); +		mContext = getCGLContextObj(mGLView);  		// Since we just created the context, it needs to be set up.  		glNeedsInit = TRUE;  	}  	// Hook up the context to a drawable -	if (mFullscreen && (mOldDisplayMode != NULL)) -	{ -		// We successfully captured the display.  Use a fullscreen drawable - -		LL_DEBUGS("Window") << "createContext: attaching fullscreen drawable" << LL_ENDL; - -#if CAPTURE_ALL_DISPLAYS -		// Capture all displays (may want to do this for final build) -		aglDisable (mContext, AGL_FS_CAPTURE_SINGLE); -#else -		// Capture only the main display (useful for debugging) -		aglEnable (mContext, AGL_FS_CAPTURE_SINGLE); -#endif - -		if (!aglSetFullScreen (mContext, 0, 0, 0, 0)) -		{ -			setupFailure("Can't set GL fullscreen", "Error", OSMB_OK); -			return FALSE; -		} -	} -	else if(!mFullscreen && (mWindow != NULL)) -	{ -		LL_DEBUGS("Window") << "createContext: attaching windowed drawable" << LL_ENDL; - -		// We created a window.  Use it as the drawable. -		if(!aglSetDrawable(mContext, GetWindowPort (mWindow))) -		{ -			setupFailure("Can't set GL drawable", "Error", OSMB_OK); -			return FALSE; -		} -	} -	else -	{ -		setupFailure("Can't get fullscreen or windowed drawable.", "Error", OSMB_OK); -		return FALSE; -	}  	if(mContext != NULL)  	{ +		LL_INFOS("Window") << "Setting CGL Context..." << LL_ENDL;  		LL_DEBUGS("Window") << "createContext: setting current context" << LL_ENDL; - -		if (!aglSetCurrentContext(mContext)) +		U32 err = CGLSetCurrentContext(mContext); +		if (err != kCGLNoError)  		{  			setupFailure("Can't activate GL rendering context", "Error", OSMB_OK);  			return FALSE;  		}  	} -	if(glNeedsInit) -	{ -		// Check for some explicitly unsupported cards. -		const char* RENDERER = (const char*) glGetString(GL_RENDERER); - -		const char* CARD_LIST[] = -		{	"RAGE 128", -		"RIVA TNT2", -		"Intel 810", -		"3Dfx/Voodoo3", -		"Radeon 7000", -		"Radeon 7200", -		"Radeon 7500", -		"Radeon DDR", -		"Radeon VE", -		"GDI Generic" }; -		const S32 CARD_COUNT = LL_ARRAY_SIZE(CARD_LIST); - -		// Future candidates: -		// ProSavage/Twister -		// SuperSavage - -		S32 i; -		for (i = 0; i < CARD_COUNT; i++) -		{ -			if (check_for_card(RENDERER, CARD_LIST[i])) -			{ -				close(); -				return FALSE; -			} -		} -	} - -	GLint colorBits, alphaBits, depthBits, stencilBits; - -	if(	!aglDescribePixelFormat(mPixelFormat, AGL_BUFFER_SIZE, &colorBits) || -		!aglDescribePixelFormat(mPixelFormat, AGL_ALPHA_SIZE, &alphaBits) || -		!aglDescribePixelFormat(mPixelFormat, AGL_DEPTH_SIZE, &depthBits) || -		!aglDescribePixelFormat(mPixelFormat, AGL_STENCIL_SIZE, &stencilBits)) -	{ -		close(); -		setupFailure("Can't get pixel format description", "Error", OSMB_OK); -		return FALSE; -	} - -	LL_INFOS("GLInit") << "GL buffer: Color Bits " << S32(colorBits) -		<< " Alpha Bits " << S32(alphaBits) -		<< " Depth Bits " << S32(depthBits) -		<< " Stencil Bits" << S32(stencilBits) -		<< LL_ENDL; - -	if (colorBits < 32) -	{ -		close(); -		setupFailure( -			"Second Life requires True Color (32-bit) to run in a window.\n" -			"Please go to Control Panels -> Display -> Settings and\n" -			"set the screen to 32-bit color.\n" -			"Alternately, if you choose to run fullscreen, Second Life\n" -			"will automatically adjust the screen each time it runs.", -			"Error", -			OSMB_OK); -		return FALSE; -	} - -	if (alphaBits < 8) -	{ -		close(); -		setupFailure( -			"Second Life is unable to run because it can't get an 8 bit alpha\n" -			"channel.  Usually this is due to video card driver issues.\n" -			"Please make sure you have the latest video card drivers installed.\n" -			"Also be sure your monitor is set to True Color (32-bit) in\n" -			"Control Panels -> Display -> Settings.\n" -			"If you continue to receive this message, contact customer service.", -			"Error", -			OSMB_OK); -		return FALSE; -	} -  	// Disable vertical sync for swap  	GLint frames_per_swap = 0;  	if (disable_vsync) @@ -790,7 +431,8 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits  		LL_DEBUGS("GLinit") << "Keeping vertical sync" << LL_ENDL;  		frames_per_swap = 1;  	} -	aglSetInteger(mContext, AGL_SWAP_INTERVAL, &frames_per_swap); +	 +	CGLSetParameter(mContext, kCGLCPSwapInterval, &frames_per_swap);  	//enable multi-threaded OpenGL  	if (sUseMultGL) @@ -809,109 +451,17 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits  			LL_DEBUGS("GLInit") << "Multi-threaded OpenGL enabled." << LL_ENDL;  		}  	} - +	LL_INFOS("Window") << "Completed context creation." << LL_ENDL;  	// Don't need to get the current gamma, since there's a call that restores it to the system defaults.  	return TRUE;  } -// changing fullscreen resolution, or switching between windowed and fullscreen mode. +// We only support OS X 10.7's fullscreen app mode which is literally a full screen window that fills a virtual desktop. +// This makes this method obsolete.  BOOL LLWindowMacOSX::switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp)  { -	BOOL needsRebuild = FALSE; -	BOOL result = true; - -	if(fullscreen) -	{ -		if(mFullscreen) -		{ -			// Switching resolutions in fullscreen mode.  Don't need to rebuild for this. -			// Fullscreen support -			CFDictionaryRef refDisplayMode = 0; -			boolean_t exactMatch = false; - -			// Switch the display to the desired resolution and refresh -			refDisplayMode = CGDisplayBestModeForParametersAndRefreshRate( -				mDisplay, -				BITS_PER_PIXEL, -				size.mX, -				size.mY, -				getDictDouble (CGDisplayCurrentMode (mDisplay),  kCGDisplayRefreshRate), -				&exactMatch); - -			if (refDisplayMode) -			{ -				CGDisplaySwitchToMode (mDisplay, refDisplayMode); -				//				CFRelease(refDisplayMode); -			} - -			mFullscreenWidth   = CGDisplayPixelsWide(mDisplay); -			mFullscreenHeight  = CGDisplayPixelsHigh(mDisplay); -			mFullscreenBits    = CGDisplayBitsPerPixel(mDisplay); -			mFullscreenRefresh = llround(getDictDouble (CGDisplayCurrentMode (mDisplay),  kCGDisplayRefreshRate)); - -			LL_INFOS("Window") << "Switched resolution to " << mFullscreenWidth -				<< "x"   << mFullscreenHeight -				<< "x"   << mFullscreenBits -				<< " @ " << mFullscreenRefresh -				<< LL_ENDL; - -			// Update the GL context to the new screen size -			if (!aglUpdateContext(mContext)) -			{ -				setupFailure("Can't set GL fullscreen", "Error", OSMB_OK); -				result = FALSE; -			} -		} -		else -		{ -			// Switching from windowed to fullscreen -			needsRebuild = TRUE; -		} -	} -	else -	{ -		if(mFullscreen) -		{ -			// Switching from fullscreen to windowed -			needsRebuild = TRUE; -		} -		else -		{ -			// Windowed to windowed -- not sure why we would be called like this.  Just change the window size. -			// The bounds changed event handler will do the rest. -			if(mWindow != NULL) -			{ -				::SizeWindow(mWindow, size.mX, size.mY, true); -			} -		} -	} - -	stop_glerror(); -	if(needsRebuild || mForceRebuild) -	{ -		mForceRebuild = FALSE; -		destroyContext(); -		result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, disable_vsync); -		if (result) -		{ -			if(mWindow != NULL) -			{ -				MacShowWindow(mWindow); -				BringToFront(mWindow); -			} - -			llverify(gGLManager.initGL()); - -			//start with arrow cursor -			initCursors(); -			setCursor( UI_CURSOR_ARROW ); -		} -	} - -	stop_glerror(); - -	return result; +	return FALSE;  }  void LLWindowMacOSX::destroyContext() @@ -925,32 +475,7 @@ void LLWindowMacOSX::destroyContext()  	if(mContext != NULL)  	{  		LL_DEBUGS("Window") << "destroyContext: unhooking drawable " << LL_ENDL; - -		aglSetCurrentContext (NULL); -		aglSetDrawable(mContext, NULL); -	} - -	// Make sure the display resolution gets restored -	if(mOldDisplayMode != NULL) -	{ -		LL_DEBUGS("Window") << "destroyContext: restoring display resolution " << LL_ENDL; - -		CGDisplaySwitchToMode (mDisplay, mOldDisplayMode); - -#if CAPTURE_ALL_DISPLAYS -		// Uncapture all displays (may want to do this for final build) -		CGReleaseAllDisplays (); -#else -		// Uncapture only the main display (useful for debugging) -		CGDisplayRelease (mDisplay); -#endif - -		//		CFRelease(mOldDisplayMode); - -		mOldDisplayMode = NULL; - -		// Remove the global event handlers the fullscreen case needed -		RemoveEventTypesFromHandler(mGlobalHandlerRef, GetEventTypeCount (GlobalHandlerEventList), GlobalHandlerEventList); +		CGLSetCurrentContext(NULL);  	}  	// Clean up remaining GL state before blowing away window @@ -959,51 +484,30 @@ void LLWindowMacOSX::destroyContext()  	// Clean up the pixel format  	if(mPixelFormat != NULL)  	{ -		LL_DEBUGS("Window") << "destroyContext: destroying pixel format " << LL_ENDL; -		aglDestroyPixelFormat(mPixelFormat); +		CGLDestroyPixelFormat(mPixelFormat);  		mPixelFormat = NULL;  	} -	// Remove any Carbon Event handlers we installed -	if(mGlobalHandlerRef != NULL) -	{ -		LL_DEBUGS("Window") << "destroyContext: removing global event handler" << LL_ENDL; -		RemoveEventHandler(mGlobalHandlerRef); -		mGlobalHandlerRef = NULL; -	} - -	if(mWindowHandlerRef != NULL) +	// Clean up the GL context +	if(mContext != NULL)  	{ -		LL_DEBUGS("Window") << "destroyContext: removing window event handler" << LL_ENDL; -		RemoveEventHandler(mWindowHandlerRef); -		mWindowHandlerRef = NULL; +		CGLDestroyContext(mContext);  	} - -	// Cleanup any TSM document we created. -	if(mTSMDocument != NULL) +	 +	// Destroy our LLOpenGLView +	if(mGLView != NULL)  	{ -		LL_DEBUGS("Window") << "destroyContext: deleting TSM document" << LL_ENDL; -		DeactivateTSMDocument(mTSMDocument); -		DeleteTSMDocument(mTSMDocument); -		mTSMDocument = NULL; +		removeGLView(mGLView); +		mGLView = NULL;  	} - +	  	// Close the window  	if(mWindow != NULL)  	{ -		LL_DEBUGS("Window") << "destroyContext: disposing window" << LL_ENDL; -		DisposeWindow(mWindow); +		closeWindow(mWindow);  		mWindow = NULL;  	} -	// Clean up the GL context -	if(mContext != NULL) -	{ -		LL_DEBUGS("Window") << "destroyContext: destroying GL context" << LL_ENDL; -		aglDestroyContext(mContext); -		mContext = NULL; -	} -  }  LLWindowMacOSX::~LLWindowMacOSX() @@ -1022,17 +526,11 @@ LLWindowMacOSX::~LLWindowMacOSX()  void LLWindowMacOSX::show()  { -	if(IsWindowCollapsed(mWindow)) -		CollapseWindow(mWindow, false); - -	MacShowWindow(mWindow); -	BringToFront(mWindow);  }  void LLWindowMacOSX::hide()  {  	setMouseClipping(FALSE); -	HideWindow(mWindow);  }  //virtual @@ -1040,7 +538,6 @@ void LLWindowMacOSX::minimize()  {  	setMouseClipping(FALSE);  	showCursor(); -	CollapseWindow(mWindow, true);  }  //virtual @@ -1086,7 +583,6 @@ BOOL LLWindowMacOSX::getVisible()  		result = TRUE;  	}if (mWindow)  	{ -		if(MacIsWindowVisible(mWindow))  			result = TRUE;  	} @@ -1107,7 +603,6 @@ BOOL LLWindowMacOSX::maximize()  {  	if (mWindow && !mMaximized)  	{ -		ZoomWindow(mWindow, inContent, true);  	}  	return mMaximized; @@ -1125,53 +620,14 @@ void LLWindowMacOSX::gatherInput()  	{  		stopDockTileBounce();  	} - -	// Use the old-school version so we get AppleEvent handler dispatch and menuselect handling. -	// Anything that has an event handler will get processed inside WaitNextEvent, so we only need to handle -	// the odd stuff here. -	EventRecord evt; -	while(WaitNextEvent(everyEvent, &evt, 0, NULL)) -	{ -		//			printf("WaitNextEvent returned true, event is %d.\n", evt.what); -		switch(evt.what) -		{ -		case mouseDown: -			{ -				short part; -				WindowRef window; -				long selectResult; -				part = FindWindow(evt.where, &window); -				switch ( part ) -				{ -				case inMenuBar: -					selectResult = MenuSelect(evt.where); - -					HiliteMenu(0); -					break; -				} -			} -			break; - -		case kHighLevelEvent: -			AEProcessAppleEvent (&evt); -			break; - -		case updateEvt: -			// We shouldn't be getting these regularly (since our window will be buffered), but we need to handle them correctly... -			BeginUpdate((WindowRef)evt.message); -			EndUpdate((WindowRef)evt.message); -			break; - -		} -	}  	updateCursor();  }  BOOL LLWindowMacOSX::getPosition(LLCoordScreen *position)  { -	Rect window_rect; -	OSStatus err = -1; +	float rect[4]; +	S32 err = -1;  	if(mFullscreen)  	{ @@ -1181,10 +637,10 @@ BOOL LLWindowMacOSX::getPosition(LLCoordScreen *position)  	}  	else if(mWindow)  	{ -		err = GetWindowBounds(mWindow, kWindowContentRgn, &window_rect); +		getContentViewBounds(mWindow, rect); -		position->mX = window_rect.left; -		position->mY = window_rect.top; +		position->mX = rect[0]; +		position->mY = rect[1];  	}  	else  	{ @@ -1196,8 +652,8 @@ BOOL LLWindowMacOSX::getPosition(LLCoordScreen *position)  BOOL LLWindowMacOSX::getSize(LLCoordScreen *size)  { -	Rect window_rect; -	OSStatus err = -1; +	float rect[4]; +	S32 err = -1;  	if(mFullscreen)  	{ @@ -1207,10 +663,10 @@ BOOL LLWindowMacOSX::getSize(LLCoordScreen *size)  	}  	else if(mWindow)  	{ -		err = GetWindowBounds(mWindow, kWindowContentRgn, &window_rect); +		getContentViewBounds(mWindow, rect); -		size->mX = window_rect.right - window_rect.left; -		size->mY = window_rect.bottom - window_rect.top; +		size->mX = rect[2]; +		size->mY = rect[3];  	}  	else  	{ @@ -1222,9 +678,9 @@ BOOL LLWindowMacOSX::getSize(LLCoordScreen *size)  BOOL LLWindowMacOSX::getSize(LLCoordWindow *size)  { -	Rect window_rect; -	OSStatus err = -1; - +	float rect[4]; +	S32 err = -1; +	  	if(mFullscreen)  	{  		size->mX = mFullscreenWidth; @@ -1233,16 +689,16 @@ BOOL LLWindowMacOSX::getSize(LLCoordWindow *size)  	}  	else if(mWindow)  	{ -		err = GetWindowBounds(mWindow, kWindowContentRgn, &window_rect); - -		size->mX = window_rect.right - window_rect.left; -		size->mY = window_rect.bottom - window_rect.top; +		getContentViewBounds(mWindow, rect); +		 +		size->mX = rect[2]; +		size->mY = rect[3];  	}  	else  	{  		llerrs << "LLWindowMacOSX::getPosition(): no window and not fullscreen!" << llendl;  	} - +	  	return (err == noErr);  } @@ -1250,7 +706,8 @@ BOOL LLWindowMacOSX::setPosition(const LLCoordScreen position)  {  	if(mWindow)  	{ -		MacMoveWindow(mWindow, position.mX, position.mY, false); +		float pos[2] = {position.mX, position.mY}; +		setWindowPos(mWindow, pos);  	}  	return TRUE; @@ -1260,7 +717,7 @@ BOOL LLWindowMacOSX::setSizeImpl(const LLCoordScreen size)  {  	if(mWindow)  	{ -		SizeWindow(mWindow, size.mX, size.mY, true); +		setWindowSize(mWindow, size.mX, size.mY);  	}  	return TRUE; @@ -1268,15 +725,16 @@ BOOL LLWindowMacOSX::setSizeImpl(const LLCoordScreen size)  BOOL LLWindowMacOSX::setSizeImpl(const LLCoordWindow size)  { -	Rect client_rect; +	float client_rect[4];  	if (mWindow)  	{ -		OSStatus err = GetWindowBounds(mWindow, kWindowContentRgn, &client_rect); +		S32 err = noErr; +		getContentViewBounds(mWindow, client_rect);  		if (err == noErr)  		{ -			client_rect.right = client_rect.left + size.mX; -			client_rect.bottom = client_rect.top + size.mY; -			err = SetWindowBounds(mWindow, kWindowContentRgn, &client_rect); +			client_rect[2] += size.mX; +			client_rect[3] += size.mY; +			setWindowSize(mWindow, client_rect[2], client_rect[3]);  		}  		if (err == noErr)  		{ @@ -1293,12 +751,12 @@ BOOL LLWindowMacOSX::setSizeImpl(const LLCoordWindow size)  void LLWindowMacOSX::swapBuffers()  { -	aglSwapBuffers(mContext); +	CGLFlushDrawable(mContext);  }  F32 LLWindowMacOSX::getGamma()  { -	F32 result = 1.8;	// Default to something sane +	F32 result = 2.2;	// Default to something sane  	CGGammaValue redMin;  	CGGammaValue redMax; @@ -1453,7 +911,7 @@ BOOL LLWindowMacOSX::setCursorPosition(const LLCoordWindow position)  	return result;  } - +/*  static void fixOrigin(void)  {  	GrafPtr port; @@ -1467,26 +925,16 @@ static void fixOrigin(void)  		::SetOrigin(0,0);  	}  } - +*/  BOOL LLWindowMacOSX::getCursorPosition(LLCoordWindow *position)  { -	Point cursor_point; +	float cursor_point[2];  	LLCoordScreen screen_pos; -	GrafPtr save;  	if(mWindow == NULL)  		return FALSE; - -	::GetPort(&save); -	::SetPort(GetWindowPort(mWindow)); -	fixOrigin(); - -	// gets the mouse location in local coordinates -	::GetMouse(&cursor_point); - -//	lldebugs << "getCursorPosition(): cursor is at " << cursor_point.h << ", " << cursor_point.v << "  port origin: " << portrect.left << ", " << portrect.top << llendl; - -	::SetPort(save); +	 +	getCursorPos(mWindow, cursor_point);  	if(mCursorDecoupled)  	{ @@ -1499,12 +947,12 @@ BOOL LLWindowMacOSX::getCursorPosition(LLCoordWindow *position)  		// CGGetLastMouseDelta may behave strangely when the cursor's first captured.  		// Stash in the event handler instead. -		cursor_point.h += mCursorLastEventDeltaX; -		cursor_point.v += mCursorLastEventDeltaY; +		cursor_point[0] += mCursorLastEventDeltaX; +		cursor_point[1] += mCursorLastEventDeltaY;  	} -	position->mX = cursor_point.h; -	position->mY = cursor_point.v; +	position->mX = cursor_point[0]; +	position->mY = cursor_point[1];  	return TRUE;  } @@ -1521,7 +969,6 @@ void LLWindowMacOSX::adjustCursorDecouple(bool warpingMouse)  				//			llinfos << "adjustCursorDecouple: decoupling cursor" << llendl;  				CGAssociateMouseAndMouseCursorPosition(false);  				mCursorDecoupled = true; -				FlushSpecificEventsFromQueue(GetCurrentEventQueue(), mMoveEventCampartorUPP, NULL);  				mCursorIgnoreNextDelta = TRUE;  			}  		} @@ -1568,52 +1015,13 @@ F32 LLWindowMacOSX::getPixelAspectRatio()  // MBW -- XXX -- There's got to be a better way than this.  Find it, please... +// Since we're no longer supporting the "typical" fullscreen mode with CGL or NSOpenGL anymore, these are unnecessary. -Geenz  void LLWindowMacOSX::beforeDialog()  { -	if(mFullscreen) -	{ - -#if CAPTURE_ALL_DISPLAYS -		// Uncapture all displays (may want to do this for final build) -		CGReleaseAllDisplays (); -#else -		// Uncapture only the main display (useful for debugging) -		CGDisplayRelease (mDisplay); -#endif -		// kDocumentWindowClass -		// kMovableModalWindowClass -		// kAllWindowClasses - -		//		GLint order = 0; -		//		aglSetInteger(mContext, AGL_ORDER_CONTEXT_TO_FRONT, &order); -		aglSetDrawable(mContext, NULL); -		//		GetWindowGroupLevel(GetWindowGroupOfClass(kAllWindowClasses), &oldWindowLevel); -		//		SetWindowGroupLevel(GetWindowGroupOfClass(kAllWindowClasses), CGShieldingWindowLevel()); - -		mHandsOffEvents = TRUE; - -	}  }  void LLWindowMacOSX::afterDialog()  { -	if(mFullscreen) -	{ -		mHandsOffEvents = FALSE; - -		//		SetWindowGroupLevel(GetWindowGroupOfClass(kAllWindowClasses), oldWindowLevel); -		aglSetFullScreen(mContext, 0, 0, 0, 0); -		//		GLint order = 1; -		//		aglSetInteger(mContext, AGL_ORDER_CONTEXT_TO_FRONT, &order); - -#if CAPTURE_ALL_DISPLAYS -		// Capture all displays (may want to do this for final build) -		CGCaptureAllDisplays (); -#else -		// Capture only the main display (useful for debugging) -		CGDisplayCapture (mDisplay); -#endif -	}  } @@ -1622,14 +1030,10 @@ void LLWindowMacOSX::flashIcon(F32 seconds)  	// Don't do this if we're already started, since this would try to install the NMRec twice.  	if(!mBounceTimer.getStarted())  	{ -		OSErr err; - +		S32 err = 0; +		// TODO: Implement icon bouncing  		mBounceTime = seconds; -		memset(&mBounceRec, 0, sizeof(mBounceRec)); -		mBounceRec.qType = nmType; -		mBounceRec.nmMark = 1; -		err = NMInstall(&mBounceRec); -		if(err == noErr) +		if(err == 0)  		{  			mBounceTimer.start();  		} @@ -1643,104 +1047,27 @@ void LLWindowMacOSX::flashIcon(F32 seconds)  BOOL LLWindowMacOSX::isClipboardTextAvailable()  { -	OSStatus err; -	ScrapRef scrap; -	ScrapFlavorFlags flags; -	BOOL result = false; - -	err = GetCurrentScrap(&scrap); - -	if(err == noErr) -	{ -		err = GetScrapFlavorFlags(scrap, kScrapFlavorTypeUnicode, &flags); -	} - -	if(err == noErr) -		result = true; - -	return result; +	return pasteBoardAvailable();  }  BOOL LLWindowMacOSX::pasteTextFromClipboard(LLWString &dst) -{ -	OSStatus err; -	ScrapRef scrap; -	Size len; -	BOOL result = false; - -	err = GetCurrentScrap(&scrap); - -	if(err == noErr) -	{ -		err = GetScrapFlavorSize(scrap, kScrapFlavorTypeUnicode, &len); -	} - -	if((err == noErr) && (len > 0)) +{	 +	llutf16string str(copyFromPBoard()); +	dst = utf16str_to_wstring(str); +	if (dst != L"")  	{ -		int u16len = len / sizeof(U16); -		U16 *temp = new U16[u16len + 1]; -		if (temp) -		{ -			memset(temp, 0, (u16len + 1) * sizeof(temp[0])); -			err = GetScrapFlavorData(scrap, kScrapFlavorTypeUnicode, &len, temp); -			if (err == noErr) -			{ -				// convert \r\n to \n and \r to \n in the incoming text. -				U16 *s, *d; -				for(s = d = temp; s[0] != '\0'; s++, d++) -				{ -					if(s[0] == '\r') -					{ -						if(s[1] == '\n') -						{ -							// CRLF, a.k.a. DOS newline.  Collapse to a single '\n'. -							s++; -						} - -						d[0] = '\n'; -					} -					else -					{ -						d[0] = s[0]; -					} -				} - -				d[0] = '\0'; - -				dst = utf16str_to_wstring(temp); - -				result = true; -			} -			delete[] temp; -		} +		return true; +	} else { +		return false;  	} - -	return result;  }  BOOL LLWindowMacOSX::copyTextToClipboard(const LLWString &s)  { -	OSStatus err; -	ScrapRef scrap; -	//Size len; -	//char *temp;  	BOOL result = false; - -	if (!s.empty()) -	{ -		err = GetCurrentScrap(&scrap); -		if (err == noErr) -			err = ClearScrap(&scrap); - -		if (err == noErr) -		{ -			llutf16string utf16str = wstring_to_utf16str(s); -			size_t u16len = utf16str.length() * sizeof(U16); -			err = PutScrapFlavor(scrap, kScrapFlavorTypeUnicode, kScrapFlavorMaskNone, u16len, utf16str.data()); -			if (err == noErr) -				result = true; -		} -	} +	llutf16string utf16str = wstring_to_utf16str(s); +	 +	result = copyToPBoard(utf16str.data(), utf16str.length());  	return result;  } @@ -1807,26 +1134,17 @@ LLWindow::LLWindowResolution* LLWindowMacOSX::getSupportedResolutions(S32 &num_r  BOOL LLWindowMacOSX::convertCoords(LLCoordGL from, LLCoordWindow *to)  {  	S32		client_height; -	Rect	client_rect; - -	if(mFullscreen) -	{ -		// In the fullscreen case, the "window" is the entire screen. -		client_rect.left = 0; -		client_rect.top = 0; -		client_rect.right = mFullscreenWidth; -		client_rect.bottom = mFullscreenHeight; -	} -	else if (!mWindow || -		(GetWindowBounds(mWindow, kWindowContentRgn, &client_rect) != noErr) || +	float	client_rect[4]; +	getContentViewBounds(mWindow, client_rect); +	if (!mWindow ||  		NULL == to)  	{  		return FALSE;  	}  	to->mX = from.mX; -	client_height = client_rect.bottom - client_rect.top; -	to->mY = client_height - from.mY - 1; +	client_height = client_rect[3]; +	to->mY = from.mY - 1;  	return TRUE;  } @@ -1834,26 +1152,19 @@ BOOL LLWindowMacOSX::convertCoords(LLCoordGL from, LLCoordWindow *to)  BOOL LLWindowMacOSX::convertCoords(LLCoordWindow from, LLCoordGL* to)  {  	S32		client_height; -	Rect	client_rect; - -	if(mFullscreen) -	{ -		// In the fullscreen case, the "window" is the entire screen. -		client_rect.left = 0; -		client_rect.top = 0; -		client_rect.right = mFullscreenWidth; -		client_rect.bottom = mFullscreenHeight; -	} -	else if (!mWindow || -		(GetWindowBounds(mWindow, kWindowContentRgn, &client_rect) != noErr) || +	float	client_rect[4]; +	 +	getContentViewBounds(mWindow, client_rect); +	 +	if (!mWindow ||  		NULL == to)  	{  		return FALSE;  	}  	to->mX = from.mX; -	client_height = client_rect.bottom - client_rect.top; -	to->mY = client_height - from.mY - 1; +	client_height = client_rect[3]; +	to->mY = from.mY - 1;  	return TRUE;  } @@ -1869,22 +1180,15 @@ BOOL LLWindowMacOSX::convertCoords(LLCoordScreen from, LLCoordWindow* to)  	}  	else if(mWindow)  	{ -		GrafPtr save; -		Point mouse_point; +		float mouse_point[2]; -		mouse_point.h = from.mX; -		mouse_point.v = from.mY; - -		::GetPort(&save); -		::SetPort(GetWindowPort(mWindow)); -		fixOrigin(); - -		::GlobalToLocal(&mouse_point); - -		to->mX = mouse_point.h; -		to->mY = mouse_point.v; +		mouse_point[0] = from.mX; +		mouse_point[1] = from.mY; +		 +		convertScreenToWindow(mWindow, mouse_point); -		::SetPort(save); +		to->mX = mouse_point[0]; +		to->mY = mouse_point[1];  		return TRUE;  	} @@ -1903,21 +1207,14 @@ BOOL LLWindowMacOSX::convertCoords(LLCoordWindow from, LLCoordScreen *to)  	}  	else if(mWindow)  	{ -		GrafPtr save; -		Point mouse_point; - -		mouse_point.h = from.mX; -		mouse_point.v = from.mY; -		::GetPort(&save); -		::SetPort(GetWindowPort(mWindow)); -		fixOrigin(); - -		LocalToGlobal(&mouse_point); +		float mouse_point[2]; -		to->mX = mouse_point.h; -		to->mY = mouse_point.v; +		mouse_point[0] = from.mX; +		mouse_point[1] = from.mY; +		convertWindowToScreen(mWindow, mouse_point); -		::SetPort(save); +		to->mX = mouse_point[0]; +		to->mY = mouse_point[1];  		return TRUE;  	} @@ -1949,862 +1246,6 @@ void LLWindowMacOSX::setupFailure(const std::string& text, const std::string& ca  	OSMessageBox(text, caption, type);  } -pascal Boolean LLWindowMacOSX::staticMoveEventComparator( EventRef event, void* data) -{ -	UInt32 				evtClass = GetEventClass (event); -	UInt32 				evtKind = GetEventKind (event); - -	if ((evtClass == kEventClassMouse) && ((evtKind == kEventMouseDragged) || (evtKind == kEventMouseMoved))) -	{ -		return true; -	} - -	else -	{ -		return false; -	} -} - - -pascal OSStatus LLWindowMacOSX::staticEventHandler(EventHandlerCallRef myHandler, EventRef event, void* userData) -{ -	LLWindowMacOSX *self = (LLWindowMacOSX*)userData; - -	return(self->eventHandler(myHandler, event)); -} - -OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef event) -{ -	OSStatus			result = eventNotHandledErr; -	UInt32 				evtClass = GetEventClass (event); -	UInt32 				evtKind = GetEventKind (event); - -	// Always handle command events, even in hands-off mode. -	if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess)) -	{ -		HICommand command; -		GetEventParameter (event, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); - -		switch(command.commandID) -		{ -		case kHICommandQuit: -			if(mCallbacks->handleCloseRequest(this)) -			{ -				// Get the app to initiate cleanup. -				mCallbacks->handleQuit(this); -				// The app is responsible for calling destroyWindow when done with GL -			} -			result = noErr; -			break; - -		default: -			// MBW -- XXX -- Should we handle other events here? -			break; -		} -	} - -	if(mHandsOffEvents) -	{ -		return(result); -	} - -	switch (evtClass) -	{ -	case kEventClassTextInput: -		{ -			switch (evtKind) -			{ -			case kEventTextInputUpdateActiveInputArea: -				{ -					EventParamType param_type; - -					long fix_len; -					UInt32 text_len; -					if (mPreeditor -						&& (result = GetEventParameter(event, kEventParamTextInputSendFixLen, -										typeLongInteger, ¶m_type, sizeof(fix_len), NULL, &fix_len)) == noErr -						&& typeLongInteger == param_type -						&& (result = GetEventParameter(event, kEventParamTextInputSendText, -										typeUnicodeText, ¶m_type, 0, &text_len, NULL)) == noErr -						&& typeUnicodeText == param_type) -					{ -						// Handle an optional (but essential to facilitate TSMDA) ReplaceRange param. -						CFRange range; -						if (GetEventParameter(event, kEventParamTextInputSendReplaceRange, -								typeCFRange, ¶m_type, sizeof(range), NULL, &range) == noErr -							&& typeCFRange == param_type) -						{ -							// Although the spec. is unclear, replace range should -							// not present when there is an active preedit.  We just -							// ignore the case.  markAsPreedit will detect the case and warn it. -							const LLWString & text = mPreeditor->getPreeditString(); -							const S32 location = wstring_wstring_length_from_utf16_length(text, 0, range.location); -							const S32 length = wstring_wstring_length_from_utf16_length(text, location, range.length); -							mPreeditor->markAsPreedit(location, length); -						} -						mPreeditor->resetPreedit(); - -						// Receive the text from input method. -						U16 *const text = new U16[text_len / sizeof(U16)]; -						GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText, NULL, text_len, NULL, text); -						if (fix_len < 0) -						{ -							// Do we still need this?  Seems obsolete... -							fix_len = text_len; -						} -						const LLWString fix_string -								= utf16str_to_wstring(llutf16string(text, fix_len / sizeof(U16))); -						const LLWString preedit_string -								= utf16str_to_wstring(llutf16string(text + fix_len / sizeof(U16), (text_len - fix_len) / sizeof(U16))); -						delete[] text; - -						// Handle fixed (comitted) string. -						if (fix_string.length() > 0) -						{ -							for (LLWString::const_iterator i = fix_string.begin(); i != fix_string.end(); i++) -							{ -								mPreeditor->handleUnicodeCharHere(*i); -							} -						} - -						// Receive the segment info and caret position. -						LLPreeditor::segment_lengths_t preedit_segment_lengths; -						LLPreeditor::standouts_t preedit_standouts; -						S32 caret_position = preedit_string.length(); -						UInt32 text_range_array_size; -						if (GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray, -								¶m_type, 0, &text_range_array_size, NULL) == noErr -							&& typeTextRangeArray == param_type -							&& text_range_array_size > sizeof(TextRangeArray)) -						{ -							// TextRangeArray is a variable-length struct. -							TextRangeArray * const text_range_array = (TextRangeArray *) new char[text_range_array_size]; -							GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray, -									NULL, text_range_array_size, NULL, text_range_array); - -							// WARNING: We assume ranges are in ascending order, -							// although the condition is undocumented.  It seems -							// OK to assume this.  I also assumed -							// the ranges are contiguous in previous versions, but I -							// have heard a rumore that older versions os ATOK may -							// return ranges with some _gap_.  I don't know whether -							// it is true, but I'm preparing my code for the case. - -							const S32 ranges = text_range_array->fNumOfRanges; -							preedit_segment_lengths.reserve(ranges); -							preedit_standouts.reserve(ranges); - -							S32 last_bytes = 0; -							S32 last_utf32 = 0; -							for (S32 i = 0; i < ranges; i++) -							{ -								const TextRange &range = text_range_array->fRange[i]; -								if (range.fStart > last_bytes) -								{ -									const S32 length_utf16 = (range.fStart - last_bytes) / sizeof(U16); -									const S32 length_utf32 = wstring_wstring_length_from_utf16_length(preedit_string, last_utf32, length_utf16); -									preedit_segment_lengths.push_back(length_utf32); -									preedit_standouts.push_back(FALSE); -									last_utf32 += length_utf32; -								} -								if (range.fEnd > range.fStart) -								{ -									const S32 length_utf16 = (range.fEnd - range.fStart) / sizeof(U16); -									const S32 length_utf32 = wstring_wstring_length_from_utf16_length(preedit_string, last_utf32, length_utf16); -									preedit_segment_lengths.push_back(length_utf32); -									preedit_standouts.push_back( -										kTSMHiliteSelectedRawText == range.fHiliteStyle -										|| kTSMHiliteSelectedConvertedText ==  range.fHiliteStyle -										|| kTSMHiliteSelectedText == range.fHiliteStyle); -									last_utf32 += length_utf32; -								} -								if (kTSMHiliteCaretPosition == range.fHiliteStyle) -								{ -									caret_position = last_utf32; -								} -								last_bytes = range.fEnd; -							} -							if (preedit_string.length() > last_utf32) -							{ -								preedit_segment_lengths.push_back(preedit_string.length() - last_utf32); -								preedit_standouts.push_back(FALSE); -							} - -							delete[] (char *) text_range_array; -						} - -						// Handle preedit string. -						if (preedit_string.length() == 0) -						{ -							preedit_segment_lengths.clear(); -							preedit_standouts.clear(); -						} -						else if (preedit_segment_lengths.size() == 0) -						{ -							preedit_segment_lengths.push_back(preedit_string.length()); -							preedit_standouts.push_back(FALSE); -						} -						mPreeditor->updatePreedit(preedit_string, preedit_segment_lengths, preedit_standouts, caret_position); - -						result = noErr; -					} -				} -				break; - -			case kEventTextInputUnicodeForKeyEvent: -				{ -					UInt32 modifiers = 0; - - -					// First, process the raw event. -					{ -						EventRef rawEvent = NULL; - -						// Get the original event and extract the modifier keys, so we can ignore command-key events. -						if (GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent) == noErr) -						{ -							// Grab the modifiers for later use in this function... -							GetEventParameter (rawEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); - -							// and call this function recursively to handle the raw key event. -							eventHandler (myHandler, rawEvent); - -							// save the raw event until we're done processing the unicode input as well. -							mRawKeyEvent = rawEvent; -						} -					} - -					OSStatus err = noErr; -					EventParamType actualType = typeUnicodeText; -					UInt32 actualSize = 0; -					size_t actualCount = 0; -					U16 *buffer = NULL; - -					// Get the size of the unicode data -					err = GetEventParameter (event, kEventParamTextInputSendText, typeUnicodeText, &actualType, 0, &actualSize, NULL); -					if(err == noErr) -					{ -						// allocate a buffer and get the actual data. -						actualCount = actualSize / sizeof(U16); -						buffer = new U16[actualCount]; -						err = GetEventParameter (event, kEventParamTextInputSendText, typeUnicodeText, &actualType, actualSize, &actualSize, buffer); -					} - -					if(err == noErr) -					{ -						if(modifiers & (cmdKey | controlKey)) -						{ -							// This was a menu key equivalent.  Ignore it. -						} -						else -						{ -							MASK mask = LLWindowMacOSX::modifiersToMask(modifiers); - -							llassert( actualType == typeUnicodeText ); - -							// The result is a UTF16 buffer.  Pass the characters in turn to handleUnicodeChar. - -							// Convert to UTF32 and go character-by-character. -							llutf16string utf16(buffer, actualCount); -							LLWString utf32 = utf16str_to_wstring(utf16); -							LLWString::iterator iter; - -							for(iter = utf32.begin(); iter != utf32.end(); iter++) -							{ -								mCallbacks->handleUnicodeChar(*iter, mask); -							} -						} -					} - -					if(buffer != NULL) -					{ -						delete[] buffer; -					} - -					mRawKeyEvent = NULL; -					result = err; -				} -				break; - -			case kEventTextInputOffsetToPos: -				{ -					EventParamType param_type; -					long offset; -					if (mPreeditor -						&& GetEventParameter(event, kEventParamTextInputSendTextOffset, typeLongInteger, -								¶m_type, sizeof(offset), NULL, &offset) == noErr -						&& typeLongInteger == param_type) -					{ -						S32 preedit, preedit_length; -						mPreeditor->getPreeditRange(&preedit, &preedit_length); -						const LLWString & text = mPreeditor->getPreeditString(); - -						LLCoordGL caret_coord; -						LLRect preedit_bounds; -						if (0 <= offset -							&& mPreeditor->getPreeditLocation(wstring_wstring_length_from_utf16_length(text, preedit, offset / sizeof(U16)), -															  &caret_coord, &preedit_bounds, NULL)) -						{ -							LLCoordGL caret_base_coord(caret_coord.mX, preedit_bounds.mBottom); -							LLCoordScreen caret_base_coord_screen; -							convertCoords(caret_base_coord, &caret_base_coord_screen); -							Point qd_point; -							qd_point.h = caret_base_coord_screen.mX; -							qd_point.v = caret_base_coord_screen.mY; -							SetEventParameter(event, kEventParamTextInputReplyPoint, typeQDPoint, sizeof(qd_point), &qd_point); - -							short line_height = (short) preedit_bounds.getHeight(); -							SetEventParameter(event, kEventParamTextInputReplyLineHeight, typeShortInteger, sizeof(line_height), &line_height); - -							result = noErr; -						} -						else -						{ -							result = errOffsetInvalid; -						} -					} -				} -				break; - -			case kEventTextInputGetSelectedText: -				{ -					if (mPreeditor) -					{ -						S32 selection, selection_length; -						mPreeditor->getSelectionRange(&selection, &selection_length); -						if (selection_length) -						{ -							const LLWString text = mPreeditor->getPreeditString().substr(selection, selection_length); -							const llutf16string text_utf16 = wstring_to_utf16str(text); -							result = SetEventParameter(event, kEventParamTextInputReplyText, typeUnicodeText, -										text_utf16.length() * sizeof(U16), text_utf16.c_str()); -						} -					} -				} -				break; -			} -		} -		break; - -	case kEventClassKeyboard: -		{ -			UInt32 keyCode = 0; -			char charCode = 0; -			UInt32 modifiers = 0; - -			// Some of these may fail for some event types.  That's fine. -			GetEventParameter (event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode); -			GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); - -			// save the raw event so getNativeKeyData can use it. -			mRawKeyEvent = event; - -			//			printf("key event, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n", keyCode, charCode, (char)charCode, modifiers); -			//			fflush(stdout); - -			switch (evtKind) -			{ -			case kEventRawKeyDown: -			case kEventRawKeyRepeat: -				if (gDebugWindowProc) -				{ -					printf("key down, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n", -							(unsigned int)keyCode, charCode, (char)charCode, (unsigned int)modifiers); -					fflush(stdout); -				} -				gKeyboard->handleKeyDown(keyCode, modifiers); -				result = eventNotHandledErr; -				break; - -			case kEventRawKeyUp: -				if (gDebugWindowProc) -				{ -					printf("key up,   key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n", -							(unsigned int)keyCode, charCode, (char)charCode, (unsigned int)modifiers); -					fflush(stdout); -				} -				gKeyboard->handleKeyUp(keyCode, modifiers); -				result = eventNotHandledErr; -				break; - -			case kEventRawKeyModifiersChanged: -				// The keyboard input system wants key up/down events for modifier keys. -				// Mac OS doesn't supply these directly, but can supply events when the collective modifier state changes. -				// Use these events to generate up/down events for the modifiers. - -				if((modifiers & shiftKey) && !(mLastModifiers & shiftKey)) -				{ -					if (gDebugWindowProc) printf("Shift key down event\n"); -					gKeyboard->handleKeyDown(0x38, (modifiers & 0x00FFFFFF) | ((0x38 << 24) & 0xFF000000)); -				} -				else if(!(modifiers & shiftKey) && (mLastModifiers & shiftKey)) -				{ -					if (gDebugWindowProc) printf("Shift key up event\n"); -					gKeyboard->handleKeyUp(0x38, (modifiers & 0x00FFFFFF) | ((0x38 << 24) & 0xFF000000)); -				} - -				if((modifiers & alphaLock) && !(mLastModifiers & alphaLock)) -				{ -					if (gDebugWindowProc) printf("Caps lock down event\n"); -					gKeyboard->handleKeyDown(0x39, (modifiers & 0x00FFFFFF) | ((0x39 << 24) & 0xFF000000)); -				} -				else if(!(modifiers & alphaLock) && (mLastModifiers & alphaLock)) -				{ -					if (gDebugWindowProc) printf("Caps lock up event\n"); -					gKeyboard->handleKeyUp(0x39, (modifiers & 0x00FFFFFF) | ((0x39 << 24) & 0xFF000000)); -				} - -				if((modifiers & controlKey) && !(mLastModifiers & controlKey)) -				{ -					if (gDebugWindowProc) printf("Control key down event\n"); -					gKeyboard->handleKeyDown(0x3b, (modifiers & 0x00FFFFFF) | ((0x3b << 24) & 0xFF000000)); -				} -				else if(!(modifiers & controlKey) && (mLastModifiers & controlKey)) -				{ -					if (gDebugWindowProc) printf("Control key up event\n"); -					gKeyboard->handleKeyUp(0x3b, (modifiers & 0x00FFFFFF) | ((0x3b << 24) & 0xFF000000)); -				} - -				if((modifiers & optionKey) && !(mLastModifiers & optionKey)) -				{ -					if (gDebugWindowProc) printf("Option key down event\n"); -					gKeyboard->handleKeyDown(0x3a, (modifiers & 0x00FFFFFF) | ((0x3a << 24) & 0xFF000000)); -				} -				else if(!(modifiers & optionKey) && (mLastModifiers & optionKey)) -				{ -					if (gDebugWindowProc) printf("Option key up event\n"); -					gKeyboard->handleKeyUp(0x3a, (modifiers & 0x00FFFFFF) | ((0x3a << 24) & 0xFF000000)); -				} - -				// When the state of the 'Fn' key (the one that changes some of the mappings on a powerbook/macbook keyboard -				// to an embedded keypad) changes, it may subsequently cause a key up event to be lost, which may lead to -				// a movement key getting "stuck" down.  This is bad. -				// This is an OS bug -- even the GetKeys() API doesn't tell you the key has been released. -				// This workaround causes all held-down keys to be reset whenever the state of the Fn key changes.  This isn't -				// exactly what we want, but it does avoid the case where you get stuck running forward. -				if((modifiers & kEventKeyModifierFnMask) != (mLastModifiers & kEventKeyModifierFnMask)) -				{ -					if (gDebugWindowProc) printf("Fn key state change event\n"); -					gKeyboard->resetKeys(); -				} - -				if (gDebugWindowProc) fflush(stdout); - -				mLastModifiers = modifiers; -				result = eventNotHandledErr; -				break; -			} - -			mRawKeyEvent = NULL; -		} -		break; - -	case kEventClassMouse: -		{ -			result = CallNextEventHandler(myHandler, event); -			if (eventNotHandledErr == result) -			{ // only handle events not already handled (prevents wierd resize interaction) -				EventMouseButton	button = kEventMouseButtonPrimary; -				HIPoint				location = {0.0f, 0.0f}; -				UInt32				modifiers = 0; -				UInt32				clickCount = 1; -				long				wheelDelta = 0; -				LLCoordScreen		inCoords; -				LLCoordGL			outCoords; -				MASK				mask = 0; - -				GetEventParameter(event, kEventParamMouseButton, typeMouseButton, NULL, sizeof(button), NULL, &button); -				GetEventParameter(event, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(location), NULL, &location); -				GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers); -				GetEventParameter(event, kEventParamMouseWheelDelta, typeLongInteger, NULL, sizeof(wheelDelta), NULL, &wheelDelta); -				GetEventParameter(event, kEventParamClickCount, typeUInt32, NULL, sizeof(clickCount), NULL, &clickCount); - -				inCoords.mX = llround(location.x); -				inCoords.mY = llround(location.y); - -				if(modifiers & shiftKey) { mask |= MASK_SHIFT; } -				if(modifiers & controlKey) { mask |= MASK_CONTROL; } -				if(modifiers & optionKey) { mask |= MASK_ALT; } - -				if(mCursorDecoupled) -				{ -					CGMouseDelta x, y; - -					// If the cursor's decoupled, we need to read the latest movement delta as well. -					CGGetLastMouseDelta( &x, &y ); -					mCursorLastEventDeltaX = x; -					mCursorLastEventDeltaY = y; - -					if(mCursorIgnoreNextDelta) -					{ -						mCursorLastEventDeltaX = 0; -						mCursorLastEventDeltaY = 0; -						mCursorIgnoreNextDelta = FALSE; -					} -				} -				else -				{ -					mCursorLastEventDeltaX = 0; -					mCursorLastEventDeltaY = 0; -				} - -				inCoords.mX += mCursorLastEventDeltaX; -				inCoords.mY += mCursorLastEventDeltaY; - -				convertCoords(inCoords, &outCoords); - -				//				printf("coords in: %d, %d; coords out: %d, %d\n", inCoords.mX, inCoords.mY, outCoords.mX, outCoords.mY); -				//				fflush(stdout); - - -				switch (evtKind) -				{ -				case kEventMouseDown: -					if (mLanguageTextInputAllowed) -					{ -						// We need to interrupt before handling mouse events, -						// so that the fixed string from IM are delivered to -						// the currently focused UI component. -						interruptLanguageTextInput(); -					} -					switch(button) -					{ -					case kEventMouseButtonPrimary: -						if(modifiers & cmdKey) -						{ -							// Simulate a right click -							mSimulatedRightClick = true; -							mCallbacks->handleRightMouseDown(this, outCoords, mask); -						} -						else if(clickCount == 2) -						{ -							// Windows double-click events replace the second mousedown event in a double-click. -							mCallbacks->handleDoubleClick(this, outCoords, mask); -						} -						else -						{ -							mCallbacks->handleMouseDown(this, outCoords, mask); -						} -						break; -					case kEventMouseButtonSecondary: -						mCallbacks->handleRightMouseDown(this, outCoords, mask); -						break; - -					case kEventMouseButtonTertiary: -						mCallbacks->handleMiddleMouseDown(this, outCoords, mask); -						break; -					} -					result = noErr; -					break; -				case kEventMouseUp: - -					switch(button) -					{ -					case kEventMouseButtonPrimary: -						if(mSimulatedRightClick) -						{ -							// End of simulated right click -							mSimulatedRightClick = false; -							mCallbacks->handleRightMouseUp(this, outCoords, mask); -						} -						else -						{ -							mCallbacks->handleMouseUp(this, outCoords, mask); -						} -						break; -					case kEventMouseButtonSecondary: -						mCallbacks->handleRightMouseUp(this, outCoords, mask); -						break; - -					case kEventMouseButtonTertiary: -						mCallbacks->handleMiddleMouseUp(this, outCoords, mask); -						break; -					} -					result = noErr; -					break; - -				case kEventMouseWheelMoved: -					{ -						static S32  z_delta = 0; - -						z_delta += wheelDelta; - -						if (z_delta <= -WHEEL_DELTA || WHEEL_DELTA <= z_delta) -						{ -							mCallbacks->handleScrollWheel(this, -z_delta / WHEEL_DELTA); -							z_delta = 0; -						} -					} -					result = noErr; -					break; - -				case kEventMouseDragged: -				case kEventMouseMoved: -					mCallbacks->handleMouseMove(this, outCoords, mask); -					result = noErr; -					break; - -				} -			} -		} -		break; - -	case kEventClassWindow: -		switch(evtKind) -		{ -		case kEventWindowActivated: -			if (mTSMDocument) -			{ -				ActivateTSMDocument(mTSMDocument); -			} -			mCallbacks->handleFocus(this); -			break; -		case kEventWindowDeactivated: -			if (mTSMDocument) -			{ -				DeactivateTSMDocument(mTSMDocument); -			} -			mCallbacks->handleFocusLost(this); -			break; - -		case kEventWindowBoundsChanging: -			{ -				// This is where we would constrain move/resize to a particular screen - -				const S32 MIN_WIDTH  = mMinWindowWidth; -				const S32 MIN_HEIGHT = mMinWindowHeight; - -				Rect currentBounds; -				Rect previousBounds; - -				GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, ¤tBounds); -				GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds); - -				// Put an offset into window un-maximize operation since the kEventWindowGetIdealSize -				// event only allows the specification of size and not position. -				if (mMaximized) -				{ -					short leftOffset = mPreviousWindowRect.left - currentBounds.left; -					currentBounds.left += leftOffset; -					currentBounds.right += leftOffset; - -					short topOffset = mPreviousWindowRect.top - currentBounds.top; -					currentBounds.top += topOffset; -					currentBounds.bottom += topOffset; -				} -				else -				{ -					// Store off the size for future un-maximize operations -					mPreviousWindowRect = previousBounds; -				} - -				if ((currentBounds.right - currentBounds.left) < MIN_WIDTH) -				{ -					currentBounds.right = currentBounds.left + MIN_WIDTH; -				} - -				if ((currentBounds.bottom - currentBounds.top) < MIN_HEIGHT) -				{ -					currentBounds.bottom = currentBounds.top + MIN_HEIGHT; -				} - -				SetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, sizeof(Rect), ¤tBounds); -				result = noErr; -			} -			break; - -		case kEventWindowBoundsChanged: -			{ -				// Get new window bounds -				Rect newBounds; -				GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds); - -				// Get previous window bounds -				Rect oldBounds; -				GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds); - -				// Determine if the new size is larger than the old -				bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left)); -				newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top)); - -				// Check to see if this is a zoom event (+ button on window pane) -				unsigned int eventParams; -				GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams); -				bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0); - -				// Maximized flag is if zoom event and increasing window size -				mMaximized = (isZoomEvent && newBoundsLarger); - -				aglUpdateContext(mContext); - -				mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top); -			} -			break; - -		case kEventWindowGetIdealSize: -			// Only recommend a new ideal size when un-maximizing -			if (mMaximized == TRUE) -			{ -				Point nonMaximizedSize; - -				nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top; -				nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left; - -				SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize); -				result = noErr; -			} -			break; - -		case kEventWindowClose: -			if(mCallbacks->handleCloseRequest(this)) -			{ -				// Get the app to initiate cleanup. -				mCallbacks->handleQuit(this); -				// The app is responsible for calling destroyWindow when done with GL -			} -			result = noErr; -			break; - -		case kEventWindowHidden: -			//					llinfos << "LLWindowMacOSX: Deactivating on hide" << llendl; -			mMinimized = TRUE; -			mCallbacks->handleActivate(this, false); -			//					result = noErr; -			break; - -		case kEventWindowShown: -			//					llinfos << "LLWindowMacOSX: Activating on show" << llendl; -			mMinimized = FALSE; -			mCallbacks->handleActivate(this, true); -			//					result = noErr; -			break; - -		case kEventWindowCollapsed: -			//					llinfos << "LLWindowMacOSX: Deactivating on collapse" << llendl; -			mMinimized = TRUE; -			mCallbacks->handleActivate(this, false); -			//					result = noErr; -			break; - -		case kEventWindowExpanded: -			//					llinfos << "LLWindowMacOSX: Activating on expand" << llendl; -			mMinimized = FALSE; -			mCallbacks->handleActivate(this, true); -			//					result = noErr; -			break; - -		case kEventWindowGetClickActivation: -			//					BringToFront(mWindow); -			//					result = noErr; -			break; -		} -		break; - -	case kEventClassTSMDocumentAccess: -		if (mPreeditor) -		{ -			switch(evtKind) -			{ - -			case kEventTSMDocumentAccessGetLength: -				{ -					// Return the number of UTF-16 units in the text, excluding those for preedit. - -					S32 preedit, preedit_length; -					mPreeditor->getPreeditRange(&preedit, &preedit_length); -					const LLWString & text = mPreeditor->getPreeditString(); -					const CFIndex length = wstring_utf16_length(text, 0, preedit) -						+ wstring_utf16_length(text, preedit + preedit_length, text.length()); -					result = SetEventParameter(event, kEventParamTSMDocAccessCharacterCount, typeCFIndex, sizeof(length), &length); -				} -				break; - -			case kEventTSMDocumentAccessGetSelectedRange: -				{ -					// Return the selected range, excluding preedit. -					// In our preeditor, preedit and selection are exclusive, so, -					// when it has a preedit, there is no selection and the -					// insertion point is on the preedit that corrupses into the -					// beginning of the preedit when the preedit was removed. - -					S32 preedit, preedit_length; -					mPreeditor->getPreeditRange(&preedit, &preedit_length); -					const LLWString & text = mPreeditor->getPreeditString(); - -					CFRange range; -					if (preedit_length) -					{ -						range.location = wstring_utf16_length(text, 0, preedit); -						range.length = 0; -					} -					else -					{ -						S32 selection, selection_length; -						mPreeditor->getSelectionRange(&selection, &selection_length); -						range.location = wstring_utf16_length(text, 0, selection); -						range.length = wstring_utf16_length(text, selection, selection_length); -					} - -					result = SetEventParameter(event, kEventParamTSMDocAccessReplyCharacterRange, typeCFRange, sizeof(range), &range); -				} -				break; - -			case kEventTSMDocumentAccessGetCharacters: -				{ -					UniChar *target_pointer; -					CFRange range; -					EventParamType param_type; -					if ((result = GetEventParameter(event, kEventParamTSMDocAccessSendCharacterRange, -										typeCFRange, ¶m_type, sizeof(range), NULL, &range)) == noErr -						&& typeCFRange == param_type -						&& (result = GetEventParameter(event, kEventParamTSMDocAccessSendCharactersPtr, -										typePtr, ¶m_type, sizeof(target_pointer), NULL, &target_pointer)) == noErr -						&& typePtr == param_type) -					{ -						S32 preedit, preedit_length; -						mPreeditor->getPreeditRange(&preedit, &preedit_length); -						const LLWString & text = mPreeditor->getPreeditString(); - -						// The GetCharacters event of TSMDA has a fundamental flaw; -						// An input method need to decide the starting offset and length -						// *before* it actually see the contents, so it is impossible -						// to guarantee the character-aligned access.  The event reply -						// has no way to indicate a condition something like "Request -						// was not fulfilled due to unaligned access.  Please retry." -						// Any error sent back to the input method stops use of TSMDA -						// entirely during the session... -						// We need to simulate very strictly the behaviour as if the -						// underlying *text engine* holds the contents in UTF-16. -						// I guess this is the reason why Apple repeats saying "all -						// text handling application should use UTF-16."  They are -						// trying to _fix_ the flaw by changing the appliations... -						// ... or, domination of UTF-16 in the industry may be a part -						// of the company vision, and Apple is trying to force third -						// party developers to obey their vision.  Remember that use -						// of 16 bits per _a_character_ was one of the very fundamental -						// Unicode design policy on its early days (during late 80s) -						// and the original Unicode design was by two Apple employees... - -						const llutf16string text_utf16 -							= wstring_to_utf16str(text, preedit) -							+ wstring_to_utf16str(text.substr(preedit + preedit_length)); - -						llassert_always(sizeof(U16) == sizeof(UniChar)); -						llassert(0 <= range.location && 0 <= range.length && range.location + range.length <= text_utf16.length()); -						memcpy(target_pointer, text_utf16.c_str() + range.location, range.length * sizeof(UniChar)); - -						// Note that result has already been set above. -					} -				} -				break; - -			} -		} -		break; -	} -	return result; -} -  const char* cursorIDToName(int id)  {  	switch (id) @@ -2876,7 +1317,7 @@ static void initPixmapCursor(int cursorid, int hotspotX, int hotspotY)  void LLWindowMacOSX::updateCursor()  { -	OSStatus result = noErr; +	S32 result = 0;  	if (mDragOverrideCursor != -1)  	{ @@ -2913,7 +1354,7 @@ void LLWindowMacOSX::updateCursor()  		if(mCursorHidden)  		{  			// Since InitCursor resets the hide level, correct for it here. -			::HideCursor(); +			hideNSCursor();  		}  		break; @@ -2921,12 +1362,12 @@ void LLWindowMacOSX::updateCursor()  		//    Find out what they look like and replicate them.  		// These are essentially correct -	case UI_CURSOR_WAIT:		SetThemeCursor(kThemeWatchCursor);	break; -	case UI_CURSOR_IBEAM:		SetThemeCursor(kThemeIBeamCursor);	break; -	case UI_CURSOR_CROSS:		SetThemeCursor(kThemeCrossCursor);	break; -	case UI_CURSOR_HAND:		SetThemeCursor(kThemePointingHandCursor);	break; +	case UI_CURSOR_WAIT:		/* Apple purposely doesn't allow us to set the beachball cursor manually. */	break; +	case UI_CURSOR_IBEAM:		setIBeamCursor();	break; +	case UI_CURSOR_CROSS:		setCrossCursor();	break; +	case UI_CURSOR_HAND:		setPointingHandCursor();	break;  		//		case UI_CURSOR_NO:			SetThemeCursor(kThemeNotAllowedCursor);	break; -	case UI_CURSOR_ARROWCOPY:   SetThemeCursor(kThemeCopyArrowCursor);	break; +	case UI_CURSOR_ARROWCOPY:   setCopyCursor();	break;  		// Double-check these  	case UI_CURSOR_NO: @@ -3039,7 +1480,7 @@ void LLWindowMacOSX::hideCursor()  		//		llinfos << "hideCursor: hiding" << llendl;  		mCursorHidden = TRUE;  		mHideCursorPermanent = TRUE; -		::HideCursor(); +		hideNSCursor();  	}  	else  	{ @@ -3056,7 +1497,7 @@ void LLWindowMacOSX::showCursor()  		//		llinfos << "showCursor: showing" << llendl;  		mCursorHidden = FALSE;  		mHideCursorPermanent = FALSE; -		::ShowCursor(); +		showNSCursor();  	}  	else  	{ @@ -3102,7 +1543,7 @@ void LLSplashScreenMacOSX::showImpl()  	// This code _could_ be used to display a spash screen...  #if 0  	IBNibRef nib = NULL; -	OSStatus err; +	S32 err;  	err = CreateNibReference(CFSTR("SecondLife"), &nib); @@ -3127,25 +1568,6 @@ void LLSplashScreenMacOSX::updateImpl(const std::string& mesg)  		CFStringRef string = NULL;  		string = CFStringCreateWithCString(NULL, mesg.c_str(), kCFStringEncodingUTF8); - -		if(string != NULL) -		{ -			ControlRef progressText = NULL; -			ControlID id; -			OSStatus err; - -			id.signature = 'what'; -			id.id = 0; - -			err = GetControlByID(mWindow, &id, &progressText); -			if(err == noErr) -			{ -				err = SetControlData(progressText, kControlEntireControl, kControlStaticTextCFStringTag, sizeof(CFStringRef), (Ptr)&string); -				Draw1Control(progressText); -			} - -			CFRelease(string); -		}  	}  } @@ -3154,7 +1576,6 @@ void LLSplashScreenMacOSX::hideImpl()  {  	if(mWindow != NULL)  	{ -		DisposeWindow(mWindow);  		mWindow = NULL;  	}  } @@ -3163,102 +1584,16 @@ void LLSplashScreenMacOSX::hideImpl()  S32 OSMessageBoxMacOSX(const std::string& text, const std::string& caption, U32 type)  { -	S32 result = OSBTN_CANCEL; -	SInt16 retval_mac = 1; -	AlertStdCFStringAlertParamRec params; -	CFStringRef errorString = NULL; -	CFStringRef explanationString = NULL; -	DialogRef alert = NULL; -	AlertType alertType = kAlertCautionAlert; -	OSStatus err; - -	explanationString = CFStringCreateWithCString(NULL, text.c_str(), kCFStringEncodingUTF8); -	errorString = CFStringCreateWithCString(NULL, caption.c_str(), kCFStringEncodingUTF8); - -	params.version = kStdCFStringAlertVersionOne; -	params.movable = false; -	params.helpButton = false; -	params.defaultText = (CFStringRef)kAlertDefaultOKText; -	params.cancelText = 0; -	params.otherText = 0; -	params.defaultButton = 1; -	params.cancelButton = 0; -	params.position = kWindowDefaultPosition; -	params.flags = 0; - -	switch(type) -	{ -	case OSMB_OK: -	default: -		break; -	case OSMB_OKCANCEL: -		params.cancelText = (CFStringRef)kAlertDefaultCancelText; -		params.cancelButton = 2; -		break; -	case OSMB_YESNO: -		alertType = kAlertNoteAlert; -		params.defaultText = CFSTR("Yes"); -		params.cancelText = CFSTR("No"); -		params.cancelButton = 2; -		break; -	} - -	if(gWindowImplementation != NULL) -		gWindowImplementation->beforeDialog(); - -	err = CreateStandardAlert( -		alertType, -		errorString, -		explanationString, -		¶ms, -		&alert); - -	if(err == noErr) -	{ -		err = RunStandardAlert( -			alert, -			NULL, -			&retval_mac); -	} - -	if(gWindowImplementation != NULL) -		gWindowImplementation->afterDialog(); - -	switch(type) -	{ -	case OSMB_OK: -	case OSMB_OKCANCEL: -	default: -		if(retval_mac == 1) -			result = OSBTN_OK; -		else -			result = OSBTN_CANCEL; -		break; -	case OSMB_YESNO: -		if(retval_mac == 1) -			result = OSBTN_YES; -		else -			result = OSBTN_NO; -		break; -	} - -	if(errorString != NULL) -	{ -		CFRelease(errorString); -	} - -	if(explanationString != NULL) -	{ -		CFRelease(explanationString); -	} - -	return result; +	// TODO: Implement a native NSAlert function that replicates all of this. +	return 0;  }  // Open a URL with the user's default web browser.  // Must begin with protocol identifier.  void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)  { +	// I'm fairly certain that this is all legitimate under Apple's currently supported APIs. +	  	bool found = false;  	S32 i;  	for (i = 0; i < gURLProtocolWhitelistCount; i++) @@ -3276,7 +1611,7 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)  		return;  	} -	OSStatus result = noErr; +	S32 result = 0;  	CFURLRef urlRef = NULL;  	llinfos << "Opening URL " << escaped_url << llendl; @@ -3313,7 +1648,7 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)  LLSD LLWindowMacOSX::getNativeKeyData()  {  	LLSD result = LLSD::emptyMap(); - +#if 0  	if(mRawKeyEvent)  	{  		char char_code = 0; @@ -3335,7 +1670,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()  		// This causes trouble for control characters -- apparently character codes less than 32 (escape, control-A, etc)  		// cause llsd serialization to create XML that the llsd deserializer won't parse!  		std::string unicode; -		OSStatus err = noErr; +		S32 err = noErr;  		EventParamType actualType = typeUTF8Text;  		UInt32 actualSize = 0;  		char *buffer = NULL; @@ -3357,7 +1692,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()  #endif  	} - +#endif  	lldebugs << "native key data is: " << result << llendl; @@ -3367,34 +1702,9 @@ LLSD LLWindowMacOSX::getNativeKeyData()  BOOL LLWindowMacOSX::dialogColorPicker( F32 *r, F32 *g, F32 *b)  { +	// Is this even used anywhere?  Do we really need an OS color picker?  	BOOL	retval = FALSE; -	OSErr	error = noErr; -	NColorPickerInfo	info; - -	memset(&info, 0, sizeof(info)); -	info.theColor.color.rgb.red = (UInt16)(*r * 65535.f); -	info.theColor.color.rgb.green = (UInt16)(*g * 65535.f); -	info.theColor.color.rgb.blue = (UInt16)(*b * 65535.f); -	info.placeWhere = kCenterOnMainScreen; - -	if(gWindowImplementation != NULL) -		gWindowImplementation->beforeDialog(); - -	error = NPickColor(&info); - -	if(gWindowImplementation != NULL) -		gWindowImplementation->afterDialog(); - -	if (error == noErr) -	{ -		retval = info.newColorChosen; -		if (info.newColorChosen) -		{ -			*r = ((float) info.theColor.color.rgb.red) / 65535.0; -			*g = ((float) info.theColor.color.rgb.green) / 65535.0; -			*b = ((float) info.theColor.color.rgb.blue) / 65535.0; -		} -	} +	//S32		error = 0;  	return (retval);  } @@ -3405,44 +1715,13 @@ void *LLWindowMacOSX::getPlatformWindow()  	return (void*)mWindow;  } -void *LLWindowMacOSX::getMediaWindow() -{ -	/* -		Mozilla needs to be initialized with a WindowRef to function properly. -		(There's no good reason for this, since it shouldn't be interacting with our window in any way, but that's another issue.) -		If we're in windowed mode, we _could_ hand it our actual window pointer, but a subsequent switch to fullscreen will destroy that window, -		which trips up Mozilla. -		Instead of using our actual window, we create an invisible window which will persist for the lifetime of the application and pass that to Mozilla. -		This satisfies its deep-seated need to latch onto a WindowRef and solves the issue with switching between fullscreen and windowed modes. - -		Note that we will never destroy this window (by design!), but since only one will ever be created per run of the application, that's okay. -	*/ - -	if(sMediaWindow == NULL) -	{ -		Rect window_rect = {100, 100, 200, 200}; - -		sMediaWindow = NewCWindow( -			NULL, -			&window_rect, -			(ConstStr255Param) "\p", -			false,				// Create the window invisible. -			zoomDocProc,		// Window with a grow box and a zoom box -			kLastWindowOfClass,		// create it behind other windows -			false,					// no close box -			0); -	} - -	return (void*)sMediaWindow; -} -  void LLWindowMacOSX::stopDockTileBounce()  { -	NMRemove(&mBounceRec);  	mBounceTimer.stop();  }  // get a double value from a dictionary +/*  static double getDictDouble (CFDictionaryRef refDict, CFStringRef key)  {  	double double_value; @@ -3452,7 +1731,7 @@ static double getDictDouble (CFDictionaryRef refDict, CFStringRef key)  	if (!CFNumberGetValue(number_value, kCFNumberDoubleType, &double_value)) // or if cant convert it  		return -1; // fail  	return double_value; // otherwise return the long value -} +}*/  // get a long value from a dictionary  static long getDictLong (CFDictionaryRef refDict, CFStringRef key) @@ -3468,71 +1747,12 @@ static long getDictLong (CFDictionaryRef refDict, CFStringRef key)  void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)  { -	ScriptLanguageRecord script_language; - -	if (preeditor != mPreeditor && !b) -	{ -		// This condition may occur by a call to -		// setEnabled(BOOL) against LLTextEditor or LLLineEditor -		// when the control is not focused. -		// We need to silently ignore the case so that -		// the language input status of the focused control -		// is not disturbed. -		return; -	} - -	UseInputWindow(mTSMDocument, !b); - -	// Take care of old and new preeditors. -	if (preeditor != mPreeditor || !b) -	{ -		// We need to interrupt before updating mPreeditor, -		// so that the fix string from input method goes to -		// the old preeditor. -		if (mLanguageTextInputAllowed) -		{ -			interruptLanguageTextInput(); -		} -		mPreeditor = (b ? preeditor : NULL); -	} - -	if (b == mLanguageTextInputAllowed) -	{ -		return; -	} -	mLanguageTextInputAllowed = b; - -	if (b) -	{ -		if (mTSMScriptCode != smRoman) -		{ -			script_language.fScript = mTSMScriptCode; -			script_language.fLanguage = mTSMLangCode; -			SetTextServiceLanguage(&script_language); -		} -	} -	else -	{ -		GetTextServiceLanguage(&script_language); -		mTSMScriptCode = script_language.fScript; -		mTSMLangCode = script_language.fLanguage; -		if (mTSMScriptCode != smRoman) -		{ -			script_language.fScript = smRoman; -			script_language.fLanguage = langEnglish; -			SetTextServiceLanguage(&script_language); -		} -	} +	// TODO: IME support  }  void LLWindowMacOSX::interruptLanguageTextInput()  { -	if (mTSMDocument) -	{ -		FixTSMDocument(mTSMDocument); -	} -	// Don't we need to call resetPreedit here? -	// Well, if Apple's TSM document is correct, we don't. +	// TODO: IME support  }  //static @@ -3543,21 +1763,21 @@ std::vector<std::string> LLWindowMacOSX::getDynamicFallbackFontList()  }  // static -MASK LLWindowMacOSX::modifiersToMask(SInt16 modifiers) +MASK LLWindowMacOSX::modifiersToMask(S16 modifiers)  {  	MASK mask = 0; -	if(modifiers & shiftKey) { mask |= MASK_SHIFT; } -	if(modifiers & (cmdKey | controlKey)) { mask |= MASK_CONTROL; } -	if(modifiers & optionKey) { mask |= MASK_ALT; } +	if(modifiers & MAC_SHIFT_KEY) { mask |= MASK_SHIFT; } +	if(modifiers & (MAC_CMD_KEY | MAC_CTRL_KEY)) { mask |= MASK_CONTROL; } +	if(modifiers & MAC_ALT_KEY) { mask |= MASK_ALT; }  	return mask;  }  #if LL_OS_DRAGDROP_ENABLED - -OSErr LLWindowMacOSX::dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow, +/* +S16 LLWindowMacOSX::dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow,  						  void * handlerRefCon, DragRef drag)  { -	OSErr result = noErr; +	S16 result = 0;  	LLWindowMacOSX *self = (LLWindowMacOSX*)handlerRefCon;  	lldebugs << "drag tracking handler, message = " << message << llendl; @@ -3582,7 +1802,6 @@ OSErr LLWindowMacOSX::dragTrackingHandler(DragTrackingMessage message, WindowRef  	return result;  } -  OSErr LLWindowMacOSX::dragReceiveHandler(WindowRef theWindow, void * handlerRefCon,  										 DragRef drag)  { @@ -3590,126 +1809,69 @@ OSErr LLWindowMacOSX::dragReceiveHandler(WindowRef theWindow, void * handlerRefC  	return self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_DROPPED);  } - -OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDropAction action) +*/ +void LLWindowMacOSX::handleDragNDrop(std::string url, LLWindowCallbacks::DragNDropAction action)  { -	OSErr result = dragNotAcceptedErr;	// overall function result -	OSErr err = noErr;	// for local error handling +	MASK mask = LLWindowMacOSX::modifiersToMask(getModifiers()); -	// Get the mouse position and modifiers of this drag. -	SInt16 modifiers, mouseDownModifiers, mouseUpModifiers; -	::GetDragModifiers(drag, &modifiers, &mouseDownModifiers, &mouseUpModifiers); -	MASK mask = LLWindowMacOSX::modifiersToMask(modifiers); - -	Point mouse_point; +	float mouse_point[2];  	// This will return the mouse point in global screen coords -	::GetDragMouse(drag, &mouse_point, NULL); -	LLCoordScreen screen_coords(mouse_point.h, mouse_point.v); +	getCursorPos(mWindow, mouse_point); +	LLCoordScreen screen_coords(mouse_point[0], mouse_point[1]);  	LLCoordGL gl_pos;  	convertCoords(screen_coords, &gl_pos); - -	// Look at the pasteboard and try to extract an URL from it -	PasteboardRef   pasteboard; -	if(GetDragPasteboard(drag, &pasteboard) == noErr) +	 +	if(!url.empty())  	{ -		ItemCount num_items = 0; -		// Treat an error here as an item count of 0 -		(void)PasteboardGetItemCount(pasteboard, &num_items); - -		// Only deal with single-item drags. -		if(num_items == 1) -		{ -			PasteboardItemID item_id = NULL; -			CFArrayRef flavors = NULL; -			CFDataRef data = NULL; - -			err = PasteboardGetItemIdentifier(pasteboard, 1, &item_id); // Yes, this really is 1-based. - -			// Try to extract an URL from the pasteboard -			if(err == noErr) -			{ -				err = PasteboardCopyItemFlavors( pasteboard, item_id, &flavors); -			} - -			if(err == noErr) -			{ -				if(CFArrayContainsValue(flavors, CFRangeMake(0, CFArrayGetCount(flavors)), kUTTypeURL)) +		LLWindowCallbacks::DragNDropResult res = +		mCallbacks->handleDragNDrop(this, gl_pos, mask, action, url); +		 +		switch (res) { +			case LLWindowCallbacks::DND_NONE:		// No drop allowed +				if (action == LLWindowCallbacks::DNDA_TRACK)  				{ -					// This is an URL. -					err = PasteboardCopyItemFlavorData(pasteboard, item_id, kUTTypeURL, &data); +					mDragOverrideCursor = 0;  				} -				else if(CFArrayContainsValue(flavors, CFRangeMake(0, CFArrayGetCount(flavors)), kUTTypeUTF8PlainText)) -				{ -					// This is a string that might be an URL. -					err = PasteboardCopyItemFlavorData(pasteboard, item_id, kUTTypeUTF8PlainText, &data); +				else { +					mDragOverrideCursor = -1;  				} - -			} - -			if(flavors != NULL) -			{ -				CFRelease(flavors); -			} - -			if(data != NULL) -			{ -				std::string url; -				url.assign((char*)CFDataGetBytePtr(data), CFDataGetLength(data)); -				CFRelease(data); - -				if(!url.empty()) -				{ -					LLWindowCallbacks::DragNDropResult res = -						mCallbacks->handleDragNDrop(this, gl_pos, mask, action, url); - -					switch (res) { -						case LLWindowCallbacks::DND_NONE:		// No drop allowed -							if (action == LLWindowCallbacks::DNDA_TRACK) -							{ -								mDragOverrideCursor = kThemeNotAllowedCursor; -							} -							else { -								mDragOverrideCursor = -1; -							} -							break; -						case LLWindowCallbacks::DND_MOVE:		// Drop accepted would result in a "move" operation -							mDragOverrideCursor = kThemePointingHandCursor; -							result = noErr; -							break; -						case LLWindowCallbacks::DND_COPY:		// Drop accepted would result in a "copy" operation -							mDragOverrideCursor = kThemeCopyArrowCursor; -							result = noErr; -							break; -						case LLWindowCallbacks::DND_LINK:		// Drop accepted would result in a "link" operation: -							mDragOverrideCursor = kThemeAliasArrowCursor; -							result = noErr; -							break; -						default: -							mDragOverrideCursor = -1; -							break; -					} -					// This overrides the cursor being set by setCursor. -					// This is a bit of a hack workaround because lots of areas -					// within the viewer just blindly set the cursor. -					if (mDragOverrideCursor == -1) -					{ -						// Restore the cursor -						ECursorType temp_cursor = mCurrentCursor; -						// get around the "setting the same cursor" code in setCursor() -						mCurrentCursor = UI_CURSOR_COUNT; - 						setCursor(temp_cursor); -					} -					else { -						// Override the cursor -						SetThemeCursor(mDragOverrideCursor); -					} - -				} -			} +				break; +			case LLWindowCallbacks::DND_MOVE:		// Drop accepted would result in a "move" operation +				mDragOverrideCursor = UI_CURSOR_NO; +				break; +			case LLWindowCallbacks::DND_COPY:		// Drop accepted would result in a "copy" operation +				mDragOverrideCursor = UI_CURSOR_ARROWCOPY; +				break; +			default: +				mDragOverrideCursor = -1; +				break; +		} +		// This overrides the cursor being set by setCursor. +		// This is a bit of a hack workaround because lots of areas +		// within the viewer just blindly set the cursor. +		if (mDragOverrideCursor == -1) +		{ +			// Restore the cursor +			ECursorType temp_cursor = mCurrentCursor; +			// get around the "setting the same cursor" code in setCursor() +			mCurrentCursor = UI_CURSOR_COUNT; +			setCursor(temp_cursor); +		} +		else { +			// Override the cursor +			switch (mDragOverrideCursor) { +				case 0: +					setArrowCursor(); +					break; +				case UI_CURSOR_NO: +					setNotAllowedCursor(); +				case UI_CURSOR_ARROWCOPY: +					setCopyCursor(); +				default: +					break; +			};  		}  	} - -	return result;  }  #endif // LL_OS_DRAGDROP_ENABLED diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index af83b50097..14d6e70fb3 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -29,11 +29,12 @@  #include "llwindow.h"  #include "llwindowcallbacks.h" +#include "llwindowmacosx-objc.h"  #include "lltimer.h" -#include <Carbon/Carbon.h> -#include <AGL/agl.h> +#include <ApplicationServices/ApplicationServices.h> +#include <OpenGL/OpenGL.h>  // AssertMacros.h does bad things.  #include "fix_macros.h" @@ -106,7 +107,6 @@ public:  	/*virtual*/ BOOL dialogColorPicker(F32 *r, F32 *g, F32 *b);  	/*virtual*/ void *getPlatformWindow(); -	/*virtual*/ void *getMediaWindow();  	/*virtual*/ void bringToFront() {};  	/*virtual*/ void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b); @@ -117,7 +117,14 @@ public:  	// Provide native key event data  	/*virtual*/ LLSD getNativeKeyData(); - +	 +	void* getWindow() { return mWindow; } +	LLWindowCallbacks* getCallbacks() { return mCallbacks; } +	 +	void updateMouseDeltas(float* deltas); +	void getMouseDeltas(float* delta); +	 +	void handleDragNDrop(std::string url, LLWindowCallbacks::DragNDropAction action);  protected:  	LLWindowMacOSX(LLWindowCallbacks* callbacks, @@ -153,40 +160,34 @@ protected:  	BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync);  	void destroyContext();  	void setupFailure(const std::string& text, const std::string& caption, U32 type); -	static pascal OSStatus staticEventHandler (EventHandlerCallRef myHandler, EventRef event, void* userData); -	static pascal Boolean staticMoveEventComparator( EventRef event, void* data); -	OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event);  	void adjustCursorDecouple(bool warpingMouse = false);  	void stopDockTileBounce(); -	static MASK modifiersToMask(SInt16 modifiers); +	static MASK modifiersToMask(S16 modifiers);  #if LL_OS_DRAGDROP_ENABLED -	static OSErr dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow, -									 void * handlerRefCon, DragRef theDrag); -	static OSErr dragReceiveHandler(WindowRef theWindow, void * handlerRefCon,	DragRef theDrag); -	OSErr handleDragNDrop(DragRef theDrag, LLWindowCallbacks::DragNDropAction action); +	 +	//static OSErr dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow, void * handlerRefCon, DragRef theDrag); +	//static OSErr dragReceiveHandler(WindowRef theWindow, void * handlerRefCon,	DragRef theDrag); +	 +	  #endif // LL_OS_DRAGDROP_ENABLED  	//  	// Platform specific variables  	// -	WindowRef		mWindow; -	AGLContext		mContext; -	AGLPixelFormat	mPixelFormat; +	 +	// Use generic pointers here.  This lets us do some funky Obj-C interop using Obj-C objects without having to worry about any compilation problems that may arise. +	NSWindowRef			mWindow; +	GLViewRef			mGLView; +	CGLContextObj		mContext; +	CGLPixelFormatObj	mPixelFormat;  	CGDirectDisplayID	mDisplay; -	CFDictionaryRef		mOldDisplayMode; -	EventLoopTimerRef	mTimer; -	EventHandlerUPP 	mEventHandlerUPP; -	EventHandlerRef		mGlobalHandlerRef; -	EventHandlerRef		mWindowHandlerRef; -	EventComparatorUPP  mMoveEventCampartorUPP; -	Rect		mOldMouseClip;  // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse() -	Rect		mPreviousWindowRect;  // Save previous window for un-maximize event -	Str255 		mWindowTitle; +	LLRect		mOldMouseClip;  // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse() +	std::string mWindowTitle;  	double		mOriginalAspectRatio;  	BOOL		mSimulatedRightClick; -	UInt32		mLastModifiers; +	U32			mLastModifiers;  	BOOL		mHandsOffEvents;	// When true, temporarially disable CarbonEvent processing.  	// Used to allow event processing when putting up dialogs in fullscreen mode.  	BOOL		mCursorDecoupled; @@ -201,25 +202,20 @@ protected:  	U32			mFSAASamples;  	BOOL		mForceRebuild; -	S32			mDragOverrideCursor; +	S32	mDragOverrideCursor;  	F32			mBounceTime; -	NMRec		mBounceRec; +	//NMRec		mBounceRec;  	LLTimer		mBounceTimer;  	// Input method management through Text Service Manager. -	TSMDocumentID	mTSMDocument;  	BOOL		mLanguageTextInputAllowed; -	ScriptCode	mTSMScriptCode; -	LangCode	mTSMLangCode;  	LLPreeditor*	mPreeditor;  	static BOOL	sUseMultGL;  	friend class LLWindowManager; -	static WindowRef sMediaWindow; -	EventRef 	mRawKeyEvent; - +	  }; diff --git a/indra/media_plugins/webkit/mac_volume_catcher.cpp b/indra/media_plugins/webkit/mac_volume_catcher.cpp index 8a06bb8487..2f3f2211a3 100644 --- a/indra/media_plugins/webkit/mac_volume_catcher.cpp +++ b/indra/media_plugins/webkit/mac_volume_catcher.cpp @@ -35,7 +35,6 @@  #include "volume_catcher.h" -#include <Carbon/Carbon.h>  #include <QuickTime/QuickTime.h>  #include <AudioUnit/AudioUnit.h> diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4c5bfbc820..963f770493 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1234,6 +1234,9 @@ if (DARWIN)    LIST(APPEND viewer_SOURCE_FILES llfilepicker_mac.mm)    LIST(APPEND viewer_HEADER_FILES llfilepicker_mac.h) +  # This should be compiled with the viewer. +  LIST(APPEND viewer_SOURCE_FILES llappdelegate-objc.mm) +    find_library(AGL_LIBRARY AGL)    find_library(APPKIT_LIBRARY AppKit)    find_library(COCOA_LIBRARY Cocoa) @@ -1253,7 +1256,7 @@ if (DARWIN)      macview.r      gpu_table.txt      Info-SecondLife.plist -    SecondLife.nib/ +    SecondLife.xib/      # CMake doesn't seem to support Xcode language variants well just yet      English.lproj/InfoPlist.strings      English.lproj/language.txt @@ -1530,6 +1533,7 @@ if (FMOD)    if (DARWIN)      set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp)      add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES}) +    find_library(CARBON_LIBRARY Carbon)      set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY} ${CARBON_LIBRARY})      set_target_properties(        fmodwrapper diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index f7b11b217c..5db52f040f 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -61,6 +61,10 @@  	</array>  	<key>CFBundleVersion</key>  	<string>2.1.0.13828</string> +	<key>NSPrincipalClass</key> +	<string>NSApplication</string> +	<key>NSMainNibFile</key> +	<string>SecondLife</string>  	<key>CSResourcesFileMapped</key>  	<true/>  </dict> diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nibBinary files differ new file mode 100644 index 0000000000..0d59d59bb2 --- /dev/null +++ b/indra/newview/SecondLife.nib diff --git a/indra/newview/SecondLife.nib/classes.nib b/indra/newview/SecondLife.nib/classes.nib deleted file mode 100644 index ea58db1189..0000000000 --- a/indra/newview/SecondLife.nib/classes.nib +++ /dev/null @@ -1,4 +0,0 @@ -{ -IBClasses = (); -IBVersion = 1; -} diff --git a/indra/newview/SecondLife.nib/info.nib b/indra/newview/SecondLife.nib/info.nib deleted file mode 100644 index 1b531de104..0000000000 --- a/indra/newview/SecondLife.nib/info.nib +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> -	<key>IBDocumentLocation</key> -	<string>85 13 356 240 0 0 1280 1002 </string> -	<key>IBEditorPositions</key> -	<dict> -		<key>29</key> -		<string>27 314 247 44 0 0 1280 1002 </string> -	</dict> -	<key>IBFramework Version</key> -	<string>362.0</string> -	<key>IBOpenObjects</key> -	<array> -		<integer>191</integer> -	</array> -	<key>IBSystem Version</key> -	<string>7D24</string> -	<key>targetFramework</key> -	<string>IBCarbonFramework</string> -</dict> -</plist> diff --git a/indra/newview/SecondLife.nib/objects.xib b/indra/newview/SecondLife.nib/objects.xib deleted file mode 100644 index b7ff30f2b2..0000000000 --- a/indra/newview/SecondLife.nib/objects.xib +++ /dev/null @@ -1,259 +0,0 @@ -<?xml version="1.0" standalone="yes"?> -<object class="NSIBObjectData"> -  <string name="targetFramework">IBCarbonFramework</string> -  <object name="rootObject" class="NSCustomObject" id="1"> -    <string name="customClass">NSApplication</string> -  </object> -  <array count="31" name="allObjects"> -    <object class="IBCarbonMenu" id="29"> -      <string name="title">SecondLife</string> -      <array count="4" name="items"> -        <object class="IBCarbonMenuItem" id="182"> -          <string name="title">Second Life</string> -          <object name="submenu" class="IBCarbonMenu" id="181"> -            <string name="title">Second Life</string> -            <array count="1" name="items"> -              <object class="IBCarbonMenuItem" id="183"> -                <boolean name="disabled">TRUE</boolean> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">About Second Life</string> -                <int name="keyEquivalentModifier">0</int> -                <ostype name="command">abou</ostype> -              </object> -            </array> -            <string name="name">_NSAppleMenu</string> -          </object> -        </object> -        <object class="IBCarbonMenuItem" id="127"> -          <string name="title">File</string> -          <object name="submenu" class="IBCarbonMenu" id="131"> -            <string name="title">File</string> -          </object> -        </object> -        <object class="IBCarbonMenuItem" id="152"> -          <string name="title">Edit</string> -          <object name="submenu" class="IBCarbonMenu" id="147"> -            <string name="title">Edit</string> -            <array count="10" name="items"> -              <object class="IBCarbonMenuItem" id="141"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Undo</string> -                <string name="keyEquivalent">z</string> -                <ostype name="command">undo</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="146"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Redo</string> -                <string name="keyEquivalent">Z</string> -                <ostype name="command">redo</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="142"> -                <boolean name="separator">TRUE</boolean> -              </object> -              <object class="IBCarbonMenuItem" id="143"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Cut</string> -                <string name="keyEquivalent">x</string> -                <ostype name="command">cut </ostype> -              </object> -              <object class="IBCarbonMenuItem" id="149"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Copy</string> -                <string name="keyEquivalent">c</string> -                <ostype name="command">copy</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="144"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Paste</string> -                <string name="keyEquivalent">v</string> -                <ostype name="command">past</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="151"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Delete</string> -                <ostype name="command">clea</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="148"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Select All</string> -                <string name="keyEquivalent">a</string> -                <ostype name="command">sall</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="188"> -                <boolean name="separator">TRUE</boolean> -              </object> -              <object class="IBCarbonMenuItem" id="187"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Special Characters…</string> -                <ostype name="command">chrp</ostype> -              </object> -            </array> -          </object> -        </object> -        <object class="IBCarbonMenuItem" id="153"> -          <string name="title">Window</string> -          <object name="submenu" class="IBCarbonMenu" id="154"> -            <string name="title">Window</string> -            <array count="6" name="items"> -              <object class="IBCarbonMenuItem" id="155"> -                <boolean name="dynamic">TRUE</boolean> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Minimize Window</string> -                <string name="keyEquivalent">m</string> -                <ostype name="command">mini</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="184"> -                <boolean name="dynamic">TRUE</boolean> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Minimize All Windows</string> -                <string name="keyEquivalent">m</string> -                <int name="keyEquivalentModifier">1572864</int> -                <ostype name="command">mina</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="186"> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Zoom</string> -                <ostype name="command">zoom</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="156"> -                <boolean name="separator">TRUE</boolean> -              </object> -              <object class="IBCarbonMenuItem" id="157"> -                <boolean name="dynamic">TRUE</boolean> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Bring All to Front</string> -                <ostype name="command">bfrt</ostype> -              </object> -              <object class="IBCarbonMenuItem" id="185"> -                <boolean name="dynamic">TRUE</boolean> -                <boolean name="updateSingleItem">TRUE</boolean> -                <string name="title">Arrange in Front</string> -                <int name="keyEquivalentModifier">1572864</int> -                <ostype name="command">frnt</ostype> -              </object> -            </array> -            <string name="name">_NSWindowsMenu</string> -          </object> -        </object> -      </array> -      <string name="name">_NSMainMenu</string> -    </object> -    <reference idRef="127"/> -    <reference idRef="131"/> -    <reference idRef="141"/> -    <reference idRef="142"/> -    <reference idRef="143"/> -    <reference idRef="144"/> -    <reference idRef="146"/> -    <reference idRef="147"/> -    <reference idRef="148"/> -    <reference idRef="149"/> -    <reference idRef="151"/> -    <reference idRef="152"/> -    <reference idRef="153"/> -    <reference idRef="154"/> -    <reference idRef="155"/> -    <reference idRef="156"/> -    <reference idRef="157"/> -    <reference idRef="181"/> -    <reference idRef="182"/> -    <reference idRef="183"/> -    <reference idRef="184"/> -    <reference idRef="185"/> -    <reference idRef="186"/> -    <reference idRef="187"/> -    <reference idRef="188"/> -    <object class="IBCarbonRootControl" id="190"> -      <string name="bounds">0 0 482 694 </string> -      <string name="viewFrame">0 0 694 482 </string> -      <array count="2" name="subviews"> -        <object class="IBCarbonButton" id="192"> -          <string name="bounds">442 604 462 674 </string> -          <string name="viewFrame">604 442 70 20 </string> -          <string name="title">OK</string> -          <ostype name="command">ok  </ostype> -          <object name="layoutInfo" class="IBCarbonHILayoutInfo"> -            <int name="bindingBottomKind">2</int> -            <int name="bindingRightKind">2</int> -          </object> -          <int name="buttonType">1</int> -        </object> -        <object class="IBCarbonScrollView" id="201"> -          <string name="bounds">20 20 422 674 </string> -          <string name="viewFrame">20 20 654 402 </string> -          <array count="1" name="subviews"> -            <object class="IBCarbonTextView" id="200"> -              <string name="bounds">20 20 422 659 </string> -              <string name="viewFrame">0 0 639 402 </string> -              <ostype name="controlSignature">text</ostype> -              <int name="fontStyle">5</int> -              <boolean name="readOnly">TRUE</boolean> -            </object> -          </array> -          <boolean name="scrollHorizontally">FALSE</boolean> -        </object> -      </array> -    </object> -    <object class="IBCarbonWindow" id="191"> -      <string name="windowRect">84 72 566 766 </string> -      <string name="title">Release Notes</string> -      <reference name="rootControl" idRef="190"/> -      <boolean name="receiveUpdates">FALSE</boolean> -      <boolean name="hasCloseBox">FALSE</boolean> -      <boolean name="hasCollapseBox">FALSE</boolean> -      <boolean name="hasHorizontalZoom">FALSE</boolean> -      <boolean name="isResizable">FALSE</boolean> -      <boolean name="hasVerticalZoom">FALSE</boolean> -      <boolean name="liveResize">TRUE</boolean> -      <boolean name="compositing">TRUE</boolean> -      <int name="carbonWindowClass">4</int> -      <int name="windowPosition">1</int> -      <boolean name="isConstrained">FALSE</boolean> -    </object> -    <reference idRef="192"/> -    <reference idRef="200"/> -    <reference idRef="201"/> -  </array> -  <array count="31" name="allParents"> -    <reference idRef="1"/> -    <reference idRef="29"/> -    <reference idRef="127"/> -    <reference idRef="147"/> -    <reference idRef="147"/> -    <reference idRef="147"/> -    <reference idRef="147"/> -    <reference idRef="147"/> -    <reference idRef="152"/> -    <reference idRef="147"/> -    <reference idRef="147"/> -    <reference idRef="147"/> -    <reference idRef="29"/> -    <reference idRef="29"/> -    <reference idRef="153"/> -    <reference idRef="154"/> -    <reference idRef="154"/> -    <reference idRef="154"/> -    <reference idRef="182"/> -    <reference idRef="29"/> -    <reference idRef="181"/> -    <reference idRef="154"/> -    <reference idRef="154"/> -    <reference idRef="154"/> -    <reference idRef="147"/> -    <reference idRef="147"/> -    <reference idRef="191"/> -    <reference idRef="1"/> -    <reference idRef="190"/> -    <reference idRef="201"/> -    <reference idRef="190"/> -  </array> -  <dictionary count="3" name="nameTable"> -    <string>Files Owner</string> -    <reference idRef="1"/> -    <string>MenuBar</string> -    <reference idRef="29"/> -    <string>Release Notes</string> -    <reference idRef="191"/> -  </dictionary> -  <unsigned_int name="nextObjectID">202</unsigned_int> -</object> diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib new file mode 100644 index 0000000000..b02d04e0d2 --- /dev/null +++ b/indra/newview/SecondLife.xib @@ -0,0 +1,973 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> +	<data> +		<int key="IBDocument.SystemTarget">1060</int> +		<string key="IBDocument.SystemVersion">12C60</string> +		<string key="IBDocument.InterfaceBuilderVersion">2844</string> +		<string key="IBDocument.AppKitVersion">1187.34</string> +		<string key="IBDocument.HIToolboxVersion">625.00</string> +		<object class="NSMutableDictionary" key="IBDocument.PluginVersions"> +			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> +			<string key="NS.object.0">2844</string> +		</object> +		<array key="IBDocument.IntegratedClassDependencies"> +			<string>NSCustomObject</string> +			<string>NSMenu</string> +			<string>NSMenuItem</string> +			<string>NSView</string> +			<string>NSWindowTemplate</string> +		</array> +		<array key="IBDocument.PluginDependencies"> +			<string>com.apple.InterfaceBuilder.CocoaPlugin</string> +		</array> +		<object class="NSMutableDictionary" key="IBDocument.Metadata"> +			<string key="NS.key.0">PluginDependencyRecalculationVersion</string> +			<integer value="1" key="NS.object.0"/> +		</object> +		<array class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> +			<object class="NSCustomObject" id="1021"> +				<string key="NSClassName">NSApplication</string> +			</object> +			<object class="NSCustomObject" id="1014"> +				<string key="NSClassName">FirstResponder</string> +			</object> +			<object class="NSCustomObject" id="1050"> +				<string key="NSClassName">NSApplication</string> +			</object> +			<object class="NSMenu" id="649796088"> +				<string key="NSTitle">Main Menu</string> +				<array class="NSMutableArray" key="NSMenuItems"> +					<object class="NSMenuItem" id="694149608"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Second Life</string> +						<string key="NSKeyEquiv"/> +						<int key="NSMnemonicLoc">2147483647</int> +						<object class="NSCustomResource" key="NSOnImage" id="353210768"> +							<string key="NSClassName">NSImage</string> +							<string key="NSResourceName">NSMenuCheckmark</string> +						</object> +						<object class="NSCustomResource" key="NSMixedImage" id="549394948"> +							<string key="NSClassName">NSImage</string> +							<string key="NSResourceName">NSMenuMixedState</string> +						</object> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="110575045"> +							<string key="NSTitle">Second Life</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="238522557"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">About Second Life</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="304266470"> +									<reference key="NSMenu" ref="110575045"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="609285721"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Preferences…</string> +									<string key="NSKeyEquiv">,</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="481834944"> +									<reference key="NSMenu" ref="110575045"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="1046388886"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Services</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="752062318"> +										<string key="NSTitle">Services</string> +										<array class="NSMutableArray" key="NSMenuItems"/> +										<string key="NSName">_NSServicesMenu</string> +									</object> +								</object> +								<object class="NSMenuItem" id="646227648"> +									<reference key="NSMenu" ref="110575045"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="755159360"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Hide NewApplication</string> +									<string key="NSKeyEquiv">h</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="342932134"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Hide Others</string> +									<string key="NSKeyEquiv">h</string> +									<int key="NSKeyEquivModMask">1572864</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="908899353"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Show All</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="1056857174"> +									<reference key="NSMenu" ref="110575045"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="632727374"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Quit NewApplication</string> +									<string key="NSKeyEquiv">q</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +							</array> +							<string key="NSName">_NSAppleMenu</string> +						</object> +					</object> +					<object class="NSMenuItem" id="379814623"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">File</string> +						<string key="NSKeyEquiv"/> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="353210768"/> +						<reference key="NSMixedImage" ref="549394948"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="720053764"> +							<string key="NSTitle">File</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="705341025"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">New</string> +									<string key="NSKeyEquiv">n</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="722745758"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Open…</string> +									<string key="NSKeyEquiv">o</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="425164168"> +									<reference key="NSMenu" ref="720053764"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="776162233"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Close</string> +									<string key="NSKeyEquiv">w</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +							</array> +						</object> +					</object> +					<object class="NSMenuItem" id="725688984"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Edit</string> +						<string key="NSKeyEquiv"/> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="353210768"/> +						<reference key="NSMixedImage" ref="549394948"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="701759256"> +							<string key="NSTitle">Edit</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="521487141"> +									<reference key="NSMenu" ref="701759256"/> +									<string key="NSTitle">Undo</string> +									<string key="NSKeyEquiv">z</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="668936019"> +									<reference key="NSMenu" ref="701759256"/> +									<string key="NSTitle">Redo</string> +									<string key="NSKeyEquiv">Z</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="383018193"> +									<reference key="NSMenu" ref="701759256"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="984623395"> +									<reference key="NSMenu" ref="701759256"/> +									<string key="NSTitle">Cut</string> +									<string key="NSKeyEquiv">x</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="656529582"> +									<reference key="NSMenu" ref="701759256"/> +									<string key="NSTitle">Copy</string> +									<string key="NSKeyEquiv">c</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="1032676691"> +									<reference key="NSMenu" ref="701759256"/> +									<string key="NSTitle">Paste</string> +									<string key="NSKeyEquiv">v</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="538907583"> +									<reference key="NSMenu" ref="701759256"/> +									<string key="NSTitle">Select All</string> +									<string key="NSKeyEquiv">a</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +							</array> +						</object> +					</object> +					<object class="NSMenuItem" id="713487014"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Window</string> +						<string key="NSKeyEquiv"/> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="353210768"/> +						<reference key="NSMixedImage" ref="549394948"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="835318025"> +							<string key="NSTitle">Window</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="1011231497"> +									<reference key="NSMenu" ref="835318025"/> +									<string key="NSTitle">Minimize</string> +									<string key="NSKeyEquiv">m</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="575023229"> +									<reference key="NSMenu" ref="835318025"/> +									<string key="NSTitle">Zoom</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="86356408"> +									<reference key="NSMenu" ref="835318025"/> +									<string key="NSTitle">Enter Full Screen</string> +									<string key="NSKeyEquiv">f</string> +									<int key="NSKeyEquivModMask">1310720</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="299356726"> +									<reference key="NSMenu" ref="835318025"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +								<object class="NSMenuItem" id="625202149"> +									<reference key="NSMenu" ref="835318025"/> +									<string key="NSTitle">Bring All to Front</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +							</array> +							<string key="NSName">_NSWindowsMenu</string> +						</object> +					</object> +					<object class="NSMenuItem" id="391199113"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Help</string> +						<string key="NSKeyEquiv"/> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="353210768"/> +						<reference key="NSMixedImage" ref="549394948"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="374024848"> +							<string key="NSTitle">Help</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="238773614"> +									<reference key="NSMenu" ref="374024848"/> +									<string key="NSTitle">NewApplication Help</string> +									<string key="NSKeyEquiv">?</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="353210768"/> +									<reference key="NSMixedImage" ref="549394948"/> +								</object> +							</array> +							<string key="NSName">_NSHelpMenu</string> +						</object> +					</object> +				</array> +				<string key="NSName">_NSMainMenu</string> +			</object> +			<object class="NSCustomObject" id="756173070"> +				<string key="NSClassName">LLAppDelegate</string> +			</object> +			<object class="NSWindowTemplate" id="110292814"> +				<int key="NSWindowStyleMask">15</int> +				<int key="NSWindowBacking">2</int> +				<string key="NSWindowRect">{{196, 240}, {1024, 768}}</string> +				<int key="NSWTFlags">74974208</int> +				<string key="NSWindowTitle">Second Life</string> +				<string key="NSWindowClass">LLNSWindow</string> +				<nil key="NSViewClass"/> +				<nil key="NSUserInterfaceItemIdentifier"/> +				<string key="NSWindowContentMinSize">{1024, 768}</string> +				<object class="NSView" key="NSWindowView" id="305280978"> +					<reference key="NSNextResponder"/> +					<int key="NSvFlags">256</int> +					<array class="NSMutableArray" key="NSSubviews"/> +					<string key="NSFrameSize">{1024, 768}</string> +					<reference key="NSSuperview"/> +					<reference key="NSWindow"/> +					<reference key="NSNextKeyView"/> +					<string key="NSReuseIdentifierKey">_NS:20</string> +				</object> +				<string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string> +				<string key="NSMinSize">{1024, 790}</string> +				<string key="NSMaxSize">{10000000000000, 10000000000000}</string> +				<string key="NSFrameAutosaveName">Second Life</string> +				<int key="NSWindowCollectionBehavior">128</int> +				<bool key="NSWindowIsRestorable">YES</bool> +			</object> +		</array> +		<object class="IBObjectContainer" key="IBDocument.Objects"> +			<array class="NSMutableArray" key="connectionRecords"> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">terminate:</string> +						<reference key="source" ref="1050"/> +						<reference key="destination" ref="632727374"/> +					</object> +					<int key="connectionID">823</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">orderFrontStandardAboutPanel:</string> +						<reference key="source" ref="1021"/> +						<reference key="destination" ref="238522557"/> +					</object> +					<int key="connectionID">142</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBOutletConnection" key="connection"> +						<string key="label">delegate</string> +						<reference key="source" ref="1021"/> +						<reference key="destination" ref="756173070"/> +					</object> +					<int key="connectionID">845</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performMiniaturize:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1011231497"/> +					</object> +					<int key="connectionID">37</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">arrangeInFront:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="625202149"/> +					</object> +					<int key="connectionID">39</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performClose:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="776162233"/> +					</object> +					<int key="connectionID">193</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performZoom:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="575023229"/> +					</object> +					<int key="connectionID">240</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">showHelp:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="238773614"/> +					</object> +					<int key="connectionID">360</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">hide:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="755159360"/> +					</object> +					<int key="connectionID">369</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">hideOtherApplications:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="342932134"/> +					</object> +					<int key="connectionID">370</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">unhideAllApplications:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="908899353"/> +					</object> +					<int key="connectionID">372</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">cut:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="984623395"/> +					</object> +					<int key="connectionID">768</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">paste:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1032676691"/> +					</object> +					<int key="connectionID">769</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">undo:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="521487141"/> +					</object> +					<int key="connectionID">776</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">copy:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="656529582"/> +					</object> +					<int key="connectionID">782</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">selectAll:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="538907583"/> +					</object> +					<int key="connectionID">785</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleFullScreen:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="86356408"/> +					</object> +					<int key="connectionID">842</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBOutletConnection" key="connection"> +						<string key="label">window</string> +						<reference key="source" ref="756173070"/> +						<reference key="destination" ref="110292814"/> +					</object> +					<int key="connectionID">850</int> +				</object> +			</array> +			<object class="IBMutableOrderedSet" key="objectRecords"> +				<array key="orderedObjects"> +					<object class="IBObjectRecord"> +						<int key="objectID">0</int> +						<array key="object" id="0"/> +						<reference key="children" ref="1048"/> +						<nil key="parent"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">-2</int> +						<reference key="object" ref="1021"/> +						<reference key="parent" ref="0"/> +						<string key="objectName">File's Owner</string> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">-1</int> +						<reference key="object" ref="1014"/> +						<reference key="parent" ref="0"/> +						<string key="objectName">First Responder</string> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">-3</int> +						<reference key="object" ref="1050"/> +						<reference key="parent" ref="0"/> +						<string key="objectName">Application</string> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">29</int> +						<reference key="object" ref="649796088"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="713487014"/> +							<reference ref="694149608"/> +							<reference ref="391199113"/> +							<reference ref="379814623"/> +							<reference ref="725688984"/> +						</array> +						<reference key="parent" ref="0"/> +						<string key="objectName">Main Menu</string> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">19</int> +						<reference key="object" ref="713487014"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="835318025"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">56</int> +						<reference key="object" ref="694149608"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="110575045"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">103</int> +						<reference key="object" ref="391199113"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="374024848"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">83</int> +						<reference key="object" ref="379814623"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="720053764"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">81</int> +						<reference key="object" ref="720053764"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="722745758"/> +							<reference ref="705341025"/> +							<reference ref="776162233"/> +							<reference ref="425164168"/> +						</array> +						<reference key="parent" ref="379814623"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">73</int> +						<reference key="object" ref="776162233"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">106</int> +						<reference key="object" ref="374024848"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="238773614"/> +						</array> +						<reference key="parent" ref="391199113"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">111</int> +						<reference key="object" ref="238773614"/> +						<reference key="parent" ref="374024848"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">57</int> +						<reference key="object" ref="110575045"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="238522557"/> +							<reference ref="755159360"/> +							<reference ref="908899353"/> +							<reference ref="632727374"/> +							<reference ref="646227648"/> +							<reference ref="609285721"/> +							<reference ref="481834944"/> +							<reference ref="304266470"/> +							<reference ref="1046388886"/> +							<reference ref="1056857174"/> +							<reference ref="342932134"/> +						</array> +						<reference key="parent" ref="694149608"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">58</int> +						<reference key="object" ref="238522557"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">134</int> +						<reference key="object" ref="755159360"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">150</int> +						<reference key="object" ref="908899353"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">136</int> +						<reference key="object" ref="632727374"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">144</int> +						<reference key="object" ref="646227648"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">129</int> +						<reference key="object" ref="609285721"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">143</int> +						<reference key="object" ref="481834944"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">236</int> +						<reference key="object" ref="304266470"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">131</int> +						<reference key="object" ref="1046388886"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="752062318"/> +						</array> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">149</int> +						<reference key="object" ref="1056857174"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">145</int> +						<reference key="object" ref="342932134"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">130</int> +						<reference key="object" ref="752062318"/> +						<reference key="parent" ref="1046388886"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">24</int> +						<reference key="object" ref="835318025"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="299356726"/> +							<reference ref="625202149"/> +							<reference ref="575023229"/> +							<reference ref="1011231497"/> +							<reference ref="86356408"/> +						</array> +						<reference key="parent" ref="713487014"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">92</int> +						<reference key="object" ref="299356726"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">5</int> +						<reference key="object" ref="625202149"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">239</int> +						<reference key="object" ref="575023229"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">23</int> +						<reference key="object" ref="1011231497"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">711</int> +						<reference key="object" ref="725688984"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="701759256"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">712</int> +						<reference key="object" ref="701759256"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="521487141"/> +							<reference ref="668936019"/> +							<reference ref="383018193"/> +							<reference ref="984623395"/> +							<reference ref="656529582"/> +							<reference ref="1032676691"/> +							<reference ref="538907583"/> +						</array> +						<reference key="parent" ref="725688984"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">716</int> +						<reference key="object" ref="984623395"/> +						<reference key="parent" ref="701759256"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">717</int> +						<reference key="object" ref="656529582"/> +						<reference key="parent" ref="701759256"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">718</int> +						<reference key="object" ref="1032676691"/> +						<reference key="parent" ref="701759256"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">721</int> +						<reference key="object" ref="538907583"/> +						<reference key="parent" ref="701759256"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">824</int> +						<reference key="object" ref="756173070"/> +						<reference key="parent" ref="0"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">841</int> +						<reference key="object" ref="86356408"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">828</int> +						<reference key="object" ref="110292814"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="305280978"/> +						</array> +						<reference key="parent" ref="0"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">829</int> +						<reference key="object" ref="305280978"/> +						<array class="NSMutableArray" key="children"/> +						<reference key="parent" ref="110292814"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">713</int> +						<reference key="object" ref="521487141"/> +						<reference key="parent" ref="701759256"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">714</int> +						<reference key="object" ref="668936019"/> +						<reference key="parent" ref="701759256"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">715</int> +						<reference key="object" ref="383018193"/> +						<reference key="parent" ref="701759256"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">82</int> +						<reference key="object" ref="705341025"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">79</int> +						<reference key="object" ref="425164168"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">72</int> +						<reference key="object" ref="722745758"/> +						<reference key="parent" ref="720053764"/> +					</object> +				</array> +			</object> +			<dictionary class="NSMutableDictionary" key="flattenedProperties"> +				<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="103.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="106.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="111.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="236.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="239.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="711.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="712.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="713.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="714.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="715.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="716.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="717.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="718.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="72.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="721.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="73.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="79.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="81.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="82.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="824.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<boolean value="YES" key="828.IBNSWindowAutoPositionCentersHorizontal"/> +				<boolean value="YES" key="828.IBNSWindowAutoPositionCentersVertical"/> +				<string key="828.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<boolean value="YES" key="828.NSWindowTemplate.visibleAtLaunch"/> +				<string key="829.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="83.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="841.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +			</dictionary> +			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> +			<nil key="activeLocalization"/> +			<dictionary class="NSMutableDictionary" key="localizations"/> +			<nil key="sourceID"/> +			<int key="maxID">864</int> +		</object> +		<object class="IBClassDescriber" key="IBDocument.Classes"> +			<array class="NSMutableArray" key="referencedPartialClassDescriptions"> +				<object class="IBPartialClassDescription"> +					<string key="className">LLAppDelegate</string> +					<string key="superclassName">NSObject</string> +					<object class="NSMutableDictionary" key="outlets"> +						<string key="NS.key.0">window</string> +						<string key="NS.object.0">LLNSWindow</string> +					</object> +					<object class="NSMutableDictionary" key="toOneOutletInfosByName"> +						<string key="NS.key.0">window</string> +						<object class="IBToOneOutletInfo" key="NS.object.0"> +							<string key="name">window</string> +							<string key="candidateClassName">LLNSWindow</string> +						</object> +					</object> +					<object class="IBClassDescriptionSource" key="sourceIdentifier"> +						<string key="majorKey">IBProjectSource</string> +						<string key="minorKey">./Classes/LLAppDelegate.h</string> +					</object> +				</object> +				<object class="IBPartialClassDescription"> +					<string key="className">LLNSWindow</string> +					<string key="superclassName">NSWindow</string> +					<object class="IBClassDescriptionSource" key="sourceIdentifier"> +						<string key="majorKey">IBProjectSource</string> +						<string key="minorKey">./Classes/LLNSWindow.h</string> +					</object> +				</object> +			</array> +		</object> +		<int key="IBDocument.localizationMode">0</int> +		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> +		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> +			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> +			<real value="1060" key="NS.object.0"/> +		</object> +		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> +		<int key="IBDocument.defaultPropertyAccessControl">3</int> +		<dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> +			<string key="NSMenuCheckmark">{11, 11}</string> +			<string key="NSMenuMixedState">{10, 3}</string> +		</dictionary> +		<bool key="IBDocument.UseAutolayout">YES</bool> +	</data> +</archive> diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm new file mode 100644 index 0000000000..9e0e0e35c5 --- /dev/null +++ b/indra/newview/llappdelegate-objc.mm @@ -0,0 +1,65 @@ +// +//  LLAppDelegate.m +//  SecondLife +// +//  Created by Geenz on 12/16/12. +// +// + +#import "llappdelegate-objc.h" + +@implementation LLAppDelegate + +@synthesize window; + +- (void)dealloc +{ +    [super dealloc]; +} + +- (void) applicationDidFinishLaunching:(NSNotification *)notification +{ +	frameTimer = nil; +	 +	if (initViewer()) +	{ +		frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(mainLoop) userInfo:nil repeats:YES]; +	} else { +		handleQuit(); +	} +} + +- (void) applicationDidBecomeActive:(NSNotification *)notification +{ +	callWindowFocus(); +} + +- (void) applicationDidResignActive:(NSNotification *)notification +{ +	callWindowUnfocus(); +} + +- (NSApplicationDelegateReply) applicationShouldTerminate:(NSApplication *)sender +{ +	if (!runMainLoop()) +	{ +		handleQuit(); +		return NSTerminateCancel; +	} else { +		[frameTimer release]; +		cleanupViewer(); +		return NSTerminateNow; +	} +} + +- (void) mainLoop +{ +	bool appExiting = runMainLoop(); +	if (appExiting) +	{ +		[frameTimer release]; +		[[NSApplication sharedApplication] terminate:self]; +	} +} + +@end diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 30f82926f1..131f4c4031 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -250,10 +250,6 @@ static LLAppViewerListener sAppViewerListener(LLAppViewer::instance);  //----------------------------------------------------------------------------  // viewer.cpp - these are only used in viewer, should be easily moved. -#if LL_DARWIN -extern void init_apple_menu(const char* product); -#endif // LL_DARWIN -  extern BOOL gRandomizeFramerate;  extern BOOL gPeriodicSlowFrame;  extern BOOL gDebugGL; @@ -680,6 +676,11 @@ bool LLAppViewer::init()  	// we run the "program crashed last time" error handler below.  	//  	LLFastTimer::reset(); +	 +	 +#ifdef LL_DARWIN +	mMainLoopInitialized = false; +#endif  	// initialize SSE options  	LLVector4a::initClass(); @@ -1196,43 +1197,61 @@ static LLFastTimer::DeclareTimer FTM_SERVICE_CALLBACK("Callback");  static LLFastTimer::DeclareTimer FTM_AGENT_AUTOPILOT("Autopilot");  static LLFastTimer::DeclareTimer FTM_AGENT_UPDATE("Update"); +LLMemType mt1(LLMemType::MTYPE_MAIN); +  bool LLAppViewer::mainLoop()  { -	LLMemType mt1(LLMemType::MTYPE_MAIN); -	mMainloopTimeout = new LLWatchdogTimeout(); +#ifdef LL_DARWIN +	if (!mMainLoopInitialized) +#endif +	{ +		mMainloopTimeout = new LLWatchdogTimeout(); +		 +		//------------------------------------------- +		// Run main loop until time to quit +		//------------------------------------------- +		 +		// Create IO Pump to use for HTTP Requests. +		gServicePump = new LLPumpIO(gAPRPoolp); +		LLHTTPClient::setPump(*gServicePump); +		LLCurl::setCAFile(gDirUtilp->getCAFile()); +		 +		// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated. +		 +		LLVoiceChannel::initClass(); +		LLVoiceClient::getInstance()->init(gServicePump); +		LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true); +		 +		joystick = LLViewerJoystick::getInstance(); +		joystick->setNeedsReset(true); +		 +#ifdef LL_DARWIN +		// Ensure that this section of code never gets called again on OS X. +		mMainLoopInitialized = true; +#endif +	} +	// As we do not (yet) send data on the mainloop LLEventPump that varies +	// with each frame, no need to instantiate a new LLSD event object each +	// time. Obviously, if that changes, just instantiate the LLSD at the +	// point of posting. +	 +	LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop")); +	 +    LLSD newFrame; -	//------------------------------------------- -	// Run main loop until time to quit -	//------------------------------------------- - -	// Create IO Pump to use for HTTP Requests. -	gServicePump = new LLPumpIO(gAPRPoolp); -	LLHTTPClient::setPump(*gServicePump); -	LLCurl::setCAFile(gDirUtilp->getCAFile()); - -	// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated. - -	LLVoiceChannel::initClass(); -	LLVoiceClient::getInstance()->init(gServicePump); -	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);  	LLTimer frameTimer,idleTimer;  	LLTimer debugTime; -	LLViewerJoystick* joystick(LLViewerJoystick::getInstance()); -	joystick->setNeedsReset(true); - -    LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop")); -    // As we do not (yet) send data on the mainloop LLEventPump that varies -    // with each frame, no need to instantiate a new LLSD event object each -    // time. Obviously, if that changes, just instantiate the LLSD at the -    // point of posting. -    LLSD newFrame; - +	  	//LLPrivateMemoryPoolTester::getInstance()->run(false) ;  	//LLPrivateMemoryPoolTester::getInstance()->run(true) ;  	//LLPrivateMemoryPoolTester::destroy() ;  	// Handle messages +#ifdef LL_DARWIN +	if (!LLApp::isExiting()) +#else  	while (!LLApp::isExiting()) +#endif  	{  		LLFastTimer::nextFrame(); // Should be outside of any timer instances @@ -1510,34 +1529,37 @@ bool LLAppViewer::mainLoop()  		}  	} -	// Save snapshot for next time, if we made it through initialization -	if (STATE_STARTED == LLStartUp::getStartupState()) +	if (LLApp::isExiting())  	{ -		try +		// Save snapshot for next time, if we made it through initialization +		if (STATE_STARTED == LLStartUp::getStartupState())  		{ -			saveFinalSnapshot(); -		} -		catch(std::bad_alloc) -		{ -			llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ; - -			//stop memory leaking simulation -			LLFloaterMemLeak* mem_leak_instance = -				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); -			if(mem_leak_instance) +			try  			{ -				mem_leak_instance->stop() ;				 -			}	 +				saveFinalSnapshot(); +			} +			catch(std::bad_alloc) +			{ +				llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ; +				 +				//stop memory leaking simulation +				LLFloaterMemLeak* mem_leak_instance = +				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); +				if(mem_leak_instance) +				{ +					mem_leak_instance->stop() ; +				} +			}  		} +		 +		delete gServicePump; +		 +		destroyMainloopTimeout(); +		 +		llinfos << "Exiting main_loop" << llendflush;  	} -	 -	delete gServicePump; -	destroyMainloopTimeout(); - -	llinfos << "Exiting main_loop" << llendflush; - -	return true; +	return LLApp::isExiting();  }  void LLAppViewer::flushVFSIO() @@ -2618,8 +2640,6 @@ bool LLAppViewer::initConfiguration()  	//}  #if LL_DARWIN -	// Initialize apple menubar and various callbacks -	init_apple_menu(LLTrans::getString("APP_NAME").c_str());  #if __ppc__  	// If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further. diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 7a474f9122..a09bdb2496 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -41,6 +41,7 @@ class LLImageDecodeThread;  class LLTextureFetch;  class LLWatchdogTimeout;  class LLUpdaterService; +class LLViewerJoystick;  class LLAppViewer : public LLApp  { @@ -250,6 +251,8 @@ private:  	std::string mSerialNumber;  	bool mPurgeCache;      bool mPurgeOnExit; +	bool mMainLoopInitialized; +	LLViewerJoystick* joystick;  	bool mSavedFinalSnapshot;  	bool mSavePerAccountSettings;		// only save per account settings if login succeeded diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index c2916717bd..6e0becb518 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -31,6 +31,7 @@  #endif  #include "llappviewermacosx.h" +#include "llwindowmacosx-objc.h"  #include "llcommandlineparser.h"  #include "llmemtype.h" @@ -40,7 +41,7 @@  #include "llmd5.h"  #include "llfloaterworldmap.h"  #include "llurldispatcher.h" -#include <Carbon/Carbon.h> +#include <ApplicationServices/ApplicationServices.h>  #include "lldir.h"  #include <signal.h>  #include <CoreAudio/CoreAudio.h>	// for systemwide mute @@ -53,67 +54,71 @@ namespace  	int gArgC;  	char** gArgV; -	bool sCrashReporterIsRunning = false; -	 -	OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) -	{ -		OSErr result = noErr; -		 -		LLAppViewer::instance()->userQuit(); -		 -		return(result); -	} +	LLAppViewerMacOSX* gViewerAppPtr;  } -int main( int argc, char **argv )  +bool initViewer()  {  	LLMemType mt1(LLMemType::MTYPE_STARTUP); - -#if LL_SOLARIS && defined(__sparc) -	asm ("ta\t6");		 // NOTE:  Make sure memory alignment is enforced on SPARC -#endif - +	  	// Set the working dir to <bundle>/Contents/Resources  	if (chdir(gDirUtilp->getAppRODataDir().c_str()) == -1)  	{  		llwarns << "Could not change directory to " -				<< gDirUtilp->getAppRODataDir() << ": " << strerror(errno) -				<< llendl; +		<< gDirUtilp->getAppRODataDir() << ": " << strerror(errno) +		<< llendl;  	} - -	LLAppViewerMacOSX* viewer_app_ptr = new LLAppViewerMacOSX(); - -	viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); - -	// Store off the command line args for use later. -	gArgC = argc; -	gArgV = argv; -	bool ok = viewer_app_ptr->init(); +	gViewerAppPtr = new LLAppViewerMacOSX(); +	 +	gViewerAppPtr->setErrorHandler(LLAppViewer::handleViewerCrash); +	 +	 +	 +	bool ok = gViewerAppPtr->init();  	if(!ok)  	{  		llwarns << "Application init failed." << llendl; -		return -1;  	} +	 +	return ok; +} + +void handleQuit() +{ +	LLAppViewer::instance()->userQuit(); +} -		// Run the application main loop -	if(!LLApp::isQuitting())  +bool runMainLoop() +{ +	bool ret = LLApp::isQuitting(); +	if (!ret && gViewerAppPtr != NULL)  	{ -		viewer_app_ptr->mainLoop(); +		ret = gViewerAppPtr->mainLoop(); +	} else { +		ret = true;  	} +	 +	return ret; +} -	if (!LLApp::isError()) +void cleanupViewer() +{ +	if(!LLApp::isError())  	{ -		// -		// We don't want to do cleanup here if the error handler got called - -		// the assumption is that the error handler is responsible for doing -		// app cleanup if there was a problem. -		// -		viewer_app_ptr->cleanup(); +		gViewerAppPtr->cleanup();  	} -	delete viewer_app_ptr; -	viewer_app_ptr = NULL; -	return 0; +	 +	delete gViewerAppPtr; +	gViewerAppPtr = NULL; +} + +int main( int argc, char **argv )  +{ +	// Store off the command line args for use later. +	gArgC = argc; +	gArgV = argv; +	return createNSApp(argc, (const char**)argv);  }  LLAppViewerMacOSX::LLAppViewerMacOSX() @@ -258,33 +263,6 @@ bool LLAppViewerMacOSX::restoreErrorTrap()  	return reset_count == 0;  } -static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,  -								   EventRef inEvent,  -								   void* inUserData) -{ -    ProcessSerialNumber psn; -	 -    GetEventParameter(inEvent,  -					  kEventParamProcessID,  -					  typeProcessSerialNumber,  -					  NULL,  -					  sizeof(psn),  -					  NULL,  -					  &psn); -	 -    if( GetEventKind(inEvent) == kEventAppTerminated )  -	{ -		Boolean matching_psn = FALSE;	 -		OSErr os_result = SameProcess(&psn, (ProcessSerialNumber*)inUserData, &matching_psn); -		if(os_result >= 0 && matching_psn) -		{ -			sCrashReporterIsRunning = false; -			QuitApplicationEventLoop(); -		} -    } -    return noErr; -} -  void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)  {  	// This used to use fork&exec, but is switched to LSOpenApplication to  @@ -306,72 +284,6 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)  	 	appParams.version = 0;  		appParams.flags = kLSLaunchNoParams | kLSLaunchStartClassic;  		appParams.application = &appRef; -		 -		if(reportFreeze) -		{ -			// Make sure freeze reporting launches the crash logger synchronously, lest  -			// Log files get changed by SL while the logger is running. -		 -			// *NOTE:Mani A better way - make a copy of the data that the crash reporter will send -			// and let SL go about its business. This way makes the mac work like windows and linux -			// and is the smallest patch for the issue.  -			sCrashReporterIsRunning = false; -			ProcessSerialNumber o_psn; - -			static EventHandlerRef sCarbonEventsRef = NULL; -			static const EventTypeSpec kEvents[] =  -			{ -				{ kEventClassApplication, kEventAppTerminated } -			}; -			 -			// Install the handler to detect crash logger termination -			InstallEventHandler(GetApplicationEventTarget(),  -								(EventHandlerUPP) CarbonEventHandler, -								GetEventTypeCount(kEvents), -								kEvents, -								&o_psn, -								&sCarbonEventsRef -								); -			 -			// Remove, temporarily the quit handler - which has *crash* behavior before  -			// the mainloop gets running! -			AERemoveEventHandler(kCoreEventClass,  -								 kAEQuitApplication,  -								 NewAEEventHandlerUPP(AEQuitHandler), -								 false); - -			// Launch the crash reporter. -			os_result = LSOpenApplication(&appParams, &o_psn); -			 -			if(os_result >= 0) -			{	 -				sCrashReporterIsRunning = true; -			} - -			while(sCrashReporterIsRunning) -			{ -				RunApplicationEventLoop(); -			} - -			// Re-install the apps quit handler. -			AEInstallEventHandler(kCoreEventClass,  -								  kAEQuitApplication,  -								  NewAEEventHandlerUPP(AEQuitHandler), -								  0,  -								  false); -			 -			// Remove the crash reporter quit handler. -			RemoveEventHandler(sCarbonEventsRef); -		} -		else -		{ -			appParams.flags |= kLSLaunchAsync; -			clear_signals(); - -			ProcessSerialNumber o_psn; -			os_result = LSOpenApplication(&appParams, &o_psn); -		} -		  	}  } @@ -505,73 +417,3 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)  	return(result);  } - -OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata) -{ -	OSStatus result = eventNotHandledErr; -	OSStatus err; -	UInt32 evtClass = GetEventClass(event); -	UInt32 evtKind = GetEventKind(event); -	WindowRef window = (WindowRef)userdata; -	 -	if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess)) -	{ -		HICommand cmd; -		err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd); -		 -		if(err == noErr) -		{ -			switch(cmd.commandID) -			{ -				case kHICommandOK: -					QuitAppModalLoopForWindow(window); -					result = noErr; -				break; -				 -				case kHICommandCancel: -					QuitAppModalLoopForWindow(window); -					result = userCanceledErr; -				break; -			} -		} -	} -	 -	return(result); -} - -void init_apple_menu(const char* product) -{ -	// Load up a proper menu bar. -	{ -		OSStatus err; -		IBNibRef nib = NULL; -		// NOTE: DO NOT translate or brand this string.  It's an internal name in the .nib file, and MUST match exactly. -		err = CreateNibReference(CFSTR("SecondLife"), &nib); -		 -		if(err == noErr) -		{ -			// NOTE: DO NOT translate or brand this string.  It's an internal name in the .nib file, and MUST match exactly. -			SetMenuBarFromNib(nib, CFSTR("MenuBar")); -		} - -		if(nib != NULL) -		{ -			DisposeNibReference(nib); -		} -	} -	 -	// Install a handler for 'gurl' AppleEvents.  This is how secondlife:// URLs get passed to the viewer. -	 -	if(AEInstallEventHandler('GURL', 'GURL', NewAEEventHandlerUPP(AEGURLHandler),0, false) != noErr) -	{ -		// Couldn't install AppleEvent handler.  This error shouldn't be fatal. -		llinfos << "Couldn't install 'GURL' AppleEvent handler.  Continuing..." << llendl; -	} - -	// Install a handler for 'quit' AppleEvents.  This makes quitting the application from the dock work. -	if(AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(AEQuitHandler),0, false) != noErr) -	{ -		// Couldn't install AppleEvent handler.  This error shouldn't be fatal. -		llinfos << "Couldn't install Quit AppleEvent handler.  Continuing..." << llendl; -	} -} diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 1aa9fd8a45..92d8f2937e 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -653,6 +653,7 @@ BOOL LLViewerKeyboard::modeFromString(const std::string& string, S32 *mode)  BOOL LLViewerKeyboard::handleKey(KEY translated_key,  MASK translated_mask, BOOL repeated)  { +	LL_INFOS("Keyboard Handling") << "Handling key " << translated_key << LL_ENDL;  	// check for re-map  	EKeyboardMode mode = gViewerKeyboard.getMode();  	U32 keyidx = (translated_mask<<16) | translated_key; @@ -675,6 +676,7 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key,  MASK translated_mask, BOOL  	if(mKeysSkippedByUI.find(translated_key) != mKeysSkippedByUI.end())   	{  		mKeyHandledByUI[translated_key] = FALSE; +		LL_INFOS("Keyboard Handling") << "Key wasn't handled by UI!" << LL_ENDL;  	}  	else  	{ diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 1def2db829..7c0d49d1e2 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2428,6 +2428,7 @@ void LLViewerWindow::draw()  // Takes a single keydown event, usually when UI is visible  BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  { +	LL_INFOS("Keyboard Handling") << "Handling key " << key << LL_ENDL;  	// hide tooltips on keypress  	LLToolTipMgr::instance().blockToolTips(); diff --git a/indra/newview/macutil_Prefix.h b/indra/newview/macutil_Prefix.h index b54a764a62..b8df961cac 100644 --- a/indra/newview/macutil_Prefix.h +++ b/indra/newview/macutil_Prefix.h @@ -32,7 +32,6 @@   *   */ -#include <Carbon/Carbon.h>  #include "fix_macros.h"  #undef verify | 
