src/video/windows/SDL_windowsmodes.c
author Ryan C. Gordon <icculus@icculus.org>
Tue, 23 Oct 2018 01:34:03 -0400
branchSDL-ryan-batching-renderer
changeset 12352 2b1707cc57fc
parent 11811 5d94cb6b24d3
child 12503 806492103856
permissions -rw-r--r--
render: Add floating point versions of various draw APIs.
slouken@1895
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@11811
     3
  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
slouken@1895
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@1895
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@1895
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@1895
    20
*/
icculus@8093
    21
#include "../../SDL_internal.h"
slouken@1895
    22
slouken@6044
    23
#if SDL_VIDEO_DRIVER_WINDOWS
slouken@6044
    24
slouken@5062
    25
#include "SDL_windowsvideo.h"
icculus@10031
    26
#include "../../../include/SDL_assert.h"
slouken@11218
    27
#include "../../../include/SDL_log.h"
slouken@1895
    28
slouken@5086
    29
/* Windows CE compatibility */
slouken@5086
    30
#ifndef CDS_FULLSCREEN
slouken@5086
    31
#define CDS_FULLSCREEN 0
slouken@5086
    32
#endif
slouken@1895
    33
slouken@11218
    34
/* #define DEBUG_MODES */
alfred@9813
    35
slouken@10117
    36
static void
slouken@10117
    37
WIN_UpdateDisplayMode(_THIS, LPCTSTR deviceName, DWORD index, SDL_DisplayMode * mode)
slouken@1895
    38
{
slouken@10117
    39
    SDL_DisplayModeData *data = (SDL_DisplayModeData *) mode->driverdata;
slouken@1895
    40
    HDC hdc;
slouken@1895
    41
slouken@1895
    42
    data->DeviceMode.dmFields =
slouken@1895
    43
        (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY |
slouken@1895
    44
         DM_DISPLAYFLAGS);
slouken@1895
    45
slouken@1913
    46
    if (index == ENUM_CURRENT_SETTINGS
slouken@1913
    47
        && (hdc = CreateDC(deviceName, NULL, NULL, NULL)) != NULL) {
slouken@1895
    48
        char bmi_data[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];
slouken@1895
    49
        LPBITMAPINFO bmi;
slouken@1895
    50
        HBITMAP hbm;
slouken@9889
    51
        int logical_width = GetDeviceCaps( hdc, HORZRES );
slouken@9889
    52
        int logical_height = GetDeviceCaps( hdc, VERTRES );
slouken@8086
    53
slouken@9889
    54
        mode->w = logical_width;
slouken@9889
    55
        mode->h = logical_height;
slouken@9889
    56
        
slouken@1895
    57
        SDL_zero(bmi_data);
slouken@1895
    58
        bmi = (LPBITMAPINFO) bmi_data;
slouken@1895
    59
        bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
slouken@1895
    60
slouken@1895
    61
        hbm = CreateCompatibleBitmap(hdc, 1, 1);
slouken@1895
    62
        GetDIBits(hdc, hbm, 0, 1, NULL, bmi, DIB_RGB_COLORS);
slouken@1895
    63
        GetDIBits(hdc, hbm, 0, 1, NULL, bmi, DIB_RGB_COLORS);
slouken@1895
    64
        DeleteObject(hbm);
slouken@1895
    65
        DeleteDC(hdc);
slouken@1895
    66
        if (bmi->bmiHeader.biCompression == BI_BITFIELDS) {
slouken@1895
    67
            switch (*(Uint32 *) bmi->bmiColors) {
slouken@1895
    68
            case 0x00FF0000:
slouken@1965
    69
                mode->format = SDL_PIXELFORMAT_RGB888;
slouken@1895
    70
                break;
slouken@1895
    71
            case 0x000000FF:
slouken@1965
    72
                mode->format = SDL_PIXELFORMAT_BGR888;
slouken@1895
    73
                break;
slouken@1895
    74
            case 0xF800:
slouken@1965
    75
                mode->format = SDL_PIXELFORMAT_RGB565;
slouken@1895
    76
                break;
slouken@1895
    77
            case 0x7C00:
slouken@1965
    78
                mode->format = SDL_PIXELFORMAT_RGB555;
slouken@1895
    79
                break;
slouken@1895
    80
            }
slouken@1895
    81
        } else if (bmi->bmiHeader.biBitCount == 8) {
slouken@1965
    82
            mode->format = SDL_PIXELFORMAT_INDEX8;
lestat@3175
    83
        } else if (bmi->bmiHeader.biBitCount == 4) {
lestat@3175
    84
            mode->format = SDL_PIXELFORMAT_INDEX4LSB;
slouken@1895
    85
        }
slouken@10117
    86
    } else if (mode->format == SDL_PIXELFORMAT_UNKNOWN) {
slouken@1913
    87
        /* FIXME: Can we tell what this will be? */
slouken@10117
    88
        if ((data->DeviceMode.dmFields & DM_BITSPERPEL) == DM_BITSPERPEL) {
slouken@10117
    89
            switch (data->DeviceMode.dmBitsPerPel) {
lestat@3175
    90
            case 32:
lestat@3175
    91
                mode->format = SDL_PIXELFORMAT_RGB888;
lestat@3175
    92
                break;
lestat@3175
    93
            case 24:
lestat@3175
    94
                mode->format = SDL_PIXELFORMAT_RGB24;
lestat@3175
    95
                break;
lestat@3175
    96
            case 16:
lestat@3175
    97
                mode->format = SDL_PIXELFORMAT_RGB565;
lestat@3175
    98
                break;
lestat@3175
    99
            case 15:
lestat@3175
   100
                mode->format = SDL_PIXELFORMAT_RGB555;
lestat@3175
   101
                break;
lestat@3175
   102
            case 8:
lestat@3175
   103
                mode->format = SDL_PIXELFORMAT_INDEX8;
lestat@3175
   104
                break;
lestat@3175
   105
            case 4:
lestat@3175
   106
                mode->format = SDL_PIXELFORMAT_INDEX4LSB;
lestat@3175
   107
                break;
lestat@3175
   108
            }
slouken@3186
   109
        }
slouken@1895
   110
    }
slouken@10117
   111
}
slouken@10117
   112
