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

Side by Side Diff: ui/views/widget/widget.cc

Issue 2604793002: Allow Widget to pass accelerator handling to its parent.
Patch Set: Created 3 years, 11 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
OLDNEW
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 "ui/views/widget/widget.h" 5 #include "ui/views/widget/widget.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "base/trace_event/trace_event.h" 11 #include "base/trace_event/trace_event.h"
12 #include "ui/base/cursor/cursor.h" 12 #include "ui/base/cursor/cursor.h"
13 #include "ui/base/default_style.h" 13 #include "ui/base/default_style.h"
14 #include "ui/base/default_theme_provider.h" 14 #include "ui/base/default_theme_provider.h"
15 #include "ui/base/hit_test.h" 15 #include "ui/base/hit_test.h"
16 #include "ui/base/ime/input_method.h" 16 #include "ui/base/ime/input_method.h"
17 #include "ui/base/l10n/l10n_font_util.h" 17 #include "ui/base/l10n/l10n_font_util.h"
18 #include "ui/base/resource/resource_bundle.h" 18 #include "ui/base/resource/resource_bundle.h"
19 #include "ui/compositor/compositor.h" 19 #include "ui/compositor/compositor.h"
20 #include "ui/compositor/layer.h" 20 #include "ui/compositor/layer.h"
21 #include "ui/display/screen.h" 21 #include "ui/display/screen.h"
22 #include "ui/events/event.h" 22 #include "ui/events/event.h"
23 #include "ui/events/event_utils.h" 23 #include "ui/events/event_utils.h"
24 #include "ui/gfx/image/image_skia.h" 24 #include "ui/gfx/image/image_skia.h"
25 #include "ui/views/controls/menu/menu_controller.h" 25 #include "ui/views/controls/menu/menu_controller.h"
26 #include "ui/views/event_monitor.h" 26 #include "ui/views/event_monitor.h"
27 #include "ui/views/focus/focus_manager.h" 27 #include "ui/views/focus/focus_manager.h"
28 #include "ui/views/focus/focus_manager_delegate.h"
28 #include "ui/views/focus/focus_manager_factory.h" 29 #include "ui/views/focus/focus_manager_factory.h"
29 #include "ui/views/focus/view_storage.h" 30 #include "ui/views/focus/view_storage.h"
30 #include "ui/views/focus/widget_focus_manager.h" 31 #include "ui/views/focus/widget_focus_manager.h"
31 #include "ui/views/views_delegate.h" 32 #include "ui/views/views_delegate.h"
32 #include "ui/views/widget/native_widget_private.h" 33 #include "ui/views/widget/native_widget_private.h"
33 #include "ui/views/widget/root_view.h" 34 #include "ui/views/widget/root_view.h"
34 #include "ui/views/widget/tooltip_manager.h" 35 #include "ui/views/widget/tooltip_manager.h"
36 #include "ui/views/widget/widget_accelerator_handling_delegate.h"
35 #include "ui/views/widget/widget_delegate.h" 37 #include "ui/views/widget/widget_delegate.h"
36 #include "ui/views/widget/widget_deletion_observer.h" 38 #include "ui/views/widget/widget_deletion_observer.h"
37 #include "ui/views/widget/widget_observer.h" 39 #include "ui/views/widget/widget_observer.h"
38 #include "ui/views/widget/widget_removals_observer.h" 40 #include "ui/views/widget/widget_removals_observer.h"
39 #include "ui/views/window/custom_frame_view.h" 41 #include "ui/views/window/custom_frame_view.h"
40 #include "ui/views/window/dialog_delegate.h" 42 #include "ui/views/window/dialog_delegate.h"
41 43
42 namespace views { 44 namespace views {
43 45
44 namespace { 46 namespace {
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 widget_delegate_->set_can_activate(can_activate); 331 widget_delegate_->set_can_activate(can_activate);
330 332
331 ownership_ = params.ownership; 333 ownership_ = params.ownership;
332 native_widget_ = CreateNativeWidget(params, this)->AsNativeWidgetPrivate(); 334 native_widget_ = CreateNativeWidget(params, this)->AsNativeWidgetPrivate();
333 root_view_.reset(CreateRootView()); 335 root_view_.reset(CreateRootView());
334 default_theme_provider_.reset(new ui::DefaultThemeProvider); 336 default_theme_provider_.reset(new ui::DefaultThemeProvider);
335 if (params.type == InitParams::TYPE_MENU) { 337 if (params.type == InitParams::TYPE_MENU) {
336 is_mouse_button_pressed_ = 338 is_mouse_button_pressed_ =
337 internal::NativeWidgetPrivate::IsMouseButtonDown(); 339 internal::NativeWidgetPrivate::IsMouseButtonDown();
338 } 340 }
341 if (params.parent && params.pass_accelerator_to_parent) {
342 if (Widget* parent_widget = Widget::GetWidgetForNativeView(params.parent)) {
343 accelerator_handling_delegate_.reset(
344 new WidgetAcceleratorHandlingDelegate(parent_widget));
345 }
346 }
339 native_widget_->InitNativeWidget(params); 347 native_widget_->InitNativeWidget(params);
340 if (RequiresNonClientView(params.type)) { 348 if (RequiresNonClientView(params.type)) {
341 non_client_view_ = new NonClientView; 349 non_client_view_ = new NonClientView;
342 non_client_view_->SetFrameView(CreateNonClientFrameView()); 350 non_client_view_->SetFrameView(CreateNonClientFrameView());
343 // Create the ClientView, add it to the NonClientView and add the 351 // Create the ClientView, add it to the NonClientView and add the
344 // NonClientView to the RootView. This will cause everything to be parented. 352 // NonClientView to the RootView. This will cause everything to be parented.
345 non_client_view_->set_client_view(widget_delegate_->CreateClientView(this)); 353 non_client_view_->set_client_view(widget_delegate_->CreateClientView(this));
346 non_client_view_->SetOverlayView(widget_delegate_->CreateOverlayView()); 354 non_client_view_->SetOverlayView(widget_delegate_->CreateOverlayView());
347 SetContentsView(non_client_view_); 355 SetContentsView(non_client_view_);
348 // Initialize the window's icon and title before setting the window's 356 // Initialize the window's icon and title before setting the window's
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 } 410 }
403 411
404 bool Widget::HasRemovalsObserver(const WidgetRemovalsObserver* observer) const { 412 bool Widget::HasRemovalsObserver(const WidgetRemovalsObserver* observer) const {
405 return removals_observers_.HasObserver(observer); 413 return removals_observers_.HasObserver(observer);
406 } 414 }
407 415
408 bool Widget::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) const { 416 bool Widget::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) const {
409 return false; 417 return false;
410 } 418 }
411 419
420 bool Widget::CanHandleAccelerators() const {
421 return (handle_accelerators_override_count_ != 0) || IsActive();
422 }
423
424 void Widget::AddHandleAcceleratorsOverride() {
425 ++handle_accelerators_override_count_;
426 }
427
428 void Widget::RemoveHandleAcceleratorsOverride() {
429 --handle_accelerators_override_count_;
430 }
431
412 void Widget::ViewHierarchyChanged( 432 void Widget::ViewHierarchyChanged(
413 const View::ViewHierarchyChangedDetails& details) { 433 const View::ViewHierarchyChangedDetails& details) {
414 if (!details.is_add) { 434 if (!details.is_add) {
415 if (details.child == dragged_view_) 435 if (details.child == dragged_view_)
416 dragged_view_ = NULL; 436 dragged_view_ = NULL;
417 FocusManager* focus_manager = GetFocusManager(); 437 FocusManager* focus_manager = GetFocusManager();
418 if (focus_manager) 438 if (focus_manager)
419 focus_manager->ViewRemoved(details.child); 439 focus_manager->ViewRemoved(details.child);
420 ViewStorage::GetInstance()->ViewRemoved(details.child); 440 ViewStorage::GetInstance()->ViewRemoved(details.child);
421 native_widget_->ViewRemoved(details.child); 441 native_widget_->ViewRemoved(details.child);
(...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 View* root = GetRootView(); 1064 View* root = GetRootView();
1045 if (root) 1065 if (root)
1046 root->PropagateVisibilityNotifications(root, visible); 1066 root->PropagateVisibilityNotifications(root, visible);
1047 for (WidgetObserver& observer : observers_) 1067 for (WidgetObserver& observer : observers_)
1048 observer.OnWidgetVisibilityChanged(this, visible); 1068 observer.OnWidgetVisibilityChanged(this, visible);
1049 if (GetCompositor() && root && root->layer()) 1069 if (GetCompositor() && root && root->layer())
1050 root->layer()->SetVisible(visible); 1070 root->layer()->SetVisible(visible);
1051 } 1071 }
1052 1072
1053 void Widget::OnNativeWidgetCreated(bool desktop_widget) { 1073 void Widget::OnNativeWidgetCreated(bool desktop_widget) {
1054 if (is_top_level()) 1074 if (is_top_level()) {
1055 focus_manager_.reset(FocusManagerFactory::Create(this, desktop_widget)); 1075 if (accelerator_handling_delegate_) {
1076 focus_manager_.reset(new FocusManager(
1077 this, accelerator_handling_delegate_->CreateFocusManagerDelegate()
1078 .release()));
1079 } else {
1080 focus_manager_.reset(FocusManagerFactory::Create(this, desktop_widget));
1081 }
1082 }
1056 1083
1057 native_widget_->InitModalType(widget_delegate_->GetModalType()); 1084 native_widget_->InitModalType(widget_delegate_->GetModalType());
1058 1085
1059 for (WidgetObserver& observer : observers_) 1086 for (WidgetObserver& observer : observers_)
1060 observer.OnWidgetCreated(this); 1087 observer.OnWidgetCreated(this);
1061 } 1088 }
1062 1089
1063 void Widget::OnNativeWidgetDestroying() { 1090 void Widget::OnNativeWidgetDestroying() {
1064 // Tell the focus manager (if any) that root_view is being removed 1091 // Tell the focus manager (if any) that root_view is being removed
1065 // in case that the focused view is under this root view. 1092 // in case that the focused view is under this root view.
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 1517
1491 //////////////////////////////////////////////////////////////////////////////// 1518 ////////////////////////////////////////////////////////////////////////////////
1492 // internal::NativeWidgetPrivate, NativeWidget implementation: 1519 // internal::NativeWidgetPrivate, NativeWidget implementation:
1493 1520
1494 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { 1521 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() {
1495 return this; 1522 return this;
1496 } 1523 }
1497 1524
1498 } // namespace internal 1525 } // namespace internal
1499 } // namespace views 1526 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698