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