| 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 = {
|
|
|