Index: ui/views/focus/accelerator_handler_touch.cc |
=================================================================== |
--- ui/views/focus/accelerator_handler_touch.cc (revision 110826) |
+++ ui/views/focus/accelerator_handler_touch.cc (working copy) |
@@ -1,188 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ui/views/focus/accelerator_handler.h" |
- |
-#include <X11/extensions/XInput2.h> |
-#include <gtk/gtk.h> |
- |
-#include <bitset> |
- |
-#include "ui/base/touch/touch_factory.h" |
-#include "ui/views/events/event.h" |
-#include "ui/views/focus/focus_manager.h" |
-#include "ui/views/ime/input_method.h" |
-#include "views/view.h" |
-#include "views/widget/native_widget.h" |
- |
-namespace views { |
- |
-namespace { |
- |
-Widget* FindWidgetForGdkWindow(GdkWindow* gdk_window) { |
- gpointer data = NULL; |
- gdk_window_get_user_data(gdk_window, &data); |
- GtkWidget* gtk_widget = reinterpret_cast<GtkWidget*>(data); |
- if (!gtk_widget || !GTK_IS_WIDGET(gtk_widget)) { |
- DLOG(WARNING) << "no GtkWidget found for that GdkWindow"; |
- return NULL; |
- } |
- Widget* widget = Widget::GetWidgetForNativeView(gtk_widget); |
- |
- if (!widget) { |
- DLOG(WARNING) << "no NativeWidgetGtk found for that GtkWidget"; |
- return NULL; |
- } |
- return widget; |
-} |
- |
-} // namespace |
- |
-bool DispatchX2Event(Widget* widget, XEvent* xev) { |
- XGenericEventCookie* cookie = &xev->xcookie; |
- switch (cookie->evtype) { |
- case XI_KeyPress: |
- case XI_KeyRelease: { |
- // TODO(sad): We don't capture XInput2 events from keyboard yet. |
- break; |
- } |
-#if defined(USE_XI2_MT) |
- case XI_TouchBegin: |
- case XI_TouchEnd: |
- case XI_TouchUpdate: { |
- // Hide the cursor when a touch event comes in. |
- ui::TouchFactory::GetInstance()->SetCursorVisible(false, false); |
- |
- // If the TouchEvent is processed by |widget|, then return. |
- TouchEvent touch(xev); |
- if (widget->OnTouchEvent(touch) != ui::TOUCH_STATUS_UNKNOWN) |
- return true; |
- |
- // We do not want to generate a mouse event for an unprocessed touch |
- // event here. That is already done by the gesture manager in |
- // RootView::OnTouchEvent. |
- return false; |
- } |
-#endif |
- case XI_ButtonPress: |
- case XI_ButtonRelease: |
- case XI_Motion: { |
- XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(cookie->data); |
- |
- // Scrolling the wheel generates press/release events with button id's 4 |
- // and 5. In case of a wheelscroll, we do not want to show the cursor. |
- if (xievent->detail == 4 || xievent->detail == 5) { |
- MouseWheelEvent wheelev(xev); |
- return widget->OnMouseEvent(wheelev); |
- } |
- |
- ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); |
- // Is the event coming from a touch device? |
- if (factory->IsTouchDevice(xievent->sourceid)) { |
- // Hide the cursor when a touch event comes in. |
- factory->SetCursorVisible(false, false); |
- |
- // With XInput 2.0, XI_ButtonPress and XI_ButtonRelease events are |
- // ignored, as XI_Motion events contain enough data to detect finger |
- // press and release. See more notes in TouchFactory::TouchParam. |
- if ((cookie->evtype == XI_ButtonPress || |
- cookie->evtype == XI_ButtonRelease) && |
- factory->IsRealTouchDevice(xievent->sourceid)) |
- return false; |
- |
- // If the TouchEvent is processed by |widget|, then return. Otherwise |
- // let it fall through so it can be used as a MouseEvent, if desired. |
- TouchEvent touch(xev); |
- if (widget->OnTouchEvent(touch) != ui::TOUCH_STATUS_UNKNOWN) |
- return true; |
- |
- // We do not want to generate a mouse event for an unprocessed touch |
- // event here. That is already done by the gesture manager in |
- // RootView::OnTouchEvent. |
- return false; |
- } else { |
- MouseEvent mouseev(xev); |
- |
- // Show the cursor. Start a timer to hide the cursor after a delay on |
- // move (not drag) events, or if the only button pressed is released. |
- bool start_timer = mouseev.type() == ui::ET_MOUSE_MOVED; |
- start_timer |= mouseev.type() == ui::ET_MOUSE_RELEASED && |
- (mouseev.IsOnlyLeftMouseButton() || |
- mouseev.IsOnlyMiddleMouseButton() || |
- mouseev.IsOnlyRightMouseButton()); |
- factory->SetCursorVisible(true, start_timer); |
- |
- return widget->OnMouseEvent(mouseev); |
- } |
- } |
- } |
- return false; |
-} |
- |
-bool DispatchXEvent(XEvent* xev) { |
- GdkDisplay* gdisp = gdk_display_get_default(); |
- XID xwindow = xev->xany.window; |
- |
- if (xev->type == GenericEvent) { |
- if (!ui::TouchFactory::GetInstance()->ShouldProcessXI2Event(xev)) |
- return true; // Consume the event. |
- |
- XGenericEventCookie* cookie = &xev->xcookie; |
- if (cookie->evtype == XI_HierarchyChanged) { |
- ui::TouchFactory::GetInstance()->UpdateDeviceList(cookie->display); |
- return true; |
- } |
- |
- XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(cookie->data); |
- xwindow = xiev->event; |
- } |
- |
- GdkWindow* gwind = gdk_window_lookup_for_display(gdisp, xwindow); |
- Widget* widget = FindWidgetForGdkWindow(gwind); |
- if (widget) { |
- switch (xev->type) { |
- case KeyPress: |
- case KeyRelease: { |
- KeyEvent keyev(xev); |
- InputMethod* ime = widget->GetInputMethod(); |
- // Always dispatch key events to the input method first, to make sure |
- // that the input method's hotkeys work all time. |
- if (ime) { |
- ime->DispatchKeyEvent(keyev); |
- return true; |
- } |
- return widget->OnKeyEvent(keyev); |
- } |
- case ButtonPress: |
- case ButtonRelease: |
- if (xev->xbutton.button == 4 || xev->xbutton.button == 5) { |
- // Scrolling the wheel triggers button press/release events. |
- MouseWheelEvent wheelev(xev); |
- return widget->OnMouseEvent(wheelev); |
- } |
- // fallthrough |
- case MotionNotify: { |
- MouseEvent mouseev(xev); |
- return widget->OnMouseEvent(mouseev); |
- } |
- |
- case GenericEvent: { |
- return DispatchX2Event(widget, xev); |
- } |
- } |
- } |
- |
- return false; |
-} |
- |
-AcceleratorHandler::AcceleratorHandler() {} |
- |
-base::MessagePumpDispatcher::DispatchStatus |
- AcceleratorHandler::Dispatch(XEvent* xev) { |
- return DispatchXEvent(xev) ? |
- base::MessagePumpDispatcher::EVENT_PROCESSED : |
- base::MessagePumpDispatcher::EVENT_IGNORED; |
-} |
- |
-} // namespace views |