* Implemented X11 fullscreen input grab

* Progress towards being able to toggle in and out of fullscreen mode

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403337
This commit is contained in:
Sam Lantinga 2008-12-17 07:17:54 +00:00
parent 67426e7b9f
commit c0775dd47f
4 changed files with 90 additions and 42 deletions

View file

@ -287,7 +287,7 @@ X11_CreateWindow(_THIS, SDL_Window * window)
visual, AllocNone);
}
if (window->x == SDL_WINDOWPOS_CENTERED) {
if ((window->flags & SDL_WINDOW_FULLSCREEN) || window->x == SDL_WINDOWPOS_CENTERED) {
x = (DisplayWidth(data->display, displaydata->screen) -
window->w) / 2;
} else if (window->x == SDL_WINDOWPOS_UNDEFINED) {
@ -295,7 +295,7 @@ X11_CreateWindow(_THIS, SDL_Window * window)
} else {
x = window->x;
}
if (window->y == SDL_WINDOWPOS_CENTERED) {
if ((window->flags & SDL_WINDOW_FULLSCREEN) || window->y == SDL_WINDOWPOS_CENTERED) {
y = (DisplayHeight(data->display, displaydata->screen) -
window->h) / 2;
} else if (window->y == SDL_WINDOWPOS_UNDEFINED) {
@ -321,7 +321,7 @@ X11_CreateWindow(_THIS, SDL_Window * window)
sizehints = XAllocSizeHints();
if (sizehints) {
if (window->flags & SDL_WINDOW_RESIZABLE) {
if ((window->flags & SDL_WINDOW_RESIZABLE) && !(window->flags & SDL_WINDOW_FULLSCREEN)) {
sizehints->min_width = 32;
sizehints->min_height = 32;
sizehints->max_height = 4096;
@ -342,7 +342,7 @@ X11_CreateWindow(_THIS, SDL_Window * window)
XFree(sizehints);
}
if (window->flags & SDL_WINDOW_BORDERLESS) {
if (window->flags & (SDL_WINDOW_BORDERLESS|SDL_WINDOW_FULLSCREEN)) {
SDL_bool set;
Atom WM_HINTS;
@ -601,8 +601,19 @@ X11_SetWindowPosition(_THIS, SDL_Window * window)
SDL_DisplayData *displaydata =
(SDL_DisplayData *) SDL_GetDisplayFromWindow(window)->driverdata;
Display *display = data->videodata->display;
int x, y;
XMoveWindow(display, data->window, window->x, window->y);
if ((window->flags & SDL_WINDOW_FULLSCREEN) || window->x == SDL_WINDOWPOS_CENTERED) {
x = (DisplayWidth(display, displaydata->screen) - window->w) / 2;
} else {
x = window->x;
}
if ((window->flags & SDL_WINDOW_FULLSCREEN) || window->y == SDL_WINDOWPOS_CENTERED) {
y = (DisplayHeight(display, displaydata->screen) - window->h) / 2;
} else {
y = window->y;
}
XMoveWindow(display, data->window, x, y);
}
void
@ -662,7 +673,29 @@ X11_RestoreWindow(_THIS, SDL_Window * window)
void
X11_SetWindowGrab(_THIS, SDL_Window * window)
{
/* FIXME */
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
Display *display = data->videodata->display;
if ((window->flags & (SDL_WINDOW_INPUT_GRABBED|SDL_WINDOW_FULLSCREEN)) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
/* Try to grab the mouse */
for ( ; ; ) {
int result = XGrabPointer(display, data->window, True, 0, GrabModeAsync, GrabModeAsync, data->window, None, CurrentTime);
if ( result == GrabSuccess ) {
break;
}
SDL_Delay(100);
}
/* Raise the window if we grab the mouse */
XRaiseWindow(display, data->window);
/* Now grab the keyboard */
XGrabKeyboard(display, data->window, True, GrabModeAsync, GrabModeAsync, CurrentTime);
} else {
XUngrabPointer(display, CurrentTime);
XUngrabKeyboard(display, CurrentTime);
}
}
void