[metacity] window: add meta_window_get_client_pid



commit dade470e13292c58822b0c180019caf0ea3862f3
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sat Sep 12 14:12:10 2020 +0300

    window: add meta_window_get_client_pid

 src/core/window-private.h |  3 +++
 src/core/window.c         | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)
---
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 4b4253e9..232d9d9a 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -132,6 +132,7 @@ struct _MetaWindow
   char *gtk_theme_variant;
 
   int net_wm_pid;
+  pid_t client_pid;
 
   Window xtransient_for;
   Window xgroup_leader;
@@ -724,6 +725,8 @@ void meta_window_add_pending_unmap (MetaWindow *window,
 gboolean meta_window_remove_pending_unmap (MetaWindow *window,
                                            gulong      serial);
 
+pid_t meta_window_get_client_pid (MetaWindow *self);
+
 G_END_DECLS
 
 #endif
diff --git a/src/core/window.c b/src/core/window.c
index 146dde9c..5e149d49 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -51,6 +51,7 @@
 #include <string.h>
 
 #include <X11/extensions/shape.h>
+#include <X11/extensions/XRes.h>
 
 /* should investigate changing these to whatever most apps use */
 #define META_ICON_SIZE 96
@@ -567,6 +568,7 @@ meta_window_new (MetaDisplay    *display,
   window->gtk_theme_variant = NULL;
 
   window->net_wm_pid = -1;
+  window->client_pid = -1;
 
   window->xtransient_for = None;
   window->xclient_leader = None;
@@ -9264,3 +9266,37 @@ meta_window_remove_pending_unmap (MetaWindow *window,
 
   return removed;
 }
+
+pid_t
+meta_window_get_client_pid (MetaWindow *self)
+{
+  if (self->client_pid == -1)
+    {
+      XResClientIdSpec spec;
+      long num_ids;
+      XResClientIdValue *client_ids;
+      long i;
+
+      spec.client = self->xwindow;
+      spec.mask = XRES_CLIENT_ID_PID_MASK;
+
+      XResQueryClientIds (self->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)
+            {
+              self->client_pid = XResGetClientPid (&client_ids[i]);
+              break;
+            }
+        }
+
+      XResClientIdsDestroy (num_ids, client_ids);
+    }
+
+  return self->client_pid;
+}


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