From dec7875a6e23212021e4d9080330a42832dfe02a Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Tue, 15 Jun 2021 01:40:19 +0000
Subject: [PATCH] update SDL soruce to 2.0.14
---
source/src/video/windows/SDL_windowsmodes.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 49 insertions(+), 9 deletions(-)
diff --git a/source/src/video/windows/SDL_windowsmodes.c b/source/src/video/windows/SDL_windowsmodes.c
index c3187b7..d3af5b1 100644
--- a/source/src/video/windows/SDL_windowsmodes.c
+++ b/source/src/video/windows/SDL_windowsmodes.c
@@ -23,8 +23,6 @@
#if SDL_VIDEO_DRIVER_WINDOWS
#include "SDL_windowsvideo.h"
-#include "../../../include/SDL_assert.h"
-#include "../../../include/SDL_log.h"
/* Windows CE compatibility */
#ifndef CDS_FULLSCREEN
@@ -141,8 +139,9 @@
}
static SDL_bool
-WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEX *info)
+WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEXW *info, SDL_bool send_event)
{
+ int i;
SDL_VideoDisplay display;
SDL_DisplayData *displaydata;
SDL_DisplayMode mode;
@@ -156,6 +155,18 @@
return SDL_FALSE;
}
+ // Prevent adding duplicate displays. Do this after we know the display is
+ // ready to be added to allow any displays that we can't fully query to be
+ // removed
+ for(i = 0; i < _this->num_displays; ++i) {
+ SDL_DisplayData *driverdata = (SDL_DisplayData *)_this->displays[i].driverdata;
+ if (SDL_wcscmp(driverdata->DeviceName, info->szDevice) == 0) {
+ driverdata->MonitorHandle = hMonitor;
+ driverdata->IsValid = SDL_TRUE;
+ return SDL_FALSE;
+ }
+ }
+
displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata));
if (!displaydata) {
return SDL_FALSE;
@@ -163,6 +174,7 @@
SDL_memcpy(displaydata->DeviceName, info->szDevice,
sizeof(displaydata->DeviceName));
displaydata->MonitorHandle = hMonitor;
+ displaydata->IsValid = SDL_TRUE;
SDL_zero(display);
device.cb = sizeof(device);
@@ -172,13 +184,14 @@
display.desktop_mode = mode;
display.current_mode = mode;
display.driverdata = displaydata;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, send_event);
SDL_free(display.name);
return SDL_TRUE;
}
typedef struct _WIN_AddDisplaysData {
SDL_VideoDevice *video_device;
+ SDL_bool send_event;
SDL_bool want_primary;
} WIN_AddDisplaysData;
@@ -189,16 +202,16 @@
LPARAM dwData)
{
WIN_AddDisplaysData *data = (WIN_AddDisplaysData*)dwData;
- MONITORINFOEX info;
+ MONITORINFOEXW info;
SDL_zero(info);
info.cbSize = sizeof(info);
- if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&info) != 0) {
+ if (GetMonitorInfoW(hMonitor, (LPMONITORINFO)&info) != 0) {
const SDL_bool is_primary = ((info.dwFlags & MONITORINFOF_PRIMARY) == MONITORINFOF_PRIMARY);
if (is_primary == data->want_primary) {
- WIN_AddDisplay(data->video_device, hMonitor, &info);
+ WIN_AddDisplay(data->video_device, hMonitor, &info, data->send_event);
}
}
@@ -207,10 +220,11 @@
}
static void
-WIN_AddDisplays(_THIS)
+WIN_AddDisplays(_THIS, SDL_bool send_event)
{
WIN_AddDisplaysData callback_data;
callback_data.video_device = _this;
+ callback_data.send_event = send_event;
callback_data.want_primary = SDL_TRUE;
EnumDisplayMonitors(NULL, NULL, WIN_AddDisplaysCallback, (LPARAM)&callback_data);
@@ -222,7 +236,7 @@
int
WIN_InitModes(_THIS)
{
- WIN_AddDisplays(_this);
+ WIN_AddDisplays(_this, SDL_FALSE);
if (_this->num_displays == 0) {
return SDL_SetError("No displays available");
@@ -397,6 +411,32 @@
}
void
+WIN_RefreshDisplays(_THIS)
+{
+ int i;
+
+ // Mark all displays as potentially invalid to detect
+ // entries that have actually been removed
+ for (i = 0; i < _this->num_displays; ++i) {
+ SDL_DisplayData *driverdata = (SDL_DisplayData *)_this->displays[i].driverdata;
+ driverdata->IsValid = SDL_FALSE;
+ }
+
+ // Enumerate displays to add any new ones and mark still
+ // connected entries as valid
+ WIN_AddDisplays(_this, SDL_TRUE);
+
+ // Delete any entries still marked as invalid, iterate
+ // in reverse as each delete takes effect immediately
+ for (i = _this->num_displays - 1; i >= 0; --i) {
+ SDL_DisplayData *driverdata = (SDL_DisplayData *)_this->displays[i].driverdata;
+ if (driverdata->IsValid == SDL_FALSE) {
+ SDL_DelVideoDisplay(i);
+ }
+ }
+}
+
+void
WIN_QuitModes(_THIS)
{
/* All fullscreen windows should have restored modes by now */
--
Gitblit v1.9.3