Mercurial > sdl-ios-xcode
diff src/video/SDL_video.c @ 2875:91a7e08cd238
* Implemented X11 fullscreen input grab
* Progress towards being able to toggle in and out of fullscreen mode
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 17 Dec 2008 07:17:54 +0000 |
parents | 2fe507a2ef7d |
children | 3fcb0d447bcd |
line wrap: on
line diff
--- a/src/video/SDL_video.c Tue Dec 16 17:44:10 2008 +0000 +++ b/src/video/SDL_video.c Wed Dec 17 07:17:54 2008 +0000 @@ -123,8 +123,7 @@ static SDL_VideoDevice *_this = NULL; /* Various local functions */ -int SDL_VideoInit(const char *driver_name, Uint32 flags); -void SDL_VideoQuit(void); +static void SDL_UpdateWindowGrab(SDL_Window *window); static int cmpmodes(const void *A, const void *B) @@ -635,8 +634,7 @@ for (i = 0; i < display->num_windows; ++i) { SDL_Window *window = &display->windows[i]; if (FULLSCREEN_VISIBLE(window)) { - SDL_SetWindowPosition(window->id, SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED); + SDL_SetWindowPosition(window->id, window->x, window->y); } } @@ -752,7 +750,8 @@ const Uint32 allowed_flags = (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | - SDL_WINDOW_RESIZABLE); + SDL_WINDOW_RESIZABLE | + SDL_WINDOW_INPUT_GRABBED); SDL_VideoDisplay *display; SDL_Window window; int num_windows; @@ -766,11 +765,6 @@ SDL_SetError("No OpenGL support in video driver"); return 0; } - /* Fullscreen windows don't have any window decorations */ - if (flags & SDL_WINDOW_FULLSCREEN) { - flags |= SDL_WINDOW_BORDERLESS; - flags &= ~SDL_WINDOW_RESIZABLE; - } SDL_zero(window); window.id = _this->next_object_id++; window.x = x; @@ -809,9 +803,8 @@ if (flags & SDL_WINDOW_SHOWN) { SDL_ShowWindow(window.id); } - if (flags & SDL_WINDOW_INPUT_GRABBED) { - SDL_SetWindowGrab(window.id, 1); - } + SDL_UpdateWindowGrab(&window); + return window.id; } @@ -889,9 +882,8 @@ if (flags & SDL_WINDOW_SHOWN) { SDL_ShowWindow(window->id); } - if (flags & SDL_WINDOW_INPUT_GRABBED) { - SDL_SetWindowGrab(window->id, 1); - } + SDL_UpdateWindowGrab(window); + return 0; } @@ -1004,19 +996,16 @@ if (!window) { return; } - if (x == SDL_WINDOWPOS_CENTERED) { - window->x = (display->current_mode.w - window->w) / 2; - } else if (x != SDL_WINDOWPOS_UNDEFINED) { + if (x != SDL_WINDOWPOS_UNDEFINED) { window->x = x; } - if (y == SDL_WINDOWPOS_CENTERED) { - window->y = (display->current_mode.h - window->h) / 2; - } else if (y != SDL_WINDOWPOS_UNDEFINED) { + if (y != SDL_WINDOWPOS_UNDEFINED) { window->y = y; } if (_this->SetWindowPosition) { _this->SetWindowPosition(_this, window); } + SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MOVED, x, y); } void @@ -1082,11 +1071,11 @@ if (!window || (window->flags & SDL_WINDOW_SHOWN)) { return; } - SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_SHOWN, 0, 0); if (_this->ShowWindow) { _this->ShowWindow(_this, window); } + SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_SHOWN, 0, 0); } void @@ -1097,11 +1086,11 @@ if (!window || !(window->flags & SDL_WINDOW_SHOWN)) { return; } - SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_HIDDEN, 0, 0); if (_this->HideWindow) { _this->HideWindow(_this, window); } + SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_HIDDEN, 0, 0); } void @@ -1125,11 +1114,11 @@ if (!window || (window->flags & SDL_WINDOW_MAXIMIZED)) { return; } - SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MAXIMIZED, 0, 0); if (_this->MaximizeWindow) { _this->MaximizeWindow(_this, window); } + SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MAXIMIZED, 0, 0); } void @@ -1140,11 +1129,11 @@ if (!window || (window->flags & SDL_WINDOW_MINIMIZED)) { return; } - SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MINIMIZED, 0, 0); if (_this->MinimizeWindow) { _this->MinimizeWindow(_this, window); } + SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MINIMIZED, 0, 0); } void @@ -1156,11 +1145,11 @@ || (window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) { return; } - SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_RESTORED, 0, 0); if (_this->RestoreWindow) { _this->RestoreWindow(_this, window); } + SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_RESTORED, 0, 0); } int @@ -1217,7 +1206,12 @@ } else { window->flags &= ~SDL_WINDOW_INPUT_GRABBED; } + SDL_UpdateWindowGrab(window); +} +static void +SDL_UpdateWindowGrab(SDL_Window *window) +{ if ((window->flags & SDL_WINDOW_INPUT_FOCUS) && _this->SetWindowGrab) { _this->SetWindowGrab(_this, window); } @@ -1237,11 +1231,17 @@ void SDL_OnWindowShown(SDL_Window * window) { + if (window->flags & SDL_WINDOW_FULLSCREEN) { + SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_FOCUS_GAINED, 0, 0); + } } void SDL_OnWindowHidden(SDL_Window * window) { + if (window->flags & SDL_WINDOW_FULLSCREEN) { + SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0); + } } void @@ -1265,7 +1265,7 @@ if (display->gamma && _this->SetDisplayGammaRamp) { _this->SetDisplayGammaRamp(_this, display->gamma); } - if ((window->flags & SDL_WINDOW_INPUT_GRABBED) && _this->SetWindowGrab) { + if ((window->flags & (SDL_WINDOW_INPUT_GRABBED|SDL_WINDOW_FULLSCREEN)) && _this->SetWindowGrab) { _this->SetWindowGrab(_this, window); } } @@ -1282,7 +1282,7 @@ if (display->gamma && _this->SetDisplayGammaRamp) { _this->SetDisplayGammaRamp(_this, display->saved_gamma); } - if ((window->flags & SDL_WINDOW_INPUT_GRABBED) && _this->SetWindowGrab) { + if ((window->flags & (SDL_WINDOW_INPUT_GRABBED|SDL_WINDOW_FULLSCREEN)) && _this->SetWindowGrab) { _this->SetWindowGrab(_this, window); } }