slouken@10117
   113
static SDL_bool
slouken@10117
   114
WIN_GetDisplayMode(_THIS, LPCTSTR deviceName, DWORD index, SDL_DisplayMode * mode)
slouken@10117
   115
{
slouken@10117
   116
    SDL_DisplayModeData *data;
slouken@10117
   117
    DEVMODE devmode;
slouken@10117
   118
slouken@10117
   119
    devmode.dmSize = sizeof(devmode);
slouken@10117
   120
    devmode.dmDriverExtra = 0;
slouken@10117
   121
    if (!EnumDisplaySettings(deviceName, index, &devmode)) {
slouken@10117
   122
        return SDL_FALSE;
slouken@10117
   123
    }
slouken@10117
   124
slouken@10117
   125
    data = (SDL_DisplayModeData *) SDL_malloc(sizeof(*data));
slouken@10117
   126
    if (!data) {
slouken@10117
   127
        return SDL_FALSE;
slouken@10117
   128
    }
slouken@10117
   129
slouken@10117
   130
    mode->driverdata = data;
slouken@10117
   131
    data->DeviceMode = devmode;
slouken@10117
   132
slouken@10117
   133
    mode->format = SDL_PIXELFORMAT_UNKNOWN;
slouken@10117
   134
    mode->w = data->DeviceMode.dmPelsWidth;
slouken@10117
   135
    mode->h = data->DeviceMode.dmPelsHeight;
slouken@10117
   136
    mode->refresh_rate = data->DeviceMode.dmDisplayFrequency;
slouken@10117
   137
slouken@10117
   138
    /* Fill in the mode information */
slouken@10117
   139
    WIN_UpdateDisplayMode(_this, deviceName, index, mode);
slouken@1895
   140
    return SDL_TRUE;
slouken@1895
   141
}
slouken@1895
   142
