[metacity/wip/muktupavels/issue-9] window-props: use XResQueryClientIds to get pid



commit bcbe966511362a8eb8c8c64035ab160086c931f8
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Fri May 1 16:34:14 2020 +0300

    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

 .gitlab-ci.yml          |  1 +
 configure.ac            |  2 +-
 src/core/window-props.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 1 deletion(-)
---
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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]