diff options
author | planetmaker <planetmaker@openttd.org> | 2010-11-15 19:53:15 +0000 |
---|---|---|
committer | planetmaker <planetmaker@openttd.org> | 2010-11-15 19:53:15 +0000 |
commit | 8d42b04e3b77a1a3924504554d3a22c5d6afadaa (patch) | |
tree | 0d3bb4916072393fd0c32e3b1e0d6d6f7b107cf1 | |
parent | be0a922be57f9803ed290480a69b7831ae1dfbac (diff) | |
download | openttd-8d42b04e3b77a1a3924504554d3a22c5d6afadaa.tar.xz |
(svn r21200) -Fix: [OSX] Don't let the mouse cursor jump when switching to full screen mode
-rw-r--r-- | src/video/cocoa/fullscreen.mm | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/video/cocoa/fullscreen.mm b/src/video/cocoa/fullscreen.mm index ffdf20e8f..1a791a811 100644 --- a/src/video/cocoa/fullscreen.mm +++ b/src/video/cocoa/fullscreen.mm @@ -266,7 +266,6 @@ class FullscreenSubdriver: public CocoaSubdriver { /* Define this variables at the top (against coding style) because * otherwise GCC barfs at the goto's jumping over variable initialization. */ NSRect screen_rect; - NSPoint pt; int gamma_error; /* Destroy any previous mode */ @@ -296,6 +295,14 @@ class FullscreenSubdriver: public CocoaSubdriver { CFNumberGetValue(number, kCFNumberSInt32Type, &h); } + /* Capture the main screen */ + CGDisplayCapture(this->display_id); + + /* Store the mouse coordinates relative to the total screen */ + NSPoint mouseLocation = [ NSEvent mouseLocation ]; + mouseLocation.x /= this->display_width; + mouseLocation.y /= this->display_height; + /* Hide mouse in order to avoid glitch in 8bpp */ QZ_HideMouse(); @@ -348,12 +355,15 @@ class FullscreenSubdriver: public CocoaSubdriver { screen_rect = NSMakeRect(0, 0, this->display_width, this->display_height); [ [ NSScreen mainScreen ] setFrame:screen_rect ]; - pt = [ NSEvent mouseLocation ]; - pt.y = this->display_height - pt.y; - if (this->MouseIsInsideView(&pt)) QZ_HideMouse(); - this->UpdatePalette(0, 256); + /* Move the mouse cursor to approx the same location */ + CGPoint display_mouseLocation; + display_mouseLocation.x = mouseLocation.x * this->display_width; + display_mouseLocation.y = this->display_height - (mouseLocation.y * this->display_height); + + CGDisplayMoveCursorToPoint(this->display_id, display_mouseLocation); + return true; /* Since the blanking window covers *all* windows (even force quit) correct recovery is crucial */ @@ -381,7 +391,9 @@ ERR_NO_MATCH: /* Restore original screen resolution/bpp */ CGDisplaySwitchToMode(this->display_id, this->save_mode); + CGReleaseAllDisplays(); + ShowMenuBar(); /* Reset the main screen's rectangle @@ -399,8 +411,8 @@ ERR_NO_MATCH: if (!gamma_error) this->FadeGammaIn(&gamma_table); - this->display_width = 0; - this->display_height = 0; + this->display_width = CGDisplayPixelsWide(this->display_id); + this->display_height = CGDisplayPixelsHigh(this->display_id); } public: @@ -416,8 +428,8 @@ public: if (bpp == 8) this->palette = CGPaletteCreateDefaultColorPalette(); - this->display_width = 0; - this->display_height = 0; + this->display_width = CGDisplayPixelsWide(this->display_id); + this->display_height = CGDisplayPixelsHigh(this->display_id); this->display_depth = bpp; this->pixel_buffer = NULL; |