From 9c8e9564d2f5ed27175c0a6061394c25889dfb31 Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Mon, 19 Dec 2022 16:58:10 +0100 Subject: [PATCH 1/3] test return value from XResQueryClientIds() --- src/core/window-props.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/core/window-props.c b/src/core/window-props.c index 3414a3d9a..b27809ab4 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -309,11 +309,12 @@ get_local_pid (MetaWindow *window) spec.client = window->xwindow; spec.mask = XRES_CLIENT_ID_PID_MASK; - XResQueryClientIds (window->display->xdisplay, - 1, - &spec, - &num_ids, - &client_ids); + if (!XResQueryClientIds (window->display->xdisplay, + 1, + &spec, + &num_ids, + &client_ids)) + return pid; for (i = 0; i < num_ids; i++) { From 066888715066fbc4625612c8738c32b66666ceee Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Mon, 19 Dec 2022 16:59:06 +0100 Subject: [PATCH 2/3] Test Xres 1.2 is present Before using any Xres extension one must call XResQueryExtension() Also make sure Xres 1.2 is available as marco need XResQueryClientIds() --- src/core/display-private.h | 1 + src/core/display.c | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/core/display-private.h b/src/core/display-private.h index 0fd040c59..70e3ce0d9 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -80,6 +80,7 @@ typedef enum { struct _MetaDisplay { char* name; Display* xdisplay; + gboolean have_xres; /* Got XRES >= 1.2 */ Window leader_window; Window timestamp_pinging_window; diff --git a/src/core/display.c b/src/core/display.c index f470ca5a5..88b7e9070 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -50,6 +50,7 @@ #include "compositor.h" #include #include +#include #ifdef HAVE_SOLARIS_XINERAMA #include @@ -329,7 +330,8 @@ meta_display_open (void) Display *xdisplay; GSList *screens; GSList *tmp; - int i; + int i, event_base, error_base, major, minor; + gboolean have_xres = FALSE; guint32 timestamp; /* A list of all atom names, so that we can intern them in one go. */ @@ -343,6 +345,7 @@ meta_display_open (void) meta_verbose ("Opening display '%s'\n", XDisplayName (NULL)); xdisplay = meta_ui_get_display (); + event_base = error_base = major = minor = 0; if (xdisplay == NULL) { @@ -350,7 +353,13 @@ meta_display_open (void) XDisplayName (NULL)); return FALSE; } - + /* Make sure to init Xres any extensions */ + if (XResQueryExtension(xdisplay, &event_base, &error_base) && + XResQueryVersion (xdisplay, &major, &minor) == 1) + { + if (major > 1 || (major == 1 && minor >= 2)) + have_xres = TRUE; + } if (meta_is_syncing ()) XSynchronize (xdisplay, True); @@ -365,6 +374,7 @@ meta_display_open (void) */ the_display->name = g_strdup (XDisplayName (NULL)); the_display->xdisplay = xdisplay; + the_display->have_xres = have_xres; the_display->error_trap_synced_at_last_pop = TRUE; the_display->error_traps = 0; the_display->error_trap_handler = NULL; From 6cc8a2ff1e80d55d8edd7cd9c605bd068e83a72b Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Thu, 29 Dec 2022 14:51:57 +0100 Subject: [PATCH 3/3] Test if XResQueryClientIds() is available before using it. Needed for X2Go as it does not have XRES 1.2 extension. --- src/core/window-props.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/window-props.c b/src/core/window-props.c index b27809ab4..06df9e660 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -305,6 +305,8 @@ get_local_pid (MetaWindow *window) long i; pid = -1; + if (window->display->have_xres == FALSE) + return pid; spec.client = window->xwindow; spec.mask = XRES_CLIENT_ID_PID_MASK;