[PATCH v3] Also dump passive grabs on XF86LogGrabInfo
Michael Stapelberg
stapelberg at google.com
Fri Nov 6 00:43:14 PST 2015
Signed-off-by: Michael Stapelberg <stapelberg at google.com>
---
dix/window.c | 126 ++++++++++++++++++++++++++++++++++++++++
hw/xfree86/dixmods/xkbPrivate.c | 2 +
include/window.h | 1 +
3 files changed, 129 insertions(+)
diff --git a/dix/window.c b/dix/window.c
index 69b5a7c..25d29ec 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -127,6 +127,7 @@ Equipment Corporation.
#include "compint.h"
#endif
#include "selection.h"
+#include "inpututils.h"
#include "privates.h"
#include "xace.h"
@@ -272,6 +273,131 @@ log_window_info(WindowPtr pWin, int depth)
ErrorF("\n");
}
+static const char*
+grab_grabtype_to_text(GrabPtr pGrab)
+{
+ switch (pGrab->grabtype) {
+ case XI2:
+ return "xi2";
+ case CORE:
+ return "core";
+ default:
+ return "xi1";
+ }
+}
+
+static const char*
+grab_type_to_text(GrabPtr pGrab)
+{
+ switch (pGrab->type) {
+ case ButtonPress:
+ return "ButtonPress";
+ case KeyPress:
+ return "KeyPress";
+ case XI_Enter:
+ return "XI_Enter";
+ case XI_FocusIn:
+ return "XI_FocusIn";
+ default:
+ return "unknown?!";
+ }
+}
+
+static void
+log_grab_info(void *value, XID id, void *cdata)
+{
+ int i, j;
+ GrabPtr pGrab = (GrabPtr)value;
+
+ ErrorF(" grab 0x%lx (%s), type '%s' on window 0x%lx\n",
+ (unsigned long) pGrab->resource,
+ grab_grabtype_to_text(pGrab),
+ grab_type_to_text(pGrab),
+ (unsigned long) pGrab->window->drawable.id);
+ ErrorF(" detail %d (mask %lu), modifiersDetail %d (mask %lu)\n",
+ pGrab->detail.exact,
+ pGrab->detail.pMask ? (unsigned long) *(pGrab->detail.pMask) : 0,
+ pGrab->modifiersDetail.exact,
+ pGrab->modifiersDetail.pMask ?
+ (unsigned long) *(pGrab->modifiersDetail.pMask) :
+ (unsigned long) 0);
+ ErrorF(" device '%s' (%d), modifierDevice '%s' (%d)\n",
+ pGrab->device->name, pGrab->device->id,
+ pGrab->modifierDevice->name, pGrab->modifierDevice->id);
+ if (pGrab->grabtype == CORE) {
+ ErrorF(" core event mask 0x%lx\n",
+ (unsigned long) pGrab->eventMask);
+ }
+ else if (pGrab->grabtype == XI) {
+ ErrorF(" xi1 event mask 0x%lx\n",
+ (unsigned long) pGrab->eventMask);
+ }
+ else if (pGrab->grabtype == XI2) {
+ for (i = 0; i < xi2mask_num_masks(pGrab->xi2mask); i++) {
+ const unsigned char *mask;
+ int print;
+
+ print = 0;
+ for (j = 0; j < XI2MASKSIZE; j++) {
+ mask = xi2mask_get_one_mask(pGrab->xi2mask, i);
+ if (mask[j]) {
+ print = 1;
+ break;
+ }
+ }
+ if (!print)
+ continue;
+ ErrorF(" xi2 event mask 0x");
+ for (j = 0; j < xi2mask_mask_size(pGrab->xi2mask); j++)
+ ErrorF("%x ", mask[j]);
+ ErrorF("\n");
+ }
+ }
+ ErrorF(" owner-events %s, kb %d ptr %d, confine 0x%lx, cursor 0x%lx\n",
+ pGrab->ownerEvents ? "true" : "false",
+ pGrab->keyboardMode, pGrab->pointerMode,
+ pGrab->confineTo ? (unsigned long) pGrab->confineTo->drawable.id : 0,
+ pGrab->cursor ? (unsigned long) pGrab->cursor->id : 0);
+}
+
+void
+PrintPassiveGrabs(void)
+{
+ int i;
+ LocalClientCredRec *lcc;
+ pid_t clientpid;
+ const char *cmdname;
+ const char *cmdargs;
+
+ ErrorF("Printing all currently registered grabs\n");
+
+ for (i = 1; i < currentMaxClients; i++) {
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ clientpid = GetClientPid(clients[i]);
+ cmdname = GetClientCmdName(clients[i]);
+ cmdargs = GetClientCmdArgs(clients[i]);
+ if ((clientpid > 0) && (cmdname != NULL)) {
+ ErrorF(" Printing all registered grabs of client pid %ld %s %s\n",
+ (long) clientpid, cmdname, cmdargs ? cmdargs : "");
+ } else {
+ if (GetLocalClientCreds(clients[i], &lcc) == -1) {
+ ErrorF(" GetLocalClientCreds() failed\n");
+ continue;
+ }
+ ErrorF(" Printing all registered grabs of client pid %ld uid %ld gid %ld\n",
+ (lcc->fieldsSet & LCC_PID_SET) ? (long) lcc->pid : 0,
+ (lcc->fieldsSet & LCC_UID_SET) ? (long) lcc->euid : 0,
+ (lcc->fieldsSet & LCC_GID_SET) ? (long) lcc->egid : 0);
+ FreeLocalClientCreds(lcc);
+ }
+
+ FindClientResourcesByType(clients[i], RT_PASSIVEGRAB, log_grab_info, NULL);
+ }
+ ErrorF("End list of registered passive grabs\n");
+}
+
void
PrintWindowTree(void)
{
diff --git a/hw/xfree86/dixmods/xkbPrivate.c b/hw/xfree86/dixmods/xkbPrivate.c
index 574590f..4b9ef33 100644
--- a/hw/xfree86/dixmods/xkbPrivate.c
+++ b/hw/xfree86/dixmods/xkbPrivate.c
@@ -38,6 +38,8 @@ XkbDDXPrivate(DeviceIntPtr dev, KeyCode key, XkbAction *act)
if (tmp->deviceGrab.grab)
PrintDeviceGrabInfo(tmp);
xf86Msg(X_INFO, "End list of active device grabs\n");
+
+ PrintPassiveGrabs();
}
else if (strcasecmp(msgbuf, "ungrab") == 0)
UngrabAllDevices(FALSE);
diff --git a/include/window.h b/include/window.h
index 6daec85..f13ed51 100644
--- a/include/window.h
+++ b/include/window.h
@@ -223,6 +223,7 @@ extern _X_EXPORT RegionPtr CreateClipShape(WindowPtr /* pWin */ );
extern _X_EXPORT void SetRootClip(ScreenPtr pScreen, Bool enable);
extern _X_EXPORT void PrintWindowTree(void);
+extern _X_EXPORT void PrintPassiveGrabs(void);
extern _X_EXPORT VisualPtr WindowGetVisual(WindowPtr /*pWin*/);
#endif /* WINDOW_H */
--
2.6.0.rc2.230.g3dd15c0
More information about the xorg-devel
mailing list