#include #include #include #include using namespace std; class GeisTest { public: // Sets up a GEIS instance GeisTest() { GeisXcbWinInfo xcbWinInfo; xcbWinInfo.display_name = NULL; xcbWinInfo.screenp = NULL; xcbWinInfo.window_id = XRootWindow(XOpenDisplay(NULL), 0); GeisWinInfo winInfo; winInfo.win_type = GEIS_XCB_FULL_WINDOW; winInfo.win_info = &xcbWinInfo; if (geis_init(&winInfo, &geisInstance) != GEIS_STATUS_SUCCESS) { throw runtime_error("error initializing geis"); } gestureFuncs.added = GeisTest::gestureAdded; gestureFuncs.removed = GeisTest::gestureRemoved; gestureFuncs.start = GeisTest::gestureStart; gestureFuncs.update = GeisTest::gestureUpdate; gestureFuncs.finish = GeisTest::gestureFinish; if (geis_subscribe(geisInstance, GEIS_ALL_INPUT_DEVICES, GEIS_ALL_GESTURES, &gestureFuncs, this) != GEIS_STATUS_SUCCESS) { throw runtime_error("error creating geis subscription"); } } // Tears down a GEIS instance ~GeisTest() { geis_finish(geisInstance); } // an example of how to integrate GEIS into an event loop int run() { int fd = -1; geis_configuration_get_value(geisInstance, GEIS_CONFIG_UNIX_FD, &fd); for(;;) { fd_set read_fds; FD_ZERO(&read_fds); FD_SET(0, &read_fds); FD_SET(fd, &read_fds); int sstat = select(fd+1, &read_fds, NULL, NULL, NULL); if (sstat < 0) throw runtime_error("error in select"); if (FD_ISSET(0, &read_fds)) break; if (FD_ISSET(fd, &read_fds)) geis_event_dispatch(geisInstance); } return 0; } static void gestureAdded(void* cookie, GeisGestureType type, GeisGestureId id, GeisSize numAttrs, GeisGestureAttr* attrs) { cout << "Gesture added\n"; } static void gestureRemoved(void* cookie, GeisGestureType type, GeisGestureId id, GeisSize numAttrs, GeisGestureAttr* attrs) { cout << "Gesture removed\n"; } static void gestureStart(void* cookie, GeisGestureType type, GeisGestureId id, GeisSize numAttrs, GeisGestureAttr* attrs) { cout << "Gesture start\n"; } static void gestureUpdate(void* cookie, GeisGestureType type, GeisGestureId id, GeisSize numAttrs, GeisGestureAttr* attrs) { cout << "Gesture update\n"; } static void gestureFinish(void* cookie, GeisGestureType type, GeisGestureId id, GeisSize numAttrs, GeisGestureAttr* attrs) { cout << "Gesture finish\n"; } private: GeisInstance geisInstance; GeisGestureFuncs gestureFuncs; }; int main(int, char*[]) { try { return GeisTest().run(); } catch (exception& ex) { cerr << ex.what() << "\n"; return 1; } }