OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/ui/browser_list.h" | 9 #include "chrome/browser/ui/browser_list.h" |
| 10 #include "chrome/browser/ui/constrained_window_tab_helper.h" |
10 #include "chrome/browser/ui/gtk/gtk_util.h" | 11 #include "chrome/browser/ui/gtk/gtk_util.h" |
| 12 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
11 #include "content/browser/browser_thread.h" | 13 #include "content/browser/browser_thread.h" |
12 #include "content/browser/tab_contents/tab_contents.h" | 14 #include "content/browser/tab_contents/tab_contents.h" |
13 #include "ui/base/gtk/gtk_hig_constants.h" | 15 #include "ui/base/gtk/gtk_hig_constants.h" |
14 | 16 |
15 #if defined(TOUCH_UI) | 17 #if defined(TOUCH_UI) |
16 #include "chrome/browser/ui/views/tab_contents/tab_contents_view_views.h" | 18 #include "chrome/browser/ui/views/tab_contents/tab_contents_view_views.h" |
17 #elif defined(TOOLKIT_VIEWS) | 19 #elif defined(TOOLKIT_VIEWS) |
18 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_view_gtk.h" | 20 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_view_gtk.h" |
19 #include "chrome/browser/ui/views/tab_contents/tab_contents_view_views.h" | 21 #include "chrome/browser/ui/views/tab_contents/tab_contents_view_views.h" |
20 #else | 22 #else |
21 #include "chrome/browser/tab_contents/tab_contents_view_gtk.h" | 23 #include "chrome/browser/tab_contents/tab_contents_view_gtk.h" |
22 #endif | 24 #endif |
23 | 25 |
24 ConstrainedWindowGtkDelegate::~ConstrainedWindowGtkDelegate() { | 26 ConstrainedWindowGtkDelegate::~ConstrainedWindowGtkDelegate() { |
25 } | 27 } |
26 | 28 |
27 bool ConstrainedWindowGtkDelegate::GetBackgroundColor(GdkColor* color) { | 29 bool ConstrainedWindowGtkDelegate::GetBackgroundColor(GdkColor* color) { |
28 return false; | 30 return false; |
29 } | 31 } |
30 | 32 |
31 bool ConstrainedWindowGtkDelegate::ShouldHaveBorderPadding() const { | 33 bool ConstrainedWindowGtkDelegate::ShouldHaveBorderPadding() const { |
32 return true; | 34 return true; |
33 } | 35 } |
34 | 36 |
35 ConstrainedWindowGtk::ConstrainedWindowGtk( | 37 ConstrainedWindowGtk::ConstrainedWindowGtk( |
36 TabContents* owner, ConstrainedWindowGtkDelegate* delegate) | 38 TabContentsWrapper* wrapper, ConstrainedWindowGtkDelegate* delegate) |
37 : owner_(owner), | 39 : wrapper_(wrapper), |
38 delegate_(delegate), | 40 delegate_(delegate), |
39 visible_(false), | 41 visible_(false), |
40 factory_(this) { | 42 factory_(this) { |
41 DCHECK(owner); | 43 DCHECK(wrapper); |
42 DCHECK(delegate); | 44 DCHECK(delegate); |
43 GtkWidget* dialog = delegate->GetWidgetRoot(); | 45 GtkWidget* dialog = delegate->GetWidgetRoot(); |
44 | 46 |
45 // Unlike other users of CreateBorderBin, we need a dedicated frame around | 47 // Unlike other users of CreateBorderBin, we need a dedicated frame around |
46 // our "window". | 48 // our "window". |
47 GtkWidget* ebox = gtk_event_box_new(); | 49 GtkWidget* ebox = gtk_event_box_new(); |
48 GtkWidget* frame = gtk_frame_new(NULL); | 50 GtkWidget* frame = gtk_frame_new(NULL); |
49 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); | 51 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); |
50 | 52 |
51 GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); | 53 GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); |
(...skipping 18 matching lines...) Expand all Loading... |
70 gtk_container_add(GTK_CONTAINER(frame), alignment); | 72 gtk_container_add(GTK_CONTAINER(frame), alignment); |
71 gtk_container_add(GTK_CONTAINER(ebox), frame); | 73 gtk_container_add(GTK_CONTAINER(ebox), frame); |
72 border_.Own(ebox); | 74 border_.Own(ebox); |
73 | 75 |
74 gtk_widget_add_events(widget(), GDK_KEY_PRESS_MASK); | 76 gtk_widget_add_events(widget(), GDK_KEY_PRESS_MASK); |
75 g_signal_connect(widget(), "key-press-event", G_CALLBACK(OnKeyPressThunk), | 77 g_signal_connect(widget(), "key-press-event", G_CALLBACK(OnKeyPressThunk), |
76 this); | 78 this); |
77 g_signal_connect(widget(), "hierarchy-changed", | 79 g_signal_connect(widget(), "hierarchy-changed", |
78 G_CALLBACK(OnHierarchyChangedThunk), this); | 80 G_CALLBACK(OnHierarchyChangedThunk), this); |
79 | 81 |
80 owner->AddConstrainedDialog(this); | 82 wrapper_->constrained_window_tab_helper()->AddConstrainedDialog(this); |
81 } | 83 } |
82 | 84 |
83 ConstrainedWindowGtk::~ConstrainedWindowGtk() { | 85 ConstrainedWindowGtk::~ConstrainedWindowGtk() { |
84 border_.Destroy(); | 86 border_.Destroy(); |
85 } | 87 } |
86 | 88 |
87 void ConstrainedWindowGtk::ShowConstrainedWindow() { | 89 void ConstrainedWindowGtk::ShowConstrainedWindow() { |
88 gtk_widget_show_all(border_.get()); | 90 gtk_widget_show_all(border_.get()); |
89 | 91 |
90 // We collaborate with TabContentsView and stick ourselves in the | 92 // We collaborate with TabContentsView and stick ourselves in the |
91 // TabContentsView's floating container. | 93 // TabContentsView's floating container. |
92 ContainingView()->AttachConstrainedWindow(this); | 94 ContainingView()->AttachConstrainedWindow(this); |
93 | 95 |
94 visible_ = true; | 96 visible_ = true; |
95 } | 97 } |
96 | 98 |
97 void ConstrainedWindowGtk::CloseConstrainedWindow() { | 99 void ConstrainedWindowGtk::CloseConstrainedWindow() { |
98 if (visible_) | 100 if (visible_) |
99 ContainingView()->RemoveConstrainedWindow(this); | 101 ContainingView()->RemoveConstrainedWindow(this); |
100 delegate_->DeleteDelegate(); | 102 delegate_->DeleteDelegate(); |
101 owner_->WillClose(this); | 103 wrapper_->constrained_window_tab_helper()->WillClose(this); |
102 | 104 |
103 delete this; | 105 delete this; |
104 } | 106 } |
105 | 107 |
106 void ConstrainedWindowGtk::FocusConstrainedWindow() { | 108 void ConstrainedWindowGtk::FocusConstrainedWindow() { |
107 GtkWidget* focus_widget = delegate_->GetFocusWidget(); | 109 GtkWidget* focus_widget = delegate_->GetFocusWidget(); |
108 if (!focus_widget) | 110 if (!focus_widget) |
109 return; | 111 return; |
110 | 112 |
111 // The user may have focused another tab. In this case do not grab focus | 113 // The user may have focused another tab. In this case do not grab focus |
112 // until this tab is refocused. | 114 // until this tab is refocused. |
113 if ((!owner_->delegate() || | 115 ConstrainedWindowTabHelper* helper = |
114 owner_->delegate()->ShouldFocusConstrainedWindow()) && | 116 wrapper_->constrained_window_tab_helper(); |
| 117 if ((!helper->delegate() || |
| 118 helper->delegate()->ShouldFocusConstrainedWindow()) && |
115 gtk_util::IsWidgetAncestryVisible(focus_widget)) { | 119 gtk_util::IsWidgetAncestryVisible(focus_widget)) { |
116 gtk_widget_grab_focus(focus_widget); | 120 gtk_widget_grab_focus(focus_widget); |
117 } else { | 121 } else { |
118 // TODO(estade): this define should not need to be here because this class | 122 // TODO(estade): this define should not need to be here because this class |
119 // should not be used on linux/views. | 123 // should not be used on linux/views. |
120 #if defined(TOOLKIT_GTK) | 124 #if defined(TOOLKIT_GTK) |
121 static_cast<TabContentsViewGtk*>(owner_->view())-> | 125 static_cast<TabContentsViewGtk*>(wrapper_->view())-> |
122 SetFocusedWidget(focus_widget); | 126 SetFocusedWidget(focus_widget); |
123 #endif | 127 #endif |
124 } | 128 } |
125 } | 129 } |
126 | 130 |
127 ConstrainedWindowGtk::TabContentsViewType* | 131 ConstrainedWindowGtk::TabContentsViewType* |
128 ConstrainedWindowGtk::ContainingView() { | 132 ConstrainedWindowGtk::ContainingView() { |
129 #if defined(TOOLKIT_VIEWS) && !defined(TOUCH_UI) | 133 #if defined(TOOLKIT_VIEWS) && !defined(TOUCH_UI) |
130 return static_cast<NativeTabContentsViewGtk*>( | 134 return static_cast<NativeTabContentsViewGtk*>( |
131 static_cast<TabContentsViewViews*>(owner_->view())-> | 135 static_cast<TabContentsViewViews*>(wrapper_->view())-> |
132 native_tab_contents_view()); | 136 native_tab_contents_view()); |
133 #else | 137 #else |
134 return static_cast<TabContentsViewType*>(owner_->view()); | 138 return static_cast<TabContentsViewType*>(wrapper_->view()); |
135 #endif | 139 #endif |
136 } | 140 } |
137 | 141 |
138 gboolean ConstrainedWindowGtk::OnKeyPress(GtkWidget* sender, | 142 gboolean ConstrainedWindowGtk::OnKeyPress(GtkWidget* sender, |
139 GdkEventKey* key) { | 143 GdkEventKey* key) { |
140 if (key->keyval == GDK_Escape) { | 144 if (key->keyval == GDK_Escape) { |
141 // Let the stack unwind so the event handler can release its ref | 145 // Let the stack unwind so the event handler can release its ref |
142 // on widget(). | 146 // on widget(). |
143 MessageLoop::current()->PostTask(FROM_HERE, | 147 MessageLoop::current()->PostTask(FROM_HERE, |
144 factory_.NewRunnableMethod( | 148 factory_.NewRunnableMethod( |
145 &ConstrainedWindowGtk::CloseConstrainedWindow)); | 149 &ConstrainedWindowGtk::CloseConstrainedWindow)); |
146 return TRUE; | 150 return TRUE; |
147 } | 151 } |
148 | 152 |
149 return FALSE; | 153 return FALSE; |
150 } | 154 } |
151 | 155 |
152 void ConstrainedWindowGtk::OnHierarchyChanged(GtkWidget* sender, | 156 void ConstrainedWindowGtk::OnHierarchyChanged(GtkWidget* sender, |
153 GtkWidget* previous_toplevel) { | 157 GtkWidget* previous_toplevel) { |
154 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
155 if (!GTK_WIDGET_TOPLEVEL(gtk_widget_get_toplevel(widget()))) | 159 if (!GTK_WIDGET_TOPLEVEL(gtk_widget_get_toplevel(widget()))) |
156 return; | 160 return; |
157 | 161 |
158 FocusConstrainedWindow(); | 162 FocusConstrainedWindow(); |
159 } | 163 } |
OLD | NEW |