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