Skip to content

Commit

Permalink
Fixed some problems with the fullscreen code. Wooo. :)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sam Lantinga committed Jul 9, 2001
1 parent 1ca6f2e commit 6953e49
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 62 deletions.
82 changes: 43 additions & 39 deletions src/video/x11/SDL_x11modes.c
Expand Up @@ -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 */
Expand Down Expand Up @@ -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; 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);
Expand Down
35 changes: 12 additions & 23 deletions src/video/x11/SDL_x11wm.c
Expand Up @@ -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);
Expand All @@ -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);

Expand Down

0 comments on commit 6953e49

Please sign in to comment.