OLD | NEW |
| (Empty) |
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 | |
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_ | |
OLD | NEW |