| Index: chrome/browser/renderer_host/render_widget_host_view_gtk.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/renderer_host/render_widget_host_view_gtk.cc	(revision 9480)
 | 
| +++ chrome/browser/renderer_host/render_widget_host_view_gtk.cc	(working copy)
 | 
| @@ -13,97 +13,112 @@
 | 
|  #include "chrome/browser/renderer_host/render_widget_host.h"
 | 
|  #include "skia/ext/bitmap_platform_device_linux.h"
 | 
|  #include "skia/ext/platform_device_linux.h"
 | 
| +#include "webkit/glue/webinputevent.h"
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| -// -----------------------------------------------------------------------------
 | 
| -// Callback functions to proxy to RenderWidgetHostViewGtk...
 | 
| +// This class is a simple convenience wrapper for Gtk functions. It has only
 | 
| +// static methods.
 | 
| +class RenderWidgetHostViewGtkWidget {
 | 
| + public:
 | 
| +  static GtkWidget* CreateNewWidget(RenderWidgetHostViewGtk* host_view) {
 | 
| +    GtkWidget* widget = gtk_drawing_area_new();
 | 
|  
 | 
| -gboolean ConfigureEvent(GtkWidget* widget, GdkEventConfigure* config,
 | 
| -                        RenderWidgetHostViewGtk* host) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -  return FALSE;
 | 
| -}
 | 
| +    gtk_widget_add_events(widget, GDK_EXPOSURE_MASK |
 | 
| +                                  GDK_POINTER_MOTION_MASK |
 | 
| +                                  GDK_BUTTON_PRESS_MASK |
 | 
| +                                  GDK_BUTTON_RELEASE_MASK |
 | 
| +                                  GDK_KEY_PRESS_MASK |
 | 
| +                                  GDK_KEY_RELEASE_MASK);
 | 
| +    GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS);
 | 
|  
 | 
| -gboolean ExposeEvent(GtkWidget* widget, GdkEventExpose* expose,
 | 
| -                     RenderWidgetHostViewGtk* host) {
 | 
| -  const gfx::Rect damage_rect(expose->area);
 | 
| -  host->Paint(damage_rect);
 | 
| -  return FALSE;
 | 
| -}
 | 
| +    g_signal_connect(widget, "configure-event",
 | 
| +                     G_CALLBACK(ConfigureEvent), host_view);
 | 
| +    g_signal_connect(widget, "expose-event",
 | 
| +                     G_CALLBACK(ExposeEvent), host_view);
 | 
| +    g_signal_connect(widget, "key-press-event",
 | 
| +                     G_CALLBACK(KeyPressReleaseEvent), host_view);
 | 
| +    g_signal_connect(widget, "key-release-event",
 | 
| +                     G_CALLBACK(KeyPressReleaseEvent), host_view);
 | 
| +    g_signal_connect(widget, "focus-in-event",
 | 
| +                     G_CALLBACK(FocusIn), host_view);
 | 
| +    g_signal_connect(widget, "focus-out-event",
 | 
| +                     G_CALLBACK(FocusOut), host_view);
 | 
| +    g_signal_connect(widget, "button-press-event",
 | 
| +                     G_CALLBACK(ButtonPressReleaseEvent), host_view);
 | 
| +    g_signal_connect(widget, "button-release-event",
 | 
| +                     G_CALLBACK(ButtonPressReleaseEvent), host_view);
 | 
| +    g_signal_connect(widget, "motion-notify-event",
 | 
| +                     G_CALLBACK(MouseMoveEvent), host_view);
 | 
| +    g_signal_connect(widget, "scroll-event",
 | 
| +                     G_CALLBACK(MouseScrollEvent), host_view);
 | 
|  
 | 
| -gboolean KeyPressReleaseEvent(GtkWidget* widget, GdkEventKey* event,
 | 
| -                              RenderWidgetHostViewGtk* host) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -  return FALSE;
 | 
| -}
 | 
| +    return widget;
 | 
| +  }
 | 
|  
 | 
| -gboolean FocusIn(GtkWidget* widget, GdkEventFocus* focus,
 | 
| -                 RenderWidgetHostViewGtk* host) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -  return FALSE;
 | 
| -}
 | 
| + private:
 | 
| +  static gboolean ConfigureEvent(GtkWidget* widget, GdkEventConfigure* config,
 | 
| +                                 RenderWidgetHostViewGtk* host_view) {
 | 
| +    host_view->GetRenderWidgetHost()->WasResized();
 | 
| +    return FALSE;
 | 
| +  }
 | 
|  
 | 
| -gboolean FocusOut(GtkWidget* widget, GdkEventFocus* focus,
 | 
| -                  RenderWidgetHostViewGtk* host) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -  return FALSE;
 | 
| -}
 | 
| +  static gboolean ExposeEvent(GtkWidget* widget, GdkEventExpose* expose,
 | 
| +                              RenderWidgetHostViewGtk* host_view) {
 | 
| +    const gfx::Rect damage_rect(expose->area);
 | 
| +    host_view->Paint(damage_rect);
 | 
| +    return FALSE;
 | 
| +  }
 | 
|  
 | 
| -gboolean ButtonPressReleaseEvent(GtkWidget* widget, GdkEventButton* event,
 | 
| -                                 RenderWidgetHostViewGtk* host) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -  return FALSE;
 | 
| -}
 | 
