• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_UI_GTK_PANELS_PANEL_DRAG_GTK_H_
6 #define CHROME_BROWSER_UI_GTK_PANELS_PANEL_DRAG_GTK_H_
7 
8 #include <gtk/gtk.h>
9 
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #include "ui/base/gtk/gtk_signal.h"
13 
14 class Panel;
15 class PanelDragDelegate;
16 
17 // Class for GTK handling of move-drag and resize-drag on a panel.
18 // Only one type of drag may be active at any time.
19 // Dragging only begins if the mouse is moved beyond the drag threshold.
20 // If mouse is released without exceeding the drag threshold, the mouse
21 // press and release is treated as a mouse click.
22 class PanelDragGtk {
23  public:
24   explicit PanelDragGtk(Panel* panel);
25   ~PanelDragGtk();
26 
widget()27   GtkWidget* widget() const { return drag_widget_; }
28 
29   // Sets up mouse and keyboard events processing while the mouse
30   // is pressed on a window edge.
31   // |event| is the mouse press event.
32   // |cursor| is the cursor to display during the drag.
33   // |edge| is the window edge from which to resize the panel.
34   void InitialWindowEdgeMousePress(GdkEventButton* event, GdkCursor* cursor,
35                                    GdkWindowEdge& edge);
36 
37   // Sets up mouse and keyboard events processing while the mouse is
38   // pressed on the titlebar.
39   // |event| is the mouse press event.
40   // |titlebar_widget| should handle the mouse release event if the mouse
41   // is released without exceeding the drag threshold (a mouse click).
42   void InitialTitlebarMousePress(GdkEventButton* event,
43                                  GtkWidget* titlebar_widget);
44 
45  private:
46   friend class GtkNativePanelTesting;
47 
48   enum DragState {
49     NOT_DRAGGING,
50     DRAG_CAN_START,  // mouse pressed
51     DRAG_IN_PROGRESS,  // mouse moved beyond drag threshold
52     DRAG_ENDED_WAITING_FOR_MOUSE_RELEASE
53   };
54 
55   // Callbacks for GTK mouse and key events.
56   CHROMEGTK_CALLBACK_1(PanelDragGtk, gboolean, OnMouseMoveEvent,
57                        GdkEventMotion*);
58   CHROMEGTK_CALLBACK_1(PanelDragGtk, gboolean, OnButtonPressEvent,
59                        GdkEventButton*);
60   CHROMEGTK_CALLBACK_1(PanelDragGtk, gboolean, OnButtonReleaseEvent,
61                        GdkEventButton*);
62   CHROMEGTK_CALLBACK_1(PanelDragGtk, gboolean, OnKeyPressEvent,
63                        GdkEventKey*);
64   CHROMEGTK_CALLBACK_1(PanelDragGtk, gboolean, OnKeyReleaseEvent,
65                        GdkEventKey*);
66   CHROMEGTK_CALLBACK_1(PanelDragGtk, gboolean, OnGrabBrokenEvent,
67                        GdkEventGrabBroken*);
68 
69   // Utility to dcheck a bunch of state to ensure a clean slate.
70   // Returns only if all the dchecks pass.
71   void AssertCleanState();
72 
73   void GrabPointerAndKeyboard(GdkEventButton* event,
74                               GdkCursor* cursor);
75   void ReleasePointerAndKeyboardGrab();
76 
77   // Ends any drag that is currently in progress (if any).
78   // Resets all drag state except for pointer and keyboard grabs.
79   // The grabs are released when the mouse is released to prevent a
80   // mouse release *after* the drag has ended (e.g. via ESC key) from
81   // being treated as a mouse click.
82   void EndDrag(bool canceled);
83 
84   // Weak pointer to the panel being dragged.
85   Panel* panel_;
86 
87   // Invisible event box to receive mouse and key events.
88   GtkWidget* drag_widget_;
89 
90   DragState drag_state_;
91 
92   // A copy of the initial button press event.
93   GdkEvent* initial_mouse_down_;
94 
95   // Widget that should process the mouse click if mouse is released
96   // without exceeding the drag threshold. May be NULL if no click
97   // handling is necessary.
98   GtkWidget* click_handler_;
99 
100   // Delegate for processing drag depends on actual type of drag.
101   PanelDragDelegate* drag_delegate_;
102 
103   DISALLOW_COPY_AND_ASSIGN(PanelDragGtk);
104 };
105 
106 #endif  // CHROME_BROWSER_UI_GTK_PANELS_PANEL_DRAG_GTK_H_
107