Fixed some problems with the fullscreen code. Wooo. :)
authorSam Lantinga <slouken@lokigames.com>
Mon, 09 Jul 2001 22:36:16 +0000
changeset 98 8a5aff5c1294
parent 97 c7bcdece4845
child 99 1b387dc653d0
Fixed some problems with the fullscreen code. Wooo. :)
src/video/x11/SDL_x11modes.c
src/video/x11/SDL_x11wm.c
--- a/src/video/x11/SDL_x11modes.c	Mon Jul 09 15:47:40 2001 +0000
+++ b/src/video/x11/SDL_x11modes.c	Mon Jul 09 22:36:16 2001 +0000
@@ -396,7 +396,7 @@
         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 @@
     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; i<nwindows; ++i ) {
-                    if ( windows[i] == FSwindow ) {
-                        memcpy(&windows[i], &windows[i+1],
-                               (nwindows-i-1)*sizeof(windows[i]));
-                        break;
-                    }
+    /* 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; i<nwindows; ++i ) {
+                if ( windows[i] == FSwindow ) {
+                    memcpy(&windows[i], &windows[i+1],
+                           (nwindows-i-1)*sizeof(windows[i]));
+                    break;
                 }
-                windows[nwindows-1] = FSwindow;
-                XRestackWindows(SDL_Display, windows, nwindows);
-                XSync(SDL_Display, False);
             }
-            XFree(windows);
+            windows[nwindows-1] = FSwindow;
+            XRestackWindows(SDL_Display, windows, nwindows);
+            XSync(SDL_Display, False);
         }
+        XFree(windows);
+    }
 #else
-	XRaiseWindow(SDL_Display, FSwindow);
+    XRaiseWindow(SDL_Display, FSwindow);
 #endif
 
 #ifdef XFREE86_VM
-        /* Save the current video mode */
-        if ( use_vidmode ) {
-            XVidMode(LockModeSwitch, (SDL_Display, SDL_Screen, True));
-        }
+    /* Save the current video mode */
+    if ( use_vidmode ) {
+        XVidMode(LockModeSwitch, (SDL_Display, SDL_Screen, True));
+    }
 #endif
-        currently_fullscreen = 1;
+    currently_fullscreen = 1;
 
-        /* Set the new resolution */
-        okay = X11_ResizeFullScreen(this);
-        if ( ! okay ) {
-            X11_LeaveFullScreen(this);
-        }
-	/* Set the colormap */
-	if ( SDL_XColorMap ) {
-		XInstallColormap(SDL_Display, SDL_XColorMap);
-	}
+    /* Set the new resolution */
+    okay = X11_ResizeFullScreen(this);
+    if ( ! okay ) {
+        X11_LeaveFullScreen(this);
+    }
+    /* Set the colormap */
+    if ( SDL_XColorMap ) {
+        XInstallColormap(SDL_Display, SDL_XColorMap);
     }
     if ( okay )
         X11_GrabInputNoLock(this, this->input_grab | SDL_GRAB_FULLSCREEN);
--- a/src/video/x11/SDL_x11wm.c	Mon Jul 09 15:47:40 2001 +0000
+++ b/src/video/x11/SDL_x11wm.c	Mon Jul 09 22:36:16 2001 +0000
@@ -250,32 +250,21 @@
 		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 @@
 		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);