diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2020-05-01 16:34:14 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2020-05-01 17:10:12 +0300 |
commit | bcbe966511362a8eb8c8c64035ab160086c931f8 (patch) | |
tree | 2a66a27cc9494262aba8b48fad90b4f01555551c | |
parent | 8bd7484bfd0d39328a4ccfbb48e5d935a9d61433 (diff) | |
download | metacity-bcbe966511362a8eb8c8c64035ab160086c931f8.tar.gz |
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/-/issues/9
-rw-r--r-- | .gitlab-ci.yml | 1 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/core/window-props.c | 47 |
3 files changed, 49 insertions, 1 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 36249af6..e66b5974 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,6 +32,7 @@ variables: libxinerama-dev libxrandr-dev libxrender-dev + libxres-dev libxt-dev yelp-tools zenity diff --git a/configure.ac b/configure.ac index 044f47f3..b0ce546c 100644 --- a/configure.ac +++ b/configure.ac @@ -144,7 +144,7 @@ AC_CHECK_SIZEOF(__int64) ## byte order AC_C_BIGENDIAN -METACITY_PC_MODULES="gtk+-3.0 >= $GTK_REQUIRED_VERSION gio-2.0 >= $GLIB_REQUIRED_VERSION pango >= $PANGO_REQUIRED_VERSION gsettings-desktop-schemas >= 3.3.0 xcomposite >= $XCOMPOSITE_REQUIRED_VERSION xfixes xrender xdamage" +METACITY_PC_MODULES="gtk+-3.0 >= $GTK_REQUIRED_VERSION gio-2.0 >= $GLIB_REQUIRED_VERSION pango >= $PANGO_REQUIRED_VERSION gsettings-desktop-schemas >= 3.3.0 xcomposite >= $XCOMPOSITE_REQUIRED_VERSION xfixes xrender xdamage xres" GLIB_GSETTINGS diff --git a/src/core/window-props.c b/src/core/window-props.c index 64d500bd..9afc2743 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -43,6 +43,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> @@ -395,11 +396,57 @@ reload_wm_window_role (MetaWindow *window, window->role = g_strdup (value->v.str); } +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 ("Ignoring _NET_WM_PID in favor of XResGetClientPid\n"); + + window->net_wm_pid = pid; + return; + } + if (value->type != META_PROP_VALUE_INVALID) { gulong cardinal = (int) value->v.cardinal; |