slouken@2149
   143
static SDL_bool
slouken@11218
   144
WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEX *info)
slouken@2119
   145
{
slouken@2119
   146
    SDL_VideoDisplay display;
slouken@2119
   147
    SDL_DisplayData *displaydata;
slouken@2119
   148
    SDL_DisplayMode mode;
slouken@6793
   149
    DISPLAY_DEVICE device;
slouken@2119
   150
slouken@2119
   151
#ifdef DEBUG_MODES
slouken@11218
   152
    SDL_Log("Display: %s\n", WIN_StringToUTF8(info->szDevice));
slouken@2119
   153
#endif
slouken@11218
   154
slouken@11218
   155
    if (!WIN_GetDisplayMode(_this, info->szDevice, ENUM_CURRENT_SETTINGS, &mode)) {
slouken@2149
   156
        return SDL_FALSE;
slouken@2119
   157
    }
slouken@2119
   158
slouken@2119
   159
    displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata));
slouken@2119
   160
    if (!displaydata) {
slouken@2149
   161
        return SDL_FALSE;
slouken@2119
   162
    }
slouken@11218
   163
    SDL_memcpy(displaydata->DeviceName, info->szDevice,
slouken@2119
   164
               sizeof(displaydata->DeviceName));
slouken@11218
   165
    displaydata->MonitorHandle = hMonitor;
slouken@2119
   166
slouken@2119
   167
    SDL_zero(display);
slouken@6793
   168
    device.cb = sizeof(device);
slouken@11218
   169
    if (EnumDisplayDevices(info->szDevice, 0, &device, 0)) {
slouken@6793
   170
        display.name = WIN_StringToUTF8(device.DeviceString);
slouken@6793
   171
    }
slouken@2119
   172
    display.desktop_mode = mode;
slouken@2119
   173
    display.current_mode = mode;
slouken@2119
   174
    display.driverdata = displaydata;
slouken@2119
   175
    SDL_AddVideoDisplay(&display);
slouken@6793
   176
    SDL_free(display.name);
slouken@2149
   177
    return SDL_TRUE;
slouken@2119
   178
}
slouken@2119
   179
slouken@11218
   180
typedef struct _WIN_AddDisplaysData {
slouken@11218
   181
    SDL_VideoDevice *video_device;
slouken@11218
   182
    SDL_bool want_primary;
slouken@11218
   183
} WIN_AddDisplaysData;
slouken@11218
   184
slouken@11218
   185
static BOOL CALLBACK
slouken@11218
   186
WIN_AddDisplaysCallback(HMONITOR hMonitor,
slouken@11218
   187
                        HDC      hdcMonitor,
slouken@11218
   188
                        LPRECT   lprcMonitor,
slouken@11218
   189
                        LPARAM   dwData)
slouken@11218
   190
{
slouken@11218
   191
    WIN_AddDisplaysData *data = (WIN_AddDisplaysData*)dwData;
slouken@11218
   192
    MONITORINFOEX info;
slouken@11218
   193
slouken@11218
   194
    SDL_zero(info);
slouken@11218
   195
    info.cbSize = sizeof(info);
slouken@11218
   196
slouken@11218
   197
    if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&info) != 0) {
slouken@11218
   198
        const SDL_bool is_primary = ((info.dwFlags & MONITORINFOF_PRIMARY) == MONITORINFOF_PRIMARY);
slouken@11218
   199
slouken@11218
   200
        if (is_primary == data->want_primary) {
slouken@11218
   201
            WIN_AddDisplay(data->video_device, hMonitor, &info);
slouken@11218
   202
        }
slouken@11218
   203
    }
slouken@11218
   204
slouken@11218
   205
    // continue enumeration
slouken@11218
   206
    return TRUE;
slouken@11218
   207
}
slouken@11218
   208
slouken@11218
   209
static void
slouken@11218
   210
