diff options
author | Pierre Ossman <ossman@cendio.se> | 2014-06-13 10:52:11 +0000 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2014-06-25 14:45:52 +0200 |
commit | df0f2832b407e811060291d0ab8a3bbae1fcf0eb (patch) | |
tree | aeae09e02599d53e4b722b5403d1d3dd692b2b45 /unix/tx | |
parent | 9545bc728d2ba7c350c1e98cf712e333a4985755 (diff) | |
download | tigervnc-df0f2832b407e811060291d0ab8a3bbae1fcf0eb.tar.gz tigervnc-df0f2832b407e811060291d0ab8a3bbae1fcf0eb.zip |
Add a global event handler so that we can intercept custom events
that aren't for a specific window.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5184 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'unix/tx')
-rw-r--r-- | unix/tx/TXWindow.cxx | 13 | ||||
-rw-r--r-- | unix/tx/TXWindow.h | 15 |
2 files changed, 28 insertions, 0 deletions
diff --git a/unix/tx/TXWindow.cxx b/unix/tx/TXWindow.cxx index 12e6ebad..1f69702a 100644 --- a/unix/tx/TXWindow.cxx +++ b/unix/tx/TXWindow.cxx @@ -46,6 +46,8 @@ Pixmap TXWindow::dot = 0, TXWindow::tick = 0; const int TXWindow::dotSize = 4, TXWindow::tickSize = 8; char* TXWindow::defaultWindowClass; +TXGlobalEventHandler* TXWindow::globalEventHandler = NULL; + void TXWindow::init(Display* dpy, const char* defaultWindowClass_) { cmap = DefaultColormap(dpy,DefaultScreen(dpy)); @@ -101,6 +103,10 @@ void TXWindow::handleXEvents(Display* dpy) while (XPending(dpy)) { XEvent ev; XNextEvent(dpy, &ev); + if (globalEventHandler) { + if (globalEventHandler->handleGlobalEvent(&ev)) + continue; + } if (ev.type == MappingNotify) { XRefreshKeyboardMapping(&ev.xmapping); } else if (ev.type == PropertyNotify && @@ -117,6 +123,13 @@ void TXWindow::handleXEvents(Display* dpy) } } +TXGlobalEventHandler* TXWindow::setGlobalEventHandler(TXGlobalEventHandler* h) +{ + TXGlobalEventHandler* old = globalEventHandler; + globalEventHandler = h; + return old; +} + void TXWindow::getColours(Display* dpy, XColor* cols, int nCols) { bool* got = new bool[nCols]; diff --git a/unix/tx/TXWindow.h b/unix/tx/TXWindow.h index 45ee28fb..5a72c335 100644 --- a/unix/tx/TXWindow.h +++ b/unix/tx/TXWindow.h @@ -51,6 +51,14 @@ public: virtual void handleEvent(TXWindow* w, XEvent* ev) = 0; }; +// TXGlobalEventHandler is similar to TXEventHandler but will be called early and +// for every X event. The handler should return true to indicate that the +// event was swallowed and shouldn't be processed further. +class TXGlobalEventHandler { +public: + virtual bool handleGlobalEvent(XEvent* ev) = 0; +}; + class TXWindow { public: @@ -162,6 +170,11 @@ public: // returns when there are no more events to process. static void handleXEvents(Display* dpy); + // setGlobalEventHandler() sets the TXGlobalEventHandler to intercept all + // X events. It returns the previous events handler, so that handlers can + // chain themselves. + static TXGlobalEventHandler* setGlobalEventHandler(TXGlobalEventHandler* h); + // windowWithName() locates a window with a given name on a display. static Window windowWithName(Display* dpy, Window top, const char* name); @@ -204,6 +217,8 @@ private: std::map<Atom,Time> selectionOwnTime; std::map<Atom,bool> selectionOwner_; bool toplevel_; + + static TXGlobalEventHandler* globalEventHandler; }; extern Atom wmProtocols, wmDeleteWindow, wmTakeFocus; |