From d37065e4deee38e9aa8f98d77c39c5d6f0028293 Mon Sep 17 00:00:00 2001 From: Marco Antognini Date: Sat, 21 Apr 2012 19:26:26 +0200 Subject: [PATCH] Improved -setWindowPositionToX:Y: --- src/SFML/Window/OSX/SFOpenGLView.mm | 54 ++++++++++++++--------- src/SFML/Window/OSX/SFViewController.mm | 35 +-------------- src/SFML/Window/OSX/SFWindowController.mm | 3 -- 3 files changed, 35 insertions(+), 57 deletions(-) diff --git a/src/SFML/Window/OSX/SFOpenGLView.mm b/src/SFML/Window/OSX/SFOpenGLView.mm index 7f62b02e..e6f622b5 100644 --- a/src/SFML/Window/OSX/SFOpenGLView.mm +++ b/src/SFML/Window/OSX/SFOpenGLView.mm @@ -154,34 +154,46 @@ NSUInteger keepOnlyMaskFromData(NSUInteger data, NSUInteger mask); //////////////////////////////////////////////////////// -(void)setCursorPositionToX:(unsigned int)x Y:(unsigned int)y { - // Flip for SFML window coordinate system - y = NSHeight([[self window] frame]) - y; + if (m_requester == 0) return; - // Adjust for view reference instead of window - y -= NSHeight([[self window] frame]) - NSHeight([self frame]); - - // Convert to screen coordinates - NSPoint screenCoord = [[self window] convertBaseToScreen:NSMakePoint(x, y)]; - - // Flip screen coodinates - float const screenHeight = NSHeight([[[self window] screen] frame]); - screenCoord.y = screenHeight - screenCoord.y; + // Create a SFML event. + m_requester->mouseMovedAt(x, y); // Recompute the mouse pos if required. if (!NSEqualSizes(m_realSize, NSZeroSize)) { - screenCoord.x = screenCoord.x / m_realSize.width * [self frame].size.width; - screenCoord.y = screenCoord.y / m_realSize.height * [self frame].size.height; + x = x / m_realSize.width * [self frame].size.width; + y = y / m_realSize.height * [self frame].size.height; } + + // Note : we use rect here because some conversion methods are deprecated + // with point. + + // Flip SFML coordinates to match window coordinates + y = [self frame].size.height - y; + + // Get the position of (x, y) in the coordinate system of the window. + NSRect r = [self convertRect:NSMakeRect(x, y, 1, 1) toView:self]; + r = [self convertRect:r toView:nil]; // nil means window + + // Converte it to screen coordinates + r = [[self window] convertRectToScreen:r]; + + // Flip screen coodinates to match CGDisplayMoveCursorToPoint referential. + float const screenHeight = [[[self window] screen] frame].size.height; + r.origin.y = screenHeight - r.origin.y; + + + // Get the id of the screen + CGDirectDisplayID screenNumber = (CGDirectDisplayID)[[[[[self window] screen] deviceDescription] valueForKey:@"NSScreenNumber"] intValue]; // Place the cursor. - CGEventRef event = CGEventCreateMouseEvent(NULL, - kCGEventMouseMoved, - CGPointMake(screenCoord.x, - screenCoord.y), - /*we don't care about this : */0); - CGEventPost(kCGHIDEventTap, event); - CFRelease(event); - // This is a workaround to deprecated CGSetLocalEventsSuppressionInterval function + CGDisplayMoveCursorToPoint(screenNumber, CGPointMake(r.origin.x, r.origin.y)); + /* + * CGDisplayMoveCursorToPoint -- Discussion : + * + * No events are generated as a result of this move. + * Points that lie outside the desktop are clipped to the desktop. + */ } diff --git a/src/SFML/Window/OSX/SFViewController.mm b/src/SFML/Window/OSX/SFViewController.mm index 81e94152..efc3c012 100644 --- a/src/SFML/Window/OSX/SFViewController.mm +++ b/src/SFML/Window/OSX/SFViewController.mm @@ -124,36 +124,8 @@ //////////////////////////////////////////////////////// -(void)setCursorPositionToX:(unsigned int)x Y:(unsigned int)y { - // TODO remove this ? use ogl view selector instead ? - - if (m_requester == 0) return; - - // Create a SFML event. - m_requester->mouseMovedAt(x, y); - - // Flip for SFML window coordinate system - y = NSHeight([[m_view window] frame]) - y; - - // Adjust for view reference instead of window - y -= NSHeight([[m_view window] frame]) - NSHeight([m_oglView frame]); - - // Convert to screen coordinates - NSPoint screenCoord = [[m_view window] convertBaseToScreen:NSMakePoint(x, y)]; - - // Flip screen coodinates - float const screenHeight = NSHeight([[[m_view window] screen] frame]); - screenCoord.y = screenHeight - screenCoord.y; - - CGDirectDisplayID screenNumber = (CGDirectDisplayID)[[[[[m_view window] screen] deviceDescription] valueForKey:@"NSScreenNumber"] intValue]; - - // Place the cursor. - CGDisplayMoveCursorToPoint(screenNumber, CGPointMake(screenCoord.x, screenCoord.y)); - /* - CGDisplayMoveCursorToPoint -- Discussion : - - No events are generated as a result of this move. - Points that lie outside the desktop are clipped to the desktop. - */ + // Forward to... + [m_oglView setCursorPositionToX:x Y:y]; } @@ -175,7 +147,6 @@ //////////////////////////////////////////////////////////// -(NSSize)size { - // TODO scaleUnitSquareToSize: ? return [m_oglView frame].size; } @@ -183,8 +154,6 @@ //////////////////////////////////////////////////////// -(void)resizeTo:(unsigned int)width by:(unsigned int)height { - // TODO scaleUnitSquareToSize: ? - NSRect frame = NSMakeRect([m_view frame].origin.x, [m_view frame].origin.y, width, diff --git a/src/SFML/Window/OSX/SFWindowController.mm b/src/SFML/Window/OSX/SFWindowController.mm index 2bffb9a4..dc0c2fe4 100644 --- a/src/SFML/Window/OSX/SFWindowController.mm +++ b/src/SFML/Window/OSX/SFWindowController.mm @@ -317,7 +317,6 @@ //////////////////////////////////////////////////////// -(NSSize)size { - // TODO scaleUnitSquareToSize: ? return [m_oglView frame].size; } @@ -325,8 +324,6 @@ //////////////////////////////////////////////////////// -(void)resizeTo:(unsigned int)width by:(unsigned int)height { - // TODO scaleUnitSquareToSize: ? - // Add titlebar height. NSRect frame = NSMakeRect([m_window frame].origin.x, [m_window frame].origin.y,