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 |