OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/views/apps/chrome_native_app_window_views.h" | 5 #include "chrome/browser/ui/views/apps/chrome_native_app_window_views.h" |
6 | 6 |
7 #include "apps/ui/views/app_window_frame_view.h" | 7 #include "apps/ui/views/app_window_frame_view.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "chrome/app/chrome_command_ids.h" | 9 #include "chrome/app/chrome_command_ids.h" |
10 #include "chrome/browser/app_mode/app_mode_utils.h" | 10 #include "chrome/browser/app_mode/app_mode_utils.h" |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 views::Widget* widget) {} | 203 views::Widget* widget) {} |
204 | 204 |
205 void ChromeNativeAppWindowViews::InitializeDefaultWindow( | 205 void ChromeNativeAppWindowViews::InitializeDefaultWindow( |
206 const AppWindow::CreateParams& create_params) { | 206 const AppWindow::CreateParams& create_params) { |
207 std::string app_name = | 207 std::string app_name = |
208 web_app::GenerateApplicationNameFromExtensionId( | 208 web_app::GenerateApplicationNameFromExtensionId( |
209 app_window()->extension()->id()); | 209 app_window()->extension()->id()); |
210 | 210 |
211 views::Widget::InitParams init_params(views::Widget::InitParams::TYPE_WINDOW); | 211 views::Widget::InitParams init_params(views::Widget::InitParams::TYPE_WINDOW); |
212 init_params.delegate = this; | 212 init_params.delegate = this; |
213 init_params.remove_standard_frame = !ShouldUseNativeFrame(); | 213 init_params.remove_standard_frame = IsFrameless() || has_frame_color_; |
214 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | |
215 // On Linux, remove the standard frame. Instead, we will use CustomFrameView | |
216 // to draw a native-like frame. | |
217 // TODO(mgiuca): Remove this during fix for http://crbug.com/322256. | |
218 init_params.remove_standard_frame = true; | |
219 #endif | |
220 init_params.use_system_default_icon = true; | 214 init_params.use_system_default_icon = true; |
221 // TODO(erg): Conceptually, these are toplevel windows, but we theoretically | 215 // TODO(erg): Conceptually, these are toplevel windows, but we theoretically |
222 // could plumb context through to here in some cases. | 216 // could plumb context through to here in some cases. |
223 init_params.top_level = true; | 217 init_params.top_level = true; |
224 if (create_params.transparent_background) | 218 if (create_params.transparent_background) |
225 init_params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; | 219 init_params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
226 init_params.keep_on_top = create_params.always_on_top; | 220 init_params.keep_on_top = create_params.always_on_top; |
227 | 221 |
228 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 222 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
229 // Set up a custom WM_CLASS for app windows. This allows task switchers in | 223 // Set up a custom WM_CLASS for app windows. This allows task switchers in |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 native_window->GetRootWindow(), | 324 native_window->GetRootWindow(), |
331 native_window->GetBoundsInScreen()); | 325 native_window->GetBoundsInScreen()); |
332 widget()->SetBounds(window_bounds); | 326 widget()->SetBounds(window_bounds); |
333 } | 327 } |
334 #else | 328 #else |
335 // TODO(stevenjb): NativeAppWindow panels need to be implemented for other | 329 // TODO(stevenjb): NativeAppWindow panels need to be implemented for other |
336 // platforms. | 330 // platforms. |
337 #endif | 331 #endif |
338 } | 332 } |
339 | 333 |
340 bool ChromeNativeAppWindowViews::ShouldUseNativeFrame() const { | |
341 return !IsFrameless() && !has_frame_color_; | |
342 } | |
343 | |
344 void ChromeNativeAppWindowViews::InstallEasyResizeTargeterOnContainer() const { | 334 void ChromeNativeAppWindowViews::InstallEasyResizeTargeterOnContainer() const { |
345 aura::Window* root_window = widget()->GetNativeWindow()->GetRootWindow(); | 335 aura::Window* root_window = widget()->GetNativeWindow()->GetRootWindow(); |
346 gfx::Insets inset(kResizeInsideBoundsSize, kResizeInsideBoundsSize, | 336 gfx::Insets inset(kResizeInsideBoundsSize, kResizeInsideBoundsSize, |
347 kResizeInsideBoundsSize, kResizeInsideBoundsSize); | 337 kResizeInsideBoundsSize, kResizeInsideBoundsSize); |
348 root_window->SetEventTargeter(scoped_ptr<ui::EventTargeter>( | 338 root_window->SetEventTargeter(scoped_ptr<ui::EventTargeter>( |
349 new wm::EasyResizeWindowTargeter(root_window, inset, inset))); | 339 new wm::EasyResizeWindowTargeter(root_window, inset, inset))); |
350 } | 340 } |
351 | 341 |
352 apps::AppWindowFrameView* | 342 apps::AppWindowFrameView* |
353 ChromeNativeAppWindowViews::CreateAppWindowFrameView() { | 343 ChromeNativeAppWindowViews::CreateAppWindowFrameView() { |
354 // By default the user can resize the window from slightly inside the bounds. | 344 // By default the user can resize the window from slightly inside the bounds. |
355 int resize_inside_bounds_size = kResizeInsideBoundsSize; | 345 int resize_inside_bounds_size = kResizeInsideBoundsSize; |
356 int resize_outside_bounds_size = 0; | 346 int resize_outside_bounds_size = 0; |
357 int resize_outside_scale_for_touch = 1; | 347 int resize_outside_scale_for_touch = 1; |
358 int resize_area_corner_size = kResizeAreaCornerSize; | 348 int resize_area_corner_size = kResizeAreaCornerSize; |
359 #if defined(USE_ASH) | 349 #if defined(USE_ASH) |
360 // For Aura windows on the Ash desktop the sizes are different and the user | 350 // For Aura windows on the Ash desktop the sizes are different and the user |
361 // can resize the window from slightly outside the bounds as well. | 351 // can resize the window from slightly outside the bounds as well. |
362 if (chrome::IsNativeWindowInAsh(widget()->GetNativeWindow())) { | 352 if (chrome::IsNativeWindowInAsh(widget()->GetNativeWindow())) { |
363 resize_inside_bounds_size = ash::kResizeInsideBoundsSize; | 353 resize_inside_bounds_size = ash::kResizeInsideBoundsSize; |
364 resize_outside_bounds_size = ash::kResizeOutsideBoundsSize; | 354 resize_outside_bounds_size = ash::kResizeOutsideBoundsSize; |
365 resize_outside_scale_for_touch = ash::kResizeOutsideBoundsScaleForTouch; | 355 resize_outside_scale_for_touch = ash::kResizeOutsideBoundsScaleForTouch; |
366 resize_area_corner_size = ash::kResizeAreaCornerSize; | 356 resize_area_corner_size = ash::kResizeAreaCornerSize; |
367 } | 357 } |
368 #endif | 358 #endif |
369 apps::AppWindowFrameView* frame_view = new apps::AppWindowFrameView(this); | 359 apps::AppWindowFrameView* frame_view = new apps::AppWindowFrameView(); |
370 frame_view->Init(widget(), | 360 frame_view->Init(widget(), |
| 361 has_frame_color_, |
371 frame_color_, | 362 frame_color_, |
| 363 GetDraggableRegion(), |
372 resize_inside_bounds_size, | 364 resize_inside_bounds_size, |
373 resize_outside_bounds_size, | 365 resize_outside_bounds_size, |
374 resize_outside_scale_for_touch, | 366 resize_outside_scale_for_touch, |
375 resize_area_corner_size); | 367 resize_area_corner_size); |
376 return frame_view; | 368 return frame_view; |
377 } | 369 } |
378 | 370 |
379 // ui::BaseWindow implementation. | 371 // ui::BaseWindow implementation. |
380 | 372 |
381 ui::WindowShowState ChromeNativeAppWindowViews::GetRestoredState() const { | 373 ui::WindowShowState ChromeNativeAppWindowViews::GetRestoredState() const { |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 // Non-frameless app windows can be put into immersive fullscreen. | 498 // Non-frameless app windows can be put into immersive fullscreen. |
507 immersive_fullscreen_controller_.reset( | 499 immersive_fullscreen_controller_.reset( |
508 new ash::ImmersiveFullscreenController()); | 500 new ash::ImmersiveFullscreenController()); |
509 custom_frame_view->InitImmersiveFullscreenControllerForView( | 501 custom_frame_view->InitImmersiveFullscreenControllerForView( |
510 immersive_fullscreen_controller_.get()); | 502 immersive_fullscreen_controller_.get()); |
511 custom_frame_view->GetHeaderView()->set_context_menu_controller(this); | 503 custom_frame_view->GetHeaderView()->set_context_menu_controller(this); |
512 return custom_frame_view; | 504 return custom_frame_view; |
513 } | 505 } |
514 } | 506 } |
515 #endif | 507 #endif |
516 if (!ShouldUseNativeFrame()) | 508 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 509 return CreateAppWindowFrameView(); |
| 510 #else |
| 511 if (IsFrameless() || has_frame_color_) |
517 return CreateAppWindowFrameView(); | 512 return CreateAppWindowFrameView(); |
| 513 #endif |
518 return views::WidgetDelegateView::CreateNonClientFrameView(widget); | 514 return views::WidgetDelegateView::CreateNonClientFrameView(widget); |
519 } | 515 } |
520 | 516 |
521 bool ChromeNativeAppWindowViews::WidgetHasHitTestMask() const { | 517 bool ChromeNativeAppWindowViews::WidgetHasHitTestMask() const { |
522 return shape_ != NULL; | 518 return shape_ != NULL; |
523 } | 519 } |
524 | 520 |
525 void ChromeNativeAppWindowViews::GetWidgetHitTestMask(gfx::Path* mask) const { | 521 void ChromeNativeAppWindowViews::GetWidgetHitTestMask(gfx::Path* mask) const { |
526 shape_->getBoundaryPath(mask); | 522 shape_->getBoundaryPath(mask); |
527 } | 523 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 } else { | 661 } else { |
666 InitializeDefaultWindow(create_params); | 662 InitializeDefaultWindow(create_params); |
667 } | 663 } |
668 extension_keybinding_registry_.reset(new ExtensionKeybindingRegistryViews( | 664 extension_keybinding_registry_.reset(new ExtensionKeybindingRegistryViews( |
669 Profile::FromBrowserContext(app_window->browser_context()), | 665 Profile::FromBrowserContext(app_window->browser_context()), |
670 widget()->GetFocusManager(), | 666 widget()->GetFocusManager(), |
671 extensions::ExtensionKeybindingRegistry::PLATFORM_APPS_ONLY, | 667 extensions::ExtensionKeybindingRegistry::PLATFORM_APPS_ONLY, |
672 NULL)); | 668 NULL)); |
673 | 669 |
674 #if defined(OS_WIN) | 670 #if defined(OS_WIN) |
675 if (!ShouldUseNativeFrame() && | 671 if ((IsFrameless() || has_frame_color_) && |
676 chrome::GetHostDesktopTypeForNativeWindow(widget()->GetNativeWindow()) != | 672 chrome::GetHostDesktopTypeForNativeWindow(widget()->GetNativeWindow()) != |
677 chrome::HOST_DESKTOP_TYPE_ASH) { | 673 chrome::HOST_DESKTOP_TYPE_ASH) { |
678 InstallEasyResizeTargeterOnContainer(); | 674 InstallEasyResizeTargeterOnContainer(); |
679 } | 675 } |
680 #endif | 676 #endif |
681 } | 677 } |
OLD | NEW |