| Index: base/message_pump_glib_x.cc
|
| ===================================================================
|
| --- base/message_pump_glib_x.cc (revision 65939)
|
| +++ base/message_pump_glib_x.cc (working copy)
|
| @@ -5,11 +5,7 @@
|
| #include "base/message_pump_glib_x.h"
|
|
|
| #include <gdk/gdkx.h>
|
| -#if defined(HAVE_XINPUT2)
|
| -#include <X11/extensions/XInput2.h>
|
| -#else
|
| #include <X11/Xlib.h>
|
| -#endif
|
|
|
| #include "base/message_pump_glib_x_dispatch.h"
|
|
|
| @@ -21,61 +17,17 @@
|
| return TRUE;
|
| }
|
|
|
| -#if defined(HAVE_XINPUT2)
|
| -
|
| -// Setup XInput2 select for the GtkWidget.
|
| -gboolean GtkWidgetRealizeCallback(GSignalInvocationHint* hint, guint nparams,
|
| - const GValue* pvalues, gpointer data) {
|
| - GtkWidget* widget = GTK_WIDGET(g_value_get_object(pvalues));
|
| - GdkWindow* window = widget->window;
|
| - base::MessagePumpGlibX* msgpump = static_cast<base::MessagePumpGlibX*>(data);
|
| -
|
| - DCHECK(window); // TODO(sad): Remove once determined if necessary.
|
| -
|
| - // TODO(sad): Do we need to set a flag on |window| to make sure we don't
|
| - // select for the same GdkWindow multiple times? Does it matter?
|
| - msgpump->SetupXInput2ForXWindow(GDK_WINDOW_XID(window));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -// We need to capture all the GDK windows that get created, and start
|
| -// listening for XInput2 events. So we setup a callback to the 'realize'
|
| -// signal for GTK+ widgets, so that whenever the signal triggers for any
|
| -// GtkWidget, which means the GtkWidget should now have a GdkWindow, we can
|
| -// setup XInput2 events for the GdkWindow.
|
| -void SetupGtkWidgetRealizeNotifier(base::MessagePumpGlibX* msgpump) {
|
| - guint signal_id;
|
| - gpointer klass = g_type_class_ref(GTK_TYPE_WIDGET);
|
| -
|
| - g_signal_parse_name("realize", GTK_TYPE_WIDGET, &signal_id, NULL, FALSE);
|
| - g_signal_add_emission_hook(signal_id, 0, GtkWidgetRealizeCallback,
|
| - static_cast<gpointer>(msgpump), NULL);
|
| -
|
| - g_type_class_unref(klass);
|
| -}
|
| -
|
| -#endif // HAVE_XINPUT2
|
| -
|
| } // namespace
|
|
|
| namespace base {
|
|
|
| MessagePumpGlibX::MessagePumpGlibX() : base::MessagePumpForUI(),
|
| -#if defined(HAVE_XINPUT2)
|
| - xiopcode_(-1),
|
| - masters_(),
|
| - slaves_(),
|
| -#endif
|
| gdksource_(NULL),
|
| dispatching_event_(false),
|
| capture_x_events_(0),
|
| capture_gdk_events_(0) {
|
| gdk_event_handler_set(&EventDispatcherX, this, NULL);
|
|
|
| -#if defined(HAVE_XINPUT2)
|
| - InitializeXInput2();
|
| -#endif
|
| InitializeEventsToCapture();
|
| }
|
|
|
| @@ -88,11 +40,7 @@
|
| if (XPending(display)) {
|
| XEvent xev;
|
| XPeekEvent(display, &xev);
|
| - if (capture_x_events_[xev.type]
|
| -#if defined(HAVE_XINPUT2)
|
| - && (xev.type != GenericEvent || xev.xcookie.extension == xiopcode_)
|
| -#endif
|
| - ) {
|
| + if (capture_x_events_[xev.type]) {
|
| XNextEvent(display, &xev);
|
|
|
| bool processed = static_cast<MessagePumpGlibXDispatcher*>
|
| @@ -100,13 +48,6 @@
|
|
|
| if (!processed) {
|
| DLOG(WARNING) << "Event (" << xev.type << ") not handled.";
|
| -
|
| - // TODO(sad): It is necessary to put back the event so that the default
|
| - // GDK events handler can take care of it. Without this, it is
|
| - // impossible to use the omnibox at the moment. However, this will
|
| - // eventually be removed once the omnibox code is updated for touchui.
|
| - XPutBackEvent(display, &xev);
|
| - g_main_context_iteration(context, FALSE);
|
| }
|
| } else {
|
| // TODO(sad): A couple of extra events can still sneak in during this.
|
| @@ -153,90 +94,8 @@
|
|
|
| capture_x_events_[MotionNotify] = true;
|
| capture_gdk_events_[GDK_MOTION_NOTIFY] = true;
|
| -
|
| -#if defined(HAVE_XINPUT2)
|
| - capture_x_events_[GenericEvent] = true;
|
| -#endif
|
| }
|
|
|
| -#if defined(HAVE_XINPUT2)
|
| -void MessagePumpGlibX::InitializeXInput2(void) {
|
| - GdkDisplay* display = gdk_display_get_default();
|
| - Display* xdisplay = GDK_DISPLAY_XDISPLAY(display);
|
| - int event, err;
|
| -
|
| - if (!XQueryExtension(xdisplay, "XInputExtension", &xiopcode_, &event, &err)) {
|
| - DLOG(WARNING) << "X Input extension not available.";
|
| - xiopcode_ = -1;
|
| - return;
|
| - }
|
| -
|
| - int major = 2, minor = 0;
|
| - if (XIQueryVersion(xdisplay, &major, &minor) == BadRequest) {
|
| - DLOG(WARNING) << "XInput2 not supported in the server.";
|
| - xiopcode_ = -1;
|
| - return;
|
| - }
|
| -
|
| - SetupGtkWidgetRealizeNotifier(this);
|
| -
|
| - // Instead of asking X for the list of devices all the time, let's maintain a
|
| - // list of slave (physical) and master (virtual) pointer devices.
|
| - int count = 0;
|
| - XIDeviceInfo* devices = XIQueryDevice(xdisplay, XIAllDevices, &count);
|
| - for (int i = 0; i < count; i++) {
|
| - XIDeviceInfo* devinfo = devices + i;
|
| - if (devinfo->use == XISlavePointer) {
|
| - slaves_.insert(devinfo->deviceid);
|
| - } else if (devinfo->use == XIMasterPointer) {
|
| - masters_.insert(devinfo->deviceid);
|
| - }
|
| - // We do not need to care about XIFloatingSlave, because the callback for
|
| - // XI_HierarchyChanged event will take care of it.
|
| - }
|
| - XIFreeDeviceInfo(devices);
|
| -
|
| - // TODO(sad): Select on root for XI_HierarchyChanged so that slaves_ and
|
| - // masters_ can be kept up-to-date. This is a relatively rare event, so we can
|
| - // put it off for a later time.
|
| - // Note: It is not necessary to listen for XI_DeviceChanged events.
|
| -}
|
| -
|
| -void MessagePumpGlibX::SetupXInput2ForXWindow(Window xwindow) {
|
| - Display* xdisplay = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
|
| -
|
| - // Setup mask for mouse events.
|
| - unsigned char mask[(XI_LASTEVENT + 7)/8];
|
| - memset(mask, 0, sizeof(mask));
|
| -
|
| - XISetMask(mask, XI_ButtonPress);
|
| - XISetMask(mask, XI_ButtonRelease);
|
| - XISetMask(mask, XI_Motion);
|
| -
|
| - // It is necessary to select only for the master devices. XInput2 provides
|
| - // enough information to the event callback to decide which slave device
|
| - // triggered the event, thus decide whether the 'pointer event' is a 'mouse
|
| - // event' or a 'touch event'. So it is not necessary to select for the slave
|
| - // devices here.
|
| - XIEventMask evmasks[masters_.size()];
|
| - int count = 0;
|
| - for (std::set<int>::const_iterator iter = masters_.begin();
|
| - iter != masters_.end();
|
| - ++iter, ++count) {
|
| - evmasks[count].deviceid = *iter;
|
| - evmasks[count].mask_len = sizeof(mask);
|
| - evmasks[count].mask = mask;
|
| - }
|
| -
|
| - XISelectEvents(xdisplay, xwindow, evmasks, masters_.size());
|
| -
|
| - // TODO(sad): Setup masks for keyboard events.
|
| -
|
| - XFlush(xdisplay);
|
| -}
|
| -
|
| -#endif // HAVE_XINPUT2
|
| -
|
| void MessagePumpGlibX::EventDispatcherX(GdkEvent* event, gpointer data) {
|
| MessagePumpGlibX* pump_x = reinterpret_cast<MessagePumpGlibX*>(data);
|
|
|
|
|