diff options
| author | Jan Novotný <[email protected]> | 2022-11-07 15:32:33 +0100 | 
|---|---|---|
| committer | GitHub <[email protected]> | 2022-11-07 15:32:33 +0100 | 
| commit | 2540175e5a5b15e65aecaf94a29f208e6a3836c9 (patch) | |
| tree | 73859ebcfc550ed9edc04f66014250c89f3c1844 /src/core | |
| parent | db228e276fd4e7e7b33957d96cba73aaa4166a8d (diff) | |
| download | marco-2540175e5a5b15e65aecaf94a29f208e6a3836c9.tar.bz2 marco-2540175e5a5b15e65aecaf94a29f208e6a3836c9.tar.xz | |
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
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/window-props.c | 46 | 
1 files changed, 46 insertions, 0 deletions
| 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 <X11/Xatom.h> +#include <X11/extensions/XRes.h>  #include <unistd.h>  #include <string.h>  #include <errno.h> @@ -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; | 
