Index: base/message_pump_x.cc |
diff --git a/base/message_pump_x.cc b/base/message_pump_x.cc |
index 06dea11119fc2500f8b8ad861d151f2f23118a6b..3b1ed3da1f58dab6517656fe06fc9ed8eb0fe1f8 100644 |
--- a/base/message_pump_x.cc |
+++ b/base/message_pump_x.cc |
@@ -45,6 +45,10 @@ int xiopcode = -1; |
// The message-pump opens a connection to the display and owns it. |
Display* g_xdisplay = NULL; |
+// The default dispatcher to process native events when no dispatcher |
+// is specified. |
+base::MessagePumpDispatcher* g_default_dispatcher = NULL; |
+ |
void InitializeXInput2(void) { |
Display* display = base::MessagePumpX::GetDefaultXDisplay(); |
if (!display) |
@@ -108,6 +112,12 @@ bool MessagePumpX::HasXInput2() { |
return xiopcode != -1; |
} |
+// static |
+void MessagePumpX::SetDefaultDispatcher(MessagePumpDispatcher* dispatcher) { |
+ DCHECK(!g_default_dispatcher || !dispatcher); |
+ g_default_dispatcher = dispatcher; |
+} |
+ |
void MessagePumpX::InitXSource() { |
DCHECK(!x_source_); |
GPollFD* x_poll = new GPollFD(); |
@@ -122,7 +132,8 @@ void MessagePumpX::InitXSource() { |
g_source_attach(x_source_, g_main_context_default()); |
} |
-bool MessagePumpX::ProcessXEvent(XEvent* xev) { |
+bool MessagePumpX::ProcessXEvent(MessagePumpDispatcher* dispatcher, |
+ XEvent* xev) { |
bool should_quit = false; |
bool have_cookie = false; |
@@ -133,7 +144,7 @@ bool MessagePumpX::ProcessXEvent(XEvent* xev) { |
if (WillProcessXEvent(xev) == EVENT_CONTINUE) { |
MessagePumpDispatcher::DispatchStatus status = |
- GetDispatcher()->Dispatch(xev); |
+ dispatcher->Dispatch(xev); |
if (status == MessagePumpDispatcher::EVENT_QUIT) { |
should_quit = true; |
@@ -153,7 +164,10 @@ bool MessagePumpX::ProcessXEvent(XEvent* xev) { |
bool MessagePumpX::RunOnce(GMainContext* context, bool block) { |
Display* display = GetDefaultXDisplay(); |
- if (!display || !GetDispatcher()) |
+ MessagePumpDispatcher* dispatcher = |
+ GetDispatcher() ? GetDispatcher() : g_default_dispatcher; |
+ |
+ if (!display || !dispatcher) |
return g_main_context_iteration(context, block); |
// In the general case, we want to handle all pending events before running |
@@ -161,7 +175,7 @@ bool MessagePumpX::RunOnce(GMainContext* context, bool block) { |
while (XPending(display)) { |
XEvent xev; |
XNextEvent(display, &xev); |
- if (ProcessXEvent(&xev)) |
+ if (ProcessXEvent(dispatcher, &xev)) |
return true; |
} |