[metacity/wip/muktupavels/issue-9] window-props: use XResQueryClientIds to get pid
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity/wip/muktupavels/issue-9] window-props: use XResQueryClientIds to get pid
- Date: Fri, 1 May 2020 14:10:58 +0000 (UTC)
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]