Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3639)

Unified Diff: base/message_pump_glib_x.cc

Issue 4894001: Revert 65938 (arm compile fail) - touchui: First pass at XInput2 message pump... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/message_pump_glib_x.h ('k') | build/linux/system.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « base/message_pump_glib_x.h ('k') | build/linux/system.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698