diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-07 08:32:46 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-07 08:32:59 +1000 |
commit | 9b69359671a33c4f8184f9c3206a0da9a8dff417 (patch) | |
tree | 301f241bee57a6530764e95f5c732c6c9f8b842e | |
parent | 683c71e3a7d0a918df84b15b9f621f33121943db (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.c | 30 |
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; |