Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(722)

Side by Side Diff: chrome/browser/tab_contents/tab_contents_view_gtk.cc

Issue 3235010: reland r57885 with a fix for linux/views. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: . Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/tab_contents/tab_contents_view_gtk.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/tab_contents/tab_contents_view_gtk.h" 5 #include "chrome/browser/tab_contents/tab_contents_view_gtk.h"
6 6
7 #include <gdk/gdk.h> 7 #include <gdk/gdk.h>
8 #include <gdk/gdkkeysyms.h> 8 #include <gdk/gdkkeysyms.h>
9 #include <gtk/gtk.h> 9 #include <gtk/gtk.h>
10 10
(...skipping 23 matching lines...) Expand all
34 #include "gfx/point.h" 34 #include "gfx/point.h"
35 #include "gfx/rect.h" 35 #include "gfx/rect.h"
36 #include "gfx/size.h" 36 #include "gfx/size.h"
37 #include "webkit/glue/webdropdata.h" 37 #include "webkit/glue/webdropdata.h"
38 38
39 using WebKit::WebDragOperation; 39 using WebKit::WebDragOperation;
40 using WebKit::WebDragOperationsMask; 40 using WebKit::WebDragOperationsMask;
41 41
42 namespace { 42 namespace {
43 43
44 // Called when the content view gtk widget is tabbed to, or after the call to
45 // gtk_widget_child_focus() in TakeFocus(). We return true
46 // and grab focus if we don't have it. The call to
47 // FocusThroughTabTraversal(bool) forwards the "move focus forward" effect to
48 // webkit.
49 gboolean OnFocus(GtkWidget* widget, GtkDirectionType focus,
50 TabContents* tab_contents) {
51 // If we already have focus, let the next widget have a shot at it. We will
52 // reach this situation after the call to gtk_widget_child_focus() in
53 // TakeFocus().
54 if (gtk_widget_is_focus(widget))
55 return FALSE;
56
57 gtk_widget_grab_focus(widget);
58 bool reverse = focus == GTK_DIR_TAB_BACKWARD;
59 tab_contents->FocusThroughTabTraversal(reverse);
60 return TRUE;
61 }
62
63 // Called when the mouse leaves the widget. We notify our delegate. 44 // Called when the mouse leaves the widget. We notify our delegate.
64 gboolean OnLeaveNotify(GtkWidget* widget, GdkEventCrossing* event, 45 gboolean OnLeaveNotify(GtkWidget* widget, GdkEventCrossing* event,
65 TabContents* tab_contents) { 46 TabContents* tab_contents) {
66 if (tab_contents->delegate()) 47 if (tab_contents->delegate())
67 tab_contents->delegate()->ContentsMouseEvent( 48 tab_contents->delegate()->ContentsMouseEvent(
68 tab_contents, gfx::Point(event->x_root, event->y_root), false); 49 tab_contents, gfx::Point(event->x_root, event->y_root), false);
69 return FALSE; 50 return FALSE;
70 } 51 }
71 52
72 // Called when the mouse moves within the widget. We notify our delegate. 53 // Called when the mouse moves within the widget. We notify our delegate.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 // view twice), we check for the RVH Factory, which will be set when we're 139 // view twice), we check for the RVH Factory, which will be set when we're
159 // making special ones (which go along with the special views). 140 // making special ones (which go along with the special views).
160 DCHECK(RenderViewHostFactory::has_factory()); 141 DCHECK(RenderViewHostFactory::has_factory());
161 return render_widget_host->view(); 142 return render_widget_host->view();
162 } 143 }
163 144
164 RenderWidgetHostViewGtk* view = 145 RenderWidgetHostViewGtk* view =
165 new RenderWidgetHostViewGtk(render_widget_host); 146 new RenderWidgetHostViewGtk(render_widget_host);
166 view->InitAsChild(); 147 view->InitAsChild();
167 gfx::NativeView content_view = view->native_view(); 148 gfx::NativeView content_view = view->native_view();
168 g_signal_connect(content_view, "focus", 149 g_signal_connect(content_view, "focus", G_CALLBACK(OnFocusThunk), this);
169 G_CALLBACK(OnFocus), tab_contents());
170 g_signal_connect(content_view, "leave-notify-event", 150 g_signal_connect(content_view, "leave-notify-event",
171 G_CALLBACK(OnLeaveNotify), tab_contents()); 151 G_CALLBACK(OnLeaveNotify), tab_contents());
172 g_signal_connect(content_view, "motion-notify-event", 152 g_signal_connect(content_view, "motion-notify-event",
173 G_CALLBACK(OnMouseMove), tab_contents()); 153 G_CALLBACK(OnMouseMove), tab_contents());
174 g_signal_connect(content_view, "scroll-event", 154 g_signal_connect(content_view, "scroll-event",
175 G_CALLBACK(OnMouseScroll), tab_contents()); 155 G_CALLBACK(OnMouseScroll), tab_contents());
176 gtk_widget_add_events(content_view, GDK_LEAVE_NOTIFY_MASK | 156 gtk_widget_add_events(content_view, GDK_LEAVE_NOTIFY_MASK |
177 GDK_POINTER_MOTION_MASK); 157 GDK_POINTER_MOTION_MASK);
178 g_signal_connect(content_view, "button-press-event", 158 g_signal_connect(content_view, "button-press-event",
179 G_CALLBACK(OnMouseDownThunk), this); 159 G_CALLBACK(OnMouseDownThunk), this);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 // sizing information on to the renderer. 216 // sizing information on to the renderer.
237 requested_size_ = size; 217 requested_size_ = size;
238 RenderWidgetHostView* rwhv = tab_contents()->GetRenderWidgetHostView(); 218 RenderWidgetHostView* rwhv = tab_contents()->GetRenderWidgetHostView();
239 if (rwhv) 219 if (rwhv)
240 rwhv->SetSize(size); 220 rwhv->SetSize(size);
241 } 221 }
242 222
243 void TabContentsViewGtk::Focus() { 223 void TabContentsViewGtk::Focus() {
244 if (tab_contents()->showing_interstitial_page()) { 224 if (tab_contents()->showing_interstitial_page()) {
245 tab_contents()->interstitial_page()->Focus(); 225 tab_contents()->interstitial_page()->Focus();
246 } else { 226 } else if (!constrained_window_) {
247 GtkWidget* widget = GetContentNativeView(); 227 GtkWidget* widget = GetContentNativeView();
248 if (widget) 228 if (widget)
249 gtk_widget_grab_focus(widget); 229 gtk_widget_grab_focus(widget);
250 } 230 }
251 } 231 }
252 232
253 void TabContentsViewGtk::SetInitialFocus() { 233 void TabContentsViewGtk::SetInitialFocus() {
254 if (tab_contents()->FocusLocationBarByDefault()) 234 if (tab_contents()->FocusLocationBarByDefault())
255 tab_contents()->SetFocusToLocationBar(false); 235 tab_contents()->SetFocusToLocationBar(false);
256 else 236 else
257 Focus(); 237 Focus();
258 } 238 }
259 239
260 void TabContentsViewGtk::StoreFocus() { 240 void TabContentsViewGtk::StoreFocus() {
261 focus_store_.Store(GetNativeView()); 241 focus_store_.Store(GetNativeView());
262 } 242 }
263 243
264 void TabContentsViewGtk::RestoreFocus() { 244 void TabContentsViewGtk::RestoreFocus() {
265 if (focus_store_.widget()) 245 if (focus_store_.widget())
266 gtk_widget_grab_focus(focus_store_.widget()); 246 gtk_widget_grab_focus(focus_store_.widget());
267 else 247 else
268 SetInitialFocus(); 248 SetInitialFocus();
269 } 249 }
270 250
251 void TabContentsViewGtk::SetFocusedWidget(GtkWidget* widget) {
252 focus_store_.SetWidget(widget);
253 }
254
271 void TabContentsViewGtk::UpdateDragCursor(WebDragOperation operation) { 255 void TabContentsViewGtk::UpdateDragCursor(WebDragOperation operation) {
272 drag_dest_->UpdateDragStatus(operation); 256 drag_dest_->UpdateDragStatus(operation);
273 } 257 }
274 258
275 void TabContentsViewGtk::GotFocus() { 259 void TabContentsViewGtk::GotFocus() {
276 // This is only used in the views FocusManager stuff but it bleeds through 260 // This is only used in the views FocusManager stuff but it bleeds through
277 // all subclasses. http://crbug.com/21875 261 // all subclasses. http://crbug.com/21875
278 } 262 }
279 263
280 // This is called when we the renderer asks us to take focus back (i.e., it has 264 // This is called when we the renderer asks us to take focus back (i.e., it has
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 drag_source_->StartDragging(drop_data, ops, &last_mouse_down_, image, 309 drag_source_->StartDragging(drop_data, ops, &last_mouse_down_, image,
326 image_offset); 310 image_offset);
327 } 311 }
328 312
329 // ----------------------------------------------------------------------------- 313 // -----------------------------------------------------------------------------
330 314
331 void TabContentsViewGtk::InsertIntoContentArea(GtkWidget* widget) { 315 void TabContentsViewGtk::InsertIntoContentArea(GtkWidget* widget) {
332 gtk_container_add(GTK_CONTAINER(expanded_), widget); 316 gtk_container_add(GTK_CONTAINER(expanded_), widget);
333 } 317 }
334 318
319 // Called when the content view gtk widget is tabbed to, or after the call to
320 // gtk_widget_child_focus() in TakeFocus(). We return true
321 // and grab focus if we don't have it. The call to
322 // FocusThroughTabTraversal(bool) forwards the "move focus forward" effect to
323 // webkit.
324 gboolean TabContentsViewGtk::OnFocus(GtkWidget* widget,
325 GtkDirectionType focus) {
326 // If we are showing a constrained window, don't allow the native view to take
327 // focus.
328 if (constrained_window_) {
329 // If we return false, it will revert to the default handler, which will
330 // take focus. We don't want that. But if we return true, the event will
331 // stop being propagated, leaving focus wherever it is currently. That is
332 // also bad. So we return false to let the default handler run, but take
333 // focus first so as to trick it into thinking the view was already focused
334 // and allowing the event to propagate.
335 gtk_widget_grab_focus(widget);
336 return FALSE;
337 }
338
339 // If we already have focus, let the next widget have a shot at it. We will
340 // reach this situation after the call to gtk_widget_child_focus() in
341 // TakeFocus().
342 if (gtk_widget_is_focus(widget))
343 return FALSE;
344
345 gtk_widget_grab_focus(widget);
346 bool reverse = focus == GTK_DIR_TAB_BACKWARD;
347 tab_contents()->FocusThroughTabTraversal(reverse);
348 return TRUE;
349 }
350
335 gboolean TabContentsViewGtk::OnMouseDown(GtkWidget* widget, 351 gboolean TabContentsViewGtk::OnMouseDown(GtkWidget* widget,
336 GdkEventButton* event) { 352 GdkEventButton* event) {
337 last_mouse_down_ = *event; 353 last_mouse_down_ = *event;
338 return FALSE; 354 return FALSE;
339 } 355 }
340 356
341 void TabContentsViewGtk::OnChildSizeRequest(GtkWidget* widget, 357 void TabContentsViewGtk::OnChildSizeRequest(GtkWidget* widget,
342 GtkWidget* child, 358 GtkWidget* child,
343 GtkRequisition* requisition) { 359 GtkRequisition* requisition) {
344 if (tab_contents()->delegate()) { 360 if (tab_contents()->delegate()) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 gtk_container_child_set_property(GTK_CONTAINER(floating_container), 402 gtk_container_child_set_property(GTK_CONTAINER(floating_container),
387 widget, "x", &value); 403 widget, "x", &value);
388 404
389 int child_y = std::max(half_view_height - (requisition.height / 2), 0); 405 int child_y = std::max(half_view_height - (requisition.height / 2), 0);
390 g_value_set_int(&value, child_y); 406 g_value_set_int(&value, child_y);
391 gtk_container_child_set_property(GTK_CONTAINER(floating_container), 407 gtk_container_child_set_property(GTK_CONTAINER(floating_container),
392 widget, "y", &value); 408 widget, "y", &value);
393 g_value_unset(&value); 409 g_value_unset(&value);
394 } 410 }
395 } 411 }
OLDNEW
« no previous file with comments | « chrome/browser/tab_contents/tab_contents_view_gtk.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698