summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Gonzalez <ryan.gonzalez@collabora.com>2022-01-07 17:14:43 -0600
committerRyan Gonzalez <ryan.gonzalez@collabora.com>2022-03-28 15:52:36 -0500
commit07694559cc0c65ce1cca9ac33b165cef84c34d5e (patch)
treef3c4697455de89ce88417e4d2fb603c1c9eb4335
parent3acbfe53def43bd9eaf518ae0b8d5d022c73e6df (diff)
downloadlibwnck-07694559cc0c65ce1cca9ac33b165cef84c34d5e.tar.gz
xutils: Get the correct PID for clients inside PID namespaces
This tries to use XResQueryClientIds to fetch the client's PID, which will return the PID as seen by the host, rather than the PID as seen by the client. Signed-off-by: Ryan Gonzalez <ryan.gonzalez@collabora.com>
-rw-r--r--libwnck/xutils.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/libwnck/xutils.c b/libwnck/xutils.c
index e95abef..9d0ee20 100644
--- a/libwnck/xutils.c
+++ b/libwnck/xutils.c
@@ -27,6 +27,9 @@
#if HAVE_CAIRO_XLIB_XRENDER
#include <cairo-xlib-xrender.h>
#endif
+#ifdef HAVE_XRES
+#include <X11/extensions/XRes.h>
+#endif
#include "screen.h"
#include "window.h"
#include "private.h"
@@ -1146,14 +1149,41 @@ int
_wnck_get_pid (Screen *screen,
Window xwindow)
{
- int val;
+ int pid = -1;
+
+#ifdef HAVE_XRES
+ XResClientIdSpec client_spec;
+ long client_id_count = 0;
+ XResClientIdValue *client_ids = NULL;
+
+ client_spec.client = xwindow;
+ client_spec.mask = XRES_CLIENT_ID_PID_MASK;
+
+ if (XResQueryClientIds (DisplayOfScreen (screen), 1, &client_spec,
+ &client_id_count, &client_ids) == Success)
+ {
+ long i;
+
+ for (i = 0; i < client_id_count; i++)
+ {
+ pid = XResGetClientPid (&client_ids[i]);
+ if (pid != -1)
+ break;
+ }
+
+ XResClientIdsDestroy (client_id_count, client_ids);
+
+ if (pid != -1)
+ return pid;
+ }
+#endif
if (!_wnck_get_cardinal (screen, xwindow,
_wnck_atom_get ("_NET_WM_PID"),
- &val))
+ &pid))
return 0;
else
- return val;
+ return pid;
}
char*