From 42302d0a59dfefba37d2dc92a7a00621b76fc04e Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" 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 1185f4222..514580fa4 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 89e9ebbc1..709f813ee 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 */