| Index: chrome/browser/ui/gtk/panels/panel_drag_gtk.cc
|
| diff --git a/chrome/browser/ui/gtk/panels/panel_drag_gtk.cc b/chrome/browser/ui/gtk/panels/panel_drag_gtk.cc
|
| deleted file mode 100644
|
| index 82a928fecc1751e33d7f70f07b658db5b2fdb932..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/gtk/panels/panel_drag_gtk.cc
|
| +++ /dev/null
|
| @@ -1,341 +0,0 @@
|
| -// Copyright (c) 2012 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 "chrome/browser/ui/gtk/panels/panel_drag_gtk.h"
|
| -
|
| -#include <gdk/gdkkeysyms.h>
|
| -
|
| -#include "chrome/browser/ui/panels/panel.h"
|
| -#include "chrome/browser/ui/panels/panel_constants.h"
|
| -#include "chrome/browser/ui/panels/panel_manager.h"
|
| -#include "ui/gfx/gtk_util.h"
|
| -
|
| -namespace {
|
| -
|
| -panel::ResizingSides GdkWindowEdgeToResizingSide(GdkWindowEdge edge) {
|
| - switch (edge) {
|
| - case GDK_WINDOW_EDGE_NORTH_WEST:
|
| - return panel::RESIZE_TOP_LEFT;
|
| - case GDK_WINDOW_EDGE_NORTH:
|
| - return panel::RESIZE_TOP;
|
| - case GDK_WINDOW_EDGE_NORTH_EAST:
|
| - return panel::RESIZE_TOP_RIGHT;
|
| - case GDK_WINDOW_EDGE_WEST:
|
| - return panel::RESIZE_LEFT;
|
| - case GDK_WINDOW_EDGE_EAST:
|
| - return panel::RESIZE_RIGHT;
|
| - case GDK_WINDOW_EDGE_SOUTH_WEST:
|
| - return panel::RESIZE_BOTTOM_LEFT;
|
| - case GDK_WINDOW_EDGE_SOUTH:
|
| - return panel::RESIZE_BOTTOM;
|
| - case GDK_WINDOW_EDGE_SOUTH_EAST:
|
| - return panel::RESIZE_BOTTOM_RIGHT;
|
| - default:
|
| - return panel::RESIZE_NONE;
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// Virtual base class to abstract move vs resize drag logic.
|
| -class PanelDragDelegate {
|
| - public:
|
| - explicit PanelDragDelegate(Panel* panel) : panel_(panel) {}
|
| - virtual ~PanelDragDelegate() {}
|
| -
|
| - Panel* panel() const { return panel_; }
|
| - PanelManager* panel_manager() const { return panel_->manager(); }
|
| -
|
| - // |point| is the mouse location in screen coordinates.
|
| - virtual void DragStarted(gfx::Point point) = 0;
|
| - virtual void Dragged(gfx::Point point) = 0;
|
| -
|
| - // |canceled| is true to abort the drag.
|
| - virtual void DragEnded(bool canceled) = 0;
|
| -
|
| - private:
|
| - Panel* panel_; // Weak pointer to the panel being dragged.
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PanelDragDelegate);
|
| -};
|
| -
|
| -// Delegate for moving a panel by dragging the mouse.
|
| -class MoveDragDelegate : public PanelDragDelegate {
|
| - public:
|
| - explicit MoveDragDelegate(Panel* panel)
|
| - : PanelDragDelegate(panel) {}
|
| - virtual ~MoveDragDelegate() {}
|
| -
|
| - virtual void DragStarted(gfx::Point point) OVERRIDE {
|
| - panel_manager()->StartDragging(panel(), point);
|
| - }
|
| - virtual void Dragged(gfx::Point point) OVERRIDE {
|
| - panel_manager()->Drag(point);
|
| - }
|
| - virtual void DragEnded(bool canceled) OVERRIDE {
|
| - panel_manager()->EndDragging(canceled);
|
| - }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MoveDragDelegate);
|
| -};
|
| -
|
| -// Delegate for resizing a panel by dragging the mouse.
|
| -class ResizeDragDelegate : public PanelDragDelegate {
|
| - public:
|
| - ResizeDragDelegate(Panel* panel, GdkWindowEdge edge)
|
| - : PanelDragDelegate(panel),
|
| - resizing_side_(GdkWindowEdgeToResizingSide(edge)) {}
|
| - virtual ~ResizeDragDelegate() {}
|
| -
|
| - virtual void DragStarted(gfx::Point point) OVERRIDE {
|
| - panel_manager()->StartResizingByMouse(panel(), point, resizing_side_);
|
| - }
|
| - virtual void Dragged(gfx::Point point) OVERRIDE {
|
| - panel_manager()->ResizeByMouse(point);
|
| - }
|
| - virtual void DragEnded(bool canceled) OVERRIDE {
|
| - panel_manager()->EndResizingByMouse(canceled);
|
| - }
|
| - private:
|
| - // The edge from which the panel is being resized.
|
| - panel::ResizingSides resizing_side_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ResizeDragDelegate);
|
| -};
|
| -
|
| -// Panel drag helper for processing mouse and keyboard events while
|
| -// the left mouse button is pressed.
|
| -PanelDragGtk::PanelDragGtk(Panel* panel)
|
| - : panel_(panel),
|
| - drag_state_(NOT_DRAGGING),
|
| - initial_mouse_down_(NULL),
|
| - click_handler_(NULL),
|
| - drag_delegate_(NULL) {
|
| - // Create an invisible event box to receive mouse and key events.
|
| - drag_widget_ = gtk_event_box_new();
|
| - gtk_event_box_set_visible_window(GTK_EVENT_BOX(drag_widget_), FALSE);
|
| -
|
| - // Connect signals for events during a drag.
|
| - g_signal_connect(drag_widget_, "motion-notify-event",
|
| - G_CALLBACK(OnMouseMoveEventThunk), this);
|
| - g_signal_connect(drag_widget_, "key-press-event",
|
| - G_CALLBACK(OnKeyPressEventThunk), this);
|
| - g_signal_connect(drag_widget_, "key-release-event",
|
| - G_CALLBACK(OnKeyReleaseEventThunk), this);
|
| - g_signal_connect(drag_widget_, "button-press-event",
|
| - G_CALLBACK(OnButtonPressEventThunk), this);
|
| - g_signal_connect(drag_widget_, "button-release-event",
|
| - G_CALLBACK(OnButtonReleaseEventThunk), this);
|
| - g_signal_connect(drag_widget_, "grab-broken-event",
|
| - G_CALLBACK(OnGrabBrokenEventThunk), this);
|
| -}
|
| -
|
| -PanelDragGtk::~PanelDragGtk() {
|
| - EndDrag(true); // Clean up drag state.
|
| - ReleasePointerAndKeyboardGrab();
|
| -}
|
| -
|
| -void PanelDragGtk::AssertCleanState() {
|
| - DCHECK_EQ(NOT_DRAGGING, drag_state_);
|
| - DCHECK(!drag_delegate_);
|
| - DCHECK(!initial_mouse_down_);
|
| - DCHECK(!click_handler_);
|
| -}
|
| -
|
| -void PanelDragGtk::InitialWindowEdgeMousePress(GdkEventButton* event,
|
| - GdkCursor* cursor,
|
| - GdkWindowEdge& edge) {
|
| - AssertCleanState();
|
| - drag_delegate_ = new ResizeDragDelegate(panel_, edge);
|
| - drag_state_ = DRAG_CAN_START;
|
| - GrabPointerAndKeyboard(event, cursor);
|
| -}
|
| -
|
| -void PanelDragGtk::InitialTitlebarMousePress(GdkEventButton* event,
|
| - GtkWidget* titlebar_widget) {
|
| - AssertCleanState();
|
| - click_handler_ = titlebar_widget;
|
| - drag_delegate_ = new MoveDragDelegate(panel_);
|
| - drag_state_ = DRAG_CAN_START;
|
| - GrabPointerAndKeyboard(event, gfx::GetCursor(GDK_FLEUR)); // Drag cursor.
|
| -}
|
| -
|
| -void PanelDragGtk::GrabPointerAndKeyboard(GdkEventButton* event,
|
| - GdkCursor* cursor) {
|
| - // Remember initial mouse event for use in determining when drag
|
| - // threshold has been exceeded.
|
| - initial_mouse_down_ = gdk_event_copy(reinterpret_cast<GdkEvent*>(event));
|
| -
|
| - // Grab pointer and keyboard to make sure we have the focus and get
|
| - // all mouse and keyboard events during the drag.
|
| - GdkWindow* gdk_window = gtk_widget_get_window(drag_widget_);
|
| - DCHECK(gdk_window);
|
| - GdkGrabStatus pointer_grab_status =
|
| - gdk_pointer_grab(gdk_window,
|
| - TRUE,
|
| - GdkEventMask(GDK_BUTTON_PRESS_MASK |
|
| - GDK_BUTTON_RELEASE_MASK |
|
| - GDK_POINTER_MOTION_MASK),
|
| - NULL,
|
| - cursor,
|
| - event->time);
|
| - GdkGrabStatus keyboard_grab_status =
|
| - gdk_keyboard_grab(gdk_window, TRUE, event->time);
|
| - if (pointer_grab_status != GDK_GRAB_SUCCESS ||
|
| - keyboard_grab_status != GDK_GRAB_SUCCESS) {
|
| - // Grab could fail if someone else already has the pointer/keyboard
|
| - // grabbed. Cancel the drag.
|
| - DLOG(ERROR) << "Unable to grab pointer or keyboard (pointer_status="
|
| - << pointer_grab_status << ", keyboard_status="
|
| - << keyboard_grab_status << ")";
|
| - EndDrag(true);
|
| - ReleasePointerAndKeyboardGrab();
|
| - return;
|
| - }
|
| -
|
| - gtk_grab_add(drag_widget_);
|
| -}
|
| -
|
| -void PanelDragGtk::ReleasePointerAndKeyboardGrab() {
|
| - DCHECK(!drag_delegate_);
|
| - if (drag_state_ == NOT_DRAGGING)
|
| - return;
|
| -
|
| - DCHECK_EQ(DRAG_ENDED_WAITING_FOR_MOUSE_RELEASE, drag_state_);
|
| - gdk_pointer_ungrab(GDK_CURRENT_TIME);
|
| - gdk_keyboard_ungrab(GDK_CURRENT_TIME);
|
| - gtk_grab_remove(drag_widget_);
|
| - drag_state_ = NOT_DRAGGING; // Drag is truly over now.
|
| -}
|
| -
|
| -void PanelDragGtk::EndDrag(bool canceled) {
|
| - if (drag_state_ == NOT_DRAGGING ||
|
| - drag_state_ == DRAG_ENDED_WAITING_FOR_MOUSE_RELEASE) {
|
| - DCHECK(!drag_delegate_);
|
| - return;
|
| - }
|
| -
|
| - DCHECK(drag_delegate_);
|
| -
|
| - if (initial_mouse_down_) {
|
| - gdk_event_free(initial_mouse_down_);
|
| - initial_mouse_down_ = NULL;
|
| - }
|
| -
|
| - if (drag_state_ == DRAG_IN_PROGRESS) {
|
| - drag_delegate_->DragEnded(canceled);
|
| - }
|
| - drag_state_ = DRAG_ENDED_WAITING_FOR_MOUSE_RELEASE;
|
| -
|
| - delete drag_delegate_;
|
| - drag_delegate_ = NULL;
|
| -
|
| - click_handler_ = NULL;
|
| -}
|
| -
|
| -gboolean PanelDragGtk::OnMouseMoveEvent(GtkWidget* widget,
|
| - GdkEventMotion* event) {
|
| - DCHECK(drag_state_ != NOT_DRAGGING);
|
| -
|
| - if (drag_state_ == DRAG_ENDED_WAITING_FOR_MOUSE_RELEASE) {
|
| - DCHECK(!drag_delegate_);
|
| - return TRUE;
|
| - }
|
| -
|
| - DCHECK(drag_delegate_);
|
| -
|
| - gdouble new_x_double;
|
| - gdouble new_y_double;
|
| - gdk_event_get_root_coords(reinterpret_cast<GdkEvent*>(event),
|
| - &new_x_double, &new_y_double);
|
| - gint new_x = static_cast<gint>(new_x_double);
|
| - gint new_y = static_cast<gint>(new_y_double);
|
| -
|
| - // Begin dragging only after mouse has moved beyond the drag threshold.
|
| - if (drag_state_ == DRAG_CAN_START) {
|
| - DCHECK(initial_mouse_down_);
|
| - gdouble old_x_double;
|
| - gdouble old_y_double;
|
| - gdk_event_get_root_coords(initial_mouse_down_,
|
| - &old_x_double, &old_y_double);
|
| - gint old_x = static_cast<gint>(old_x_double);
|
| - gint old_y = static_cast<gint>(old_y_double);
|
| -
|
| - if (gtk_drag_check_threshold(drag_widget_, old_x, old_y,
|
| - new_x, new_y)) {
|
| - drag_state_ = DRAG_IN_PROGRESS;
|
| - drag_delegate_->DragStarted(gfx::Point(old_x, old_y));
|
| - gdk_event_free(initial_mouse_down_);
|
| - initial_mouse_down_ = NULL;
|
| - }
|
| - }
|
| -
|
| - if (drag_state_ == DRAG_IN_PROGRESS)
|
| - drag_delegate_->Dragged(gfx::Point(new_x, new_y));
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -gboolean PanelDragGtk::OnButtonPressEvent(GtkWidget* widget,
|
| - GdkEventButton* event) {
|
| - DCHECK(drag_state_ != NOT_DRAGGING);
|
| - return TRUE;
|
| -}
|
| -
|
| -gboolean PanelDragGtk::OnButtonReleaseEvent(GtkWidget* widget,
|
| - GdkEventButton* event) {
|
| - DCHECK(drag_state_ != NOT_DRAGGING);
|
| -
|
| - if (event->button == 1) {
|
| - // Treat release as a mouse click if drag was never started.
|
| - if (drag_state_ == DRAG_CAN_START && click_handler_) {
|
| - gtk_propagate_event(click_handler_,
|
| - reinterpret_cast<GdkEvent*>(event));
|
| - }
|
| - // Cleanup state regardless.
|
| - EndDrag(false);
|
| - ReleasePointerAndKeyboardGrab();
|
| - }
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -gboolean PanelDragGtk::OnKeyPressEvent(GtkWidget* widget,
|
| - GdkEventKey* event) {
|
| - DCHECK(drag_state_ != NOT_DRAGGING);
|
| - return TRUE;
|
| -}
|
| -
|
| -gboolean PanelDragGtk::OnKeyReleaseEvent(GtkWidget* widget,
|
| - GdkEventKey* event) {
|
| - DCHECK(drag_state_ != NOT_DRAGGING);
|
| -
|
| - if (drag_state_ == DRAG_ENDED_WAITING_FOR_MOUSE_RELEASE) {
|
| - DCHECK(!drag_delegate_);
|
| - return TRUE;
|
| - }
|
| -
|
| - DCHECK(drag_delegate_);
|
| -
|
| - switch (event->keyval) {
|
| - case GDK_Escape:
|
| - EndDrag(true); // Cancel drag.
|
| - break;
|
| - case GDK_Return:
|
| - case GDK_KP_Enter:
|
| - case GDK_ISO_Enter:
|
| - case GDK_space:
|
| - EndDrag(false); // Normal end.
|
| - break;
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| -gboolean PanelDragGtk::OnGrabBrokenEvent(GtkWidget* widget,
|
| - GdkEventGrabBroken* event) {
|
| - DCHECK(drag_state_ != NOT_DRAGGING);
|
| - EndDrag(true); // Cancel drag.
|
| - ReleasePointerAndKeyboardGrab();
|
| - return TRUE;
|
| -}
|
|
|