diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2020-09-12 14:12:10 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2020-09-12 14:34:07 +0300 |
commit | dade470e13292c58822b0c180019caf0ea3862f3 (patch) | |
tree | df497dd1724597a530b843bac73fee589587e783 | |
parent | 1627fb25ecff3b51252648afb9c41c908deb941a (diff) | |
download | metacity-dade470e13292c58822b0c180019caf0ea3862f3.tar.gz |
window: add meta_window_get_client_pid
-rw-r--r-- | src/core/window-private.h | 3 | ||||
-rw-r--r-- | src/core/window.c | 36 |
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; +} |