summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2020-09-12 14:12:10 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2020-09-12 14:34:07 +0300
commitdade470e13292c58822b0c180019caf0ea3862f3 (patch)
treedf497dd1724597a530b843bac73fee589587e783
parent1627fb25ecff3b51252648afb9c41c908deb941a (diff)
downloadmetacity-dade470e13292c58822b0c180019caf0ea3862f3.tar.gz
window: add meta_window_get_client_pid
-rw-r--r--src/core/window-private.h3
-rw-r--r--src/core/window.c36
2 files changed, 39 insertions, 0 deletions
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;
+}