Fixed a host of issues with Windows fullscreen modes. Toggling fullscreen OpenGL works now in my test environment.
This commit is contained in:
parent
d865e46b13
commit
6c726ca475
10 changed files with 184 additions and 132 deletions
|
@ -181,7 +181,7 @@ struct SDL_VideoDevice
|
||||||
void (*MinimizeWindow) (_THIS, SDL_Window * window);
|
void (*MinimizeWindow) (_THIS, SDL_Window * window);
|
||||||
void (*RestoreWindow) (_THIS, SDL_Window * window);
|
void (*RestoreWindow) (_THIS, SDL_Window * window);
|
||||||
void (*PrepWindowFullscreen) (_THIS, SDL_Window * window);
|
void (*PrepWindowFullscreen) (_THIS, SDL_Window * window);
|
||||||
void (*SetWindowFullscreen) (_THIS, SDL_Window * window);
|
void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
|
||||||
void (*SetWindowGrab) (_THIS, SDL_Window * window);
|
void (*SetWindowGrab) (_THIS, SDL_Window * window);
|
||||||
void (*DestroyWindow) (_THIS, SDL_Window * window);
|
void (*DestroyWindow) (_THIS, SDL_Window * window);
|
||||||
int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
|
int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
|
||||||
|
|
|
@ -1001,32 +1001,11 @@ SDL_GetWindowPixelFormat(SDL_Window * window)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool attempt)
|
SDL_UpdateFullscreenMode(SDL_Window * window)
|
||||||
{
|
{
|
||||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
||||||
SDL_Window *other;
|
SDL_Window *other;
|
||||||
|
|
||||||
/* See if anything changed */
|
|
||||||
if ((display->fullscreen_window == window) == attempt) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See if we even want to do anything here */
|
|
||||||
if ((window->flags & SDL_WINDOW_FULLSCREEN) &&
|
|
||||||
(window->flags & SDL_WINDOW_SHOWN)) {
|
|
||||||
if (attempt) {
|
|
||||||
/* We just gained some state, try to gain all states */
|
|
||||||
if (window->flags & SDL_WINDOW_MINIMIZED) {
|
|
||||||
SDL_RestoreWindow(window);
|
|
||||||
} else {
|
|
||||||
SDL_RaiseWindow(window);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* We just lost some state, try to release all states */
|
|
||||||
SDL_MinimizeWindow(window);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FULLSCREEN_VISIBLE(window)) {
|
if (FULLSCREEN_VISIBLE(window)) {
|
||||||
/* Hide any other fullscreen windows */
|
/* Hide any other fullscreen windows */
|
||||||
if (display->fullscreen_window &&
|
if (display->fullscreen_window &&
|
||||||
|
@ -1035,6 +1014,11 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool attempt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See if anything needs to be done now */
|
||||||
|
if ((display->fullscreen_window == window) == FULLSCREEN_VISIBLE(window)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* See if there are any fullscreen windows */
|
/* See if there are any fullscreen windows */
|
||||||
for (other = _this->windows; other; other = other->next) {
|
for (other = _this->windows; other; other = other->next) {
|
||||||
if (FULLSCREEN_VISIBLE(other) &&
|
if (FULLSCREEN_VISIBLE(other) &&
|
||||||
|
@ -1048,7 +1032,7 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool attempt)
|
||||||
SDL_SetDisplayModeForDisplay(display, &fullscreen_mode);
|
SDL_SetDisplayModeForDisplay(display, &fullscreen_mode);
|
||||||
|
|
||||||
if (_this->SetWindowFullscreen) {
|
if (_this->SetWindowFullscreen) {
|
||||||
_this->SetWindowFullscreen(_this, other);
|
_this->SetWindowFullscreen(_this, other, display, SDL_TRUE);
|
||||||
}
|
}
|
||||||
display->fullscreen_window = other;
|
display->fullscreen_window = other;
|
||||||
|
|
||||||
|
@ -1068,7 +1052,7 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool attempt)
|
||||||
SDL_SetDisplayModeForDisplay(display, NULL);
|
SDL_SetDisplayModeForDisplay(display, NULL);
|
||||||
|
|
||||||
if (_this->SetWindowFullscreen) {
|
if (_this->SetWindowFullscreen) {
|
||||||
_this->SetWindowFullscreen(_this, window);
|
_this->SetWindowFullscreen(_this, window, display, SDL_FALSE);
|
||||||
}
|
}
|
||||||
display->fullscreen_window = NULL;
|
display->fullscreen_window = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1188,7 +1172,7 @@ SDL_RecreateWindow(SDL_Window * window, Uint32 flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore video mode, etc. */
|
/* Restore video mode, etc. */
|
||||||
SDL_UpdateFullscreenMode(window, SDL_FALSE);
|
SDL_HideWindow(window);
|
||||||
|
|
||||||
/* Tear down the old native window */
|
/* Tear down the old native window */
|
||||||
if (window->surface) {
|
if (window->surface) {
|
||||||
|
@ -1373,10 +1357,10 @@ SDL_SetWindowPosition(SDL_Window * window, int x, int y)
|
||||||
{
|
{
|
||||||
CHECK_WINDOW_MAGIC(window, );
|
CHECK_WINDOW_MAGIC(window, );
|
||||||
|
|
||||||
if (x != SDL_WINDOWPOS_UNDEFINED) {
|
if (!SDL_WINDOWPOS_ISUNDEFINED(x)) {
|
||||||
window->x = x;
|
window->x = x;
|
||||||
}
|
}
|
||||||
if (y != SDL_WINDOWPOS_UNDEFINED) {
|
if (!SDL_WINDOWPOS_ISUNDEFINED(y)) {
|
||||||
window->y = y;
|
window->y = y;
|
||||||
}
|
}
|
||||||
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
|
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
|
||||||
|
@ -1569,13 +1553,11 @@ SDL_SetWindowFullscreen(SDL_Window * window, SDL_bool fullscreen)
|
||||||
}
|
}
|
||||||
if (fullscreen) {
|
if (fullscreen) {
|
||||||
window->flags |= SDL_WINDOW_FULLSCREEN;
|
window->flags |= SDL_WINDOW_FULLSCREEN;
|
||||||
|
|
||||||
SDL_UpdateFullscreenMode(window, SDL_TRUE);
|
|
||||||
} else {
|
} else {
|
||||||
window->flags &= ~SDL_WINDOW_FULLSCREEN;
|
window->flags &= ~SDL_WINDOW_FULLSCREEN;
|
||||||
|
|
||||||
SDL_UpdateFullscreenMode(window, SDL_FALSE);
|
|
||||||
}
|
}
|
||||||
|
SDL_UpdateFullscreenMode(window);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1686,13 +1668,13 @@ void
|
||||||
SDL_OnWindowShown(SDL_Window * window)
|
SDL_OnWindowShown(SDL_Window * window)
|
||||||
{
|
{
|
||||||
SDL_RaiseWindow(window);
|
SDL_RaiseWindow(window);
|
||||||
SDL_UpdateFullscreenMode(window, SDL_TRUE);
|
SDL_UpdateFullscreenMode(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_OnWindowHidden(SDL_Window * window)
|
SDL_OnWindowHidden(SDL_Window * window)
|
||||||
{
|
{
|
||||||
SDL_UpdateFullscreenMode(window, SDL_FALSE);
|
SDL_UpdateFullscreenMode(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1705,14 +1687,14 @@ SDL_OnWindowResized(SDL_Window * window)
|
||||||
void
|
void
|
||||||
SDL_OnWindowMinimized(SDL_Window * window)
|
SDL_OnWindowMinimized(SDL_Window * window)
|
||||||
{
|
{
|
||||||
SDL_UpdateFullscreenMode(window, SDL_FALSE);
|
SDL_UpdateFullscreenMode(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_OnWindowRestored(SDL_Window * window)
|
SDL_OnWindowRestored(SDL_Window * window)
|
||||||
{
|
{
|
||||||
SDL_RaiseWindow(window);
|
SDL_RaiseWindow(window);
|
||||||
SDL_UpdateFullscreenMode(window, SDL_TRUE);
|
SDL_UpdateFullscreenMode(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1763,7 +1745,7 @@ SDL_DestroyWindow(SDL_Window * window)
|
||||||
CHECK_WINDOW_MAGIC(window, );
|
CHECK_WINDOW_MAGIC(window, );
|
||||||
|
|
||||||
/* Restore video mode, etc. */
|
/* Restore video mode, etc. */
|
||||||
SDL_UpdateFullscreenMode(window, SDL_FALSE);
|
SDL_HideWindow(window);
|
||||||
|
|
||||||
if (window->surface) {
|
if (window->surface) {
|
||||||
window->surface->flags &= ~SDL_DONTFREE;
|
window->surface->flags &= ~SDL_DONTFREE;
|
||||||
|
|
|
@ -102,7 +102,7 @@ extern void Cocoa_RaiseWindow(_THIS, SDL_Window * window);
|
||||||
extern void Cocoa_MaximizeWindow(_THIS, SDL_Window * window);
|
extern void Cocoa_MaximizeWindow(_THIS, SDL_Window * window);
|
||||||
extern void Cocoa_MinimizeWindow(_THIS, SDL_Window * window);
|
extern void Cocoa_MinimizeWindow(_THIS, SDL_Window * window);
|
||||||
extern void Cocoa_RestoreWindow(_THIS, SDL_Window * window);
|
extern void Cocoa_RestoreWindow(_THIS, SDL_Window * window);
|
||||||
extern void Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window);
|
extern void Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
|
||||||
extern void Cocoa_SetWindowGrab(_THIS, SDL_Window * window);
|
extern void Cocoa_SetWindowGrab(_THIS, SDL_Window * window);
|
||||||
extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window);
|
extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window);
|
||||||
extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window,
|
extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window,
|
||||||
|
|
|
@ -399,18 +399,22 @@ static __inline__ void ConvertNSRect(NSRect *r)
|
||||||
@end
|
@end
|
||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
GetStyleMask(SDL_Window * window)
|
GetWindowStyle(SDL_Window * window)
|
||||||
{
|
{
|
||||||
unsigned int style;
|
unsigned int style;
|
||||||
|
|
||||||
if (window->flags & SDL_WINDOW_BORDERLESS) {
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
style = NSBorderlessWindowMask;
|
style = NSBorderlessWindowMask;
|
||||||
} else {
|
} else {
|
||||||
style = (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask);
|
if (window->flags & SDL_WINDOW_BORDERLESS) {
|
||||||
}
|
style = NSBorderlessWindowMask;
|
||||||
if (window->flags & SDL_WINDOW_RESIZABLE) {
|
} else {
|
||||||
style |= NSResizableWindowMask;
|
style = (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask);
|
||||||
}
|
}
|
||||||
|
if (window->flags & SDL_WINDOW_RESIZABLE) {
|
||||||
|
style |= NSResizableWindowMask;
|
||||||
|
}
|
||||||
|
}
|
||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,7 +532,7 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
|
||||||
rect.size.height = window->h;
|
rect.size.height = window->h;
|
||||||
ConvertNSRect(&rect);
|
ConvertNSRect(&rect);
|
||||||
|
|
||||||
style = GetStyleMask(window);
|
style = GetWindowStyle(window);
|
||||||
|
|
||||||
/* Figure out which screen to place this window */
|
/* Figure out which screen to place this window */
|
||||||
NSArray *screens = [NSScreen screens];
|
NSArray *screens = [NSScreen screens];
|
||||||
|
@ -704,15 +708,14 @@ Cocoa_RestoreWindow(_THIS, SDL_Window * window)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window)
|
Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
|
||||||
{
|
{
|
||||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||||
NSWindow *nswindow = data->nswindow;
|
NSWindow *nswindow = data->nswindow;
|
||||||
NSRect rect;
|
NSRect rect;
|
||||||
|
|
||||||
if (FULLSCREEN_VISIBLE(window)) {
|
if (fullscreen) {
|
||||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
|
||||||
SDL_Rect bounds;
|
SDL_Rect bounds;
|
||||||
|
|
||||||
Cocoa_GetDisplayBounds(_this, display, &bounds);
|
Cocoa_GetDisplayBounds(_this, display, &bounds);
|
||||||
|
@ -726,14 +729,14 @@ Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window)
|
||||||
[nswindow setContentSize:rect.size];
|
[nswindow setContentSize:rect.size];
|
||||||
[nswindow setFrameOrigin:rect.origin];
|
[nswindow setFrameOrigin:rect.origin];
|
||||||
} else {
|
} else {
|
||||||
[nswindow setStyleMask:GetStyleMask(window)];
|
[nswindow setStyleMask:GetWindowStyle(window)];
|
||||||
|
|
||||||
// This doesn't seem to do anything...
|
// This doesn't seem to do anything...
|
||||||
//[nswindow setFrameOrigin:origin];
|
//[nswindow setFrameOrigin:origin];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FULLSCREEN_TOGGLEABLE
|
#ifdef FULLSCREEN_TOGGLEABLE
|
||||||
if (FULLSCREEN_VISIBLE(window)) {
|
if (fullscreen) {
|
||||||
/* OpenGL is rendering to the window, so make it visible! */
|
/* OpenGL is rendering to the window, so make it visible! */
|
||||||
[nswindow setLevel:CGShieldingWindowLevel()];
|
[nswindow setLevel:CGShieldingWindowLevel()];
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -131,10 +131,6 @@ WIN_GetDisplayMode(LPCTSTR deviceName, DWORD index, SDL_DisplayMode * mode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (SDL_ISPIXELFORMAT_INDEXED(mode->format)) {
|
|
||||||
/* We don't support palettized modes now */
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,35 +166,58 @@ WIN_AddDisplay(LPTSTR DeviceName)
|
||||||
int
|
int
|
||||||
WIN_InitModes(_THIS)
|
WIN_InitModes(_THIS)
|
||||||
{
|
{
|
||||||
|
int pass;
|
||||||
DWORD i, j, count;
|
DWORD i, j, count;
|
||||||
DISPLAY_DEVICE device;
|
DISPLAY_DEVICE device;
|
||||||
|
|
||||||
device.cb = sizeof(device);
|
device.cb = sizeof(device);
|
||||||
for (i = 0;; ++i) {
|
|
||||||
TCHAR DeviceName[32];
|
|
||||||
|
|
||||||
if (!EnumDisplayDevices(NULL, i, &device, 0)) {
|
/* Get the primary display in the first pass */
|
||||||
break;
|
for (pass = 0; pass < 2; ++pass) {
|
||||||
}
|
for (i = 0; ; ++i) {
|
||||||
if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
|
TCHAR DeviceName[32];
|
||||||
continue;
|
|
||||||
}
|
if (!EnumDisplayDevices(NULL, i, &device, 0)) {
|
||||||
SDL_memcpy(DeviceName, device.DeviceName, sizeof(DeviceName));
|
|
||||||
#ifdef DEBUG_MODES
|
|
||||||
printf("Device: %s\n", WIN_StringToUTF8(DeviceName));
|
|
||||||
#endif
|
|
||||||
count = 0;
|
|
||||||
for (j = 0;; ++j) {
|
|
||||||
if (!EnumDisplayDevices(DeviceName, j, &device, 0)) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
|
if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
count += WIN_AddDisplay(device.DeviceName);
|
if (pass == 0) {
|
||||||
}
|
if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) {
|
||||||
if (count == 0) {
|
continue;
|
||||||
WIN_AddDisplay(DeviceName);
|
}
|
||||||
|
} else {
|
||||||
|
if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_memcpy(DeviceName, device.DeviceName, sizeof(DeviceName));
|
||||||
|
#ifdef DEBUG_MODES
|
||||||
|
printf("Device: %s\n", WIN_StringToUTF8(DeviceName));
|
||||||
|
#endif
|
||||||
|
count = 0;
|
||||||
|
for (j = 0; ; ++j) {
|
||||||
|
if (!EnumDisplayDevices(DeviceName, j, &device, 0)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pass == 0) {
|
||||||
|
if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count += WIN_AddDisplay(device.DeviceName);
|
||||||
|
}
|
||||||
|
if (count == 0) {
|
||||||
|
WIN_AddDisplay(DeviceName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_this->num_displays == 0) {
|
if (_this->num_displays == 0) {
|
||||||
|
@ -211,7 +230,7 @@ WIN_InitModes(_THIS)
|
||||||
int
|
int
|
||||||
WIN_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect)
|
WIN_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect)
|
||||||
{
|
{
|
||||||
SDL_DisplayModeData *data = (SDL_DisplayModeData *) display->desktop_mode.driverdata;
|
SDL_DisplayModeData *data = (SDL_DisplayModeData *) display->current_mode.driverdata;
|
||||||
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
// WINCE: DEVMODE.dmPosition not found, or may be mingw32ce bug
|
// WINCE: DEVMODE.dmPosition not found, or may be mingw32ce bug
|
||||||
|
@ -239,6 +258,10 @@ WIN_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
|
||||||
if (!WIN_GetDisplayMode(data->DeviceName, i, &mode)) {
|
if (!WIN_GetDisplayMode(data->DeviceName, i, &mode)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (SDL_ISPIXELFORMAT_INDEXED(mode.format)) {
|
||||||
|
/* We don't support palettized modes now */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (mode.format != SDL_PIXELFORMAT_UNKNOWN) {
|
if (mode.format != SDL_PIXELFORMAT_UNKNOWN) {
|
||||||
if (!SDL_AddDisplayMode(display, &mode)) {
|
if (!SDL_AddDisplayMode(display, &mode)) {
|
||||||
SDL_free(mode.driverdata);
|
SDL_free(mode.driverdata);
|
||||||
|
@ -265,9 +288,7 @@ WIN_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
|
||||||
status =
|
status =
|
||||||
ChangeDisplaySettingsEx(displaydata->DeviceName, &data->DeviceMode,
|
ChangeDisplaySettingsEx(displaydata->DeviceName, &data->DeviceMode,
|
||||||
NULL, CDS_FULLSCREEN, NULL);
|
NULL, CDS_FULLSCREEN, NULL);
|
||||||
if (status == DISP_CHANGE_SUCCESSFUL) {
|
if (status != DISP_CHANGE_SUCCESSFUL) {
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
const char *reason = "Unknown reason";
|
const char *reason = "Unknown reason";
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case DISP_CHANGE_BADFLAGS:
|
case DISP_CHANGE_BADFLAGS:
|
||||||
|
@ -286,12 +307,14 @@ WIN_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
|
||||||
SDL_SetError("ChangeDisplaySettingsEx() failed: %s", reason);
|
SDL_SetError("ChangeDisplaySettingsEx() failed: %s", reason);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
EnumDisplaySettings(displaydata->DeviceName, ENUM_CURRENT_SETTINGS, &data->DeviceMode);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
WIN_QuitModes(_THIS)
|
WIN_QuitModes(_THIS)
|
||||||
{
|
{
|
||||||
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
|
/* All fullscreen windows should have restored modes by now */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -124,6 +124,7 @@ WIN_CreateDevice(int devindex)
|
||||||
device->MaximizeWindow = WIN_MaximizeWindow;
|
device->MaximizeWindow = WIN_MaximizeWindow;
|
||||||
device->MinimizeWindow = WIN_MinimizeWindow;
|
device->MinimizeWindow = WIN_MinimizeWindow;
|
||||||
device->RestoreWindow = WIN_RestoreWindow;
|
device->RestoreWindow = WIN_RestoreWindow;
|
||||||
|
device->SetWindowFullscreen = WIN_SetWindowFullscreen;
|
||||||
device->SetWindowGrab = WIN_SetWindowGrab;
|
device->SetWindowGrab = WIN_SetWindowGrab;
|
||||||
device->DestroyWindow = WIN_DestroyWindow;
|
device->DestroyWindow = WIN_DestroyWindow;
|
||||||
device->GetWindowWMInfo = WIN_GetWindowWMInfo;
|
device->GetWindowWMInfo = WIN_GetWindowWMInfo;
|
||||||
|
|
125
src/video/windows/SDL_windowswindow.c
Normal file → Executable file
125
src/video/windows/SDL_windowswindow.c
Normal file → Executable file
|
@ -42,6 +42,33 @@ static WCHAR *SDL_HelperWindowClassName = TEXT("SDLHelperWindowInputCatcher");
|
||||||
static WCHAR *SDL_HelperWindowName = TEXT("SDLHelperWindowInputMsgWindow");
|
static WCHAR *SDL_HelperWindowName = TEXT("SDLHelperWindowInputMsgWindow");
|
||||||
static ATOM SDL_HelperWindowClass = 0;
|
static ATOM SDL_HelperWindowClass = 0;
|
||||||
|
|
||||||
|
#define STYLE_BASIC (WS_CLIPSIBLINGS | WS_CLIPCHILDREN)
|
||||||
|
#define STYLE_FULLSCREEN (WS_POPUP)
|
||||||
|
#define STYLE_BORDERLESS (WS_POPUP)
|
||||||
|
#define STYLE_NORMAL (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
|
||||||
|
#define STYLE_RESIZABLE (WS_THICKFRAME | WS_MAXIMIZEBOX)
|
||||||
|
#define STYLE_MASK (STYLE_FULLSCREEN | STYLE_BORDERLESS | STYLE_NORMAL | STYLE_RESIZABLE)
|
||||||
|
|
||||||
|
static DWORD
|
||||||
|
GetWindowStyle(SDL_Window * window)
|
||||||
|
{
|
||||||
|
DWORD style = 0;
|
||||||
|
|
||||||
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
|
style |= STYLE_FULLSCREEN;
|
||||||
|
} else {
|
||||||
|
if (window->flags & SDL_WINDOW_BORDERLESS) {
|
||||||
|
style |= STYLE_BORDERLESS;
|
||||||
|
} else {
|
||||||
|
style |= STYLE_NORMAL;
|
||||||
|
}
|
||||||
|
if (window->flags & SDL_WINDOW_RESIZABLE) {
|
||||||
|
style |= STYLE_RESIZABLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return style;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created)
|
SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created)
|
||||||
{
|
{
|
||||||
|
@ -168,19 +195,11 @@ WIN_CreateWindow(_THIS, SDL_Window * window)
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
SDL_Rect bounds;
|
SDL_Rect bounds;
|
||||||
DWORD style = (WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
|
DWORD style = STYLE_BASIC;
|
||||||
int x, y;
|
int x, y;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
if (window->flags & (SDL_WINDOW_BORDERLESS | SDL_WINDOW_FULLSCREEN)) {
|
style |= GetWindowStyle(window);
|
||||||
style |= WS_POPUP;
|
|
||||||
} else {
|
|
||||||
style |= (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX);
|
|
||||||
}
|
|
||||||
if ((window->flags & SDL_WINDOW_RESIZABLE)
|
|
||||||
&& !(window->flags & SDL_WINDOW_FULLSCREEN)) {
|
|
||||||
style |= (WS_THICKFRAME | WS_MAXIMIZEBOX);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Figure out what the window area will be */
|
/* Figure out what the window area will be */
|
||||||
rect.left = 0;
|
rect.left = 0;
|
||||||
|
@ -192,16 +211,7 @@ WIN_CreateWindow(_THIS, SDL_Window * window)
|
||||||
h = (rect.bottom - rect.top);
|
h = (rect.bottom - rect.top);
|
||||||
|
|
||||||
WIN_GetDisplayBounds(_this, display, &bounds);
|
WIN_GetDisplayBounds(_this, display, &bounds);
|
||||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
if (SDL_WINDOWPOS_ISCENTERED(window->x)) {
|
||||||
/* The bounds when this window is visible is the fullscreen mode */
|
|
||||||
SDL_DisplayMode fullscreen_mode;
|
|
||||||
if (SDL_GetWindowDisplayMode(window, &fullscreen_mode) == 0) {
|
|
||||||
bounds.w = fullscreen_mode.w;
|
|
||||||
bounds.h = fullscreen_mode.h;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|
|
||||||
|| SDL_WINDOWPOS_ISCENTERED(window->x)) {
|
|
||||||
x = bounds.x + (bounds.w - w) / 2;
|
x = bounds.x + (bounds.w - w) / 2;
|
||||||
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->x)) {
|
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->x)) {
|
||||||
if (bounds.x == 0) {
|
if (bounds.x == 0) {
|
||||||
|
@ -212,8 +222,7 @@ WIN_CreateWindow(_THIS, SDL_Window * window)
|
||||||
} else {
|
} else {
|
||||||
x = window->x + rect.left;
|
x = window->x + rect.left;
|
||||||
}
|
}
|
||||||
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|
if (SDL_WINDOWPOS_ISCENTERED(window->y)) {
|
||||||
|| SDL_WINDOWPOS_ISCENTERED(window->y)) {
|
|
||||||
y = bounds.y + (bounds.h - h) / 2;
|
y = bounds.y + (bounds.h - h) / 2;
|
||||||
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->x)) {
|
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->x)) {
|
||||||
if (bounds.x == 0) {
|
if (bounds.x == 0) {
|
||||||
|
@ -232,7 +241,6 @@ WIN_CreateWindow(_THIS, SDL_Window * window)
|
||||||
WIN_SetError("Couldn't create window");
|
WIN_SetError("Couldn't create window");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
//RegisterTouchWindow(hwnd, 0);
|
|
||||||
|
|
||||||
WIN_PumpEvents(_this);
|
WIN_PumpEvents(_this);
|
||||||
|
|
||||||
|
@ -394,22 +402,12 @@ WIN_SetWindowPosition(_THIS, SDL_Window * window)
|
||||||
h = (rect.bottom - rect.top);
|
h = (rect.bottom - rect.top);
|
||||||
|
|
||||||
WIN_GetDisplayBounds(_this, display, &bounds);
|
WIN_GetDisplayBounds(_this, display, &bounds);
|
||||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
if (SDL_WINDOWPOS_ISCENTERED(window->x)) {
|
||||||
/* The bounds when this window is visible is the fullscreen mode */
|
|
||||||
SDL_DisplayMode fullscreen_mode;
|
|
||||||
if (SDL_GetWindowDisplayMode(window, &fullscreen_mode) == 0) {
|
|
||||||
bounds.w = fullscreen_mode.w;
|
|
||||||
bounds.h = fullscreen_mode.h;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|
|
||||||
|| SDL_WINDOWPOS_ISCENTERED(window->x)) {
|
|
||||||
x = bounds.x + (bounds.w - w) / 2;
|
x = bounds.x + (bounds.w - w) / 2;
|
||||||
} else {
|
} else {
|
||||||
x = window->x + rect.left;
|
x = window->x + rect.left;
|
||||||
}
|
}
|
||||||
if ((window->flags & SDL_WINDOW_FULLSCREEN)
|
if (SDL_WINDOWPOS_ISCENTERED(window->y)) {
|
||||||
|| SDL_WINDOWPOS_ISCENTERED(window->y)) {
|
|
||||||
y = bounds.y + (bounds.h - h) / 2;
|
y = bounds.y + (bounds.h - h) / 2;
|
||||||
} else {
|
} else {
|
||||||
y = window->y + rect.top;
|
y = window->y + rect.top;
|
||||||
|
@ -541,7 +539,7 @@ WIN_MinimizeWindow(_THIS, SDL_Window * window)
|
||||||
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
if((window->flags & SDL_WINDOW_FULLSCREEN) && videodata->SHFullScreen)
|
if((window->flags & SDL_WINDOW_FULLSCREEN) && videodata->SHFullScreen)
|
||||||
videodata->SHFullScreen(hwnd, SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON | SHFS_SHOWSIPBUTTON);
|
videodata->SHFullScreen(hwnd, SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON | SHFS_SHOWSIPBUTTON);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -553,6 +551,59 @@ WIN_RestoreWindow(_THIS, SDL_Window * window)
|
||||||
ShowWindow(hwnd, SW_RESTORE);
|
ShowWindow(hwnd, SW_RESTORE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 (fullscreen) {
|
||||||
|
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) {
|
||||||
|
/* Save the windowed position */
|
||||||
|
data->windowed_x = window->x;
|
||||||
|
data->windowed_y = window->y;
|
||||||
|
|
||||||
|
x = bounds.x;
|
||||||
|
y = bounds.y;
|
||||||
|
w = bounds.w;
|
||||||
|
h = bounds.h;
|
||||||
|
} else {
|
||||||
|
rect.left = 0;
|
||||||
|
rect.top = 0;
|
||||||
|
rect.right = window->w;
|
||||||
|
rect.bottom = window->h;
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
menu = FALSE;
|
||||||
|
#else
|
||||||
|
menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL);
|
||||||
|
#endif
|
||||||
|
AdjustWindowRectEx(&rect, style, menu, 0);
|
||||||
|
w = (rect.right - rect.left);
|
||||||
|
h = (rect.bottom - rect.top);
|
||||||
|
x = data->windowed_x + rect.left;
|
||||||
|
y = data->windowed_y + rect.top;
|
||||||
|
}
|
||||||
|
SetWindowLong(hwnd, GWL_STYLE, style);
|
||||||
|
SetWindowPos(hwnd, top, x, y, w, h, SWP_NOCOPYBITS);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
WIN_SetWindowGrab(_THIS, SDL_Window * window)
|
WIN_SetWindowGrab(_THIS, SDL_Window * window)
|
||||||
{
|
{
|
||||||
|
|
|
@ -43,6 +43,8 @@ typedef struct
|
||||||
WNDPROC wndproc;
|
WNDPROC wndproc;
|
||||||
SDL_bool created;
|
SDL_bool created;
|
||||||
int mouse_pressed;
|
int mouse_pressed;
|
||||||
|
int windowed_x;
|
||||||
|
int windowed_y;
|
||||||
struct SDL_VideoData *videodata;
|
struct SDL_VideoData *videodata;
|
||||||
} SDL_WindowData;
|
} SDL_WindowData;
|
||||||
|
|
||||||
|
@ -58,6 +60,7 @@ extern void WIN_RaiseWindow(_THIS, SDL_Window * window);
|
||||||
extern void WIN_MaximizeWindow(_THIS, SDL_Window * window);
|
extern void WIN_MaximizeWindow(_THIS, SDL_Window * window);
|
||||||
extern void WIN_MinimizeWindow(_THIS, SDL_Window * window);
|
extern void WIN_MinimizeWindow(_THIS, SDL_Window * window);
|
||||||
extern void WIN_RestoreWindow(_THIS, SDL_Window * window);
|
extern void WIN_RestoreWindow(_THIS, SDL_Window * window);
|
||||||
|
extern void WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
|
||||||
extern void WIN_SetWindowGrab(_THIS, SDL_Window * window);
|
extern void WIN_SetWindowGrab(_THIS, SDL_Window * window);
|
||||||
extern void WIN_DestroyWindow(_THIS, SDL_Window * window);
|
extern void WIN_DestroyWindow(_THIS, SDL_Window * window);
|
||||||
extern SDL_bool WIN_GetWindowWMInfo(_THIS, SDL_Window * window,
|
extern SDL_bool WIN_GetWindowWMInfo(_THIS, SDL_Window * window,
|
||||||
|
|
|
@ -845,12 +845,11 @@ X11_RestoreWindow(_THIS, SDL_Window * window)
|
||||||
X11_ShowWindow(_this, window);
|
X11_ShowWindow(_this, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
SetWindowFullscreen(_THIS, SDL_Window * window, SDL_bool fullscreen)
|
X11_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * _display, SDL_bool fullscreen)
|
||||||
{
|
{
|
||||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||||
SDL_DisplayData *displaydata =
|
SDL_DisplayData *displaydata = (SDL_DisplayData *) _display->driverdata;
|
||||||
(SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata;
|
|
||||||
Display *display = data->videodata->display;
|
Display *display = data->videodata->display;
|
||||||
Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE;
|
Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE;
|
||||||
Atom _NET_WM_STATE_MAXIMIZED_VERT = data->videodata->_NET_WM_STATE_MAXIMIZED_VERT;
|
Atom _NET_WM_STATE_MAXIMIZED_VERT = data->videodata->_NET_WM_STATE_MAXIMIZED_VERT;
|
||||||
|
@ -893,16 +892,6 @@ SetWindowFullscreen(_THIS, SDL_Window * window, SDL_bool fullscreen)
|
||||||
XFlush(display);
|
XFlush(display);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
X11_SetWindowFullscreen(_THIS, SDL_Window * window)
|
|
||||||
{
|
|
||||||
if (FULLSCREEN_VISIBLE(window)) {
|
|
||||||
SetWindowFullscreen(_this, window, SDL_TRUE);
|
|
||||||
} else {
|
|
||||||
SetWindowFullscreen(_this, window, SDL_FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
X11_SetWindowGrab(_THIS, SDL_Window * window)
|
X11_SetWindowGrab(_THIS, SDL_Window * window)
|
||||||
{
|
{
|
||||||
|
|
|
@ -54,7 +54,7 @@ extern void X11_RaiseWindow(_THIS, SDL_Window * window);
|
||||||
extern void X11_MaximizeWindow(_THIS, SDL_Window * window);
|
extern void X11_MaximizeWindow(_THIS, SDL_Window * window);
|
||||||
extern void X11_MinimizeWindow(_THIS, SDL_Window * window);
|
extern void X11_MinimizeWindow(_THIS, SDL_Window * window);
|
||||||
extern void X11_RestoreWindow(_THIS, SDL_Window * window);
|
extern void X11_RestoreWindow(_THIS, SDL_Window * window);
|
||||||
extern void X11_SetWindowFullscreen(_THIS, SDL_Window * window);
|
extern void X11_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
|
||||||
extern void X11_SetWindowGrab(_THIS, SDL_Window * window);
|
extern void X11_SetWindowGrab(_THIS, SDL_Window * window);
|
||||||
extern void X11_DestroyWindow(_THIS, SDL_Window * window);
|
extern void X11_DestroyWindow(_THIS, SDL_Window * window);
|
||||||
extern SDL_bool X11_GetWindowWMInfo(_THIS, SDL_Window * window,
|
extern SDL_bool X11_GetWindowWMInfo(_THIS, SDL_Window * window,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue