that aren't for a specific window. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5184 3789f03b-4d11-0410-bbf8-ca57d06f2519tags/v1.3.90
@@ -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]; |
@@ -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; |