Skip to content
Snippets Groups Projects
Commit a6cddb8c authored by Michael Stapelberg's avatar Michael Stapelberg Committed by Peter Hutterer
Browse files

Also dump passive grabs on XF86LogGrabInfo

parent f2ceb683
No related branches found
No related tags found
No related merge requests found
......@@ -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)
{
......
......@@ -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);
......
......@@ -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 */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment