From 2540175e5a5b15e65aecaf94a29f208e6a3836c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Novotn=C3=BD?= <59669705+CuBeRJAN@users.noreply.github.com> Date: Mon, 7 Nov 2022 15:32:33 +0100 Subject: 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 --- .build.yml | 4 ++++ configure.ac | 2 +- meson.build | 3 +++ src/core/window-props.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/.build.yml b/.build.yml index e8f75114..55457e5d 100644 --- a/.build.yml +++ b/.build.yml @@ -14,6 +14,7 @@ requires: - libcanberra - libgtop - libxpresent + - libxres - make - mate-common - mate-desktop @@ -51,6 +52,7 @@ requires: - libxpresent-dev - libxrandr-dev - libxrender-dev + - libxres-dev - libxt-dev - make - mate-common @@ -72,6 +74,7 @@ requires: - libSM-devel - libXdamage-devel - libXpresent-devel + - libXres-devel - libcanberra-devel - libgtop2-devel - libsoup-devel @@ -110,6 +113,7 @@ requires: - libxpresent-dev - libxrandr-dev - libxrender-dev + - libxres-dev - libxt-dev - make - mate-common diff --git a/configure.ac b/configure.ac index 6b946ab6..d5002477 100644 --- a/configure.ac +++ b/configure.ac @@ -164,7 +164,7 @@ if test x$have_xcomposite = xyes; then fi if test x$have_xcomposite = xyes; then - MARCO_PC_MODULES="$MARCO_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage" + MARCO_PC_MODULES="$MARCO_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage xres" AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, 1, [Building with compositing manager support]) echo "Building with compositing manager" diff --git a/meson.build b/meson.build index e777b6c6..199baa77 100644 --- a/meson.build +++ b/meson.build @@ -153,12 +153,14 @@ gtk_req = '>= 3.22.0' pango_req = '>= 1.2.0' libcanberra_gtk_req = '>= 3.22.0' startup_notification_req = '>= 0.7' +xres_req = '>= 1.2.0' glib_dep = dependency('glib-2.0', version: glib_req) gtk_dep = dependency('gtk+-3.0', version: gtk_req) gio_dep = dependency('gio-2.0', version: gio_req) pango_dep = dependency('pango', version: pango_req) libcanberra_gtk_dep = dependency('libcanberra-gtk3') +xres_dep = dependency('xres', version: xres_req) x11_dep = dependency('x11') marco_deps = [ @@ -167,6 +169,7 @@ marco_deps = [ gio_dep, pango_dep, libcanberra_gtk_dep, + xres_dep, ] marco_message_deps = [ 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 +#include #include #include #include @@ -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; -- cgit v1.2.1