[PATCH xev] Add a -event parameter to control the event mask
Peter Hutterer
peter.hutterer at who-t.net
Sun Jun 24 18:21:40 PDT 2012
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.
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
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list