[PATCH v2] Also dump passive grabs on XF86LogGrabInfo

Peter Hutterer peter.hutterer at who-t.net
Sun Oct 25 19:24:02 PDT 2015


On Fri, Oct 23, 2015 at 04:31:50AM -0700, Michael Stapelberg wrote:
> ---
>  dix/window.c                    | 110 ++++++++++++++++++++++++++++++++++++++++
>  hw/xfree86/dixmods/xkbPrivate.c |   2 +
>  include/window.h                |   1 +
>  3 files changed, 113 insertions(+)
> 
> diff --git a/dix/window.c b/dix/window.c
> index 69b5a7c..af4a3d7 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,115 @@ 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 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),
> +           (pGrab->type == ButtonPress ? "ButtonPress" : "KeyPress"),

sorry, forgot that in the previous email: for XI2's enter grabs this
could be XI_Enter or XI_FocusIn. Best to make a helper like
grab_grabtype_to_text.

> +           (unsigned long) pGrab->window->drawable.id,
> +           pGrab->device->id);

window.c: In function 'log_grab_info':
window.c:295:12: warning: too many arguments for format
[-Wformat-extra-args]
     ErrorF("  grab 0x%lx (%s), type '%s' on window 0x%lx\n",

I take it you want the device id gone since we print the name anyway?

rest looks good though, thanks

Cheers,
   Peter


> +    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