WIN_AddDisplays(_THIS)
slouken@11218
   211
{
slouken@11218
   212
    WIN_AddDisplaysData callback_data;
slouken@11218
   213
    callback_data.video_device = _this;
slouken@11218
   214
slouken@11218
   215
    callback_data.want_primary = SDL_TRUE;
slouken@11218
   216
    EnumDisplayMonitors(NULL, NULL, WIN_AddDisplaysCallback, (LPARAM)&callback_data);
slouken@11218
   217
slouken@11218
   218
    callback_data.want_primary = SDL_FALSE;
slouken@11218
   219
    EnumDisplayMonitors(NULL, NULL, WIN_AddDisplaysCallback, (LPARAM)&callback_data);
slouken@11218
   220
}
slouken@11218
   221
slouken@3521
   222
int
slouken@1895
   223
WIN_InitModes(_THIS)
slouken@1895
   224
{
slouken@11218
   225
    WIN_AddDisplays(_this);
slouken@1895
   226
slouken@3521
   227
    if (_this->num_displays == 0) {
icculus@7037
   228
        return SDL_SetError("No displays available");
slouken@3521
   229
    }
slouken@3521
   230
    return 0;
slouken@1895
   231
}
slouken@1895
   232
slouken@3528
   233
int
slouken@3528
   234
WIN_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect)
slouken@3528
   235
{
slouken@11218
   236
    const SDL_DisplayData *data = (const SDL_DisplayData *)display->driverdata;
slouken@11218
   237
    MONITORINFO minfo;
slouken@11218
   238
    BOOL rc;
slouken@3528
   239
slouken@11218
   240
    SDL_zero(minfo);
slouken@11218
   241
    minfo.cbSize = sizeof(MONITORINFO);
slouken@11218
   242
    rc = GetMonitorInfo(data->MonitorHandle, &minfo);
slouken@11218
   243
slouken@11218
   244
    if (!rc) {
slouken@11218
   245
        return SDL_SetError("Couldn't find monitor data");
slouken@11218
   246
    }
slouken@11218
   247
slouken@11218
   248
    rect->x = minfo.rcMonitor.left;
slouken@11218
   249
    rect->y = minfo.rcMonitor.top;
slouken@11218
   250
    rect->w = minfo.rcMonitor.right - minfo.rcMonitor.left;
slouken@11218
   251
    rect->h = minfo.rcMonitor.bottom - minfo.rcMonitor.top;
icculus@6430
   252
slouken@3528
   253
    return 0;
slouken@3528
   254
}
slouken@3528
   255
alfred@9813
   256
int
slouken@11218
   257
WIN_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi_out, float * hdpi_out, float * vdpi_out)
alfred@9813
   258
{
slouken@11218
   259
    const SDL_DisplayData *displaydata = (SDL_DisplayData *)display->driverdata;
slouken@11218
   260
    const SDL_VideoData *videodata = (SDL_VideoData *)display->device->driverdata;
slouken@11218
   261
    float hdpi = 0, vdpi = 0, ddpi = 0;
slouken@11218
   262
    
slouken@11218
   263
    if (videodata->GetDpiForMonitor) {
slouken@11218
   264
        UINT hdpi_uint, vdpi_uint;
slouken@11218
   265
        // Windows 8.1+ codepath
slouken@11218
   266
        if (videodata->GetDpiForMonitor(displaydata->MonitorHandle, MDT_EFFECTIVE_DPI, &hdpi_uint, &vdpi_uint) == S_OK) {
slouken@11218
   267
            // GetDpiForMonitor docs promise to return the same hdpi/vdpi
slouken@11218
   268
            hdpi = (float)hdpi_uint;
slouken@11218
   269
            vdpi = (float)hdpi_uint;
slouken@11218
   270
            ddpi = (float)hdpi_uint;
slouken@11218
   271
        } else {
slouken@11218
   272
            return SDL_SetError("GetDpiForMonitor failed");
slouken@11218
   273
        }
slouken@11218
   274
    } else {
slouken@11218
   275
        // Window 8.0 and below: same DPI for all monitors.
slouken@11218
   276
        HDC hdc;
slouken@11218
   277
        int hdpi_int, vdpi_int, hpoints, vpoints, hpix, vpix;
slouken@11218
   278
        float hinches, vinches;
alfred@9813
   279
slouken@11218
   280
        hdc = GetDC(NULL);
slouken@11218
   281
        if (hdc == NULL) {
slouken@11218
   282
            return SDL_SetError("GetDC failed");
slouken@11218
   283
        }
slouken@11218
   284
        hdpi_int = GetDeviceCaps(hdc, LOGPIXELSX);
slouken@11218
   285
        vdpi_int = GetDeviceCaps(hdc, LOGPIXELSY);
slouken@11218
   286
        ReleaseDC(NULL, hdc);
slouken@11218
   287
slouken@11218
   288
        hpoints = GetSystemMetrics(SM_CXVIRTUALSCREEN);
slouken@11218
   289
        vpoints = GetSystemMetrics(SM_CYVIRTUALSCREEN);
slouken@11218
   290
slouken@11218
   291
        hpix = MulDiv(hpoints, hdpi_int, 96);
slouken@11218
   292
        vpix = MulDiv(vpoints, vdpi_int, 96);
slouken@11218
   293
slouken@11218
   294
        hinches = (float)hpoints / 96.0f;
slouken@11218
   295
        vinches = (float)vpoints / 96.0f;
slouken@11218
   296
slouken@11218
   297
        hdpi = (float)hdpi_int;
slouken@11218
   298
        vdpi = (float)vdpi_int;
slouken@11218
   299
        ddpi = SDL_ComputeDiagonalDPI(hpix, vpix, hinches, vinches);
slouken@9889
   300
    }
alfred@9813
   301
slouken@11218
   302
    if (ddpi_out) {
slouken@11218
   303
        *ddpi_out = ddpi;
slouken@11218
   304
    }
slouken@11218
   305
    if (hdpi_out) {
slouken@11218
   306
        *hdpi_out = hdpi;
slouken@11218
   307
    }
slouken@11218
   308
    if (vdpi_out) {
slouken@11218
   309
        *vdpi_out = vdpi;
slouken@11218
   310
    }
slouken@11218
   311
slouken@11218
   312
    return ddpi != 0.0f ? 0 : SDL_SetError("Couldn't get DPI");
alfred@9813
   313
}
alfred@9813
   314
icculus@10019
   315
int
icculus@10019
   316
WIN_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect)
icculus@10019
   317
{
slouken@11218
   318
    const SDL_DisplayData *data = (const SDL_DisplayData *)display->driverdata;
icculus@10019
   319
    MONITORINFO minfo;
slouken@11218
   320
    BOOL rc;
icculus@10019
   321
slouken@11218
   322
    SDL_zero(minfo);
slouken@11218
   323
    minfo.cbSize = sizeof(MONITORINFO);
slouken@11218
   324
    rc = GetMonitorInfo(data->MonitorHandle, &minfo);
icculus@10019
   325
icculus@10019
   326
    if (!rc) {
icculus@10019
   327
        return SDL_SetError("Couldn't find monitor data");
icculus@10019
   328
    }
icculus@10019
   329
slouken@11218
   330
    rect->x = minfo.rcWork.left;
slouken@11218
   331
    rect->y = minfo.rcWork.top;
slouken@11218
   332
    rect->w = minfo.rcWork.right - minfo.rcWork.left;
slouken@11218
   333
    rect->h = minfo.rcWork.bottom - minfo.rcWork.top;
icculus@10019
   334
icculus@10019
   335
    return 0;
icculus@10019
   336
}
icculus@10019
   337
slouken@1895
   338
void
slouken@3500
   339
