| Index: base/message_pump_x.cc
|
| diff --git a/base/message_pump_x.cc b/base/message_pump_x.cc
|
| index 8e098af95924e57269b906f21eb7975d926d3c0f..f9a2b6f989924b5bf9182c93c2e8af6b497e0154 100644
|
| --- a/base/message_pump_x.cc
|
| +++ b/base/message_pump_x.cc
|
| @@ -4,12 +4,15 @@
|
|
|
| #include "base/message_pump_x.h"
|
|
|
| -#include <gdk/gdkx.h>
|
| #include <X11/extensions/XInput2.h>
|
|
|
| #include "base/basictypes.h"
|
| #include "base/message_loop.h"
|
|
|
| +#if defined(TOOLKIT_USES_GTK)
|
| +#include <gdk/gdkx.h>
|
| +#endif
|
| +
|
| namespace {
|
|
|
| gboolean XSourcePrepare(GSource* source, gint* timeout_ms) {
|
| @@ -40,10 +43,6 @@ GSourceFuncs XSourceFuncs = {
|
| NULL
|
| };
|
|
|
| -// A flag to disable GTK's message pump. This is intermediate step
|
| -// to remove gtk and will be removed once migration is complete.
|
| -bool use_gtk_message_pump = true;
|
| -
|
| // The opcode used for checking events.
|
| int xiopcode = -1;
|
|
|
| @@ -51,11 +50,17 @@ int xiopcode = -1;
|
| // connection to the display and owns it.
|
| Display* g_xdisplay = NULL;
|
|
|
| +#if defined(TOOLKIT_USES_GTK)
|
| +// A flag to disable GTK's message pump. This is intermediate step
|
| +// to remove gtk and will be removed once migration is complete.
|
| +bool use_gtk_message_pump = true;
|
| +
|
| gboolean PlaceholderDispatch(GSource* source,
|
| GSourceFunc cb,
|
| gpointer data) {
|
| return TRUE;
|
| }
|
| +#endif // defined(TOOLKIT_USES_GTK)
|
|
|
| void InitializeXInput2(void) {
|
| Display* display = base::MessagePumpX::GetDefaultXDisplay();
|
| @@ -83,57 +88,62 @@ void InitializeXInput2(void) {
|
| namespace base {
|
|
|
| MessagePumpX::MessagePumpX() : MessagePumpGlib(),
|
| - x_source_(NULL),
|
| +#if defined(TOOLKIT_USES_GTK)
|
| gdksource_(NULL),
|
| dispatching_event_(false),
|
| capture_x_events_(0),
|
| - capture_gdk_events_(0) {
|
| + capture_gdk_events_(0),
|
| +#endif
|
| + x_source_(NULL) {
|
| + InitializeXInput2();
|
| +#if defined(TOOLKIT_USES_GTK)
|
| if (use_gtk_message_pump) {
|
| gdk_window_add_filter(NULL, &GdkEventFilter, this);
|
| gdk_event_handler_set(&EventDispatcherX, this, NULL);
|
| } else {
|
| - GPollFD* x_poll = new GPollFD();
|
| - x_poll->fd = ConnectionNumber(g_xdisplay);
|
| - x_poll->events = G_IO_IN;
|
| -
|
| - x_source_ = g_source_new(&XSourceFuncs, sizeof(GSource));
|
| - g_source_add_poll(x_source_, x_poll);
|
| - g_source_set_can_recurse(x_source_, FALSE);
|
| - g_source_attach(x_source_, g_main_context_default());
|
| + InitXSource();
|
| }
|
| -
|
| - InitializeXInput2();
|
| if (use_gtk_message_pump)
|
| InitializeEventsToCapture();
|
| +#else
|
| + InitXSource();
|
| +#endif
|
| }
|
|
|
| MessagePumpX::~MessagePumpX() {
|
| +#if defined(TOOLKIT_USES_GTK)
|
| if (use_gtk_message_pump) {
|
| gdk_window_remove_filter(NULL, &GdkEventFilter, this);
|
| gdk_event_handler_set(reinterpret_cast<GdkEventFunc>(gtk_main_do_event),
|
| this, NULL);
|
| - } else {
|
| - g_source_destroy(x_source_);
|
| - g_source_unref(x_source_);
|
| - XCloseDisplay(g_xdisplay);
|
| - g_xdisplay = NULL;
|
| + return;
|
| }
|
| +#endif
|
| +
|
| + g_source_destroy(x_source_);
|
| + g_source_unref(x_source_);
|
| + XCloseDisplay(g_xdisplay);
|
| + g_xdisplay = NULL;
|
| }
|
|
|
| +#if defined(TOOLKIT_USES_GTK)
|
| // static
|
| void MessagePumpX::DisableGtkMessagePump() {
|
| use_gtk_message_pump = false;
|
| - g_xdisplay = XOpenDisplay(NULL);
|
| }
|
| +#endif
|
|
|
| // static
|
| Display* MessagePumpX::GetDefaultXDisplay() {
|
| +#if defined(TOOLKIT_USES_GTK)
|
| if (use_gtk_message_pump) {
|
| static GdkDisplay* display = gdk_display_get_default();
|
| return display ? GDK_DISPLAY_XDISPLAY(display) : NULL;
|
| - } else {
|
| - return g_xdisplay;
|
| }
|
| +#endif
|
| + if (!g_xdisplay)
|
| + g_xdisplay = XOpenDisplay(NULL);
|
| + return g_xdisplay;
|
| }
|
|
|
| // static
|
| @@ -141,9 +151,24 @@ bool MessagePumpX::HasXInput2() {
|
| return xiopcode != -1;
|
| }
|
|
|
| +void MessagePumpX::InitXSource() {
|
| + DCHECK(!x_source_);
|
| + GPollFD* x_poll = new GPollFD();
|
| + x_poll->fd = ConnectionNumber(g_xdisplay);
|
| + x_poll->events = G_IO_IN;
|
| +
|
| + x_source_ = g_source_new(&XSourceFuncs, sizeof(GSource));
|
| + g_source_add_poll(x_source_, x_poll);
|
| + g_source_set_can_recurse(x_source_, FALSE);
|
| + g_source_attach(x_source_, g_main_context_default());
|
| +}
|
| +
|
| bool MessagePumpX::ShouldCaptureXEvent(XEvent* xev) {
|
| - return (!use_gtk_message_pump || capture_x_events_[xev->type])
|
| - && (xev->type != GenericEvent || xev->xcookie.extension == xiopcode);
|
| + return
|
| +#if defined(TOOLKIT_USES_GTK)
|
| + (!use_gtk_message_pump || capture_x_events_[xev->type]) &&
|
| +#endif
|
| + (xev->type != GenericEvent || xev->xcookie.extension == xiopcode);
|
| }
|
|
|
| bool MessagePumpX::ProcessXEvent(XEvent* xev) {
|
| @@ -187,16 +212,19 @@ bool MessagePumpX::RunOnce(GMainContext* context, bool block) {
|
| XNextEvent(display, &xev);
|
| if (ProcessXEvent(&xev))
|
| return true;
|
| +#if defined(TOOLKIT_USES_GTK)
|
| } else if (use_gtk_message_pump && gdksource_) {
|
| // TODO(sad): A couple of extra events can still sneak in during this.
|
| // Those should be sent back to the X queue from the dispatcher
|
| // EventDispatcherX.
|
| gdksource_->source_funcs->dispatch = gdkdispatcher_;
|
| g_main_context_iteration(context, FALSE);
|
| +#endif
|
| }
|
| }
|
|
|
| bool retvalue;
|
| +#if defined(TOOLKIT_USES_GTK)
|
| if (gdksource_ && use_gtk_message_pump) {
|
| // Replace the dispatch callback of the GDK event source temporarily so that
|
| // it doesn't read events from X.
|
| @@ -212,10 +240,24 @@ bool MessagePumpX::RunOnce(GMainContext* context, bool block) {
|
| } else {
|
| retvalue = g_main_context_iteration(context, block);
|
| }
|
| +#else
|
| + retvalue = g_main_context_iteration(context, block);
|
| +#endif
|
|
|
| return retvalue;
|
| }
|
|
|
| +bool MessagePumpX::WillProcessXEvent(XEvent* xevent) {
|
| + ObserverListBase<MessagePumpObserver>::Iterator it(observers());
|
| + MessagePumpObserver* obs;
|
| + while ((obs = it.GetNext()) != NULL) {
|
| + if (obs->WillProcessXEvent(xevent))
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +#if defined(TOOLKIT_USES_GTK)
|
| GdkFilterReturn MessagePumpX::GdkEventFilter(GdkXEvent* gxevent,
|
| GdkEvent* gevent,
|
| gpointer data) {
|
| @@ -230,16 +272,6 @@ GdkFilterReturn MessagePumpX::GdkEventFilter(GdkXEvent* gxevent,
|
| return GDK_FILTER_CONTINUE;
|
| }
|
|
|
| -bool MessagePumpX::WillProcessXEvent(XEvent* xevent) {
|
| - ObserverListBase<MessagePumpObserver>::Iterator it(observers());
|
| - MessagePumpObserver* obs;
|
| - while ((obs = it.GetNext()) != NULL) {
|
| - if (obs->WillProcessXEvent(xevent))
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| void MessagePumpX::EventDispatcherX(GdkEvent* event, gpointer data) {
|
| MessagePumpX* pump_x = reinterpret_cast<MessagePumpX*>(data);
|
| CHECK(use_gtk_message_pump) << "GdkEvent:" << event->type;
|
| @@ -279,11 +311,13 @@ void MessagePumpX::InitializeEventsToCapture(void) {
|
| capture_x_events_[GenericEvent] = true;
|
| }
|
|
|
| +COMPILE_ASSERT(XLASTEvent >= LASTEvent, XLASTEvent_too_small);
|
| +
|
| +#endif // defined(TOOLKIT_USES_GTK)
|
| +
|
| MessagePumpObserver::EventStatus
|
| MessagePumpObserver::WillProcessXEvent(XEvent* xev) {
|
| return EVENT_CONTINUE;
|
| }
|
|
|
| -COMPILE_ASSERT(XLASTEvent >= LASTEvent, XLASTEvent_too_small);
|
| -
|
| } // namespace base
|
|
|