From b984846dd0639c9f80926e5dadbf6f4043041b5f Mon Sep 17 00:00:00 2001
From: Esme <[EMAIL REDACTED]>
Date: Fri, 21 Nov 2025 18:55:49 +0000
Subject: [PATCH] windows: Add property mapping displayID to HMONITOR. (#14494)
---
include/SDL3/SDL_video.h | 6 ++++++
src/video/windows/SDL_windowsmodes.c | 6 ++++++
2 files changed, 12 insertions(+)
diff --git a/include/SDL3/SDL_video.h b/include/SDL3/SDL_video.h
index f5f92fcd1946b..5d13231dc32db 100644
--- a/include/SDL3/SDL_video.h
+++ b/include/SDL3/SDL_video.h
@@ -665,6 +665,11 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetPrimaryDisplay(void);
* - `SDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER`: the wl_output associated
* with the display
*
+ * On Windows:
+ *
+ * - `SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER`: the monitor handle (HMONITOR)
+ * associated with the display
+ *
* \param displayID the instance ID of the display to query.
* \returns a valid property ID on success or 0 on failure; call
* SDL_GetError() for more information.
@@ -678,6 +683,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_Displa
#define SDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN "SDL.display.HDR_enabled"
#define SDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER "SDL.display.KMSDRM.panel_orientation"
#define SDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER "SDL.display.wayland.wl_output"
+#define SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER "SDL.display.windows.hmonitor"
/**
* Get the name of a display in UTF-8 encoding.
diff --git a/src/video/windows/SDL_windowsmodes.c b/src/video/windows/SDL_windowsmodes.c
index 6123d8232c78f..e287f01d882e9 100644
--- a/src/video/windows/SDL_windowsmodes.c
+++ b/src/video/windows/SDL_windowsmodes.c
@@ -605,6 +605,9 @@ static void WIN_AddDisplay(SDL_VideoDevice *_this, HMONITOR hMonitor, const MONI
internal->MonitorHandle = hMonitor;
internal->state = DisplayUnchanged;
+ SDL_PropertiesID props = SDL_GetDisplayProperties(_this->displays[i]->id);
+ SDL_SetPointerProperty(props, SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER, hMonitor);
+
if (!_this->setting_display_mode) {
SDL_VideoDisplay *existing_display = _this->displays[i];
SDL_Rect bounds;
@@ -665,6 +668,9 @@ static void WIN_AddDisplay(SDL_VideoDevice *_this, HMONITOR hMonitor, const MONI
if (SDL_AddVideoDisplay(&display, false)) {
// The mode is owned by the video subsystem
mode.internal = NULL;
+
+ SDL_PropertiesID props = SDL_GetDisplayProperties(display.id);
+ SDL_SetPointerProperty(props, SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER, hMonitor);
} else {
SDL_free(displaydata);
}