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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m
index 6899885..2578d9f 100644
--- a/src/video/cocoa/SDL_cocoawindow.m
+++ b/src/video/cocoa/SDL_cocoawindow.m
@@ -88,6 +88,31 @@ GetWindowStyle(SDL_Window * window)
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 @@ GetWindowStyle(SDL_Window * window)
- (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 @@ GetWindowStyle(SDL_Window * window)
- (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
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. */
}