From c8fa870b36fb6e682746051fb6e42af5280c6151 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Fri, 23 Jan 2026 10:55:17 -0800
Subject: [PATCH] Don't load libdecor if SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR
is false
Fixes https://github.com/libsdl-org/SDL/issues/14887
(cherry picked from commit fe403220f06ed65cfc8993598049669b5eedf759)
---
src/video/wayland/SDL_waylanddyn.c | 18 ++++++++++++------
src/video/wayland/SDL_waylandvideo.c | 4 ----
2 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/src/video/wayland/SDL_waylanddyn.c b/src/video/wayland/SDL_waylanddyn.c
index a32f1a09d498a..f95404337a672 100644
--- a/src/video/wayland/SDL_waylanddyn.c
+++ b/src/video/wayland/SDL_waylanddyn.c
@@ -71,23 +71,25 @@ typedef struct
{
SDL_SharedObject *lib;
const char *libname;
+ const char *hint;
+ bool hint_default;
} waylanddynlib;
static waylanddynlib waylandlibs[] = {
- { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC },
+ { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC, NULL, false },
#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL
- { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL },
+ { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL, NULL, false },
#endif
#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR
- { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR },
+ { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR, NULL, false },
#endif
#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON
- { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON },
+ { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON, NULL, false },
#endif
#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR
- { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR },
+ { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR, SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR, true },
#endif
- { NULL, NULL }
+ { NULL, NULL, NULL, false }
};
static void *WAYLAND_GetSym(const char *fnname, int *pHasModule, bool required)
@@ -173,6 +175,10 @@ bool SDL_WAYLAND_LoadSymbols(void)
int *thismod = NULL;
for (i = 0; i < SDL_arraysize(waylandlibs); i++) {
if (waylandlibs[i].libname) {
+ if (waylandlibs[i].hint &&
+ !SDL_GetHintBoolean(waylandlibs[i].hint, waylandlibs[i].hint_default)) {
+ continue;
+ }
waylandlibs[i].lib = SDL_LoadObject(waylandlibs[i].libname);
}
}
diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
index e7f41d8cf1c99..36ec2aca66357 100644
--- a/src/video/wayland/SDL_waylandvideo.c
+++ b/src/video/wayland/SDL_waylandvideo.c
@@ -1397,10 +1397,6 @@ static bool should_use_libdecor(SDL_VideoData *data, bool ignore_xdg)
return false;
}
- if (!SDL_GetHintBoolean(SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR, true)) {
- return false;
- }
-
if (SDL_GetHintBoolean(SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR, false)) {
return true;
}