瀏覽代碼

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
tags/v1.3.90
Pierre Ossman 10 年之前
父節點
當前提交
df0f2832b4
共有 2 個文件被更改,包括 28 次插入0 次删除
  1. 13
    0
      unix/tx/TXWindow.cxx
  2. 15
    0
      unix/tx/TXWindow.h

+ 13
- 0
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];

+ 15
- 0
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;

Loading…
取消
儲存