| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/renderer_host/render_widget_host_view_gtk.h" | 5 #include "chrome/browser/renderer_host/render_widget_host_view_gtk.h" |
| 6 | 6 |
| 7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
| 8 #include <gdk/gdk.h> | 8 #include <gdk/gdk.h> |
| 9 #include <cairo/cairo.h> | 9 #include <cairo/cairo.h> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "chrome/browser/renderer_host/backing_store.h" | 12 #include "chrome/browser/renderer_host/backing_store.h" |
| 13 #include "chrome/browser/renderer_host/render_widget_host.h" | 13 #include "chrome/browser/renderer_host/render_widget_host.h" |
| 14 #include "skia/ext/bitmap_platform_device_linux.h" | 14 #include "skia/ext/bitmap_platform_device_linux.h" |
| 15 #include "skia/ext/platform_device_linux.h" | 15 #include "skia/ext/platform_device_linux.h" |
| 16 #include "webkit/glue/webinputevent.h" |
| 16 | 17 |
| 17 namespace { | 18 namespace { |
| 18 | 19 |
| 19 // ----------------------------------------------------------------------------- | 20 // This class is a simple convenience wrapper for Gtk functions. It has only |
| 20 // Callback functions to proxy to RenderWidgetHostViewGtk... | 21 // static methods. |
| 22 class RenderWidgetHostViewGtkWidget { |
| 23 public: |
| 24 static GtkWidget* CreateNewWidget(RenderWidgetHostViewGtk* host_view) { |
| 25 GtkWidget* widget = gtk_drawing_area_new(); |
| 21 | 26 |
| 22 gboolean ConfigureEvent(GtkWidget* widget, GdkEventConfigure* config, | 27 gtk_widget_add_events(widget, GDK_EXPOSURE_MASK | |
| 23 RenderWidgetHostViewGtk* host) { | 28 GDK_POINTER_MOTION_MASK | |
| 24 NOTIMPLEMENTED(); | 29 GDK_BUTTON_PRESS_MASK | |
| 25 return FALSE; | 30 GDK_BUTTON_RELEASE_MASK | |
| 26 } | 31 GDK_KEY_PRESS_MASK | |
| 32 GDK_KEY_RELEASE_MASK); |
| 33 GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); |
| 27 | 34 |
| 28 gboolean ExposeEvent(GtkWidget* widget, GdkEventExpose* expose, | 35 g_signal_connect(widget, "configure-event", |
| 29 RenderWidgetHostViewGtk* host) { | 36 G_CALLBACK(ConfigureEvent), host_view); |
| 30 const gfx::Rect damage_rect(expose->area); | 37 g_signal_connect(widget, "expose-event", |
| 31 host->Paint(damage_rect); | 38 G_CALLBACK(ExposeEvent), host_view); |
| 32 return FALSE; | 39 g_signal_connect(widget, "key-press-event", |
| 33 } | 40 G_CALLBACK(KeyPressReleaseEvent), host_view); |
| 41 g_signal_connect(widget, "key-release-event", |
| 42 G_CALLBACK(KeyPressReleaseEvent), host_view); |
| 43 g_signal_connect(widget, "focus-in-event", |
| 44 G_CALLBACK(FocusIn), host_view); |
| 45 g_signal_connect(widget, "focus-out-event", |
| 46 G_CALLBACK(FocusOut), host_view); |
| 47 g_signal_connect(widget, "button-press-event", |
| 48 G_CALLBACK(ButtonPressReleaseEvent), host_view); |
| 49 g_signal_connect(widget, "button-release-event", |
| 50 G_CALLBACK(ButtonPressReleaseEvent), host_view); |
| 51 g_signal_connect(widget, "motion-notify-event", |
| 52 G_CALLBACK(MouseMoveEvent), host_view); |
| 53 g_signal_connect(widget, "scroll-event", |
| 54 G_CALLBACK(MouseScrollEvent), host_view); |
| 34 | 55 |
| 35 gboolean KeyPressReleaseEvent(GtkWidget* widget, GdkEventKey* event, | 56 return widget; |
| 36 RenderWidgetHostViewGtk* host) { | 57 } |
| 37 NOTIMPLEMENTED(); | |
| 38 return FALSE; | |
| 39 } | |
| 40 | 58 |
| 41 gboolean FocusIn(GtkWidget* widget, GdkEventFocus* focus, | 59 private: |
| 42 RenderWidgetHostViewGtk* host) { | 60 static gboolean ConfigureEvent(GtkWidget* widget, GdkEventConfigure* config, |
| 43 NOTIMPLEMENTED(); | 61 RenderWidgetHostViewGtk* host_view) { |
| 44 return FALSE; | 62 host_view->GetRenderWidgetHost()->WasResized(); |
| 45 } | 63 return FALSE; |
| 64 } |
| 46 | 65 |
| 47 gboolean FocusOut(GtkWidget* widget, GdkEventFocus* focus, | 66 static gboolean ExposeEvent(GtkWidget* widget, GdkEventExpose* expose, |
| 48 RenderWidgetHostViewGtk* host) { | 67 RenderWidgetHostViewGtk* host_view) { |
| 49 NOTIMPLEMENTED(); | 68 const gfx::Rect damage_rect(expose->area); |
| 50 return FALSE; | 69 host_view->Paint(damage_rect); |
| 51 } | 70 return FALSE; |
| 71 } |
| 52 | 72 |
| 53 gboolean ButtonPressReleaseEvent(GtkWidget* widget, GdkEventButton* event, | 73 static gboolean KeyPressReleaseEvent(GtkWidget* widget, GdkEventKey* event, |
| 54 RenderWidgetHostViewGtk* host) { | 74 RenderWidgetHostViewGtk* host_view) { |
| 55 NOTIMPLEMENTED(); | 75 return FALSE; |
| 56 return FALSE; | 76 } |
| 57 } | |
| 58 | 77 |
| 59 gboolean MouseMoveEvent(GtkWidget* widget, GdkEventMotion* event, | 78 static gboolean FocusIn(GtkWidget* widget, GdkEventFocus* focus, |
| 60 RenderWidgetHostViewGtk* host) { | 79 RenderWidgetHostViewGtk* host_view) { |
| 61 return FALSE; | 80 NOTIMPLEMENTED(); |
| 62 } | 81 return FALSE; |
| 82 } |
| 63 | 83 |
| 64 gboolean MouseScrollEvent(GtkWidget* widget, GdkEventScroll* event, | 84 static gboolean FocusOut(GtkWidget* widget, GdkEventFocus* focus, |
| 65 RenderWidgetHostViewGtk* host) { | 85 RenderWidgetHostViewGtk* host_view) { |
| 66 NOTIMPLEMENTED(); | 86 NOTIMPLEMENTED(); |
| 67 return FALSE; | 87 return FALSE; |
| 68 } | 88 } |
| 69 | 89 |
| 70 } // anonymous namespace | 90 static gboolean ButtonPressReleaseEvent( |
| 91 GtkWidget* widget, GdkEventButton* event, |
| 92 RenderWidgetHostViewGtk* host_view) { |
| 93 WebMouseEvent wme(event); |
| 94 host_view->GetRenderWidgetHost()->ForwardMouseEvent(wme); |
| 95 return FALSE; |
| 96 } |
| 97 |
| 98 static gboolean MouseMoveEvent(GtkWidget* widget, GdkEventMotion* event, |
| 99 RenderWidgetHostViewGtk* host_view) { |
| 100 return FALSE; |
| 101 } |
| 102 |
| 103 static gboolean MouseScrollEvent(GtkWidget* widget, GdkEventScroll* event, |
| 104 RenderWidgetHostViewGtk* host_view) { |
| 105 NOTIMPLEMENTED(); |
| 106 return FALSE; |
| 107 } |
| 108 }; |
| 109 |
| 110 } // namespace |
| 71 | 111 |
| 72 // static | 112 // static |
| 73 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( | 113 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( |
| 74 RenderWidgetHost* widget) { | 114 RenderWidgetHost* widget) { |
| 75 return new RenderWidgetHostViewGtk(widget); | 115 return new RenderWidgetHostViewGtk(widget); |
| 76 } | 116 } |
| 77 | 117 |
| 78 RenderWidgetHostViewGtk::RenderWidgetHostViewGtk(RenderWidgetHost* widget) | 118 RenderWidgetHostViewGtk::RenderWidgetHostViewGtk(RenderWidgetHost* widget_host) |
| 79 : widget_(widget) { | 119 : host_(widget_host) { |
| 80 widget_->set_view(this); | 120 host_->set_view(this); |
| 81 | 121 view_ = RenderWidgetHostViewGtkWidget::CreateNewWidget(this); |
| 82 view_ = gtk_drawing_area_new(); | |
| 83 | |
| 84 gtk_widget_add_events(view_, GDK_EXPOSURE_MASK | | |
| 85 GDK_POINTER_MOTION_MASK | | |
| 86 GDK_BUTTON_PRESS_MASK | | |
| 87 GDK_BUTTON_RELEASE_MASK | | |
| 88 GDK_KEY_PRESS_MASK | | |
| 89 GDK_KEY_RELEASE_MASK); | |
| 90 GTK_WIDGET_SET_FLAGS(view_, GTK_CAN_FOCUS); | |
| 91 g_signal_connect(view_, "configure-event", G_CALLBACK(ConfigureEvent), this); | |
| 92 g_signal_connect(view_, "expose-event", G_CALLBACK(ExposeEvent), this); | |
| 93 g_signal_connect(view_, "key-press-event", G_CALLBACK(KeyPressReleaseEvent), | |
| 94 this); | |
| 95 g_signal_connect(view_, "key-release-event", | |
| 96 G_CALLBACK(KeyPressReleaseEvent), this); | |
| 97 g_signal_connect(view_, "focus-in-event", G_CALLBACK(FocusIn), this); | |
| 98 g_signal_connect(view_, "focus-out-event", G_CALLBACK(FocusOut), this); | |
| 99 g_signal_connect(view_, "button-press-event", | |
| 100 G_CALLBACK(ButtonPressReleaseEvent), this); | |
| 101 g_signal_connect(view_, "button-release-event", | |
| 102 G_CALLBACK(ButtonPressReleaseEvent), this); | |
| 103 g_signal_connect(view_, "motion-notify-event", G_CALLBACK(MouseMoveEvent), | |
| 104 this); | |
| 105 g_signal_connect(view_, "scroll-event", G_CALLBACK(MouseScrollEvent), | |
| 106 this); | |
| 107 } | 122 } |
| 108 | 123 |
| 109 RenderWidgetHostViewGtk::~RenderWidgetHostViewGtk() { | 124 RenderWidgetHostViewGtk::~RenderWidgetHostViewGtk() { |
| 110 gtk_widget_destroy(view_); | 125 gtk_widget_destroy(view_); |
| 111 } | 126 } |
| 112 | 127 |
| 113 void RenderWidgetHostViewGtk::DidBecomeSelected() { | 128 void RenderWidgetHostViewGtk::DidBecomeSelected() { |
| 114 NOTIMPLEMENTED(); | 129 NOTIMPLEMENTED(); |
| 115 } | 130 } |
| 116 | 131 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 | 208 |
| 194 void RenderWidgetHostViewGtk::Destroy() { | 209 void RenderWidgetHostViewGtk::Destroy() { |
| 195 NOTIMPLEMENTED(); | 210 NOTIMPLEMENTED(); |
| 196 } | 211 } |
| 197 | 212 |
| 198 void RenderWidgetHostViewGtk::SetTooltipText(const std::wstring& tooltip_text) { | 213 void RenderWidgetHostViewGtk::SetTooltipText(const std::wstring& tooltip_text) { |
| 199 NOTIMPLEMENTED(); | 214 NOTIMPLEMENTED(); |
| 200 } | 215 } |
| 201 | 216 |
| 202 void RenderWidgetHostViewGtk::Paint(const gfx::Rect& damage_rect) { | 217 void RenderWidgetHostViewGtk::Paint(const gfx::Rect& damage_rect) { |
| 203 BackingStore* backing_store = widget_->GetBackingStore(); | 218 BackingStore* backing_store = host_->GetBackingStore(); |
| 204 | 219 |
| 205 if (backing_store) { | 220 if (backing_store) { |
| 206 GdkRectangle grect = { | 221 GdkRectangle grect = { |
| 207 damage_rect.x(), | 222 damage_rect.x(), |
| 208 damage_rect.y(), | 223 damage_rect.y(), |
| 209 damage_rect.width(), | 224 damage_rect.width(), |
| 210 damage_rect.height() | 225 damage_rect.height() |
| 211 }; | 226 }; |
| 212 GdkWindow* window = view_->window; | 227 GdkWindow* window = view_->window; |
| 213 gdk_window_begin_paint_rect(window, &grect); | 228 gdk_window_begin_paint_rect(window, &grect); |
| 214 | 229 |
| 215 skia::PlatformDeviceLinux &platdev = | 230 skia::PlatformDeviceLinux &platdev = |
| 216 backing_store->canvas()->getTopPlatformDevice(); | 231 backing_store->canvas()->getTopPlatformDevice(); |
| 217 skia::BitmapPlatformDeviceLinux* const bitdev = | 232 skia::BitmapPlatformDeviceLinux* const bitdev = |
| 218 static_cast<skia::BitmapPlatformDeviceLinux* >(&platdev); | 233 static_cast<skia::BitmapPlatformDeviceLinux* >(&platdev); |
| 219 cairo_t* cairo_drawable = gdk_cairo_create(window); | 234 cairo_t* cairo_drawable = gdk_cairo_create(window); |
| 220 cairo_set_source_surface(cairo_drawable, bitdev->surface(), 0, 0); | 235 cairo_set_source_surface(cairo_drawable, bitdev->surface(), 0, 0); |
| 221 cairo_paint(cairo_drawable); | 236 cairo_paint(cairo_drawable); |
| 222 cairo_destroy(cairo_drawable); | 237 cairo_destroy(cairo_drawable); |
| 223 | 238 |
| 224 gdk_window_end_paint(window); | 239 gdk_window_end_paint(window); |
| 225 } else { | 240 } else { |
| 226 NOTIMPLEMENTED(); | 241 NOTIMPLEMENTED(); |
| 227 } | 242 } |
| 228 } | 243 } |
| 229 | 244 |
| OLD | NEW |