OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_ | |
6 #define CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_ | |
7 #pragma once | |
8 | |
9 #include <gdk/gdk.h> | |
10 | |
11 #include <string> | |
12 #include <vector> | |
13 | |
14 #include "base/memory/scoped_ptr.h" | |
15 #include "base/time.h" | |
16 #include "chrome/browser/ui/gtk/owned_widget_gtk.h" | |
17 #include "content/browser/renderer_host/render_widget_host_view.h" | |
18 #include "ui/base/animation/animation_delegate.h" | |
19 #include "ui/base/animation/slide_animation.h" | |
20 #include "ui/base/gtk/gtk_signal.h" | |
21 #include "ui/gfx/native_widget_types.h" | |
22 #include "ui/gfx/rect.h" | |
23 #include "webkit/glue/webcursor.h" | |
24 #include "webkit/plugins/npapi/gtk_plugin_container_manager.h" | |
25 | |
26 class RenderWidgetHost; | |
27 class GtkIMContextWrapper; | |
28 #if !defined(TOOLKIT_VIEWS) | |
29 class MenuGtk; | |
30 #endif | |
31 struct NativeWebKeyboardEvent; | |
32 | |
33 #if defined(OS_CHROMEOS) | |
34 namespace views { | |
35 class TooltipWindowGtk; | |
36 } | |
37 #else | |
38 class GtkKeyBindingsHandler; | |
39 #endif // defined(OS_CHROMEOS) | |
40 | |
41 typedef struct _GtkClipboard GtkClipboard; | |
42 typedef struct _GtkSelectionData GtkSelectionData; | |
43 | |
44 // ----------------------------------------------------------------------------- | |
45 // See comments in render_widget_host_view.h about this class and its members. | |
46 // ----------------------------------------------------------------------------- | |
47 class RenderWidgetHostViewGtk : public RenderWidgetHostView, | |
48 public ui::AnimationDelegate { | |
49 public: | |
50 explicit RenderWidgetHostViewGtk(RenderWidgetHost* widget); | |
51 virtual ~RenderWidgetHostViewGtk(); | |
52 | |
53 // Initialize this object for use as a drawing area. | |
54 void InitAsChild(); | |
55 | |
56 // RenderWidgetHostView implementation. | |
57 virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, | |
58 const gfx::Rect& pos) OVERRIDE; | |
59 virtual void InitAsFullscreen( | |
60 RenderWidgetHostView* reference_host_view) OVERRIDE; | |
61 virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; | |
62 virtual void DidBecomeSelected() OVERRIDE; | |
63 virtual void WasHidden() OVERRIDE; | |
64 virtual void SetSize(const gfx::Size& size) OVERRIDE; | |
65 virtual void SetBounds(const gfx::Rect& rect) OVERRIDE; | |
66 virtual gfx::NativeView GetNativeView() OVERRIDE; | |
67 virtual void MovePluginWindows( | |
68 const std::vector<webkit::npapi::WebPluginGeometry>& moves) OVERRIDE; | |
69 virtual void Focus() OVERRIDE; | |
70 virtual void Blur() OVERRIDE; | |
71 virtual bool HasFocus() OVERRIDE; | |
72 virtual void Show() OVERRIDE; | |
73 virtual void Hide() OVERRIDE; | |
74 virtual bool IsShowing() OVERRIDE; | |
75 virtual gfx::Rect GetViewBounds() const OVERRIDE; | |
76 virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE; | |
77 virtual void SetIsLoading(bool is_loading) OVERRIDE; | |
78 virtual void ImeUpdateTextInputState(ui::TextInputType type, | |
79 bool can_compose_inline, | |
80 const gfx::Rect& caret_rect) OVERRIDE; | |
81 virtual void ImeCancelComposition() OVERRIDE; | |
82 virtual void DidUpdateBackingStore( | |
83 const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy, | |
84 const std::vector<gfx::Rect>& copy_rects) OVERRIDE; | |
85 virtual void RenderViewGone(base::TerminationStatus status, | |
86 int error_code) OVERRIDE; | |
87 virtual void Destroy() OVERRIDE; | |
88 virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) {} | |
89 virtual void SetTooltipText(const std::wstring& tooltip_text) OVERRIDE; | |
90 virtual void SelectionChanged(const std::string& text, | |
91 const ui::Range& range, | |
92 const gfx::Point& start, | |
93 const gfx::Point& end) OVERRIDE; | |
94 virtual void ShowingContextMenu(bool showing) OVERRIDE; | |
95 virtual BackingStore* AllocBackingStore(const gfx::Size& size) OVERRIDE; | |
96 virtual void SetBackground(const SkBitmap& background) OVERRIDE; | |
97 virtual void CreatePluginContainer(gfx::PluginWindowHandle id) OVERRIDE; | |
98 virtual void DestroyPluginContainer(gfx::PluginWindowHandle id) OVERRIDE; | |
99 virtual void SetVisuallyDeemphasized(const SkColor* color, | |
100 bool animate) OVERRIDE; | |
101 virtual void UnhandledWheelEvent( | |
102 const WebKit::WebMouseWheelEvent& event) OVERRIDE; | |
103 virtual void SetHasHorizontalScrollbar( | |
104 bool has_horizontal_scrollbar) OVERRIDE; | |
105 virtual void SetScrollOffsetPinning( | |
106 bool is_pinned_to_left, bool is_pinned_to_right) OVERRIDE; | |
107 virtual void AcceleratedCompositingActivated(bool activated) OVERRIDE; | |
108 virtual gfx::PluginWindowHandle GetCompositingSurface() OVERRIDE; | |
109 | |
110 // ui::AnimationDelegate implementation. | |
111 virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE; | |
112 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; | |
113 virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE; | |
114 | |
115 gfx::NativeView native_view() const { return view_.get(); } | |
116 | |
117 // If the widget is aligned with an edge of the monitor its on and the user | |
118 // attempts to drag past that edge we track the number of times it has | |
119 // occurred, so that we can force the widget to scroll when it otherwise | |
120 // would be unable to. | |
121 void ModifyEventForEdgeDragging(GtkWidget* widget, GdkEventMotion* event); | |
122 void Paint(const gfx::Rect&); | |
123 | |
124 // Called by GtkIMContextWrapper to forward a keyboard event to renderer. | |
125 // On Linux (not ChromeOS): | |
126 // Before calling RenderWidgetHost::ForwardKeyboardEvent(), this method | |
127 // calls GtkKeyBindingsHandler::Match() against the event and send matched | |
128 // edit commands to renderer by calling | |
129 // RenderWidgetHost::ForwardEditCommandsForNextKeyEvent(). | |
130 void ForwardKeyboardEvent(const NativeWebKeyboardEvent& event); | |
131 | |
132 GdkEventButton* last_mouse_down() const { | |
133 return last_mouse_down_; | |
134 } | |
135 | |
136 #if !defined(TOOLKIT_VIEWS) | |
137 // Appends the input methods context menu to the specified |menu| object as a | |
138 // submenu. | |
139 void AppendInputMethodsContextMenu(MenuGtk* menu); | |
140 #endif | |
141 | |
142 private: | |
143 friend class RenderWidgetHostViewGtkWidget; | |
144 | |
145 CHROMEGTK_CALLBACK_1(RenderWidgetHostViewGtk, | |
146 gboolean, | |
147 OnWindowStateEvent, | |
148 GdkEventWindowState*); | |
149 | |
150 CHROMEGTK_CALLBACK_0(RenderWidgetHostViewGtk, | |
151 void, | |
152 OnDestroy); | |
153 | |
154 // Returns whether the widget needs an input grab (GTK+ and X) to work | |
155 // properly. | |
156 bool NeedsInputGrab(); | |
157 | |
158 // Returns whether this render view is a popup (<select> dropdown or | |
159 // autocomplete window). | |
160 bool IsPopup() const; | |
161 | |
162 // Do initialization needed by all InitAs*() methods. | |
163 void DoSharedInit(); | |
164 | |
165 // Do initialization needed just by InitAsPopup() and InitAsFullscreen(). | |
166 // We move and resize |window| to |bounds| and show it and its contents. | |
167 void DoPopupOrFullscreenInit(GtkWindow* window, const gfx::Rect& bounds); | |
168 | |
169 // Update the display cursor for the render view. | |
170 void ShowCurrentCursor(); | |
171 | |
172 void set_last_mouse_down(GdkEventButton* event); | |
173 | |
174 // The model object. | |
175 RenderWidgetHost* host_; | |
176 | |
177 // The native UI widget. | |
178 OwnedWidgetGtk view_; | |
179 | |
180 // This is true when we are currently painting and thus should handle extra | |
181 // paint requests by expanding the invalid rect rather than actually | |
182 // painting. | |
183 bool about_to_validate_and_paint_; | |
184 | |
185 // This is the rectangle which we'll paint. | |
186 gfx::Rect invalid_rect_; | |
187 | |
188 // Whether or not this widget is hidden. | |
189 bool is_hidden_; | |
190 | |
191 // Whether we are currently loading. | |
192 bool is_loading_; | |
193 | |
194 // The cursor for the page. This is passed up from the renderer. | |
195 WebCursor current_cursor_; | |
196 | |
197 // Whether we are showing a context menu. | |
198 bool is_showing_context_menu_; | |
199 | |
200 // The time at which this view started displaying white pixels as a result of | |
201 // not having anything to paint (empty backing store from renderer). This | |
202 // value returns true for is_null() if we are not recording whiteout times. | |
203 base::TimeTicks whiteout_start_time_; | |
204 | |
205 // The time it took after this view was selected for it to be fully painted. | |
206 base::TimeTicks tab_switch_paint_time_; | |
207 | |
208 // A color we use to shade the entire render view. If 100% transparent, we do | |
209 // not shade the render view. | |
210 SkColor overlay_color_; | |
211 | |
212 // The animation used for the abovementioned shade effect. The animation's | |
213 // value affects the alpha we use for |overlay_color_|. | |
214 ui::SlideAnimation overlay_animation_; | |
215 | |
216 // The native view of our parent widget. Used only for popups. | |
217 GtkWidget* parent_; | |
218 | |
219 // We ignore the first mouse release on popups so the popup will remain open. | |
220 bool is_popup_first_mouse_release_; | |
221 | |
222 // Whether or not this widget's input context was focused before being | |
223 // shadowed by another widget. Used in OnGrabNotify() handler to track the | |
224 // focused state correctly. | |
225 bool was_imcontext_focused_before_grab_; | |
226 | |
227 // True if we are responsible for creating an X grab. This will only be used | |
228 // for <select> dropdowns. It should be true for most such cases, but false | |
229 // for extension popups. | |
230 bool do_x_grab_; | |
231 | |
232 // Is the widget fullscreen? | |
233 bool is_fullscreen_; | |
234 | |
235 // For full-screen windows we have a OnDestroy handler that we need to remove, | |
236 // so we keep it ID here. | |
237 unsigned long destroy_handler_id_; | |
238 | |
239 // A convenience wrapper object for GtkIMContext; | |
240 scoped_ptr<GtkIMContextWrapper> im_context_; | |
241 | |
242 #if !defined(OS_CHROMEOS) | |
243 // A convenience object for handling editor key bindings defined in gtk | |
244 // keyboard theme. | |
245 scoped_ptr<GtkKeyBindingsHandler> key_bindings_handler_; | |
246 #endif | |
247 | |
248 // Helper class that lets us allocate plugin containers and move them. | |
249 webkit::npapi::GtkPluginContainerManager plugin_container_manager_; | |
250 | |
251 // The size that we want the renderer to be. We keep this in a separate | |
252 // variable because resizing in GTK+ is async. | |
253 gfx::Size requested_size_; | |
254 | |
255 // The number of times the user has dragged against horizontal edge of the | |
256 // monitor (if the widget is aligned with that edge). Negative values | |
257 // indicate the left edge, positive the right. | |
258 int dragged_at_horizontal_edge_; | |
259 | |
260 // The number of times the user has dragged against vertical edge of the | |
261 // monitor (if the widget is aligned with that edge). Negative values | |
262 // indicate the top edge, positive the bottom. | |
263 int dragged_at_vertical_edge_; | |
264 | |
265 gfx::PluginWindowHandle compositing_surface_; | |
266 | |
267 // The event for the last mouse down we handled. We need this for context | |
268 // menus and drags. | |
269 GdkEventButton* last_mouse_down_; | |
270 | |
271 #if defined(OS_CHROMEOS) | |
272 // Custimized tooltip window. | |
273 scoped_ptr<views::TooltipWindowGtk> tooltip_window_; | |
274 #endif // defined(OS_CHROMEOS) | |
275 }; | |
276 | |
277 #endif // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_ | |
OLD | NEW |