From 9a337c778c901ed0d5c7e202c77a2b0bea9c2055 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 31 Dec 2012 10:14:38 -0800 Subject: [PATCH] Implemented SDL_HINT_ALLOW_TOPMOST for the Cocoa video driver --- src/video/SDL_sysvideo.h | 2 ++ src/video/SDL_video.c | 14 ++++++++++++++ src/video/cocoa/SDL_cocoawindow.m | 14 ++++---------- src/video/windows/SDL_windowswindow.c | 25 ++++--------------------- 4 files changed, 24 insertions(+), 31 deletions(-) diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 830426603..9ada93cc2 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -369,6 +369,8 @@ extern void SDL_OnWindowFocusLost(SDL_Window * window); extern void SDL_UpdateWindowGrab(SDL_Window * window); extern SDL_Window * SDL_GetFocusWindow(void); +extern SDL_bool SDL_ShouldAllowTopmost(); + #endif /* _SDL_sysvideo_h */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 06fbd9abc..1a094235b 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2989,4 +2989,18 @@ SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, S return SDL_ShowMessageBox(&data, NULL); } +SDL_bool +SDL_ShouldAllowTopmost() +{ + const char *hint = SDL_GetHint(SDL_HINT_ALLOW_TOPMOST); + if (hint) { + if (*hint == '0') { + return SDL_FALSE; + } else { + return SDL_TRUE; + } + } + return SDL_TRUE; +} + /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index c5b0d2acf..f391bdf35 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -915,7 +915,7 @@ - (void)rightMouseDown:(NSEvent *)theEvent } #ifdef FULLSCREEN_TOGGLEABLE - if (fullscreen) { + if (SDL_ShouldAllowTopmost() && fullscreen) { /* OpenGL is rendering to the window, so make it visible! */ [nswindow setLevel:CGShieldingWindowLevel()]; } else { @@ -997,22 +997,16 @@ - (void)rightMouseDown:(NSEvent *)theEvent CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint); } - if ( window->flags & SDL_WINDOW_FULLSCREEN ) - { + if ( window->flags & SDL_WINDOW_FULLSCREEN ) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - if (window->flags & SDL_WINDOW_INPUT_FOCUS) - { + if (SDL_ShouldAllowTopmost() && (window->flags & SDL_WINDOW_INPUT_FOCUS)) { /* OpenGL is rendering to the window, so make it visible! */ [data->nswindow setLevel:CGShieldingWindowLevel()]; - } - else - { + } else { [data->nswindow setLevel:kCGNormalWindowLevel]; } - } - } void diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 2e29061ed..b1832b2e5 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -28,7 +28,6 @@ #include "SDL_windowsvideo.h" #include "SDL_windowswindow.h" -#include "SDL_hints.h" /* Dropfile support */ #include @@ -74,22 +73,6 @@ GetWindowStyle(SDL_Window * window) return style; } -static SDL_bool -ShouldAllowTopMost() -{ - const char *hint; - - /* If the user has specified a software renderer we can't use a - texture framebuffer, or renderer creation will go recursive. - */ - hint = SDL_GetHint(SDL_HINT_ALLOW_TOPMOST); - if (hint && hint[0] == '0' ) { - return SDL_FALSE; - } - - return SDL_TRUE; -} - static int SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created) { @@ -371,7 +354,7 @@ WIN_SetWindowPositionInternal(_THIS, SDL_Window * window, UINT flags) int w, h; /* Figure out what the window area will be */ - if ( ShouldAllowTopMost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS )) { + if ( SDL_ShouldAllowTopmost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS )) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; @@ -423,7 +406,7 @@ WIN_RaiseWindow(_THIS, SDL_Window * window) HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; HWND top; - if ( ShouldAllowTopMost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS )) { + if ( SDL_ShouldAllowTopmost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS )) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; @@ -484,7 +467,7 @@ WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, int x, y; int w, h; - if ( ShouldAllowTopMost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS )) { + if ( SDL_ShouldAllowTopmost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS )) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; @@ -577,7 +560,7 @@ WIN_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; UINT flags = SWP_NOMOVE | SWP_NOSIZE; - if ( ShouldAllowTopMost() && (window->flags & SDL_WINDOW_INPUT_FOCUS ) ) { + if ( SDL_ShouldAllowTopmost() && (window->flags & SDL_WINDOW_INPUT_FOCUS ) ) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST;