]> source.dussan.org Git - tigervnc.git/commitdiff
Add a global event handler so that we can intercept custom events
authorPierre Ossman <ossman@cendio.se>
Fri, 13 Jun 2014 10:52:11 +0000 (10:52 +0000)
committerPierre Ossman <ossman@cendio.se>
Wed, 25 Jun 2014 12:45:52 +0000 (14:45 +0200)
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

unix/tx/TXWindow.cxx
unix/tx/TXWindow.h

index 12e6ebadd3935d161d162cbcc488fdffbb191fc0..1f69702ad4d00689f4a2376f3a9af784058ec6fb 100644 (file)
@@ -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];
index 45ee28fbe0d31b774a532ed6363cd038268ba566..5a72c33507baa1709f8a4f814d09fbb81c289142 100644 (file)
@@ -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;