[PATCH xev v3] Add a -event parameter to control the event mask
Peter Hutterer
peter.hutterer at who-t.net
Mon Jun 25 17:21:44 PDT 2012
On Mon, Jun 25, 2012 at 05:01:20PM -0700, Aaron Plattner wrote:
> On 06/25/2012 04:52 PM, Peter Hutterer wrote:
> >From: Aaron Plattner <aplattner at nvidia.com>
> >
> >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.
> >
> >Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
> >Reviewed-by: Andy Ritger <aritger at nvidia.com>
> >Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
> >---
> >Changes to v2:
> >- "all" parameter wasn't necessary, we can just assume all events on a NULL
> >string
>
> That's a little magic behavior-y for my tastes, but sure. Do you
> want to push the change, or should I?
pushed now, just wanted your implicit ack :)
> Sorry I didn't notice the missing line break you requested.
no worries, my fault. I usually don't have anything below my signature and
I'd had already hit send when I noticed.
Cheers,
Peter
>
> -- Aaron
>
> > man/xev.man | 9 +++++
> > xev.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++----------
> > 2 files changed, 103 insertions(+), 18 deletions(-)
> >
> >diff --git a/man/xev.man b/man/xev.man
> >index d13f022..ca38d56 100644
> >--- a/man/xev.man
> >+++ b/man/xev.man
> >@@ -52,6 +52,15 @@ 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.
> >+The
> >+.B \-event
> >+option can be specified multiple times to select multiple types of events.
> >+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..e6ad831 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,12 @@ 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",
> >+" This option can be specified multiple times to select multiple",
> >+" event masks.",
> > "",
> > NULL};
> > const char **cpp;
> >@@ -909,6 +921,66 @@ parse_backing_store (char *s)
> > usage ();
> > }
> >
> >+static Bool
> >+parse_event_mask (const char *s, long event_masks[])
> >+{
> >+ 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 (!s || !strcmp(s, events[i].name)) {
> >+ event_masks[events[i].mask_index] |= events[i].mask;
> >+ if (s)
> >+ return True;
> >+ }
> >+ }
> >+
> >+ return False;
> >+}
> >+
> > int
> > main (int argc, char **argv)
> > {
> >@@ -931,6 +1003,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 +1013,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 +1071,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))
> >+ usage ();
> >+ event_mask_specified = True;
> >+ continue;
> > default:
> > usage ();
> > } /* end switch on - */
> >@@ -1002,6 +1084,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);
> >+
> > dpy = XOpenDisplay (displayname);
> > if (!dpy) {
> > fprintf (stderr, "%s: unable to open display '%s'\n",
> >@@ -1046,19 +1132,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 +1200,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);
> > }
> > }
> >
>
>
More information about the xorg-devel
mailing list