From 6c3cc3587d6d42f487d04a0634cace127c3a1b04 Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Sun, 5 Oct 2025 04:33:55 +0300
Subject: [PATCH] zenity dialog: make sure that --modal --attach switches are
supported.
Reference issue: https://github.com/libsdl-org/SDL/issues/14140
---
src/dialog/unix/SDL_zenitydialog.c | 8 +++++++-
src/dialog/unix/SDL_zenitymessagebox.c | 4 ++--
src/dialog/unix/SDL_zenitymessagebox.h | 1 +
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/dialog/unix/SDL_zenitydialog.c b/src/dialog/unix/SDL_zenitydialog.c
index 4632c8e16a2b6..cf005208a2a37 100644
--- a/src/dialog/unix/SDL_zenitydialog.c
+++ b/src/dialog/unix/SDL_zenitydialog.c
@@ -21,6 +21,8 @@
#include "SDL_internal.h"
#include "../SDL_dialog_utils.h"
+#include "SDL_zenitydialog.h"
+#include "SDL_zenitymessagebox.h"
#define X11_HANDLE_MAX_WIDTH 28
typedef struct
@@ -88,6 +90,7 @@ static bool get_x11_window_handle(SDL_PropertiesID props, char *out)
static zenityArgs *create_zenity_args(SDL_FileDialogType type, SDL_DialogFileCallback callback, void *userdata, SDL_PropertiesID props)
{
zenityArgs *args = SDL_calloc(1, sizeof(*args));
+ int zenity_major = 0, zenity_minor = 0;
if (!args) {
return NULL;
}
@@ -110,6 +113,8 @@ static zenityArgs *create_zenity_args(SDL_FileDialogType type, SDL_DialogFileCal
}
args->argv = argv;
+ SDL_get_zenity_version(&zenity_major, &zenity_minor);
+
/* Properties can be destroyed as soon as the function returns; copy over what we need. */
#define COPY_STRING_PROPERTY(dst, prop) \
{ \
@@ -158,7 +163,8 @@ static zenityArgs *create_zenity_args(SDL_FileDialogType type, SDL_DialogFileCal
argv[argc++] = args->filename;
}
- if (get_x11_window_handle(props, args->x11_window_handle)) {
+ if (get_x11_window_handle(props, args->x11_window_handle) &&
+ (zenity_major > 3 || (zenity_major == 3 && zenity_minor >= 6))) {
argv[argc++] = "--modal";
argv[argc++] = "--attach";
argv[argc++] = args->x11_window_handle;
diff --git a/src/dialog/unix/SDL_zenitymessagebox.c b/src/dialog/unix/SDL_zenitymessagebox.c
index 01ca673d3c26d..0701b0418eb0a 100644
--- a/src/dialog/unix/SDL_zenitymessagebox.c
+++ b/src/dialog/unix/SDL_zenitymessagebox.c
@@ -53,7 +53,7 @@ static bool parse_zenity_version(const char *version, int *major, int *minor)
return true;
}
-static bool get_zenity_version(int *major, int *minor)
+bool SDL_get_zenity_version(int *major, int *minor)
{
const char *argv[] = { "zenity", "--version", NULL };
bool result = false;
@@ -87,7 +87,7 @@ bool SDL_Zenity_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *bu
}
// get zenity version so we know which arg to use
- if (!get_zenity_version(&zenity_major, &zenity_minor)) {
+ if (!SDL_get_zenity_version(&zenity_major, &zenity_minor)) {
return false; // get_zenity_version() calls SDL_SetError(), so message is already set
}
diff --git a/src/dialog/unix/SDL_zenitymessagebox.h b/src/dialog/unix/SDL_zenitymessagebox.h
index 52ee6a5cc12dc..40f20ad578e6e 100644
--- a/src/dialog/unix/SDL_zenitymessagebox.h
+++ b/src/dialog/unix/SDL_zenitymessagebox.h
@@ -23,5 +23,6 @@
#define SDL_zenitymessagebox_h_
extern bool SDL_Zenity_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID);
+extern bool SDL_get_zenity_version(int *major, int *minor);
#endif // SDL_waylandmessagebox_h_