[PATCH xev] Add a -event parameter to control the event mask
Aaron Plattner
aplattner at nvidia.com
Fri Jun 22 13:45:47 PDT 2012
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>
---
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;
+ }
+ }
+
+ 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