WIN_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
slouken@1895
   340
{
slouken@3500
   341
    SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata;
slouken@1895
   342
    DWORD i;
slouken@1895
   343
    SDL_DisplayMode mode;
slouken@1895
   344
slouken@1895
   345
    for (i = 0;; ++i) {
alfred@9813
   346
        if (!WIN_GetDisplayMode(_this, data->DeviceName, i, &mode)) {
slouken@1895
   347
            break;
slouken@1895
   348
        }
slouken@5305
   349
        if (SDL_ISPIXELFORMAT_INDEXED(mode.format)) {
slouken@5305
   350
            /* We don't support palettized modes now */
gabomdq@7102
   351
            SDL_free(mode.driverdata);
slouken@5305
   352
            continue;
slouken@5305
   353
        }
slouken@3521
   354
        if (mode.format != SDL_PIXELFORMAT_UNKNOWN) {
slouken@3500
   355
            if (!SDL_AddDisplayMode(display, &mode)) {
lestat@3175
   356
                SDL_free(mode.driverdata);
slouken@3186
   357
            }
slouken@8086
   358
        } else {
gabomdq@7102
   359
            SDL_free(mode.driverdata);
gabomdq@7102
   360
        }
slouken@1895
   361
    }
slouken@1895
   362
}
slouken@1895
   363
slouken@1895
   364
int
slouken@3500
   365
WIN_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
slouken@1895
   366
{
slouken@3500
   367
    SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
slouken@1895
   368
    SDL_DisplayModeData *data = (SDL_DisplayModeData *) mode->driverdata;
slouken@1895
   369
    LONG status;
slouken@3139
   370
slouken@8795
   371
    if (mode->driverdata == display->desktop_mode.driverdata) {
slime73@10179
   372
        status = ChangeDisplaySettingsEx(displaydata->DeviceName, NULL, NULL, CDS_FULLSCREEN, NULL);
slouken@8795
   373
    } else {
slouken@8795
   374
        status = ChangeDisplaySettingsEx(displaydata->DeviceName, &data->DeviceMode, NULL, CDS_FULLSCREEN, NULL);
slouken@8795
   375
    }
slouken@5305
   376
    if (status != DISP_CHANGE_SUCCESSFUL) {
slouken@1895
   377
        const char *reason = "Unknown reason";
slouken@1895
   378
        switch (status) {
slouken@1895
   379
        case DISP_CHANGE_BADFLAGS:
slouken@1895
   380
            reason = "DISP_CHANGE_BADFLAGS";
slouken@1895
   381
            break;
slouken@1895
   382
        case DISP_CHANGE_BADMODE:
slouken@1895
   383
            reason = "DISP_CHANGE_BADMODE";
slouken@1895
   384
            break;
slouken@1895
   385
        case DISP_CHANGE_BADPARAM:
slouken@1895
   386
            reason = "DISP_CHANGE_BADPARAM";
slouken@1895
   387
            break;
slouken@1895
   388
        case DISP_CHANGE_FAILED:
slouken@1895
   389
            reason = "DISP_CHANGE_FAILED";
slouken@1895
   390
            break;
slouken@1895
   391
        }
icculus@7037
   392
        return SDL_SetError("ChangeDisplaySettingsEx() failed: %s", reason);
slouken@1895
   393
    }
slouken@5305
   394
    EnumDisplaySettings(displaydata->DeviceName, ENUM_CURRENT_SETTINGS, &data->DeviceMode);
slouken@10117
   395
    WIN_UpdateDisplayMode(_this, displaydata->DeviceName, ENUM_CURRENT_SETTINGS, mode);
slouken@5305
   396
    return 0;
slouken@1895
   397
}
slouken@1895
   398
slouken@1895
   399
void
slouken@1895
   400
WIN_QuitModes(_THIS)
slouken@1895
   401
{
slouken@5305
   402
    /* All fullscreen windows should have restored modes by now */
slouken@1895
   403
}
slouken@1895
   404
slouken@6044
   405
#endif /* SDL_VIDEO_DRIVER_WINDOWS */
slouken@6044
   406
slouken@1895
   407
/* vi: set ts=4 sw=4 expandtab: */