[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