static void WIN_SetWindowPositionInternal(_THIS, SDL_Window * window, UINT flags) { SDL_WindowData *data = (SDL_WindowData *)window->driverdata; HWND hwnd = data->hwnd; RECT rect; DWORD style; HWND top; BOOL menu; int x, y; int w, h; /* Figure out what the window area will be */ if (SDL_ShouldAllowTopmost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; } style = GetWindowLong(hwnd, GWL_STYLE); rect.left = 0; rect.top = 0; rect.right = window->w; rect.bottom = window->h; menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); AdjustWindowRectEx(&rect, style, menu, 0); w = (rect.right - rect.left); h = (rect.bottom - rect.top); x = window->x + rect.left; y = window->y + rect.top; data->expected_resize = SDL_TRUE; SetWindowPos( hwnd, top, x, y, w, h, flags ); data->expected_resize = SDL_FALSE; }
void WIN_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) { HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; if (grabbed) { RECT rect; GetClientRect(hwnd, &rect); ClientToScreen(hwnd, (LPPOINT) & rect); ClientToScreen(hwnd, (LPPOINT) & rect + 1); ClipCursor(&rect); } else { ClipCursor(NULL); } if ( window->flags & SDL_WINDOW_FULLSCREEN ) { HWND top; SDL_WindowData *data = (SDL_WindowData *) window->driverdata; HWND hwnd = data->hwnd; UINT flags = SWP_NOMOVE | SWP_NOSIZE; if ( SDL_ShouldAllowTopmost() && (window->flags & SDL_WINDOW_INPUT_FOCUS ) ) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; flags |= SWP_NOZORDER; } SetWindowPos(hwnd, top, 0, 0, 0, 0, flags); } }
void WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; HWND hwnd = data->hwnd; SDL_Rect bounds; DWORD style; HWND top; int x, y; int w, h; if (SDL_ShouldAllowTopmost() && ((window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS) || window->flags & SDL_WINDOW_ALWAYS_ON_TOP)) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; } style = GetWindowLong(hwnd, GWL_STYLE); style &= ~STYLE_MASK; style |= GetWindowStyle(window); WIN_GetDisplayBounds(_this, display, &bounds); if (fullscreen) { x = bounds.x; y = bounds.y; w = bounds.w; h = bounds.h; /* Unset the maximized flag. This fixes https://bugzilla.libsdl.org/show_bug.cgi?id=3215 */ if (style & WS_MAXIMIZE) { data->windowed_mode_was_maximized = SDL_TRUE; style &= ~WS_MAXIMIZE; } } else { BOOL menu; /* Restore window-maximization state, as applicable. Special care is taken to *not* do this if and when we're alt-tab'ing away (to some other window; as indicated by in_window_deactivation), otherwise https://bugzilla.libsdl.org/show_bug.cgi?id=3215 can reproduce! */ if (data->windowed_mode_was_maximized && !data->in_window_deactivation) { style |= WS_MAXIMIZE; data->windowed_mode_was_maximized = SDL_FALSE; } menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); WIN_AdjustWindowRectWithStyle(window, style, menu, &x, &y, &w, &h, SDL_FALSE); } SetWindowLong(hwnd, GWL_STYLE, style); data->expected_resize = SDL_TRUE; SetWindowPos(hwnd, top, x, y, w, h, SWP_NOCOPYBITS | SWP_NOACTIVATE); data->expected_resize = SDL_FALSE; }
void WIN_RaiseWindow(_THIS, SDL_Window * window) { HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; HWND top; if ( SDL_ShouldAllowTopmost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS )) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; } SetWindowPos(hwnd, top, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE)); }
void WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; HWND hwnd = data->hwnd; RECT rect; SDL_Rect bounds; DWORD style; HWND top; BOOL menu; int x, y; int w, h; if (SDL_ShouldAllowTopmost() && (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; } style = GetWindowLong(hwnd, GWL_STYLE); style &= ~STYLE_MASK; style |= GetWindowStyle(window); WIN_GetDisplayBounds(_this, display, &bounds); if (fullscreen) { x = bounds.x; y = bounds.y; w = bounds.w; h = bounds.h; } else { rect.left = 0; rect.top = 0; rect.right = window->windowed.w; rect.bottom = window->windowed.h; menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); AdjustWindowRectEx(&rect, style, menu, 0); w = (rect.right - rect.left); h = (rect.bottom - rect.top); x = window->windowed.x + rect.left; y = window->windowed.y + rect.top; } SetWindowLong(hwnd, GWL_STYLE, style); data->expected_resize = SDL_TRUE; SetWindowPos(hwnd, top, x, y, w, h, SWP_NOCOPYBITS | SWP_NOACTIVATE); data->expected_resize = SDL_FALSE; }
static void WIN_SetWindowPositionInternal(_THIS, SDL_Window * window, UINT flags) { SDL_WindowData *data = (SDL_WindowData *)window->driverdata; HWND hwnd = data->hwnd; HWND top; int x, y; int w, h; /* Figure out what the window area will be */ if (SDL_ShouldAllowTopmost() && ((window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS)) == (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_INPUT_FOCUS) || (window->flags & SDL_WINDOW_ALWAYS_ON_TOP))) { top = HWND_TOPMOST; } else { top = HWND_NOTOPMOST; } WIN_AdjustWindowRect(window, &x, &y, &w, &h, SDL_TRUE); data->expected_resize = SDL_TRUE; SetWindowPos(hwnd, top, x, y, w, h, flags); data->expected_resize = SDL_FALSE; }