diff options
author | Ryan Gonzalez <ryan.gonzalez@collabora.com> | 2022-01-07 17:14:43 -0600 |
---|---|---|
committer | Ryan Gonzalez <ryan.gonzalez@collabora.com> | 2022-03-28 15:52:36 -0500 |
commit | 07694559cc0c65ce1cca9ac33b165cef84c34d5e (patch) | |
tree | f3c4697455de89ce88417e4d2fb603c1c9eb4335 | |
parent | 3acbfe53def43bd9eaf518ae0b8d5d022c73e6df (diff) | |
download | libwnck-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.c | 36 |
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* |