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/extensions/shell_window_gtk.h" | 5 #include "chrome/browser/ui/gtk/extensions/native_app_window_gtk.h" |
6 | 6 |
7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
8 #include "chrome/browser/profiles/profile.h" | 8 #include "chrome/browser/profiles/profile.h" |
9 #include "chrome/browser/ui/gtk/extensions/extension_keybinding_registry_gtk.h" | 9 #include "chrome/browser/ui/gtk/extensions/extension_keybinding_registry_gtk.h" |
10 #include "chrome/browser/ui/gtk/gtk_util.h" | 10 #include "chrome/browser/ui/gtk/gtk_util.h" |
11 #include "chrome/browser/ui/gtk/gtk_window_util.h" | 11 #include "chrome/browser/ui/gtk/gtk_window_util.h" |
12 #include "chrome/browser/web_applications/web_app.h" | 12 #include "chrome/browser/web_applications/web_app.h" |
13 #include "chrome/common/extensions/extension.h" | 13 #include "chrome/common/extensions/extension.h" |
14 #include "content/public/browser/render_view_host.h" | 14 #include "content/public/browser/render_view_host.h" |
15 #include "content/public/browser/render_widget_host_view.h" | 15 #include "content/public/browser/render_widget_host_view.h" |
16 #include "content/public/browser/web_contents.h" | 16 #include "content/public/browser/web_contents.h" |
17 #include "content/public/browser/web_contents_view.h" | 17 #include "content/public/browser/web_contents_view.h" |
18 #include "ui/base/x/active_window_watcher_x.h" | 18 #include "ui/base/x/active_window_watcher_x.h" |
19 #include "ui/gfx/image/image.h" | 19 #include "ui/gfx/image/image.h" |
20 #include "ui/gfx/rect.h" | 20 #include "ui/gfx/rect.h" |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 // The timeout in milliseconds before we'll get the true window position with | 24 // The timeout in milliseconds before we'll get the true window position with |
25 // gtk_window_get_position() after the last GTK configure-event signal. | 25 // gtk_window_get_position() after the last GTK configure-event signal. |
26 const int kDebounceTimeoutMilliseconds = 100; | 26 const int kDebounceTimeoutMilliseconds = 100; |
27 | 27 |
28 } // namespace | 28 } // namespace |
29 | 29 |
30 ShellWindowGtk::ShellWindowGtk(ShellWindow* shell_window, | 30 NativeAppWindowGtk::NativeAppWindowGtk(ShellWindow* shell_window, |
31 const ShellWindow::CreateParams& params) | 31 const ShellWindow::CreateParams& params) |
32 : shell_window_(shell_window), | 32 : shell_window_(shell_window), |
33 window_(NULL), | 33 window_(NULL), |
34 state_(GDK_WINDOW_STATE_WITHDRAWN), | 34 state_(GDK_WINDOW_STATE_WITHDRAWN), |
35 is_active_(false), | 35 is_active_(false), |
36 content_thinks_its_fullscreen_(false), | 36 content_thinks_its_fullscreen_(false), |
37 frameless_(params.frame == ShellWindow::CreateParams::FRAME_NONE) { | 37 frameless_(params.frame == ShellWindow::CreateParams::FRAME_NONE) { |
38 window_ = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); | 38 window_ = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); |
39 | 39 |
40 gfx::NativeView native_view = | 40 gfx::NativeView native_view = |
41 web_contents()->GetView()->GetNativeView(); | 41 web_contents()->GetView()->GetNativeView(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 // Add the keybinding registry. | 116 // Add the keybinding registry. |
117 extension_keybinding_registry_.reset(new ExtensionKeybindingRegistryGtk( | 117 extension_keybinding_registry_.reset(new ExtensionKeybindingRegistryGtk( |
118 shell_window_->profile(), | 118 shell_window_->profile(), |
119 window_, | 119 window_, |
120 extensions::ExtensionKeybindingRegistry::PLATFORM_APPS_ONLY, | 120 extensions::ExtensionKeybindingRegistry::PLATFORM_APPS_ONLY, |
121 shell_window_)); | 121 shell_window_)); |
122 | 122 |
123 ui::ActiveWindowWatcherX::AddObserver(this); | 123 ui::ActiveWindowWatcherX::AddObserver(this); |
124 } | 124 } |
125 | 125 |
126 ShellWindowGtk::~ShellWindowGtk() { | 126 NativeAppWindowGtk::~NativeAppWindowGtk() { |
127 ui::ActiveWindowWatcherX::RemoveObserver(this); | 127 ui::ActiveWindowWatcherX::RemoveObserver(this); |
128 } | 128 } |
129 | 129 |
130 bool ShellWindowGtk::IsActive() const { | 130 bool NativeAppWindowGtk::IsActive() const { |
131 if (ui::ActiveWindowWatcherX::WMSupportsActivation()) | 131 if (ui::ActiveWindowWatcherX::WMSupportsActivation()) |
132 return is_active_; | 132 return is_active_; |
133 | 133 |
134 // This still works even though we don't get the activation notification. | 134 // This still works even though we don't get the activation notification. |
135 return gtk_window_is_active(window_); | 135 return gtk_window_is_active(window_); |
136 } | 136 } |
137 | 137 |
138 bool ShellWindowGtk::IsMaximized() const { | 138 bool NativeAppWindowGtk::IsMaximized() const { |
139 return (state_ & GDK_WINDOW_STATE_MAXIMIZED); | 139 return (state_ & GDK_WINDOW_STATE_MAXIMIZED); |
140 } | 140 } |
141 | 141 |
142 bool ShellWindowGtk::IsMinimized() const { | 142 bool NativeAppWindowGtk::IsMinimized() const { |
143 return (state_ & GDK_WINDOW_STATE_ICONIFIED); | 143 return (state_ & GDK_WINDOW_STATE_ICONIFIED); |
144 } | 144 } |
145 | 145 |
146 bool ShellWindowGtk::IsFullscreen() const { | 146 bool NativeAppWindowGtk::IsFullscreen() const { |
147 return false; | 147 return false; |
148 } | 148 } |
149 | 149 |
150 gfx::NativeWindow ShellWindowGtk::GetNativeWindow() { | 150 gfx::NativeWindow NativeAppWindowGtk::GetNativeWindow() { |
151 return window_; | 151 return window_; |
152 } | 152 } |
153 | 153 |
154 gfx::Rect ShellWindowGtk::GetRestoredBounds() const { | 154 gfx::Rect NativeAppWindowGtk::GetRestoredBounds() const { |
155 return restored_bounds_; | 155 return restored_bounds_; |
156 } | 156 } |
157 | 157 |
158 gfx::Rect ShellWindowGtk::GetBounds() const { | 158 gfx::Rect NativeAppWindowGtk::GetBounds() const { |
159 return bounds_; | 159 return bounds_; |
160 } | 160 } |
161 | 161 |
162 void ShellWindowGtk::Show() { | 162 void NativeAppWindowGtk::Show() { |
163 gtk_window_present(window_); | 163 gtk_window_present(window_); |
164 } | 164 } |
165 | 165 |
166 void ShellWindowGtk::ShowInactive() { | 166 void NativeAppWindowGtk::ShowInactive() { |
167 gtk_window_set_focus_on_map(window_, false); | 167 gtk_window_set_focus_on_map(window_, false); |
168 gtk_widget_show(GTK_WIDGET(window_)); | 168 gtk_widget_show(GTK_WIDGET(window_)); |
169 } | 169 } |
170 | 170 |
171 void ShellWindowGtk::Hide() { | 171 void NativeAppWindowGtk::Hide() { |
172 gtk_widget_hide(GTK_WIDGET(window_)); | 172 gtk_widget_hide(GTK_WIDGET(window_)); |
173 } | 173 } |
174 | 174 |
175 void ShellWindowGtk::Close() { | 175 void NativeAppWindowGtk::Close() { |
176 shell_window_->OnNativeWindowChanged(); | 176 shell_window_->OnNativeWindowChanged(); |
177 | 177 |
178 // Cancel any pending callback from the window configure debounce timer. | 178 // Cancel any pending callback from the window configure debounce timer. |
179 window_configure_debounce_timer_.Stop(); | 179 window_configure_debounce_timer_.Stop(); |
180 | 180 |
181 GtkWidget* window = GTK_WIDGET(window_); | 181 GtkWidget* window = GTK_WIDGET(window_); |
182 // To help catch bugs in any event handlers that might get fired during the | 182 // To help catch bugs in any event handlers that might get fired during the |
183 // destruction, set window_ to NULL before any handlers will run. | 183 // destruction, set window_ to NULL before any handlers will run. |
184 window_ = NULL; | 184 window_ = NULL; |
185 | 185 |
186 // OnNativeClose does a delete this so no other members should | 186 // OnNativeClose does a delete this so no other members should |
187 // be accessed after. gtk_widget_destroy is safe (and must | 187 // be accessed after. gtk_widget_destroy is safe (and must |
188 // be last). | 188 // be last). |
189 shell_window_->OnNativeClose(); | 189 shell_window_->OnNativeClose(); |
190 gtk_widget_destroy(window); | 190 gtk_widget_destroy(window); |
191 } | 191 } |
192 | 192 |
193 void ShellWindowGtk::Activate() { | 193 void NativeAppWindowGtk::Activate() { |
194 gtk_window_present(window_); | 194 gtk_window_present(window_); |
195 } | 195 } |
196 | 196 |
197 void ShellWindowGtk::Deactivate() { | 197 void NativeAppWindowGtk::Deactivate() { |
198 gdk_window_lower(gtk_widget_get_window(GTK_WIDGET(window_))); | 198 gdk_window_lower(gtk_widget_get_window(GTK_WIDGET(window_))); |
199 } | 199 } |
200 | 200 |
201 void ShellWindowGtk::Maximize() { | 201 void NativeAppWindowGtk::Maximize() { |
202 gtk_window_maximize(window_); | 202 gtk_window_maximize(window_); |
203 } | 203 } |
204 | 204 |
205 void ShellWindowGtk::Minimize() { | 205 void NativeAppWindowGtk::Minimize() { |
206 gtk_window_iconify(window_); | 206 gtk_window_iconify(window_); |
207 shell_window_->OnNativeWindowChanged(); | |
208 } | 207 } |
209 | 208 |
210 void ShellWindowGtk::Restore() { | 209 void NativeAppWindowGtk::Restore() { |
211 if (IsMaximized()) | 210 if (IsMaximized()) |
212 gtk_window_unmaximize(window_); | 211 gtk_window_unmaximize(window_); |
213 else if (IsMinimized()) | 212 else if (IsMinimized()) |
214 gtk_window_deiconify(window_); | 213 gtk_window_deiconify(window_); |
215 shell_window_->OnNativeWindowChanged(); | |
216 } | 214 } |
217 | 215 |
218 void ShellWindowGtk::SetBounds(const gfx::Rect& bounds) { | 216 void NativeAppWindowGtk::SetBounds(const gfx::Rect& bounds) { |
219 gtk_window_move(window_, bounds.x(), bounds.y()); | 217 gtk_window_move(window_, bounds.x(), bounds.y()); |
220 gtk_window_util::SetWindowSize(window_, | 218 gtk_window_util::SetWindowSize(window_, |
221 gfx::Size(bounds.width(), bounds.height())); | 219 gfx::Size(bounds.width(), bounds.height())); |
222 } | 220 } |
223 | 221 |
224 void ShellWindowGtk::FlashFrame(bool flash) { | 222 void NativeAppWindowGtk::FlashFrame(bool flash) { |
225 gtk_window_set_urgency_hint(window_, flash); | 223 gtk_window_set_urgency_hint(window_, flash); |
226 } | 224 } |
227 | 225 |
228 bool ShellWindowGtk::IsAlwaysOnTop() const { | 226 bool NativeAppWindowGtk::IsAlwaysOnTop() const { |
229 return false; | 227 return false; |
230 } | 228 } |
231 | 229 |
232 void ShellWindowGtk::ActiveWindowChanged(GdkWindow* active_window) { | 230 void NativeAppWindowGtk::ActiveWindowChanged(GdkWindow* active_window) { |
233 // Do nothing if we're in the process of closing the browser window. | 231 // Do nothing if we're in the process of closing the browser window. |
234 if (!window_) | 232 if (!window_) |
235 return; | 233 return; |
236 | 234 |
237 is_active_ = gtk_widget_get_window(GTK_WIDGET(window_)) == active_window; | 235 is_active_ = gtk_widget_get_window(GTK_WIDGET(window_)) == active_window; |
238 } | 236 } |
239 | 237 |
240 // Callback for the delete event. This event is fired when the user tries to | 238 // Callback for the delete event. This event is fired when the user tries to |
241 // close the window (e.g., clicking on the X in the window manager title bar). | 239 // close the window (e.g., clicking on the X in the window manager title bar). |
242 gboolean ShellWindowGtk::OnMainWindowDeleteEvent(GtkWidget* widget, | 240 gboolean NativeAppWindowGtk::OnMainWindowDeleteEvent(GtkWidget* widget, |
243 GdkEvent* event) { | 241 GdkEvent* event) { |
244 Close(); | 242 Close(); |
245 | 243 |
246 // Return true to prevent the GTK window from being destroyed. Close will | 244 // Return true to prevent the GTK window from being destroyed. Close will |
247 // destroy it for us. | 245 // destroy it for us. |
248 return TRUE; | 246 return TRUE; |
249 } | 247 } |
250 | 248 |
251 gboolean ShellWindowGtk::OnConfigure(GtkWidget* widget, | 249 gboolean NativeAppWindowGtk::OnConfigure(GtkWidget* widget, |
252 GdkEventConfigure* event) { | 250 GdkEventConfigure* event) { |
253 // We update |bounds_| but not |restored_bounds_| here. The latter needs | 251 // We update |bounds_| but not |restored_bounds_| here. The latter needs |
254 // to be updated conditionally when the window is non-maximized and non- | 252 // to be updated conditionally when the window is non-maximized and non- |
255 // fullscreen, but whether those state updates have been processed yet is | 253 // fullscreen, but whether those state updates have been processed yet is |
256 // window-manager specific. We update |restored_bounds_| in the debounced | 254 // window-manager specific. We update |restored_bounds_| in the debounced |
257 // handler below, after the window state has been updated. | 255 // handler below, after the window state has been updated. |
258 bounds_.SetRect(event->x, event->y, event->width, event->height); | 256 bounds_.SetRect(event->x, event->y, event->width, event->height); |
259 | 257 |
260 // The GdkEventConfigure* we get here doesn't have quite the right | 258 // The GdkEventConfigure* we get here doesn't have quite the right |
261 // coordinates though (they're relative to the drawable window area, rather | 259 // coordinates though (they're relative to the drawable window area, rather |
262 // than any window manager decorations, if enabled), so we need to call | 260 // than any window manager decorations, if enabled), so we need to call |
263 // gtk_window_get_position() to get the right values. (Otherwise session | 261 // gtk_window_get_position() to get the right values. (Otherwise session |
264 // restore, if enabled, will restore windows to incorrect positions.) That's | 262 // restore, if enabled, will restore windows to incorrect positions.) That's |
265 // a round trip to the X server though, so we set a debounce timer and only | 263 // a round trip to the X server though, so we set a debounce timer and only |
266 // call it (in OnDebouncedBoundsChanged() below) after we haven't seen a | 264 // call it (in OnDebouncedBoundsChanged() below) after we haven't seen a |
267 // reconfigure event in a short while. | 265 // reconfigure event in a short while. |
268 // We don't use Reset() because the timer may not yet be running. | 266 // We don't use Reset() because the timer may not yet be running. |
269 // (In that case Stop() is a no-op.) | 267 // (In that case Stop() is a no-op.) |
270 window_configure_debounce_timer_.Stop(); | 268 window_configure_debounce_timer_.Stop(); |
271 window_configure_debounce_timer_.Start(FROM_HERE, | 269 window_configure_debounce_timer_.Start(FROM_HERE, |
272 base::TimeDelta::FromMilliseconds(kDebounceTimeoutMilliseconds), this, | 270 base::TimeDelta::FromMilliseconds(kDebounceTimeoutMilliseconds), this, |
273 &ShellWindowGtk::OnDebouncedBoundsChanged); | 271 &NativeAppWindowGtk::OnDebouncedBoundsChanged); |
274 | 272 |
275 return FALSE; | 273 return FALSE; |
276 } | 274 } |
277 | 275 |
278 void ShellWindowGtk::OnDebouncedBoundsChanged() { | 276 void NativeAppWindowGtk::OnDebouncedBoundsChanged() { |
279 gtk_window_util::UpdateWindowPosition(this, &bounds_, &restored_bounds_); | 277 gtk_window_util::UpdateWindowPosition(this, &bounds_, &restored_bounds_); |
280 shell_window_->OnNativeWindowChanged(); | 278 shell_window_->OnNativeWindowChanged(); |
281 } | 279 } |
282 | 280 |
283 gboolean ShellWindowGtk::OnWindowState(GtkWidget* sender, | 281 gboolean NativeAppWindowGtk::OnWindowState(GtkWidget* sender, |
284 GdkEventWindowState* event) { | 282 GdkEventWindowState* event) { |
285 state_ = event->new_window_state; | 283 state_ = event->new_window_state; |
286 | 284 |
287 if (content_thinks_its_fullscreen_ && | 285 if (content_thinks_its_fullscreen_ && |
288 !(state_ & GDK_WINDOW_STATE_FULLSCREEN)) { | 286 !(state_ & GDK_WINDOW_STATE_FULLSCREEN)) { |
289 content_thinks_its_fullscreen_ = false; | 287 content_thinks_its_fullscreen_ = false; |
290 content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); | 288 content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); |
291 if (rvh) | 289 if (rvh) |
292 rvh->ExitFullscreen(); | 290 rvh->ExitFullscreen(); |
293 } | 291 } |
294 | 292 |
295 shell_window_->OnNativeWindowChanged(); | |
296 return FALSE; | 293 return FALSE; |
297 } | 294 } |
298 | 295 |
299 gboolean ShellWindowGtk::OnButtonPress(GtkWidget* widget, | 296 gboolean NativeAppWindowGtk::OnButtonPress(GtkWidget* widget, |
300 GdkEventButton* event) { | 297 GdkEventButton* event) { |
301 if (draggable_region_ && draggable_region_->contains(event->x, event->y)) { | 298 if (draggable_region_ && draggable_region_->contains(event->x, event->y)) { |
302 if (event->button == 1) { | 299 if (event->button == 1) { |
303 if (GDK_BUTTON_PRESS == event->type) { | 300 if (GDK_BUTTON_PRESS == event->type) { |
304 if (!suppress_window_raise_) | 301 if (!suppress_window_raise_) |
305 gdk_window_raise(GTK_WIDGET(widget)->window); | 302 gdk_window_raise(GTK_WIDGET(widget)->window); |
306 | 303 |
307 return gtk_window_util::HandleTitleBarLeftMousePress( | 304 return gtk_window_util::HandleTitleBarLeftMousePress( |
308 GTK_WINDOW(widget), bounds_, event); | 305 GTK_WINDOW(widget), bounds_, event); |
309 } else if (GDK_2BUTTON_PRESS == event->type) { | 306 } else if (GDK_2BUTTON_PRESS == event->type) { |
310 bool is_maximized = gdk_window_get_state(GTK_WIDGET(widget)->window) & | 307 bool is_maximized = gdk_window_get_state(GTK_WIDGET(widget)->window) & |
311 GDK_WINDOW_STATE_MAXIMIZED; | 308 GDK_WINDOW_STATE_MAXIMIZED; |
312 if (is_maximized) { | 309 if (is_maximized) { |
313 gtk_window_util::UnMaximize(GTK_WINDOW(widget), | 310 gtk_window_util::UnMaximize(GTK_WINDOW(widget), |
314 bounds_, restored_bounds_); | 311 bounds_, restored_bounds_); |
315 } else { | 312 } else { |
316 gtk_window_maximize(GTK_WINDOW(widget)); | 313 gtk_window_maximize(GTK_WINDOW(widget)); |
317 } | 314 } |
318 return TRUE; | 315 return TRUE; |
319 } | 316 } |
320 } else if (event->button == 2) { | 317 } else if (event->button == 2) { |
321 gdk_window_lower(GTK_WIDGET(widget)->window); | 318 gdk_window_lower(GTK_WIDGET(widget)->window); |
322 return TRUE; | 319 return TRUE; |
323 } | 320 } |
324 } | 321 } |
325 | 322 |
326 return FALSE; | 323 return FALSE; |
327 } | 324 } |
328 | 325 |
329 void ShellWindowGtk::SetFullscreen(bool fullscreen) { | 326 void NativeAppWindowGtk::SetFullscreen(bool fullscreen) { |
330 content_thinks_its_fullscreen_ = fullscreen; | 327 content_thinks_its_fullscreen_ = fullscreen; |
331 if (fullscreen) | 328 if (fullscreen) |
332 gtk_window_fullscreen(window_); | 329 gtk_window_fullscreen(window_); |
333 else | 330 else |
334 gtk_window_unfullscreen(window_); | 331 gtk_window_unfullscreen(window_); |
335 } | 332 } |
336 | 333 |
337 bool ShellWindowGtk::IsFullscreenOrPending() const { | 334 bool NativeAppWindowGtk::IsFullscreenOrPending() const { |
338 return content_thinks_its_fullscreen_; | 335 return content_thinks_its_fullscreen_; |
339 } | 336 } |
340 | 337 |
341 void ShellWindowGtk::UpdateWindowIcon() { | 338 void NativeAppWindowGtk::UpdateWindowIcon() { |
342 Profile* profile = shell_window_->profile(); | 339 Profile* profile = shell_window_->profile(); |
343 gfx::Image app_icon = shell_window_->app_icon(); | 340 gfx::Image app_icon = shell_window_->app_icon(); |
344 if (!app_icon.IsEmpty()) | 341 if (!app_icon.IsEmpty()) |
345 gtk_util::SetWindowIcon(window_, profile, app_icon.ToGdkPixbuf()); | 342 gtk_util::SetWindowIcon(window_, profile, app_icon.ToGdkPixbuf()); |
346 else | 343 else |
347 gtk_util::SetWindowIcon(window_, profile); | 344 gtk_util::SetWindowIcon(window_, profile); |
348 } | 345 } |
349 | 346 |
350 void ShellWindowGtk::UpdateWindowTitle() { | 347 void NativeAppWindowGtk::UpdateWindowTitle() { |
351 string16 title = shell_window_->GetTitle(); | 348 string16 title = shell_window_->GetTitle(); |
352 gtk_window_set_title(window_, UTF16ToUTF8(title).c_str()); | 349 gtk_window_set_title(window_, UTF16ToUTF8(title).c_str()); |
353 } | 350 } |
354 | 351 |
355 void ShellWindowGtk::HandleKeyboardEvent( | 352 void NativeAppWindowGtk::HandleKeyboardEvent( |
356 const content::NativeWebKeyboardEvent& event) { | 353 const content::NativeWebKeyboardEvent& event) { |
357 // No-op. | 354 // No-op. |
358 } | 355 } |
359 | 356 |
360 void ShellWindowGtk::UpdateDraggableRegions( | 357 void NativeAppWindowGtk::UpdateDraggableRegions( |
361 const std::vector<extensions::DraggableRegion>& regions) { | 358 const std::vector<extensions::DraggableRegion>& regions) { |
362 // Draggable region is not supported for non-frameless window. | 359 // Draggable region is not supported for non-frameless window. |
363 if (!frameless_) | 360 if (!frameless_) |
364 return; | 361 return; |
365 | 362 |
366 draggable_region_.reset(ShellWindow::RawDraggableRegionsToSkRegion(regions)); | 363 draggable_region_.reset(ShellWindow::RawDraggableRegionsToSkRegion(regions)); |
367 } | 364 } |
368 | 365 |
369 // static | 366 // static |
370 NativeShellWindow* NativeShellWindow::Create( | 367 NativeAppWindow* NativeAppWindow::Create( |
371 ShellWindow* shell_window, const ShellWindow::CreateParams& params) { | 368 ShellWindow* shell_window, |
372 return new ShellWindowGtk(shell_window, params); | 369 const ShellWindow::CreateParams& params) { |
| 370 return new NativeAppWindowGtk(shell_window, params); |
373 } | 371 } |
OLD | NEW |