[PATCH xev] Add a -event parameter to control the event mask

Aaron Plattner aplattner at nvidia.com
Mon Jun 25 07:54:25 PDT 2012


On 06/24/2012 06:21 PM, Peter Hutterer wrote:
> On Fri, Jun 22, 2012 at 01:45:47PM -0700, Aaron Plattner wrote:
>> It's annoying to have to sift through a lot of unrelated events if all you care
>> about is one specific class of events (e.g. RandR events).  Add a -event
>> parameter that can be used to tune which events to select.  When not specified,
>> all events are selected.
>
> great addition, thanks. one suggestion though: please make this a
> comma-separate list so one can select for a few masks instead of just a
> single one.

You can specify -event multiple times, is that sufficient if I make it more 
obvious in the man page and help text?

-- Aaron

> Cheers,
>    Peter
>
>> Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
>> Reviewed-by: Andy Ritger <aritger at nvidia.com>
>> ---
>>   man/xev.man |    6 ++++
>>   xev.c       |  109 +++++++++++++++++++++++++++++++++++++++++++++++++----------
>>   2 files changed, 97 insertions(+), 18 deletions(-)
>>
>> diff --git a/man/xev.man b/man/xev.man
>> index d13f022..eb3a901 100644
>> --- a/man/xev.man
>> +++ b/man/xev.man
>> @@ -52,6 +52,12 @@ This option specifies the name to assign to the created window.
>>   .TP 8
>>   .B \-rv
>>   This option specifies that the window should be in reverse video.
>> +.TP 8
>> +.B \-event \fIevent_mask\fP
>> +Select which events to display.
>> +When not specified, all events are selected.
>> +Available event masks: keyboard mouse expose visibility structure substructure
>> +focus property colormap owner_grab_button randr
>>   .SH "SEE ALSO"
>>   X(__miscmansuffix__), xwininfo(__appmansuffix__), xdpyinfo(__appmansuffix__), Xlib Programmers Manual, X Protocol
>>   Specification
>> diff --git a/xev.c b/xev.c
>> index 9f9111a..6242bd4 100644
>> --- a/xev.c
>> +++ b/xev.c
>> @@ -75,6 +75,12 @@ Atom wm_protocols;
>>   Bool have_rr;
>>   int rr_event_base, rr_error_base;
>>
>> +enum EventMaskIndex {
>> +    EVENT_MASK_INDEX_CORE,
>> +    EVENT_MASK_INDEX_RANDR,
>> +    NUM_EVENT_MASKS
>> +};
>> +
>>   static void usage (void) _X_NORETURN;
>>
>>   static void
>> @@ -878,6 +884,10 @@ usage (void)
>>   "    -s                                  set save-unders attribute",
>>   "    -name string                        window name",
>>   "    -rv                                 reverse video",
>> +"    -event event_mask                   select 'event_mask' events",
>> +"           Supported event masks: keyboard mouse expose visibility structure",
>> +"                                  substructure focus property colormap",
>> +"                                  owner_grab_button randr",
>>   "",
>>   NULL};
>>       const char **cpp;
>> @@ -909,6 +919,65 @@ parse_backing_store (char *s)
>>       usage ();
>>   }
>>
>> +static Bool
>> +parse_event_mask (const char *s, long event_masks[], Bool all)
>> +{
>> +    const struct {
>> +        const char *name;
>> +        enum EventMaskIndex mask_index;
>> +        long mask;
>> +    } events[] = {
>> +        { "keyboard",
>> +          EVENT_MASK_INDEX_CORE,
>> +          KeyPressMask | KeyReleaseMask | KeymapStateMask },
>> +        { "mouse",
>> +          EVENT_MASK_INDEX_CORE,
>> +          ButtonPressMask | ButtonReleaseMask | EnterWindowMask |
>> +          LeaveWindowMask | PointerMotionMask | Button1MotionMask |
>> +          Button2MotionMask | Button3MotionMask | Button4MotionMask |
>> +          Button5MotionMask | ButtonMotionMask },
>> +        { "expose",
>> +          EVENT_MASK_INDEX_CORE,
>> +          ExposureMask },
>> +        { "visibility",
>> +          EVENT_MASK_INDEX_CORE,
>> +          VisibilityChangeMask },
>> +        { "structure",
>> +          EVENT_MASK_INDEX_CORE,
>> +          StructureNotifyMask },
>> +        { "substructure",
>> +          EVENT_MASK_INDEX_CORE,
>> +          SubstructureNotifyMask | SubstructureRedirectMask },
>> +        { "focus",
>> +          EVENT_MASK_INDEX_CORE,
>> +          FocusChangeMask },
>> +        { "property",
>> +          EVENT_MASK_INDEX_CORE,
>> +          PropertyChangeMask },
>> +        { "colormap",
>> +          EVENT_MASK_INDEX_CORE,
>> +          ColormapChangeMask },
>> +        { "owner_grab_button",
>> +          EVENT_MASK_INDEX_CORE,
>> +          OwnerGrabButtonMask },
>> +        { "randr",
>> +          EVENT_MASK_INDEX_RANDR,
>> +          RRScreenChangeNotifyMask | RRCrtcChangeNotifyMask |
>> +          RROutputChangeNotifyMask | RROutputPropertyNotifyMask },
>> +        { NULL, 0, 0 }
>> +    };
>> +    int i;
>> +
>> +    for (i = 0; events[i].name; i++) {
>> +        if (all || !strcmp(s, events[i].name)) {
>> +            event_masks[events[i].mask_index] |= events[i].mask;
>> +            if (!all) return True;
>
> I'd prefer a line break here
>
>> +        }
>> +    }
>> +
>> +    return False;
>> +}
>> +
>>   int
>>   main (int argc, char **argv)
>>   {
>> @@ -931,6 +1000,8 @@ main (int argc, char **argv)
>>       XIMStyle xim_style = 0;
>>       char *modifiers;
>>       char *imvalret;
>> +    long event_masks[NUM_EVENT_MASKS];
>> +    Bool event_mask_specified = False;
>>
>>       ProgramName = argv[0];
>>
>> @@ -939,6 +1010,8 @@ main (int argc, char **argv)
>>   		ProgramName);
>>       }
>>
>> +    memset(event_masks, 0, sizeof(event_masks));
>> +
>>       w = 0;
>>       for (i = 1; i < argc; i++) {
>>   	char *arg = argv[i];
>> @@ -995,6 +1068,12 @@ main (int argc, char **argv)
>>   		attr.save_under = True;
>>   		mask |= CWSaveUnder;
>>   		continue;
>> +	      case 'e':			/* -event */
>> +		if (++i >= argc) usage ();
>> +		if (!parse_event_mask (argv[i], event_masks, False))
>> +		    usage ();
>> +		event_mask_specified = True;
>> +		continue;
>>   	      default:
>>   		usage ();
>>   	    }				/* end switch on - */
>> @@ -1002,6 +1081,10 @@ main (int argc, char **argv)
>>   	  usage ();
>>       }					/* end for over argc */
>>
>> +    /* if no -event options were specified, pretend all of them were */
>> +    if (!event_mask_specified)
>> +        parse_event_mask (NULL, event_masks, True);
>> +
>>       dpy = XOpenDisplay (displayname);
>>       if (!dpy) {
>>   	fprintf (stderr, "%s:  unable to open display '%s'\n",
>> @@ -1046,19 +1129,7 @@ main (int argc, char **argv)
>>
>>       screen = DefaultScreen (dpy);
>>
>> -    /* select for all events */
>> -    attr.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask |
>> -			   ButtonReleaseMask | EnterWindowMask |
>> -			   LeaveWindowMask | PointerMotionMask |
>> -			   Button1MotionMask |
>> -			   Button2MotionMask | Button3MotionMask |
>> -			   Button4MotionMask | Button5MotionMask |
>> -			   ButtonMotionMask | KeymapStateMask |
>> -			   ExposureMask | VisibilityChangeMask |
>> -			   StructureNotifyMask | /* ResizeRedirectMask | */
>> -			   SubstructureNotifyMask | SubstructureRedirectMask |
>> -			   FocusChangeMask | PropertyChangeMask |
>> -			   ColormapChangeMask | OwnerGrabButtonMask;
>> +    attr.event_mask = event_masks[EVENT_MASK_INDEX_CORE];
>>
>>       if (use_root)
>>   	w = RootWindow(dpy, screen);
>> @@ -1126,12 +1197,14 @@ main (int argc, char **argv)
>>           int rr_major, rr_minor;
>>
>>           if (XRRQueryVersion (dpy, &rr_major, &rr_minor)) {
>> -            int rr_mask = RRScreenChangeNotifyMask;
>> +            int rr_mask = event_masks[EVENT_MASK_INDEX_RANDR];
>> +
>> +            if (rr_major == 1 && rr_minor <= 1) {
>> +                rr_mask &= ~(RRCrtcChangeNotifyMask |
>> +                             RROutputChangeNotifyMask |
>> +                             RROutputPropertyNotifyMask);
>> +            }
>>
>> -            if (rr_major > 1
>> -                || (rr_major == 1 && rr_minor >= 2))
>> -                rr_mask |= RRCrtcChangeNotifyMask | RROutputChangeNotifyMask |
>> -                           RROutputPropertyNotifyMask;
>>               XRRSelectInput (dpy, w, rr_mask);
>>           }
>>       }
>> --
>> 1.7.9.5


More information about the xorg-devel mailing list