| +  static gboolean KeyPressReleaseEvent(GtkWidget* widget, GdkEventKey* event,
 | 
| +                                       RenderWidgetHostViewGtk* host_view) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
|  
 | 
| -gboolean MouseMoveEvent(GtkWidget* widget, GdkEventMotion* event,
 | 
| -                        RenderWidgetHostViewGtk* host) {
 | 
| -  return FALSE;
 | 
| -}
 | 
| +  static gboolean FocusIn(GtkWidget* widget, GdkEventFocus* focus,
 | 
| +                          RenderWidgetHostViewGtk* host_view) {
 | 
| +    NOTIMPLEMENTED();
 | 
| +    return FALSE;
 | 
| +  }
 | 
|  
 | 
| -gboolean MouseScrollEvent(GtkWidget* widget, GdkEventScroll* event,
 | 
| -                          RenderWidgetHostViewGtk* host) {
 | 
| -  NOTIMPLEMENTED();
 | 
| -  return FALSE;
 | 
| -}
 | 
| +  static gboolean FocusOut(GtkWidget* widget, GdkEventFocus* focus,
 | 
| +                           RenderWidgetHostViewGtk* host_view) {
 | 
| +    NOTIMPLEMENTED();
 | 
| +    return FALSE;
 | 
| +  }
 | 
|  
 | 
| -}  // anonymous namespace
 | 
| +  static gboolean ButtonPressReleaseEvent(
 | 
| +      GtkWidget* widget, GdkEventButton* event,
 | 
| +      RenderWidgetHostViewGtk* host_view) {
 | 
| +    WebMouseEvent wme(event);
 | 
| +    host_view->GetRenderWidgetHost()->ForwardMouseEvent(wme);
 | 
| +    return FALSE;
 | 
| +  }
 | 
|  
 | 
| +  static gboolean MouseMoveEvent(GtkWidget* widget, GdkEventMotion* event,
 | 
| +                                 RenderWidgetHostViewGtk* host_view) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +
 | 
| +  static gboolean MouseScrollEvent(GtkWidget* widget, GdkEventScroll* event,
 | 
| +                                   RenderWidgetHostViewGtk* host_view) {
 | 
| +    NOTIMPLEMENTED();
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
|  // static
 | 
|  RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(
 | 
|      RenderWidgetHost* widget) {
 | 
|    return new RenderWidgetHostViewGtk(widget);
 | 
|  }
 | 
|  
 | 
| -RenderWidgetHostViewGtk::RenderWidgetHostViewGtk(RenderWidgetHost* widget)
 | 
| -    : widget_(widget) {
 | 
| -  widget_->set_view(this);
 | 
| -
 | 
| -  view_ = gtk_drawing_area_new();
 | 
| -
 | 
| -  gtk_widget_add_events(view_, GDK_EXPOSURE_MASK |
 | 
| -                               GDK_POINTER_MOTION_MASK |
 | 
| -                               GDK_BUTTON_PRESS_MASK |
 | 
| -                               GDK_BUTTON_RELEASE_MASK |
 | 
| -                               GDK_KEY_PRESS_MASK |
 | 
| -                               GDK_KEY_RELEASE_MASK);
 | 
| -  GTK_WIDGET_SET_FLAGS(view_, GTK_CAN_FOCUS);
 | 
| -  g_signal_connect(view_, "configure-event", G_CALLBACK(ConfigureEvent), this);
 | 
| -  g_signal_connect(view_, "expose-event", G_CALLBACK(ExposeEvent), this);
 | 
| -  g_signal_connect(view_, "key-press-event", G_CALLBACK(KeyPressReleaseEvent),
 | 
| -                   this);
 | 
| -  g_signal_connect(view_, "key-release-event",
 | 
| -                   G_CALLBACK(KeyPressReleaseEvent), this);
 | 
| -  g_signal_connect(view_, "focus-in-event", G_CALLBACK(FocusIn), this);
 | 
| -  g_signal_connect(view_, "focus-out-event", G_CALLBACK(FocusOut), this);
 | 
| -  g_signal_connect(view_, "button-press-event",
 | 
| -                   G_CALLBACK(ButtonPressReleaseEvent), this);
 | 
| -  g_signal_connect(view_, "button-release-event",
 | 
| -                   G_CALLBACK(ButtonPressReleaseEvent), this);
 | 
| -  g_signal_connect(view_, "motion-notify-event", G_CALLBACK(MouseMoveEvent),
 | 
| -                   this);
 | 
| -  g_signal_connect(view_, "scroll-event", G_CALLBACK(MouseScrollEvent),
 | 
| -                   this);
 | 
| +RenderWidgetHostViewGtk::RenderWidgetHostViewGtk(RenderWidgetHost* widget_host)
 | 
| +    : host_(widget_host) {
 | 
| +  host_->set_view(this);
 | 
| +  view_ = RenderWidgetHostViewGtkWidget::CreateNewWidget(this);
 | 
|  }
 | 
|  
 | 
|  RenderWidgetHostViewGtk::~RenderWidgetHostViewGtk() {
 | 
| @@ -200,7 +215,7 @@
 | 
|  }
 | 
|  
 | 
|  void RenderWidgetHostViewGtk::Paint(const gfx::Rect& damage_rect) {
 | 
| -  BackingStore* backing_store = widget_->GetBackingStore();
 | 
| +  BackingStore* backing_store = host_->GetBackingStore();
 | 
|  
 | 
|    if (backing_store) {
 | 
|      GdkRectangle grect = {
 | 
| 
 |