summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-11-07 08:32:46 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-11-07 08:32:59 +1000
commit9b69359671a33c4f8184f9c3206a0da9a8dff417 (patch)
tree301f241bee57a6530764e95f5c732c6c9f8b842e
parent683c71e3a7d0a918df84b15b9f621f33121943db (diff)
Add a side-window and grab events on that window
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--multitouch.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/multitouch.c b/multitouch.c
index d6b9bcf..232fbe6 100644
--- a/multitouch.c
+++ b/multitouch.c
@@ -38,6 +38,7 @@ struct multitouch {
Screen* screen;
Window root;
Window win;
+ Window toolbar;
GC gc;
Visual *visual;
int xi_opcode;
@@ -87,16 +88,23 @@ static void sighandler(int signal)
error("signal received, shutting down\n");
}
-static Window init_window(struct multitouch *mt)
+static void init_windows(struct multitouch *mt)
{
- Window win;
+ Window win, subwin;
XEvent event;
XIEventMask evmask;
unsigned char mask[XIMaskLen(XI_LASTEVENT)];
+ XIGrabModifiers modifiers;
win = XCreateSimpleWindow(mt->dpy, mt->root, 0, 0, mt->width, mt->height,
0, 0, WhitePixel(mt->dpy, mt->screen_no));
+
+ subwin = XCreateSimpleWindow(mt->dpy, win, 0, 0, 50, mt->height, 0, 0,
+ BlackPixel(mt->dpy, mt->screen_no));
+
+ /* select for touch events on main window */
XSelectInput(mt->dpy, win, ExposureMask);
+ XMapSubwindows(mt->dpy, win);
XMapWindow(mt->dpy, win);
XMaskEvent(mt->dpy, ExposureMask, &event);
@@ -111,9 +119,18 @@ static Window init_window(struct multitouch *mt)
XISelectEvents(mt->dpy, win, &evmask, 1);
+ mt->win = win;
+ mt->toolbar = subwin;
+
+ /* grab touch events on toolbar */
+ modifiers.modifiers = XIAnyModifier;
+ if (XIGrabTouchBegin(mt->dpy, XIAllMasterDevices, mt->toolbar,
+ XINoOwnerEvents, &evmask, 1, &modifiers) != 0)
+ error("Failed to establish passive grab on toolbar\n");
+
XSync(mt->dpy, False);
- return win;
+
}
static Pixmap init_pixmap(struct multitouch *mt)
@@ -159,7 +176,8 @@ static int init_x11(struct multitouch *mt, int width, int height)
mt->width = width;
mt->height = height;
- mt->win = init_window(mt);
+ init_windows(mt);
+
mt->pixmap = init_pixmap(mt);
mt->gc = init_gc(mt);
if (!mt->win)
@@ -188,6 +206,7 @@ static void print_event(struct multitouch *mt, XIDeviceEvent* event)
msg("Event: %s (%d)\n", type, event->deviceid);
msg("\t%.2f/%.2f (%.2f/%.2f)\n", event->event_x, event->event_y, event->root_x, event->root_y);
msg("\ttouchid: %d\n", event->detail);
+ msg("\ton %s\n", event->event == mt->win ? "window" : "toolbar");
}
static void paint_touch_begin(struct multitouch *mt, XIDeviceEvent *event)
@@ -264,6 +283,9 @@ static void paint_touch_end(struct multitouch *mt, XIDeviceEvent *event)
static void paint_event(struct multitouch *mt, XIDeviceEvent *event)
{
+ if (event->event == mt->toolbar)
+ return;
+
switch(event->evtype)
{
case XI_TouchBegin: paint_touch_begin(mt, event); break;