From 4295a92f97ffaa03ee8f3b68bd0a66e06fb2ef80 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 14 Nov 2013 22:26:49 -0800 Subject: [PATCH] Fixed bug 2240 - On OS/X after calling SDL_SetWindowBordered right mouse clicks no longer register philhassey On OS/X after calling SDL_SetWindowBordered right mouse clicks no longer register. Steps to Reproduce: 1. Open a windowed window on OS/X. (With the border on.) 2. e.button.button will give values 1,2,3 depending on which mouse button I click. 3. Call SDL_SetWindowBordered to disable the border. 4. e.button.button will only give values 1,2. 3 (right mouse button) stops coming through. Expected result: I expect all mouse buttons to register. --- src/video/cocoa/SDL_cocoawindow.m | 35 ++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 6899885d9ed06..2578d9f3c8b01 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -88,6 +88,31 @@ static void ConvertNSRect(NSRect *r) return style; } +static SDL_bool +SetWindowStyle(SDL_Window * window, unsigned int style) +{ + SDL_WindowData *data = (SDL_WindowData *) window->driverdata; + NSWindow *nswindow = data->nswindow; + + if (![nswindow respondsToSelector: @selector(setStyleMask:)]) { + return SDL_FALSE; + } + + /* The view responder chain gets messed with during setStyleMask */ + if ([[nswindow contentView] nextResponder] == data->listener) { + [[nswindow contentView] setNextResponder:nil]; + } + + [nswindow performSelector: @selector(setStyleMask:) withObject: (id)(uintptr_t)style]; + + /* The view responder chain gets messed with during setStyleMask */ + if ([[nswindow contentView] nextResponder] != data->listener) { + [[nswindow contentView] setNextResponder:data->listener]; + } + + return SDL_TRUE; +} + @implementation Cocoa_WindowListener @@ -422,10 +447,9 @@ - (void)windowDidResignKey:(NSNotification *)aNotification - (void)windowWillEnterFullScreen:(NSNotification *)aNotification { SDL_Window *window = _data->window; - NSWindow *nswindow = _data->nswindow; window->flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; - [nswindow setStyleMask:(NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask)]; + SetWindowStyle(window, (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask)); isFullscreenSpace = YES; inFullscreenTransition = YES; @@ -454,10 +478,9 @@ - (void)windowDidEnterFullScreen:(NSNotification *)aNotification - (void)windowWillExitFullScreen:(NSNotification *)aNotification { SDL_Window *window = _data->window; - NSWindow *nswindow = _data->nswindow; window->flags &= ~SDL_WINDOW_FULLSCREEN_DESKTOP; - [nswindow setStyleMask:GetWindowStyle(window)]; + SetWindowStyle(window, GetWindowStyle(window)); isFullscreenSpace = NO; inFullscreenTransition = YES; @@ -1173,9 +1196,7 @@ - (void)resetCursorRects Cocoa_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; - if ([nswindow respondsToSelector:@selector(setStyleMask:)]) { - [nswindow setStyleMask:GetWindowStyle(window)]; + if (SetWindowStyle(window, GetWindowStyle(window))) { if (bordered) { Cocoa_SetWindowTitle(_this, window); /* this got blanked out. */ }