[PATCH xev] Add a -event parameter to control the event mask
Peter Hutterer
peter.hutterer at who-t.net
Mon Jun 25 15:34:01 PDT 2012
On Mon, Jun 25, 2012 at 07:54:25AM -0700, Aaron Plattner wrote:
> 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?
yeah, that's fine with me. thanks.
Cheers,
Peter
>
> -- 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