SDL: x11: Let apps specify a custom _NET_WM_WINDOW_TYPE.

From 42302d0a59dfefba37d2dc92a7a00621b76fc04e Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Tue, 11 Jan 2022 21:17:21 -0500
Subject: [PATCH] x11: Let apps specify a custom _NET_WM_WINDOW_TYPE.

Fixes #5185.
---
 include/SDL_hints.h           | 21 +++++++++++++++++++++
 src/video/x11/SDL_x11window.c |  3 +++
 2 files changed, 24 insertions(+)

diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 1185f42229b..514580fa43b 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -1824,6 +1824,27 @@ extern "C" {
  */
 #define SDL_HINT_AUDIO_INCLUDE_MONITORS "SDL_AUDIO_INCLUDE_MONITORS"
 
+/**
+ *  \brief  A variable that forces X11 windows to create as a custom type.
+ *
+ *  This is currently only used for X11 and ignored elsewhere.
+ *
+ *  During SDL_CreateWindow, SDL uses the _NET_WM_WINDOW_TYPE X11 property
+ *  to report to the window manager the type of window it wants to create.
+ *  This might be set to various things if SDL_WINDOW_TOOLTIP or
+ *  SDL_WINDOW_POPUP_MENU, etc, were specified. For "normal" windows that
+ *  haven't set a specific type, this hint can be used to specify a custom
+ *  type. For example, a dock window might set this to
+ *  "_NET_WM_WINDOW_TYPE_DOCK".
+ *
+ *  If not set or set to "", this hint is ignored. This hint must be set
+ *  before the SDL_CreateWindow() call that it is intended to affect.
+ *
+ *  This hint is available since SDL 2.0.22. Before then, virtual devices are
+ *  always ignored.
+ */
+#define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE"
+
 
 /**
  *  \brief  An enumeration of hint priorities
diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c
index 89e9ebbc1dd..709f813eeb1 100644
--- a/src/video/x11/SDL_x11window.c
+++ b/src/video/x11/SDL_x11window.c
@@ -392,6 +392,7 @@ X11_CreateWindow(_THIS, SDL_Window * window)
     long compositor = 1;
     Atom _NET_WM_PID;
     long fevent = 0;
+    const char *hint = NULL;
 
 #if SDL_VIDEO_OPENGL_GLX || SDL_VIDEO_OPENGL_EGL
     const char *forced_visual_id = SDL_GetHint(SDL_HINT_VIDEO_X11_WINDOW_VISUALID);
@@ -591,6 +592,8 @@ X11_CreateWindow(_THIS, SDL_Window * window)
         wintype_name = "_NET_WM_WINDOW_TYPE_TOOLTIP";
     } else if (window->flags & SDL_WINDOW_POPUP_MENU) {
         wintype_name = "_NET_WM_WINDOW_TYPE_POPUP_MENU";
+    } else if ( ((hint = SDL_GetHint(SDL_HINT_X11_WINDOW_TYPE)) != NULL) && *hint ) {
+        wintype_name = hint;
     } else {
         wintype_name = "_NET_WM_WINDOW_TYPE_NORMAL";
         compositor = 1;  /* disable compositing for "normal" windows */