From 6953e493eb1a9a216797bf017f3cb0e24441b56c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 9 Jul 2001 22:36:16 +0000 Subject: [PATCH] Fixed some problems with the fullscreen code. Wooo. :) --- src/video/x11/SDL_x11modes.c | 82 +++++++++++++++++++----------------- src/video/x11/SDL_x11wm.c | 35 ++++++--------- 2 files changed, 55 insertions(+), 62 deletions(-) diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c index ea2074eb3..08e035f29 100644 --- a/src/video/x11/SDL_x11modes.c +++ b/src/video/x11/SDL_x11modes.c @@ -396,7 +396,7 @@ int X11_ResizeFullScreen(_THIS) set_best_resolution(this, current_w, current_h); move_cursor_to(this, 0, 0); get_real_resolution(this, &real_w, &real_h); - XResizeWindow(SDL_Display, FSwindow, real_w, real_h); + XMoveResizeWindow(SDL_Display, FSwindow, 0, 0, real_w, real_h); move_cursor_to(this, real_w/2, real_h/2); /* Center and reparent the drawing window */ @@ -425,58 +425,62 @@ int X11_EnterFullScreen(_THIS) Window tmpwin, *windows; int i, nwindows; #endif + int real_w, real_h; okay = 1; - if ( ! currently_fullscreen ) { - int real_w, real_h; + if ( currently_fullscreen ) { + return(okay); + } - /* Map the fullscreen window to blank the screen */ - get_real_resolution(this, &real_w, &real_h); - XResizeWindow(SDL_Display, FSwindow, real_w, real_h); - XMapRaised(SDL_Display, FSwindow); - X11_WaitMapped(this, FSwindow); + /* Ungrab the input so that we can move the mouse around */ + X11_GrabInputNoLock(this, SDL_GRAB_OFF); + + /* Map the fullscreen window to blank the screen */ + get_real_resolution(this, &real_w, &real_h); + XMoveResizeWindow(SDL_Display, FSwindow, 0, 0, real_w, real_h); + XMapRaised(SDL_Display, FSwindow); + X11_WaitMapped(this, FSwindow); #if 0 /* This seems to break WindowMaker in focus-follows-mouse mode */ - /* Make sure we got to the top of the window stack */ - if ( XQueryTree(SDL_Display, SDL_Root, &tmpwin, &tmpwin, - &windows, &nwindows) && windows ) { - /* If not, try to put us there - if fail... oh well */ - if ( windows[nwindows-1] != FSwindow ) { - tmpwin = windows[nwindows-1]; - for ( i=0; iinput_grab | SDL_GRAB_FULLSCREEN); diff --git a/src/video/x11/SDL_x11wm.c b/src/video/x11/SDL_x11wm.c index 4fd9a7f3e..f0f6569c1 100644 --- a/src/video/x11/SDL_x11wm.c +++ b/src/video/x11/SDL_x11wm.c @@ -250,32 +250,21 @@ SDL_GrabMode X11_GrabInputNoLock(_THIS, SDL_GrabMode mode) return(mode); /* Will be set later on mode switch */ } if ( mode == SDL_GRAB_OFF ) { +printf("SDL grab OFF\n"); XUngrabPointer(SDL_Display, CurrentTime); - if ( this->screen->flags & SDL_FULLSCREEN ) { - /* Rebind the mouse to the fullscreen window */ - for ( numtries = 0; numtries < 10; ++numtries ) { - result = XGrabPointer(SDL_Display, FSwindow, - True, 0, - GrabModeAsync, GrabModeAsync, - FSwindow, None, CurrentTime); - if ( result == GrabSuccess ) { - break; - } - SDL_Delay(100); - } - if ( result != GrabSuccess ) { - /* Uh, oh, what do we do here? */ ; - } - } - if ( !(this->screen->flags & SDL_FULLSCREEN) ) - XUngrabKeyboard(SDL_Display, CurrentTime); + XUngrabKeyboard(SDL_Display, CurrentTime); } else { +printf("SDL grab ON\n"); if ( this->screen->flags & SDL_FULLSCREEN ) { /* Unbind the mouse from the fullscreen window */ XUngrabPointer(SDL_Display, CurrentTime); } /* Try to grab the mouse */ +#if 0 /* We'll wait here until we actually grab, otherwise behavior undefined */ for ( numtries = 0; numtries < 10; ++numtries ) { +#else + while ( 1 ) { +#endif result = XGrabPointer(SDL_Display, SDL_Window, True, 0, GrabModeAsync, GrabModeAsync, SDL_Window, None, CurrentTime); @@ -287,16 +276,16 @@ SDL_GrabMode X11_GrabInputNoLock(_THIS, SDL_GrabMode mode) if ( result != GrabSuccess ) { /* Uh, oh, what do we do here? */ ; } - /* Grab the keyboard if we're in fullscreen mode */ - if ( !(this->screen->flags & SDL_FULLSCREEN) ) { - XGrabKeyboard(SDL_Display, WMwindow, True, + /* Now grab the keyboard */ + XGrabKeyboard(SDL_Display, WMwindow, True, GrabModeAsync, GrabModeAsync, CurrentTime); - SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS); - } /* Raise the window if we grab the mouse */ if ( !(this->screen->flags & SDL_FULLSCREEN) ) XRaiseWindow(SDL_Display, WMwindow); + + /* Make sure we register input focus */ + SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS); } XSync(SDL_Display, False);