From 07694559cc0c65ce1cca9ac33b165cef84c34d5e Mon Sep 17 00:00:00 2001 From: Ryan Gonzalez Date: Fri, 7 Jan 2022 17:14:43 -0600 Subject: 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 --- libwnck/xutils.c | 36 +++++++++++++++++++++++++++++++++--- 1 file 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 #endif +#ifdef HAVE_XRES +#include +#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* -- cgit v1.2.1