172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gdk/gdk.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/owned_widget_gtk.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_widget_host_view.h"
183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_delegate.h"
193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/slide_animation.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/base/gtk/gtk_signal.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/native_widget_types.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webcursor.h"
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "webkit/plugins/npapi/gtk_plugin_container_manager.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RenderWidgetHost;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GtkIMContextWrapper;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GtkKeyBindingsHandler;
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(TOOLKIT_VIEWS)
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MenuGtk;
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct NativeWebKeyboardEvent;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_CHROMEOS)
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace views {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TooltipWindowGtk;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_CHROMEOS)
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _GtkClipboard GtkClipboard;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _GtkSelectionData GtkSelectionData;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// -----------------------------------------------------------------------------
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// See comments in render_widget_host_view.h about this class and its members.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// -----------------------------------------------------------------------------
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass RenderWidgetHostViewGtk : public RenderWidgetHostView,
473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                public ui::AnimationDelegate {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit RenderWidgetHostViewGtk(RenderWidgetHost* widget);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~RenderWidgetHostViewGtk();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initialize this object for use as a drawing area.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitAsChild();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderWidgetHostView implementation.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void InitAsPopup(RenderWidgetHostView* parent_host_view,
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           const gfx::Rect& pos);
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void InitAsFullscreen();
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual RenderWidgetHost* GetRenderWidgetHost() const;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DidBecomeSelected();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void WasHidden();
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetSize(const gfx::Size& size);
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetBounds(const gfx::Rect& rect);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual gfx::NativeView GetNativeView();
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void MovePluginWindows(
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      const std::vector<webkit::npapi::WebPluginGeometry>& moves);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Focus();
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Blur();
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool HasFocus();
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Show();
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Hide();
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool IsShowing();
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual gfx::Rect GetViewBounds() const;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void UpdateCursor(const WebCursor& cursor);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetIsLoading(bool is_loading);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ImeUpdateTextInputState(WebKit::WebTextInputType type,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const gfx::Rect& caret_rect);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ImeCancelComposition();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DidUpdateBackingStore(
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::vector<gfx::Rect>& copy_rects);
8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void RenderViewGone(base::TerminationStatus status,
8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                              int error_code);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Destroy();
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) {}
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetTooltipText(const std::wstring& tooltip_text);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SelectionChanged(const std::string& text);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ShowingContextMenu(bool showing);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual BackingStore* AllocBackingStore(const gfx::Size& size);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetBackground(const SkBitmap& background);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CreatePluginContainer(gfx::PluginWindowHandle id);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DestroyPluginContainer(gfx::PluginWindowHandle id);
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ContainsNativeView(gfx::NativeView native_view) const;
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void AcceleratedCompositingActivated(bool activated);
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual gfx::PluginWindowHandle GetCompositingSurface();
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // ui::AnimationDelegate implementation.
1003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void AnimationEnded(const ui::Animation* animation);
1013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void AnimationProgressed(const ui::Animation* animation);
1023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void AnimationCanceled(const ui::Animation* animation);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::NativeView native_view() const { return view_.get(); }
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // If the widget is aligned with an edge of the monitor its on and the user
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // attempts to drag past that edge we track the number of times it has
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // occurred, so that we can force the widget to scroll when it otherwise
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // would be unable to.
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void ModifyEventForEdgeDragging(GtkWidget* widget, GdkEventMotion* event);
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Paint(const gfx::Rect&);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by GtkIMContextWrapper to forward a keyboard event to renderer.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Before calling RenderWidgetHost::ForwardKeyboardEvent(), this method
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // calls GtkKeyBindingsHandler::Match() against the event and send matched
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // edit commands to renderer by calling
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderWidgetHost::ForwardEditCommandsForNextKeyEvent().
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ForwardKeyboardEvent(const NativeWebKeyboardEvent& event);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GdkEventButton* last_mouse_down() const {
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return last_mouse_down_;
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(TOOLKIT_VIEWS)
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Appends the input methods context menu to the specified |menu| object as a
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // submenu.
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AppendInputMethodsContextMenu(MenuGtk* menu);
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class RenderWidgetHostViewGtkWidget;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CHROMEGTK_CALLBACK_1(RenderWidgetHostViewGtk,
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                       gboolean,
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                       OnWindowStateEvent,
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                       GdkEventWindowState*);
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CHROMEGTK_CALLBACK_0(RenderWidgetHostViewGtk,
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                       void,
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                       OnDestroy);
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether the widget needs an input grab (GTK+ and X) to work
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // properly.
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool NeedsInputGrab();
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether this render view is a popup (<select> dropdown or
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // autocomplete window).
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool IsPopup() const;
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Do initialization needed by all InitAs*() methods.
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DoSharedInit();
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Do initialization needed just by InitAsPopup() and InitAsFullscreen().
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We move and resize |window| to |bounds| and show it and its contents.
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DoPopupOrFullscreenInit(GtkWindow* window, const gfx::Rect& bounds);
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Update the display cursor for the render view.
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ShowCurrentCursor();
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_last_mouse_down(GdkEventButton* event);
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The model object.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderWidgetHost* host_;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The native UI widget.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OwnedWidgetGtk view_;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is true when we are currently painting and thus should handle extra
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // paint requests by expanding the invalid rect rather than actually
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // painting.
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool about_to_validate_and_paint_;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is the rectangle which we'll paint.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect invalid_rect_;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether or not this widget is hidden.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_hidden_;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether we are currently loading.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_loading_;
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The cursor for the page. This is passed up from the renderer.
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebCursor current_cursor_;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether we are showing a context menu.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_showing_context_menu_;
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The time at which this view started displaying white pixels as a result of
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not having anything to paint (empty backing store from renderer). This
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // value returns true for is_null() if we are not recording whiteout times.
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeTicks whiteout_start_time_;
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The time it took after this view was selected for it to be fully painted.
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeTicks tab_switch_paint_time_;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // A color we use to shade the entire render view. If 100% transparent, we do
197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // not shade the render view.
198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SkColor overlay_color_;
199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The animation used for the abovementioned shade effect. The animation's
201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // value affects the alpha we use for |overlay_color_|.
2023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ui::SlideAnimation overlay_animation_;
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The native view of our parent widget.  Used only for popups.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* parent_;
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We ignore the first mouse release on popups so the popup will remain open.
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_popup_first_mouse_release_;
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether or not this widget was focused before shadowed by another widget.
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used in OnGrabNotify() handler to track the focused state correctly.
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool was_focused_before_grab_;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if we are responsible for creating an X grab. This will only be used
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for <select> dropdowns. It should be true for most such cases, but false
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for extension popups.
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool do_x_grab_;
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Is the widget fullscreen?
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool is_fullscreen_;
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // For full-screen windows we have a OnDestroy handler that we need to remove,
223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // so we keep it ID here.
224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  unsigned long destroy_handler_id_;
225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A convenience wrapper object for GtkIMContext;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<GtkIMContextWrapper> im_context_;
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A convenience object for handling editor key bindings defined in gtk
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // keyboard theme.
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<GtkKeyBindingsHandler> key_bindings_handler_;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper class that lets us allocate plugin containers and move them.
23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  webkit::npapi::GtkPluginContainerManager plugin_container_manager_;
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The size that we want the renderer to be.  We keep this in a separate
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // variable because resizing in GTK+ is async.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size requested_size_;
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The number of times the user has dragged against horizontal edge  of the
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // monitor (if the widget is aligned with that edge). Negative values
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // indicate the left edge, positive the right.
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int dragged_at_horizontal_edge_;
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The number of times the user has dragged against vertical edge  of the
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // monitor (if the widget is aligned with that edge). Negative values
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // indicate the top edge, positive the bottom.
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int dragged_at_vertical_edge_;
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  gfx::PluginWindowHandle compositing_surface_;
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The event for the last mouse down we handled. We need this for context
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // menus and drags.
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GdkEventButton* last_mouse_down_;
255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_CHROMEOS)
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Custimized tooltip window.
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<views::TooltipWindowGtk> tooltip_window_;
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_CHROMEOS)
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_
263