diff options
author | Jan Novotný <[email protected]> | 2022-11-07 15:32:33 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2022-11-07 15:32:33 +0100 |
commit | 2540175e5a5b15e65aecaf94a29f208e6a3836c9 (patch) | |
tree | 73859ebcfc550ed9edc04f66014250c89f3c1844 /src/core | |
parent | db228e276fd4e7e7b33957d96cba73aaa4166a8d (diff) | |
download | marco-2540175e5a5b15e65aecaf94a29f208e6a3836c9.tar.bz2 marco-2540175e5a5b15e65aecaf94a29f208e6a3836c9.tar.xz |
replace _NET_WM_PID with XResGetClientPid (#741)
window-props: use XResQueryClientIds to get pid
_NET_WM_PID is unreliable! It can be faked or pid might be from
different namespace. Ignore _NET_WM_PID and use XResQueryClientIds
to get pid.
https://gitlab.gnome.org/GNOME/metacity/-/commit/bcbe966511362a8eb8c8c64035ab160086c931f8
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/window-props.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/core/window-props.c b/src/core/window-props.c index 76d8ae21..3414a3d9 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -47,6 +47,7 @@ #include "frame-private.h" #include "group.h" #include <X11/Xatom.h> +#include <X11/extensions/XRes.h> #include <unistd.h> #include <string.h> #include <errno.h> @@ -294,11 +295,56 @@ reload_wm_window_role (MetaWindow *window, meta_window_update_role (window); } +static pid_t +get_local_pid (MetaWindow *window) +{ + pid_t pid; + XResClientIdSpec spec; + long num_ids; + XResClientIdValue *client_ids; + long i; + + pid = -1; + + spec.client = window->xwindow; + spec.mask = XRES_CLIENT_ID_PID_MASK; + + XResQueryClientIds (window->display->xdisplay, + 1, + &spec, + &num_ids, + &client_ids); + + for (i = 0; i < num_ids; i++) + { + if (client_ids[i].spec.mask == XRES_CLIENT_ID_PID_MASK) + { + pid = XResGetClientPid (&client_ids[i]); + break; + } + } + + XResClientIdsDestroy (num_ids, client_ids); + + return pid; +} + static void reload_net_wm_pid (MetaWindow *window, MetaPropValue *value, gboolean initial) { + pid_t pid; + + pid = get_local_pid (window); + + if (pid != -1) + { + meta_verbose ("Using XResGetClientPid instead of _NET_WM_PID\n"); + + window->net_wm_pid = pid; + return; + } if (value->type != META_PROP_VALUE_INVALID) { gulong cardinal = (int) value->v.cardinal; |