Index: views/touchui/touch_event_dispatcher_gtk.cc |
diff --git a/views/touchui/touch_event_dispatcher_gtk.cc b/views/touchui/touch_event_dispatcher_gtk.cc |
deleted file mode 100644 |
index fc4fcd2e91a2c9945cf34b3b937f0d000972c4ce..0000000000000000000000000000000000000000 |
--- a/views/touchui/touch_event_dispatcher_gtk.cc |
+++ /dev/null |
@@ -1,243 +0,0 @@ |
-// Copyright (c) 2010 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. |
- |
-// This file contains a function that receives a message from the message pump |
-// and dispatches that message to the appropriate root view. That function is |
-// 'DispatchEventForTouchUIGtk'. (Last function in this file.) |
-// |
-// The appropriate RootView is determined for each incoming event. The platform |
-// specific event is converted to a views event and dispatched directly to the |
-// appropriate RootView. |
-// |
-// This implementation is Gdk specific at the moment, but a future CL will |
-// provide a dispatcher that handles events from an X Windows message pump. |
- |
-// TODO(wyck): Make X Windows versions of all GdkEvent functions. |
-// (See individual TODO's below) |
-// |
-// When we switch the message pump from one that gives us GdkEvents to one that |
-// gives us X Windows events, we will need another version of each function. |
-// These ones are obviously specific to GdkEvent. |
-// |
-// Potential names: |
-// Maybe DispatchEventForTouchUIGtk will become DispatchEventForTouchUIX11. |
-// |
-// It may not be necessary to filter events with IsTouchEvent in the X version, |
-// because the message pump may pre-filter the message so that we get only |
-// touch events and there is nothing to filter out. |
- |
-#include <gdk/gdk.h> |
-#include <gdk/gdkx.h> |
- |
-#include "views/widget/root_view.h" |
-#include "views/widget/widget_gtk.h" |
- |
-namespace views { |
- |
-// gets the RootView associated with the GdkEvent. |
-// |
-// TODO(wyck): Make X Windows version of this function. (see earlier comment) |
-static RootView* FindRootViewForGdkEvent(GdkEvent* event) { |
- GdkEventAny* event_any = reinterpret_cast<GdkEventAny*>(event); |
- if (!event_any) { |
- DLOG(WARNING) << "FindRootViewForGdkEvent was passed a null GdkEvent"; |
- return NULL; |
- } |
- GdkWindow* gdk_window = event_any->window; |
- |
- // and get the parent |
- gpointer data = NULL; |
- gdk_window_get_user_data(gdk_window, &data); |
- GtkWidget* gtk_widget = reinterpret_cast<GtkWidget*>(data); |
- if (!gtk_widget) { |
- DLOG(WARNING) << "no GtkWidget found for that GdkWindow"; |
- return NULL; |
- } |
- WidgetGtk* widget_gtk = WidgetGtk::GetViewForNative(gtk_widget); |
- |
- if (!widget_gtk) { |
- DLOG(WARNING) << "no WidgetGtk found for that GtkWidget"; |
- return NULL; |
- } |
- return widget_gtk->GetRootView(); |
-} |
- |
-// Specialized dispatch for GDK_BUTTON_PRESS events |
-static void DispatchButtonPressGtk(const GdkEventButton& event, |
- RootView* root_view) { |
- // TODO(wyck): may need to remap coordinates: |
- // If so, it's like this: |
- // gdk_window_get_root_origin(dest, &dest_x, &dest_y); |
- // *x = event->x_root - dest_x; |
- // *y = event->y_root - dest_y; |
- |
- if (event.type == GDK_2BUTTON_PRESS || event.type == GDK_3BUTTON_PRESS) { |
- // TODO(wyck): decide what to do about 2 button and 3 button press msgs. |
- // You get both a GDK_BUTTON_PRESS and a GDK_2BUTTON_PRESS, so that's |
- // a bit weird. |
- // I'll ignore these events for now. |
- return; |
- } |
- |
- MouseEvent mouse_pressed(Event::ET_MOUSE_PRESSED, event.x, event.y, |
- WidgetGtk::GetFlagsForEventButton(event)); |
- root_view->OnMousePressed(mouse_pressed); |
-} |
- |
-// Specialized dispatch for GDK_BUTTON_RELEASE events |
-static void DispatchButtonReleaseGtk(const GdkEventButton& event, |
- RootView* root_view) { |
- // TODO(wyck): may need to remap coordinates. |
- // If so, it's like this: |
- // gdk_window_get_root_origin(dest, &dest_x, &dest_y); |
- // *x = event->x_root - dest_x; |
- // *y = event->y_root - dest_y; |
- |
- MouseEvent mouse_up(Event::ET_MOUSE_RELEASED, event.x, event.y, |
- WidgetGtk::GetFlagsForEventButton(event)); |
- |
- root_view->OnMouseReleased(mouse_up, false); |
-} |
- |
-// Specialized dispatch for GDK_MOTION_NOTIFY events |
-static void DispatchMotionNotifyGtk(const GdkEventMotion& event, |
- RootView* root_view) { |
- // Regarding GDK_POINTER_MOTION_HINT_MASK: |
- // GDK_POINTER_MOTION_HINT_MASK may have been used to reduce the number of |
- // GDK_MOTION_NOTIFY events received. Normally a GDK_MOTION_NOTIFY event is |
- // received each time the mouse moves. But in the hint case, some events are |
- // marked with is_hint TRUE. Without further action after a hint, no more |
- // motion events will be received. |
- // To receive more motion events after a motion hint event, the application |
- // needs to ask for more by calling gdk_event_request_motions(). |
- if (event.is_hint) { |
- gdk_event_request_motions(&event); |
- } |
- |
- // TODO(wyck): handle dragging |
- // Apparently it's our job to determine the difference between a move and a |
- // drag. We should dispatch OnMouseDragged with ET_MOUSE_DRAGGED instead. |
- // It's unclear what constitutes the dragging state. Which button(s)? |
- int flags = Event::GetFlagsFromGdkState(event.state); |
- MouseEvent mouse_move(Event::ET_MOUSE_MOVED, event.x, event.y, flags); |
- root_view->OnMouseMoved(mouse_move); |
-} |
- |
-// Specialized dispatch for GDK_ENTER_NOTIFY events |
-static void DispatchEnterNotifyGtk(const GdkEventCrossing& event, |
- RootView* root_view) { |
- // TODO(wyck): I'm not sure if this is necessary yet |
- int flags = (Event::GetFlagsFromGdkState(event.state) & |
- ~(Event::EF_LEFT_BUTTON_DOWN | |
- Event::EF_MIDDLE_BUTTON_DOWN | |
- Event::EF_RIGHT_BUTTON_DOWN)); |
- MouseEvent mouse_move(Event::ET_MOUSE_MOVED, event.x, event.y, flags); |
- root_view->OnMouseMoved(mouse_move); |
-} |
- |
-// Specialized dispatch for GDK_LEAVE_NOTIFY events |
-static void DispatchLeaveNotifyGtk(const GdkEventCrossing& event, |
- RootView* root_view) { |
- // TODO(wyck): I'm not sure if this is necessary yet |
- root_view->ProcessOnMouseExited(); |
-} |
- |
-// Dispatch an input-related GdkEvent to a RootView |
-static void DispatchEventToRootViewGtk(GdkEvent* event, RootView* root_view) { |
- if (!event) { |
- DLOG(WARNING) << "DispatchEventToRootView was passed a null GdkEvent"; |
- return; |
- } |
- if (!root_view) { |
- DLOG(WARNING) << "DispatchEventToRootView was passed a null RootView"; |
- return; |
- } |
- switch (event->type) { |
- case GDK_BUTTON_PRESS: |
- DispatchButtonPressGtk(*reinterpret_cast<GdkEventButton*>(event), |
- root_view); |
- break; |
- case GDK_BUTTON_RELEASE: |
- DispatchButtonReleaseGtk(*reinterpret_cast<GdkEventButton*>(event), |
- root_view); |
- break; |
- case GDK_MOTION_NOTIFY: |
- DispatchMotionNotifyGtk(*reinterpret_cast<GdkEventMotion*>(event), |
- root_view); |
- break; |
- case GDK_ENTER_NOTIFY: |
- DispatchEnterNotifyGtk(*reinterpret_cast<GdkEventCrossing*>(event), |
- root_view); |
- break; |
- case GDK_LEAVE_NOTIFY: |
- DispatchLeaveNotifyGtk(*reinterpret_cast<GdkEventCrossing*>(event), |
- root_view); |
- break; |
- case GDK_2BUTTON_PRESS: |
- DispatchButtonPressGtk(*reinterpret_cast<GdkEventButton*>(event), |
- root_view); |
- break; |
- case GDK_3BUTTON_PRESS: |
- DispatchButtonPressGtk(*reinterpret_cast<GdkEventButton*>(event), |
- root_view); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
-} |
- |
-// Called for input-related events only. Dispatches them directly to the |
-// associated RootView. |
-// |
-// TODO(wyck): Make X Windows version of this function. (see earlier comment) |
-static void HijackEventForTouchUIGtk(GdkEvent* event) { |
- // TODO(wyck): something like this... |
- RootView* root_view = FindRootViewForGdkEvent(event); |
- if (!root_view) { |
- DLOG(WARNING) << "no RootView found for that GdkEvent"; |
- return; |
- } |
- DispatchEventToRootViewGtk(event, root_view); |
-} |
- |
-// returns true if the GdkEvent is a touch-related input event. |
-// |
-// TODO(wyck): Make X Windows version of this function. (see earlier comment) |
-// |
-// If the X Windows events are not-prefiltered, then we can provide a filtering |
-// function similar to this GdkEvent-specific function. Otherwise this function |
-// is not needed at all for the X Windows version. |
-static bool IsTouchEventGtk(GdkEvent* event) { |
- switch (event->type) { |
- case GDK_BUTTON_PRESS: |
- case GDK_BUTTON_RELEASE: |
- case GDK_MOTION_NOTIFY: |
- case GDK_ENTER_NOTIFY: |
- case GDK_LEAVE_NOTIFY: |
- case GDK_2BUTTON_PRESS: |
- case GDK_3BUTTON_PRESS: |
- return true; |
- default: |
- return false; |
- } |
-} |
- |
-// This is the public entry point for the touch event dispatcher. |
-// |
-// Hijacks input-related events and routes them directly to a widget_gtk. |
-// Returns false for non-input-related events, in which case the caller is still |
-// responsible for dispatching the event. |
-// |
-// TODO(wyck): Make X Windows version of this function. (see earlier comment) |
-bool DispatchEventForTouchUIGtk(GdkEvent* event) { |
- // is this is an input-related event... |
- if (IsTouchEventGtk(event)) { |
- HijackEventForTouchUIGtk(event); |
- return true; |
- } else { |
- return false; |
- } |
-} |
-} // namespace views |