| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/gtk/constrained_window_gtk.h" | 5 #include "chrome/browser/ui/gtk/constrained_window_gtk.h" |
| 6 | 6 |
| 7 #include <gdk/gdkkeysyms.h> | 7 #include <gdk/gdkkeysyms.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| 11 #include "chrome/browser/ui/browser_list.h" | 11 #include "chrome/browser/ui/browser_list.h" |
| 12 #include "chrome/browser/ui/gtk/gtk_util.h" | 12 #include "chrome/browser/ui/gtk/gtk_util.h" |
| 13 #include "chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_g
tk.h" | 13 #include "chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_g
tk.h" |
| 14 #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" | 14 #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" |
| 15 #include "chrome/browser/ui/web_contents_modal_dialog_manager_delegate.h" | 15 #include "chrome/browser/ui/web_contents_modal_dialog_manager_delegate.h" |
| 16 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
| 17 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
| 18 #include "ui/base/gtk/focus_store_gtk.h" | 18 #include "ui/base/gtk/focus_store_gtk.h" |
| 19 #include "ui/base/gtk/gtk_compat.h" | 19 #include "ui/base/gtk/gtk_compat.h" |
| 20 #include "ui/base/gtk/gtk_hig_constants.h" | 20 #include "ui/base/gtk/gtk_hig_constants.h" |
| 21 | 21 |
| 22 using content::BrowserThread; | 22 using content::BrowserThread; |
| 23 | 23 |
| 24 ConstrainedWindowGtkDelegate::~ConstrainedWindowGtkDelegate() { | |
| 25 } | |
| 26 | |
| 27 bool ConstrainedWindowGtkDelegate::GetBackgroundColor(GdkColor* color) { | |
| 28 return false; | |
| 29 } | |
| 30 | |
| 31 ConstrainedWindowGtk::ConstrainedWindowGtk( | 24 ConstrainedWindowGtk::ConstrainedWindowGtk( |
| 32 content::WebContents* web_contents, | 25 content::WebContents* web_contents, |
| 33 ConstrainedWindowGtkDelegate* delegate) | 26 GtkWidget* contents, |
| 27 GtkWidget* focus_widget) |
| 34 : web_contents_(web_contents), | 28 : web_contents_(web_contents), |
| 35 delegate_(delegate), | 29 focus_widget_(focus_widget), |
| 36 visible_(false) { | 30 visible_(false) { |
| 37 DCHECK(web_contents); | 31 DCHECK(web_contents); |
| 38 DCHECK(delegate); | |
| 39 GtkWidget* dialog = delegate->GetWidgetRoot(); | |
| 40 | 32 |
| 41 // Unlike other users of CreateBorderBin, we need a dedicated frame around | 33 // Unlike other users of CreateBorderBin, we need a dedicated frame around |
| 42 // our "window". | 34 // our "window". |
| 43 border_ = gtk_event_box_new(); | 35 border_ = gtk_event_box_new(); |
| 44 g_object_ref_sink(border_); | 36 g_object_ref_sink(border_); |
| 45 GtkWidget* frame = gtk_frame_new(NULL); | 37 GtkWidget* frame = gtk_frame_new(NULL); |
| 46 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); | 38 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); |
| 47 | 39 |
| 48 GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); | 40 GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); |
| 49 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), | 41 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), |
| 50 ui::kContentAreaBorder, ui::kContentAreaBorder, | 42 ui::kContentAreaBorder, ui::kContentAreaBorder, |
| 51 ui::kContentAreaBorder, ui::kContentAreaBorder); | 43 ui::kContentAreaBorder, ui::kContentAreaBorder); |
| 52 | 44 |
| 53 if (gtk_widget_get_parent(dialog)) | 45 if (gtk_widget_get_parent(contents)) |
| 54 gtk_widget_reparent(dialog, alignment); | 46 gtk_widget_reparent(contents, alignment); |
| 55 else | 47 else |
| 56 gtk_container_add(GTK_CONTAINER(alignment), dialog); | 48 gtk_container_add(GTK_CONTAINER(alignment), contents); |
| 57 | 49 |
| 58 gtk_container_add(GTK_CONTAINER(frame), alignment); | 50 gtk_container_add(GTK_CONTAINER(frame), alignment); |
| 59 gtk_container_add(GTK_CONTAINER(border_), frame); | 51 gtk_container_add(GTK_CONTAINER(border_), frame); |
| 60 | 52 |
| 61 GdkColor background; | 53 gtk_widget_add_events(widget(), GDK_KEY_PRESS_MASK); |
| 62 if (delegate_->GetBackgroundColor(&background)) { | 54 g_signal_connect(widget(), "key-press-event", G_CALLBACK(OnKeyPressThunk), |
| 63 gtk_widget_modify_base(border_, GTK_STATE_NORMAL, &background); | |
| 64 gtk_widget_modify_fg(border_, GTK_STATE_NORMAL, &background); | |
| 65 gtk_widget_modify_bg(border_, GTK_STATE_NORMAL, &background); | |
| 66 } | |
| 67 | |
| 68 gtk_widget_add_events(border_, GDK_KEY_PRESS_MASK); | |
| 69 g_signal_connect(border_, "key-press-event", G_CALLBACK(OnKeyPressThunk), | |
| 70 this); | 55 this); |
| 71 g_signal_connect(border_, "hierarchy-changed", | 56 g_signal_connect(border_, "hierarchy-changed", |
| 72 G_CALLBACK(OnHierarchyChangedThunk), this); | 57 G_CALLBACK(OnHierarchyChangedThunk), this); |
| 73 g_signal_connect(border_, "destroy", G_CALLBACK(OnDestroyThunk), | 58 g_signal_connect(border_, "destroy", G_CALLBACK(OnDestroyThunk), |
| 74 this); | 59 this); |
| 75 | 60 |
| 76 // TODO(wittman): Getting/setting data on the widget is a hack to facilitate | 61 // TODO(wittman): Getting/setting data on the widget is a hack to facilitate |
| 77 // looking up the ConstrainedWindowGtk from the GtkWindow during refactoring. | 62 // looking up the ConstrainedWindowGtk from the GtkWindow during refactoring. |
| 78 // Remove once ConstrainedWindowGtk is gone. | 63 // Remove once ConstrainedWindowGtk is gone. |
| 79 g_object_set_data(G_OBJECT(border_), "ConstrainedWindowGtk", this); | 64 g_object_set_data(G_OBJECT(border_), "ConstrainedWindowGtk", this); |
| 80 } | 65 } |
| 81 | 66 |
| 82 ConstrainedWindowGtk::~ConstrainedWindowGtk() { | 67 ConstrainedWindowGtk::~ConstrainedWindowGtk() { |
| 83 } | 68 } |
| 84 | 69 |
| 85 void ConstrainedWindowGtk::ShowWebContentsModalDialog() { | 70 void ConstrainedWindowGtk::ShowWebContentsModalDialog() { |
| 86 gtk_widget_show_all(border_); | 71 gtk_widget_show_all(border_); |
| 87 | 72 |
| 88 // We collaborate with WebContentsView and stick ourselves in the | 73 // We collaborate with WebContentsView and stick ourselves in the |
| 89 // WebContentsView's floating container. | 74 // WebContentsView's floating container. |
| 90 ContainingView()->AttachWebContentsModalDialog(border_); | 75 ContainingView()->AttachWebContentsModalDialog(border_); |
| 91 | 76 |
| 92 visible_ = true; | 77 visible_ = true; |
| 93 } | 78 } |
| 94 | 79 |
| 95 void ConstrainedWindowGtk::FocusWebContentsModalDialog() { | 80 void ConstrainedWindowGtk::FocusWebContentsModalDialog() { |
| 96 GtkWidget* focus_widget = delegate_->GetFocusWidget(); | 81 if (!focus_widget_) |
| 97 if (!focus_widget) | |
| 98 return; | 82 return; |
| 99 | 83 |
| 100 // The user may have focused another tab. In this case do not grab focus | 84 // The user may have focused another tab. In this case do not grab focus |
| 101 // until this tab is refocused. | 85 // until this tab is refocused. |
| 102 if (gtk_util::IsWidgetAncestryVisible(focus_widget)) | 86 if (gtk_util::IsWidgetAncestryVisible(focus_widget_)) |
| 103 gtk_widget_grab_focus(focus_widget); | 87 gtk_widget_grab_focus(focus_widget_); |
| 104 else | 88 else |
| 105 ContainingView()->focus_store()->SetWidget(focus_widget); | 89 ContainingView()->focus_store()->SetWidget(focus_widget_); |
| 106 } | 90 } |
| 107 | 91 |
| 108 void ConstrainedWindowGtk::PulseWebContentsModalDialog() { | 92 void ConstrainedWindowGtk::PulseWebContentsModalDialog() { |
| 109 } | 93 } |
| 110 | 94 |
| 111 NativeWebContentsModalDialog ConstrainedWindowGtk::GetNativeDialog() { | 95 NativeWebContentsModalDialog ConstrainedWindowGtk::GetNativeDialog() { |
| 112 return widget(); | 96 return widget(); |
| 113 } | 97 } |
| 114 | 98 |
| 115 ConstrainedWindowGtk::TabContentsViewType* | 99 ConstrainedWindowGtk::TabContentsViewType* |
| (...skipping 17 matching lines...) Expand all Loading... |
| 133 | 117 |
| 134 if (!gtk_widget_is_toplevel(gtk_widget_get_toplevel(border_))) | 118 if (!gtk_widget_is_toplevel(gtk_widget_get_toplevel(border_))) |
| 135 return; | 119 return; |
| 136 | 120 |
| 137 FocusWebContentsModalDialog(); | 121 FocusWebContentsModalDialog(); |
| 138 } | 122 } |
| 139 | 123 |
| 140 void ConstrainedWindowGtk::OnDestroy(GtkWidget* sender) { | 124 void ConstrainedWindowGtk::OnDestroy(GtkWidget* sender) { |
| 141 if (visible_) | 125 if (visible_) |
| 142 ContainingView()->RemoveWebContentsModalDialog(border_); | 126 ContainingView()->RemoveWebContentsModalDialog(border_); |
| 143 delegate_->DeleteDelegate(); | |
| 144 WebContentsModalDialogManager* web_contents_modal_dialog_manager = | 127 WebContentsModalDialogManager* web_contents_modal_dialog_manager = |
| 145 WebContentsModalDialogManager::FromWebContents(web_contents_); | 128 WebContentsModalDialogManager::FromWebContents(web_contents_); |
| 146 web_contents_modal_dialog_manager->WillClose(border_); | 129 web_contents_modal_dialog_manager->WillClose(border_); |
| 147 | 130 |
| 148 g_object_unref(border_); | 131 g_object_unref(border_); |
| 149 border_ = NULL; | 132 border_ = NULL; |
| 150 | 133 |
| 151 delete this; | 134 delete this; |
| 152 } | 135 } |
| 153 | 136 |
| 154 GtkWidget* CreateWebContentsModalDialogGtk( | 137 GtkWidget* CreateWebContentsModalDialogGtk( |
| 155 content::WebContents* web_contents, | 138 content::WebContents* web_contents, |
| 156 ConstrainedWindowGtkDelegate* delegate) { | 139 GtkWidget* contents, |
| 140 GtkWidget* focus_widget) { |
| 157 ConstrainedWindowGtk* window = | 141 ConstrainedWindowGtk* window = |
| 158 new ConstrainedWindowGtk(web_contents, delegate); | 142 new ConstrainedWindowGtk(web_contents, contents, focus_widget); |
| 159 return window->widget(); | 143 return window->widget(); |
| 160 } | 144 } |
| OLD | NEW |