| Index: base/message_pump_glib_x.cc
|
| diff --git a/base/message_pump_glib_x.cc b/base/message_pump_glib_x.cc
|
| index 775e9409333b056af5318c798f1529ccd089c463..e72606d1061d5b724a46030d27cdd9fd4a465df2 100644
|
| --- a/base/message_pump_glib_x.cc
|
| +++ b/base/message_pump_glib_x.cc
|
| @@ -82,6 +82,41 @@ MessagePumpGlibX::MessagePumpGlibX() : base::MessagePumpForUI(),
|
| MessagePumpGlibX::~MessagePumpGlibX() {
|
| }
|
|
|
| +#if defined(HAVE_XINPUT2)
|
| +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
|
| +
|
| bool MessagePumpGlibX::RunOnce(GMainContext* context, bool block) {
|
| GdkDisplay* gdisp = gdk_display_get_default();
|
| if (!gdisp)
|
| @@ -166,6 +201,25 @@ bool MessagePumpGlibX::RunOnce(GMainContext* context, bool block) {
|
| return retvalue;
|
| }
|
|
|
| +void MessagePumpGlibX::EventDispatcherX(GdkEvent* event, gpointer data) {
|
| + MessagePumpGlibX* pump_x = reinterpret_cast<MessagePumpGlibX*>(data);
|
| +
|
| + if (!pump_x->gdksource_) {
|
| + pump_x->gdksource_ = g_main_current_source();
|
| + pump_x->gdkdispatcher_ = pump_x->gdksource_->source_funcs->dispatch;
|
| + } else if (!pump_x->IsDispatchingEvent()) {
|
| + if (event->type != GDK_NOTHING &&
|
| + pump_x->capture_gdk_events_[event->type]) {
|
| + // TODO(sad): An X event is caught by the GDK handler. Put it back in the
|
| + // X queue so that we catch it in the next iteration. When done, the
|
| + // following DLOG statement will be removed.
|
| + DLOG(WARNING) << "GDK received an event it shouldn't have";
|
| + }
|
| + }
|
| +
|
| + pump_x->DispatchEvents(event);
|
| +}
|
| +
|
| void MessagePumpGlibX::InitializeEventsToCapture(void) {
|
| // TODO(sad): Decide which events we want to capture and update the tables
|
| // accordingly.
|
| @@ -237,59 +291,6 @@ void MessagePumpGlibX::InitializeXInput2(void) {
|
| // 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);
|
| -
|
| - if (!pump_x->gdksource_) {
|
| - pump_x->gdksource_ = g_main_current_source();
|
| - pump_x->gdkdispatcher_ = pump_x->gdksource_->source_funcs->dispatch;
|
| - } else if (!pump_x->IsDispatchingEvent()) {
|
| - if (event->type != GDK_NOTHING &&
|
| - pump_x->capture_gdk_events_[event->type]) {
|
| - // TODO(sad): An X event is caught by the GDK handler. Put it back in the
|
| - // X queue so that we catch it in the next iteration. When done, the
|
| - // following DLOG statement will be removed.
|
| - DLOG(WARNING) << "GDK received an event it shouldn't have";
|
| - }
|
| - }
|
| -
|
| - pump_x->DispatchEvents(event);
|
| -}
|
| -
|
| } // namespace base
|
|
|