| 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 CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_ | |
| 6 #define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_ | |
| 7 | |
| 8 #include <gdk/gdk.h> | |
| 9 | |
| 10 #include <string> | |
| 11 #include <vector> | |
| 12 | |
| 13 #include "base/memory/scoped_ptr.h" | |
| 14 #include "base/time/time.h" | |
| 15 #include "content/browser/accessibility/browser_accessibility_manager.h" | |
| 16 #include "content/browser/renderer_host/gtk_plugin_container_manager.h" | |
| 17 #include "content/browser/renderer_host/render_widget_host_view_base.h" | |
| 18 #include "content/common/content_export.h" | |
| 19 #include "content/common/cursors/webcursor.h" | |
| 20 #include "ipc/ipc_sender.h" | |
| 21 #include "ui/base/gtk/gtk_signal.h" | |
| 22 #include "ui/base/gtk/gtk_signal_registrar.h" | |
| 23 #include "ui/base/gtk/owned_widget_gtk.h" | |
| 24 #include "ui/base/x/active_window_watcher_x_observer.h" | |
| 25 #include "ui/gfx/native_widget_types.h" | |
| 26 #include "ui/gfx/point.h" | |
| 27 #include "ui/gfx/rect.h" | |
| 28 | |
| 29 typedef struct _GtkClipboard GtkClipboard; | |
| 30 typedef struct _GtkSelectionData GtkSelectionData; | |
| 31 | |
| 32 namespace content { | |
| 33 class GtkIMContextWrapper; | |
| 34 class GtkKeyBindingsHandler; | |
| 35 class RenderWidgetHost; | |
| 36 class RenderWidgetHostImpl; | |
| 37 struct NativeWebKeyboardEvent; | |
| 38 | |
| 39 // ----------------------------------------------------------------------------- | |
| 40 // See comments in render_widget_host_view.h about this class and its members. | |
| 41 // ----------------------------------------------------------------------------- | |
| 42 class CONTENT_EXPORT RenderWidgetHostViewGtk | |
| 43 : public RenderWidgetHostViewBase, | |
| 44 public BrowserAccessibilityDelegate, | |
| 45 public ui::ActiveWindowWatcherXObserver, | |
| 46 public IPC::Sender { | |
| 47 public: | |
| 48 virtual ~RenderWidgetHostViewGtk(); | |
| 49 | |
| 50 // RenderWidgetHostView implementation. | |
| 51 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; | |
| 52 virtual void InitAsChild(gfx::NativeView parent_view) OVERRIDE; | |
| 53 virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; | |
| 54 virtual void SetSize(const gfx::Size& size) OVERRIDE; | |
| 55 virtual void SetBounds(const gfx::Rect& rect) OVERRIDE; | |
| 56 virtual gfx::NativeView GetNativeView() const OVERRIDE; | |
| 57 virtual gfx::NativeViewId GetNativeViewId() const OVERRIDE; | |
| 58 virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE; | |
| 59 virtual bool HasFocus() const OVERRIDE; | |
| 60 virtual bool IsSurfaceAvailableForCopy() const OVERRIDE; | |
| 61 virtual void Show() OVERRIDE; | |
| 62 virtual void Hide() OVERRIDE; | |
| 63 virtual bool IsShowing() OVERRIDE; | |
| 64 virtual gfx::Rect GetViewBounds() const OVERRIDE; | |
| 65 virtual GdkEventButton* GetLastMouseDown() OVERRIDE; | |
| 66 virtual gfx::NativeView BuildInputMethodsGtkMenu() OVERRIDE; | |
| 67 virtual void SetBackground(const SkBitmap& background) OVERRIDE; | |
| 68 | |
| 69 // RenderWidgetHostViewPort implementation. | |
| 70 virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, | |
| 71 const gfx::Rect& pos) OVERRIDE; | |
| 72 virtual void InitAsFullscreen( | |
| 73 RenderWidgetHostView* reference_host_view) OVERRIDE; | |
| 74 virtual void WasShown() OVERRIDE; | |
| 75 virtual void WasHidden() OVERRIDE; | |
| 76 virtual void MovePluginWindows( | |
| 77 const gfx::Vector2d& scroll_offset, | |
| 78 const std::vector<WebPluginGeometry>& moves) OVERRIDE; | |
| 79 virtual void Focus() OVERRIDE; | |
| 80 virtual void Blur() OVERRIDE; | |
| 81 virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE; | |
| 82 virtual void SetIsLoading(bool is_loading) OVERRIDE; | |
| 83 virtual void TextInputTypeChanged(ui::TextInputType type, | |
| 84 ui::TextInputMode input_mode, | |
| 85 bool can_compose_inline) OVERRIDE; | |
| 86 virtual void ImeCancelComposition() OVERRIDE; | |
| 87 virtual void DidUpdateBackingStore( | |
| 88 const gfx::Rect& scroll_rect, | |
| 89 const gfx::Vector2d& scroll_delta, | |
| 90 const std::vector<gfx::Rect>& copy_rects, | |
| 91 const std::vector<ui::LatencyInfo>& latency_info) OVERRIDE; | |
| 92 virtual void RenderProcessGone(base::TerminationStatus status, | |
| 93 int error_code) OVERRIDE; | |
| 94 virtual void Destroy() OVERRIDE; | |
| 95 virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) {} | |
| 96 virtual void SetTooltipText(const base::string16& tooltip_text) OVERRIDE; | |
| 97 virtual void SelectionChanged(const base::string16& text, | |
| 98 size_t offset, | |
| 99 const gfx::Range& range) OVERRIDE; | |
| 100 virtual void SelectionBoundsChanged( | |
| 101 const ViewHostMsg_SelectionBounds_Params& params) OVERRIDE; | |
| 102 virtual void ScrollOffsetChanged() OVERRIDE; | |
| 103 virtual BackingStore* AllocBackingStore(const gfx::Size& size) OVERRIDE; | |
| 104 virtual void CopyFromCompositingSurface( | |
| 105 const gfx::Rect& src_subrect, | |
| 106 const gfx::Size& dst_size, | |
| 107 const base::Callback<void(bool, const SkBitmap&)>& callback, | |
| 108 SkBitmap::Config config) OVERRIDE; | |
| 109 virtual void CopyFromCompositingSurfaceToVideoFrame( | |
| 110 const gfx::Rect& src_subrect, | |
| 111 const scoped_refptr<media::VideoFrame>& target, | |
| 112 const base::Callback<void(bool)>& callback) OVERRIDE; | |
| 113 virtual bool CanCopyToVideoFrame() const OVERRIDE; | |
| 114 virtual void OnAcceleratedCompositingStateChange() OVERRIDE; | |
| 115 virtual void AcceleratedSurfaceInitialized(int host_id, | |
| 116 int route_id) OVERRIDE; | |
| 117 virtual void AcceleratedSurfaceBuffersSwapped( | |
| 118 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, | |
| 119 int gpu_host_id) OVERRIDE; | |
| 120 virtual void AcceleratedSurfacePostSubBuffer( | |
| 121 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, | |
| 122 int gpu_host_id) OVERRIDE; | |
| 123 virtual void AcceleratedSurfaceSuspend() OVERRIDE; | |
| 124 virtual void AcceleratedSurfaceRelease() OVERRIDE; | |
| 125 virtual bool HasAcceleratedSurface(const gfx::Size& desired_size) OVERRIDE; | |
| 126 virtual void SetHasHorizontalScrollbar( | |
| 127 bool has_horizontal_scrollbar) OVERRIDE; | |
| 128 virtual void SetScrollOffsetPinning( | |
| 129 bool is_pinned_to_left, bool is_pinned_to_right) OVERRIDE; | |
| 130 virtual void GetScreenInfo(blink::WebScreenInfo* results) OVERRIDE; | |
| 131 virtual gfx::Rect GetBoundsInRootWindow() OVERRIDE; | |
| 132 virtual gfx::GLSurfaceHandle GetCompositingSurface() OVERRIDE; | |
| 133 virtual void ResizeCompositingSurface(const gfx::Size&) OVERRIDE; | |
| 134 virtual bool LockMouse() OVERRIDE; | |
| 135 virtual void UnlockMouse() OVERRIDE; | |
| 136 virtual void CreateBrowserAccessibilityManagerIfNeeded() OVERRIDE; | |
| 137 | |
| 138 // ActiveWindowWatcherXObserver implementation. | |
| 139 virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE; | |
| 140 | |
| 141 // IPC::Sender implementation: | |
| 142 virtual bool Send(IPC::Message* message) OVERRIDE; | |
| 143 | |
| 144 // If the widget is aligned with an edge of the monitor its on and the user | |
| 145 // attempts to drag past that edge we track the number of times it has | |
| 146 // occurred, so that we can force the widget to scroll when it otherwise | |
| 147 // would be unable to. | |
| 148 void ModifyEventForEdgeDragging(GtkWidget* widget, GdkEventMotion* event); | |
| 149 | |
| 150 // Mouse events always provide a movementX/Y which needs to be computed. | |
| 151 // Also, mouse lock requires knowledge of last unlocked cursor coordinates. | |
| 152 // State is stored on the host view to do this, and the mouse event modified. | |
| 153 void ModifyEventMovementAndCoords(blink::WebMouseEvent* event); | |
| 154 | |
| 155 void Paint(const gfx::Rect&); | |
| 156 | |
| 157 // Called by GtkIMContextWrapper to forward a keyboard event to renderer. | |
| 158 // On Linux (not ChromeOS): | |
| 159 // Before calling RenderWidgetHost::ForwardKeyboardEvent(), this method | |
| 160 // calls GtkKeyBindingsHandler::Match() against the event and send matched | |
| 161 // edit commands to renderer by calling | |
| 162 // RenderWidgetHost::ForwardEditCommandsForNextKeyEvent(). | |
| 163 void ForwardKeyboardEvent(const NativeWebKeyboardEvent& event); | |
| 164 | |
| 165 bool RetrieveSurrounding(std::string* text, size_t* cursor_index); | |
| 166 | |
| 167 // BrowserAccessibilityDelegate implementation. | |
| 168 virtual void SetAccessibilityFocus(int acc_obj_id) OVERRIDE; | |
| 169 virtual void AccessibilityDoDefaultAction(int acc_obj_id) OVERRIDE; | |
| 170 virtual void AccessibilityScrollToMakeVisible( | |
| 171 int acc_obj_id, gfx::Rect subfocus) OVERRIDE; | |
| 172 virtual void AccessibilityScrollToPoint( | |
| 173 int acc_obj_id, gfx::Point point) OVERRIDE; | |
| 174 virtual void AccessibilitySetTextSelection( | |
| 175 int acc_obj_id, int start_offset, int end_offset) OVERRIDE; | |
| 176 virtual gfx::Point GetLastTouchEventLocation() const OVERRIDE; | |
| 177 virtual void FatalAccessibilityTreeError() OVERRIDE; | |
| 178 | |
| 179 virtual SkBitmap::Config PreferredReadbackFormat() OVERRIDE; | |
| 180 | |
| 181 // Get the root of the AtkObject* tree for accessibility. | |
| 182 AtkObject* GetAccessible(); | |
| 183 | |
| 184 protected: | |
| 185 friend class RenderWidgetHostView; | |
| 186 | |
| 187 // Should construct only via RenderWidgetHostView::CreateViewForWidget. | |
| 188 explicit RenderWidgetHostViewGtk(RenderWidgetHost* widget); | |
| 189 | |
| 190 private: | |
| 191 friend class RenderWidgetHostViewGtkWidget; | |
| 192 | |
| 193 CHROMEGTK_CALLBACK_0(RenderWidgetHostViewGtk, | |
| 194 void, | |
| 195 OnDestroy); | |
| 196 | |
| 197 // Returns whether the widget needs an input grab (GTK+ and X) to work | |
| 198 // properly. | |
| 199 bool NeedsInputGrab(); | |
| 200 | |
| 201 // Returns whether this render view is a popup (<select> dropdown or | |
| 202 // autocomplete window). | |
| 203 bool IsPopup() const; | |
| 204 | |
| 205 // Do initialization needed by all InitAs*() methods. | |
| 206 void DoSharedInit(); | |
| 207 | |
| 208 // Do initialization needed just by InitAsPopup() and InitAsFullscreen(). | |
| 209 // We move and resize |window| to |bounds| and show it and its contents. | |
| 210 void DoPopupOrFullscreenInit(GtkWindow* window, const gfx::Rect& bounds); | |
| 211 | |
| 212 // Update the display cursor for the render view. | |
| 213 void ShowCurrentCursor(); | |
| 214 | |
| 215 void set_last_mouse_down(GdkEventButton* event); | |
| 216 | |
| 217 // Cause the next query for the widget center to recompute the cached value. | |
| 218 void MarkCachedWidgetCenterStale(); | |
| 219 | |
| 220 void OnCreatePluginContainer(gfx::PluginWindowHandle id); | |
| 221 void OnDestroyPluginContainer(gfx::PluginWindowHandle id); | |
| 222 | |
| 223 gfx::Point GetWidgetCenter(); | |
| 224 | |
| 225 // The model object. | |
| 226 RenderWidgetHostImpl* host_; | |
| 227 | |
| 228 // The native UI widget. | |
| 229 ui::OwnedWidgetGtk view_; | |
| 230 | |
| 231 // This is true when we are currently painting and thus should handle extra | |
| 232 // paint requests by expanding the invalid rect rather than actually | |
| 233 // painting. | |
| 234 bool about_to_validate_and_paint_; | |
| 235 | |
| 236 // This is the rectangle which we'll paint. | |
| 237 gfx::Rect invalid_rect_; | |
| 238 | |
| 239 // Whether we are currently loading. | |
| 240 bool is_loading_; | |
| 241 | |
| 242 // The cursor for the page. This is passed up from the renderer. | |
| 243 WebCursor current_cursor_; | |
| 244 | |
| 245 // The time at which this view started displaying white pixels as a result of | |
| 246 // not having anything to paint (empty backing store from renderer). This | |
| 247 // value returns true for is_null() if we are not recording whiteout times. | |
| 248 base::TimeTicks whiteout_start_time_; | |
| 249 | |
| 250 // The time it took after this view was selected for it to be fully painted. | |
| 251 base::TimeTicks web_contents_switch_paint_time_; | |
| 252 | |
| 253 // The native view of our parent widget. Used only for popups. | |
| 254 GtkWidget* parent_; | |
| 255 | |
| 256 // We ignore the first mouse release on popups so the popup will remain open. | |
| 257 bool is_popup_first_mouse_release_; | |
| 258 | |
| 259 // Whether or not this widget's input context was focused before being | |
| 260 // shadowed by another widget. Used in OnGrabNotify() handler to track the | |
| 261 // focused state correctly. | |
| 262 bool was_imcontext_focused_before_grab_; | |
| 263 | |
| 264 // True if we are responsible for creating an X grab. This will only be used | |
| 265 // for <select> dropdowns. It should be true for most such cases, but false | |
| 266 // for extension popups. | |
| 267 bool do_x_grab_; | |
| 268 | |
| 269 // Is the widget fullscreen? | |
| 270 bool is_fullscreen_; | |
| 271 | |
| 272 // Has the window ever been marked active? Only valid for fullscreen or | |
| 273 // popup windows. | |
| 274 bool made_active_; | |
| 275 | |
| 276 // Used to record the last position of the mouse. | |
| 277 // While the mouse is locked, they store the last known position just as mouse | |
| 278 // lock was entered. | |
| 279 // Relative to the upper-left corner of the view. | |
| 280 gfx::Point unlocked_mouse_position_; | |
| 281 // Relative to the upper-left corner of the screen. | |
| 282 gfx::Point unlocked_global_mouse_position_; | |
| 283 // Last hidden cursor position. Relative to screen. | |
| 284 gfx::Point global_mouse_position_; | |
| 285 // Indicates when mouse motion is valid after the widget has moved. | |
| 286 bool mouse_has_been_warped_to_new_center_; | |
| 287 // Indicates the cursor has been warped to the unlocked position, | |
| 288 // but a move event has not yet been received for it there. | |
| 289 bool mouse_is_being_warped_to_unlocked_position_; | |
| 290 | |
| 291 // For full-screen windows we have a OnDestroy handler that we need to remove, | |
| 292 // so we keep it ID here. | |
| 293 unsigned long destroy_handler_id_; | |
| 294 | |
| 295 // A convenience wrapper object for GtkIMContext; | |
| 296 scoped_ptr<GtkIMContextWrapper> im_context_; | |
| 297 | |
| 298 // A convenience object for handling editor key bindings defined in gtk | |
| 299 // keyboard theme. | |
| 300 scoped_ptr<GtkKeyBindingsHandler> key_bindings_handler_; | |
| 301 | |
| 302 // Helper class that lets us allocate plugin containers and move them. | |
| 303 GtkPluginContainerManager plugin_container_manager_; | |
| 304 | |
| 305 // The size that we want the renderer to be. We keep this in a separate | |
| 306 // variable because resizing in GTK+ is async. | |
| 307 gfx::Size requested_size_; | |
| 308 | |
| 309 // The latest reported center of the widget, use GetWidgetCenter() to access. | |
| 310 gfx::Point widget_center_; | |
| 311 // If the window moves the widget_center will not be valid until we recompute. | |
| 312 bool widget_center_valid_; | |
| 313 | |
| 314 // The number of times the user has dragged against horizontal edge of the | |
| 315 // monitor (if the widget is aligned with that edge). Negative values | |
| 316 // indicate the left edge, positive the right. | |
| 317 int dragged_at_horizontal_edge_; | |
| 318 | |
| 319 // The number of times the user has dragged against vertical edge of the | |
| 320 // monitor (if the widget is aligned with that edge). Negative values | |
| 321 // indicate the top edge, positive the bottom. | |
| 322 int dragged_at_vertical_edge_; | |
| 323 | |
| 324 gfx::PluginWindowHandle compositing_surface_; | |
| 325 | |
| 326 // The event for the last mouse down we handled. We need this for context | |
| 327 // menus and drags. | |
| 328 GdkEventButton* last_mouse_down_; | |
| 329 | |
| 330 // Instance of accessibility information for the root of the AtkObject | |
| 331 // tree representation of the WebKit render tree. | |
| 332 scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_; | |
| 333 | |
| 334 ui::GtkSignalRegistrar signals_; | |
| 335 | |
| 336 std::vector<ui::LatencyInfo> software_latency_info_; | |
| 337 }; | |
| 338 | |
| 339 } // namespace content | |
| 340 | |
| 341 #endif // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_ | |
| OLD | NEW |