diff options
author | wez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-21 18:00:32 +0000 |
---|---|---|
committer | wez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-21 18:00:32 +0000 |
commit | 79f06c737237ce41274a3e528a500c9a7fb48ae3 (patch) | |
tree | 16c6291a61b658c15ecda8fff6e8e4c701c119fc /ui | |
parent | ec77efa8699c028cc8a1712c75b68be28833b3bf (diff) | |
download | chromium_src-79f06c737237ce41274a3e528a500c9a7fb48ae3.zip chromium_src-79f06c737237ce41274a3e528a500c9a7fb48ae3.tar.gz chromium_src-79f06c737237ce41274a3e528a500c9a7fb48ae3.tar.bz2 |
Revert 110949 - views: Move widget/ directory to ui/views.
BUG=104039
R=ben@chromium.org
Review URL: http://codereview.chromium.org/8598031
TBR=tfarina@chromium.org
Review URL: http://codereview.chromium.org/8547015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110953 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
112 files changed, 90 insertions, 14426 deletions
diff --git a/ui/aura_shell/default_container_layout_manager.cc b/ui/aura_shell/default_container_layout_manager.cc index 6e80d49..8deb9fb 100644 --- a/ui/aura_shell/default_container_layout_manager.cc +++ b/ui/aura_shell/default_container_layout_manager.cc @@ -7,17 +7,17 @@ #include "ui/aura/client/aura_constants.h" #include "ui/aura/desktop.h" #include "ui/aura/event.h" -#include "ui/aura/screen_aura.h" #include "ui/aura/window.h" -#include "ui/aura/window_observer.h" +#include "ui/aura/screen_aura.h" #include "ui/aura/window_types.h" +#include "ui/aura/window_observer.h" #include "ui/aura_shell/property_util.h" #include "ui/aura_shell/show_state_controller.h" #include "ui/aura_shell/workspace/workspace.h" #include "ui/aura_shell/workspace/workspace_manager.h" #include "ui/base/ui_base_types.h" #include "ui/gfx/rect.h" -#include "ui/views/widget/native_widget_aura.h" +#include "views/widget/native_widget_aura.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/default_container_layout_manager_unittest.cc b/ui/aura_shell/default_container_layout_manager_unittest.cc index 73c22f0..9d6ec24 100644 --- a/ui/aura_shell/default_container_layout_manager_unittest.cc +++ b/ui/aura_shell/default_container_layout_manager_unittest.cc @@ -12,11 +12,11 @@ #include "ui/aura/screen_aura.h" #include "ui/aura/test/aura_test_base.h" #include "ui/aura/window.h" +#include "ui/aura_shell/workspace_controller.h" #include "ui/aura_shell/workspace/workspace.h" #include "ui/aura_shell/workspace/workspace_manager.h" -#include "ui/aura_shell/workspace_controller.h" #include "ui/base/ui_base_types.h" -#include "ui/views/widget/native_widget_aura.h" +#include "views/widget/native_widget_aura.h" namespace aura_shell { namespace test { diff --git a/ui/aura_shell/desktop_background_view.cc b/ui/aura_shell/desktop_background_view.cc index 3f26f36..9b5ce7e 100644 --- a/ui/aura_shell/desktop_background_view.cc +++ b/ui/aura_shell/desktop_background_view.cc @@ -12,7 +12,7 @@ #include "ui/aura_shell/shell_window_ids.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/desktop_background_view.h b/ui/aura_shell/desktop_background_view.h index 25b61f8..09020ae 100644 --- a/ui/aura_shell/desktop_background_view.h +++ b/ui/aura_shell/desktop_background_view.h @@ -6,9 +6,9 @@ #define UI_AURA_SHELL_DESKTOP_BACKGROUND_VIEW_H_ #pragma once -#include "third_party/skia/include/core/SkBitmap.h" -#include "ui/views/widget/widget_delegate.h" #include "views/view.h" +#include "views/widget/widget_delegate.h" +#include "third_party/skia/include/core/SkBitmap.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/desktop_layout_manager.cc b/ui/aura_shell/desktop_layout_manager.cc index d36b217..4160a43 100644 --- a/ui/aura_shell/desktop_layout_manager.cc +++ b/ui/aura_shell/desktop_layout_manager.cc @@ -4,9 +4,9 @@ #include "ui/aura_shell/desktop_layout_manager.h" -#include "ui/aura/window.h" #include "ui/aura_shell/shelf_layout_controller.h" -#include "ui/views/widget/widget.h" +#include "ui/aura/window.h" +#include "views/widget/widget.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/drag_drop_controller.cc b/ui/aura_shell/drag_drop_controller.cc index 1de646a..b5977de 100644 --- a/ui/aura_shell/drag_drop_controller.cc +++ b/ui/aura_shell/drag_drop_controller.cc @@ -15,7 +15,7 @@ #include "ui/base/dragdrop/os_exchange_data_provider_aura.h" #include "ui/gfx/point.h" #include "ui/gfx/rect.h" -#include "ui/views/widget/native_widget_aura.h" +#include "views/widget/native_widget_aura.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/drag_drop_controller_unittest.cc b/ui/aura_shell/drag_drop_controller_unittest.cc index c5a2142..36d3170 100644 --- a/ui/aura_shell/drag_drop_controller_unittest.cc +++ b/ui/aura_shell/drag_drop_controller_unittest.cc @@ -14,8 +14,8 @@ #include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/dragdrop/os_exchange_data.h" #include "ui/views/events/event.h" -#include "ui/views/widget/widget.h" #include "views/view.h" +#include "views/widget/widget.h" namespace aura_shell { namespace test { diff --git a/ui/aura_shell/drag_image_view.cc b/ui/aura_shell/drag_image_view.cc index afc4ca7..db807f0 100644 --- a/ui/aura_shell/drag_image_view.cc +++ b/ui/aura_shell/drag_image_view.cc @@ -4,7 +4,7 @@ #include "ui/aura_shell/drag_image_view.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/examples/bubble.cc b/ui/aura_shell/examples/bubble.cc index 2bfcd6b..03cdfc1 100644 --- a/ui/aura_shell/examples/bubble.cc +++ b/ui/aura_shell/examples/bubble.cc @@ -6,8 +6,8 @@ #include "ui/views/bubble/bubble_border.h" #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/layout/fill_layout.h" -#include "ui/views/widget/widget.h" #include "views/controls/label.h" +#include "views/widget/widget.h" namespace aura_shell { namespace examples { diff --git a/ui/aura_shell/examples/lock_view.cc b/ui/aura_shell/examples/lock_view.cc index 68bb333..3283a2d 100644 --- a/ui/aura_shell/examples/lock_view.cc +++ b/ui/aura_shell/examples/lock_view.cc @@ -10,8 +10,8 @@ #include "ui/aura_shell/shell_window_ids.h" #include "ui/gfx/canvas.h" #include "ui/gfx/font.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" +#include "views/widget/widget.h" +#include "views/widget/widget_delegate.h" namespace aura_shell { namespace examples { diff --git a/ui/aura_shell/examples/toplevel_window.cc b/ui/aura_shell/examples/toplevel_window.cc index f823c77..57dda48 100644 --- a/ui/aura_shell/examples/toplevel_window.cc +++ b/ui/aura_shell/examples/toplevel_window.cc @@ -8,7 +8,7 @@ #include "ui/aura/window.h" #include "ui/aura_shell/toplevel_frame_view.h" #include "ui/gfx/canvas.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace aura_shell { namespace examples { diff --git a/ui/aura_shell/examples/toplevel_window.h b/ui/aura_shell/examples/toplevel_window.h index b3fbd55..49757ce 100644 --- a/ui/aura_shell/examples/toplevel_window.h +++ b/ui/aura_shell/examples/toplevel_window.h @@ -6,7 +6,7 @@ #define UI_AURA_SHELL_EXAMPLES_TOPLEVEL_WINDOW_H_ #pragma once -#include "ui/views/widget/widget_delegate.h" +#include "views/widget/widget_delegate.h" namespace aura_shell { namespace examples { diff --git a/ui/aura_shell/examples/widgets.cc b/ui/aura_shell/examples/widgets.cc index 202c3b9..3aef092 100644 --- a/ui/aura_shell/examples/widgets.cc +++ b/ui/aura_shell/examples/widgets.cc @@ -6,11 +6,11 @@ #include "ui/aura/window.h" #include "ui/aura_shell/toplevel_frame_view.h" #include "ui/gfx/canvas.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" #include "views/controls/button/checkbox.h" #include "views/controls/button/radio_button.h" #include "views/controls/button/text_button.h" +#include "views/widget/widget.h" +#include "views/widget/widget_delegate.h" namespace { diff --git a/ui/aura_shell/examples/window_type_launcher.cc b/ui/aura_shell/examples/window_type_launcher.cc index 6da51be..00c6f57 100644 --- a/ui/aura_shell/examples/window_type_launcher.cc +++ b/ui/aura_shell/examples/window_type_launcher.cc @@ -13,10 +13,10 @@ #include "ui/aura_shell/toplevel_frame_view.h" #include "ui/gfx/canvas.h" #include "ui/gfx/compositor/layer.h" -#include "ui/views/widget/widget.h" #include "views/controls/button/text_button.h" #include "views/controls/menu/menu_item_view.h" #include "views/controls/menu/menu_runner.h" +#include "views/widget/widget.h" using views::MenuItemView; using views::MenuRunner; diff --git a/ui/aura_shell/examples/window_type_launcher.h b/ui/aura_shell/examples/window_type_launcher.h index a18349b..0644513 100644 --- a/ui/aura_shell/examples/window_type_launcher.h +++ b/ui/aura_shell/examples/window_type_launcher.h @@ -6,10 +6,10 @@ #define UI_AURA_SHELL_EXAMPLES_WINDOW_TYPE_LAUNCHER_H_ #pragma once -#include "ui/views/widget/widget_delegate.h" #include "views/context_menu_controller.h" #include "views/controls/button/button.h" #include "views/controls/menu/menu_delegate.h" +#include "views/widget/widget_delegate.h" namespace views { class MenuRunner; diff --git a/ui/aura_shell/launcher/launcher.cc b/ui/aura_shell/launcher/launcher.cc index 64a6c88..1adde4c 100644 --- a/ui/aura_shell/launcher/launcher.cc +++ b/ui/aura_shell/launcher/launcher.cc @@ -11,7 +11,7 @@ #include "ui/aura_shell/shell_delegate.h" #include "ui/aura_shell/shell_window_ids.h" #include "ui/gfx/compositor/layer.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace aura_shell { diff --git a/ui/aura_shell/launcher/launcher_view.cc b/ui/aura_shell/launcher/launcher_view.cc index d9db9f4..b6fb445 100644 --- a/ui/aura_shell/launcher/launcher_view.cc +++ b/ui/aura_shell/launcher/launcher_view.cc @@ -21,10 +21,10 @@ #include "ui/gfx/compositor/layer.h" #include "ui/gfx/image/image.h" #include "ui/views/animation/bounds_animator.h" -#include "ui/views/widget/widget.h" #include "views/controls/button/image_button.h" #include "views/controls/menu/menu_model_adapter.h" #include "views/controls/menu/menu_runner.h" +#include "views/widget/widget.h" using ui::Animation; using views::View; diff --git a/ui/aura_shell/launcher/launcher_view.h b/ui/aura_shell/launcher/launcher_view.h index c4279aa0..a2f63b3 100644 --- a/ui/aura_shell/launcher/launcher_view.h +++ b/ui/aura_shell/launcher/launcher_view.h @@ -10,8 +10,8 @@ #include "ui/aura_shell/launcher/launcher_button_host.h" #include "ui/aura_shell/launcher/launcher_model_observer.h" -#include "ui/views/widget/widget_delegate.h" #include "views/controls/button/button.h" +#include "views/widget/widget_delegate.h" namespace views { class BoundsAnimator; diff --git a/ui/aura_shell/modal_container_layout_manager.cc b/ui/aura_shell/modal_container_layout_manager.cc index 7c6463c..4a42db2 100644 --- a/ui/aura_shell/modal_container_layout_manager.cc +++ b/ui/aura_shell/modal_container_layout_manager.cc @@ -15,8 +15,8 @@ #include "ui/gfx/canvas.h" #include "ui/gfx/compositor/layer.h" #include "ui/gfx/compositor/layer_animator.h" -#include "ui/views/widget/widget.h" #include "views/view.h" +#include "views/widget/widget.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/modal_container_layout_manager_unittest.cc b/ui/aura_shell/modal_container_layout_manager_unittest.cc index aad19c6..0baf9d3 100644 --- a/ui/aura_shell/modal_container_layout_manager_unittest.cc +++ b/ui/aura_shell/modal_container_layout_manager_unittest.cc @@ -11,8 +11,8 @@ #include "ui/aura_shell/shell.h" #include "ui/aura_shell/shell_window_ids.h" #include "ui/aura_shell/test/aura_shell_test_base.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" +#include "views/widget/widget.h" +#include "views/widget/widget_delegate.h" namespace aura_shell { namespace test { diff --git a/ui/aura_shell/shelf_layout_controller.cc b/ui/aura_shell/shelf_layout_controller.cc index 7e7f851..9e8d01a 100644 --- a/ui/aura_shell/shelf_layout_controller.cc +++ b/ui/aura_shell/shelf_layout_controller.cc @@ -8,7 +8,7 @@ #include "ui/aura/screen_aura.h" #include "ui/gfx/compositor/layer.h" #include "ui/gfx/compositor/layer_animator.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/shell.cc b/ui/aura_shell/shell.cc index 3f1bd03..b439de1 100644 --- a/ui/aura_shell/shell.cc +++ b/ui/aura_shell/shell.cc @@ -29,8 +29,8 @@ #include "ui/aura_shell/workspace_controller.h" #include "ui/gfx/compositor/layer.h" #include "ui/gfx/compositor/layer_animator.h" -#include "ui/views/widget/native_widget_aura.h" -#include "ui/views/widget/widget.h" +#include "views/widget/native_widget_aura.h" +#include "views/widget/widget.h" namespace aura_shell { diff --git a/ui/aura_shell/shell_unittest.cc b/ui/aura_shell/shell_unittest.cc index 9fecd88..a9a18e2 100644 --- a/ui/aura_shell/shell_unittest.cc +++ b/ui/aura_shell/shell_unittest.cc @@ -7,7 +7,7 @@ #include "ui/aura_shell/shell.h" #include "ui/aura_shell/shell_window_ids.h" #include "ui/aura_shell/test/aura_shell_test_base.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace aura_shell { namespace test { diff --git a/ui/aura_shell/status_area_view.cc b/ui/aura_shell/status_area_view.cc index 94d73ab..1746ba7 100644 --- a/ui/aura_shell/status_area_view.cc +++ b/ui/aura_shell/status_area_view.cc @@ -12,7 +12,7 @@ #include "ui/aura_shell/shell_window_ids.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/status_area_view.h b/ui/aura_shell/status_area_view.h index 1d07b15..68d0799 100644 --- a/ui/aura_shell/status_area_view.h +++ b/ui/aura_shell/status_area_view.h @@ -7,7 +7,7 @@ #pragma once #include "third_party/skia/include/core/SkBitmap.h" -#include "ui/views/widget/widget_delegate.h" +#include "views/widget/widget_delegate.h" namespace aura_shell { namespace internal { diff --git a/ui/aura_shell/toplevel_frame_view.cc b/ui/aura_shell/toplevel_frame_view.cc index ab891a6..f707675 100644 --- a/ui/aura_shell/toplevel_frame_view.cc +++ b/ui/aura_shell/toplevel_frame_view.cc @@ -10,9 +10,9 @@ #include "ui/base/hit_test.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" #include "views/controls/button/custom_button.h" +#include "views/widget/widget.h" +#include "views/widget/widget_delegate.h" namespace aura_shell { namespace internal { diff --git a/ui/base/ui_export.h b/ui/base/ui_export.h index f60b91c..c54de1f 100644 --- a/ui/base/ui_export.h +++ b/ui/base/ui_export.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_BASE_UI_EXPORT_H_ -#define UI_BASE_UI_EXPORT_H_ +#ifndef UI_UI_EXPORT_H_ +#define UI_UI_EXPORT_H_ #pragma once // Defines UI_EXPORT so that functionality implemented by the UI module can be @@ -26,4 +26,4 @@ #define UI_EXPORT #endif -#endif // UI_BASE_UI_EXPORT_H_ +#endif // UI_UI_EXPORT_H_ diff --git a/ui/views/accessibility/native_view_accessibility_win.cc b/ui/views/accessibility/native_view_accessibility_win.cc index 75d8655..45490e5 100644 --- a/ui/views/accessibility/native_view_accessibility_win.cc +++ b/ui/views/accessibility/native_view_accessibility_win.cc @@ -14,8 +14,8 @@ #include "ui/base/accessibility/accessible_view_state.h" #include "ui/base/view_prop.h" #include "ui/base/win/atl_module.h" -#include "ui/views/widget/native_widget_win.h" -#include "ui/views/widget/widget.h" +#include "views/widget/native_widget_win.h" +#include "views/widget/widget.h" using ui::AccessibilityTypes; diff --git a/ui/views/bubble/bubble_delegate.cc b/ui/views/bubble/bubble_delegate.cc index 32124b2..bffe755 100644 --- a/ui/views/bubble/bubble_delegate.cc +++ b/ui/views/bubble/bubble_delegate.cc @@ -6,7 +6,7 @@ #include "ui/base/animation/slide_animation.h" #include "ui/views/bubble/bubble_frame_view.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" // The duration of the fade animation in milliseconds. static const int kHideFadeDurationMS = 200; diff --git a/ui/views/bubble/bubble_delegate.h b/ui/views/bubble/bubble_delegate.h index ddf9785..b31c77d 100644 --- a/ui/views/bubble/bubble_delegate.h +++ b/ui/views/bubble/bubble_delegate.h @@ -9,8 +9,8 @@ #include "base/gtest_prod_util.h" #include "ui/base/animation/animation_delegate.h" #include "ui/views/bubble/bubble_border.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" +#include "views/widget/widget.h" +#include "views/widget/widget_delegate.h" namespace ui { class SlideAnimation; diff --git a/ui/views/bubble/bubble_delegate_unittest.cc b/ui/views/bubble/bubble_delegate_unittest.cc index 7cfda58..6e61b5e 100644 --- a/ui/views/bubble/bubble_delegate_unittest.cc +++ b/ui/views/bubble/bubble_delegate_unittest.cc @@ -5,7 +5,7 @@ #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/test/views_test_base.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index 11d1b20..cc35496 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc @@ -9,8 +9,8 @@ #include "ui/views/bubble/border_contents_view.h" #include "ui/views/bubble/bubble_border.h" #include "ui/views/layout/fill_layout.h" -#include "ui/views/widget/widget.h" #include "ui/views/window/client_view.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc index 088fde2..bde9f7c 100644 --- a/ui/views/bubble/bubble_frame_view_unittest.cc +++ b/ui/views/bubble/bubble_frame_view_unittest.cc @@ -8,7 +8,7 @@ #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/test/views_test_base.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/events/event.cc b/ui/views/events/event.cc index 3d1ebb8..433098e 100644 --- a/ui/views/events/event.cc +++ b/ui/views/events/event.cc @@ -6,8 +6,8 @@ #include "base/logging.h" #include "ui/base/keycodes/keyboard_code_conversion.h" -#include "ui/views/widget/root_view.h" #include "views/view.h" +#include "views/widget/root_view.h" namespace views { diff --git a/ui/views/events/event_x.cc b/ui/views/events/event_x.cc index a50cc85..48e7bea 100644 --- a/ui/views/events/event_x.cc +++ b/ui/views/events/event_x.cc @@ -15,7 +15,7 @@ #include "ui/base/keycodes/keyboard_code_conversion.h" #include "ui/base/keycodes/keyboard_code_conversion_x.h" #include "ui/base/touch/touch_factory.h" -#include "ui/views/widget/root_view.h" +#include "views/widget/root_view.h" namespace views { diff --git a/ui/views/examples/bubble_example.cc b/ui/views/examples/bubble_example.cc index 8f591e1..70b4357 100644 --- a/ui/views/examples/bubble_example.cc +++ b/ui/views/examples/bubble_example.cc @@ -8,9 +8,9 @@ #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" -#include "ui/views/widget/widget.h" #include "views/controls/button/text_button.h" #include "views/controls/label.h" +#include "views/widget/widget.h" namespace examples { diff --git a/ui/views/examples/examples_main.cc b/ui/views/examples/examples_main.cc index f687d28..819e6f0 100644 --- a/ui/views/examples/examples_main.cc +++ b/ui/views/examples/examples_main.cc @@ -34,10 +34,10 @@ #include "ui/views/focus/accelerator_handler.h" #include "ui/views/layout/grid_layout.h" #include "ui/views/test/test_views_delegate.h" -#include "ui/views/widget/widget.h" #include "views/controls/button/text_button.h" #include "views/controls/label.h" #include "views/controls/tabbed_pane/tabbed_pane.h" +#include "views/widget/widget.h" #if defined(OS_WIN) // TableView is not yet ported to Linux. diff --git a/ui/views/examples/examples_main.h b/ui/views/examples/examples_main.h index a1f4d87..a4278937 100644 --- a/ui/views/examples/examples_main.h +++ b/ui/views/examples/examples_main.h @@ -11,7 +11,7 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" -#include "ui/views/widget/widget_delegate.h" +#include "views/widget/widget_delegate.h" namespace views { class Label; diff --git a/ui/views/examples/native_widget_views_example.cc b/ui/views/examples/native_widget_views_example.cc index c071e83..72cdab7 100644 --- a/ui/views/examples/native_widget_views_example.cc +++ b/ui/views/examples/native_widget_views_example.cc @@ -8,9 +8,10 @@ #include "ui/gfx/canvas.h" #include "ui/views/examples/example_base.h" #include "ui/views/test/test_views_delegate.h" -#include "ui/views/widget/widget.h" #include "views/controls/button/text_button.h" #include "views/view.h" +#include "views/widget/native_widget_views.h" +#include "views/widget/widget.h" namespace examples { diff --git a/ui/views/examples/widget_example.cc b/ui/views/examples/widget_example.cc index 0aea09a..e1d542e 100644 --- a/ui/views/examples/widget_example.cc +++ b/ui/views/examples/widget_example.cc @@ -7,9 +7,9 @@ #include "base/utf_string_conversions.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/layout_manager.h" -#include "ui/views/widget/widget.h" #include "views/controls/button/text_button.h" #include "views/view.h" +#include "views/widget/widget.h" namespace { diff --git a/ui/views/examples/widget_example.h b/ui/views/examples/widget_example.h index 4011c48..ab802e3 100644 --- a/ui/views/examples/widget_example.h +++ b/ui/views/examples/widget_example.h @@ -11,8 +11,8 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "ui/views/examples/example_base.h" -#include "ui/views/widget/widget.h" #include "views/controls/button/text_button.h" +#include "views/widget/widget.h" namespace examples { diff --git a/ui/views/focus/accelerator_handler_gtk_unittest.cc b/ui/views/focus/accelerator_handler_gtk_unittest.cc index f52a256..f549b9c 100644 --- a/ui/views/focus/accelerator_handler_gtk_unittest.cc +++ b/ui/views/focus/accelerator_handler_gtk_unittest.cc @@ -9,9 +9,9 @@ #include "ui/gfx/rect.h" #include "ui/views/focus/accelerator_handler.h" #include "ui/views/focus/focus_manager.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" #include "views/view.h" +#include "views/widget/widget.h" +#include "views/widget/widget_delegate.h" namespace views { diff --git a/ui/views/focus/accelerator_handler_win.cc b/ui/views/focus/accelerator_handler_win.cc index 13c3081..f923cd0 100644 --- a/ui/views/focus/accelerator_handler_win.cc +++ b/ui/views/focus/accelerator_handler_win.cc @@ -8,7 +8,7 @@ #include "ui/base/keycodes/keyboard_codes.h" #include "ui/views/events/event.h" #include "ui/views/focus/focus_manager.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/focus/focus_manager.cc b/ui/views/focus/focus_manager.cc index 1c98a12..268623b 100644 --- a/ui/views/focus/focus_manager.cc +++ b/ui/views/focus/focus_manager.cc @@ -15,9 +15,9 @@ #include "ui/views/focus/focus_search.h" #include "ui/views/focus/view_storage.h" #include "ui/views/focus/widget_focus_manager.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/widget.h" #include "views/view.h" +#include "views/widget/root_view.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc index 46c629a..a0420e9 100644 --- a/ui/views/focus/focus_manager_unittest.cc +++ b/ui/views/focus/focus_manager_unittest.cc @@ -14,9 +14,6 @@ #include "ui/views/focus/accelerator_handler.h" #include "ui/views/focus/focus_manager_factory.h" #include "ui/views/test/views_test_base.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" #include "ui/views/window/non_client_view.h" #include "views/background.h" #include "views/border.h" @@ -31,6 +28,9 @@ #include "views/controls/tabbed_pane/native_tabbed_pane_wrapper.h" #include "views/controls/tabbed_pane/tabbed_pane.h" #include "views/controls/textfield/textfield.h" +#include "views/widget/root_view.h" +#include "views/widget/widget.h" +#include "views/widget/widget_delegate.h" #if defined(OS_LINUX) #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" diff --git a/ui/views/ime/input_method_base.cc b/ui/views/ime/input_method_base.cc index cb9573c..4b53ff5 100644 --- a/ui/views/ime/input_method_base.cc +++ b/ui/views/ime/input_method_base.cc @@ -5,8 +5,8 @@ #include "ui/base/ime/text_input_client.h" #include "ui/views/ime/input_method_base.h" #include "ui/views/ime/text_input_type_tracker.h" -#include "ui/views/widget/widget.h" #include "views/view.h" +#include "views/widget/widget.h" #include "base/logging.h" diff --git a/ui/views/ime/input_method_gtk.cc b/ui/views/ime/input_method_gtk.cc index 8b8c97a..9de362b 100644 --- a/ui/views/ime/input_method_gtk.cc +++ b/ui/views/ime/input_method_gtk.cc @@ -20,7 +20,7 @@ #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" #include "ui/base/keycodes/keyboard_codes.h" #include "ui/views/events/event.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/ime/input_method_ibus.cc b/ui/views/ime/input_method_ibus.cc index f9ffe6c..82b1455 100644 --- a/ui/views/ime/input_method_ibus.cc +++ b/ui/views/ime/input_method_ibus.cc @@ -26,7 +26,7 @@ #include "ui/gfx/point.h" #include "ui/gfx/rect.h" #include "ui/views/events/event.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" #if defined(USE_AURA) || defined(TOUCH_UI) #include "ui/base/keycodes/keyboard_code_conversion_x.h" diff --git a/ui/views/ime/input_method_win.h b/ui/views/ime/input_method_win.h index 5a34673..6c4455f 100644 --- a/ui/views/ime/input_method_win.h +++ b/ui/views/ime/input_method_win.h @@ -14,8 +14,8 @@ #include "base/compiler_specific.h" #include "ui/base/win/ime_input.h" #include "ui/views/ime/input_method_base.h" -#include "ui/views/widget/widget.h" #include "views/view.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/ime/mock_input_method.cc b/ui/views/ime/mock_input_method.cc index af5bb18..8365f74 100644 --- a/ui/views/ime/mock_input_method.cc +++ b/ui/views/ime/mock_input_method.cc @@ -9,7 +9,7 @@ #include "ui/base/ime/text_input_client.h" #include "ui/base/keycodes/keyboard_codes.h" #include "ui/views/events/event.h" -#include "ui/views/widget/widget.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/touchui/gesture_manager.cc b/ui/views/touchui/gesture_manager.cc index ef80d8a..51b2c79 100644 --- a/ui/views/touchui/gesture_manager.cc +++ b/ui/views/touchui/gesture_manager.cc @@ -10,9 +10,8 @@ #include "base/logging.h" #include "ui/views/events/event.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget.h" #include "views/view.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/touchui/touch_selection_controller_impl.cc b/ui/views/touchui/touch_selection_controller_impl.cc index d297fa7..30f94cc 100644 --- a/ui/views/touchui/touch_selection_controller_impl.cc +++ b/ui/views/touchui/touch_selection_controller_impl.cc @@ -18,13 +18,13 @@ #include "ui/gfx/size.h" #include "ui/gfx/transform.h" #include "ui/views/layout/box_layout.h" -#include "ui/views/widget/widget.h" #include "views/background.h" #include "views/controls/button/button.h" #include "views/controls/button/custom_button.h" #include "views/controls/button/text_button.h" #include "views/controls/label.h" #include "views/controls/menu/menu_config.h" +#include "views/widget/widget.h" namespace { diff --git a/ui/views/touchui/touch_selection_controller_impl.h b/ui/views/touchui/touch_selection_controller_impl.h index 9f604b0..494482e 100644 --- a/ui/views/touchui/touch_selection_controller_impl.h +++ b/ui/views/touchui/touch_selection_controller_impl.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_VIEWS_TOUCHUI_TOUCH_SELECTION_CONTROLLER_IMPL_H_ -#define UI_VIEWS_TOUCHUI_TOUCH_SELECTION_CONTROLLER_IMPL_H_ +#ifndef UI_UI_VIEWS_TOUCHUI_TOUCH_SELECTION_CONTROLLER_IMPL_H_ +#define UI_UI_VIEWS_TOUCHUI_TOUCH_SELECTION_CONTROLLER_IMPL_H_ #pragma once #include "base/timer.h" @@ -82,4 +82,4 @@ class VIEWS_EXPORT TouchSelectionControllerImpl } // namespace views -#endif // UI_VIEWS_TOUCHUI_TOUCH_SELECTION_CONTROLLER_IMPL_H_ +#endif // UI_UI_VIEWS_TOUCHUI_TOUCH_SELECTION_CONTROLLER_IMPL_H_ diff --git a/ui/views/touchui/touch_selection_controller_impl_unittest.cc b/ui/views/touchui/touch_selection_controller_impl_unittest.cc index 64c9ab1..62fc00f 100644 --- a/ui/views/touchui/touch_selection_controller_impl_unittest.cc +++ b/ui/views/touchui/touch_selection_controller_impl_unittest.cc @@ -9,9 +9,9 @@ #include "ui/views/test/views_test_base.h" #include "ui/views/touchui/touch_selection_controller.h" #include "ui/views/touchui/touch_selection_controller_impl.h" -#include "ui/views/widget/widget.h" #include "views/controls/textfield/native_textfield_views.h" #include "views/controls/textfield/textfield.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/widget/aero_tooltip_manager.cc b/ui/views/widget/aero_tooltip_manager.cc deleted file mode 100644 index daac357..0000000 --- a/ui/views/widget/aero_tooltip_manager.cc +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/aero_tooltip_manager.h" - -#include <windows.h> -#include <commctrl.h> -#include <shlobj.h> - -#include "base/bind.h" -#include "base/message_loop.h" -#include "ui/base/l10n/l10n_util_win.h" -#include "ui/base/win/hwnd_util.h" -#include "ui/gfx/point.h" - -namespace views { - -/////////////////////////////////////////////////////////////////////////////// -// AeroTooltipManager, public: - -AeroTooltipManager::AeroTooltipManager(Widget* widget) - : TooltipManagerWin(widget), - initial_delay_(0) { -} - -AeroTooltipManager::~AeroTooltipManager() { - if (initial_timer_) - initial_timer_->Disown(); -} - -void AeroTooltipManager::OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param) { - if (u_msg == WM_MOUSELEAVE) { - last_mouse_pos_.SetPoint(-1, -1); - UpdateTooltip(); - return; - } - - if (initial_timer_) - initial_timer_->Disown(); - - if (u_msg == WM_MOUSEMOVE || u_msg == WM_NCMOUSEMOVE) { - gfx::Point mouse_pos(l_param); - if (u_msg == WM_NCMOUSEMOVE) { - // NC message coordinates are in screen coordinates. - POINT temp = mouse_pos.ToPOINT(); - ::MapWindowPoints(HWND_DESKTOP, GetParent(), &temp, 1); - mouse_pos.SetPoint(temp.x, temp.y); - } - if (last_mouse_pos_ != mouse_pos) { - last_mouse_pos_ = mouse_pos; - HideKeyboardTooltip(); - UpdateTooltip(mouse_pos); - } - - // Delay opening of the tooltip just in case the user moves their - // mouse to another control. We defer this from Init because we get - // zero if we query it too soon. - if (!initial_delay_) { - initial_delay_ = static_cast<int>( - ::SendMessage(tooltip_hwnd_, TTM_GETDELAYTIME, TTDT_INITIAL, 0)); - } - initial_timer_ = new InitialTimer(this); - initial_timer_->Start(initial_delay_); - } else { - // Hide the tooltip and cancel any timers. - ::SendMessage(tooltip_hwnd_, TTM_POP, 0, 0); - ::SendMessage(tooltip_hwnd_, TTM_TRACKACTIVATE, false, (LPARAM)&toolinfo_); - return; - } -} - -/////////////////////////////////////////////////////////////////////////////// -// AeroTooltipManager, private: - -void AeroTooltipManager::OnTimer() { - initial_timer_ = NULL; - - POINT pt = last_mouse_pos_.ToPOINT(); - ::ClientToScreen(GetParent(), &pt); - - // Set the position and visibility. - if (!tooltip_showing_) { - ::SendMessage(tooltip_hwnd_, TTM_POPUP, 0, 0); - ::SendMessage(tooltip_hwnd_, TTM_TRACKPOSITION, 0, MAKELPARAM(pt.x, pt.y)); - ::SendMessage(tooltip_hwnd_, TTM_TRACKACTIVATE, true, (LPARAM)&toolinfo_); - } -} - -/////////////////////////////////////////////////////////////////////////////// -// AeroTooltipManager::InitialTimer - -AeroTooltipManager::InitialTimer::InitialTimer(AeroTooltipManager* manager) - : manager_(manager) { -} - -void AeroTooltipManager::InitialTimer::Start(int time) { - MessageLoop::current()->PostDelayedTask( - FROM_HERE, base::Bind(&InitialTimer::Execute, this), time); -} - -void AeroTooltipManager::InitialTimer::Disown() { - manager_ = NULL; -} - -void AeroTooltipManager::InitialTimer::Execute() { - if (manager_) - manager_->OnTimer(); -} - -} // namespace views diff --git a/ui/views/widget/aero_tooltip_manager.h b/ui/views/widget/aero_tooltip_manager.h deleted file mode 100644 index 5cd5e7b..0000000 --- a/ui/views/widget/aero_tooltip_manager.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_AERO_TOOLTIP_MANAGER_H_ -#define UI_VIEWS_WIDGET_AERO_TOOLTIP_MANAGER_H_ -#pragma once - -#include "base/memory/ref_counted.h" -#include "ui/views/widget/tooltip_manager_win.h" - -namespace views { - -/////////////////////////////////////////////////////////////////////////////// -// AeroTooltipManager -// -// Default Windows tooltips are broken when using our custom window frame -// - as soon as the tooltip receives a WM_MOUSEMOVE event, it starts spewing -// NCHITTEST messages at its parent window (us). These messages have random -// x/y coordinates and can't be ignored, as the DwmDefWindowProc uses -// NCHITTEST messages to determine how to highlight the caption buttons -// (the buttons then flicker as the hit tests sent by the user's mouse -// trigger different effects to those sent by the tooltip). -// -// So instead, we have to partially implement tooltips ourselves using -// TTF_TRACKed tooltips. -// -// TODO(glen): Resolve this with Microsoft. -class AeroTooltipManager : public TooltipManagerWin { - public: - explicit AeroTooltipManager(Widget* widget); - virtual ~AeroTooltipManager(); - - virtual void OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param); - - private: - void OnTimer(); - - class InitialTimer : public base::RefCounted<InitialTimer> { - public: - explicit InitialTimer(AeroTooltipManager* manager); - void Start(int time); - void Disown(); - void Execute(); - - private: - friend class base::RefCounted<InitialTimer>; - - ~InitialTimer() {} - - AeroTooltipManager* manager_; - }; - - int initial_delay_; - scoped_refptr<InitialTimer> initial_timer_; -}; - -} // namespace views - -#endif // #ifndef UI_VIEWS_WIDGET_AERO_TOOLTIP_MANAGER_H_ diff --git a/ui/views/widget/child_window_message_processor.cc b/ui/views/widget/child_window_message_processor.cc deleted file mode 100644 index dc49756..0000000 --- a/ui/views/widget/child_window_message_processor.cc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/child_window_message_processor.h" - -#include "base/logging.h" -#include "ui/base/view_prop.h" - -namespace views { - -static const char* const kChildWindowKey = "__CHILD_WINDOW_MESSAGE_PROCESSOR__"; - -// static -ui::ViewProp* ChildWindowMessageProcessor::Register( - HWND hwnd, - ChildWindowMessageProcessor* processor) { - DCHECK(processor); - return new ui::ViewProp(hwnd, kChildWindowKey, processor); -} - -// static -ChildWindowMessageProcessor* ChildWindowMessageProcessor::Get(HWND hwnd) { - return reinterpret_cast<ChildWindowMessageProcessor*>( - ui::ViewProp::GetValue(hwnd, kChildWindowKey)); -} - -} // namespace diff --git a/ui/views/widget/child_window_message_processor.h b/ui/views/widget/child_window_message_processor.h deleted file mode 100644 index 8ad57fc..0000000 --- a/ui/views/widget/child_window_message_processor.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_CHILD_WINDOW_MESSAGE_PROCESSOR_H_ -#define UI_VIEWS_WIDGET_CHILD_WINDOW_MESSAGE_PROCESSOR_H_ -#pragma once - -#include <windows.h> - -namespace ui { -class ViewProp; -} - -namespace views { - -// Windows sends a handful of messages to the parent window rather than the -// window itself. For example, selection changes of a rich edit (EN_SELCHANGE) -// are sent to the parent, not the window. Typically such message are best -// dealt with by the window rather than the parent. NativeWidgetWin allows for -// registering a ChildWindowMessageProcessor to handle such messages. -class ChildWindowMessageProcessor { - public: - // Registers |processor| for |hwnd|. The caller takes ownership of the - // returned object. - static ui::ViewProp* Register(HWND hwnd, - ChildWindowMessageProcessor* processor); - - // Returns the ChildWindowMessageProcessor for |hwnd|, NULL if there isn't - // one. - static ChildWindowMessageProcessor* Get(HWND hwnd); - - // Invoked for any messages that are sent to the parent and originated from - // the HWND this ChildWindowMessageProcessor was registered for. Returns true - // if the message was handled with a valid result in |result|. Returns false - // if the message was not handled. - virtual bool ProcessMessage(UINT message, - WPARAM w_param, - LPARAM l_param, - LRESULT* result) = 0; - - protected: - virtual ~ChildWindowMessageProcessor() {} -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_CHILD_WINDOW_MESSAGE_PROCESSOR_H_ diff --git a/ui/views/widget/default_theme_provider.cc b/ui/views/widget/default_theme_provider.cc deleted file mode 100644 index 8ad2cfb..0000000 --- a/ui/views/widget/default_theme_provider.cc +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/default_theme_provider.h" - -#include "ui/base/resource/resource_bundle.h" - -#if defined(OS_WIN) && !defined(USE_AURA) -#include "ui/views/widget/native_widget_win.h" -#endif - -namespace views { - -DefaultThemeProvider::DefaultThemeProvider() {} - -DefaultThemeProvider::~DefaultThemeProvider() {} - -void DefaultThemeProvider::Init(Profile* profile) {} - -SkBitmap* DefaultThemeProvider::GetBitmapNamed(int id) const { - return ResourceBundle::GetSharedInstance().GetBitmapNamed(id); -} - -SkColor DefaultThemeProvider::GetColor(int id) const { - // Return debugging-blue. - return 0xff0000ff; -} - -bool DefaultThemeProvider::GetDisplayProperty(int id, int* result) const { - return false; -} - -bool DefaultThemeProvider::ShouldUseNativeFrame() const { -#if defined(OS_WIN) && !defined(USE_AURA) - return NativeWidgetWin::IsAeroGlassEnabled(); -#else - return false; -#endif -} - -bool DefaultThemeProvider::HasCustomImage(int id) const { - return false; -} - -RefCountedMemory* DefaultThemeProvider::GetRawData(int id) const { - return NULL; -} - -} // namespace views diff --git a/ui/views/widget/default_theme_provider.h b/ui/views/widget/default_theme_provider.h deleted file mode 100644 index 9303e83..0000000 --- a/ui/views/widget/default_theme_provider.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef VIEWS_DEFAULT_THEME_PROVIDER_H_ -#define VIEWS_DEFAULT_THEME_PROVIDER_H_ -#pragma once - -#include <vector> - -#include "base/basictypes.h" -#include "ui/base/theme_provider.h" -#include "views/views_export.h" - -class Profile; - -namespace ui { -class ResourceBundle; -} -using ui::ResourceBundle; - -namespace views { - -class VIEWS_EXPORT DefaultThemeProvider : public ui::ThemeProvider { - public: - DefaultThemeProvider(); - virtual ~DefaultThemeProvider(); - - // Overridden from ui::ThemeProvider. - virtual void Init(Profile* profile); - virtual SkBitmap* GetBitmapNamed(int id) const; - virtual SkColor GetColor(int id) const; - virtual bool GetDisplayProperty(int id, int* result) const; - virtual bool ShouldUseNativeFrame() const; - virtual bool HasCustomImage(int id) const; - virtual RefCountedMemory* GetRawData(int id) const; - - private: - DISALLOW_COPY_AND_ASSIGN(DefaultThemeProvider); -}; - -} // namespace views - -#endif // VIEWS_DEFAULT_THEME_PROVIDER_H_ diff --git a/ui/views/widget/drop_helper.cc b/ui/views/widget/drop_helper.cc deleted file mode 100644 index a351090..0000000 --- a/ui/views/widget/drop_helper.cc +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/drop_helper.h" - -#include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/views/widget/widget.h" -#include "views/view.h" - -namespace views { - -DropHelper::DropHelper(View* root_view) - : root_view_(root_view), - target_view_(NULL), - deepest_view_(NULL) { -} - -DropHelper::~DropHelper() { -} - -void DropHelper::ResetTargetViewIfEquals(View* view) { - if (target_view_ == view) - target_view_ = NULL; - if (deepest_view_ == view) - deepest_view_ = NULL; -} - -int DropHelper::OnDragOver(const OSExchangeData& data, - const gfx::Point& root_view_location, - int drag_operation) { - View* view = CalculateTargetViewImpl(root_view_location, data, true, - &deepest_view_); - - if (view != target_view_) { - // Target changed notify old drag exited, then new drag entered. - NotifyDragExit(); - target_view_ = view; - NotifyDragEntered(data, root_view_location, drag_operation); - } - - return NotifyDragOver(data, root_view_location, drag_operation); -} - -void DropHelper::OnDragExit() { - NotifyDragExit(); - deepest_view_ = target_view_ = NULL; -} - -int DropHelper::OnDrop(const OSExchangeData& data, - const gfx::Point& root_view_location, - int drag_operation) { - View* drop_view = target_view_; - deepest_view_ = target_view_ = NULL; - if (!drop_view) - return ui::DragDropTypes::DRAG_NONE; - - if (drag_operation == ui::DragDropTypes::DRAG_NONE) { - drop_view->OnDragExited(); - return ui::DragDropTypes::DRAG_NONE; - } - - gfx::Point view_location(root_view_location); - View* root_view = drop_view->GetWidget()->GetRootView(); - View::ConvertPointToView(root_view, drop_view, &view_location); - DropTargetEvent drop_event(data, view_location.x(), view_location.y(), - drag_operation); - return drop_view->OnPerformDrop(drop_event); -} - -View* DropHelper::CalculateTargetView( - const gfx::Point& root_view_location, - const OSExchangeData& data, - bool check_can_drop) { - return CalculateTargetViewImpl(root_view_location, data, check_can_drop, - NULL); -} - -View* DropHelper::CalculateTargetViewImpl( - const gfx::Point& root_view_location, - const OSExchangeData& data, - bool check_can_drop, - View** deepest_view) { - View* view = root_view_->GetEventHandlerForPoint(root_view_location); - if (view == deepest_view_) { - // The view the mouse is over hasn't changed; reuse the target. - return target_view_; - } - if (deepest_view) - *deepest_view = view; - // TODO(sky): for the time being these are separate. Once I port chrome menu - // I can switch to the #else implementation and nuke the OS_WIN - // implementation. -#if defined(OS_WIN) - // View under mouse changed, which means a new view may want the drop. - // Walk the tree, stopping at target_view_ as we know it'll accept the - // drop. - while (view && view != target_view_ && - (!view->IsEnabled() || !view->CanDrop(data))) { - view = view->parent(); - } -#else - int formats = 0; - std::set<OSExchangeData::CustomFormat> custom_formats; - while (view && view != target_view_) { - if (view->IsEnabled() && - view->GetDropFormats(&formats, &custom_formats) && - data.HasAnyFormat(formats, custom_formats) && - (!check_can_drop || view->CanDrop(data))) { - // Found the view. - return view; - } - formats = 0; - custom_formats.clear(); - view = view->parent(); - } -#endif - return view; -} - -void DropHelper::NotifyDragEntered(const OSExchangeData& data, - const gfx::Point& root_view_location, - int drag_operation) { - if (!target_view_) - return; - - gfx::Point target_view_location(root_view_location); - View::ConvertPointToView(root_view_, target_view_, &target_view_location); - DropTargetEvent enter_event(data, - target_view_location.x(), - target_view_location.y(), - drag_operation); - target_view_->OnDragEntered(enter_event); -} - -int DropHelper::NotifyDragOver(const OSExchangeData& data, - const gfx::Point& root_view_location, - int drag_operation) { - if (!target_view_) - return ui::DragDropTypes::DRAG_NONE; - - gfx::Point target_view_location(root_view_location); - View::ConvertPointToView(root_view_, target_view_, &target_view_location); - DropTargetEvent enter_event(data, - target_view_location.x(), - target_view_location.y(), - drag_operation); - return target_view_->OnDragUpdated(enter_event); -} - -void DropHelper::NotifyDragExit() { - if (target_view_) - target_view_->OnDragExited(); -} - -} // namespace views diff --git a/ui/views/widget/drop_helper.h b/ui/views/widget/drop_helper.h deleted file mode 100644 index 38627d3..0000000 --- a/ui/views/widget/drop_helper.h +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_DROP_HELPER_H_ -#define UI_VIEWS_WIDGET_DROP_HELPER_H_ -#pragma once - -#include "base/basictypes.h" - -namespace gfx { -class Point; -} // namespace gfx - -namespace ui { -class OSExchangeData; -} // namespace ui -using ui::OSExchangeData; - -namespace views { - -class RootView; -class View; - -// DropHelper provides support for managing the view a drop is going to occur -// at during dnd as well as sending the view the appropriate dnd methods. -// DropHelper is intended to be used by a class that interacts with the system -// drag and drop. The system class invokes OnDragOver as the mouse moves, -// then either OnDragExit or OnDrop when the drop is done. -class DropHelper { - public: - explicit DropHelper(View* root_view); - ~DropHelper(); - - // Current view drop events are targeted at, may be NULL. - View* target_view() const { return target_view_; } - - // Returns the RootView the DropHelper was created with. - View* root_view() const { return root_view_; } - - // Resets the target_view_ to NULL if it equals view. - // - // This is invoked when a View is removed from the RootView to make sure - // we don't target a view that was removed during dnd. - void ResetTargetViewIfEquals(View* view); - - // Invoked when a the mouse is dragged over the root view during a drag and - // drop operation. This method returns a bitmask of the types in DragDropTypes - // for the target view. If no view wants the drop, DRAG_NONE is returned. - int OnDragOver(const OSExchangeData& data, - const gfx::Point& root_view_location, - int drag_operation); - - // Invoked when a the mouse is dragged out of the root view during a drag and - // drop operation. - void OnDragExit(); - - // Invoked when the user drops data on the root view during a drag and drop - // operation. See OnDragOver for details on return type. - // - // NOTE: implementations must invoke OnDragOver before invoking this, - // supplying the return value from OnDragOver as the drag_operation. - int OnDrop(const OSExchangeData& data, - const gfx::Point& root_view_location, - int drag_operation); - - // Calculates the target view for a drop given the specified location in - // the coordinate system of the rootview. This tries to avoid continually - // querying CanDrop by returning target_view_ if the mouse is still over - // target_view_. - View* CalculateTargetView(const gfx::Point& root_view_location, - const OSExchangeData& data, - bool check_can_drop); - - private: - // Implementation of CalculateTargetView. If |deepest_view| is non-NULL it is - // set to the deepest descendant of the RootView that contains the point - // |root_view_location| - View* CalculateTargetViewImpl(const gfx::Point& root_view_location, - const OSExchangeData& data, - bool check_can_drop, - View** deepest_view); - - // Methods to send the appropriate drop notification to the targeted view. - // These do nothing if the target view is NULL. - void NotifyDragEntered(const OSExchangeData& data, - const gfx::Point& root_view_location, - int drag_operation); - int NotifyDragOver(const OSExchangeData& data, - const gfx::Point& root_view_location, - int drag_operation); - void NotifyDragExit(); - - // RootView we were created for. - View* root_view_; - - // View we're targeting events at. - View* target_view_; - - // The deepest view under the current drop coordinate. - View* deepest_view_; - - DISALLOW_COPY_AND_ASSIGN(DropHelper); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_DROP_HELPER_H_ diff --git a/ui/views/widget/drop_target_gtk.cc b/ui/views/widget/drop_target_gtk.cc deleted file mode 100644 index f5b3102..0000000 --- a/ui/views/widget/drop_target_gtk.cc +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/drop_target_gtk.h" - -#include <algorithm> -#include <iterator> -#include <string> -#include <vector> - -#include "base/file_path.h" -#include "base/utf_string_conversions.h" -#include "net/base/net_util.h" -#include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/base/dragdrop/gtk_dnd_util.h" -#include "ui/base/dragdrop/os_exchange_data_provider_gtk.h" -#include "ui/gfx/point.h" -#include "ui/views/widget/native_widget_gtk.h" -#include "ui/views/widget/root_view.h" - -using ui::OSExchangeData; - -namespace { - -std::string GdkAtomToString(GdkAtom atom) { - gchar* c_name = gdk_atom_name(atom); - std::string name(c_name); - g_free(c_name); - return name; -} - -// Returns true if |name| is a known name of plain text. -bool IsTextType(const std::string& name) { - return name == "text/plain" || name == "TEXT" || - name == "STRING" || name == "UTF8_STRING" || - name == "text/plain;charset=utf-8"; -} - -// Returns the OSExchangeData::Formats in |targets| and all the -// OSExchangeData::CustomFormats in |type_set|. -int CalculateTypes(GList* targets, std::set<GdkAtom>* type_set) { - int types = 0; - for (GList* element = targets; element; - element = g_list_next(element)) { - GdkAtom atom = static_cast<GdkAtom>(element->data); - type_set->insert(atom); - if (atom == GDK_TARGET_STRING) { - types |= OSExchangeData::STRING; - } else if (atom == ui::GetAtomForTarget(ui::CHROME_NAMED_URL)) { - types |= OSExchangeData::URL; - } else if (atom == ui::GetAtomForTarget(ui::TEXT_URI_LIST)) { - // TEXT_URI_LIST is used for files as well as urls. - types |= OSExchangeData::URL | OSExchangeData::FILE_NAME; - } else { - std::string target_name = GdkAtomToString(atom); - if (IsTextType(target_name)) { - types |= OSExchangeData::STRING; - } else { - // Assume any unknown data is pickled. - types |= OSExchangeData::PICKLED_DATA; - } - } - } - return types; -} - -} // namespace - -namespace views { - -DropTargetGtk::DropTargetGtk(internal::RootView* root_view, - GdkDragContext* context) - : helper_(root_view), - requested_formats_(0), - waiting_for_data_(false), - received_drop_(false), - pending_view_(NULL) { - std::set<GdkAtom> all_formats; - int source_formats = CalculateTypes(context->targets, &all_formats); - data_.reset(new OSExchangeData(new OSExchangeDataProviderGtk( - source_formats, all_formats))); -} - -DropTargetGtk::~DropTargetGtk() { -} - -void DropTargetGtk::ResetTargetViewIfEquals(View* view) { - helper_.ResetTargetViewIfEquals(view); -} - -void DropTargetGtk::OnDragDataReceived(GdkDragContext* context, - gint x, - gint y, - GtkSelectionData* data, - guint info, - guint time) { - std::string target_name = GdkAtomToString(data->type); - if (data->type == GDK_TARGET_STRING || IsTextType(target_name)) { - guchar* text_data = gtk_selection_data_get_text(data); - string16 result; - if (text_data) { - char* as_char = reinterpret_cast<char*>(text_data); - UTF8ToUTF16(as_char, strlen(as_char), &result); - g_free(text_data); - } - data_provider().SetString(result); - } else if (requested_custom_formats_.find(data->type) != - requested_custom_formats_.end()) { - Pickle result; - if (data->length > 0) - result = Pickle(reinterpret_cast<char*>(data->data), data->length); - data_provider().SetPickledData(data->type, result); - } else if (data->type == ui::GetAtomForTarget(ui::CHROME_NAMED_URL)) { - GURL url; - string16 title; - ui::ExtractNamedURL(data, &url, &title); - data_provider().SetURL(url, title); - } else if (data->type == ui::GetAtomForTarget(ui::TEXT_URI_LIST)) { - std::vector<GURL> urls; - ui::ExtractURIList(data, &urls); - if (urls.size() == 1 && urls[0].is_valid()) { - data_provider().SetURL(urls[0], string16()); - - // TEXT_URI_LIST is used for files as well as urls. - if (urls[0].SchemeIsFile()) { - FilePath file_path; - if (net::FileURLToFilePath(urls[0], &file_path)) - data_provider().SetFilename(file_path); - } - } else { - // Consumers of OSExchangeData will see this as an invalid URL. That is, - // when GetURL is invoked on the OSExchangeData this triggers false to - // be returned. - data_provider().SetURL(GURL(), string16()); - } - } - - if (!data_->HasAllFormats(requested_formats_, requested_custom_formats_)) - return; // Waiting on more data. - - int drag_operation = ui::DragDropTypes::GdkDragActionToDragOperation( - context->actions); - gfx::Point root_view_location(x, y); - drag_operation = helper_.OnDragOver(*data_, root_view_location, - drag_operation); - GdkDragAction gdk_action = static_cast<GdkDragAction>( - ui::DragDropTypes::DragOperationToGdkDragAction(drag_operation)); - if (!received_drop_) - gdk_drag_status(context, gdk_action, time); - - waiting_for_data_ = false; - - if (pending_view_ && received_drop_) { - FinishDrop(context, x, y, time); - // WARNING: we've been deleted. - return; - } -} - -gboolean DropTargetGtk::OnDragDrop(GdkDragContext* context, - gint x, - gint y, - guint time) { - received_drop_ = true; - OnDragMotion(context, x, y, time); - if (!pending_view_) { - // User isn't over a view, no drop can occur. - static_cast<NativeWidgetGtk*>( - helper_.root_view()->GetWidget()->native_widget())->ResetDropTarget(); - // WARNING: we've been deleted. - return FALSE; - } - - if (!waiting_for_data_) { - // We've got all the data now. - FinishDrop(context, x, y, time); - // WARNING: we've been deleted. - return TRUE; - } - // We're waiting on data. - return TRUE; -} - -void DropTargetGtk::OnDragLeave(GdkDragContext* context, guint time) { - helper_.OnDragExit(); -} - -gboolean DropTargetGtk::OnDragMotion(GdkDragContext* context, - gint x, - gint y, - guint time) { - waiting_for_data_ = false; - gfx::Point root_view_location(x, y); - pending_view_ = - helper_.CalculateTargetView(root_view_location, *data_, false); - if (pending_view_ && - (received_drop_ || (pending_view_ != helper_.target_view() && - pending_view_->AreDropTypesRequired()))) { - // The target requires drop types before it can answer CanDrop, - // ask for the data now. - int formats = 0; - std::set<GdkAtom> custom_formats; - pending_view_->GetDropFormats(&formats, &custom_formats); - IntersectFormats(data_provider().known_formats(), - data_provider().known_custom_formats(), - &formats, &custom_formats); - if (!data_provider().HasDataForAllFormats(formats, custom_formats)) { - if (!received_drop_) - helper_.OnDragExit(); - - // The target needs data for all the types before it can test if the - // drop is valid, but we don't have all the data. Request the data - // now. When we get back the data we'll update the target. - RequestFormats(context, formats, custom_formats, time); - - waiting_for_data_ = true; - - return TRUE; - } - } - - int drag_operation = ui::DragDropTypes::GdkDragActionToDragOperation( - context->actions); - drag_operation = helper_.OnDragOver(*data_, root_view_location, - drag_operation); - if (!received_drop_) { - GdkDragAction gdk_action = - static_cast<GdkDragAction>( - ui::DragDropTypes::DragOperationToGdkDragAction(drag_operation)); - gdk_drag_status(context, gdk_action, time); - } - return TRUE; -} - -void DropTargetGtk::FinishDrop(GdkDragContext* context, - gint x, gint y, guint time) { - gfx::Point root_view_location(x, y); - int drag_operation = ui::DragDropTypes::GdkDragActionToDragOperation( - context->actions); - drag_operation = helper_.OnDrop(*data_, root_view_location, - drag_operation); - GdkDragAction gdk_action = - static_cast<GdkDragAction>( - ui::DragDropTypes::DragOperationToGdkDragAction(drag_operation)); - gtk_drag_finish(context, gdk_action != 0, (gdk_action & GDK_ACTION_MOVE), - time); - - static_cast<NativeWidgetGtk*>(helper_.root_view()->GetWidget()-> - native_widget())->ResetDropTarget(); - // WARNING: we've been deleted. -} - -void DropTargetGtk::IntersectFormats(int f1, const std::set<GdkAtom>& cf1, - int* f2, std::set<GdkAtom>* cf2) { - *f2 = (*f2 & f1); - std::set<GdkAtom> cf; - std::set_intersection( - cf1.begin(), cf1.end(), cf2->begin(), cf2->end(), - std::insert_iterator<std::set<GdkAtom> >(cf, cf.begin())); - cf.swap(*cf2); -} - -void DropTargetGtk::RequestFormats(GdkDragContext* context, - int formats, - const std::set<GdkAtom>& custom_formats, - guint time) { - GtkWidget* widget = static_cast<NativeWidgetGtk*>(helper_.root_view()-> - GetWidget()->native_widget())->window_contents(); - - const std::set<GdkAtom>& known_formats = - data_provider().known_custom_formats(); - if ((formats & OSExchangeData::STRING) != 0 && - (requested_formats_ & OSExchangeData::STRING) == 0) { - requested_formats_ |= OSExchangeData::STRING; - if (known_formats.count(gdk_atom_intern("UTF8_STRING", false))) { - gtk_drag_get_data(widget, context, - gdk_atom_intern("UTF8_STRING", false), time); - } else if (known_formats.count(gdk_atom_intern("text/plain;charset=utf-8", - false))) { - gtk_drag_get_data(widget, context, - gdk_atom_intern("text/plain;charset=utf-8", false), - time); - } else if (known_formats.count(GDK_TARGET_STRING)) { - gtk_drag_get_data(widget, context, GDK_TARGET_STRING, time); - } else if (known_formats.count(gdk_atom_intern("text/plain", false))) { - gtk_drag_get_data(widget, context, gdk_atom_intern("text/plain", false), - time); - } else if (known_formats.count(gdk_atom_intern("TEXT", false))) { - gtk_drag_get_data(widget, context, gdk_atom_intern("TEXT", false), - time); - } else if (known_formats.count(gdk_atom_intern("STRING", false))) { - gtk_drag_get_data(widget, context, gdk_atom_intern("STRING", false), - time); - } - } - if ((formats & OSExchangeData::URL) != 0 && - (requested_formats_ & OSExchangeData::URL) == 0) { - requested_formats_ |= OSExchangeData::URL; - if (known_formats.count(ui::GetAtomForTarget(ui::CHROME_NAMED_URL))) { - gtk_drag_get_data(widget, context, - ui::GetAtomForTarget(ui::CHROME_NAMED_URL), time); - } else if (known_formats.count( - ui::GetAtomForTarget(ui::TEXT_URI_LIST))) { - gtk_drag_get_data(widget, context, - ui::GetAtomForTarget(ui::TEXT_URI_LIST), time); - } - } - if (((formats & OSExchangeData::FILE_NAME) != 0) && - (requested_formats_ & OSExchangeData::FILE_NAME) == 0) { - requested_formats_ |= OSExchangeData::FILE_NAME; - gtk_drag_get_data(widget, context, - ui::GetAtomForTarget(ui::TEXT_URI_LIST), time); - } - for (std::set<GdkAtom>::const_iterator i = custom_formats.begin(); - i != custom_formats.end(); ++i) { - if (requested_custom_formats_.find(*i) == - requested_custom_formats_.end()) { - requested_custom_formats_.insert(*i); - gtk_drag_get_data(widget, context, *i, time); - } - } -} - -OSExchangeDataProviderGtk& DropTargetGtk::data_provider() const { - return static_cast<OSExchangeDataProviderGtk&>(data_->provider()); -} - -} // namespace views diff --git a/ui/views/widget/drop_target_gtk.h b/ui/views/widget/drop_target_gtk.h deleted file mode 100644 index bf324af..0000000 --- a/ui/views/widget/drop_target_gtk.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_DROP_TARGET_GTK_H_ -#define UI_VIEWS_WIDGET_DROP_TARGET_GTK_H_ -#pragma once - -#include <gtk/gtk.h> -#include <set> - -#include "base/memory/scoped_ptr.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/views/widget/drop_helper.h" - -namespace ui { -class OSExchangeDataProviderGtk; -} -using ui::OSExchangeData; -using ui::OSExchangeDataProviderGtk; - -namespace views { - -class View; -namespace internal { -class RootView; -} - -// DropTarget implementation for Gtk. -// -// The data for a drop is not immediately available on X. As such we lazily -// ask for data as necessary. Some Views require data before they can determine -// if the drop is going to be allowed. When such a View is encountered the -// relevant data is requested from the drag source. When the data is available -// the target is notified. Similarly if the drop completes and the data has -// not yet been fetched, it is fetched and the target then notified. -// -// When a drop finishes this class calls back to the containing NativeWidgetGtk -// which results in deleting the DropTargetGtk. -class DropTargetGtk { - public: - DropTargetGtk(internal::RootView* root_view, GdkDragContext* context); - ~DropTargetGtk(); - - // If a drag and drop is underway and |view| is the current drop target, the - // drop target is set to null. - // This is invoked when a View is removed from the RootView to make sure - // we don't target a view that was removed during dnd. - void ResetTargetViewIfEquals(View* view); - - // Drop methods from Gtk. These are forwarded from the containing - // NativeWidgetGtk. - void OnDragDataReceived(GdkDragContext* context, - gint x, - gint y, - GtkSelectionData* data, - guint info, - guint time); - gboolean OnDragDrop(GdkDragContext* context, - gint x, - gint y, - guint time); - void OnDragLeave(GdkDragContext* context, guint time); - gboolean OnDragMotion(GdkDragContext* context, - gint x, - gint y, - guint time); - - private: - // Invoked when the drop finishes AND all the data is available. - void FinishDrop(GdkDragContext* context, gint x, gint y, guint time); - - // Returns in |f2| and |cf2| the intersection of |f1| |f2| and - // |cf1|, |cf2|. - void IntersectFormats(int f1, const std::set<GdkAtom>& cf1, - int* f2, std::set<GdkAtom>* cf2); - - // Requests the formats in |formats| and the custom formats in - // |custom_formats|. - void RequestFormats(GdkDragContext* context, - int formats, - const std::set<GdkAtom>& custom_formats, - guint time); - - // Reutrns the Provider of the OSExchangeData we created. - OSExchangeDataProviderGtk& data_provider() const; - - // Manages sending the appropriate drop methods to the view the drop is over. - DropHelper helper_; - - // The formats we've requested from the drag source. - // - // NOTE: these formats are the intersection of the formats requested by the - // drop target and the formats provided by the source. - int requested_formats_; - std::set<GdkAtom> requested_custom_formats_; - - // The data. - scoped_ptr<OSExchangeData> data_; - - // Are we waiting for data from the source before we can notify the view? - // This is set in two distinct ways: when the view requires the data before - // it can answer Can Drop (that is, AreDropTypesRequired returns true) and - // when the user dropped the data but we didn't get it all yet. - bool waiting_for_data_; - - // Has OnDragDrop been invoked? - bool received_drop_; - - // The view under the mouse. This is not necessarily the same as - // helper_.target_view(). The two differ if the view under the mouse requires - // the data. - View* pending_view_; - - DISALLOW_COPY_AND_ASSIGN(DropTargetGtk); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_DROP_TARGET_GTK_H_ diff --git a/ui/views/widget/drop_target_win.cc b/ui/views/widget/drop_target_win.cc deleted file mode 100644 index 6ddeb1e..0000000 --- a/ui/views/widget/drop_target_win.cc +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/drop_target_win.h" - -#include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/dragdrop/os_exchange_data_provider_win.h" -#include "ui/gfx/point.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/widget.h" - -using ui::OSExchangeData; -using ui::OSExchangeDataProviderWin; - -namespace views { - -DropTargetWin::DropTargetWin(internal::RootView* root_view) - : ui::DropTarget(root_view->GetWidget()->GetNativeView()), - helper_(root_view) { -} - -DropTargetWin::~DropTargetWin() { -} - -void DropTargetWin::ResetTargetViewIfEquals(View* view) { - helper_.ResetTargetViewIfEquals(view); -} - -DWORD DropTargetWin::OnDragOver(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effect) { - gfx::Point root_view_location(cursor_position.x, cursor_position.y); - View::ConvertPointToView(NULL, helper_.root_view(), &root_view_location); - OSExchangeData data(new OSExchangeDataProviderWin(data_object)); - int drop_operation = - helper_.OnDragOver(data, root_view_location, - ui::DragDropTypes::DropEffectToDragOperation(effect)); - return ui::DragDropTypes::DragOperationToDropEffect(drop_operation); -} - -void DropTargetWin::OnDragLeave(IDataObject* data_object) { - helper_.OnDragExit(); -} - -DWORD DropTargetWin::OnDrop(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effect) { - gfx::Point root_view_location(cursor_position.x, cursor_position.y); - View::ConvertPointToView(NULL, helper_.root_view(), &root_view_location); - - OSExchangeData data(new OSExchangeDataProviderWin(data_object)); - int drop_operation = ui::DragDropTypes::DropEffectToDragOperation(effect); - drop_operation = helper_.OnDragOver(data, root_view_location, - drop_operation); - drop_operation = helper_.OnDrop(data, root_view_location, drop_operation); - return ui::DragDropTypes::DragOperationToDropEffect(drop_operation); -} - -} // namespace views diff --git a/ui/views/widget/drop_target_win.h b/ui/views/widget/drop_target_win.h deleted file mode 100644 index 3249ec5..0000000 --- a/ui/views/widget/drop_target_win.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_DROP_TARGET_WIN_H_ -#define UI_VIEWS_WIDGET_DROP_TARGET_WIN_H_ -#pragma once - -#include "ui/base/dragdrop/drop_target.h" -#include "ui/views/widget/drop_helper.h" - -namespace views { - -class View; -namespace internal { -class RootView; -} - -// DropTargetWin takes care of managing drag and drop for NativeWidgetWin. It -// converts Windows OLE drop messages into Views drop messages. -// -// DropTargetWin uses DropHelper to manage the appropriate view to target -// drop messages at. -class DropTargetWin : public ui::DropTarget { - public: - explicit DropTargetWin(internal::RootView* root_view); - virtual ~DropTargetWin(); - - // If a drag and drop is underway and view is the current drop target, the - // drop target is set to null. - // This is invoked when a View is removed from the RootView to make sure - // we don't target a view that was removed during dnd. - void ResetTargetViewIfEquals(View* view); - - protected: - virtual DWORD OnDragOver(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effect); - - virtual void OnDragLeave(IDataObject* data_object); - - virtual DWORD OnDrop(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effect); - - private: - views::DropHelper helper_; - - DISALLOW_COPY_AND_ASSIGN(DropTargetWin); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_DROP_TARGET_WIN_H_ diff --git a/ui/views/widget/gtk_views_fixed.cc b/ui/views/widget/gtk_views_fixed.cc deleted file mode 100644 index 60aed5c..0000000 --- a/ui/views/widget/gtk_views_fixed.cc +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/gtk_views_fixed.h" - -#include "base/logging.h" - -// We store whether we use the widget's allocated size as a property. Ideally -// we would stash this in GtkFixedChild, but GtkFixed doesn't allow subclassing -// gtk_fixed_put. Alternatively we could subclass GtkContainer and use our own -// API (effectively duplicating GtkFixed), but that means folks could no longer -// use the GtkFixed API else where in Chrome. For now I'm going with this route. -static const char* kUseAllocatedSize = "__VIEWS_USE_ALLOCATED_SIZE__"; -static const char* kRequisitionWidth = "__VIEWS_REQUISITION_WIDTH__"; -static const char* kRequisitionHeight = "__VIEWS_REQUISITION_HEIGHT__"; - -G_BEGIN_DECLS - -G_DEFINE_TYPE(GtkViewsFixed, gtk_views_fixed, GTK_TYPE_FIXED) - -static void gtk_views_fixed_size_allocate(GtkWidget* widget, - GtkAllocation* allocation) { - widget->allocation = *allocation; - if (!GTK_WIDGET_NO_WINDOW(widget) && GTK_WIDGET_REALIZED(widget)) { - gdk_window_move_resize(widget->window, allocation->x, allocation->y, - allocation->width, allocation->height); - } - - int border_width = GTK_CONTAINER(widget)->border_width; - GList* children = GTK_FIXED(widget)->children; - while (children) { - GtkFixedChild* child = reinterpret_cast<GtkFixedChild*>(children->data); - children = children->next; - - if (GTK_WIDGET_VISIBLE(child->widget)) { - GtkAllocation child_allocation; - - int width, height; - bool use_allocated_size = - gtk_views_fixed_get_widget_size(child->widget, &width, &height); - if (use_allocated_size) { - // NOTE: even though the size isn't changing, we have to call - // size_allocate, otherwise things like buttons won't repaint. - child_allocation.width = width; - child_allocation.height = height; - } else { - GtkRequisition child_requisition; - gtk_widget_get_child_requisition(child->widget, &child_requisition); - child_allocation.width = child_requisition.width; - child_allocation.height = child_requisition.height; - } - child_allocation.x = child->x + border_width; - child_allocation.y = child->y + border_width; - - if (GTK_WIDGET_NO_WINDOW(widget)) { - child_allocation.x += widget->allocation.x; - child_allocation.y += widget->allocation.y; - } - - gtk_widget_size_allocate(child->widget, &child_allocation); - } - } -} - -static void gtk_views_fixed_class_init(GtkViewsFixedClass* views_fixed_class) { - GtkWidgetClass* widget_class = - reinterpret_cast<GtkWidgetClass*>(views_fixed_class); - widget_class->size_allocate = gtk_views_fixed_size_allocate; -} - -static void gtk_views_fixed_init(GtkViewsFixed* fixed) { - GTK_WIDGET_SET_FLAGS(GTK_WIDGET(fixed), GTK_CAN_FOCUS); -} - -GtkWidget* gtk_views_fixed_new(void) { - return GTK_WIDGET(g_object_new(GTK_TYPE_VIEWS_FIXED, NULL)); -} - -void gtk_views_fixed_set_widget_size(GtkWidget* widget, - int width, int height) { - // Remember the allocation request, and set this widget up to use it. - bool use_requested_size = (width != 0 && height != 0); - g_object_set_data(G_OBJECT(widget), kUseAllocatedSize, - reinterpret_cast<gpointer>(use_requested_size ? 1 : 0)); - g_object_set_data(G_OBJECT(widget), kRequisitionWidth, - reinterpret_cast<gpointer>(width)); - g_object_set_data(G_OBJECT(widget), kRequisitionHeight, - reinterpret_cast<gpointer>(height)); - - gtk_widget_queue_resize(widget); -} - -bool gtk_views_fixed_get_widget_size(GtkWidget* widget, - int* width, int* height) { - DCHECK(width); - DCHECK(height); - *width = reinterpret_cast<glong>(g_object_get_data(G_OBJECT(widget), - kRequisitionWidth)); - *height = reinterpret_cast<glong>(g_object_get_data(G_OBJECT(widget), - kRequisitionHeight)); - return (g_object_get_data(G_OBJECT(widget), kUseAllocatedSize) != 0); -} - -G_END_DECLS diff --git a/ui/views/widget/gtk_views_fixed.h b/ui/views/widget/gtk_views_fixed.h deleted file mode 100644 index fbb6f14..0000000 --- a/ui/views/widget/gtk_views_fixed.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_GTK_VIEWS_FIXED_H_ -#define UI_VIEWS_WIDGET_GTK_VIEWS_FIXED_H_ -#pragma once - -#include <gdk/gdk.h> -#include <gtk/gtkfixed.h> - -// GtkViewsFixed is a subclass of GtkFixed that can give child widgets -// a set size rather than their requisitioned size (which is actually -// a minimum size, and that can cause issues). This behavior is -// controlled by gtk_views_fixed_set_widget_size; the default is to -// use the Widget's requisitioned size. - -G_BEGIN_DECLS - -#define GTK_TYPE_VIEWS_FIXED (gtk_views_fixed_get_type ()) -#define GTK_VIEWS_FIXED(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_VIEWS_FIXED, GtkViewsFixed)) -#define GTK_VIEWS_FIXED_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_VIEWS_FIXED, GtkViewsFixedClass)) -#define GTK_IS_VIEWS_FIXED(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_VIEWS_FIXED)) -#define GTK_IS_VIEWS_FIXED_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_VIEWS_FIXED)) -#define GTK_VIEWS_FIXED_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_VIEWS_FIXED, GtkViewsFixed)) - -typedef struct _GtkViewsFixed GtkViewsFixed; -typedef struct _GtkViewsFixedClass GtkViewsFixedClass; - -struct _GtkViewsFixed { - GtkFixed fixed; -}; - -struct _GtkViewsFixedClass { - GtkFixedClass parent_class; -}; - -GtkWidget* gtk_views_fixed_new(); - -GType gtk_views_fixed_get_type(); - -// If width and height are 0, go back to using the requisitioned size. -// Queues up a re-size on the widget. -void gtk_views_fixed_set_widget_size(GtkWidget* widget, int width, int height); - -bool gtk_views_fixed_get_widget_size(GtkWidget* widget, - int* width, int* height); - -G_END_DECLS - -#endif // UI_VIEWS_WIDGET_GTK_VIEWS_FIXED_H diff --git a/ui/views/widget/gtk_views_window.cc b/ui/views/widget/gtk_views_window.cc deleted file mode 100644 index 6470850..0000000 --- a/ui/views/widget/gtk_views_window.cc +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <gtk/gtk.h> - -#include "ui/views/events/event.h" -#include "ui/views/focus/focus_manager.h" -#include "ui/views/widget/gtk_views_window.h" -#include "ui/views/widget/widget.h" - -G_BEGIN_DECLS - -G_DEFINE_TYPE(GtkViewsWindow, gtk_views_window, GTK_TYPE_WINDOW) - -static void gtk_views_window_move_focus(GtkWindow* window, - GtkDirectionType dir) { - views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); - views::FocusManager* focus_manager = - widget ? widget->GetFocusManager() : NULL; - if (focus_manager) { - GdkEvent* key = gtk_get_current_event(); - if (key && key->type == GDK_KEY_PRESS) { - views::KeyEvent key_event(key); - focus_manager->OnKeyEvent(key_event); - } - } else if (GTK_WINDOW_CLASS(gtk_views_window_parent_class)->move_focus) { - GTK_WINDOW_CLASS(gtk_views_window_parent_class)->move_focus(window, dir); - } -} - -static void gtk_views_window_class_init( - GtkViewsWindowClass* views_window_class) { - GtkWindowClass* window_class = - reinterpret_cast<GtkWindowClass*>(views_window_class); - window_class->move_focus = gtk_views_window_move_focus; -} - -static void gtk_views_window_init(GtkViewsWindow* window) { -} - -GtkWidget* gtk_views_window_new(GtkWindowType type) { - return GTK_WIDGET(g_object_new(GTK_TYPE_VIEWS_WINDOW, "type", type, NULL)); -} - -G_END_DECLS diff --git a/ui/views/widget/gtk_views_window.h b/ui/views/widget/gtk_views_window.h deleted file mode 100644 index 26c08f7..0000000 --- a/ui/views/widget/gtk_views_window.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_GTK_VIEWS_WINDOW_H_ -#define UI_VIEWS_WIDGET_GTK_VIEWS_WINDOW_H_ -#pragma once - -#include <gtk/gtkwindow.h> - -// GtkViewsWindow is a subclass of GtkWindow that overrides its move_focus -// method so that we can handle focus traversing by ourselves. - -G_BEGIN_DECLS - -#define GTK_TYPE_VIEWS_WINDOW (gtk_views_window_get_type ()) -#define GTK_VIEWS_WINDOW(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_VIEWS_WINDOW, GtkViewsWindow)) -#define GTK_VIEWS_WINDOW_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_VIEWS_WINDOW, \ - GtkViewsWindowClass)) -#define GTK_IS_VIEWS_WINDOW(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_VIEWS_WINDOW)) -#define GTK_IS_VIEWS_WINDOW_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_VIEWS_WINDOW)) -#define GTK_VIEWS_WINDOW_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_VIEWS_WINDOW, GtkViewsWindow)) - -typedef struct _GtkViewsWindow GtkViewsWindow; -typedef struct _GtkViewsWindowClass GtkViewsWindowClass; - -struct _GtkViewsWindow { - GtkWindow window; -}; - -struct _GtkViewsWindowClass { - GtkWindowClass parent_class; -}; - -GtkWidget* gtk_views_window_new(GtkWindowType type); - -G_END_DECLS - -#endif // UI_VIEWS_WIDGET_GTK_VIEWS_WINDOW_H diff --git a/ui/views/widget/monitor_win.cc b/ui/views/widget/monitor_win.cc deleted file mode 100644 index dea232a..0000000 --- a/ui/views/widget/monitor_win.cc +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/monitor_win.h" - -#include <shellapi.h> - -#include "base/logging.h" -#include "ui/gfx/rect.h" - -namespace views { - -gfx::Rect GetMonitorBoundsForRect(const gfx::Rect& rect) { - RECT p_rect = rect.ToRECT(); - HMONITOR monitor = MonitorFromRect(&p_rect, MONITOR_DEFAULTTONEAREST); - if (monitor) { - MONITORINFO mi = {0}; - mi.cbSize = sizeof(mi); - GetMonitorInfo(monitor, &mi); - return gfx::Rect(mi.rcWork); - } - NOTREACHED(); - return gfx::Rect(); -} - -HWND GetTopmostAutoHideTaskbarForEdge(UINT edge, HMONITOR monitor) { - APPBARDATA taskbar_data = { sizeof APPBARDATA, NULL, 0, edge }; - HWND taskbar = reinterpret_cast<HWND>(SHAppBarMessage(ABM_GETAUTOHIDEBAR, - &taskbar_data)); - return (::IsWindow(taskbar) && (monitor != NULL) && - (MonitorFromWindow(taskbar, MONITOR_DEFAULTTONULL) == monitor) && - (GetWindowLong(taskbar, GWL_EXSTYLE) & WS_EX_TOPMOST)) ? - taskbar : NULL; -} - -} // namespace views diff --git a/ui/views/widget/monitor_win.h b/ui/views/widget/monitor_win.h deleted file mode 100644 index 2d5c5bb..0000000 --- a/ui/views/widget/monitor_win.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_MONITOR_WIN_H_ -#define UI_VIEWS_WIDGET_MONITOR_WIN_H_ -#pragma once - -#include <windows.h> - -#include "views/views_export.h" - -namespace gfx { -class Rect; -} - -namespace views { - -// Returns the bounds for the monitor that contains the largest area of -// intersection with the specified rectangle. -VIEWS_EXPORT gfx::Rect GetMonitorBoundsForRect(const gfx::Rect& rect); - -// Returns the always-on-top auto-hiding taskbar for edge |edge| (one of -// ABE_LEFT, TOP, RIGHT, or BOTTOM) of monitor |monitor|. NULL is returned -// if nothing is found. -VIEWS_EXPORT HWND GetTopmostAutoHideTaskbarForEdge(UINT edge, HMONITOR monitor); - -} // namespace views - -#endif // UI_VIEWS_WIDGET_MONITOR_WIN_H_ diff --git a/ui/views/widget/native_widget.h b/ui/views/widget/native_widget.h deleted file mode 100644 index 1e1a2a8..0000000 --- a/ui/views/widget/native_widget.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_H_ -#define UI_VIEWS_WIDGET_NATIVE_WIDGET_H_ -#pragma once - -#include "ui/views/widget/widget.h" - -namespace views { -namespace internal { -class NativeWidgetPrivate; -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidget interface -// -// An interface that serves as the public API base for the -// internal::NativeWidget interface that Widget uses to communicate with a -// backend-specific native widget implementation. This is the only component of -// this interface that is publicly visible, and exists solely for exposure via -// Widget's native_widget() accessor, which code occasionally static_casts to -// a known implementation in platform-specific code. -// -class VIEWS_EXPORT NativeWidget { - public: - virtual ~NativeWidget() {} - - private: - friend class Widget; - - virtual internal::NativeWidgetPrivate* AsNativeWidgetPrivate() = 0; -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_NATIVE_WIDGET_H_ diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc deleted file mode 100644 index 0dbace5..0000000 --- a/ui/views/widget/native_widget_aura.cc +++ /dev/null @@ -1,794 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/native_widget_aura.h" - -#include "base/bind.h" -#include "base/string_util.h" -#include "ui/aura/client/aura_constants.h" -#include "ui/aura/client/drag_drop_client.h" -#include "ui/aura/desktop.h" -#include "ui/aura/desktop_observer.h" -#include "ui/aura/event.h" -#include "ui/aura/window.h" -#include "ui/aura/window_types.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/ui_base_types.h" -#include "ui/gfx/canvas.h" -#include "ui/gfx/compositor/layer.h" -#include "ui/gfx/font.h" -#include "ui/gfx/screen.h" -#include "ui/views/widget/drop_helper.h" -#include "ui/views/widget/native_widget_delegate.h" -#include "ui/views/widget/tooltip_manager_views.h" - -#if defined(OS_WIN) -#include "base/win/scoped_gdi_object.h" -#include "base/win/win_util.h" -#include "ui/base/l10n/l10n_util_win.h" -#endif - -#if defined(HAVE_IBUS) -#include "ui/views/ime/input_method_ibus.h" -#else -#include "ui/views/ime/mock_input_method.h" -#endif - -namespace views { - -namespace { - -aura::WindowType GetAuraWindowTypeForWidgetType(Widget::InitParams::Type type) { - switch (type) { - case Widget::InitParams::TYPE_WINDOW: - return aura::WINDOW_TYPE_NORMAL; - case Widget::InitParams::TYPE_WINDOW_FRAMELESS: - case Widget::InitParams::TYPE_CONTROL: - case Widget::InitParams::TYPE_POPUP: - case Widget::InitParams::TYPE_BUBBLE: - return aura::WINDOW_TYPE_POPUP; - case Widget::InitParams::TYPE_MENU: - return aura::WINDOW_TYPE_MENU; - case Widget::InitParams::TYPE_TOOLTIP: - return aura::WINDOW_TYPE_TOOLTIP; - default: - NOTREACHED() << "Unhandled widget type " << type; - return aura::WINDOW_TYPE_UNKNOWN; - } -} - -} // namespace - -// Used when SetInactiveRenderingDisabled() is invoked to track when active -// status changes in such a way that we should enable inactive rendering. -class NativeWidgetAura::DesktopObserverImpl : public aura::DesktopObserver { - public: - explicit DesktopObserverImpl(NativeWidgetAura* host) - : host_(host) { - aura::Desktop::GetInstance()->AddObserver(this); - } - - virtual ~DesktopObserverImpl() { - aura::Desktop::GetInstance()->RemoveObserver(this); - } - - // DesktopObserver overrides: - virtual void OnActiveWindowChanged(aura::Window* active) OVERRIDE { - if (!active || (active != host_->window_ && - active->transient_parent() != host_->window_)) { - host_->delegate_->EnableInactiveRendering(); - } - } - - private: - NativeWidgetAura* host_; - - DISALLOW_COPY_AND_ASSIGN(DesktopObserverImpl); -}; - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetAura, public: - -NativeWidgetAura::NativeWidgetAura(internal::NativeWidgetDelegate* delegate) - : delegate_(delegate), - ALLOW_THIS_IN_INITIALIZER_LIST(window_(new aura::Window(this))), - ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), - ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)), - can_activate_(true), - cursor_(gfx::kNullCursor) { -} - -NativeWidgetAura::~NativeWidgetAura() { - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) - delete delegate_; - else - CloseNow(); -} - -// static -gfx::Font NativeWidgetAura::GetWindowTitleFont() { -#if defined(OS_WIN) - NONCLIENTMETRICS ncm; - base::win::GetNonClientMetrics(&ncm); - l10n_util::AdjustUIFont(&(ncm.lfCaptionFont)); - base::win::ScopedHFONT caption_font(CreateFontIndirect(&(ncm.lfCaptionFont))); - return gfx::Font(caption_font); -#else - return gfx::Font(); -#endif -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetAura, internal::NativeWidgetPrivate implementation: - -void NativeWidgetAura::InitNativeWidget(const Widget::InitParams& params) { - ownership_ = params.ownership; - window_->set_user_data(this); - Widget::InitParams::Type window_type = - params.child ? Widget::InitParams::TYPE_CONTROL : params.type; - window_->SetType(GetAuraWindowTypeForWidgetType(window_type)); - window_->SetIntProperty(aura::kShowStateKey, ui::SHOW_STATE_NORMAL); - window_->Init(params.create_texture_for_layer ? - ui::Layer::LAYER_HAS_TEXTURE : - ui::Layer::LAYER_HAS_NO_TEXTURE); - if (window_type == Widget::InitParams::TYPE_CONTROL) - window_->Show(); - - window_->layer()->SetFillsBoundsOpaquely(!params.transparent); - delegate_->OnNativeWidgetCreated(); - window_->SetBounds(params.bounds); - if (window_type == Widget::InitParams::TYPE_CONTROL) { - window_->SetParent(params.GetParent()); - } else { - // Set up the transient child before the window is added. This way the - // LayoutManager knows the window has a transient parent. - gfx::NativeView parent = params.GetParent(); - if (parent) - parent->AddTransientChild(window_); - // SetAlwaysOnTop before SetParent so that always-on-top container is used. - SetAlwaysOnTop(params.keep_on_top); - window_->SetParent(NULL); - } - window_->set_ignore_events(!params.accept_events); - // TODO(beng): do this some other way. - delegate_->OnNativeWidgetSizeChanged(params.bounds.size()); - can_activate_ = params.can_activate; - DCHECK(GetWidget()->GetRootView()); - if (params.type != Widget::InitParams::TYPE_TOOLTIP && !params.child) { - views::TooltipManagerViews* manager = new views::TooltipManagerViews( - GetWidget()->GetRootView()); - tooltip_manager_.reset(manager); - } - drop_helper_.reset(new DropHelper(GetWidget()->GetRootView())); - if (params.type != Widget::InitParams::TYPE_TOOLTIP && - params.type != Widget::InitParams::TYPE_POPUP) { - window_->SetProperty(aura::kDragDropDelegateKey, - static_cast<aura::WindowDragDropDelegate*>(this)); - } -} - -NonClientFrameView* NativeWidgetAura::CreateNonClientFrameView() { - return NULL; -} - -void NativeWidgetAura::UpdateFrameAfterFrameChange() { - // We don't support changing the frame type. - NOTREACHED(); -} - -bool NativeWidgetAura::ShouldUseNativeFrame() const { - // There is only one frame type for aura. - return false; -} - -void NativeWidgetAura::FrameTypeChanged() { - // This is called when the Theme has changed; forward the event to the root - // widget. - GetWidget()->ThemeChanged(); - GetWidget()->GetRootView()->SchedulePaint(); -} - -Widget* NativeWidgetAura::GetWidget() { - return delegate_->AsWidget(); -} - -const Widget* NativeWidgetAura::GetWidget() const { - return delegate_->AsWidget(); -} - -gfx::NativeView NativeWidgetAura::GetNativeView() const { - return window_; -} - -gfx::NativeWindow NativeWidgetAura::GetNativeWindow() const { - return window_; -} - -Widget* NativeWidgetAura::GetTopLevelWidget() { - NativeWidgetPrivate* native_widget = GetTopLevelNativeWidget(GetNativeView()); - return native_widget ? native_widget->GetWidget() : NULL; -} - -const ui::Compositor* NativeWidgetAura::GetCompositor() const { - return window_->layer()->GetCompositor(); -} - -ui::Compositor* NativeWidgetAura::GetCompositor() { - return window_->layer()->GetCompositor(); -} - -void NativeWidgetAura::CalculateOffsetToAncestorWithLayer( - gfx::Point* offset, - ui::Layer** layer_parent) { - if (layer_parent) - *layer_parent = window_->layer(); -} - -void NativeWidgetAura::ReorderLayers() { -} - -void NativeWidgetAura::ViewRemoved(View* view) { - // DropTarget stuff. Most likely http://crbug.com/97845 - //NOTIMPLEMENTED(); -} - -void NativeWidgetAura::SetNativeWindowProperty(const char* name, void* value) { - if (window_) - window_->SetProperty(name, value); -} - -void* NativeWidgetAura::GetNativeWindowProperty(const char* name) const { - return window_ ? window_->GetProperty(name) : NULL; -} - -TooltipManager* NativeWidgetAura::GetTooltipManager() const { - return tooltip_manager_.get(); -} - -bool NativeWidgetAura::IsScreenReaderActive() const { - // http://crbug.com/102570 - //NOTIMPLEMENTED(); - return false; -} - -void NativeWidgetAura::SendNativeAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type) { - // http://crbug.com/102570 - //NOTIMPLEMENTED(); -} - -void NativeWidgetAura::SetMouseCapture() { - window_->SetCapture(); -} - -void NativeWidgetAura::ReleaseMouseCapture() { - window_->ReleaseCapture(); -} - -bool NativeWidgetAura::HasMouseCapture() const { - return window_->HasCapture(); -} - -InputMethod* NativeWidgetAura::CreateInputMethod() { -#if defined(HAVE_IBUS) - InputMethod* input_method = new InputMethodIBus(this); -#else - InputMethod* input_method = new MockInputMethod(this); -#endif - input_method->Init(GetWidget()); - return input_method; -} - -void NativeWidgetAura::CenterWindow(const gfx::Size& size) { - const gfx::Rect parent_bounds = window_->parent()->bounds(); - window_->SetBounds(gfx::Rect((parent_bounds.width() - size.width())/2, - (parent_bounds.height() - size.height())/2, - size.width(), - size.height())); -} - -void NativeWidgetAura::GetWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* show_state) const { - *bounds = window_->GetTargetBounds(); - *show_state = static_cast<ui::WindowShowState>( - window_->GetIntProperty(aura::kShowStateKey)); -} - -void NativeWidgetAura::SetWindowTitle(const string16& title) { - window_->set_title(title); -} - -void NativeWidgetAura::SetWindowIcons(const SkBitmap& window_icon, - const SkBitmap& app_icon) { - // Aura doesn't have window icons. -} - -void NativeWidgetAura::SetAccessibleName(const string16& name) { - // http://crbug.com/102570 - //NOTIMPLEMENTED(); -} - -void NativeWidgetAura::SetAccessibleRole(ui::AccessibilityTypes::Role role) { - // http://crbug.com/102570 - //NOTIMPLEMENTED(); -} - -void NativeWidgetAura::SetAccessibleState(ui::AccessibilityTypes::State state) { - // http://crbug.com/102570 - //NOTIMPLEMENTED(); -} - -void NativeWidgetAura::BecomeModal() { - window_->SetIntProperty(aura::kModalKey, 1); -} - -gfx::Rect NativeWidgetAura::GetWindowScreenBounds() const { - return window_->GetScreenBounds(); -} - -gfx::Rect NativeWidgetAura::GetClientAreaScreenBounds() const { - // In Aura, the entire window is the client area. - return window_->GetScreenBounds(); -} - -gfx::Rect NativeWidgetAura::GetRestoredBounds() const { - gfx::Rect* restore_bounds = reinterpret_cast<gfx::Rect*>( - window_->GetProperty(aura::kRestoreBoundsKey)); - return restore_bounds ? *restore_bounds : window_->bounds(); -} - -void NativeWidgetAura::SetBounds(const gfx::Rect& bounds) { - window_->SetBounds(bounds); -} - -void NativeWidgetAura::SetSize(const gfx::Size& size) { - window_->SetBounds(gfx::Rect(window_->bounds().origin(), size)); -} - -void NativeWidgetAura::MoveAbove(gfx::NativeView native_view) { - if (window_->parent() && window_->parent() == native_view->parent()) - window_->parent()->MoveChildAbove(window_, native_view); -} - -void NativeWidgetAura::MoveToTop() { - window_->parent()->MoveChildToFront(window_); -} - -void NativeWidgetAura::SetShape(gfx::NativeRegion region) { - // No need for this. -} - -void NativeWidgetAura::Close() { - // |window_| may already be deleted by parent window. This can happen - // when this widget is child widget or has transient parent - // and ownership is WIDGET_OWNS_NATIVE_WIDGET. - DCHECK(window_ || - ownership_ == Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET); - if (window_) - Hide(); - - window_->SetIntProperty(aura::kModalKey, 0); - - if (!close_widget_factory_.HasWeakPtrs()) { - MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&NativeWidgetAura::CloseNow, - close_widget_factory_.GetWeakPtr())); - } -} - -void NativeWidgetAura::CloseNow() { - delete window_; -} - -void NativeWidgetAura::EnableClose(bool enable) { - // http://crbug.com/102581 - NOTIMPLEMENTED(); -} - -void NativeWidgetAura::Show() { - ShowWithWindowState(ui::SHOW_STATE_INACTIVE); -} - -void NativeWidgetAura::Hide() { - window_->Hide(); -} - -void NativeWidgetAura::ShowMaximizedWithBounds( - const gfx::Rect& restored_bounds) { - window_->SetBounds(restored_bounds); - ShowWithWindowState(ui::SHOW_STATE_MAXIMIZED); -} - -void NativeWidgetAura::ShowWithWindowState(ui::WindowShowState state) { - if (state == ui::SHOW_STATE_MAXIMIZED || - state == ui::SHOW_STATE_FULLSCREEN) { - window_->SetIntProperty(aura::kShowStateKey, state); - } - window_->Show(); - if (can_activate_ && (state != ui::SHOW_STATE_INACTIVE || - !GetWidget()->SetInitialFocus())) { - window_->Activate(); - } -} - -bool NativeWidgetAura::IsVisible() const { - return window_->IsVisible(); -} - -void NativeWidgetAura::Activate() { - window_->Activate(); -} - -void NativeWidgetAura::Deactivate() { - window_->Deactivate(); -} - -bool NativeWidgetAura::IsActive() const { - return aura::Desktop::GetInstance()->active_window() == window_; -} - -void NativeWidgetAura::SetAlwaysOnTop(bool on_top) { - window_->SetIntProperty(aura::kAlwaysOnTopKey, on_top); -} - -void NativeWidgetAura::Maximize() { - window_->SetIntProperty(aura::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); -} - -void NativeWidgetAura::Minimize() { - // No minimized window for aura. crbug.com/104571. - NOTREACHED(); -} - -bool NativeWidgetAura::IsMaximized() const { - return window_->GetIntProperty(aura::kShowStateKey) == - ui::SHOW_STATE_MAXIMIZED; -} - -bool NativeWidgetAura::IsMinimized() const { - return window_->GetIntProperty(aura::kShowStateKey) == - ui::SHOW_STATE_MINIMIZED; -} - -void NativeWidgetAura::Restore() { - window_->SetIntProperty(aura::kShowStateKey, ui::SHOW_STATE_NORMAL); -} - -void NativeWidgetAura::SetFullscreen(bool fullscreen) { - window_->SetIntProperty( - aura::kShowStateKey, - fullscreen ? ui::SHOW_STATE_FULLSCREEN : ui::SHOW_STATE_NORMAL); -} - -bool NativeWidgetAura::IsFullscreen() const { - return window_->GetIntProperty(aura::kShowStateKey) == - ui::SHOW_STATE_FULLSCREEN; -} - -void NativeWidgetAura::SetOpacity(unsigned char opacity) { - window_->layer()->SetOpacity(opacity / 255.0); -} - -void NativeWidgetAura::SetUseDragFrame(bool use_drag_frame) { - NOTIMPLEMENTED(); -} - -bool NativeWidgetAura::IsAccessibleWidget() const { - // http://crbug.com/102570 - //NOTIMPLEMENTED(); - return false; -} - -void NativeWidgetAura::RunShellDrag(View* view, - const ui::OSExchangeData& data, - int operation) { - aura::DragDropClient* client = static_cast<aura::DragDropClient*>( - aura::Desktop::GetInstance()->GetProperty( - aura::kDesktopDragDropClientKey)); - if (client) - client->StartDragAndDrop(data, operation); -} - -void NativeWidgetAura::SchedulePaintInRect(const gfx::Rect& rect) { - if (window_) - window_->SchedulePaintInRect(rect); -} - -void NativeWidgetAura::SetCursor(gfx::NativeCursor cursor) { - cursor_ = cursor; - aura::Desktop::GetInstance()->SetCursor(cursor); -} - -void NativeWidgetAura::ClearNativeFocus() { - if (window_ && window_->GetFocusManager()) - window_->GetFocusManager()->SetFocusedWindow(window_); -} - -void NativeWidgetAura::FocusNativeView(gfx::NativeView native_view) { - // http://crbug.com/102572 - NOTIMPLEMENTED(); -} - -bool NativeWidgetAura::ConvertPointFromAncestor(const Widget* ancestor, - gfx::Point* point) const { - // http://crbug.com/102573 - NOTIMPLEMENTED(); - return false; -} - -gfx::Rect NativeWidgetAura::GetWorkAreaBoundsInScreen() const { - return gfx::Screen::GetMonitorWorkAreaNearestWindow(GetNativeView()); -} - -void NativeWidgetAura::SetInactiveRenderingDisabled(bool value) { - if (!value) - desktop_observer_.reset(); - else - desktop_observer_.reset(new DesktopObserverImpl(this)); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetAura, views::InputMethodDelegate implementation: - -void NativeWidgetAura::DispatchKeyEventPostIME(const KeyEvent& key) { - if (delegate_->OnKeyEvent(key)) - return; - if (key.type() == ui::ET_KEY_PRESSED && GetWidget()->GetFocusManager()) - GetWidget()->GetFocusManager()->OnKeyEvent(key); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetAura, aura::WindowDelegate implementation: - -void NativeWidgetAura::OnBoundsChanging(gfx::Rect* new_bounds) { - // Enforces a minimum size. - const gfx::Size& min_size = delegate_->GetMinimumSize(); - new_bounds->set_width(std::max(min_size.width(), new_bounds->width())); - new_bounds->set_height(std::max(min_size.height(), new_bounds->height())); -} - -void NativeWidgetAura::OnBoundsChanged(const gfx::Rect& old_bounds, - const gfx::Rect& new_bounds) { - if (old_bounds.origin() != new_bounds.origin()) - GetWidget()->widget_delegate()->OnWidgetMove(); - if (old_bounds.size() != new_bounds.size()) - delegate_->OnNativeWidgetSizeChanged(new_bounds.size()); -} - -void NativeWidgetAura::OnFocus() { - Widget* widget = GetWidget(); - if (widget->is_top_level()) { - InputMethod* input_method = widget->GetInputMethod(); - input_method->OnFocus(); - // See description of got_initial_focus_in_ for details on this. - // TODO(mazda): Investigate this is actually necessary. - // widget->GetFocusManager()->RestoreFocusedView(); - } - delegate_->OnNativeFocus(window_); -} - -void NativeWidgetAura::OnBlur() { - Widget* widget = GetWidget(); - if (widget->is_top_level()) { - InputMethod* input_method = widget->GetInputMethod(); - input_method->OnBlur(); - widget->GetFocusManager()->StoreFocusedView(); - } - delegate_->OnNativeBlur(NULL); -} - -bool NativeWidgetAura::OnKeyEvent(aura::KeyEvent* event) { - // TODO(beng): Need an InputMethodAura to properly handle character events. - // Right now, we just skip these. - if (event->is_char()) - return false; - - DCHECK(window_->IsVisible()); - InputMethod* input_method = GetWidget()->GetInputMethod(); - DCHECK(input_method); - // TODO(oshima): DispatchKeyEvent should return bool? - KeyEvent views_event(event); - input_method->DispatchKeyEvent(views_event); - return true; -} - -gfx::NativeCursor NativeWidgetAura::GetCursor(const gfx::Point& point) { - return cursor_; -} - -int NativeWidgetAura::GetNonClientComponent(const gfx::Point& point) const { - return delegate_->GetNonClientComponent(point); -} - -bool NativeWidgetAura::OnMouseEvent(aura::MouseEvent* event) { - DCHECK(window_->IsVisible()); - if (event->type() == ui::ET_MOUSEWHEEL) { - MouseWheelEvent wheel_event(event); - if (tooltip_manager_.get()) - tooltip_manager_->UpdateForMouseEvent(wheel_event); - return delegate_->OnMouseEvent(wheel_event); - } - MouseEvent mouse_event(event); - if (tooltip_manager_.get()) - tooltip_manager_->UpdateForMouseEvent(mouse_event); - return delegate_->OnMouseEvent(mouse_event); -} - -ui::TouchStatus NativeWidgetAura::OnTouchEvent(aura::TouchEvent* event) { - DCHECK(window_->IsVisible()); - TouchEvent touch_event(event); - return delegate_->OnTouchEvent(touch_event); -} - -bool NativeWidgetAura::ShouldActivate(aura::Event* event) { - return can_activate_; -} - -void NativeWidgetAura::OnActivated() { - delegate_->OnNativeWidgetActivationChanged(true); - if (IsVisible() && GetWidget()->non_client_view()) - GetWidget()->non_client_view()->SchedulePaint(); -} - -void NativeWidgetAura::OnLostActive() { - delegate_->OnNativeWidgetActivationChanged(false); - if (IsVisible() && GetWidget()->non_client_view()) - GetWidget()->non_client_view()->SchedulePaint(); -} - -void NativeWidgetAura::OnCaptureLost() { - delegate_->OnMouseCaptureLost(); -} - -void NativeWidgetAura::OnPaint(gfx::Canvas* canvas) { - delegate_->OnNativeWidgetPaint(canvas); -} - -void NativeWidgetAura::OnWindowDestroying() { - window_->SetProperty(aura::kDragDropDelegateKey, NULL); - delegate_->OnNativeWidgetDestroying(); - - // If the aura::Window is destroyed, we can no longer show tooltips. - tooltip_manager_.reset(); -} - -void NativeWidgetAura::OnWindowDestroyed() { - window_ = NULL; - tooltip_manager_.reset(); - delegate_->OnNativeWidgetDestroyed(); - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) - delete this; -} - -void NativeWidgetAura::OnWindowVisibilityChanged(bool visible) { - delegate_->OnNativeWidgetVisibilityChanged(visible); -} - -bool NativeWidgetAura::CanDrop(const aura::DropTargetEvent& event) { - DCHECK(drop_helper_.get() != NULL); - View* view = drop_helper_->target_view(); - if (view) - return view->CanDrop(event.data()); - return false; -} - -void NativeWidgetAura::OnDragEntered(const aura::DropTargetEvent& event) { - DCHECK(drop_helper_.get() != NULL); - drop_helper_->OnDragOver(event.data(), event.location(), - event.source_operations()); -} - -int NativeWidgetAura::OnDragUpdated(const aura::DropTargetEvent& event) { - DCHECK(drop_helper_.get() != NULL); - return drop_helper_->OnDragOver(event.data(), event.location(), - event.source_operations()); -} - -void NativeWidgetAura::OnDragExited() { - DCHECK(drop_helper_.get() != NULL); - drop_helper_->OnDragExit(); -} - -int NativeWidgetAura::OnPerformDrop(const aura::DropTargetEvent& event) { - DCHECK(drop_helper_.get() != NULL); - return drop_helper_->OnDrop(event.data(), event.location(), - event.source_operations()); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, public: - -// static -void Widget::NotifyLocaleChanged() { - // http://crbug.com/102574 - NOTIMPLEMENTED(); -} - -// static -void Widget::CloseAllSecondaryWidgets() { - // http://crbug.com/102575 - NOTIMPLEMENTED(); -} - -bool Widget::ConvertRect(const Widget* source, - const Widget* target, - gfx::Rect* rect) { - return false; -} - -namespace internal { - -//////////////////////////////////////////////////////////////////////////////// -// internal::NativeWidgetPrivate, public: - -// static -NativeWidgetPrivate* NativeWidgetPrivate::CreateNativeWidget( - internal::NativeWidgetDelegate* delegate) { - return new NativeWidgetAura(delegate); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeView( - gfx::NativeView native_view) { - return reinterpret_cast<NativeWidgetAura*>(native_view->user_data()); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeWindow( - gfx::NativeWindow native_window) { - return reinterpret_cast<NativeWidgetAura*>(native_window->user_data()); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetTopLevelNativeWidget( - gfx::NativeView native_view) { - aura::Window* window = native_view; - NativeWidgetPrivate* top_level_native_widget = NULL; - while (window) { - NativeWidgetPrivate* native_widget = GetNativeWidgetForNativeView(window); - if (native_widget) - top_level_native_widget = native_widget; - window = window->parent(); - } - return top_level_native_widget; -} - -// static -void NativeWidgetPrivate::GetAllChildWidgets(gfx::NativeView native_view, - Widget::Widgets* children) { - { - // Code expects widget for |native_view| to be added to |children|. - NativeWidgetAura* native_widget = static_cast<NativeWidgetAura*>( - GetNativeWidgetForNativeView(native_view)); - if (native_widget->GetWidget()) - children->insert(native_widget->GetWidget()); - } - - const aura::Window::Windows& child_windows = native_view->children(); - for (aura::Window::Windows::const_iterator i = child_windows.begin(); - i != child_windows.end(); ++i) { - NativeWidgetAura* native_widget = - static_cast<NativeWidgetAura*>(GetNativeWidgetForNativeView(*i)); - if (native_widget) - children->insert(native_widget->GetWidget()); - } -} - -// static -void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view, - gfx::NativeView new_parent) { - // http://crbug.com/102576 - NOTIMPLEMENTED(); -} - -// static -bool NativeWidgetPrivate::IsMouseButtonDown() { - return aura::Desktop::GetInstance()->IsMouseButtonDown(); -} - -} // namespace internal -} // namespace views diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h deleted file mode 100644 index 90d0562..0000000 --- a/ui/views/widget/native_widget_aura.h +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_AURA_H_ -#define UI_VIEWS_WIDGET_NATIVE_WIDGET_AURA_H_ -#pragma once - -#include "base/memory/scoped_vector.h" -#include "base/memory/weak_ptr.h" -#include "ui/aura/client/window_drag_drop_delegate.h" -#include "ui/aura/window_delegate.h" -#include "ui/base/events.h" -#include "ui/views/widget/native_widget_private.h" -#include "views/views_export.h" - -namespace aura { -class Window; -} -namespace gfx { -class Font; -} - -namespace views { - -class DropHelper; -class TooltipManagerViews; - -class VIEWS_EXPORT NativeWidgetAura : public internal::NativeWidgetPrivate, - public aura::WindowDelegate, - public aura::WindowDragDropDelegate { - public: - explicit NativeWidgetAura(internal::NativeWidgetDelegate* delegate); - virtual ~NativeWidgetAura(); - - // TODO(beng): Find a better place for this, and the similar method on - // NativeWidgetWin. - static gfx::Font GetWindowTitleFont(); - - // Overridden from internal::NativeWidgetPrivate: - virtual void InitNativeWidget(const Widget::InitParams& params) OVERRIDE; - virtual NonClientFrameView* CreateNonClientFrameView() OVERRIDE; - virtual void UpdateFrameAfterFrameChange() OVERRIDE; - virtual bool ShouldUseNativeFrame() const OVERRIDE; - virtual void FrameTypeChanged() OVERRIDE; - virtual Widget* GetWidget() OVERRIDE; - virtual const Widget* GetWidget() const OVERRIDE; - virtual gfx::NativeView GetNativeView() const OVERRIDE; - virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE; - virtual Widget* GetTopLevelWidget() OVERRIDE; - virtual const ui::Compositor* GetCompositor() const OVERRIDE; - virtual ui::Compositor* GetCompositor() OVERRIDE; - virtual void CalculateOffsetToAncestorWithLayer( - gfx::Point* offset, - ui::Layer** layer_parent) OVERRIDE; - virtual void ReorderLayers() OVERRIDE; - virtual void ViewRemoved(View* view) OVERRIDE; - virtual void SetNativeWindowProperty(const char* name, void* value) OVERRIDE; - virtual void* GetNativeWindowProperty(const char* name) const OVERRIDE; - virtual TooltipManager* GetTooltipManager() const OVERRIDE; - virtual bool IsScreenReaderActive() const OVERRIDE; - virtual void SendNativeAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type) OVERRIDE; - virtual void SetMouseCapture() OVERRIDE; - virtual void ReleaseMouseCapture() OVERRIDE; - virtual bool HasMouseCapture() const OVERRIDE; - virtual InputMethod* CreateInputMethod() OVERRIDE; - virtual void CenterWindow(const gfx::Size& size) OVERRIDE; - virtual void GetWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* maximized) const OVERRIDE; - virtual void SetWindowTitle(const string16& title) OVERRIDE; - virtual void SetWindowIcons(const SkBitmap& window_icon, - const SkBitmap& app_icon) OVERRIDE; - virtual void SetAccessibleName(const string16& name) OVERRIDE; - virtual void SetAccessibleRole(ui::AccessibilityTypes::Role role) OVERRIDE; - virtual void SetAccessibleState(ui::AccessibilityTypes::State state) OVERRIDE; - virtual void BecomeModal() OVERRIDE; - virtual gfx::Rect GetWindowScreenBounds() const OVERRIDE; - virtual gfx::Rect GetClientAreaScreenBounds() const OVERRIDE; - virtual gfx::Rect GetRestoredBounds() const OVERRIDE; - virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; - virtual void SetSize(const gfx::Size& size) OVERRIDE; - virtual void MoveAbove(gfx::NativeView native_view) OVERRIDE; - virtual void MoveToTop() OVERRIDE; - virtual void SetShape(gfx::NativeRegion shape) OVERRIDE; - virtual void Close() OVERRIDE; - virtual void CloseNow() OVERRIDE; - virtual void EnableClose(bool enable) OVERRIDE; - virtual void Show() OVERRIDE; - virtual void Hide() OVERRIDE; - virtual void ShowMaximizedWithBounds( - const gfx::Rect& restored_bounds) OVERRIDE; - virtual void ShowWithWindowState(ui::WindowShowState state) OVERRIDE; - virtual bool IsVisible() const OVERRIDE; - virtual void Activate() OVERRIDE; - virtual void Deactivate() OVERRIDE; - virtual bool IsActive() const OVERRIDE; - virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; - virtual void Maximize() OVERRIDE; - virtual void Minimize() OVERRIDE; - virtual bool IsMaximized() const OVERRIDE; - virtual bool IsMinimized() const OVERRIDE; - virtual void Restore() OVERRIDE; - virtual void SetFullscreen(bool fullscreen) OVERRIDE; - virtual bool IsFullscreen() const OVERRIDE; - virtual void SetOpacity(unsigned char opacity) OVERRIDE; - virtual void SetUseDragFrame(bool use_drag_frame) OVERRIDE; - virtual bool IsAccessibleWidget() const OVERRIDE; - virtual void RunShellDrag(View* view, - const ui::OSExchangeData& data, - int operation) OVERRIDE; - virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE; - virtual void SetCursor(gfx::NativeCursor cursor) OVERRIDE; - virtual void ClearNativeFocus() OVERRIDE; - virtual void FocusNativeView(gfx::NativeView native_view) OVERRIDE; - virtual bool ConvertPointFromAncestor( - const Widget* ancestor, gfx::Point* point) const OVERRIDE; - virtual gfx::Rect GetWorkAreaBoundsInScreen() const OVERRIDE; - virtual void SetInactiveRenderingDisabled(bool value) OVERRIDE; - - // Overridden from views::InputMethodDelegate: - virtual void DispatchKeyEventPostIME(const KeyEvent& key) OVERRIDE; - - // Overridden from aura::WindowDelegate: - virtual void OnBoundsChanging(gfx::Rect* new_bounds) OVERRIDE; - virtual void OnBoundsChanged(const gfx::Rect& old_bounds, - const gfx::Rect& new_bounds) OVERRIDE; - virtual void OnFocus() OVERRIDE; - virtual void OnBlur() OVERRIDE; - virtual bool OnKeyEvent(aura::KeyEvent* event) OVERRIDE; - virtual gfx::NativeCursor GetCursor(const gfx::Point& point) OVERRIDE; - virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE; - virtual bool OnMouseEvent(aura::MouseEvent* event) OVERRIDE; - virtual ui::TouchStatus OnTouchEvent(aura::TouchEvent* event) OVERRIDE; - virtual bool ShouldActivate(aura::Event* event) OVERRIDE; - virtual void OnActivated() OVERRIDE; - virtual void OnLostActive() OVERRIDE; - virtual void OnCaptureLost() OVERRIDE; - virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; - virtual void OnWindowDestroying() OVERRIDE; - virtual void OnWindowDestroyed() OVERRIDE; - virtual void OnWindowVisibilityChanged(bool visible) OVERRIDE; - - // Overridden from aura::WindowDragDropDelegate: - virtual bool CanDrop(const aura::DropTargetEvent& event) OVERRIDE; - virtual void OnDragEntered(const aura::DropTargetEvent& event) OVERRIDE; - virtual int OnDragUpdated(const aura::DropTargetEvent& event) OVERRIDE; - virtual void OnDragExited() OVERRIDE; - virtual int OnPerformDrop(const aura::DropTargetEvent& event) OVERRIDE; - - protected: - internal::NativeWidgetDelegate* delegate() { return delegate_; } - - private: - class DesktopObserverImpl; - - internal::NativeWidgetDelegate* delegate_; - - aura::Window* window_; - - // See class documentation for Widget in widget.h for a note about ownership. - Widget::InitParams::Ownership ownership_; - - // The following factory is used for calls to close the NativeWidgetAura - // instance. - base::WeakPtrFactory<NativeWidgetAura> close_widget_factory_; - - // Can we be made active? - bool can_activate_; - - gfx::NativeCursor cursor_; - - scoped_ptr<TooltipManagerViews> tooltip_manager_; - - scoped_ptr<DesktopObserverImpl> desktop_observer_; - - scoped_ptr<DropHelper> drop_helper_; - - DISALLOW_COPY_AND_ASSIGN(NativeWidgetAura); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_NATIVE_WIDGET_AURA_H_ diff --git a/ui/views/widget/native_widget_delegate.h b/ui/views/widget/native_widget_delegate.h deleted file mode 100644 index f8507dc..0000000 --- a/ui/views/widget/native_widget_delegate.h +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_DELEGATE_H_ -#define UI_VIEWS_WIDGET_NATIVE_WIDGET_DELEGATE_H_ -#pragma once - -#include "ui/base/events.h" -#include "ui/gfx/native_widget_types.h" -#include "views/views_export.h" - -#if defined(TOUCH_UI) -#include "ui/base/events.h" -#endif - -namespace gfx { -class Canvas; -class Point; -class Rect; -class Size; -} - -namespace views { -class InputMethod; -class KeyEvent; -class MouseEvent; -class TouchEvent; - -namespace internal { - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetDelegate -// -// An interface implemented by the object that handles events sent by a -// NativeWidget implementation. -// -class VIEWS_EXPORT NativeWidgetDelegate { - public: - virtual ~NativeWidgetDelegate() {} - - // Returns true if the window is modal. - virtual bool IsModal() const = 0; - - // Returns true if the window is a dialog box. - virtual bool IsDialogBox() const = 0; - - // Returns true if the window can be activated. - virtual bool CanActivate() const = 0; - - virtual bool IsInactiveRenderingDisabled() const = 0; - virtual void EnableInactiveRendering() = 0; - - // Called when the activation state of a window has changed. - virtual void OnNativeWidgetActivationChanged(bool active) = 0; - - // Called when native focus moves from one native view to another. - virtual void OnNativeFocus(gfx::NativeView focused_view) = 0; - virtual void OnNativeBlur(gfx::NativeView focused_view) = 0; - - // Called when the window is shown/hidden. - virtual void OnNativeWidgetVisibilityChanged(bool visible) = 0; - - // Called when the native widget is created. - virtual void OnNativeWidgetCreated() = 0; - - // Called just before the native widget is destroyed. This is the delegate's - // last chance to do anything with the native widget handle. - virtual void OnNativeWidgetDestroying() = 0; - - // Called just after the native widget is destroyed. - virtual void OnNativeWidgetDestroyed() = 0; - - // Returns the smallest size the window can be resized to by the user. - virtual gfx::Size GetMinimumSize() = 0; - - // Called when the NativeWidget changed size to |new_size|. - virtual void OnNativeWidgetSizeChanged(const gfx::Size& new_size) = 0; - - // Called when the user begins/ends to change the bounds of the window. - virtual void OnNativeWidgetBeginUserBoundsChange() = 0; - virtual void OnNativeWidgetEndUserBoundsChange() = 0; - - // Returns true if the delegate has a FocusManager. - virtual bool HasFocusManager() const = 0; - - // Paints the widget using acceleration. If the widget is not using - // accelerated painting this returns false and does nothing. - virtual bool OnNativeWidgetPaintAccelerated( - const gfx::Rect& dirty_region) = 0; - - // Paints the rootview in the canvas. This will also refresh the compositor - // tree if necessary when accelerated painting is enabled. - virtual void OnNativeWidgetPaint(gfx::Canvas* canvas) = 0; - - // Returns the non-client component (see ui/base/hit_test.h) containing - // |point|, in client coordinates. - virtual int GetNonClientComponent(const gfx::Point& point) = 0; - - // Mouse and key event handlers. - virtual bool OnKeyEvent(const KeyEvent& event) = 0; - virtual bool OnMouseEvent(const MouseEvent& event) = 0; - virtual void OnMouseCaptureLost() = 0; - virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) = 0; - - // Runs the specified native command. Returns true if the command is handled. - virtual bool ExecuteCommand(int command_id) = 0; - - // Returns the input method of the widget this delegate is associated with. - // Note that this does not use the top level widget, so may return NULL - // if the widget doesn't have input method. - virtual InputMethod* GetInputMethodDirect() = 0; - - virtual Widget* AsWidget() = 0; - virtual const Widget* AsWidget() const = 0; -}; - -} // namespace internal -} // namespace views - -#endif // UI_VIEWS_WIDGET_NATIVE_WIDGET_DELEGATE_H_ diff --git a/ui/views/widget/native_widget_gtk.cc b/ui/views/widget/native_widget_gtk.cc deleted file mode 100644 index 8da0f51..0000000 --- a/ui/views/widget/native_widget_gtk.cc +++ /dev/null @@ -1,2317 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/native_widget_gtk.h" - -#include <X11/Xatom.h> -#include <X11/Xlib.h> -#include <X11/extensions/shape.h> -#include <gdk/gdk.h> -#include <gdk/gdkx.h> - -#include <set> -#include <vector> - -#include "base/auto_reset.h" -#include "base/bind.h" -#include "base/compiler_specific.h" -#include "base/message_loop.h" -#include "base/utf_string_conversions.h" -#include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/dragdrop/os_exchange_data_provider_gtk.h" -#include "ui/base/gtk/g_object_destructor_filo.h" -#include "ui/base/gtk/gtk_signal_registrar.h" -#include "ui/base/gtk/gtk_windowing.h" -#include "ui/base/gtk/scoped_handle_gtk.h" -#include "ui/base/hit_test.h" -#include "ui/base/x/x11_util.h" -#include "ui/gfx/canvas_skia_paint.h" -#include "ui/gfx/compositor/compositor.h" -#include "ui/gfx/gtk_util.h" -#include "ui/gfx/path.h" -#include "ui/gfx/screen.h" -#include "ui/views/bubble/bubble_delegate.h" -#include "ui/views/focus/view_storage.h" -#include "ui/views/ime/input_method_gtk.h" -#include "ui/views/widget/drop_target_gtk.h" -#include "ui/views/widget/drop_target_gtk.h" -#include "ui/views/widget/gtk_views_fixed.h" -#include "ui/views/widget/gtk_views_fixed.h" -#include "ui/views/widget/gtk_views_window.h" -#include "ui/views/widget/gtk_views_window.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/widget_delegate.h" -#include "ui/views/widget/widget_delegate.h" -#include "views/controls/textfield/native_textfield_views.h" -#include "views/views_delegate.h" - -#if defined(TOUCH_UI) -#include "ui/base/touch/touch_factory.h" -#include "ui/views/widget/tooltip_manager_views.h" -#else -#include "ui/views/widget/tooltip_manager_gtk.h" -#endif - -#if defined(HAVE_IBUS) -#include "ui/views/ime/input_method_ibus.h" -#endif - -using ui::OSExchangeData; -using ui::OSExchangeDataProviderGtk; -using ui::ActiveWindowWatcherX; - -namespace views { - -namespace { - -// Links the GtkWidget to its NativeWidget. -const char* const kNativeWidgetKey = "__VIEWS_NATIVE_WIDGET__"; - -// A g_object data key to associate a CompositePainter object to a GtkWidget. -const char* kCompositePainterKey = "__VIEWS_COMPOSITE_PAINTER__"; - -// A g_object data key to associate the flag whether or not the widget -// is composited to a GtkWidget. gtk_widget_is_composited simply tells -// if x11 supports composition and cannot be used to tell if given widget -// is composited. -const char* kCompositeEnabledKey = "__VIEWS_COMPOSITE_ENABLED__"; - -// A g_object data key to associate the expose handler id that is -// used to remove FREEZE_UPDATE property on the window. -const char* kExposeHandlerIdKey = "__VIEWS_EXPOSE_HANDLER_ID__"; - -// CompositePainter draws a composited child widgets image into its -// drawing area. This object is created at most once for a widget and kept -// until the widget is destroyed. -class CompositePainter { - public: - explicit CompositePainter(GtkWidget* parent) - : parent_object_(G_OBJECT(parent)) { - handler_id_ = g_signal_connect_after( - parent_object_, "expose_event", G_CALLBACK(OnCompositePaint), NULL); - } - - static void AddCompositePainter(GtkWidget* widget) { - CompositePainter* painter = static_cast<CompositePainter*>( - g_object_get_data(G_OBJECT(widget), kCompositePainterKey)); - if (!painter) { - g_object_set_data(G_OBJECT(widget), kCompositePainterKey, - new CompositePainter(widget)); - g_signal_connect(widget, "destroy", - G_CALLBACK(&DestroyPainter), NULL); - } - } - - // Set the composition flag. - static void SetComposited(GtkWidget* widget) { - g_object_set_data(G_OBJECT(widget), kCompositeEnabledKey, - const_cast<char*>("")); - } - - // Returns true if the |widget| is composited and ready to be drawn. - static bool IsComposited(GtkWidget* widget) { - return g_object_get_data(G_OBJECT(widget), kCompositeEnabledKey) != NULL; - } - - private: - virtual ~CompositePainter() {} - - // Composes a image from one child. - static void CompositeChildWidget(GtkWidget* child, gpointer data) { - GdkEventExpose* event = static_cast<GdkEventExpose*>(data); - GtkWidget* parent = gtk_widget_get_parent(child); - DCHECK(parent); - if (IsComposited(child)) { - cairo_t* cr = gdk_cairo_create(parent->window); - gdk_cairo_set_source_pixmap(cr, child->window, - child->allocation.x, - child->allocation.y); - GdkRegion* region = gdk_region_rectangle(&child->allocation); - gdk_region_intersect(region, event->region); - gdk_cairo_region(cr, region); - cairo_clip(cr); - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - cairo_paint(cr); - cairo_destroy(cr); - } - } - - // Expose-event handler that compose & draws children's image into - // the |parent|'s drawing area. - static gboolean OnCompositePaint(GtkWidget* parent, GdkEventExpose* event) { - gtk_container_foreach(GTK_CONTAINER(parent), - CompositeChildWidget, - event); - return false; - } - - static void DestroyPainter(GtkWidget* object) { - CompositePainter* painter = reinterpret_cast<CompositePainter*>( - g_object_get_data(G_OBJECT(object), kCompositePainterKey)); - DCHECK(painter); - delete painter; - } - - GObject* parent_object_; - gulong handler_id_; - - DISALLOW_COPY_AND_ASSIGN(CompositePainter); -}; - -void EnumerateChildWidgetsForNativeWidgets(GtkWidget* child_widget, - gpointer param) { - // Walk child widgets, if necessary. - if (GTK_IS_CONTAINER(child_widget)) { - gtk_container_foreach(GTK_CONTAINER(child_widget), - EnumerateChildWidgetsForNativeWidgets, - param); - } - - Widget* widget = Widget::GetWidgetForNativeView(child_widget); - if (widget) { - Widget::Widgets* widgets = reinterpret_cast<Widget::Widgets*>(param); - widgets->insert(widget); - } -} - -void RemoveExposeHandlerIfExists(GtkWidget* widget) { - gulong id = reinterpret_cast<gulong>(g_object_get_data(G_OBJECT(widget), - kExposeHandlerIdKey)); - if (id) { - g_signal_handler_disconnect(G_OBJECT(widget), id); - g_object_set_data(G_OBJECT(widget), kExposeHandlerIdKey, 0); - } -} - -GtkWindowType WindowTypeToGtkWindowType(Widget::InitParams::Type type) { - switch (type) { - case Widget::InitParams::TYPE_BUBBLE: - case Widget::InitParams::TYPE_WINDOW: - case Widget::InitParams::TYPE_WINDOW_FRAMELESS: - return GTK_WINDOW_TOPLEVEL; - default: - return GTK_WINDOW_POPUP; - } - NOTREACHED(); - return GTK_WINDOW_TOPLEVEL; -} - -// Converts a Windows-style hit test result code into a GDK window edge. -GdkWindowEdge HitTestCodeToGDKWindowEdge(int hittest_code) { - switch (hittest_code) { - case HTBOTTOM: - return GDK_WINDOW_EDGE_SOUTH; - case HTBOTTOMLEFT: - return GDK_WINDOW_EDGE_SOUTH_WEST; - case HTBOTTOMRIGHT: - case HTGROWBOX: - return GDK_WINDOW_EDGE_SOUTH_EAST; - case HTLEFT: - return GDK_WINDOW_EDGE_WEST; - case HTRIGHT: - return GDK_WINDOW_EDGE_EAST; - case HTTOP: - return GDK_WINDOW_EDGE_NORTH; - case HTTOPLEFT: - return GDK_WINDOW_EDGE_NORTH_WEST; - case HTTOPRIGHT: - return GDK_WINDOW_EDGE_NORTH_EAST; - default: - NOTREACHED(); - break; - } - // Default to something defaultish. - return HitTestCodeToGDKWindowEdge(HTGROWBOX); -} - -// Converts a Windows-style hit test result code into a GDK cursor type. -GdkCursorType HitTestCodeToGdkCursorType(int hittest_code) { - switch (hittest_code) { - case HTBOTTOM: - return GDK_BOTTOM_SIDE; - case HTBOTTOMLEFT: - return GDK_BOTTOM_LEFT_CORNER; - case HTBOTTOMRIGHT: - case HTGROWBOX: - return GDK_BOTTOM_RIGHT_CORNER; - case HTLEFT: - return GDK_LEFT_SIDE; - case HTRIGHT: - return GDK_RIGHT_SIDE; - case HTTOP: - return GDK_TOP_SIDE; - case HTTOPLEFT: - return GDK_TOP_LEFT_CORNER; - case HTTOPRIGHT: - return GDK_TOP_RIGHT_CORNER; - default: - break; - } - // Default to something defaultish. - return GDK_LEFT_PTR; -} - -} // namespace - -// During drag and drop GTK sends a drag-leave during a drop. This means we -// have no way to tell the difference between a normal drag leave and a drop. -// To work around that we listen for DROP_START, then ignore the subsequent -// drag-leave that GTK generates. -class NativeWidgetGtk::DropObserver : public MessageLoopForUI::Observer { - public: - DropObserver() {} - - static DropObserver* GetInstance() { - return Singleton<DropObserver>::get(); - } -#if defined(TOUCH_UI) - virtual base::EventStatus WillProcessEvent( - const base::NativeEvent& event) OVERRIDE { - return base::EVENT_CONTINUE; - } - - virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE { - } -#else - virtual void WillProcessEvent(GdkEvent* event) { - if (event->type == GDK_DROP_START) { - NativeWidgetGtk* widget = GetNativeWidgetGtkForEvent(event); - if (widget) - widget->ignore_drag_leave_ = true; - } - } - - virtual void DidProcessEvent(GdkEvent* event) { - } -#endif - - private: - NativeWidgetGtk* GetNativeWidgetGtkForEvent(GdkEvent* event) { - GtkWidget* gtk_widget = gtk_get_event_widget(event); - if (!gtk_widget) - return NULL; - - return static_cast<NativeWidgetGtk*>( - internal::NativeWidgetPrivate::GetNativeWidgetForNativeView( - gtk_widget)); - } - - DISALLOW_COPY_AND_ASSIGN(DropObserver); -}; - -// Returns the position of a widget on screen. -static void GetWidgetPositionOnScreen(GtkWidget* widget, int* x, int *y) { - // First get the root window. - GtkWidget* root = widget; - while (root && !GTK_IS_WINDOW(root)) { - root = gtk_widget_get_parent(root); - } - if (!root) { - // If root is null we're not parented. Return 0x0 and assume the caller will - // query again when we're parented. - *x = *y = 0; - return; - } - // Translate the coordinate from widget to root window. - gtk_widget_translate_coordinates(widget, root, 0, 0, x, y); - // Then adjust the position with the position of the root window. - int window_x, window_y; - gtk_window_get_position(GTK_WINDOW(root), &window_x, &window_y); - *x += window_x; - *y += window_y; -} - -// "expose-event" handler of drag icon widget that renders drag image pixbuf. -static gboolean DragIconWidgetPaint(GtkWidget* widget, - GdkEventExpose* event, - gpointer data) { - GdkPixbuf* pixbuf = reinterpret_cast<GdkPixbuf*>(data); - - cairo_t* cr = gdk_cairo_create(widget->window); - - gdk_cairo_region(cr, event->region); - cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); - gdk_cairo_set_source_pixbuf(cr, pixbuf, 0.0, 0.0); - cairo_paint(cr); - - cairo_destroy(cr); - return true; -} - -// Creates a drag icon widget that draws drag_image. -static GtkWidget* CreateDragIconWidget(GdkPixbuf* drag_image) { - GdkColormap* rgba_colormap = - gdk_screen_get_rgba_colormap(gdk_screen_get_default()); - if (!rgba_colormap) - return NULL; - - GtkWidget* drag_widget = gtk_window_new(GTK_WINDOW_POPUP); - - gtk_widget_set_colormap(drag_widget, rgba_colormap); - gtk_widget_set_app_paintable(drag_widget, true); - gtk_widget_set_size_request(drag_widget, - gdk_pixbuf_get_width(drag_image), - gdk_pixbuf_get_height(drag_image)); - - g_signal_connect(G_OBJECT(drag_widget), "expose-event", - G_CALLBACK(&DragIconWidgetPaint), drag_image); - return drag_widget; -} - -// static -GtkWidget* NativeWidgetGtk::null_parent_ = NULL; - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetGtk, public: - -NativeWidgetGtk::NativeWidgetGtk(internal::NativeWidgetDelegate* delegate) - : delegate_(delegate), - widget_(NULL), - window_contents_(NULL), - child_(false), - ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)), - ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), - transparent_(false), - ignore_events_(false), - ignore_drag_leave_(false), - opacity_(255), - drag_data_(NULL), - window_state_(GDK_WINDOW_STATE_WITHDRAWN), - is_active_(false), - transient_to_parent_(false), - got_initial_focus_in_(false), - has_focus_(false), - always_on_top_(false), - is_double_buffered_(false), - should_handle_menu_key_release_(false), - dragged_view_(NULL), - painted_(false), - has_pointer_grab_(false), - has_keyboard_grab_(false), - grab_notify_signal_id_(0), - is_menu_(false), - signal_registrar_(new ui::GtkSignalRegistrar) { -#if defined(TOUCH_UI) - // Make sure the touch factory is initialized so that it can setup XInput2 for - // the widget. - ui::TouchFactory::GetInstance(); -#endif - static bool installed_message_loop_observer = false; - if (!installed_message_loop_observer) { - installed_message_loop_observer = true; - MessageLoopForUI* loop = MessageLoopForUI::current(); - if (loop) - loop->AddObserver(DropObserver::GetInstance()); - } -} - -NativeWidgetGtk::~NativeWidgetGtk() { - // We need to delete the input method before calling DestroyRootView(), - // because it'll set focus_manager_ to NULL. - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) { - DCHECK(widget_ == NULL); - delete delegate_; - } else { - // Disconnect from GObjectDestructorFILO because we're - // deleting the NativeWidgetGtk. - bool has_widget = !!widget_; - if (has_widget) - ui::GObjectDestructorFILO::GetInstance()->Disconnect( - G_OBJECT(widget_), &OnDestroyedThunk, this); - CloseNow(); - // Call OnNativeWidgetDestroyed because we're not calling - // OnDestroyedThunk - if (has_widget) - delegate_->OnNativeWidgetDestroyed(); - } -} - -GtkWindow* NativeWidgetGtk::GetTransientParent() const { - return (!child_ && widget_) ? - gtk_window_get_transient_for(GTK_WINDOW(widget_)) : NULL; -} - -bool NativeWidgetGtk::MakeTransparent() { - // Transparency can only be enabled only if we haven't realized the widget. - DCHECK(!widget_); - - if (!gdk_screen_is_composited(gdk_screen_get_default())) { - // Transparency is only supported for compositing window managers. - // NOTE: there's a race during ChromeOS startup such that X might think - // compositing isn't supported. We ignore it if the wm says compositing - // isn't supported. - DLOG(WARNING) << "compositing not supported; allowing anyway"; - } - - if (!gdk_screen_get_rgba_colormap(gdk_screen_get_default())) { - // We need rgba to make the window transparent. - return false; - } - - transparent_ = true; - return true; -} - -void NativeWidgetGtk::EnableDoubleBuffer(bool enabled) { - is_double_buffered_ = enabled; - if (window_contents_) { - if (is_double_buffered_) - GTK_WIDGET_SET_FLAGS(window_contents_, GTK_DOUBLE_BUFFERED); - else - GTK_WIDGET_UNSET_FLAGS(window_contents_, GTK_DOUBLE_BUFFERED); - } -} - -void NativeWidgetGtk::AddChild(GtkWidget* child) { - gtk_container_add(GTK_CONTAINER(window_contents_), child); -} - -void NativeWidgetGtk::RemoveChild(GtkWidget* child) { - // We can be called after the contents widget has been destroyed, e.g. any - // NativeViewHost not removed from the view hierarchy before the window is - // closed. - if (GTK_IS_CONTAINER(window_contents_)) { - gtk_container_remove(GTK_CONTAINER(window_contents_), child); - gtk_views_fixed_set_widget_size(child, 0, 0); - } -} - -void NativeWidgetGtk::ReparentChild(GtkWidget* child) { - gtk_widget_reparent(child, window_contents_); -} - -void NativeWidgetGtk::PositionChild(GtkWidget* child, int x, int y, int w, - int h) { - gtk_views_fixed_set_widget_size(child, w, h); - gtk_fixed_move(GTK_FIXED(window_contents_), child, x, y); -} - -void NativeWidgetGtk::DoDrag(const OSExchangeData& data, int operation) { - const OSExchangeDataProviderGtk& data_provider = - static_cast<const OSExchangeDataProviderGtk&>(data.provider()); - GtkTargetList* targets = data_provider.GetTargetList(); - GdkEvent* current_event = gtk_get_current_event(); - const OSExchangeDataProviderGtk& provider( - static_cast<const OSExchangeDataProviderGtk&>(data.provider())); - - GdkDragContext* context = gtk_drag_begin( - window_contents_, - targets, - static_cast<GdkDragAction>( - ui::DragDropTypes::DragOperationToGdkDragAction(operation)), - 1, - current_event); - - GtkWidget* drag_icon_widget = NULL; - - // Set the drag image if one was supplied. - if (provider.drag_image()) { - drag_icon_widget = CreateDragIconWidget(provider.drag_image()); - if (drag_icon_widget) { - // Use a widget as the drag icon when compositing is enabled for proper - // transparency handling. - g_object_ref(provider.drag_image()); - gtk_drag_set_icon_widget(context, - drag_icon_widget, - provider.cursor_offset().x(), - provider.cursor_offset().y()); - } else { - gtk_drag_set_icon_pixbuf(context, - provider.drag_image(), - provider.cursor_offset().x(), - provider.cursor_offset().y()); - } - } - - if (current_event) - gdk_event_free(current_event); - gtk_target_list_unref(targets); - - drag_data_ = &data_provider; - - // Block the caller until drag is done by running a nested message loop. - MessageLoopForUI::current()->RunWithDispatcher(NULL); - - drag_data_ = NULL; - - if (drag_icon_widget) { - gtk_widget_destroy(drag_icon_widget); - g_object_unref(provider.drag_image()); - } -} - -void NativeWidgetGtk::OnActiveChanged() { - delegate_->OnNativeWidgetActivationChanged(IsActive()); -} - -void NativeWidgetGtk::ResetDropTarget() { - ignore_drag_leave_ = false; - drop_target_.reset(NULL); -} - -void NativeWidgetGtk::GetRequestedSize(gfx::Size* out) const { - int width, height; - if (GTK_IS_VIEWS_FIXED(widget_) && - gtk_views_fixed_get_widget_size(GetNativeView(), &width, &height)) { - out->SetSize(width, height); - } else { - GtkRequisition requisition; - gtk_widget_get_child_requisition(GetNativeView(), &requisition); - out->SetSize(requisition.width, requisition.height); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetGtk, ActiveWindowWatcherX::Observer implementation: - -void NativeWidgetGtk::ActiveWindowChanged(GdkWindow* active_window) { - if (!GetNativeView()) - return; - - bool was_active = IsActive(); - is_active_ = (active_window == GTK_WIDGET(GetNativeView())->window); - if (!is_active_ && active_window && !child_) { - // We're not active, but the force the window to be rendered as active if - // a child window is transient to us. - gpointer data = NULL; - gdk_window_get_user_data(active_window, &data); - GtkWidget* widget = reinterpret_cast<GtkWidget*>(data); - is_active_ = - (widget && GTK_IS_WINDOW(widget) && - gtk_window_get_transient_for(GTK_WINDOW(widget)) == GTK_WINDOW( - widget_)); - } - if (was_active != IsActive()) { - OnActiveChanged(); - GetWidget()->GetRootView()->SchedulePaint(); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetGtk implementation: - -bool NativeWidgetGtk::HandleKeyboardEvent(const KeyEvent& key) { - if (!GetWidget()->GetFocusManager()) - return false; - - const int key_code = key.key_code(); - bool handled = false; - - // Always reset |should_handle_menu_key_release_| unless we are handling a - // VKEY_MENU key release event. It ensures that VKEY_MENU accelerator can only - // be activated when handling a VKEY_MENU key release event which is preceded - // by an un-handled VKEY_MENU key press event. - if (key_code != ui::VKEY_MENU || key.type() != ui::ET_KEY_RELEASED) - should_handle_menu_key_release_ = false; - - if (key.type() == ui::ET_KEY_PRESSED) { - // VKEY_MENU is triggered by key release event. - // FocusManager::OnKeyEvent() returns false when the key has been consumed. - if (key_code != ui::VKEY_MENU) - handled = !GetWidget()->GetFocusManager()->OnKeyEvent(key); - else - should_handle_menu_key_release_ = true; - } else if (key_code == ui::VKEY_MENU && should_handle_menu_key_release_ && - (key.flags() & ~ui::EF_ALT_DOWN) == 0) { - // Trigger VKEY_MENU when only this key is pressed and released, and both - // press and release events are not handled by others. - ui::Accelerator accelerator(ui::VKEY_MENU, false, false, false); - handled = GetWidget()->GetFocusManager()->ProcessAccelerator(accelerator); - } - - return handled; -} - -bool NativeWidgetGtk::SuppressFreezeUpdates() { - if (!painted_) { - painted_ = true; - return true; - } - return false; -} - -// static -void NativeWidgetGtk::UpdateFreezeUpdatesProperty(GtkWindow* window, - bool enable) { - if (!GTK_WIDGET_REALIZED(GTK_WIDGET(window))) - gtk_widget_realize(GTK_WIDGET(window)); - GdkWindow* gdk_window = GTK_WIDGET(window)->window; - - static GdkAtom freeze_atom_ = - gdk_atom_intern("_CHROME_FREEZE_UPDATES", FALSE); - if (enable) { - VLOG(1) << "setting FREEZE UPDATES property. xid=" << - GDK_WINDOW_XID(gdk_window); - int32 val = 1; - gdk_property_change(gdk_window, - freeze_atom_, - freeze_atom_, - 32, - GDK_PROP_MODE_REPLACE, - reinterpret_cast<const guchar*>(&val), - 1); - } else { - VLOG(1) << "deleting FREEZE UPDATES property. xid=" << - GDK_WINDOW_XID(gdk_window); - gdk_property_delete(gdk_window, freeze_atom_); - } -} - -// static -void NativeWidgetGtk::RegisterChildExposeHandler(GtkWidget* child) { - RemoveExposeHandlerIfExists(child); - gulong id = g_signal_connect_after(child, "expose-event", - G_CALLBACK(&ChildExposeHandler), NULL); - g_object_set_data(G_OBJECT(child), kExposeHandlerIdKey, - reinterpret_cast<void*>(id)); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetGtk, NativeWidget implementation: - -void NativeWidgetGtk::InitNativeWidget(const Widget::InitParams& params) { - SetInitParams(params); - - Widget::InitParams modified_params = params; - if (params.parent_widget) { - NativeWidgetGtk* parent_gtk = - static_cast<NativeWidgetGtk*>(params.parent_widget->native_widget()); - modified_params.parent = child_ ? parent_gtk->window_contents() - : params.parent_widget->GetNativeView(); - } - - if (!child_) - ActiveWindowWatcherX::AddObserver(this); - - // Make container here. - CreateGtkWidget(modified_params); - - if (params.type == Widget::InitParams::TYPE_MENU) { - gtk_window_set_destroy_with_parent(GTK_WINDOW(GetNativeView()), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(GetNativeView()), - GDK_WINDOW_TYPE_HINT_MENU); - } - - if (View::get_use_acceleration_when_possible()) { - if (ui::Compositor::compositor_factory()) { - compositor_ = (*ui::Compositor::compositor_factory())(this); - } else { - gint width, height; - gdk_drawable_get_size(window_contents_->window, &width, &height); - compositor_ = ui::Compositor::Create(this, - GDK_WINDOW_XID(window_contents_->window), - gfx::Size(width, height)); - } - if (compositor_.get()) { - View* root_view = delegate_->AsWidget()->GetRootView(); - root_view->SetPaintToLayer(true); - compositor_->SetRootLayer(root_view->layer()); - root_view->SetFillsBoundsOpaquely(!transparent_); - } - } - - delegate_->OnNativeWidgetCreated(); - - if (opacity_ != 255) - SetOpacity(opacity_); - - // Make sure we receive our motion events. - - // In general we register most events on the parent of all widgets. At a - // minimum we need painting to happen on the parent (otherwise painting - // doesn't work at all), and similarly we need mouse release events on the - // parent as windows don't get mouse releases. - gtk_widget_add_events(window_contents_, - GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_POINTER_MOTION_MASK | - GDK_KEY_PRESS_MASK | - GDK_KEY_RELEASE_MASK); - - signal_registrar_->ConnectAfter(G_OBJECT(window_contents_), "size_request", - G_CALLBACK(&OnSizeRequestThunk), this); - signal_registrar_->ConnectAfter(G_OBJECT(window_contents_), "size_allocate", - G_CALLBACK(&OnSizeAllocateThunk), this); - gtk_widget_set_app_paintable(window_contents_, true); - signal_registrar_->Connect(window_contents_, "expose_event", - G_CALLBACK(&OnPaintThunk), this); - signal_registrar_->Connect(window_contents_, "enter_notify_event", - G_CALLBACK(&OnEnterNotifyThunk), this); - signal_registrar_->Connect(window_contents_, "leave_notify_event", - G_CALLBACK(&OnLeaveNotifyThunk), this); - signal_registrar_->Connect(window_contents_, "motion_notify_event", - G_CALLBACK(&OnMotionNotifyThunk), this); - signal_registrar_->Connect(window_contents_, "button_press_event", - G_CALLBACK(&OnButtonPressThunk), this); - signal_registrar_->Connect(window_contents_, "button_release_event", - G_CALLBACK(&OnButtonReleaseThunk), this); - signal_registrar_->Connect(window_contents_, "grab_broken_event", - G_CALLBACK(&OnGrabBrokeEventThunk), this); - signal_registrar_->Connect(window_contents_, "scroll_event", - G_CALLBACK(&OnScrollThunk), this); - signal_registrar_->Connect(window_contents_, "visibility_notify_event", - G_CALLBACK(&OnVisibilityNotifyThunk), this); - - // In order to receive notification when the window is no longer the front - // window, we need to install these on the widget. - // NOTE: this doesn't work with focus follows mouse. - signal_registrar_->Connect(widget_, "focus_in_event", - G_CALLBACK(&OnFocusInThunk), this); - signal_registrar_->Connect(widget_, "focus_out_event", - G_CALLBACK(&OnFocusOutThunk), this); - signal_registrar_->Connect(widget_, "destroy", - G_CALLBACK(&OnDestroyThunk), this); - signal_registrar_->Connect(widget_, "show", - G_CALLBACK(&OnShowThunk), this); - signal_registrar_->Connect(widget_, "map", - G_CALLBACK(&OnMapThunk), this); - signal_registrar_->Connect(widget_, "hide", - G_CALLBACK(&OnHideThunk), this); - signal_registrar_->Connect(widget_, "configure-event", - G_CALLBACK(&OnConfigureEventThunk), this); - - // Views/FocusManager (re)sets the focus to the root window, - // so we need to connect signal handlers to the gtk window. - // See views::Views::Focus and views::FocusManager::ClearNativeFocus - // for more details. - signal_registrar_->Connect(widget_, "key_press_event", - G_CALLBACK(&OnEventKeyThunk), this); - signal_registrar_->Connect(widget_, "key_release_event", - G_CALLBACK(&OnEventKeyThunk), this); - - // Drag and drop. - gtk_drag_dest_set(window_contents_, static_cast<GtkDestDefaults>(0), - NULL, 0, GDK_ACTION_COPY); - signal_registrar_->Connect(window_contents_, "drag_motion", - G_CALLBACK(&OnDragMotionThunk), this); - signal_registrar_->Connect(window_contents_, "drag_data_received", - G_CALLBACK(&OnDragDataReceivedThunk), this); - signal_registrar_->Connect(window_contents_, "drag_drop", - G_CALLBACK(&OnDragDropThunk), this); - signal_registrar_->Connect(window_contents_, "drag_leave", - G_CALLBACK(&OnDragLeaveThunk), this); - signal_registrar_->Connect(window_contents_, "drag_data_get", - G_CALLBACK(&OnDragDataGetThunk), this); - signal_registrar_->Connect(window_contents_, "drag_end", - G_CALLBACK(&OnDragEndThunk), this); - signal_registrar_->Connect(window_contents_, "drag_failed", - G_CALLBACK(&OnDragFailedThunk), this); - signal_registrar_->Connect(G_OBJECT(widget_), "window-state-event", - G_CALLBACK(&OnWindowStateEventThunk), this); - - ui::GObjectDestructorFILO::GetInstance()->Connect( - G_OBJECT(widget_), &OnDestroyedThunk, this); - -#if defined(TOUCH_UI) - if (params.type != Widget::InitParams::TYPE_TOOLTIP) { - views::TooltipManagerViews* manager = new views::TooltipManagerViews( - static_cast<internal::RootView*>(GetWidget()->GetRootView())); - tooltip_manager_.reset(manager); - } -#else - tooltip_manager_.reset(new TooltipManagerGtk(this)); -#endif - - // Register for tooltips. - g_object_set(G_OBJECT(window_contents_), "has-tooltip", TRUE, NULL); - signal_registrar_->Connect(window_contents_, "query_tooltip", - G_CALLBACK(&OnQueryTooltipThunk), this); - - if (child_) { - if (modified_params.parent) - SetBounds(params.bounds); - } else { - gtk_widget_add_events(widget_, - GDK_STRUCTURE_MASK); - if (params.bounds.width() > 0 && params.bounds.height() > 0) - gtk_window_resize(GTK_WINDOW(widget_), params.bounds.width(), - params.bounds.height()); - gtk_window_move(GTK_WINDOW(widget_), params.bounds.x(), params.bounds.y()); - } -} - -NonClientFrameView* NativeWidgetGtk::CreateNonClientFrameView() { - return NULL; -} - -void NativeWidgetGtk::UpdateFrameAfterFrameChange() { - // We currently don't support different frame types on Gtk, so we don't - // need to implement this. - NOTIMPLEMENTED(); -} - -bool NativeWidgetGtk::ShouldUseNativeFrame() const { - return false; -} - -void NativeWidgetGtk::FrameTypeChanged() { - // This is called when the Theme has changed, so forward the event to the root - // widget. - GetWidget()->ThemeChanged(); - GetWidget()->GetRootView()->SchedulePaint(); -} - -Widget* NativeWidgetGtk::GetWidget() { - return delegate_->AsWidget(); -} - -const Widget* NativeWidgetGtk::GetWidget() const { - return delegate_->AsWidget(); -} - -gfx::NativeView NativeWidgetGtk::GetNativeView() const { - return widget_; -} - -gfx::NativeWindow NativeWidgetGtk::GetNativeWindow() const { - return child_ ? NULL : GTK_WINDOW(widget_); -} - -Widget* NativeWidgetGtk::GetTopLevelWidget() { - NativeWidgetPrivate* native_widget = GetTopLevelNativeWidget(GetNativeView()); - return native_widget ? native_widget->GetWidget() : NULL; -} - -const ui::Compositor* NativeWidgetGtk::GetCompositor() const { - return compositor_.get(); -} - -ui::Compositor* NativeWidgetGtk::GetCompositor() { - return compositor_.get(); -} - -void NativeWidgetGtk::CalculateOffsetToAncestorWithLayer( - gfx::Point* offset, - ui::Layer** layer_parent) { -} - -void NativeWidgetGtk::ReorderLayers() { -} - -void NativeWidgetGtk::ViewRemoved(View* view) { - if (drop_target_.get()) - drop_target_->ResetTargetViewIfEquals(view); -} - -void NativeWidgetGtk::SetNativeWindowProperty(const char* name, void* value) { - g_object_set_data(G_OBJECT(widget_), name, value); -} - -void* NativeWidgetGtk::GetNativeWindowProperty(const char* name) const { - return g_object_get_data(G_OBJECT(widget_), name); -} - -TooltipManager* NativeWidgetGtk::GetTooltipManager() const { - return tooltip_manager_.get(); -} - -bool NativeWidgetGtk::IsScreenReaderActive() const { - return false; -} - -void NativeWidgetGtk::SendNativeAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type) { - // In the future if we add native GTK accessibility support, the - // notification should be sent here. -} - -void NativeWidgetGtk::SetMouseCapture() { - DCHECK(!HasMouseCapture()); - - // Release the current grab. - GtkWidget* current_grab_window = gtk_grab_get_current(); - if (current_grab_window) - gtk_grab_remove(current_grab_window); - - if (is_menu_ && gdk_pointer_is_grabbed()) - gdk_pointer_ungrab(GDK_CURRENT_TIME); - - // Make sure all app mouse/keyboard events are targeted at us only. - gtk_grab_add(window_contents_); - if (gtk_grab_get_current() == window_contents_ && !grab_notify_signal_id_) { - // "grab_notify" is sent any time the grab changes. We only care about grab - // changes when we have done a grab. - grab_notify_signal_id_ = g_signal_connect( - window_contents_, "grab_notify", G_CALLBACK(&OnGrabNotifyThunk), this); - } - - if (is_menu_) { - // For menus we do a pointer grab too. This ensures we get mouse events from - // other apps. In theory we should do this for all widget types, but doing - // so leads to gdk_pointer_grab randomly returning GDK_GRAB_ALREADY_GRABBED. - GdkGrabStatus pointer_grab_status = - gdk_pointer_grab(window_contents()->window, FALSE, - static_cast<GdkEventMask>( - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | - GDK_POINTER_MOTION_MASK), - NULL, NULL, GDK_CURRENT_TIME); - // NOTE: technically grab may fail. We may want to try and continue on in - // that case. - DCHECK_EQ(GDK_GRAB_SUCCESS, pointer_grab_status); - has_pointer_grab_ = pointer_grab_status == GDK_GRAB_SUCCESS; - -#if defined(TOUCH_UI) - ::Window window = GDK_WINDOW_XID(window_contents()->window); - Display* display = GDK_WINDOW_XDISPLAY(window_contents()->window); - bool xi2grab = - ui::TouchFactory::GetInstance()->GrabTouchDevices(display, window); - // xi2grab should always succeed if has_pointer_grab_ succeeded. - DCHECK(xi2grab); - has_pointer_grab_ = has_pointer_grab_ && xi2grab; -#endif - } -} - -void NativeWidgetGtk::ReleaseMouseCapture() { - bool delegate_lost_capture = HasMouseCapture(); - if (GTK_WIDGET_HAS_GRAB(window_contents_)) - gtk_grab_remove(window_contents_); - if (grab_notify_signal_id_) { - g_signal_handler_disconnect(window_contents_, grab_notify_signal_id_); - grab_notify_signal_id_ = 0; - } - if (has_pointer_grab_) { - has_pointer_grab_ = false; - gdk_pointer_ungrab(GDK_CURRENT_TIME); -#if defined(TOUCH_UI) - ui::TouchFactory::GetInstance()->UngrabTouchDevices( - GDK_WINDOW_XDISPLAY(window_contents()->window)); -#endif - } - if (delegate_lost_capture) - delegate_->OnMouseCaptureLost(); -} - -bool NativeWidgetGtk::HasMouseCapture() const { - return GTK_WIDGET_HAS_GRAB(window_contents_) || has_pointer_grab_; -} - -InputMethod* NativeWidgetGtk::CreateInputMethod() { - // Create input method when pure views is enabled but not on views desktop. - // TODO(suzhe): Always enable input method when we start to use - // RenderWidgetHostViewViews in normal ChromeOS. - if (views::Widget::IsPureViews()) { -#if defined(HAVE_IBUS) - InputMethod* input_method = - InputMethodIBus::IsInputMethodIBusEnabled() ? - static_cast<InputMethod*>(new InputMethodIBus(this)) : - static_cast<InputMethod*>(new InputMethodGtk(this)); -#else - InputMethod* input_method = new InputMethodGtk(this); -#endif - input_method->Init(GetWidget()); - return input_method; - } - // GTK's textfield will handle IME. - return NULL; -} - -void NativeWidgetGtk::CenterWindow(const gfx::Size& size) { - gfx::Rect center_rect; - - GtkWindow* parent = gtk_window_get_transient_for(GetNativeWindow()); - if (parent) { - // We have a parent window, center over it. - gint parent_x = 0; - gint parent_y = 0; - gtk_window_get_position(parent, &parent_x, &parent_y); - gint parent_w = 0; - gint parent_h = 0; - gtk_window_get_size(parent, &parent_w, &parent_h); - center_rect = gfx::Rect(parent_x, parent_y, parent_w, parent_h); - } else { - // We have no parent window, center over the screen. - center_rect = gfx::Screen::GetMonitorWorkAreaNearestWindow(GetNativeView()); - } - gfx::Rect bounds(center_rect.x() + (center_rect.width() - size.width()) / 2, - center_rect.y() + (center_rect.height() - size.height()) / 2, - size.width(), size.height()); - GetWidget()->SetBoundsConstrained(bounds); -} - -void NativeWidgetGtk::GetWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* show_state) const { - // Do nothing for now. ChromeOS isn't yet saving window placement. -} - -void NativeWidgetGtk::SetWindowTitle(const string16& title) { - // We don't have a window title on ChromeOS (right now). -} - -void NativeWidgetGtk::SetWindowIcons(const SkBitmap& window_icon, - const SkBitmap& app_icon) { - // We don't have window icons on ChromeOS. -} - -void NativeWidgetGtk::SetAccessibleName(const string16& name) { -} - -void NativeWidgetGtk::SetAccessibleRole(ui::AccessibilityTypes::Role role) { -} - -void NativeWidgetGtk::SetAccessibleState(ui::AccessibilityTypes::State state) { -} - -void NativeWidgetGtk::BecomeModal() { - gtk_window_set_modal(GetNativeWindow(), true); -} - -gfx::Rect NativeWidgetGtk::GetWindowScreenBounds() const { - // Client == Window bounds on Gtk. - return GetClientAreaScreenBounds(); -} - -gfx::Rect NativeWidgetGtk::GetClientAreaScreenBounds() const { - // Due to timing we can get a request for bounds after Close(). - // TODO(beng): Figure out if this is bogus. - if (!widget_) - return gfx::Rect(size_); - - int x = 0, y = 0, w = 0, h = 0; - if (GTK_IS_WINDOW(widget_)) { - gtk_window_get_position(GTK_WINDOW(widget_), &x, &y); - // NOTE: this doesn't include frame decorations, but it should be good - // enough for our uses. - gtk_window_get_size(GTK_WINDOW(widget_), &w, &h); - } else { - GetWidgetPositionOnScreen(widget_, &x, &y); - w = widget_->allocation.width; - h = widget_->allocation.height; - } - return gfx::Rect(x, y, w, h); -} - -gfx::Rect NativeWidgetGtk::GetRestoredBounds() const { - // We currently don't support tiling, so this doesn't matter. - return GetWindowScreenBounds(); -} - -void NativeWidgetGtk::SetBounds(const gfx::Rect& bounds) { - if (child_) { - GtkWidget* parent = gtk_widget_get_parent(widget_); - if (GTK_IS_VIEWS_FIXED(parent)) { - NativeWidgetGtk* parent_widget = static_cast<NativeWidgetGtk*>( - internal::NativeWidgetPrivate::GetNativeWidgetForNativeView(parent)); - parent_widget->PositionChild(widget_, bounds.x(), bounds.y(), - bounds.width(), bounds.height()); - } else { - DCHECK(GTK_IS_FIXED(parent)) - << "Parent of NativeWidgetGtk has to be Fixed or ViewsFixed"; - // Just request the size if the parent is not NativeWidgetGtk but plain - // GtkFixed. NativeWidgetGtk does not know the minimum size so we assume - // the caller of the SetBounds knows exactly how big it wants to be. - gtk_widget_set_size_request(widget_, bounds.width(), bounds.height()); - if (parent != null_parent_) - gtk_fixed_move(GTK_FIXED(parent), widget_, bounds.x(), bounds.y()); - } - } else { - if (GTK_WIDGET_MAPPED(widget_)) { - // If the widget is mapped (on screen), we can move and resize with one - // call, which avoids two separate window manager steps. - gdk_window_move_resize(widget_->window, bounds.x(), bounds.y(), - bounds.width(), bounds.height()); - } - - // Always call gtk_window_move and gtk_window_resize so that GtkWindow's - // geometry info is up-to-date. - GtkWindow* gtk_window = GTK_WINDOW(widget_); - // TODO: this may need to set an initial size if not showing. - // TODO: need to constrain based on screen size. - if (!bounds.IsEmpty()) { - gtk_window_resize(gtk_window, bounds.width(), bounds.height()); - } - gtk_window_move(gtk_window, bounds.x(), bounds.y()); - } -} - -void NativeWidgetGtk::SetSize(const gfx::Size& size) { - if (child_) { - GtkWidget* parent = gtk_widget_get_parent(widget_); - if (GTK_IS_VIEWS_FIXED(parent)) { - gtk_views_fixed_set_widget_size(widget_, size.width(), size.height()); - } else { - gtk_widget_set_size_request(widget_, size.width(), size.height()); - } - } else { - if (GTK_WIDGET_MAPPED(widget_)) - gdk_window_resize(widget_->window, size.width(), size.height()); - GtkWindow* gtk_window = GTK_WINDOW(widget_); - if (!size.IsEmpty()) - gtk_window_resize(gtk_window, size.width(), size.height()); - } -} - -void NativeWidgetGtk::MoveAbove(gfx::NativeView native_view) { - ui::StackPopupWindow(GetNativeView(), native_view); -} - -void NativeWidgetGtk::MoveToTop() { - DCHECK(GTK_IS_WINDOW(GetNativeView())); - gtk_window_present(GTK_WINDOW(GetNativeView())); -} - -void NativeWidgetGtk::SetShape(gfx::NativeRegion region) { - if (widget_ && widget_->window) { - gdk_window_shape_combine_region(widget_->window, region, 0, 0); - gdk_region_destroy(region); - } -} - -void NativeWidgetGtk::Close() { - if (!widget_) - return; // No need to do anything. - - // Hide first. - Hide(); - if (!close_widget_factory_.HasWeakPtrs()) { - // And we delay the close just in case we're on the stack. - MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&NativeWidgetGtk::CloseNow, - close_widget_factory_.GetWeakPtr())); - } -} - -void NativeWidgetGtk::CloseNow() { - if (widget_) { - gtk_widget_destroy(widget_); // Triggers OnDestroy(). - } -} - -void NativeWidgetGtk::EnableClose(bool enable) { - gtk_window_set_deletable(GetNativeWindow(), enable); -} - -void NativeWidgetGtk::Show() { - if (widget_) { - gtk_widget_show(widget_); - if (widget_->window) - gdk_window_raise(widget_->window); - } -} - -void NativeWidgetGtk::Hide() { - if (widget_) { - gtk_widget_hide(widget_); - if (widget_->window) - gdk_window_lower(widget_->window); - } -} - -void NativeWidgetGtk::ShowMaximizedWithBounds( - const gfx::Rect& restored_bounds) { - // TODO: when we add maximization support update this. - Show(); -} - -void NativeWidgetGtk::ShowWithWindowState(ui::WindowShowState show_state) { - // No concept of maximization (yet) on ChromeOS. - if (show_state == ui::SHOW_STATE_INACTIVE) - gtk_window_set_focus_on_map(GetNativeWindow(), false); - gtk_widget_show(GetNativeView()); -} - -bool NativeWidgetGtk::IsVisible() const { - return GTK_WIDGET_VISIBLE(GetNativeView()) && (GetWidget()->is_top_level() || - GetWidget()->GetTopLevelWidget()->IsVisible()); -} - -void NativeWidgetGtk::Activate() { - gtk_window_present(GetNativeWindow()); -} - -void NativeWidgetGtk::Deactivate() { - gdk_window_lower(GTK_WIDGET(GetNativeView())->window); -} - -bool NativeWidgetGtk::IsActive() const { - DCHECK(!child_); - return is_active_; -} - -void NativeWidgetGtk::SetAlwaysOnTop(bool on_top) { - DCHECK(!child_); - always_on_top_ = on_top; - if (widget_) - gtk_window_set_keep_above(GTK_WINDOW(widget_), on_top); -} - -void NativeWidgetGtk::Maximize() { -#if defined(TOUCH_UI) - // There may not be a window manager. So maximize ourselves: move to the - // top-left corner and resize to the entire bounds of the screen. - gfx::Rect screen = gfx::Screen::GetMonitorAreaNearestWindow(GetNativeView()); - gtk_window_move(GTK_WINDOW(GetNativeWindow()), screen.x(), screen.y()); - // TODO(backer): Remove this driver bug workaround once it is fixed. - gtk_window_resize(GTK_WINDOW(GetNativeWindow()), - screen.width() - 1, screen.height()); -#else - gtk_window_maximize(GetNativeWindow()); -#endif -} - -void NativeWidgetGtk::Minimize() { - gtk_window_iconify(GetNativeWindow()); -} - -bool NativeWidgetGtk::IsMaximized() const { - return window_state_ & GDK_WINDOW_STATE_MAXIMIZED; -} - -bool NativeWidgetGtk::IsMinimized() const { - return window_state_ & GDK_WINDOW_STATE_ICONIFIED; -} - -void NativeWidgetGtk::Restore() { - if (IsFullscreen()) { - SetFullscreen(false); - } else { - if (IsMaximized()) - gtk_window_unmaximize(GetNativeWindow()); - else if (IsMinimized()) - gtk_window_deiconify(GetNativeWindow()); - } -} - -void NativeWidgetGtk::SetFullscreen(bool fullscreen) { - if (fullscreen) - gtk_window_fullscreen(GetNativeWindow()); - else - gtk_window_unfullscreen(GetNativeWindow()); -} - -bool NativeWidgetGtk::IsFullscreen() const { - return window_state_ & GDK_WINDOW_STATE_FULLSCREEN; -} - -void NativeWidgetGtk::SetOpacity(unsigned char opacity) { - opacity_ = opacity; - if (widget_) { - // We can only set the opacity when the widget has been realized. - gdk_window_set_opacity(widget_->window, static_cast<gdouble>(opacity) / - static_cast<gdouble>(255)); - } -} - -void NativeWidgetGtk::SetUseDragFrame(bool use_drag_frame) { - NOTIMPLEMENTED(); -} - -bool NativeWidgetGtk::IsAccessibleWidget() const { - return false; -} - -void NativeWidgetGtk::RunShellDrag(View* view, - const ui::OSExchangeData& data, - int operation) { - DoDrag(data, operation); -} - -void NativeWidgetGtk::SchedulePaintInRect(const gfx::Rect& rect) { - // No need to schedule paint if - // 1) widget_ is NULL. This may happen because this instance may - // be deleted after the gtk widget has been destroyed (See OnDestroy()). - // 2) widget_ is not drawable (mapped and visible) - // 3) If it's never painted before. The first expose event will - // paint the area that has to be painted. - if (widget_ && GTK_WIDGET_DRAWABLE(widget_) && painted_) { - gtk_widget_queue_draw_area(widget_, rect.x(), rect.y(), rect.width(), - rect.height()); - } -} - -void NativeWidgetGtk::SetCursor(gfx::NativeCursor cursor) { -#if defined(TOUCH_UI) - if (!ui::TouchFactory::GetInstance()->is_cursor_visible()) - cursor = gfx::GetCursor(GDK_BLANK_CURSOR); -#endif - // |window_contents_| is placed on top of |widget_|. So the cursor needs to be - // set on |window_contents_| instead of |widget_|. - if (window_contents_) - gdk_window_set_cursor(window_contents_->window, cursor); -} - -void NativeWidgetGtk::ClearNativeFocus() { - DCHECK(!child_); - if (!GetNativeView()) { - NOTREACHED(); - return; - } - gtk_window_set_focus(GTK_WINDOW(GetNativeView()), NULL); -} - -void NativeWidgetGtk::FocusNativeView(gfx::NativeView native_view) { - if (native_view && !gtk_widget_is_focus(native_view)) - gtk_widget_grab_focus(native_view); -} - -bool NativeWidgetGtk::ConvertPointFromAncestor( - const Widget* ancestor, gfx::Point* point) const { - NOTREACHED(); - return false; -} - -gfx::Rect NativeWidgetGtk::GetWorkAreaBoundsInScreen() const { - return gfx::Screen::GetMonitorWorkAreaNearestWindow(GetNativeView()); -} - -void NativeWidgetGtk::SetInactiveRenderingDisabled(bool value) { -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetGtk, protected: - -void NativeWidgetGtk::OnSizeRequest(GtkWidget* widget, - GtkRequisition* requisition) { - // Do only return the preferred size for child windows. GtkWindow interprets - // the requisition as a minimum size for top level windows, returning a - // preferred size for these would prevents us from setting smaller window - // sizes. - if (child_) { - gfx::Size size(GetWidget()->GetRootView()->GetPreferredSize()); - requisition->width = size.width(); - requisition->height = size.height(); - } -} - -void NativeWidgetGtk::OnSizeAllocate(GtkWidget* widget, - GtkAllocation* allocation) { - // See comment next to size_ as to why we do this. Also note, it's tempting - // to put this in the static method so subclasses don't need to worry about - // it, but if a subclasses needs to set a shape then they need to always - // reset the shape in this method regardless of whether the size changed. - gfx::Size new_size(allocation->width, allocation->height); - if (new_size == size_) - return; - size_ = new_size; - if (compositor_.get()) - compositor_->WidgetSizeChanged(size_); - delegate_->OnNativeWidgetSizeChanged(size_); - - if (GetWidget()->non_client_view()) { - // The Window's NonClientView may provide a custom shape for the Window. - gfx::Path window_mask; - GetWidget()->non_client_view()->GetWindowMask(gfx::Size(allocation->width, - allocation->height), - &window_mask); - GdkRegion* mask_region = window_mask.CreateNativeRegion(); - gdk_window_shape_combine_region(GetNativeView()->window, mask_region, 0, 0); - if (mask_region) - gdk_region_destroy(mask_region); - - SaveWindowPosition(); - } -} - -gboolean NativeWidgetGtk::OnPaint(GtkWidget* widget, GdkEventExpose* event) { - gdk_window_set_debug_updates(Widget::IsDebugPaintEnabled()); - - if (transparent_ && child_) { - // Clear the background before drawing any view and native components. - DrawTransparentBackground(widget, event); - if (!CompositePainter::IsComposited(widget_) && - gdk_screen_is_composited(gdk_screen_get_default())) { - // Let the parent draw the content only after something is drawn on - // the widget. - CompositePainter::SetComposited(widget_); - } - } - - ui::ScopedRegion region(gdk_region_copy(event->region)); - if (!gdk_region_empty(region.Get())) { - GdkRectangle clip_bounds; - gdk_region_get_clipbox(region.Get(), &clip_bounds); - if (!delegate_->OnNativeWidgetPaintAccelerated(gfx::Rect(clip_bounds))) { - gfx::CanvasSkiaPaint canvas(event); - if (!canvas.is_empty()) { - canvas.set_composite_alpha(is_transparent()); - delegate_->OnNativeWidgetPaint(&canvas); - } - } - } - - if (!painted_) { - painted_ = true; - if (!child_) - UpdateFreezeUpdatesProperty(GTK_WINDOW(widget_), false /* remove */); - } - return false; // False indicates other widgets should get the event as well. -} - -void NativeWidgetGtk::OnDragDataGet(GtkWidget* widget, - GdkDragContext* context, - GtkSelectionData* data, - guint info, - guint time) { - if (!drag_data_) { - NOTREACHED(); - return; - } - drag_data_->WriteFormatToSelection(info, data); -} - -void NativeWidgetGtk::OnDragDataReceived(GtkWidget* widget, - GdkDragContext* context, - gint x, - gint y, - GtkSelectionData* data, - guint info, - guint time) { - if (drop_target_.get()) - drop_target_->OnDragDataReceived(context, x, y, data, info, time); -} - -gboolean NativeWidgetGtk::OnDragDrop(GtkWidget* widget, - GdkDragContext* context, - gint x, - gint y, - guint time) { - if (drop_target_.get()) { - return drop_target_->OnDragDrop(context, x, y, time); - } - return FALSE; -} - -void NativeWidgetGtk::OnDragEnd(GtkWidget* widget, GdkDragContext* context) { - if (!drag_data_) { - // This indicates we didn't start a drag operation, and should never - // happen. - NOTREACHED(); - return; - } - // Quit the nested message loop we spawned in DoDrag. - MessageLoop::current()->Quit(); -} - -gboolean NativeWidgetGtk::OnDragFailed(GtkWidget* widget, - GdkDragContext* context, - GtkDragResult result) { - return FALSE; -} - -void NativeWidgetGtk::OnDragLeave(GtkWidget* widget, - GdkDragContext* context, - guint time) { - if (ignore_drag_leave_) { - ignore_drag_leave_ = false; - return; - } - if (drop_target_.get()) { - drop_target_->OnDragLeave(context, time); - drop_target_.reset(NULL); - } -} - -gboolean NativeWidgetGtk::OnDragMotion(GtkWidget* widget, - GdkDragContext* context, - gint x, - gint y, - guint time) { - if (!drop_target_.get()) { - drop_target_.reset(new DropTargetGtk( - reinterpret_cast<internal::RootView*>(GetWidget()->GetRootView()), - context)); - } - return drop_target_->OnDragMotion(context, x, y, time); -} - -gboolean NativeWidgetGtk::OnEnterNotify(GtkWidget* widget, - GdkEventCrossing* event) { - if (HasMouseCapture() && event->mode == GDK_CROSSING_GRAB) { - // Doing a grab results an async enter event, regardless of where the mouse - // is. We don't want to generate a mouse move in this case. - return false; - } - - if (!GetWidget()->last_mouse_event_was_move_ && - !GetWidget()->is_mouse_button_pressed_) { - // When a mouse button is pressed gtk generates a leave, enter, press. - // RootView expects to get a mouse move before a press, otherwise enter is - // not set. So we generate a move here. - GdkEventMotion motion = { GDK_MOTION_NOTIFY, event->window, - event->send_event, event->time, event->x, event->y, NULL, event->state, - 0, NULL, event->x_root, event->y_root }; - - // If this event is the result of pressing a button then one of the button - // modifiers is set. Unset it as we're compensating for the leave generated - // when you press a button. - motion.state &= ~(GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK); - - MouseEvent mouse_event(TransformEvent(&motion)); - delegate_->OnMouseEvent(mouse_event); - } - return false; -} - -gboolean NativeWidgetGtk::OnLeaveNotify(GtkWidget* widget, - GdkEventCrossing* event) { - gdk_window_set_cursor(widget->window, gfx::GetCursor(GDK_LEFT_PTR)); - - GetWidget()->ResetLastMouseMoveFlag(); - - if (!HasMouseCapture() && !GetWidget()->is_mouse_button_pressed_) { - // Don't convert if the event is synthetic and has 0x0 coordinates. - if (event->x_root || event->y_root || event->x || event->y || - !event->send_event) { - TransformEvent(event); - } - MouseEvent mouse_event(reinterpret_cast<GdkEvent*>(event)); - delegate_->OnMouseEvent(mouse_event); - } - return false; -} - -gboolean NativeWidgetGtk::OnMotionNotify(GtkWidget* widget, - GdkEventMotion* event) { - if (GetWidget()->non_client_view()) { - GdkEventMotion transformed_event = *event; - TransformEvent(&transformed_event); - gfx::Point translated_location(transformed_event.x, transformed_event.y); - - // Update the cursor for the screen edge. - int hittest_code = - GetWidget()->non_client_view()->NonClientHitTest(translated_location); - if (hittest_code != HTCLIENT) { - GdkCursorType cursor_type = HitTestCodeToGdkCursorType(hittest_code); - gdk_window_set_cursor(widget->window, gfx::GetCursor(cursor_type)); - } - } - - MouseEvent mouse_event(TransformEvent(event)); - delegate_->OnMouseEvent(mouse_event); - return true; -} - -gboolean NativeWidgetGtk::OnButtonPress(GtkWidget* widget, - GdkEventButton* event) { - if (GetWidget()->non_client_view()) { - GdkEventButton transformed_event = *event; - MouseEvent mouse_event(TransformEvent(&transformed_event)); - - int hittest_code = GetWidget()->non_client_view()->NonClientHitTest( - mouse_event.location()); - switch (hittest_code) { - case HTCAPTION: { - // Start dragging if the mouse event is a single click and *not* a right - // click. If it is a right click, then pass it through to - // NativeWidgetGtk::OnButtonPress so that View class can show - // ContextMenu upon a mouse release event. We only start drag on single - // clicks as we get a crash in Gtk on double/triple clicks. - if (event->type == GDK_BUTTON_PRESS && - !mouse_event.IsOnlyRightMouseButton()) { - gfx::Point screen_point(event->x, event->y); - View::ConvertPointToScreen(GetWidget()->GetRootView(), &screen_point); - gtk_window_begin_move_drag(GetNativeWindow(), event->button, - screen_point.x(), screen_point.y(), - event->time); - return TRUE; - } - break; - } - case HTBOTTOM: - case HTBOTTOMLEFT: - case HTBOTTOMRIGHT: - case HTGROWBOX: - case HTLEFT: - case HTRIGHT: - case HTTOP: - case HTTOPLEFT: - case HTTOPRIGHT: { - gfx::Point screen_point(event->x, event->y); - View::ConvertPointToScreen(GetWidget()->GetRootView(), &screen_point); - // TODO(beng): figure out how to get a good minimum size. - gtk_widget_set_size_request(GetNativeView(), 100, 100); - gtk_window_begin_resize_drag(GetNativeWindow(), - HitTestCodeToGDKWindowEdge(hittest_code), - event->button, screen_point.x(), - screen_point.y(), event->time); - return TRUE; - } - default: - // Everything else falls into standard client event handling... - break; - } - } - - if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) { - // The sequence for double clicks is press, release, press, 2press, release. - // This means that at the time we get the second 'press' we don't know - // whether it corresponds to a double click or not. For now we're completely - // ignoring the 2press/3press events as they are duplicate. To make this - // work right we need to write our own code that detects if the press is a - // double/triple. For now we're completely punting, which means we always - // get single clicks. - // TODO: fix this. - return true; - } - - MouseEvent mouse_event(TransformEvent(event)); - // Returns true to consume the event when widget is not transparent. - return delegate_->OnMouseEvent(mouse_event) || !transparent_; -} - -gboolean NativeWidgetGtk::OnButtonRelease(GtkWidget* widget, - GdkEventButton* event) { - // GTK generates a mouse release at the end of dnd. We need to ignore it. - if (!drag_data_) { - MouseEvent mouse_event(TransformEvent(event)); - delegate_->OnMouseEvent(mouse_event); - } - return true; -} - -gboolean NativeWidgetGtk::OnScroll(GtkWidget* widget, GdkEventScroll* event) { - MouseWheelEvent mouse_event(TransformEvent(event)); - return delegate_->OnMouseEvent(mouse_event); -} - -gboolean NativeWidgetGtk::OnFocusIn(GtkWidget* widget, GdkEventFocus* event) { - if (has_focus_) - return false; // This is the second focus-in event in a row, ignore it. - has_focus_ = true; - - should_handle_menu_key_release_ = false; - - if (!GetWidget()->is_top_level()) - return false; - - // Only top-level Widget should have an InputMethod instance. - InputMethod* input_method = GetWidget()->GetInputMethod(); - if (input_method) - input_method->OnFocus(); - - // See description of got_initial_focus_in_ for details on this. - if (!got_initial_focus_in_) { - got_initial_focus_in_ = true; - // Sets initial focus here. On X11/Gtk, window creation - // is asynchronous and a focus request has to be made after a window - // gets created. - GetWidget()->SetInitialFocus(); - } - return false; -} - -gboolean NativeWidgetGtk::OnFocusOut(GtkWidget* widget, GdkEventFocus* event) { - if (!has_focus_) - return false; // This is the second focus-out event in a row, ignore it. - has_focus_ = false; - - if (!GetWidget()->is_top_level()) - return false; - - // Only top-level Widget should have an InputMethod instance. - InputMethod* input_method = GetWidget()->GetInputMethod(); - if (input_method) - input_method->OnBlur(); - return false; -} - -gboolean NativeWidgetGtk::OnEventKey(GtkWidget* widget, GdkEventKey* event) { - KeyEvent key(reinterpret_cast<GdkEvent*>(event)); - InputMethod* input_method = GetWidget()->GetInputMethod(); - if (input_method) - input_method->DispatchKeyEvent(key); - else - DispatchKeyEventPostIME(key); - - // Returns true to prevent GtkWindow's default key event handler. - return true; -} - -gboolean NativeWidgetGtk::OnQueryTooltip(GtkWidget* widget, - gint x, - gint y, - gboolean keyboard_mode, - GtkTooltip* tooltip) { -#if defined(TOUCH_UI) - return false; // Tell GTK not to draw tooltips as we draw tooltips in views -#else - return static_cast<TooltipManagerGtk*>(tooltip_manager_.get())-> - ShowTooltip(x, y, keyboard_mode, tooltip); -#endif -} - -gboolean NativeWidgetGtk::OnVisibilityNotify(GtkWidget* widget, - GdkEventVisibility* event) { - return false; -} - -gboolean NativeWidgetGtk::OnGrabBrokeEvent(GtkWidget* widget, GdkEvent* event) { - if (!has_pointer_grab_ && !has_keyboard_grab_) { - // We don't have any grabs; don't attempt to do anything. - return false; - } - - // Sent when either the keyboard or pointer grab is broke. We drop both grabs - // in this case. - if (event->grab_broken.keyboard) { - // Keyboard grab was broke. - has_keyboard_grab_ = false; - if (has_pointer_grab_) { - has_pointer_grab_ = false; - gdk_pointer_ungrab(GDK_CURRENT_TIME); - delegate_->OnMouseCaptureLost(); - } - } else { - // Mouse grab was broke. - has_pointer_grab_ = false; - if (has_keyboard_grab_) { - has_keyboard_grab_ = false; - gdk_keyboard_ungrab(GDK_CURRENT_TIME); - } - delegate_->OnMouseCaptureLost(); - } - ReleaseMouseCapture(); - -#if defined(TOUCH_UI) - ui::TouchFactory::GetInstance()->UngrabTouchDevices( - GDK_WINDOW_XDISPLAY(window_contents()->window)); -#endif - return false; // To let other widgets get the event. -} - -void NativeWidgetGtk::OnGrabNotify(GtkWidget* widget, gboolean was_grabbed) { - // Sent when gtk_grab_add changes. - if (!window_contents_) - return; // Grab broke after window destroyed, don't try processing it. - if (!was_grabbed) // Indicates we've been shadowed (lost grab). - HandleGtkGrabBroke(); -} - -void NativeWidgetGtk::OnDestroy(GtkWidget* object) { - signal_registrar_.reset(); - if (grab_notify_signal_id_) { - g_signal_handler_disconnect(window_contents_, grab_notify_signal_id_); - grab_notify_signal_id_ = 0; - } - delegate_->OnNativeWidgetDestroying(); - if (!child_) - ActiveWindowWatcherX::RemoveObserver(this); - // Note that this handler is hooked to GtkObject::destroy. - // NULL out pointers here since we might still be in an observer list - // until deletion happens. - widget_ = window_contents_ = NULL; -} - -void NativeWidgetGtk::OnDestroyed(GObject *where_the_object_was) { - delegate_->OnNativeWidgetDestroyed(); - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) - delete this; -} - -void NativeWidgetGtk::OnShow(GtkWidget* widget) { - delegate_->OnNativeWidgetVisibilityChanged(true); -} - -void NativeWidgetGtk::OnMap(GtkWidget* widget) { -#if defined(TOUCH_UI) - // Force an expose event to trigger OnPaint for touch. This is - // a workaround for a bug that X Expose event does not trigger - // Gdk's expose signal. This happens when you try to open views menu - // while a virtual keyboard gets kicked in or out. This seems to be - // a bug in message_pump_x.cc as we do get X Expose event but - // it doesn't trigger gtk's expose signal. We're not going to fix this - // as we're removing gtk and migrating to new compositor. - gdk_window_process_all_updates(); -#endif -} - -void NativeWidgetGtk::OnHide(GtkWidget* widget) { - delegate_->OnNativeWidgetVisibilityChanged(false); -} - -gboolean NativeWidgetGtk::OnWindowStateEvent(GtkWidget* widget, - GdkEventWindowState* event) { - if (GetWidget()->non_client_view() && - !(event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN)) { - SaveWindowPosition(); - } - window_state_ = event->new_window_state; - return FALSE; -} - -gboolean NativeWidgetGtk::OnConfigureEvent(GtkWidget* widget, - GdkEventConfigure* event) { - SaveWindowPosition(); - return FALSE; -} - -void NativeWidgetGtk::HandleGtkGrabBroke() { - ReleaseMouseCapture(); - delegate_->OnMouseCaptureLost(); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetGtk, private: - -void NativeWidgetGtk::ScheduleDraw() { - SchedulePaintInRect(gfx::Rect(gfx::Point(), size_)); -} - -void NativeWidgetGtk::DispatchKeyEventPostIME(const KeyEvent& key) { - // Always reset |should_handle_menu_key_release_| unless we are handling a - // VKEY_MENU key release event. It ensures that VKEY_MENU accelerator can only - // be activated when handling a VKEY_MENU key release event which is preceded - // by an unhandled VKEY_MENU key press event. See also HandleKeyboardEvent(). - if (key.key_code() != ui::VKEY_MENU || key.type() != ui::ET_KEY_RELEASED) - should_handle_menu_key_release_ = false; - - // Send the key event to View hierarchy first. - bool handled = delegate_->OnKeyEvent(key); - - if (key.key_code() == ui::VKEY_PROCESSKEY || handled) - return; - - // Dispatch the key event to native GtkWidget hierarchy. - // To prevent GtkWindow from handling the key event as a keybinding, we need - // to bypass GtkWindow's default key event handler and dispatch the event - // here. - GdkEventKey* event = reinterpret_cast<GdkEventKey*>(key.gdk_event()); - if (!handled && event && GTK_IS_WINDOW(widget_)) - handled = gtk_window_propagate_key_event(GTK_WINDOW(widget_), event); - - // On Linux, in order to handle VKEY_MENU (Alt) accelerator key correctly and - // avoid issues like: http://crbug.com/40966 and http://crbug.com/49701, we - // should only send the key event to the focus manager if it's not handled by - // any View or native GtkWidget. - // The flow is different when the focus is in a RenderWidgetHostViewGtk, which - // always consumes the key event and send it back to us later by calling - // HandleKeyboardEvent() directly, if it's not handled by webkit. - if (!handled) - handled = HandleKeyboardEvent(key); - - // Dispatch the key event for bindings processing. - if (!handled && event && GTK_IS_WINDOW(widget_)) - gtk_bindings_activate_event(GTK_OBJECT(widget_), event); -} - -void NativeWidgetGtk::SetInitParams(const Widget::InitParams& params) { - DCHECK(!GetNativeView()); - - ownership_ = params.ownership; - child_ = params.child; - is_menu_ = params.type == Widget::InitParams::TYPE_MENU; - - // TODO(beng): The secondary checks here actually obviate the need for - // params.transient but that's only because NativeWidgetGtk - // considers any top-level widget to be a transient widget. We - // will probably want to ammend this assumption at some point. - if (params.transient || params.parent || params.parent_widget) - transient_to_parent_ = true; - if (params.transparent) - MakeTransparent(); - if (!params.accept_events && !child_) - ignore_events_ = true; - if (params.double_buffer) - EnableDoubleBuffer(true); -} - -gboolean NativeWidgetGtk::OnWindowPaint(GtkWidget* widget, - GdkEventExpose* event) { - // Clear the background to be totally transparent. We don't need to - // paint the root view here as that is done by OnPaint. - DCHECK(transparent_); - DrawTransparentBackground(widget, event); - // The Keyboard layout view has a renderer that covers the entire - // window, which prevents OnPaint from being called on window_contents_, - // so we need to remove the FREEZE_UPDATES property here. - if (!painted_) { - painted_ = true; - UpdateFreezeUpdatesProperty(GTK_WINDOW(widget_), false /* remove */); - } - return false; -} - -void NativeWidgetGtk::OnChildExpose(GtkWidget* child) { - DCHECK(!child_); - if (!painted_) { - painted_ = true; - UpdateFreezeUpdatesProperty(GTK_WINDOW(widget_), false /* remove */); - } - RemoveExposeHandlerIfExists(child); -} - -// static -gboolean NativeWidgetGtk::ChildExposeHandler(GtkWidget* widget, - GdkEventExpose* event) { - GtkWidget* toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); - CHECK(toplevel); - Widget* views_widget = Widget::GetWidgetForNativeView(toplevel); - CHECK(views_widget); - NativeWidgetGtk* widget_gtk = - static_cast<NativeWidgetGtk*>(views_widget->native_widget()); - widget_gtk->OnChildExpose(widget); - return false; -} - -void NativeWidgetGtk::CreateGtkWidget(const Widget::InitParams& params) { - // We turn off double buffering for two reasons: - // 1. We draw to a canvas then composite to the screen, which means we're - // doing our own double buffering already. - // 2. GTKs double buffering clips to the dirty region. RootView occasionally - // needs to expand the paint region (see RootView::OnPaint). This means - // that if we use GTK's double buffering and we tried to expand the dirty - // region, it wouldn't get painted. - if (child_) { - window_contents_ = widget_ = gtk_views_fixed_new(); - gtk_widget_set_name(widget_, "views-gtkwidget-child-fixed"); - if (!is_double_buffered_) - GTK_WIDGET_UNSET_FLAGS(widget_, GTK_DOUBLE_BUFFERED); - gtk_fixed_set_has_window(GTK_FIXED(widget_), true); - if (!params.parent && !null_parent_) { - GtkWidget* popup = gtk_window_new(GTK_WINDOW_POPUP); - null_parent_ = gtk_fixed_new(); - gtk_widget_set_name(null_parent_, "views-gtkwidget-null-parent"); - gtk_container_add(GTK_CONTAINER(popup), null_parent_); - gtk_widget_realize(null_parent_); - } - if (transparent_) { - // transparency has to be configured before widget is realized. - DCHECK(params.parent) << - "Transparent widget must have parent when initialized"; - ConfigureWidgetForTransparentBackground(params.parent); - } - gtk_container_add( - GTK_CONTAINER(params.parent ? params.parent : null_parent_), widget_); - gtk_widget_realize(widget_); - if (transparent_) { - // The widget has to be realized to set composited flag. - // I tried "realize" signal to set this flag, but it did not work - // when the top level is popup. - DCHECK(GTK_WIDGET_REALIZED(widget_)); - gdk_window_set_composited(widget_->window, true); - } - if (params.parent && !params.bounds.size().IsEmpty()) { - // Make sure that an widget is given it's initial size before - // we're done initializing, to take care of some potential - // corner cases when programmatically arranging hierarchies as - // seen in - // http://code.google.com/p/chromium-os/issues/detail?id=5987 - - // This can't be done without a parent present, or stale data - // might show up on the screen as seen in - // http://code.google.com/p/chromium/issues/detail?id=53870 - GtkAllocation alloc = - { 0, 0, params.bounds.width(), params.bounds.height() }; - gtk_widget_size_allocate(widget_, &alloc); - } - if (params.type == Widget::InitParams::TYPE_CONTROL) { - // Controls are initially visible. - gtk_widget_show(widget_); - } - } else { - Widget::InitParams::Type type = params.type; - if (type == Widget::InitParams::TYPE_BUBBLE && - params.delegate->AsBubbleDelegate() && - params.delegate->AsBubbleDelegate()->use_focusless()) { - // Handles focusless bubble type, which are bubbles that should - // act like popups rather than gtk windows. They do not get focus - // and are not controlled by window manager placement. - type = Widget::InitParams::TYPE_POPUP; - } - - // Use our own window class to override GtkWindow's move_focus method. - widget_ = gtk_views_window_new(WindowTypeToGtkWindowType(type)); - gtk_widget_set_name(widget_, "views-gtkwidget-window"); - if (transient_to_parent_) { - gtk_window_set_transient_for(GTK_WINDOW(widget_), - GTK_WINDOW(params.parent)); - } - GTK_WIDGET_UNSET_FLAGS(widget_, GTK_DOUBLE_BUFFERED); - - // Gtk determines the size for windows based on the requested size of the - // child. For NativeWidgetGtk the child is a fixed. If the fixed ends up - // with a child widget it's possible the child widget will drive the - // requested size of the widget, which we don't want. We explicitly set a - // value of 1x1 here so that gtk doesn't attempt to resize the window if we - // end up with a situation where the requested size of a child of the fixed - // is greater than the size of the window. By setting the size in this - // manner we're also allowing users of WidgetGtk to change the requested - // size at any time. - gtk_widget_set_size_request(widget_, 1, 1); - - if (!params.bounds.size().IsEmpty()) { - // When we realize the window, the window manager is given a size. If we - // don't specify a size before then GTK defaults to 200x200. Specify - // a size now so that the window manager sees the requested size. - GtkAllocation alloc = - { 0, 0, params.bounds.width(), params.bounds.height() }; - gtk_widget_size_allocate(widget_, &alloc); - } - gtk_window_set_decorated(GTK_WINDOW(widget_), false); - // We'll take care of positioning our window. - gtk_window_set_position(GTK_WINDOW(widget_), GTK_WIN_POS_NONE); - - window_contents_ = gtk_views_fixed_new(); - gtk_widget_set_name(window_contents_, "views-gtkwidget-window-fixed"); - if (!is_double_buffered_) - GTK_WIDGET_UNSET_FLAGS(window_contents_, GTK_DOUBLE_BUFFERED); - gtk_fixed_set_has_window(GTK_FIXED(window_contents_), true); - gtk_container_add(GTK_CONTAINER(widget_), window_contents_); - gtk_widget_show(window_contents_); - g_object_set_data(G_OBJECT(window_contents_), kNativeWidgetKey, - static_cast<NativeWidgetGtk*>(this)); - if (transparent_) - ConfigureWidgetForTransparentBackground(NULL); - - if (ignore_events_) - ConfigureWidgetForIgnoreEvents(); - - // Realize the window_contents_ so that we can always get a handle for - // acceleration. Without this we need to check every time paint is - // invoked. - gtk_widget_realize(window_contents_); - - SetAlwaysOnTop(always_on_top_); - // UpdateFreezeUpdatesProperty will realize the widget and handlers like - // size-allocate will function properly. - UpdateFreezeUpdatesProperty(GTK_WINDOW(widget_), true /* add */); - } - SetNativeWindowProperty(kNativeWidgetKey, this); -} - -void NativeWidgetGtk::ConfigureWidgetForTransparentBackground( - GtkWidget* parent) { - DCHECK(widget_ && window_contents_); - - GdkColormap* rgba_colormap = - gdk_screen_get_rgba_colormap(gtk_widget_get_screen(widget_)); - if (!rgba_colormap) { - transparent_ = false; - return; - } - // To make the background transparent we need to install the RGBA colormap - // on both the window and fixed. In addition we need to make sure no - // decorations are drawn. The last bit is to make sure the widget doesn't - // attempt to draw a pixmap in it's background. - if (!child_) { - DCHECK(parent == NULL); - gtk_widget_set_colormap(widget_, rgba_colormap); - gtk_widget_set_app_paintable(widget_, true); - signal_registrar_->Connect(widget_, "expose_event", - G_CALLBACK(&OnWindowPaintThunk), this); - gtk_widget_realize(widget_); - gdk_window_set_decorations(widget_->window, - static_cast<GdkWMDecoration>(0)); - } else { - DCHECK(parent); - CompositePainter::AddCompositePainter(parent); - } - DCHECK(!GTK_WIDGET_REALIZED(window_contents_)); - gtk_widget_set_colormap(window_contents_, rgba_colormap); -} - -void NativeWidgetGtk::ConfigureWidgetForIgnoreEvents() { - gtk_widget_realize(widget_); - GdkWindow* gdk_window = widget_->window; - Display* display = GDK_WINDOW_XDISPLAY(gdk_window); - XID win = GDK_WINDOW_XID(gdk_window); - - // This sets the clickable area to be empty, allowing all events to be - // passed to any windows behind this one. - XShapeCombineRectangles( - display, - win, - ShapeInput, - 0, // x offset - 0, // y offset - NULL, // rectangles - 0, // num rectangles - ShapeSet, - 0); -} - -void NativeWidgetGtk::DrawTransparentBackground(GtkWidget* widget, - GdkEventExpose* event) { - cairo_t* cr = gdk_cairo_create(widget->window); - cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); - gdk_cairo_region(cr, event->region); - cairo_fill(cr); - cairo_destroy(cr); -} - -void NativeWidgetGtk::SaveWindowPosition() { - // The delegate may have gone away on us. - if (!GetWidget()->widget_delegate()) - return; - - ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL; - if (IsMaximized()) - show_state = ui::SHOW_STATE_MAXIMIZED; - else if (IsMinimized()) - show_state = ui::SHOW_STATE_MINIMIZED; - GetWidget()->widget_delegate()->SaveWindowPlacement( - GetWidget()->GetWindowScreenBounds(), - show_state); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, public: - -// static -void Widget::NotifyLocaleChanged() { - GList *window_list = gtk_window_list_toplevels(); - for (GList* element = window_list; element; element = g_list_next(element)) { - Widget* widget = - Widget::GetWidgetForNativeWindow(GTK_WINDOW(element->data)); - if (widget) - widget->LocaleChanged(); - } - g_list_free(window_list); -} - -// static -void Widget::CloseAllSecondaryWidgets() { - GList* windows = gtk_window_list_toplevels(); - for (GList* window = windows; window; - window = g_list_next(window)) { - Widget* widget = Widget::GetWidgetForNativeView(GTK_WIDGET(window->data)); - if (widget && widget->is_secondary_widget()) - widget->Close(); - } - g_list_free(windows); -} - -// static -bool Widget::ConvertRect(const Widget* source, - const Widget* target, - gfx::Rect* rect) { - DCHECK(source); - DCHECK(target); - DCHECK(rect); - - // TODO(oshima): Add check if source and target belongs to the same - // screen. - - if (source == target) - return true; - if (!source || !target) - return false; - - gfx::Point source_point = source->GetWindowScreenBounds().origin(); - gfx::Point target_point = target->GetWindowScreenBounds().origin(); - - rect->set_origin( - source_point.Subtract(target_point).Add(rect->origin())); - return true; -} - -namespace internal { - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetPrivate, public: - -// static -NativeWidgetPrivate* NativeWidgetPrivate::CreateNativeWidget( - NativeWidgetDelegate* delegate) { - return new NativeWidgetGtk(delegate); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeView( - gfx::NativeView native_view) { - if (!native_view) - return NULL; - return reinterpret_cast<NativeWidgetGtk*>( - g_object_get_data(G_OBJECT(native_view), kNativeWidgetKey)); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeWindow( - gfx::NativeWindow native_window) { - if (!native_window) - return NULL; - return reinterpret_cast<NativeWidgetGtk*>( - g_object_get_data(G_OBJECT(native_window), kNativeWidgetKey)); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetTopLevelNativeWidget( - gfx::NativeView native_view) { - if (!native_view) - return NULL; - - NativeWidgetPrivate* widget = NULL; - - GtkWidget* parent_gtkwidget = native_view; - NativeWidgetPrivate* parent_widget; - do { - parent_widget = GetNativeWidgetForNativeView(parent_gtkwidget); - if (parent_widget) - widget = parent_widget; - parent_gtkwidget = gtk_widget_get_parent(parent_gtkwidget); - } while (parent_gtkwidget); - - return widget && widget->GetWidget()->is_top_level() ? widget : NULL; -} - -// static -void NativeWidgetPrivate::GetAllChildWidgets(gfx::NativeView native_view, - Widget::Widgets* children) { - if (!native_view) - return; - - Widget* widget = Widget::GetWidgetForNativeView(native_view); - if (widget) - children->insert(widget); - gtk_container_foreach(GTK_CONTAINER(native_view), - EnumerateChildWidgetsForNativeWidgets, - reinterpret_cast<gpointer>(children)); -} - -// static -void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view, - gfx::NativeView new_parent) { - if (!native_view) - return; - - gfx::NativeView previous_parent = gtk_widget_get_parent(native_view); - if (previous_parent == new_parent) - return; - - Widget::Widgets widgets; - GetAllChildWidgets(native_view, &widgets); - - // First notify all the widgets that they are being disassociated - // from their previous parent. - for (Widget::Widgets::iterator it = widgets.begin(); - it != widgets.end(); ++it) { - // TODO(beng): Rename this notification to NotifyNativeViewChanging() - // and eliminate the bool parameter. - (*it)->NotifyNativeViewHierarchyChanged(false, previous_parent); - } - - if (gtk_widget_get_parent(native_view)) - gtk_widget_reparent(native_view, new_parent); - else - gtk_container_add(GTK_CONTAINER(new_parent), native_view); - - // And now, notify them that they have a brand new parent. - for (Widget::Widgets::iterator it = widgets.begin(); - it != widgets.end(); ++it) { - (*it)->NotifyNativeViewHierarchyChanged(true, new_parent); - } -} - -// static -bool NativeWidgetPrivate::IsMouseButtonDown() { - bool button_pressed = false; - GdkEvent* event = gtk_get_current_event(); - if (event) { - button_pressed = event->type == GDK_BUTTON_PRESS || - event->type == GDK_2BUTTON_PRESS || - event->type == GDK_3BUTTON_PRESS; - gdk_event_free(event); - } - return button_pressed; -} - -} // namespace internal -} // namespace views diff --git a/ui/views/widget/native_widget_gtk.h b/ui/views/widget/native_widget_gtk.h deleted file mode 100644 index 4427aa8..0000000 --- a/ui/views/widget/native_widget_gtk.h +++ /dev/null @@ -1,475 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_GTK_H_ -#define UI_VIEWS_WIDGET_NATIVE_WIDGET_GTK_H_ -#pragma once - -#include <gtk/gtk.h> - -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/message_loop.h" -#include "ui/base/gtk/gtk_signal.h" -#include "ui/base/x/active_window_watcher_x.h" -#include "ui/gfx/compositor/compositor.h" -#include "ui/gfx/size.h" -#include "ui/views/focus/focus_manager.h" -#include "ui/views/widget/native_widget_private.h" -#include "ui/views/widget/widget.h" - -namespace gfx { -class Rect; -} - -namespace ui { -class OSExchangeData; -class OSExchangeDataProviderGtk; -class GtkSignalRegistrar; -} -using ui::OSExchangeData; -using ui::OSExchangeDataProviderGtk; - -namespace views { - -class DropTargetGtk; -class InputMethod; -class View; - -namespace internal { -class NativeWidgetDelegate; -} - -// Widget implementation for GTK. -class VIEWS_EXPORT NativeWidgetGtk : public internal::NativeWidgetPrivate, - public ui::CompositorDelegate, - public ui::ActiveWindowWatcherX::Observer { - public: - explicit NativeWidgetGtk(internal::NativeWidgetDelegate* delegate); - virtual ~NativeWidgetGtk(); - - // Returns the transient parent. See make_transient_to_parent for details on - // what the transient parent is. - GtkWindow* GetTransientParent() const; - - // Makes the background of the window totally transparent. This must be - // invoked before Init. This does a couple of checks and returns true if - // the window can be made transparent. The actual work of making the window - // transparent is done by ConfigureWidgetForTransparentBackground. - // This works for both child and window types. - bool MakeTransparent(); - bool is_transparent() const { return transparent_; } - - // Enable/Disable double buffering.This is neccessary to prevent - // flickering in ScrollView, which has both native and view - // controls. - void EnableDoubleBuffer(bool enabled); - bool is_double_buffered() const { return is_double_buffered_; } - - bool is_ignore_events() const { return ignore_events_; } - - // Adds and removes the specified widget as a child of this widget's contents. - // These methods make sure to add the widget to the window's contents - // container if this widget is a window. - void AddChild(GtkWidget* child); - void RemoveChild(GtkWidget* child); - - // A safe way to reparent a child widget to this widget. Calls - // gtk_widget_reparent which handles refcounting to avoid destroying the - // widget when removing it from its old parent. - void ReparentChild(GtkWidget* child); - - // Positions a child GtkWidget at the specified location and bounds. - void PositionChild(GtkWidget* child, int x, int y, int w, int h); - - // Parent GtkWidget all children are added to. When this NativeWidgetGtk - // corresponds to a top level window, this is the GtkFixed within the - // GtkWindow, not the GtkWindow itself. For child widgets, this is the same - // GtkFixed as |widget_|. - GtkWidget* window_contents() const { return window_contents_; } - - // Starts a drag on this widget. This blocks until the drag is done. - void DoDrag(const OSExchangeData& data, int operation); - - // Invoked when the active status changes. - virtual void OnActiveChanged(); - - // Sets the drop target to NULL. This is invoked by DropTargetGTK when the - // drop is done. - void ResetDropTarget(); - - // Gets the requested size of the widget. This can be the size - // stored in properties for a GtkViewsFixed, or in the requisitioned - // size of other kinds of widgets. - void GetRequestedSize(gfx::Size* out) const; - - // Overridden from ui::ActiveWindowWatcherX::Observer. - virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE; - - // Handles a keyboard event by sending it to our focus manager. - // Returns true if it's handled by the focus manager. - bool HandleKeyboardEvent(const KeyEvent& key); - - // Tells widget not to remove FREEZE_UPDATES property when the - // widget is painted. This is used if painting the gtk widget - // is not enough to show the window and has to wait further like - // keyboard overlay. Returns true if this is called before - // FREEZE_UPDATES property is removed, or false otherwise. - bool SuppressFreezeUpdates(); - - // Sets and deletes FREEZE_UPDATES property on given |window|. - // It adds the property when |enable| is true and remove if false. - // Calling this method will realize the window if it's not realized yet. - // This property is used to help WindowManager know when the window - // is fully painted so that WM can map the fully painted window. - // The property is based on Owen Taylor's proposal at - // http://mail.gnome.org/archives/wm-spec-list/2009-June/msg00002.html. - // This is just a hint to WM, and won't change the behavior for WM - // which does not support this property. - static void UpdateFreezeUpdatesProperty(GtkWindow* window, bool enable); - - // Registers a expose handler that removes FREEZE_UPDATES property. - // If you are adding a GtkWidget with its own GdkWindow that may - // fill the entire area of the NativeWidgetGtk to the view hierachy, you - // need use this function to tell WM that when the widget is ready - // to be shown. - // Caller of this method do not need to disconnect this because the - // handler will be removed upon the first invocation of the handler, - // or when the widget is re-attached, and expose won't be emitted on - // detached widget. - static void RegisterChildExposeHandler(GtkWidget* widget); - - // Overridden from internal::NativeWidgetPrivate: - virtual void InitNativeWidget(const Widget::InitParams& params) OVERRIDE; - virtual NonClientFrameView* CreateNonClientFrameView() OVERRIDE; - virtual void UpdateFrameAfterFrameChange() OVERRIDE; - virtual bool ShouldUseNativeFrame() const OVERRIDE; - virtual void FrameTypeChanged() OVERRIDE; - virtual Widget* GetWidget() OVERRIDE; - virtual const Widget* GetWidget() const OVERRIDE; - virtual gfx::NativeView GetNativeView() const OVERRIDE; - virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE; - virtual Widget* GetTopLevelWidget() OVERRIDE; - virtual const ui::Compositor* GetCompositor() const OVERRIDE; - virtual ui::Compositor* GetCompositor() OVERRIDE; - virtual void CalculateOffsetToAncestorWithLayer( - gfx::Point* offset, - ui::Layer** layer_parent) OVERRIDE; - virtual void ReorderLayers() OVERRIDE; - virtual void ViewRemoved(View* view) OVERRIDE; - virtual void SetNativeWindowProperty(const char* name, void* value) OVERRIDE; - virtual void* GetNativeWindowProperty(const char* name) const OVERRIDE; - virtual TooltipManager* GetTooltipManager() const OVERRIDE; - virtual bool IsScreenReaderActive() const OVERRIDE; - virtual void SendNativeAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type) OVERRIDE; - virtual void SetMouseCapture() OVERRIDE; - virtual void ReleaseMouseCapture() OVERRIDE; - virtual bool HasMouseCapture() const OVERRIDE; - virtual InputMethod* CreateInputMethod() OVERRIDE; - virtual void CenterWindow(const gfx::Size& size) OVERRIDE; - virtual void GetWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* show_state) const OVERRIDE; - virtual void SetWindowTitle(const string16& title) OVERRIDE; - virtual void SetWindowIcons(const SkBitmap& window_icon, - const SkBitmap& app_icon) OVERRIDE; - virtual void SetAccessibleName(const string16& name) OVERRIDE; - virtual void SetAccessibleRole(ui::AccessibilityTypes::Role role) OVERRIDE; - virtual void SetAccessibleState(ui::AccessibilityTypes::State state) OVERRIDE; - virtual void BecomeModal() OVERRIDE; - virtual gfx::Rect GetWindowScreenBounds() const OVERRIDE; - virtual gfx::Rect GetClientAreaScreenBounds() const OVERRIDE; - virtual gfx::Rect GetRestoredBounds() const OVERRIDE; - virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; - virtual void SetSize(const gfx::Size& size) OVERRIDE; - virtual void MoveAbove(gfx::NativeView native_view) OVERRIDE; - virtual void MoveToTop() OVERRIDE; - virtual void SetShape(gfx::NativeRegion shape) OVERRIDE; - virtual void Close() OVERRIDE; - virtual void CloseNow() OVERRIDE; - virtual void EnableClose(bool enable) OVERRIDE; - virtual void Show() OVERRIDE; - virtual void Hide() OVERRIDE; - virtual void ShowMaximizedWithBounds( - const gfx::Rect& restored_bounds) OVERRIDE; - virtual void ShowWithWindowState(ui::WindowShowState window_state) OVERRIDE; - virtual bool IsVisible() const OVERRIDE; - virtual void Activate() OVERRIDE; - virtual void Deactivate() OVERRIDE; - virtual bool IsActive() const OVERRIDE; - virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; - virtual void Maximize() OVERRIDE; - virtual void Minimize() OVERRIDE; - virtual bool IsMaximized() const OVERRIDE; - virtual bool IsMinimized() const OVERRIDE; - virtual void Restore() OVERRIDE; - virtual void SetFullscreen(bool fullscreen) OVERRIDE; - virtual bool IsFullscreen() const OVERRIDE; - virtual void SetOpacity(unsigned char opacity) OVERRIDE; - virtual void SetUseDragFrame(bool use_drag_frame) OVERRIDE; - virtual bool IsAccessibleWidget() const OVERRIDE; - virtual void RunShellDrag(View* view, - const ui::OSExchangeData& data, - int operation) OVERRIDE; - virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE; - virtual void SetCursor(gfx::NativeCursor cursor) OVERRIDE; - virtual void ClearNativeFocus() OVERRIDE; - virtual void FocusNativeView(gfx::NativeView native_view) OVERRIDE; - virtual bool ConvertPointFromAncestor( - const Widget* ancestor, gfx::Point* point) const OVERRIDE; - virtual gfx::Rect GetWorkAreaBoundsInScreen() const OVERRIDE; - virtual void SetInactiveRenderingDisabled(bool value) OVERRIDE; - - protected: - // Modifies event coordinates to the targeted widget contained by this widget. - template<class Event> GdkEvent* TransformEvent(Event* event) { - GdkWindow* dest = GTK_WIDGET(window_contents_)->window; - if (event && event->window != dest) { - gint dest_x, dest_y; - gdk_window_get_root_origin(dest, &dest_x, &dest_y); - event->x = event->x_root - dest_x; - event->y = event->y_root - dest_y; - } - return reinterpret_cast<GdkEvent*>(event); - } - - // Event handlers: - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnButtonPress, - GdkEventButton*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, void, OnSizeRequest, - GtkRequisition*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, void, OnSizeAllocate, - GtkAllocation*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnPaint, - GdkEventExpose*); - CHROMEGTK_VIRTUAL_CALLBACK_4(NativeWidgetGtk, void, OnDragDataGet, - GdkDragContext*, GtkSelectionData*, guint, - guint); - CHROMEGTK_VIRTUAL_CALLBACK_6(NativeWidgetGtk, void, OnDragDataReceived, - GdkDragContext*, gint, gint, GtkSelectionData*, - guint, guint); - CHROMEGTK_VIRTUAL_CALLBACK_4(NativeWidgetGtk, gboolean, OnDragDrop, - GdkDragContext*, gint, gint, guint); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, void, OnDragEnd, - GdkDragContext*); - CHROMEGTK_VIRTUAL_CALLBACK_2(NativeWidgetGtk, gboolean, OnDragFailed, - GdkDragContext*, GtkDragResult); - CHROMEGTK_VIRTUAL_CALLBACK_2(NativeWidgetGtk, void, OnDragLeave, - GdkDragContext*, guint); - CHROMEGTK_VIRTUAL_CALLBACK_4(NativeWidgetGtk, gboolean, OnDragMotion, - GdkDragContext*, gint, gint, guint); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnEnterNotify, - GdkEventCrossing*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnLeaveNotify, - GdkEventCrossing*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnMotionNotify, - GdkEventMotion*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnButtonRelease, - GdkEventButton*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnFocusIn, - GdkEventFocus*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnFocusOut, - GdkEventFocus*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnEventKey, - GdkEventKey*); - CHROMEGTK_VIRTUAL_CALLBACK_4(NativeWidgetGtk, gboolean, OnQueryTooltip, gint, - gint, gboolean, GtkTooltip*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnScroll, - GdkEventScroll*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnVisibilityNotify, - GdkEventVisibility*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnGrabBrokeEvent, - GdkEvent*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, void, OnGrabNotify, gboolean); - CHROMEGTK_VIRTUAL_CALLBACK_0(NativeWidgetGtk, void, OnDestroy); - CHROMEGTK_VIRTUAL_CALLBACK_0(NativeWidgetGtk, void, OnShow); - CHROMEGTK_VIRTUAL_CALLBACK_0(NativeWidgetGtk, void, OnMap); - CHROMEGTK_VIRTUAL_CALLBACK_0(NativeWidgetGtk, void, OnHide); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnWindowStateEvent, - GdkEventWindowState*); - CHROMEGTK_VIRTUAL_CALLBACK_1(NativeWidgetGtk, gboolean, OnConfigureEvent, - GdkEventConfigure*); - - // Invoked when the widget is destroyed and right before the object - // destruction. Useful for overriding. - virtual void OnDestroyed(GObject *where_the_object_was); - static void OnDestroyedThunk(gpointer data, GObject *where_the_object_was) { - reinterpret_cast<NativeWidgetGtk*>(data)->OnDestroyed(where_the_object_was); - } - - // Invoked when gtk grab is stolen by other GtkWidget in the same - // application. - virtual void HandleGtkGrabBroke(); - - const internal::NativeWidgetDelegate* delegate() const { return delegate_; } - internal::NativeWidgetDelegate* delegate() { return delegate_; } - - private: - class DropObserver; - friend class DropObserver; - - // Overridden from ui::CompositorDelegate - virtual void ScheduleDraw(); - - // Overridden from internal::InputMethodDelegate - virtual void DispatchKeyEventPostIME(const KeyEvent& key) OVERRIDE; - - void SetInitParams(const Widget::InitParams& params); - - // This is called only when the window is transparent. - CHROMEGTK_CALLBACK_1(NativeWidgetGtk, gboolean, OnWindowPaint, - GdkEventExpose*); - - // Callbacks for expose event on child widgets. See the description of - // RegisterChildChildExposeHandler. - void OnChildExpose(GtkWidget* child); - static gboolean ChildExposeHandler(GtkWidget* widget, GdkEventExpose* event); - - // Creates the GtkWidget. - void CreateGtkWidget(const Widget::InitParams& params); - - // Invoked from create widget to enable the various bits needed for a - // transparent background. This is only invoked if MakeTransparent has been - // invoked. - void ConfigureWidgetForTransparentBackground(GtkWidget* parent); - - // Invoked from create widget to enable the various bits needed for a - // window which doesn't receive events. - void ConfigureWidgetForIgnoreEvents(); - - // A utility function to draw a transparent background onto the |widget|. - static void DrawTransparentBackground(GtkWidget* widget, - GdkEventExpose* event); - - // Asks the delegate if any to save the window's location and size. - void SaveWindowPosition(); - - // A delegate implementation that handles events received here. - // See class documentation for Widget in widget.h for a note about ownership. - internal::NativeWidgetDelegate* delegate_; - - // Our native views. If we're a window/popup, then widget_ is the window and - // window_contents_ is a GtkFixed. If we're not a window/popup, then widget_ - // and window_contents_ point to the same GtkFixed. - GtkWidget* widget_; - GtkWidget* window_contents_; - - // Child GtkWidgets created with no parent need to be parented to a valid top - // level window otherwise Gtk throws a fit. |null_parent_| is an invisible - // popup that such GtkWidgets are parented to. - static GtkWidget* null_parent_; - - // True if the widget is a child of some other widget. - bool child_; - - // The TooltipManager. - // WARNING: RootView's destructor calls into the TooltipManager. As such, this - // must be destroyed AFTER root_view_. - scoped_ptr<TooltipManager> tooltip_manager_; - - scoped_ptr<DropTargetGtk> drop_target_; - - // The following factory is used to delay destruction. - base::WeakPtrFactory<NativeWidgetGtk> close_widget_factory_; - - // See class documentation for Widget in widget.h for a note about ownership. - Widget::InitParams::Ownership ownership_; - - // See description above make_transparent for details. - bool transparent_; - - // Makes the window pass all events through to any windows behind it. - // Set during SetInitParams before the widget is created. The actual work of - // making the window ignore events is done by ConfigureWidgetForIgnoreEvents. - bool ignore_events_; - - // See note in DropObserver for details on this. - bool ignore_drag_leave_; - - unsigned char opacity_; - - // This is non-null during the life of DoDrag and contains the actual data - // for the drag. - const OSExchangeDataProviderGtk* drag_data_; - - // True to enable debug painting. Enabling causes the damaged - // region to be painted to flash in red. - static bool debug_paint_enabled_; - - // State of the window, such as fullscreen, hidden... - GdkWindowState window_state_; - - // Are we active? - bool is_active_; - - // See make_transient_to_parent for a description. - bool transient_to_parent_; - - // Last size supplied to OnSizeAllocate. We cache this as any time the - // size of a GtkWidget changes size_allocate is called, even if the size - // didn't change. If we didn't cache this and ignore calls when the size - // hasn't changed, we can end up getting stuck in a never ending loop. - gfx::Size size_; - - // This is initially false and when the first focus-in event is received this - // is set to true and no additional processing is done. Subsequently when - // focus-in is received we do the normal focus manager processing. - // - // This behavior is necessitated by Gtk/X sending focus events - // asynchronously. The initial sequence for windows is typically: show, - // request focus on some widget. Because of async events on Gtk this becomes - // show, request focus, get focus in event which ends up clearing focus - // (first request to FocusManager::RestoreFocusedView ends up clearing focus). - bool got_initial_focus_in_; - - // If true, we've received a focus-in event. If false we've received a - // focus-out event. We can get multiple focus-out events in a row, we use - // this to determine whether we should process the event. - bool has_focus_; - - // If true, the window stays on top of the screen. This is only used - // for types other than TYPE_CHILD. - bool always_on_top_; - - // If true, we enable the content widget's double buffering. - // This is false by default. - bool is_double_buffered_; - - // Indicates if we should handle the upcoming Alt key release event. - bool should_handle_menu_key_release_; - - // Valid for the lifetime of StartDragForViewFromMouseEvent, indicates the - // view the drag started from. - View* dragged_view_; - - // If the widget has ever been painted. This is used to guarantee - // that window manager shows the window only after the window is painted. - bool painted_; - - // The compositor for accelerated drawing. - scoped_refptr<ui::Compositor> compositor_; - - // Have we done a pointer grab? - bool has_pointer_grab_; - - // Have we done a keyboard grab? - bool has_keyboard_grab_; - - // ID of the 'grab-notify' signal. If non-zero we're listening for - // 'grab-notify' events. - glong grab_notify_signal_id_; - - // If we were created for a menu. - bool is_menu_; - - scoped_ptr<ui::GtkSignalRegistrar> signal_registrar_; - - DISALLOW_COPY_AND_ASSIGN(NativeWidgetGtk); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_NATIVE_WIDGET_GTK_H_ diff --git a/ui/views/widget/native_widget_private.h b/ui/views/widget/native_widget_private.h deleted file mode 100644 index 229a530..0000000 --- a/ui/views/widget/native_widget_private.h +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_PRIVATE_H_ -#define UI_VIEWS_WIDGET_NATIVE_WIDGET_PRIVATE_H_ -#pragma once - -#include "base/string16.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/views/ime/input_method_delegate.h" -#include "ui/views/widget/native_widget.h" - -namespace gfx { -class Rect; -} - -namespace ui { -class OSExchangeData; -} - -namespace views { -class InputMethod; -class TooltipManager; -namespace internal { - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetPrivate interface -// -// A NativeWidget subclass internal to views that provides Widget a conduit for -// communication with a backend-specific native widget implementation. -// -// Many of the methods here are pass-thrus for Widget, and as such there is no -// documentation for them here. In that case, see methods of the same name in -// widget.h. -// -// IMPORTANT: This type is intended for use only by the views system and for -// NativeWidget implementations. This file should not be included -// in code that does not fall into one of these use cases. -// -class VIEWS_EXPORT NativeWidgetPrivate : public NativeWidget, - public internal::InputMethodDelegate { - public: - virtual ~NativeWidgetPrivate() {} - - // Creates an appropriate default NativeWidgetPrivate implementation for the - // current OS/circumstance. - static NativeWidgetPrivate* CreateNativeWidget( - internal::NativeWidgetDelegate* delegate); - - static NativeWidgetPrivate* GetNativeWidgetForNativeView( - gfx::NativeView native_view); - static NativeWidgetPrivate* GetNativeWidgetForNativeWindow( - gfx::NativeWindow native_window); - - // Retrieves the top NativeWidgetPrivate in the hierarchy containing the given - // NativeView, or NULL if there is no NativeWidgetPrivate that contains it. - static NativeWidgetPrivate* GetTopLevelNativeWidget( - gfx::NativeView native_view); - - static void GetAllChildWidgets(gfx::NativeView native_view, - Widget::Widgets* children); - static void ReparentNativeView(gfx::NativeView native_view, - gfx::NativeView new_parent); - - // Returns true if any mouse button is currently down. - static bool IsMouseButtonDown(); - - // Initializes the NativeWidget. - virtual void InitNativeWidget(const Widget::InitParams& params) = 0; - - // Returns a NonClientFrameView for the widget's NonClientView, or NULL if - // the NativeWidget wants no special NonClientFrameView. - virtual NonClientFrameView* CreateNonClientFrameView() = 0; - - virtual void UpdateFrameAfterFrameChange() = 0; - virtual bool ShouldUseNativeFrame() const = 0; - virtual void FrameTypeChanged() = 0; - - // Returns the Widget associated with this NativeWidget. This function is - // guaranteed to return non-NULL for the lifetime of the NativeWidget. - virtual Widget* GetWidget() = 0; - virtual const Widget* GetWidget() const = 0; - - // Returns the NativeView/Window associated with this NativeWidget. - virtual gfx::NativeView GetNativeView() const = 0; - virtual gfx::NativeWindow GetNativeWindow() const = 0; - - // Returns the topmost Widget in a hierarchy. - virtual Widget* GetTopLevelWidget() = 0; - - // Returns the Compositor, or NULL if there isn't one associated with this - // NativeWidget. - virtual const ui::Compositor* GetCompositor() const = 0; - virtual ui::Compositor* GetCompositor() = 0; - - // See description in View for details. - virtual void CalculateOffsetToAncestorWithLayer(gfx::Point* offset, - ui::Layer** layer_parent) = 0; - virtual void ReorderLayers() = 0; - - // Notifies the NativeWidget that a view was removed from the Widget's view - // hierarchy. - virtual void ViewRemoved(View* view) = 0; - - // Sets/Gets a native window property on the underlying native window object. - // Returns NULL if the property does not exist. Setting the property value to - // NULL removes the property. - virtual void SetNativeWindowProperty(const char* name, void* value) = 0; - virtual void* GetNativeWindowProperty(const char* name) const = 0; - - // Returns the native widget's tooltip manager. Called from the View hierarchy - // to update tooltips. - virtual TooltipManager* GetTooltipManager() const = 0; - - // Returns true if a system screen reader is active for the NativeWidget. - virtual bool IsScreenReaderActive() const = 0; - - // Notify native Accessibility clients of an event. - virtual void SendNativeAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type) = 0; - - // Sets or releases event capturing for this native widget. - virtual void SetMouseCapture() = 0; - virtual void ReleaseMouseCapture() = 0; - - // Returns true if this native widget is capturing mouse events. - virtual bool HasMouseCapture() const = 0; - - // Returns the InputMethod for this native widget. - // Note that all widgets in a widget hierarchy share the same input method. - // TODO(suzhe): rename to GetInputMethod() when NativeWidget implementation - // class doesn't inherit Widget anymore. - virtual InputMethod* CreateInputMethod() = 0; - - - // Centers the window and sizes it to the specified size. - virtual void CenterWindow(const gfx::Size& size) = 0; - - // Retrieves the window's current restored bounds and "show" state, for - // persisting. - virtual void GetWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* show_state) const = 0; - - // Sets the NativeWindow title. - virtual void SetWindowTitle(const string16& title) = 0; - - // Sets the Window icons. |window_icon| is a 16x16 icon suitable for use in - // a title bar. |app_icon| is a larger size for use in the host environment - // app switching UI. - virtual void SetWindowIcons(const SkBitmap& window_icon, - const SkBitmap& app_icon) = 0; - - // Update native accessibility properties on the native window. - virtual void SetAccessibleName(const string16& name) = 0; - virtual void SetAccessibleRole(ui::AccessibilityTypes::Role role) = 0; - virtual void SetAccessibleState(ui::AccessibilityTypes::State state) = 0; - - // Makes the NativeWindow modal. - virtual void BecomeModal() = 0; - - // See method documentation in Widget. - virtual gfx::Rect GetWindowScreenBounds() const = 0; - virtual gfx::Rect GetClientAreaScreenBounds() const = 0; - virtual gfx::Rect GetRestoredBounds() const = 0; - virtual void SetBounds(const gfx::Rect& bounds) = 0; - virtual void SetSize(const gfx::Size& size) = 0; - virtual void MoveAbove(gfx::NativeView native_view) = 0; - virtual void MoveToTop() = 0; - virtual void SetShape(gfx::NativeRegion shape) = 0; - virtual void Close() = 0; - virtual void CloseNow() = 0; - virtual void EnableClose(bool enable) = 0; - virtual void Show() = 0; - virtual void Hide() = 0; - // Invoked if the initial show should maximize the window. |restored_bounds| - // is the bounds of the window when not maximized. - virtual void ShowMaximizedWithBounds(const gfx::Rect& restored_bounds) = 0; - virtual void ShowWithWindowState(ui::WindowShowState show_state) = 0; - virtual bool IsVisible() const = 0; - virtual void Activate() = 0; - virtual void Deactivate() = 0; - virtual bool IsActive() const = 0; - virtual void SetAlwaysOnTop(bool always_on_top) = 0; - virtual void Maximize() = 0; - virtual void Minimize() = 0; - virtual bool IsMaximized() const = 0; - virtual bool IsMinimized() const = 0; - virtual void Restore() = 0; - virtual void SetFullscreen(bool fullscreen) = 0; - virtual bool IsFullscreen() const = 0; - virtual void SetOpacity(unsigned char opacity) = 0; - virtual void SetUseDragFrame(bool use_drag_frame) = 0; - virtual bool IsAccessibleWidget() const = 0; - virtual void RunShellDrag(View* view, - const ui::OSExchangeData& data, - int operation) = 0; - virtual void SchedulePaintInRect(const gfx::Rect& rect) = 0; - virtual void SetCursor(gfx::NativeCursor cursor) = 0; - virtual void ClearNativeFocus() = 0; - virtual void FocusNativeView(gfx::NativeView native_view) = 0; - virtual bool ConvertPointFromAncestor( - const Widget* ancestor, gfx::Point* point) const = 0; - virtual gfx::Rect GetWorkAreaBoundsInScreen() const = 0; - virtual void SetInactiveRenderingDisabled(bool value) = 0; - - // Overridden from NativeWidget: - virtual internal::NativeWidgetPrivate* AsNativeWidgetPrivate() OVERRIDE; -}; - -} // namespace internal -} // namespace views - -#endif // UI_VIEWS_WIDGET_NATIVE_WIDGET_PRIVATE_H_ diff --git a/ui/views/widget/native_widget_test_utils.h b/ui/views/widget/native_widget_test_utils.h deleted file mode 100644 index 91a2d77..0000000 --- a/ui/views/widget/native_widget_test_utils.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_TEST_UTILS_H_ -#define UI_VIEWS_WIDGET_NATIVE_WIDGET_TEST_UTILS_H_ -#pragma once - -namespace views { -namespace internal { - -class NativeWidgetPrivate; - -// Create dummy widgets for use in testing. Caller owns the returned -// |NativeWidgetPrivate| object which, in turn, owns the associated Widget. -NativeWidgetPrivate* CreateNativeWidget(); -NativeWidgetPrivate* CreateNativeSubWidget(); - -} // namespace internal -} // namespace views - -#endif // UI_VIEWS_WIDGET_NATIVE_WIDGET_TEST_UTILS_H_ diff --git a/ui/views/widget/native_widget_test_utils_aura.cc b/ui/views/widget/native_widget_test_utils_aura.cc deleted file mode 100644 index 4b0ecec..0000000 --- a/ui/views/widget/native_widget_test_utils_aura.cc +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/native_widget_test_utils.h" - -#include "ui/views/widget/native_widget_private.h" -#include "ui/views/widget/widget.h" -#include "views/view.h" - -namespace views { -namespace internal { - -namespace { - -NativeWidgetPrivate* CreateNativeWidgetOfType(Widget::InitParams::Type type) { - Widget* widget = new Widget; - Widget::InitParams params(type); - params.ownership = views::Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET; - params.child = false; // Implicitly set to true by ctor with TYPE_CONTROL. - params.bounds = gfx::Rect(10, 10, 200, 200); - widget->Init(params); - return widget->native_widget_private(); -} - -} // namespace - -NativeWidgetPrivate* CreateNativeWidget() { - return CreateNativeWidgetOfType(Widget::InitParams::TYPE_POPUP); -} - -NativeWidgetPrivate* CreateNativeSubWidget() { - return CreateNativeWidgetOfType(Widget::InitParams::TYPE_CONTROL); -} - -} // namespace internal -} // namespace ui diff --git a/ui/views/widget/native_widget_test_utils_gtk.cc b/ui/views/widget/native_widget_test_utils_gtk.cc deleted file mode 100644 index 60c2050..0000000 --- a/ui/views/widget/native_widget_test_utils_gtk.cc +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/native_widget_test_utils.h" - -#include "ui/views/widget/native_widget_private.h" -#include "ui/views/widget/widget.h" -#include "views/view.h" - -namespace views { -namespace internal { - -namespace { - -NativeWidgetPrivate* CreateNativeWidgetOfType(Widget::InitParams::Type type) { - Widget* widget = new Widget; - Widget::InitParams params(type); - params.ownership = views::Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET; - params.bounds = gfx::Rect(10, 10, 200, 200); - widget->Init(params); - return widget->native_widget_private(); -} - -} // namespace - -NativeWidgetPrivate* CreateNativeWidget() { - return CreateNativeWidgetOfType(Widget::InitParams::TYPE_POPUP); -} - -NativeWidgetPrivate* CreateNativeSubWidget() { - return CreateNativeWidgetOfType(Widget::InitParams::TYPE_CONTROL); -} - -} // namespace internal -} // namespace ui diff --git a/ui/views/widget/native_widget_test_utils_win.cc b/ui/views/widget/native_widget_test_utils_win.cc deleted file mode 100644 index 4b0ecec..0000000 --- a/ui/views/widget/native_widget_test_utils_win.cc +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/native_widget_test_utils.h" - -#include "ui/views/widget/native_widget_private.h" -#include "ui/views/widget/widget.h" -#include "views/view.h" - -namespace views { -namespace internal { - -namespace { - -NativeWidgetPrivate* CreateNativeWidgetOfType(Widget::InitParams::Type type) { - Widget* widget = new Widget; - Widget::InitParams params(type); - params.ownership = views::Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET; - params.child = false; // Implicitly set to true by ctor with TYPE_CONTROL. - params.bounds = gfx::Rect(10, 10, 200, 200); - widget->Init(params); - return widget->native_widget_private(); -} - -} // namespace - -NativeWidgetPrivate* CreateNativeWidget() { - return CreateNativeWidgetOfType(Widget::InitParams::TYPE_POPUP); -} - -NativeWidgetPrivate* CreateNativeSubWidget() { - return CreateNativeWidgetOfType(Widget::InitParams::TYPE_CONTROL); -} - -} // namespace internal -} // namespace ui diff --git a/ui/views/widget/native_widget_unittest.cc b/ui/views/widget/native_widget_unittest.cc deleted file mode 100644 index 5af3a3f..0000000 --- a/ui/views/widget/native_widget_unittest.cc +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/views/test/views_test_base.h" -#include "ui/views/widget/native_widget_private.h" -#include "ui/views/widget/native_widget_test_utils.h" -#include "ui/views/widget/widget.h" -#include "views/controls/native/native_view_host.h" -#include "views/view.h" - -namespace views { - -class ScopedTestWidget { - public: - ScopedTestWidget(internal::NativeWidgetPrivate* native_widget) - : native_widget_(native_widget) { - } - ~ScopedTestWidget() { - // |CloseNow| deletes both |native_widget_| and its associated - // |Widget|. - native_widget_->GetWidget()->CloseNow(); - } - - internal::NativeWidgetPrivate* operator->() const { - return native_widget_; - } - internal::NativeWidgetPrivate* get() const { return native_widget_; } - - private: - internal::NativeWidgetPrivate* native_widget_; - DISALLOW_COPY_AND_ASSIGN(ScopedTestWidget); -}; - -class NativeWidgetTest : public ViewsTestBase { - public: - NativeWidgetTest() {} - virtual ~NativeWidgetTest() {} - - private: - DISALLOW_COPY_AND_ASSIGN(NativeWidgetTest); -}; - -TEST_F(NativeWidgetTest, CreateNativeWidget) { - ScopedTestWidget widget(internal::CreateNativeWidget()); - EXPECT_TRUE(widget->GetWidget()->GetNativeView() != NULL); -} - -TEST_F(NativeWidgetTest, GetNativeWidgetForNativeView) { - ScopedTestWidget widget(internal::CreateNativeWidget()); - EXPECT_EQ(widget.get(), - internal::NativeWidgetPrivate::GetNativeWidgetForNativeView( - widget->GetWidget()->GetNativeView())); -} - -// |widget| has the toplevel NativeWidget. -TEST_F(NativeWidgetTest, GetTopLevelNativeWidget1) { - ScopedTestWidget widget(internal::CreateNativeWidget()); - EXPECT_EQ(widget.get(), - internal::NativeWidgetPrivate::GetTopLevelNativeWidget( - widget->GetWidget()->GetNativeView())); -} - -// |toplevel_widget| has the toplevel NativeWidget. -TEST_F(NativeWidgetTest, GetTopLevelNativeWidget2) { - ScopedTestWidget toplevel_widget(internal::CreateNativeWidget()); - - // |toplevel_widget| owns |child_host|. - NativeViewHost* child_host = new NativeViewHost; - toplevel_widget->GetWidget()->SetContentsView(child_host); - - // |child_host| owns |child_widget|. - internal::NativeWidgetPrivate* child_widget = - internal::CreateNativeSubWidget(); - child_host->Attach(child_widget->GetWidget()->GetNativeView()); - - EXPECT_EQ(toplevel_widget.get(), - internal::NativeWidgetPrivate::GetTopLevelNativeWidget( - child_widget->GetWidget()->GetNativeView())); -} - -} // namespace views diff --git a/ui/views/widget/native_widget_win.cc b/ui/views/widget/native_widget_win.cc deleted file mode 100644 index 6cfdfd1..0000000 --- a/ui/views/widget/native_widget_win.cc +++ /dev/null @@ -1,2531 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/native_widget_win.h" - -#include <dwmapi.h> -#include <shellapi.h> - -#include <algorithm> - -#include "base/bind.h" -#include "base/string_util.h" -#include "base/system_monitor/system_monitor.h" -#include "base/win/scoped_gdi_object.h" -#include "base/win/win_util.h" -#include "base/win/windows_version.h" -#include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/base/dragdrop/drag_source.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/dragdrop/os_exchange_data_provider_win.h" -#include "ui/base/keycodes/keyboard_code_conversion_win.h" -#include "ui/base/l10n/l10n_util_win.h" -#include "ui/base/theme_provider.h" -#include "ui/base/view_prop.h" -#include "ui/base/win/hwnd_util.h" -#include "ui/base/win/mouse_wheel_util.h" -#include "ui/gfx/canvas_skia.h" -#include "ui/gfx/canvas_skia_paint.h" -#include "ui/gfx/compositor/compositor.h" -#include "ui/gfx/icon_util.h" -#include "ui/gfx/native_theme_win.h" -#include "ui/gfx/path.h" -#include "ui/gfx/screen.h" -#include "ui/views/accessibility/native_view_accessibility_win.h" -#include "ui/views/focus/accelerator_handler.h" -#include "ui/views/focus/view_storage.h" -#include "ui/views/ime/input_method_win.h" -#include "ui/views/widget/aero_tooltip_manager.h" -#include "ui/views/widget/aero_tooltip_manager.h" -#include "ui/views/widget/child_window_message_processor.h" -#include "ui/views/widget/child_window_message_processor.h" -#include "ui/views/widget/drop_target_win.h" -#include "ui/views/widget/drop_target_win.h" -#include "ui/views/widget/monitor_win.h" -#include "ui/views/widget/monitor_win.h" -#include "ui/views/widget/native_widget_delegate.h" -#include "ui/views/widget/native_widget_delegate.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/widget_delegate.h" -#include "ui/views/widget/widget_delegate.h" -#include "ui/views/window/native_frame_view.h" -#include "views/controls/native_control_win.h" -#include "views/controls/textfield/native_textfield_views.h" -#include "views/views_delegate.h" - -#pragma comment(lib, "dwmapi.lib") - -using ui::ViewProp; - -namespace views { - -namespace { - -// Get the source HWND of the specified message. Depending on the message, the -// source HWND is encoded in either the WPARAM or the LPARAM value. -HWND GetControlHWNDForMessage(UINT message, WPARAM w_param, LPARAM l_param) { - // Each of the following messages can be sent by a child HWND and must be - // forwarded to its associated NativeControlWin for handling. - switch (message) { - case WM_NOTIFY: - return reinterpret_cast<NMHDR*>(l_param)->hwndFrom; - case WM_COMMAND: - return reinterpret_cast<HWND>(l_param); - case WM_CONTEXTMENU: - return reinterpret_cast<HWND>(w_param); - case WM_CTLCOLORBTN: - case WM_CTLCOLORSTATIC: - return reinterpret_cast<HWND>(l_param); - } - return NULL; -} - -// Some messages may be sent to us by a child HWND. If this is the case, this -// function will forward those messages on to the object associated with the -// source HWND and return true, in which case the window procedure must not do -// any further processing of the message. If there is no associated -// ChildWindowMessageProcessor, the return value will be false and the WndProc -// can continue processing the message normally. |l_result| contains the result -// of the message processing by the control and must be returned by the WndProc -// if the return value is true. -bool ProcessChildWindowMessage(UINT message, - WPARAM w_param, - LPARAM l_param, - LRESULT* l_result) { - *l_result = 0; - - HWND control_hwnd = GetControlHWNDForMessage(message, w_param, l_param); - if (IsWindow(control_hwnd)) { - ChildWindowMessageProcessor* processor = - ChildWindowMessageProcessor::Get(control_hwnd); - if (processor) - return processor->ProcessMessage(message, w_param, l_param, l_result); - } - - return false; -} - -// Enumeration callback for NativeWidget::GetAllChildWidgets(). Called for each -// child HWND beneath the original HWND. -BOOL CALLBACK EnumerateChildWindowsForNativeWidgets(HWND hwnd, LPARAM l_param) { - Widget* widget = Widget::GetWidgetForNativeView(hwnd); - if (widget) { - Widget::Widgets* widgets = reinterpret_cast<Widget::Widgets*>(l_param); - widgets->insert(widget); - } - return TRUE; -} - -// Returns true if the WINDOWPOS data provided indicates the client area of -// the window may have changed size. This can be caused by the window being -// resized or its frame changing. -bool DidClientAreaSizeChange(const WINDOWPOS* window_pos) { - return !(window_pos->flags & SWP_NOSIZE) || - window_pos->flags & SWP_FRAMECHANGED; -} - -// Callback used to notify child windows that the top level window received a -// DWMCompositionChanged message. -BOOL CALLBACK SendDwmCompositionChanged(HWND window, LPARAM param) { - SendMessage(window, WM_DWMCOMPOSITIONCHANGED, 0, 0); - return TRUE; -} - -// Tells the window its frame (non-client area) has changed. -void SendFrameChanged(HWND window) { - SetWindowPos(window, NULL, 0, 0, 0, 0, - SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOCOPYBITS | - SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREPOSITION | - SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOZORDER); -} - -// Enables or disables the menu item for the specified command and menu. -void EnableMenuItem(HMENU menu, UINT command, bool enabled) { - UINT flags = MF_BYCOMMAND | (enabled ? MF_ENABLED : MF_DISABLED | MF_GRAYED); - EnableMenuItem(menu, command, flags); -} - -BOOL CALLBACK EnumChildWindowsForRedraw(HWND hwnd, LPARAM lparam) { - DWORD process_id; - GetWindowThreadProcessId(hwnd, &process_id); - int flags = RDW_INVALIDATE | RDW_NOCHILDREN | RDW_FRAME; - if (process_id == GetCurrentProcessId()) - flags |= RDW_UPDATENOW; - RedrawWindow(hwnd, NULL, NULL, flags); - return TRUE; -} - -// See comments in OnNCPaint() for details of this struct. -struct ClipState { - // The window being painted. - HWND parent; - - // DC painting to. - HDC dc; - - // Origin of the window in terms of the screen. - int x; - int y; -}; - -// See comments in OnNCPaint() for details of this function. -static BOOL CALLBACK ClipDCToChild(HWND window, LPARAM param) { - ClipState* clip_state = reinterpret_cast<ClipState*>(param); - if (GetParent(window) == clip_state->parent && IsWindowVisible(window)) { - RECT bounds; - GetWindowRect(window, &bounds); - ExcludeClipRect(clip_state->dc, - bounds.left - clip_state->x, - bounds.top - clip_state->y, - bounds.right - clip_state->x, - bounds.bottom - clip_state->y); - } - return TRUE; -} - -// The thickness of an auto-hide taskbar in pixels. -static const int kAutoHideTaskbarThicknessPx = 2; - -bool GetMonitorAndRects(const RECT& rect, - HMONITOR* monitor, - gfx::Rect* monitor_rect, - gfx::Rect* work_area) { - DCHECK(monitor); - DCHECK(monitor_rect); - DCHECK(work_area); - *monitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONULL); - if (!*monitor) - return false; - MONITORINFO monitor_info = { 0 }; - monitor_info.cbSize = sizeof(monitor_info); - GetMonitorInfo(*monitor, &monitor_info); - *monitor_rect = monitor_info.rcMonitor; - *work_area = monitor_info.rcWork; - return true; -} - -// Links the HWND to its NativeWidget. -const char* const kNativeWidgetKey = "__VIEWS_NATIVE_WIDGET__"; - -// A custom MSAA object id used to determine if a screen reader is actively -// listening for MSAA events. -const int kCustomObjectID = 1; - -const int kDragFrameWindowAlpha = 200; - -} // namespace - -// static -bool NativeWidgetWin::screen_reader_active_ = false; - -// A scoping class that prevents a window from being able to redraw in response -// to invalidations that may occur within it for the lifetime of the object. -// -// Why would we want such a thing? Well, it turns out Windows has some -// "unorthodox" behavior when it comes to painting its non-client areas. -// Occasionally, Windows will paint portions of the default non-client area -// right over the top of the custom frame. This is not simply fixed by handling -// WM_NCPAINT/WM_PAINT, with some investigation it turns out that this -// rendering is being done *inside* the default implementation of some message -// handlers and functions: -// . WM_SETTEXT -// . WM_SETICON -// . WM_NCLBUTTONDOWN -// . EnableMenuItem, called from our WM_INITMENU handler -// The solution is to handle these messages and call DefWindowProc ourselves, -// but prevent the window from being able to update itself for the duration of -// the call. We do this with this class, which automatically calls its -// associated Window's lock and unlock functions as it is created and destroyed. -// See documentation in those methods for the technique used. -// -// The lock only has an effect if the window was visible upon lock creation, as -// it doesn't guard against direct visiblility changes, and multiple locks may -// exist simultaneously to handle certain nested Windows messages. -// -// IMPORTANT: Do not use this scoping object for large scopes or periods of -// time! IT WILL PREVENT THE WINDOW FROM BEING REDRAWN! (duh). -// -// I would love to hear Raymond Chen's explanation for all this. And maybe a -// list of other messages that this applies to ;-) -class NativeWidgetWin::ScopedRedrawLock { - public: - explicit ScopedRedrawLock(NativeWidgetWin* widget) - : widget_(widget), - native_view_(widget_->GetNativeView()), - was_visible_(widget_->IsVisible()), - cancel_unlock_(false) { - if (was_visible_ && ::IsWindow(native_view_)) - widget_->LockUpdates(); - } - - ~ScopedRedrawLock() { - if (!cancel_unlock_ && was_visible_ && ::IsWindow(native_view_)) - widget_->UnlockUpdates(); - } - - // Cancel the unlock operation, call this if the Widget is being destroyed. - void CancelUnlockOperation() { cancel_unlock_ = true; } - - private: - // The widget having its style changed. - NativeWidgetWin* widget_; - // The widget's native view, cached to avoid action after window destruction. - gfx::NativeView native_view_; - // Records the widget visibility at the time of creation. - bool was_visible_; - // A flag indicating that the unlock operation was canceled. - bool cancel_unlock_; -}; - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, public: - -NativeWidgetWin::NativeWidgetWin(internal::NativeWidgetDelegate* delegate) - : delegate_(delegate), - ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)), - active_mouse_tracking_flags_(0), - use_layered_buffer_(false), - layered_alpha_(255), - ALLOW_THIS_IN_INITIALIZER_LIST(paint_layered_window_factory_(this)), - ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), - can_update_layered_window_(true), - restore_focus_when_enabled_(false), - accessibility_view_events_index_(-1), - accessibility_view_events_(kMaxAccessibilityViewEvents), - previous_cursor_(NULL), - fullscreen_(false), - force_hidden_count_(0), - lock_updates_count_(0), - saved_window_style_(0), - ignore_window_pos_changes_(false), - ALLOW_THIS_IN_INITIALIZER_LIST(ignore_pos_changes_factory_(this)), - last_monitor_(NULL), - is_right_mouse_pressed_on_caption_(false), - restored_enabled_(false), - destroyed_(NULL), - has_non_client_view_(false) { -} - -NativeWidgetWin::~NativeWidgetWin() { - if (destroyed_ != NULL) - *destroyed_ = true; - - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) - delete delegate_; - else - CloseNow(); -} - -// static -bool NativeWidgetWin::IsAeroGlassEnabled() { - if (base::win::GetVersion() < base::win::VERSION_VISTA) - return false; - // If composition is not enabled, we behave like on XP. - BOOL enabled = FALSE; - return SUCCEEDED(DwmIsCompositionEnabled(&enabled)) && enabled; -} - -// static -gfx::Font NativeWidgetWin::GetWindowTitleFont() { - NONCLIENTMETRICS ncm; - base::win::GetNonClientMetrics(&ncm); - l10n_util::AdjustUIFont(&(ncm.lfCaptionFont)); - base::win::ScopedHFONT caption_font(CreateFontIndirect(&(ncm.lfCaptionFont))); - return gfx::Font(caption_font); -} - -void NativeWidgetWin::Show(int show_state) { - ShowWindow(show_state); - // When launched from certain programs like bash and Windows Live Messenger, - // show_state is set to SW_HIDE, so we need to correct that condition. We - // don't just change show_state to SW_SHOWNORMAL because MSDN says we must - // always first call ShowWindow with the specified value from STARTUPINFO, - // otherwise all future ShowWindow calls will be ignored (!!#@@#!). Instead, - // we call ShowWindow again in this case. - if (show_state == SW_HIDE) { - show_state = SW_SHOWNORMAL; - ShowWindow(show_state); - } - - // We need to explicitly activate the window if we've been shown with a state - // that should activate, because if we're opened from a desktop shortcut while - // an existing window is already running it doesn't seem to be enough to use - // one of these flags to activate the window. - if (show_state == SW_SHOWNORMAL || show_state == SW_SHOWMAXIMIZED) - Activate(); - - SetInitialFocus(); -} - -View* NativeWidgetWin::GetAccessibilityViewEventAt(int id) { - // Convert from MSAA child id. - id = -(id + 1); - DCHECK(id >= 0 && id < kMaxAccessibilityViewEvents); - return accessibility_view_events_[id]; -} - -int NativeWidgetWin::AddAccessibilityViewEvent(View* view) { - accessibility_view_events_index_ = - (accessibility_view_events_index_ + 1) % kMaxAccessibilityViewEvents; - accessibility_view_events_[accessibility_view_events_index_] = view; - - // Convert to MSAA child id. - return -(accessibility_view_events_index_ + 1); -} - -void NativeWidgetWin::ClearAccessibilityViewEvent(View* view) { - for (std::vector<View*>::iterator it = accessibility_view_events_.begin(); - it != accessibility_view_events_.end(); - ++it) { - if (*it == view) - *it = NULL; - } -} - -void NativeWidgetWin::PushForceHidden() { - if (force_hidden_count_++ == 0) - Hide(); -} - -void NativeWidgetWin::PopForceHidden() { - if (--force_hidden_count_ <= 0) { - force_hidden_count_ = 0; - ShowWindow(SW_SHOW); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, CompositorDelegate implementation: - -void NativeWidgetWin::ScheduleDraw() { - RECT rect; - ::GetClientRect(GetNativeView(), &rect); - InvalidateRect(GetNativeView(), &rect, FALSE); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, NativeWidget implementation: - -void NativeWidgetWin::InitNativeWidget(const Widget::InitParams& params) { - SetInitParams(params); - - GetMonitorAndRects(params.bounds.ToRECT(), &last_monitor_, - &last_monitor_rect_, &last_work_area_); - - // Create the window. - WindowImpl::Init(params.GetParent(), params.bounds); -} - -NonClientFrameView* NativeWidgetWin::CreateNonClientFrameView() { - return GetWidget()->ShouldUseNativeFrame() ? - new NativeFrameView(GetWidget()) : NULL; -} - -void NativeWidgetWin::UpdateFrameAfterFrameChange() { - // We've either gained or lost a custom window region, so reset it now. - ResetWindowRegion(true); -} - -bool NativeWidgetWin::ShouldUseNativeFrame() const { - return IsAeroGlassEnabled(); -} - -void NativeWidgetWin::FrameTypeChanged() { - // Called when the frame type could possibly be changing (theme change or - // DWM composition change). - if (base::win::GetVersion() >= base::win::VERSION_VISTA) { - // We need to toggle the rendering policy of the DWM/glass frame as we - // change from opaque to glass. "Non client rendering enabled" means that - // the DWM's glass non-client rendering is enabled, which is why - // DWMNCRP_ENABLED is used for the native frame case. _DISABLED means the - // DWM doesn't render glass, and so is used in the custom frame case. - DWMNCRENDERINGPOLICY policy = GetWidget()->ShouldUseNativeFrame() ? - DWMNCRP_ENABLED : DWMNCRP_DISABLED; - DwmSetWindowAttribute(GetNativeView(), DWMWA_NCRENDERING_POLICY, - &policy, sizeof(DWMNCRENDERINGPOLICY)); - } - - // Send a frame change notification, since the non-client metrics have - // changed. - SendFrameChanged(GetNativeView()); - - // Update the non-client view with the correct frame view for the active frame - // type. - GetWidget()->non_client_view()->UpdateFrame(); - - // WM_DWMCOMPOSITIONCHANGED is only sent to top level windows, however we want - // to notify our children too, since we can have MDI child windows who need to - // update their appearance. - EnumChildWindows(GetNativeView(), &SendDwmCompositionChanged, NULL); -} - -Widget* NativeWidgetWin::GetWidget() { - return delegate_->AsWidget(); -} - -const Widget* NativeWidgetWin::GetWidget() const { - return delegate_->AsWidget(); -} - -gfx::NativeView NativeWidgetWin::GetNativeView() const { - return WindowImpl::hwnd(); -} - -gfx::NativeWindow NativeWidgetWin::GetNativeWindow() const { - return WindowImpl::hwnd(); -} - -Widget* NativeWidgetWin::GetTopLevelWidget() { - NativeWidgetPrivate* native_widget = GetTopLevelNativeWidget(GetNativeView()); - return native_widget ? native_widget->GetWidget() : NULL; -} - -const ui::Compositor* NativeWidgetWin::GetCompositor() const { - return compositor_.get(); -} - -ui::Compositor* NativeWidgetWin::GetCompositor() { - return compositor_.get(); -} - -void NativeWidgetWin::CalculateOffsetToAncestorWithLayer( - gfx::Point* offset, - ui::Layer** layer_parent) { -} - -void NativeWidgetWin::ReorderLayers() { -} - -void NativeWidgetWin::ViewRemoved(View* view) { - if (drop_target_.get()) - drop_target_->ResetTargetViewIfEquals(view); - - ClearAccessibilityViewEvent(view); -} - -void NativeWidgetWin::SetNativeWindowProperty(const char* name, void* value) { - // Remove the existing property (if any). - for (ViewProps::iterator i = props_.begin(); i != props_.end(); ++i) { - if ((*i)->Key() == name) { - props_.erase(i); - break; - } - } - - if (value) - props_.push_back(new ViewProp(hwnd(), name, value)); -} - -void* NativeWidgetWin::GetNativeWindowProperty(const char* name) const { - return ViewProp::GetValue(hwnd(), name); -} - -TooltipManager* NativeWidgetWin::GetTooltipManager() const { - return tooltip_manager_.get(); -} - -bool NativeWidgetWin::IsScreenReaderActive() const { - return screen_reader_active_; -} - -void NativeWidgetWin::SendNativeAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type) { - // Now call the Windows-specific method to notify MSAA clients of this - // event. The widget gives us a temporary unique child ID to associate - // with this view so that clients can call get_accChild in - // NativeViewAccessibilityWin to retrieve the IAccessible associated - // with this view. - int child_id = AddAccessibilityViewEvent(view); - ::NotifyWinEvent(NativeViewAccessibilityWin::MSAAEvent(event_type), - GetNativeView(), OBJID_CLIENT, child_id); -} - -void NativeWidgetWin::SetMouseCapture() { - DCHECK(!HasMouseCapture()); - SetCapture(hwnd()); -} - -void NativeWidgetWin::ReleaseMouseCapture() { - ReleaseCapture(); -} - -bool NativeWidgetWin::HasMouseCapture() const { - return GetCapture() == hwnd(); -} - -InputMethod* NativeWidgetWin::CreateInputMethod() { - if (views::Widget::IsPureViews()) { - InputMethod* input_method = new InputMethodWin(this); - input_method->Init(GetWidget()); - return input_method; - } - return NULL; -} - -void NativeWidgetWin::CenterWindow(const gfx::Size& size) { - HWND parent = GetParent(); - if (!IsWindow()) - parent = ::GetWindow(GetNativeView(), GW_OWNER); - ui::CenterAndSizeWindow(parent, GetNativeView(), size, false); -} - -void NativeWidgetWin::GetWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* show_state) const { - WINDOWPLACEMENT wp; - wp.length = sizeof(wp); - const bool succeeded = !!::GetWindowPlacement(GetNativeView(), &wp); - DCHECK(succeeded); - - if (bounds != NULL) { - MONITORINFO mi; - mi.cbSize = sizeof(mi); - const bool succeeded = !!GetMonitorInfo( - MonitorFromWindow(GetNativeView(), MONITOR_DEFAULTTONEAREST), &mi); - DCHECK(succeeded); - *bounds = gfx::Rect(wp.rcNormalPosition); - // Convert normal position from workarea coordinates to screen coordinates. - bounds->Offset(mi.rcWork.left - mi.rcMonitor.left, - mi.rcWork.top - mi.rcMonitor.top); - } - - if (show_state != NULL) { - if (wp.showCmd == SW_SHOWMAXIMIZED) - *show_state = ui::SHOW_STATE_MAXIMIZED; - else if (wp.showCmd == SW_SHOWMINIMIZED) - *show_state = ui::SHOW_STATE_MINIMIZED; - else - *show_state = ui::SHOW_STATE_NORMAL; - } -} - -void NativeWidgetWin::SetWindowTitle(const string16& title) { - SetWindowText(GetNativeView(), title.c_str()); - SetAccessibleName(title); -} - -void NativeWidgetWin::SetWindowIcons(const SkBitmap& window_icon, - const SkBitmap& app_icon) { - if (!window_icon.isNull()) { - HICON windows_icon = IconUtil::CreateHICONFromSkBitmap(window_icon); - // We need to make sure to destroy the previous icon, otherwise we'll leak - // these GDI objects until we crash! - HICON old_icon = reinterpret_cast<HICON>( - SendMessage(GetNativeView(), WM_SETICON, ICON_SMALL, - reinterpret_cast<LPARAM>(windows_icon))); - if (old_icon) - DestroyIcon(old_icon); - } - if (!app_icon.isNull()) { - HICON windows_icon = IconUtil::CreateHICONFromSkBitmap(app_icon); - HICON old_icon = reinterpret_cast<HICON>( - SendMessage(GetNativeView(), WM_SETICON, ICON_BIG, - reinterpret_cast<LPARAM>(windows_icon))); - if (old_icon) - DestroyIcon(old_icon); - } -} - -void NativeWidgetWin::SetAccessibleName(const string16& name) { - base::win::ScopedComPtr<IAccPropServices> pAccPropServices; - HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, - IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); - if (SUCCEEDED(hr)) - hr = pAccPropServices->SetHwndPropStr(GetNativeView(), OBJID_CLIENT, - CHILDID_SELF, PROPID_ACC_NAME, - name.c_str()); -} - -void NativeWidgetWin::SetAccessibleRole(ui::AccessibilityTypes::Role role) { - base::win::ScopedComPtr<IAccPropServices> pAccPropServices; - HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, - IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); - if (SUCCEEDED(hr)) { - VARIANT var; - if (role) { - var.vt = VT_I4; - var.lVal = NativeViewAccessibilityWin::MSAARole(role); - hr = pAccPropServices->SetHwndProp(GetNativeView(), OBJID_CLIENT, - CHILDID_SELF, PROPID_ACC_ROLE, var); - } - } -} - -void NativeWidgetWin::SetAccessibleState(ui::AccessibilityTypes::State state) { - base::win::ScopedComPtr<IAccPropServices> pAccPropServices; - HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, - IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); - if (SUCCEEDED(hr)) { - VARIANT var; - if (state) { - var.vt = VT_I4; - var.lVal = NativeViewAccessibilityWin::MSAAState(state); - hr = pAccPropServices->SetHwndProp(GetNativeView(), OBJID_CLIENT, - CHILDID_SELF, PROPID_ACC_STATE, var); - } - } -} - -void NativeWidgetWin::BecomeModal() { - // We implement modality by crawling up the hierarchy of windows starting - // at the owner, disabling all of them so that they don't receive input - // messages. - HWND start = ::GetWindow(GetNativeView(), GW_OWNER); - while (start) { - ::EnableWindow(start, FALSE); - start = ::GetParent(start); - } -} - -gfx::Rect NativeWidgetWin::GetWindowScreenBounds() const { - RECT r; - GetWindowRect(&r); - return gfx::Rect(r); -} - -gfx::Rect NativeWidgetWin::GetClientAreaScreenBounds() const { - RECT r; - GetClientRect(&r); - POINT point = { r.left, r.top }; - ClientToScreen(hwnd(), &point); - return gfx::Rect(point.x, point.y, r.right - r.left, r.bottom - r.top); -} - -gfx::Rect NativeWidgetWin::GetRestoredBounds() const { - // If we're in fullscreen mode, we've changed the normal bounds to the monitor - // rect, so return the saved bounds instead. - if (IsFullscreen()) - return gfx::Rect(saved_window_info_.window_rect); - - gfx::Rect bounds; - GetWindowPlacement(&bounds, NULL); - return bounds; -} - -void NativeWidgetWin::SetBounds(const gfx::Rect& bounds) { - LONG style = GetWindowLong(GWL_STYLE); - if (style & WS_MAXIMIZE) - SetWindowLong(GWL_STYLE, style & ~WS_MAXIMIZE); - SetWindowPos(NULL, bounds.x(), bounds.y(), bounds.width(), bounds.height(), - SWP_NOACTIVATE | SWP_NOZORDER); -} - -void NativeWidgetWin::SetSize(const gfx::Size& size) { - SetWindowPos(NULL, 0, 0, size.width(), size.height(), - SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); -} - -void NativeWidgetWin::MoveAbove(gfx::NativeView native_view) { - SetWindowPos(native_view, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); -} - -void NativeWidgetWin::MoveToTop() { - NOTIMPLEMENTED(); -} - -void NativeWidgetWin::SetShape(gfx::NativeRegion region) { - SetWindowRgn(region, TRUE); -} - -void NativeWidgetWin::Close() { - if (!IsWindow()) - return; // No need to do anything. - - // Let's hide ourselves right away. - Hide(); - - // Modal dialog windows disable their owner windows; re-enable them now so - // they can activate as foreground windows upon this window's destruction. - RestoreEnabledIfNecessary(); - - if (!close_widget_factory_.HasWeakPtrs()) { - // And we delay the close so that if we are called from an ATL callback, - // we don't destroy the window before the callback returned (as the caller - // may delete ourselves on destroy and the ATL callback would still - // dereference us when the callback returns). - MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&NativeWidgetWin::CloseNow, - close_widget_factory_.GetWeakPtr())); - } -} - -void NativeWidgetWin::CloseNow() { - // We may already have been destroyed if the selection resulted in a tab - // switch which will have reactivated the browser window and closed us, so - // we need to check to see if we're still a window before trying to destroy - // ourself. - if (IsWindow()) - DestroyWindow(hwnd()); -} - -void NativeWidgetWin::EnableClose(bool enable) { - // Disable the native frame's close button regardless of whether or not the - // native frame is in use, since this also affects the system menu. - EnableMenuItem(GetSystemMenu(GetNativeView(), false), SC_CLOSE, enable); - SendFrameChanged(GetNativeView()); -} - -void NativeWidgetWin::Show() { - if (!IsWindow()) - return; - - ShowWindow(SW_SHOWNOACTIVATE); - SetInitialFocus(); -} - -void NativeWidgetWin::Hide() { - if (IsWindow()) { - // NOTE: Be careful not to activate any windows here (for example, calling - // ShowWindow(SW_HIDE) will automatically activate another window). This - // code can be called while a window is being deactivated, and activating - // another window will screw up the activation that is already in progress. - SetWindowPos(NULL, 0, 0, 0, 0, - SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOMOVE | - SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER); - } -} - -void NativeWidgetWin::ShowMaximizedWithBounds( - const gfx::Rect& restored_bounds) { - WINDOWPLACEMENT placement = { 0 }; - placement.length = sizeof(WINDOWPLACEMENT); - placement.showCmd = SW_SHOWMAXIMIZED; - placement.rcNormalPosition = restored_bounds.ToRECT(); - SetWindowPlacement(hwnd(), &placement); -} - -void NativeWidgetWin::ShowWithWindowState(ui::WindowShowState show_state) { - DWORD native_show_state; - switch (show_state) { - case ui::SHOW_STATE_INACTIVE: - native_show_state = SW_SHOWNOACTIVATE; - break; - case ui::SHOW_STATE_MAXIMIZED: - native_show_state = SW_SHOWMAXIMIZED; - break; - case ui::SHOW_STATE_MINIMIZED: - native_show_state = SW_SHOWMINIMIZED; - break; - default: - native_show_state = GetShowState(); - break; - } - Show(native_show_state); -} - -bool NativeWidgetWin::IsVisible() const { - return !!::IsWindowVisible(hwnd()); -} - -void NativeWidgetWin::Activate() { - if (IsMinimized()) - ::ShowWindow(GetNativeView(), SW_RESTORE); - ::SetWindowPos(GetNativeView(), HWND_TOP, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE); - SetForegroundWindow(GetNativeView()); -} - -void NativeWidgetWin::Deactivate() { - HWND hwnd = ::GetNextWindow(GetNativeView(), GW_HWNDNEXT); - if (hwnd) - ::SetForegroundWindow(hwnd); -} - -bool NativeWidgetWin::IsActive() const { - return GetActiveWindow() == hwnd(); -} - -void NativeWidgetWin::SetAlwaysOnTop(bool on_top) { - ::SetWindowPos(GetNativeView(), on_top ? HWND_TOPMOST : HWND_NOTOPMOST, - 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); -} - -void NativeWidgetWin::Maximize() { - ExecuteSystemMenuCommand(SC_MAXIMIZE); -} - -void NativeWidgetWin::Minimize() { - ExecuteSystemMenuCommand(SC_MINIMIZE); - - delegate_->OnNativeBlur(NULL); -} - -bool NativeWidgetWin::IsMaximized() const { - return !!::IsZoomed(GetNativeView()); -} - -bool NativeWidgetWin::IsMinimized() const { - return !!::IsIconic(GetNativeView()); -} - -void NativeWidgetWin::Restore() { - ExecuteSystemMenuCommand(SC_RESTORE); -} - -void NativeWidgetWin::SetFullscreen(bool fullscreen) { - if (fullscreen_ == fullscreen) - return; // Nothing to do. - - // Reduce jankiness during the following position changes by hiding the window - // until it's in the final position. - PushForceHidden(); - - // Size/position/style window appropriately. - if (!fullscreen_) { - // Save current window information. We force the window into restored mode - // before going fullscreen because Windows doesn't seem to hide the - // taskbar if the window is in the maximized state. - saved_window_info_.maximized = IsMaximized(); - if (saved_window_info_.maximized) - Restore(); - saved_window_info_.style = GetWindowLong(GWL_STYLE); - saved_window_info_.ex_style = GetWindowLong(GWL_EXSTYLE); - GetWindowRect(&saved_window_info_.window_rect); - } - - fullscreen_ = fullscreen; - - if (fullscreen_) { - // Set new window style and size. - MONITORINFO monitor_info; - monitor_info.cbSize = sizeof(monitor_info); - GetMonitorInfo(MonitorFromWindow(GetNativeView(), MONITOR_DEFAULTTONEAREST), - &monitor_info); - gfx::Rect monitor_rect(monitor_info.rcMonitor); - SetWindowLong(GWL_STYLE, - saved_window_info_.style & ~(WS_CAPTION | WS_THICKFRAME)); - SetWindowLong(GWL_EXSTYLE, - saved_window_info_.ex_style & ~(WS_EX_DLGMODALFRAME | - WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)); - SetWindowPos(NULL, monitor_rect.x(), monitor_rect.y(), - monitor_rect.width(), monitor_rect.height(), - SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); - } else { - // Reset original window style and size. The multiple window size/moves - // here are ugly, but if SetWindowPos() doesn't redraw, the taskbar won't be - // repainted. Better-looking methods welcome. - gfx::Rect new_rect(saved_window_info_.window_rect); - SetWindowLong(GWL_STYLE, saved_window_info_.style); - SetWindowLong(GWL_EXSTYLE, saved_window_info_.ex_style); - SetWindowPos(NULL, new_rect.x(), new_rect.y(), new_rect.width(), - new_rect.height(), - SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); - if (saved_window_info_.maximized) - Maximize(); - } - - // Undo our anti-jankiness hacks. - PopForceHidden(); -} - -bool NativeWidgetWin::IsFullscreen() const { - return fullscreen_; -} - -void NativeWidgetWin::SetOpacity(unsigned char opacity) { - layered_alpha_ = static_cast<BYTE>(opacity); -} - -void NativeWidgetWin::SetUseDragFrame(bool use_drag_frame) { - if (use_drag_frame) { - // Make the frame slightly transparent during the drag operation. - drag_frame_saved_window_style_ = GetWindowLong(GWL_STYLE); - drag_frame_saved_window_ex_style_ = GetWindowLong(GWL_EXSTYLE); - SetWindowLong(GWL_EXSTYLE, - drag_frame_saved_window_ex_style_ | WS_EX_LAYERED); - // Remove the captions tyle so the window doesn't have window controls for a - // more "transparent" look. - SetWindowLong(GWL_STYLE, drag_frame_saved_window_style_ & ~WS_CAPTION); - SetLayeredWindowAttributes(GetNativeWindow(), RGB(0xFF, 0xFF, 0xFF), - kDragFrameWindowAlpha, LWA_ALPHA); - } else { - SetWindowLong(GWL_STYLE, drag_frame_saved_window_style_); - SetWindowLong(GWL_EXSTYLE, drag_frame_saved_window_ex_style_); - } -} - -bool NativeWidgetWin::IsAccessibleWidget() const { - return screen_reader_active_; -} - -void NativeWidgetWin::RunShellDrag(View* view, - const ui::OSExchangeData& data, - int operation) { - scoped_refptr<ui::DragSource> drag_source(new ui::DragSource); - DWORD effects; - DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data), drag_source, - ui::DragDropTypes::DragOperationToDropEffect(operation), &effects); -} - -void NativeWidgetWin::SchedulePaintInRect(const gfx::Rect& rect) { - if (use_layered_buffer_) { - // We must update the back-buffer immediately, since Windows' handling of - // invalid rects is somewhat mysterious. - invalid_rect_ = invalid_rect_.Union(rect); - - // In some situations, such as drag and drop, when Windows itself runs a - // nested message loop our message loop appears to be starved and we don't - // receive calls to DidProcessMessage(). This only seems to affect layered - // windows, so we schedule a redraw manually using a task, since those never - // seem to be starved. Also, wtf. - if (!paint_layered_window_factory_.HasWeakPtrs()) { - MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&NativeWidgetWin::RedrawLayeredWindowContents, - paint_layered_window_factory_.GetWeakPtr())); - } - } else { - // InvalidateRect() expects client coordinates. - RECT r = rect.ToRECT(); - InvalidateRect(hwnd(), &r, FALSE); - } -} - -void NativeWidgetWin::SetCursor(gfx::NativeCursor cursor) { - if (cursor) { - previous_cursor_ = ::SetCursor(cursor); - } else if (previous_cursor_) { - ::SetCursor(previous_cursor_); - previous_cursor_ = NULL; - } -} - -void NativeWidgetWin::ClearNativeFocus() { - ::SetFocus(GetNativeView()); -} - -void NativeWidgetWin::FocusNativeView(gfx::NativeView native_view) { - // Only reset focus if hwnd is not already focused. - if (native_view && ::GetFocus() != native_view) - ::SetFocus(native_view); -} - -bool NativeWidgetWin::ConvertPointFromAncestor( - const Widget* ancestor, gfx::Point* point) const { - NOTREACHED(); - return false; -} - -gfx::Rect NativeWidgetWin::GetWorkAreaBoundsInScreen() const { - return gfx::Screen::GetMonitorWorkAreaNearestWindow(GetNativeView()); -} - -void NativeWidgetWin::SetInactiveRenderingDisabled(bool value) { -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, MessageLoop::Observer implementation: - -base::EventStatus NativeWidgetWin::WillProcessEvent( - const base::NativeEvent& event) { - return base::EVENT_CONTINUE; -} - -void NativeWidgetWin::DidProcessEvent(const base::NativeEvent& event) { - RedrawInvalidRect(); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, WindowImpl overrides: - -HICON NativeWidgetWin::GetDefaultWindowIcon() const { - if (ViewsDelegate::views_delegate) - return ViewsDelegate::views_delegate->GetDefaultWindowIcon(); - return NULL; -} - -LRESULT NativeWidgetWin::OnWndProc(UINT message, WPARAM w_param, - LPARAM l_param) { - HWND window = hwnd(); - LRESULT result = 0; - - // First allow messages sent by child controls to be processed directly by - // their associated views. If such a view is present, it will handle the - // message *instead of* this NativeWidgetWin. - if (ProcessChildWindowMessage(message, w_param, l_param, &result)) - return result; - - // Otherwise we handle everything else. - if (!ProcessWindowMessage(window, message, w_param, l_param, result)) - result = DefWindowProc(window, message, w_param, l_param); - if (message == WM_NCDESTROY) { - MessageLoopForUI::current()->RemoveObserver(this); - OnFinalMessage(window); - } - - // Only top level widget should store/restore focus. - if (message == WM_ACTIVATE && GetWidget()->is_top_level()) - PostProcessActivateMessage(this, LOWORD(w_param)); - if (message == WM_ENABLE && restore_focus_when_enabled_) { - // This path should be executed only for top level as - // restore_focus_when_enabled_ is set in PostProcessActivateMessage. - DCHECK(GetWidget()->is_top_level()); - restore_focus_when_enabled_ = false; - GetWidget()->GetFocusManager()->RestoreFocusedView(); - } - return result; -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, protected: - -// Message handlers ------------------------------------------------------------ - -void NativeWidgetWin::OnActivate(UINT action, BOOL minimized, HWND window) { - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnActivateApp(BOOL active, DWORD thread_id) { - if (GetWidget()->non_client_view() && !active && - thread_id != GetCurrentThreadId()) { - // Another application was activated, we should reset any state that - // disables inactive rendering now. - delegate_->EnableInactiveRendering(); - // Also update the native frame if it is rendering the non-client area. - if (GetWidget()->ShouldUseNativeFrame()) - DefWindowProcWithRedrawLock(WM_NCACTIVATE, FALSE, 0); - } -} - -LRESULT NativeWidgetWin::OnAppCommand(HWND window, - short app_command, - WORD device, - int keystate) { - // We treat APPCOMMAND ids as an extension of our command namespace, and just - // let the delegate figure out what to do... - BOOL is_handled = (GetWidget()->widget_delegate() && - GetWidget()->widget_delegate()->ExecuteWindowsCommand(app_command)) ? - TRUE : FALSE; - SetMsgHandled(is_handled); - // Make sure to return TRUE if the event was handled or in some cases the - // system will execute the default handler which can cause bugs like going - // forward or back two pages instead of one. - return is_handled; -} - -void NativeWidgetWin::OnCancelMode() { - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnCaptureChanged(HWND hwnd) { - delegate_->OnMouseCaptureLost(); -} - -void NativeWidgetWin::OnClose() { - GetWidget()->Close(); -} - -void NativeWidgetWin::OnCommand(UINT notification_code, - int command_id, - HWND window) { - // If the notification code is > 1 it means it is control specific and we - // should ignore it. - if (notification_code > 1 || - GetWidget()->widget_delegate()->ExecuteWindowsCommand(command_id)) { - SetMsgHandled(FALSE); - } -} - -LRESULT NativeWidgetWin::OnCreate(CREATESTRUCT* create_struct) { - SetNativeWindowProperty(kNativeWidgetKey, this); - CHECK_EQ(this, GetNativeWidgetForNativeView(hwnd())); - - use_layered_buffer_ = !!(window_ex_style() & WS_EX_LAYERED); - - // Attempt to detect screen readers by sending an event with our custom id. - if (!IsAccessibleWidget()) - NotifyWinEvent(EVENT_SYSTEM_ALERT, hwnd(), kCustomObjectID, CHILDID_SELF); - - props_.push_back(ui::SetWindowSupportsRerouteMouseWheel(hwnd())); - - drop_target_ = new DropTargetWin( - static_cast<internal::RootView*>(GetWidget()->GetRootView())); - - // We need to add ourselves as a message loop observer so that we can repaint - // aggressively if the contents of our window become invalid. Unfortunately - // WM_PAINT messages are starved and we get flickery redrawing when resizing - // if we do not do this. - MessageLoopForUI::current()->AddObserver(this); - - // Windows special DWM window frame requires a special tooltip manager so - // that window controls in Chrome windows don't flicker when you move your - // mouse over them. See comment in aero_tooltip_manager.h. - Widget* widget = GetWidget()->GetTopLevelWidget(); - if (widget && widget->ShouldUseNativeFrame()) { - tooltip_manager_.reset(new AeroTooltipManager(GetWidget())); - } else { - tooltip_manager_.reset(new TooltipManagerWin(GetWidget())); - } - if (!tooltip_manager_->Init()) { - // There was a problem creating the TooltipManager. Common error is 127. - // See 82193 for details. - LOG_GETLASTERROR(WARNING) << "tooltip creation failed, disabling tooltips"; - tooltip_manager_.reset(); - } - - // This message initializes the window so that focus border are shown for - // windows. - SendMessage( - hwnd(), WM_CHANGEUISTATE, MAKELPARAM(UIS_CLEAR, UISF_HIDEFOCUS), 0); - - // Bug 964884: detach the IME attached to this window. - // We should attach IMEs only when we need to input CJK strings. - ImmAssociateContextEx(hwnd(), NULL, 0); - - // We need to allow the delegate to size its contents since the window may not - // receive a size notification when its initial bounds are specified at window - // creation time. - ClientAreaSizeChanged(); - -#if defined(VIEWS_COMPOSITOR) - if (View::get_use_acceleration_when_possible()) { - if (ui::Compositor::compositor_factory()) { - compositor_ = (*Widget::compositor_factory())(this); - } else { - CRect window_rect; - GetClientRect(&window_rect); - compositor_ = ui::Compositor::Create(this, - hwnd(), - gfx::Size(window_rect.Width(), window_rect.Height())); - } - if (compositor_.get()) { - delegate_->AsWidget()->GetRootView()->SetPaintToLayer(true); - compositor_->SetRootLayer(delegate_->AsWidget()->GetRootView()->layer()); - } - } -#endif - - delegate_->OnNativeWidgetCreated(); - - // Get access to a modifiable copy of the system menu. - GetSystemMenu(hwnd(), false); - return 0; -} - -void NativeWidgetWin::OnDestroy() { - delegate_->OnNativeWidgetDestroying(); - if (drop_target_.get()) { - RevokeDragDrop(hwnd()); - drop_target_ = NULL; - } -} - -void NativeWidgetWin::OnDisplayChange(UINT bits_per_pixel, CSize screen_size) { - GetWidget()->widget_delegate()->OnDisplayChanged(); -} - -LRESULT NativeWidgetWin::OnDwmCompositionChanged(UINT msg, - WPARAM w_param, - LPARAM l_param) { - if (!GetWidget()->non_client_view()) { - SetMsgHandled(FALSE); - return 0; - } - - // For some reason, we need to hide the window while we're changing the frame - // type only when we're changing it in response to WM_DWMCOMPOSITIONCHANGED. - // If we don't, the client area will be filled with black. I'm suspecting - // something skia-ey. - // Frame type toggling caused by the user (e.g. switching theme) doesn't seem - // to have this requirement. - FrameTypeChanged(); - return 0; -} - -void NativeWidgetWin::OnEndSession(BOOL ending, UINT logoff) { - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnEnterSizeMove() { - delegate_->OnNativeWidgetBeginUserBoundsChange(); - SetMsgHandled(FALSE); -} - -LRESULT NativeWidgetWin::OnEraseBkgnd(HDC dc) { - // This is needed for magical win32 flicker ju-ju. - return 1; -} - -void NativeWidgetWin::OnExitMenuLoop(BOOL is_track_popup_menu) { - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnExitSizeMove() { - delegate_->OnNativeWidgetEndUserBoundsChange(); - SetMsgHandled(FALSE); -} - -LRESULT NativeWidgetWin::OnGetObject(UINT uMsg, - WPARAM w_param, - LPARAM l_param) { - LRESULT reference_result = static_cast<LRESULT>(0L); - - // Accessibility readers will send an OBJID_CLIENT message - if (OBJID_CLIENT == l_param) { - // Retrieve MSAA dispatch object for the root view. - base::win::ScopedComPtr<IAccessible> root( - GetWidget()->GetRootView()->GetNativeViewAccessible()); - - // Create a reference that MSAA will marshall to the client. - reference_result = LresultFromObject(IID_IAccessible, w_param, - static_cast<IAccessible*>(root.Detach())); - } - - if (kCustomObjectID == l_param) { - // An MSAA client requestes our custom id. Assume that we have detected an - // active windows screen reader. - OnScreenReaderDetected(); - - // Return with failure. - return static_cast<LRESULT>(0L); - } - - return reference_result; -} - -void NativeWidgetWin::OnGetMinMaxInfo(MINMAXINFO* minmax_info) { - gfx::Size min_window_size(delegate_->GetMinimumSize()); - // Add the native frame border size to the minimum size if the view reports - // its size as the client size. - if (WidgetSizeIsClientSize()) { - CRect client_rect, window_rect; - GetClientRect(&client_rect); - GetWindowRect(&window_rect); - window_rect -= client_rect; - min_window_size.Enlarge(window_rect.Width(), window_rect.Height()); - } - minmax_info->ptMinTrackSize.x = min_window_size.width(); - minmax_info->ptMinTrackSize.y = min_window_size.height(); - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnHScroll(int scroll_type, - short position, - HWND scrollbar) { - SetMsgHandled(FALSE); -} - -LRESULT NativeWidgetWin::OnImeMessages(UINT message, - WPARAM w_param, - LPARAM l_param) { - InputMethod* input_method = GetWidget()->GetInputMethodDirect(); - if (!input_method || input_method->IsMock()) { - SetMsgHandled(FALSE); - return 0; - } - - InputMethodWin* ime_win = static_cast<InputMethodWin*>(input_method); - BOOL handled = FALSE; - LRESULT result = ime_win->OnImeMessages(message, w_param, l_param, &handled); - - SetMsgHandled(handled); - return result; -} - -void NativeWidgetWin::OnInitMenu(HMENU menu) { - bool is_fullscreen = IsFullscreen(); - bool is_minimized = IsMinimized(); - bool is_maximized = IsMaximized(); - bool is_restored = !is_fullscreen && !is_minimized && !is_maximized; - - ScopedRedrawLock lock(this); - EnableMenuItem(menu, SC_RESTORE, is_minimized || is_maximized); - EnableMenuItem(menu, SC_MOVE, is_restored); - EnableMenuItem(menu, SC_SIZE, - GetWidget()->widget_delegate()->CanResize() && is_restored); - EnableMenuItem(menu, SC_MAXIMIZE, - GetWidget()->widget_delegate()->CanMaximize() && - !is_fullscreen && !is_maximized); - EnableMenuItem(menu, SC_MINIMIZE, - GetWidget()->widget_delegate()->CanMaximize() && - !is_minimized); -} - -void NativeWidgetWin::OnInitMenuPopup(HMENU menu, - UINT position, - BOOL is_system_menu) { - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnInputLangChange(DWORD character_set, - HKL input_language_id) { - InputMethod* input_method = GetWidget()->GetInputMethodDirect(); - - if (input_method && !input_method->IsMock()) { - static_cast<InputMethodWin*>(input_method)->OnInputLangChange( - character_set, input_language_id); - } -} - -LRESULT NativeWidgetWin::OnKeyEvent(UINT message, - WPARAM w_param, - LPARAM l_param) { - MSG msg = { hwnd(), message, w_param, l_param }; - KeyEvent key(msg); - InputMethod* input_method = GetWidget()->GetInputMethodDirect(); - if (input_method) - input_method->DispatchKeyEvent(key); - else - DispatchKeyEventPostIME(key); - return 0; -} - -void NativeWidgetWin::OnKillFocus(HWND focused_window) { - delegate_->OnNativeBlur(focused_window); - InputMethod* input_method = GetWidget()->GetInputMethodDirect(); - if (input_method) - input_method->OnBlur(); - SetMsgHandled(FALSE); -} - -LRESULT NativeWidgetWin::OnMouseActivate(UINT message, - WPARAM w_param, - LPARAM l_param) { - // TODO(beng): resolve this with the GetWindowLong() check on the subsequent - // line. - if (GetWidget()->non_client_view()) - return delegate_->CanActivate() ? MA_ACTIVATE : MA_NOACTIVATEANDEAT; - if (GetWindowLong(GWL_EXSTYLE) & WS_EX_NOACTIVATE) - return MA_NOACTIVATE; - SetMsgHandled(FALSE); - return MA_ACTIVATE; -} - -LRESULT NativeWidgetWin::OnMouseRange(UINT message, - WPARAM w_param, - LPARAM l_param) { - if (message == WM_RBUTTONUP && is_right_mouse_pressed_on_caption_) { - is_right_mouse_pressed_on_caption_ = false; - ReleaseCapture(); - // |point| is in window coordinates, but WM_NCHITTEST and TrackPopupMenu() - // expect screen coordinates. - CPoint screen_point(l_param); - MapWindowPoints(GetNativeView(), HWND_DESKTOP, &screen_point, 1); - w_param = SendMessage(GetNativeView(), WM_NCHITTEST, 0, - MAKELPARAM(screen_point.x, screen_point.y)); - if (w_param == HTCAPTION || w_param == HTSYSMENU) { - ui::ShowSystemMenu(GetNativeView(), screen_point.x, screen_point.y); - return 0; - } - } else if (message == WM_NCLBUTTONDOWN && - !GetWidget()->ShouldUseNativeFrame()) { - switch (w_param) { - case HTCLOSE: - case HTMINBUTTON: - case HTMAXBUTTON: { - // When the mouse is pressed down in these specific non-client areas, - // we need to tell the RootView to send the mouse pressed event (which - // sets capture, allowing subsequent WM_LBUTTONUP (note, _not_ - // WM_NCLBUTTONUP) to fire so that the appropriate WM_SYSCOMMAND can be - // sent by the applicable button's ButtonListener. We _have_ to do this - // way rather than letting Windows just send the syscommand itself (as - // would happen if we never did this dance) because for some insane - // reason DefWindowProc for WM_NCLBUTTONDOWN also renders the pressed - // window control button appearance, in the Windows classic style, over - // our view! Ick! By handling this message we prevent Windows from - // doing this undesirable thing, but that means we need to roll the - // sys-command handling ourselves. - // Combine |w_param| with common key state message flags. - w_param |= ((GetKeyState(VK_CONTROL) & 0x80) == 0x80)? MK_CONTROL : 0; - w_param |= ((GetKeyState(VK_SHIFT) & 0x80) == 0x80)? MK_SHIFT : 0; - } - } - } else if (message == WM_NCRBUTTONDOWN && - (w_param == HTCAPTION || w_param == HTSYSMENU)) { - is_right_mouse_pressed_on_caption_ = true; - // We SetMouseCapture() to ensure we only show the menu when the button - // down and up are both on the caption. Note: this causes the button up to - // be WM_RBUTTONUP instead of WM_NCRBUTTONUP. - SetMouseCapture(); - } - - MSG msg = { hwnd(), message, w_param, l_param, 0, - { GET_X_LPARAM(l_param), GET_Y_LPARAM(l_param) } }; - MouseEvent event(msg); - - if (!(event.flags() & ui::EF_IS_NON_CLIENT)) - if (tooltip_manager_.get()) - tooltip_manager_->OnMouse(message, w_param, l_param); - - if (event.type() == ui::ET_MOUSE_MOVED && !HasMouseCapture()) { - // Windows only fires WM_MOUSELEAVE events if the application begins - // "tracking" mouse events for a given HWND during WM_MOUSEMOVE events. - // We need to call |TrackMouseEvents| to listen for WM_MOUSELEAVE. - TrackMouseEvents((message == WM_NCMOUSEMOVE) ? - TME_NONCLIENT | TME_LEAVE : TME_LEAVE); - } else if (event.type() == ui::ET_MOUSE_EXITED) { - // Reset our tracking flags so future mouse movement over this - // NativeWidgetWin results in a new tracking session. Fall through for - // OnMouseEvent. - active_mouse_tracking_flags_ = 0; - } else if (event.type() == ui::ET_MOUSEWHEEL) { - // Reroute the mouse wheel to the window under the pointer if applicable. - return (ui::RerouteMouseWheel(hwnd(), w_param, l_param) || - delegate_->OnMouseEvent(MouseWheelEvent(msg))) ? 0 : 1; - } - - bool handled = delegate_->OnMouseEvent(event); - - if (!handled && message == WM_NCLBUTTONDOWN && w_param != HTSYSMENU && - !GetWidget()->ShouldUseNativeFrame()) { - // TODO(msw): Eliminate undesired painting, or re-evaluate this workaround. - // DefWindowProc for WM_NCLBUTTONDOWN does weird non-client painting, so we - // need to call it inside a ScopedRedrawLock. This may cause other negative - // side-effects (ex/ stifling non-client mouse releases). - DefWindowProcWithRedrawLock(message, w_param, l_param); - handled = true; - } - - SetMsgHandled(handled); - return 0; -} - -void NativeWidgetWin::OnMove(const CPoint& point) { - // TODO(beng): move to Widget. - GetWidget()->widget_delegate()->OnWidgetMove(); - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnMoving(UINT param, const LPRECT new_bounds) { - // TODO(beng): move to Widget. - GetWidget()->widget_delegate()->OnWidgetMove(); -} - -LRESULT NativeWidgetWin::OnNCActivate(BOOL active) { - if (delegate_->CanActivate()) - delegate_->OnNativeWidgetActivationChanged(!!active); - - if (!GetWidget()->non_client_view()) { - SetMsgHandled(FALSE); - return 0; - } - - if (!delegate_->CanActivate()) - return TRUE; - - // The frame may need to redraw as a result of the activation change. - // We can get WM_NCACTIVATE before we're actually visible. If we're not - // visible, no need to paint. - if (IsVisible()) - GetWidget()->non_client_view()->SchedulePaint(); - - if (!GetWidget()->ShouldUseNativeFrame()) { - // TODO(beng, et al): Hack to redraw this window and child windows - // synchronously upon activation. Not all child windows are redrawing - // themselves leading to issues like http://crbug.com/74604 - // We redraw out-of-process HWNDs asynchronously to avoid hanging the - // whole app if a child HWND belonging to a hung plugin is encountered. - RedrawWindow(GetNativeView(), NULL, NULL, - RDW_NOCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW); - EnumChildWindows(GetNativeView(), EnumChildWindowsForRedraw, NULL); - } - - // If we're active again, we should be allowed to render as inactive, so - // tell the non-client view. - bool inactive_rendering_disabled = delegate_->IsInactiveRenderingDisabled(); - if (IsActive()) - delegate_->EnableInactiveRendering(); - - // Avoid DefWindowProc non-client rendering over our custom frame. - if (!GetWidget()->ShouldUseNativeFrame()) { - SetMsgHandled(TRUE); - return TRUE; - } - - return DefWindowProcWithRedrawLock(WM_NCACTIVATE, - inactive_rendering_disabled || active, 0); -} - -LRESULT NativeWidgetWin::OnNCCalcSize(BOOL mode, LPARAM l_param) { - // We only override the default handling if we need to specify a custom - // non-client edge width. Note that in most cases "no insets" means no - // custom width, but in fullscreen mode we want a custom width of 0. - gfx::Insets insets = GetClientAreaInsets(); - if (insets.empty() && !IsFullscreen()) { - SetMsgHandled(FALSE); - return 0; - } - - RECT* client_rect = mode ? - &(reinterpret_cast<NCCALCSIZE_PARAMS*>(l_param)->rgrc[0]) : - reinterpret_cast<RECT*>(l_param); - client_rect->left += insets.left(); - client_rect->top += insets.top(); - client_rect->bottom -= insets.bottom(); - client_rect->right -= insets.right(); - if (IsMaximized()) { - // Find all auto-hide taskbars along the screen edges and adjust in by the - // thickness of the auto-hide taskbar on each such edge, so the window isn't - // treated as a "fullscreen app", which would cause the taskbars to - // disappear. - HMONITOR monitor = MonitorFromWindow(GetNativeView(), - MONITOR_DEFAULTTONULL); - if (!monitor) { - // We might end up here if the window was previously minimized and the - // user clicks on the taskbar button to restore it in the previously - // maximized position. In that case WM_NCCALCSIZE is sent before the - // window coordinates are restored to their previous values, so our - // (left,top) would probably be (-32000,-32000) like all minimized - // windows. So the above MonitorFromWindow call fails, but if we check - // the window rect given with WM_NCCALCSIZE (which is our previous - // restored window position) we will get the correct monitor handle. - monitor = MonitorFromRect(client_rect, MONITOR_DEFAULTTONULL); - if (!monitor) { - // This is probably an extreme case that we won't hit, but if we don't - // intersect any monitor, let us not adjust the client rect since our - // window will not be visible anyway. - return 0; - } - } - if (GetTopmostAutoHideTaskbarForEdge(ABE_LEFT, monitor)) - client_rect->left += kAutoHideTaskbarThicknessPx; - if (GetTopmostAutoHideTaskbarForEdge(ABE_TOP, monitor)) { - if (GetWidget()->ShouldUseNativeFrame()) { - // Tricky bit. Due to a bug in DwmDefWindowProc()'s handling of - // WM_NCHITTEST, having any nonclient area atop the window causes the - // caption buttons to draw onscreen but not respond to mouse - // hover/clicks. - // So for a taskbar at the screen top, we can't push the - // client_rect->top down; instead, we move the bottom up by one pixel, - // which is the smallest change we can make and still get a client area - // less than the screen size. This is visibly ugly, but there seems to - // be no better solution. - --client_rect->bottom; - } else { - client_rect->top += kAutoHideTaskbarThicknessPx; - } - } - if (GetTopmostAutoHideTaskbarForEdge(ABE_RIGHT, monitor)) - client_rect->right -= kAutoHideTaskbarThicknessPx; - if (GetTopmostAutoHideTaskbarForEdge(ABE_BOTTOM, monitor)) - client_rect->bottom -= kAutoHideTaskbarThicknessPx; - - // We cannot return WVR_REDRAW when there is nonclient area, or Windows - // exhibits bugs where client pixels and child HWNDs are mispositioned by - // the width/height of the upper-left nonclient area. - return 0; - } - - // If the window bounds change, we're going to relayout and repaint anyway. - // Returning WVR_REDRAW avoids an extra paint before that of the old client - // pixels in the (now wrong) location, and thus makes actions like resizing a - // window from the left edge look slightly less broken. - // We special case when left or top insets are 0, since these conditions - // actually require another repaint to correct the layout after glass gets - // turned on and off. - if (insets.left() == 0 || insets.top() == 0) - return 0; - return mode ? WVR_REDRAW : 0; -} - -LRESULT NativeWidgetWin::OnNCHitTest(const CPoint& point) { - if (!GetWidget()->non_client_view()) { - SetMsgHandled(FALSE); - return 0; - } - - // If the DWM is rendering the window controls, we need to give the DWM's - // default window procedure first chance to handle hit testing. - if (GetWidget()->ShouldUseNativeFrame()) { - LRESULT result; - if (DwmDefWindowProc(GetNativeView(), WM_NCHITTEST, 0, - MAKELPARAM(point.x, point.y), &result)) { - return result; - } - } - - // First, give the NonClientView a chance to test the point to see if it - // provides any of the non-client area. - POINT temp = point; - MapWindowPoints(HWND_DESKTOP, GetNativeView(), &temp, 1); - int component = delegate_->GetNonClientComponent(gfx::Point(temp)); - if (component != HTNOWHERE) - return component; - - // Otherwise, we let Windows do all the native frame non-client handling for - // us. - SetMsgHandled(FALSE); - return 0; -} - -void NativeWidgetWin::OnNCPaint(HRGN rgn) { - // We only do non-client painting if we're not using the native frame. - // It's required to avoid some native painting artifacts from appearing when - // the window is resized. - if (!GetWidget()->non_client_view() || GetWidget()->ShouldUseNativeFrame()) { - SetMsgHandled(FALSE); - return; - } - - // We have an NC region and need to paint it. We expand the NC region to - // include the dirty region of the root view. This is done to minimize - // paints. - CRect window_rect; - GetWindowRect(&window_rect); - - if (window_rect.Width() != GetWidget()->GetRootView()->width() || - window_rect.Height() != GetWidget()->GetRootView()->height()) { - // If the size of the window differs from the size of the root view it - // means we're being asked to paint before we've gotten a WM_SIZE. This can - // happen when the user is interactively resizing the window. To avoid - // mass flickering we don't do anything here. Once we get the WM_SIZE we'll - // reset the region of the window which triggers another WM_NCPAINT and - // all is well. - return; - } - - CRect dirty_region; - // A value of 1 indicates paint all. - if (!rgn || rgn == reinterpret_cast<HRGN>(1)) { - dirty_region = CRect(0, 0, window_rect.Width(), window_rect.Height()); - } else { - RECT rgn_bounding_box; - GetRgnBox(rgn, &rgn_bounding_box); - if (!IntersectRect(&dirty_region, &rgn_bounding_box, &window_rect)) - return; // Dirty region doesn't intersect window bounds, bale. - - // rgn_bounding_box is in screen coordinates. Map it to window coordinates. - OffsetRect(&dirty_region, -window_rect.left, -window_rect.top); - } - - // In theory GetDCEx should do what we want, but I couldn't get it to work. - // In particular the docs mentiond DCX_CLIPCHILDREN, but as far as I can tell - // it doesn't work at all. So, instead we get the DC for the window then - // manually clip out the children. - HDC dc = GetWindowDC(GetNativeView()); - ClipState clip_state; - clip_state.x = window_rect.left; - clip_state.y = window_rect.top; - clip_state.parent = GetNativeView(); - clip_state.dc = dc; - EnumChildWindows(GetNativeView(), &ClipDCToChild, - reinterpret_cast<LPARAM>(&clip_state)); - - gfx::Rect old_paint_region = invalid_rect(); - - if (!old_paint_region.IsEmpty()) { - // The root view has a region that needs to be painted. Include it in the - // region we're going to paint. - - CRect old_paint_region_crect = old_paint_region.ToRECT(); - CRect tmp = dirty_region; - UnionRect(&dirty_region, &tmp, &old_paint_region_crect); - } - - GetWidget()->GetRootView()->SchedulePaintInRect(gfx::Rect(dirty_region)); - - // gfx::CanvasSkiaPaint's destructor does the actual painting. As such, wrap - // the following in a block to force paint to occur so that we can release - // the dc. - { - gfx::CanvasSkiaPaint canvas(dc, true, dirty_region.left, - dirty_region.top, dirty_region.Width(), - dirty_region.Height()); - delegate_->OnNativeWidgetPaint(&canvas); - } - - ReleaseDC(GetNativeView(), dc); - // When using a custom frame, we want to avoid calling DefWindowProc() since - // that may render artifacts. - SetMsgHandled(!GetWidget()->ShouldUseNativeFrame()); -} - -LRESULT NativeWidgetWin::OnNCUAHDrawCaption(UINT msg, - WPARAM w_param, - LPARAM l_param) { - // See comment in widget_win.h at the definition of WM_NCUAHDRAWCAPTION for - // an explanation about why we need to handle this message. - SetMsgHandled(!GetWidget()->ShouldUseNativeFrame()); - return 0; -} - -LRESULT NativeWidgetWin::OnNCUAHDrawFrame(UINT msg, - WPARAM w_param, - LPARAM l_param) { - // See comment in widget_win.h at the definition of WM_NCUAHDRAWCAPTION for - // an explanation about why we need to handle this message. - SetMsgHandled(!GetWidget()->ShouldUseNativeFrame()); - return 0; -} - -LRESULT NativeWidgetWin::OnNotify(int w_param, NMHDR* l_param) { - // We can be sent this message before the tooltip manager is created, if a - // subclass overrides OnCreate and creates some kind of Windows control there - // that sends WM_NOTIFY messages. - if (tooltip_manager_.get()) { - bool handled; - LRESULT result = tooltip_manager_->OnNotify(w_param, l_param, &handled); - SetMsgHandled(handled); - return result; - } - SetMsgHandled(FALSE); - return 0; -} - -void NativeWidgetWin::OnPaint(HDC dc) { - RECT dirty_rect; - // Try to paint accelerated first. - if (GetUpdateRect(hwnd(), &dirty_rect, FALSE) && - !IsRectEmpty(&dirty_rect)) { - if (delegate_->OnNativeWidgetPaintAccelerated( - gfx::Rect(dirty_rect))) { - ValidateRect(hwnd(), NULL); - } else { - scoped_ptr<gfx::CanvasPaint> canvas( - gfx::CanvasPaint::CreateCanvasPaint(hwnd())); - delegate_->OnNativeWidgetPaint(canvas->AsCanvas()); - } - } else { - // TODO(msw): Find a better solution for this crbug.com/93530 workaround. - // Some scenarios otherwise fail to validate minimized app/popup windows. - ValidateRect(hwnd(), NULL); - } -} - -LRESULT NativeWidgetWin::OnPowerBroadcast(DWORD power_event, DWORD data) { - base::SystemMonitor* monitor = base::SystemMonitor::Get(); - if (monitor) - monitor->ProcessWmPowerBroadcastMessage(power_event); - SetMsgHandled(FALSE); - return 0; -} - -LRESULT NativeWidgetWin::OnReflectedMessage(UINT msg, - WPARAM w_param, - LPARAM l_param) { - SetMsgHandled(FALSE); - return 0; -} - -LRESULT NativeWidgetWin::OnSetCursor(UINT message, - WPARAM w_param, - LPARAM l_param) { - // Using ScopedRedrawLock here frequently allows content behind this window to - // paint in front of this window, causing glaring rendering artifacts. - // If omitting ScopedRedrawLock here triggers caption rendering artifacts via - // DefWindowProc message handling, we'll need to find a better solution. - SetMsgHandled(FALSE); - return 0; -} - -void NativeWidgetWin::OnSetFocus(HWND focused_window) { - delegate_->OnNativeFocus(focused_window); - InputMethod* input_method = GetWidget()->GetInputMethodDirect(); - if (input_method) - input_method->OnFocus(); - SetMsgHandled(FALSE); -} - -LRESULT NativeWidgetWin::OnSetIcon(UINT size_type, HICON new_icon) { - // This shouldn't hurt even if we're using the native frame. - return DefWindowProcWithRedrawLock(WM_SETICON, size_type, - reinterpret_cast<LPARAM>(new_icon)); -} - -LRESULT NativeWidgetWin::OnSetText(const wchar_t* text) { - // This shouldn't hurt even if we're using the native frame. - return DefWindowProcWithRedrawLock(WM_SETTEXT, NULL, - reinterpret_cast<LPARAM>(text)); -} - -void NativeWidgetWin::OnSettingChange(UINT flags, const wchar_t* section) { - if (!GetParent() && (flags == SPI_SETWORKAREA) && - !GetWidget()->widget_delegate()->WillProcessWorkAreaChange()) { - // Fire a dummy SetWindowPos() call, so we'll trip the code in - // OnWindowPosChanging() below that notices work area changes. - ::SetWindowPos(GetNativeView(), 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | - SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_NOOWNERZORDER); - SetMsgHandled(TRUE); - } else { - // TODO(beng): move to Widget. - if (flags == SPI_SETWORKAREA) - GetWidget()->widget_delegate()->OnWorkAreaChanged(); - SetMsgHandled(FALSE); - } -} - -void NativeWidgetWin::OnSize(UINT param, const CSize& size) { - RedrawWindow(GetNativeView(), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - // ResetWindowRegion is going to trigger WM_NCPAINT. By doing it after we've - // invoked OnSize we ensure the RootView has been laid out. - ResetWindowRegion(false); -} - -void NativeWidgetWin::OnSysCommand(UINT notification_code, CPoint click) { - if (!GetWidget()->non_client_view()) - return; - - // Windows uses the 4 lower order bits of |notification_code| for type- - // specific information so we must exclude this when comparing. - static const int sc_mask = 0xFFF0; - // Ignore size/move/maximize in fullscreen mode. - if (IsFullscreen() && - (((notification_code & sc_mask) == SC_SIZE) || - ((notification_code & sc_mask) == SC_MOVE) || - ((notification_code & sc_mask) == SC_MAXIMIZE))) - return; - if (!GetWidget()->ShouldUseNativeFrame()) { - if ((notification_code & sc_mask) == SC_MINIMIZE || - (notification_code & sc_mask) == SC_MAXIMIZE || - (notification_code & sc_mask) == SC_RESTORE) { - GetWidget()->non_client_view()->ResetWindowControls(); - } else if ((notification_code & sc_mask) == SC_MOVE || - (notification_code & sc_mask) == SC_SIZE) { - if (!IsVisible()) { - // Circumvent ScopedRedrawLocks and force visibility before entering a - // resize or move modal loop to get continuous sizing/moving feedback. - SetWindowLong(GWL_STYLE, GetWindowLong(GWL_STYLE) | WS_VISIBLE); - } - } - } - - // Handle SC_KEYMENU, which means that the user has pressed the ALT - // key and released it, so we should focus the menu bar. - if ((notification_code & sc_mask) == SC_KEYMENU && click.x == 0) { - // Retrieve the status of shift and control keys to prevent consuming - // shift+alt keys, which are used by Windows to change input languages. - ui::Accelerator accelerator(ui::KeyboardCodeForWindowsKeyCode(VK_MENU), - !!(GetKeyState(VK_SHIFT) & 0x8000), - !!(GetKeyState(VK_CONTROL) & 0x8000), - false); - GetWidget()->GetFocusManager()->ProcessAccelerator(accelerator); - return; - } - - // If the delegate can't handle it, the system implementation will be called. - if (!delegate_->ExecuteCommand(notification_code)) { - DefWindowProc(GetNativeView(), WM_SYSCOMMAND, notification_code, - MAKELPARAM(click.x, click.y)); - } -} - -void NativeWidgetWin::OnThemeChanged() { - // Notify NativeThemeWin. - gfx::NativeThemeWin::instance()->CloseHandles(); -} - -void NativeWidgetWin::OnVScroll(int scroll_type, - short position, - HWND scrollbar) { - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnWindowPosChanging(WINDOWPOS* window_pos) { - if (ignore_window_pos_changes_) { - // If somebody's trying to toggle our visibility, change the nonclient area, - // change our Z-order, or activate us, we should probably let it go through. - if (!(window_pos->flags & ((IsVisible() ? SWP_HIDEWINDOW : SWP_SHOWWINDOW) | - SWP_FRAMECHANGED)) && - (window_pos->flags & (SWP_NOZORDER | SWP_NOACTIVATE))) { - // Just sizing/moving the window; ignore. - window_pos->flags |= SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW; - window_pos->flags &= ~(SWP_SHOWWINDOW | SWP_HIDEWINDOW); - } - } else if (!GetParent()) { - CRect window_rect; - HMONITOR monitor; - gfx::Rect monitor_rect, work_area; - if (GetWindowRect(&window_rect) && - GetMonitorAndRects(window_rect, &monitor, &monitor_rect, &work_area)) { - if (monitor && (monitor == last_monitor_) && - (IsFullscreen() || ((monitor_rect == last_monitor_rect_) && - (work_area != last_work_area_)))) { - // A rect for the monitor we're on changed. Normally Windows notifies - // us about this (and thus we're reaching here due to the SetWindowPos() - // call in OnSettingChange() above), but with some software (e.g. - // nVidia's nView desktop manager) the work area can change asynchronous - // to any notification, and we're just sent a SetWindowPos() call with a - // new (frequently incorrect) position/size. In either case, the best - // response is to throw away the existing position/size information in - // |window_pos| and recalculate it based on the new work rect. - gfx::Rect new_window_rect; - if (IsFullscreen()) { - new_window_rect = monitor_rect; - } else if (IsZoomed()) { - new_window_rect = work_area; - int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); - new_window_rect.Inset(-border_thickness, -border_thickness); - } else { - new_window_rect = gfx::Rect(window_rect).AdjustToFit(work_area); - } - window_pos->x = new_window_rect.x(); - window_pos->y = new_window_rect.y(); - window_pos->cx = new_window_rect.width(); - window_pos->cy = new_window_rect.height(); - // WARNING! Don't set SWP_FRAMECHANGED here, it breaks moving the child - // HWNDs for some reason. - window_pos->flags &= ~(SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW); - window_pos->flags |= SWP_NOCOPYBITS; - - // Now ignore all immediately-following SetWindowPos() changes. Windows - // likes to (incorrectly) recalculate what our position/size should be - // and send us further updates. - ignore_window_pos_changes_ = true; - DCHECK(!ignore_pos_changes_factory_.HasWeakPtrs()); - MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&NativeWidgetWin::StopIgnoringPosChanges, - ignore_pos_changes_factory_.GetWeakPtr())); - } - last_monitor_ = monitor; - last_monitor_rect_ = monitor_rect; - last_work_area_ = work_area; - } - } - - if (force_hidden_count_) { - // Prevent the window from being made visible if we've been asked to do so. - // See comment in header as to why we might want this. - window_pos->flags &= ~SWP_SHOWWINDOW; - } - - // When WM_WINDOWPOSCHANGING message is handled by DefWindowProc, it will - // enforce (cx, cy) not to be smaller than (6, 6) for any non-popup window. - // We work around this by changing cy back to our intended value. - if (!GetParent() && ~(window_pos->flags & SWP_NOSIZE) && window_pos->cy < 6) { - LONG old_cy = window_pos->cy; - DefWindowProc(GetNativeView(), WM_WINDOWPOSCHANGING, 0, - reinterpret_cast<LPARAM>(window_pos)); - window_pos->cy = old_cy; - SetMsgHandled(TRUE); - return; - } - - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnWindowPosChanged(WINDOWPOS* window_pos) { - if (DidClientAreaSizeChange(window_pos)) - ClientAreaSizeChanged(); - if (window_pos->flags & SWP_SHOWWINDOW) - delegate_->OnNativeWidgetVisibilityChanged(true); - else if (window_pos->flags & SWP_HIDEWINDOW) - delegate_->OnNativeWidgetVisibilityChanged(false); - SetMsgHandled(FALSE); -} - -void NativeWidgetWin::OnFinalMessage(HWND window) { - // We don't destroy props in WM_DESTROY as we may still get messages after - // WM_DESTROY that assume the properties are still valid (such as WM_CLOSE). - props_.reset(); - delegate_->OnNativeWidgetDestroyed(); - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) - delete this; -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, protected: - -int NativeWidgetWin::GetShowState() const { - return SW_SHOWNORMAL; -} - -gfx::Insets NativeWidgetWin::GetClientAreaInsets() const { - // Returning an empty Insets object causes the default handling in - // NativeWidgetWin::OnNCCalcSize() to be invoked. - if (!has_non_client_view_ || GetWidget()->ShouldUseNativeFrame()) - return gfx::Insets(); - - if (IsMaximized()) { - // Windows automatically adds a standard width border to all sides when a - // window is maximized. - int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); - return gfx::Insets(border_thickness, border_thickness, border_thickness, - border_thickness); - } - // This is weird, but highly essential. If we don't offset the bottom edge - // of the client rect, the window client area and window area will match, - // and when returning to glass rendering mode from non-glass, the client - // area will not paint black as transparent. This is because (and I don't - // know why) the client area goes from matching the window rect to being - // something else. If the client area is not the window rect in both - // modes, the blackness doesn't occur. Because of this, we need to tell - // the RootView to lay out to fit the window rect, rather than the client - // rect when using the opaque frame. - // Note: this is only required for non-fullscreen windows. Note that - // fullscreen windows are in restored state, not maximized. - return gfx::Insets(0, 0, IsFullscreen() ? 0 : 1, 0); -} - -void NativeWidgetWin::TrackMouseEvents(DWORD mouse_tracking_flags) { - // Begin tracking mouse events for this HWND so that we get WM_MOUSELEAVE - // when the user moves the mouse outside this HWND's bounds. - if (active_mouse_tracking_flags_ == 0 || mouse_tracking_flags & TME_CANCEL) { - if (mouse_tracking_flags & TME_CANCEL) { - // We're about to cancel active mouse tracking, so empty out the stored - // state. - active_mouse_tracking_flags_ = 0; - } else { - active_mouse_tracking_flags_ = mouse_tracking_flags; - } - - TRACKMOUSEEVENT tme; - tme.cbSize = sizeof(tme); - tme.dwFlags = mouse_tracking_flags; - tme.hwndTrack = hwnd(); - tme.dwHoverTime = 0; - TrackMouseEvent(&tme); - } else if (mouse_tracking_flags != active_mouse_tracking_flags_) { - TrackMouseEvents(active_mouse_tracking_flags_ | TME_CANCEL); - TrackMouseEvents(mouse_tracking_flags); - } -} - -void NativeWidgetWin::OnScreenReaderDetected() { - screen_reader_active_ = true; -} - -void NativeWidgetWin::SetInitialFocus() { - if (!GetWidget()->SetInitialFocus() && - !(GetWindowLong(GWL_EXSTYLE) & WS_EX_TRANSPARENT) && - !(GetWindowLong(GWL_EXSTYLE) & WS_EX_NOACTIVATE)) { - // The window does not get keyboard messages unless we focus it. - SetFocus(GetNativeView()); - } -} - -void NativeWidgetWin::ExecuteSystemMenuCommand(int command) { - if (command) - SendMessage(GetNativeView(), WM_SYSCOMMAND, command, 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, private: - -// static -void NativeWidgetWin::PostProcessActivateMessage(NativeWidgetWin* widget, - int activation_state) { - DCHECK(widget->GetWidget()->is_top_level()); - FocusManager* focus_manager = widget->GetWidget()->GetFocusManager(); - if (WA_INACTIVE == activation_state) { - // We might get activated/inactivated without being enabled, so we need to - // clear restore_focus_when_enabled_. - widget->restore_focus_when_enabled_ = false; - focus_manager->StoreFocusedView(); - } else { - // We must restore the focus after the message has been DefProc'ed as it - // does set the focus to the last focused HWND. - // Note that if the window is not enabled, we cannot restore the focus as - // calling ::SetFocus on a child of the non-enabled top-window would fail. - // This is the case when showing a modal dialog (such as 'open file', - // 'print'...) from a different thread. - // In that case we delay the focus restoration to when the window is enabled - // again. - if (!IsWindowEnabled(widget->GetNativeView())) { - DCHECK(!widget->restore_focus_when_enabled_); - widget->restore_focus_when_enabled_ = true; - return; - } - focus_manager->RestoreFocusedView(); - } -} - -void NativeWidgetWin::SetInitParams(const Widget::InitParams& params) { - // Set non-style attributes. - ownership_ = params.ownership; - - DWORD style = WS_CLIPCHILDREN | WS_CLIPSIBLINGS; - DWORD ex_style = 0; - DWORD class_style = CS_DBLCLKS; - - // Set type-independent style attributes. - if (params.child) - style |= WS_CHILD; - if (params.show_state == ui::SHOW_STATE_MAXIMIZED) - style |= WS_MAXIMIZE; - if (params.show_state == ui::SHOW_STATE_MINIMIZED) - style |= WS_MINIMIZE; - if (!params.accept_events) - ex_style |= WS_EX_TRANSPARENT; - if (!params.can_activate) - ex_style |= WS_EX_NOACTIVATE; - if (params.keep_on_top) - ex_style |= WS_EX_TOPMOST; - if (params.mirror_origin_in_rtl) - ex_style |= l10n_util::GetExtendedTooltipStyles(); - if (params.transparent) - ex_style |= WS_EX_LAYERED; - if (params.has_dropshadow) { - class_style |= (base::win::GetVersion() < base::win::VERSION_XP) ? - 0 : CS_DROPSHADOW; - } - - // Set type-dependent style attributes. - switch (params.type) { - case Widget::InitParams::TYPE_WINDOW: { - style |= WS_SYSMENU | WS_CAPTION; - bool can_resize = GetWidget()->widget_delegate()->CanResize(); - bool can_maximize = GetWidget()->widget_delegate()->CanMaximize(); - if (can_maximize) { - style |= WS_OVERLAPPEDWINDOW; - } else if (can_resize) { - style |= WS_OVERLAPPED | WS_THICKFRAME; - } - if (delegate_->IsDialogBox()) { - style |= DS_MODALFRAME; - // NOTE: Turning this off means we lose the close button, which is bad. - // Turning it on though means the user can maximize or size the window - // from the system menu, which is worse. We may need to provide our own - // menu to get the close button to appear properly. - // style &= ~WS_SYSMENU; - - // Set the WS_POPUP style for modal dialogs. This ensures that the owner - // window is activated on destruction. This style should not be set for - // non-modal non-top-level dialogs like constrained windows. - style |= delegate_->IsModal() ? WS_POPUP : 0; - } - ex_style |= delegate_->IsDialogBox() ? WS_EX_DLGMODALFRAME : 0; - break; - } - case Widget::InitParams::TYPE_CONTROL: - style |= WS_VISIBLE; - break; - case Widget::InitParams::TYPE_WINDOW_FRAMELESS: - style |= WS_POPUP; - break; - case Widget::InitParams::TYPE_BUBBLE: - style |= WS_POPUP; - style |= WS_CLIPCHILDREN; - break; - case Widget::InitParams::TYPE_POPUP: - style |= WS_POPUP; - ex_style |= WS_EX_TOOLWINDOW; - break; - case Widget::InitParams::TYPE_MENU: - style |= WS_POPUP; - break; - default: - NOTREACHED(); - } - - set_initial_class_style(class_style); - set_window_style(window_style() | style); - set_window_ex_style(window_ex_style() | ex_style); - - has_non_client_view_ = Widget::RequiresNonClientView(params.type); -} - -void NativeWidgetWin::RedrawInvalidRect() { - if (!use_layered_buffer_) { - RECT r = { 0, 0, 0, 0 }; - if (GetUpdateRect(hwnd(), &r, FALSE) && !IsRectEmpty(&r)) { - RedrawWindow(hwnd(), &r, NULL, - RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN); - } - } -} - -void NativeWidgetWin::RedrawLayeredWindowContents() { - if (invalid_rect_.IsEmpty()) - return; - - // We need to clip to the dirty rect ourselves. - layered_window_contents_->sk_canvas()->save(SkCanvas::kClip_SaveFlag); - layered_window_contents_->ClipRect(invalid_rect_); - GetWidget()->GetRootView()->Paint(layered_window_contents_.get()); - layered_window_contents_->sk_canvas()->restore(); - - RECT wr; - GetWindowRect(&wr); - SIZE size = {wr.right - wr.left, wr.bottom - wr.top}; - POINT position = {wr.left, wr.top}; - HDC dib_dc = skia::BeginPlatformPaint(layered_window_contents_->sk_canvas()); - POINT zero = {0, 0}; - BLENDFUNCTION blend = {AC_SRC_OVER, 0, layered_alpha_, AC_SRC_ALPHA}; - UpdateLayeredWindow(hwnd(), NULL, &position, &size, dib_dc, &zero, - RGB(0xFF, 0xFF, 0xFF), &blend, ULW_ALPHA); - invalid_rect_.SetRect(0, 0, 0, 0); - skia::EndPlatformPaint(layered_window_contents_->sk_canvas()); -} - -void NativeWidgetWin::LockUpdates() { - // We skip locked updates when Aero is on for two reasons: - // 1. Because it isn't necessary - // 2. Because toggling the WS_VISIBLE flag may occur while the GPU process is - // attempting to present a child window's backbuffer onscreen. When these - // two actions race with one another, the child window will either flicker - // or will simply stop updating entirely. - if (!IsAeroGlassEnabled() && ++lock_updates_count_ == 1) { - SetWindowLong(GWL_STYLE, GetWindowLong(GWL_STYLE) & ~WS_VISIBLE); - } - // TODO(msw): Remove nested LockUpdates VLOG info for crbug.com/93530. - VLOG_IF(1, (lock_updates_count_ > 1)) << "Nested LockUpdates call: " - << lock_updates_count_ << " locks for widget " << this; -} - -void NativeWidgetWin::UnlockUpdates() { - // TODO(msw): Remove nested LockUpdates VLOG info for crbug.com/93530. - VLOG_IF(1, (lock_updates_count_ > 1)) << "Nested UnlockUpdates call: " - << lock_updates_count_ << " locks for widget " << this; - if (!IsAeroGlassEnabled() && --lock_updates_count_ <= 0) { - SetWindowLong(GWL_STYLE, GetWindowLong(GWL_STYLE) | WS_VISIBLE); - lock_updates_count_ = 0; - } -} - -bool NativeWidgetWin::WidgetSizeIsClientSize() const { - const Widget* widget = GetWidget()->GetTopLevelWidget(); - return IsZoomed() || (widget && widget->ShouldUseNativeFrame()); -} - -void NativeWidgetWin::ClientAreaSizeChanged() { - RECT r; - if (WidgetSizeIsClientSize()) - GetClientRect(&r); - else - GetWindowRect(&r); - gfx::Size s(std::max(0, static_cast<int>(r.right - r.left)), - std::max(0, static_cast<int>(r.bottom - r.top))); - if (compositor_.get()) - compositor_->WidgetSizeChanged(s); - delegate_->OnNativeWidgetSizeChanged(s); - if (use_layered_buffer_) { - layered_window_contents_.reset( - new gfx::CanvasSkia(s.width(), s.height(), false)); - } -} - -void NativeWidgetWin::ResetWindowRegion(bool force) { - // A native frame uses the native window region, and we don't want to mess - // with it. - if (GetWidget()->ShouldUseNativeFrame() || !GetWidget()->non_client_view()) { - if (force) - SetWindowRgn(NULL, TRUE); - return; - } - - // Changing the window region is going to force a paint. Only change the - // window region if the region really differs. - HRGN current_rgn = CreateRectRgn(0, 0, 0, 0); - int current_rgn_result = GetWindowRgn(GetNativeView(), current_rgn); - - CRect window_rect; - GetWindowRect(&window_rect); - HRGN new_region; - if (IsMaximized()) { - HMONITOR monitor = - MonitorFromWindow(GetNativeView(), MONITOR_DEFAULTTONEAREST); - MONITORINFO mi; - mi.cbSize = sizeof mi; - GetMonitorInfo(monitor, &mi); - CRect work_rect = mi.rcWork; - work_rect.OffsetRect(-window_rect.left, -window_rect.top); - new_region = CreateRectRgnIndirect(&work_rect); - } else { - gfx::Path window_mask; - GetWidget()->non_client_view()->GetWindowMask( - gfx::Size(window_rect.Width(), window_rect.Height()), &window_mask); - new_region = window_mask.CreateNativeRegion(); - } - - if (current_rgn_result == ERROR || !EqualRgn(current_rgn, new_region)) { - // SetWindowRgn takes ownership of the HRGN created by CreateNativeRegion. - SetWindowRgn(new_region, TRUE); - } else { - DeleteObject(new_region); - } - - DeleteObject(current_rgn); -} - -LRESULT NativeWidgetWin::DefWindowProcWithRedrawLock(UINT message, - WPARAM w_param, - LPARAM l_param) { - ScopedRedrawLock lock(this); - // The Widget and HWND can be destroyed in the call to DefWindowProc, so use - // the |destroyed_| flag to avoid unlocking (and crashing) after destruction. - bool destroyed = false; - destroyed_ = &destroyed; - LRESULT result = DefWindowProc(GetNativeView(), message, w_param, l_param); - if (destroyed) - lock.CancelUnlockOperation(); - else - destroyed_ = NULL; - return result; -} - -void NativeWidgetWin::RestoreEnabledIfNecessary() { - if (delegate_->IsModal() && !restored_enabled_) { - restored_enabled_ = true; - // If we were run modally, we need to undo the disabled-ness we inflicted on - // the owner's parent hierarchy. - HWND start = ::GetWindow(GetNativeView(), GW_OWNER); - while (start) { - ::EnableWindow(start, TRUE); - start = ::GetParent(start); - } - } -} - -void NativeWidgetWin::DispatchKeyEventPostIME(const KeyEvent& key) { - SetMsgHandled(delegate_->OnKeyEvent(key)); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, public: - -// static -void Widget::NotifyLocaleChanged() { - NOTIMPLEMENTED(); -} - -namespace { -BOOL CALLBACK WindowCallbackProc(HWND hwnd, LPARAM lParam) { - Widget* widget = Widget::GetWidgetForNativeView(hwnd); - if (widget && widget->is_secondary_widget()) - widget->Close(); - return TRUE; -} -} // namespace - -// static -void Widget::CloseAllSecondaryWidgets() { - EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc, 0); -} - -bool Widget::ConvertRect(const Widget* source, - const Widget* target, - gfx::Rect* rect) { - DCHECK(source); - DCHECK(target); - DCHECK(rect); - - HWND source_hwnd = source->GetNativeView(); - HWND target_hwnd = target->GetNativeView(); - if (source_hwnd == target_hwnd) - return true; - - RECT win_rect = rect->ToRECT(); - if (::MapWindowPoints(source_hwnd, target_hwnd, - reinterpret_cast<LPPOINT>(&win_rect), - sizeof(RECT)/sizeof(POINT))) { - *rect = win_rect; - return true; - } - return false; -} - -namespace internal { - -//////////////////////////////////////////////////////////////////////////////// -// internal::NativeWidgetPrivate, public: - -// static -NativeWidgetPrivate* NativeWidgetPrivate::CreateNativeWidget( - internal::NativeWidgetDelegate* delegate) { - return new NativeWidgetWin(delegate); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeView( - gfx::NativeView native_view) { - return reinterpret_cast<NativeWidgetWin*>( - ViewProp::GetValue(native_view, kNativeWidgetKey)); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeWindow( - gfx::NativeWindow native_window) { - return GetNativeWidgetForNativeView(native_window); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetTopLevelNativeWidget( - gfx::NativeView native_view) { - if (!native_view) - return NULL; - - // First, check if the top-level window is a Widget. - HWND root = ::GetAncestor(native_view, GA_ROOT); - if (!root) - return NULL; - - NativeWidgetPrivate* widget = GetNativeWidgetForNativeView(root); - if (widget) - return widget; - - // Second, try to locate the last Widget window in the parent hierarchy. - HWND parent_hwnd = native_view; - // If we fail to find the native widget pointer for the root then it probably - // means that the root belongs to a different process in which case we walk up - // the native view chain looking for a parent window which corresponds to a - // valid native widget. We only do this if we fail to find the native widget - // for the current native view which means it is being destroyed. - if (!widget && !GetNativeWidgetForNativeView(native_view)) { - parent_hwnd = ::GetAncestor(parent_hwnd, GA_PARENT); - if (!parent_hwnd) - return NULL; - } - NativeWidgetPrivate* parent_widget; - do { - parent_widget = GetNativeWidgetForNativeView(parent_hwnd); - if (parent_widget) { - widget = parent_widget; - parent_hwnd = ::GetAncestor(parent_hwnd, GA_PARENT); - } - } while (parent_hwnd != NULL && parent_widget != NULL); - - return widget; -} - -// static -void NativeWidgetPrivate::GetAllChildWidgets(gfx::NativeView native_view, - Widget::Widgets* children) { - if (!native_view) - return; - - Widget* widget = Widget::GetWidgetForNativeView(native_view); - if (widget) - children->insert(widget); - EnumChildWindows(native_view, EnumerateChildWindowsForNativeWidgets, - reinterpret_cast<LPARAM>(children)); -} - -// static -void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view, - gfx::NativeView new_parent) { - if (!native_view) - return; - - HWND previous_parent = ::GetParent(native_view); - if (previous_parent == new_parent) - return; - - Widget::Widgets widgets; - GetAllChildWidgets(native_view, &widgets); - - // First notify all the widgets that they are being disassociated - // from their previous parent. - for (Widget::Widgets::iterator it = widgets.begin(); - it != widgets.end(); ++it) { - // TODO(beng): Rename this notification to NotifyNativeViewChanging() - // and eliminate the bool parameter. - (*it)->NotifyNativeViewHierarchyChanged(false, previous_parent); - } - - ::SetParent(native_view, new_parent); - - // And now, notify them that they have a brand new parent. - for (Widget::Widgets::iterator it = widgets.begin(); - it != widgets.end(); ++it) { - (*it)->NotifyNativeViewHierarchyChanged(true, new_parent); - } -} - -// static -bool NativeWidgetPrivate::IsMouseButtonDown() { - return (GetKeyState(VK_LBUTTON) & 0x80) || - (GetKeyState(VK_RBUTTON) & 0x80) || - (GetKeyState(VK_MBUTTON) & 0x80) || - (GetKeyState(VK_XBUTTON1) & 0x80) || - (GetKeyState(VK_XBUTTON2) & 0x80); -} - -} // namespace internal - -} // namespace views diff --git a/ui/views/widget/native_widget_win.h b/ui/views/widget/native_widget_win.h deleted file mode 100644 index df9a3fc..0000000 --- a/ui/views/widget/native_widget_win.h +++ /dev/null @@ -1,664 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_ -#define UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_ -#pragma once - -#include <atlbase.h> -#include <atlapp.h> -#include <atlcrack.h> -#include <atlmisc.h> - -#include <string> -#include <vector> - -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/memory/scoped_vector.h" -#include "base/memory/weak_ptr.h" -#include "base/message_loop.h" -#include "base/win/scoped_comptr.h" -#include "base/win/win_util.h" -#include "ui/base/win/window_impl.h" -#include "ui/gfx/compositor/compositor.h" -#include "ui/views/focus/focus_manager.h" -#include "ui/views/layout/layout_manager.h" -#include "ui/views/widget/native_widget_private.h" - -namespace ui { -class Compositor; -class ViewProp; -} - -namespace gfx { -class CanvasSkia; -class Font; -class Rect; -} - -namespace views { - -class DropTargetWin; -class RootView; -class TooltipManagerWin; - -// These two messages aren't defined in winuser.h, but they are sent to windows -// with captions. They appear to paint the window caption and frame. -// Unfortunately if you override the standard non-client rendering as we do -// with CustomFrameWindow, sometimes Windows (not deterministically -// reproducibly but definitely frequently) will send these messages to the -// window and paint the standard caption/title over the top of the custom one. -// So we need to handle these messages in CustomFrameWindow to prevent this -// from happening. -const int WM_NCUAHDRAWCAPTION = 0xAE; -const int WM_NCUAHDRAWFRAME = 0xAF; - -/////////////////////////////////////////////////////////////////////////////// -// -// NativeWidgetWin -// A Widget for a views hierarchy used to represent anything that can be -// contained within an HWND, e.g. a control, a window, etc. Specializations -// suitable for specific tasks, e.g. top level window, are derived from this. -// -// This Widget contains a RootView which owns the hierarchy of views within it. -// As long as views are part of this tree, they will be deleted automatically -// when the RootView is destroyed. If you remove a view from the tree, you are -// then responsible for cleaning up after it. -// -/////////////////////////////////////////////////////////////////////////////// -class VIEWS_EXPORT NativeWidgetWin : public ui::WindowImpl, - public MessageLoopForUI::Observer, - public ui::CompositorDelegate, - public internal::NativeWidgetPrivate { - public: - explicit NativeWidgetWin(internal::NativeWidgetDelegate* delegate); - virtual ~NativeWidgetWin(); - - // Returns true if we are on Windows Vista or greater and composition is - // enabled. - static bool IsAeroGlassEnabled(); - - // Returns the system set window title font. - static gfx::Font GetWindowTitleFont(); - - // Show the window with the specified show command. - void Show(int show_state); - - // Disable Layered Window updates by setting to false. - void set_can_update_layered_window(bool can_update_layered_window) { - can_update_layered_window_ = can_update_layered_window; - } - - // Obtain the view event with the given MSAA child id. Used in - // NativeViewAccessibilityWin::get_accChild to support requests for - // children of windowless controls. May return NULL - // (see ViewHierarchyChanged). - View* GetAccessibilityViewEventAt(int id); - - // Add a view that has recently fired an accessibility event. Returns a MSAA - // child id which is generated by: -(index of view in vector + 1) which - // guarantees a negative child id. This distinguishes the view from - // positive MSAA child id's which are direct leaf children of views that have - // associated hWnd's (e.g. NativeWidgetWin). - int AddAccessibilityViewEvent(View* view); - - // Clear a view that has recently been removed on a hierarchy change. - void ClearAccessibilityViewEvent(View* view); - - // Hides the window if it hasn't already been force-hidden. The force hidden - // count is tracked, so calling multiple times is allowed, you just have to - // be sure to call PopForceHidden the same number of times. - void PushForceHidden(); - - // Decrements the force hidden count, showing the window if we have reached - // the top of the stack. See PushForceHidden. - void PopForceHidden(); - - BOOL IsWindow() const { - return ::IsWindow(GetNativeView()); - } - - BOOL ShowWindow(int command) { - DCHECK(::IsWindow(GetNativeView())); - return ::ShowWindow(GetNativeView(), command); - } - - HWND GetParent() const { - return ::GetParent(GetNativeView()); - } - - LONG GetWindowLong(int index) { - DCHECK(::IsWindow(GetNativeView())); - return ::GetWindowLong(GetNativeView(), index); - } - - BOOL GetWindowRect(RECT* rect) const { - return ::GetWindowRect(GetNativeView(), rect); - } - - LONG SetWindowLong(int index, LONG new_long) { - DCHECK(::IsWindow(GetNativeView())); - return ::SetWindowLong(GetNativeView(), index, new_long); - } - - BOOL SetWindowPos(HWND hwnd_after, int x, int y, int cx, int cy, UINT flags) { - DCHECK(::IsWindow(GetNativeView())); - return ::SetWindowPos(GetNativeView(), hwnd_after, x, y, cx, cy, flags); - } - - BOOL IsZoomed() const { - DCHECK(::IsWindow(GetNativeView())); - return ::IsZoomed(GetNativeView()); - } - - BOOL MoveWindow(int x, int y, int width, int height) { - return MoveWindow(x, y, width, height, TRUE); - } - - BOOL MoveWindow(int x, int y, int width, int height, BOOL repaint) { - DCHECK(::IsWindow(GetNativeView())); - return ::MoveWindow(GetNativeView(), x, y, width, height, repaint); - } - - int SetWindowRgn(HRGN region, BOOL redraw) { - DCHECK(::IsWindow(GetNativeView())); - return ::SetWindowRgn(GetNativeView(), region, redraw); - } - - BOOL GetClientRect(RECT* rect) const { - DCHECK(::IsWindow(GetNativeView())); - return ::GetClientRect(GetNativeView(), rect); - } - - // Overridden from ui::CompositorDelegate: - virtual void ScheduleDraw(); - - // Overridden from internal::NativeWidgetPrivate: - virtual void InitNativeWidget(const Widget::InitParams& params) OVERRIDE; - virtual NonClientFrameView* CreateNonClientFrameView() OVERRIDE; - virtual void UpdateFrameAfterFrameChange() OVERRIDE; - virtual bool ShouldUseNativeFrame() const OVERRIDE; - virtual void FrameTypeChanged() OVERRIDE; - virtual Widget* GetWidget() OVERRIDE; - virtual const Widget* GetWidget() const OVERRIDE; - virtual gfx::NativeView GetNativeView() const OVERRIDE; - virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE; - virtual Widget* GetTopLevelWidget() OVERRIDE; - virtual const ui::Compositor* GetCompositor() const OVERRIDE; - virtual ui::Compositor* GetCompositor() OVERRIDE; - virtual void CalculateOffsetToAncestorWithLayer( - gfx::Point* offset, - ui::Layer** layer_parent) OVERRIDE; - virtual void ReorderLayers() OVERRIDE; - virtual void ViewRemoved(View* view) OVERRIDE; - virtual void SetNativeWindowProperty(const char* name, void* value) OVERRIDE; - virtual void* GetNativeWindowProperty(const char* name) const OVERRIDE; - virtual TooltipManager* GetTooltipManager() const OVERRIDE; - virtual bool IsScreenReaderActive() const OVERRIDE; - virtual void SendNativeAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type) OVERRIDE; - virtual void SetMouseCapture() OVERRIDE; - virtual void ReleaseMouseCapture() OVERRIDE; - virtual bool HasMouseCapture() const OVERRIDE; - virtual InputMethod* CreateInputMethod() OVERRIDE; - virtual void CenterWindow(const gfx::Size& size) OVERRIDE; - virtual void GetWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* show_state) const OVERRIDE; - virtual void SetWindowTitle(const string16& title) OVERRIDE; - virtual void SetWindowIcons(const SkBitmap& window_icon, - const SkBitmap& app_icon) OVERRIDE; - virtual void SetAccessibleName(const string16& name) OVERRIDE; - virtual void SetAccessibleRole(ui::AccessibilityTypes::Role role) OVERRIDE; - virtual void SetAccessibleState(ui::AccessibilityTypes::State state) OVERRIDE; - virtual void BecomeModal() OVERRIDE; - virtual gfx::Rect GetWindowScreenBounds() const OVERRIDE; - virtual gfx::Rect GetClientAreaScreenBounds() const OVERRIDE; - virtual gfx::Rect GetRestoredBounds() const OVERRIDE; - virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; - virtual void SetSize(const gfx::Size& size) OVERRIDE; - virtual void MoveAbove(gfx::NativeView native_view) OVERRIDE; - virtual void MoveToTop() OVERRIDE; - virtual void SetShape(gfx::NativeRegion shape) OVERRIDE; - virtual void Close() OVERRIDE; - virtual void CloseNow() OVERRIDE; - virtual void EnableClose(bool enable) OVERRIDE; - virtual void Show() OVERRIDE; - virtual void Hide() OVERRIDE; - virtual void ShowMaximizedWithBounds( - const gfx::Rect& restored_bounds) OVERRIDE; - virtual void ShowWithWindowState(ui::WindowShowState show_state) OVERRIDE; - virtual bool IsVisible() const OVERRIDE; - virtual void Activate() OVERRIDE; - virtual void Deactivate() OVERRIDE; - virtual bool IsActive() const OVERRIDE; - virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; - virtual void Maximize() OVERRIDE; - virtual void Minimize() OVERRIDE; - virtual bool IsMaximized() const OVERRIDE; - virtual bool IsMinimized() const OVERRIDE; - virtual void Restore() OVERRIDE; - virtual void SetFullscreen(bool fullscreen) OVERRIDE; - virtual bool IsFullscreen() const OVERRIDE; - virtual void SetOpacity(unsigned char opacity) OVERRIDE; - virtual void SetUseDragFrame(bool use_drag_frame) OVERRIDE; - virtual bool IsAccessibleWidget() const OVERRIDE; - virtual void RunShellDrag(View* view, - const ui::OSExchangeData& data, - int operation) OVERRIDE; - virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE; - virtual void SetCursor(gfx::NativeCursor cursor) OVERRIDE; - virtual void ClearNativeFocus() OVERRIDE; - virtual void FocusNativeView(gfx::NativeView native_view) OVERRIDE; - virtual bool ConvertPointFromAncestor( - const Widget* ancestor, gfx::Point* point) const OVERRIDE; - virtual gfx::Rect GetWorkAreaBoundsInScreen() const OVERRIDE; - virtual void SetInactiveRenderingDisabled(bool value) OVERRIDE; - - protected: - // Information saved before going into fullscreen mode, used to restore the - // window afterwards. - struct SavedWindowInfo { - bool maximized; - LONG style; - LONG ex_style; - RECT window_rect; - }; - - // Overridden from MessageLoop::Observer: - virtual base::EventStatus WillProcessEvent( - const base::NativeEvent& event) OVERRIDE; - virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE; - - // Overridden from WindowImpl: - virtual HICON GetDefaultWindowIcon() const OVERRIDE; - virtual LRESULT OnWndProc(UINT message, - WPARAM w_param, - LPARAM l_param) OVERRIDE; - - // Message Handlers ---------------------------------------------------------- - - BEGIN_MSG_MAP_EX(NativeWidgetWin) - // Range handlers must go first! - MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) - MESSAGE_RANGE_HANDLER_EX(WM_NCMOUSEMOVE, WM_NCXBUTTONDBLCLK, OnMouseRange) - - // Reflected message handler - MESSAGE_HANDLER_EX(base::win::kReflectedMessage, OnReflectedMessage) - - // CustomFrameWindow hacks - MESSAGE_HANDLER_EX(WM_NCUAHDRAWCAPTION, OnNCUAHDrawCaption) - MESSAGE_HANDLER_EX(WM_NCUAHDRAWFRAME, OnNCUAHDrawFrame) - - // Vista and newer - MESSAGE_HANDLER_EX(WM_DWMCOMPOSITIONCHANGED, OnDwmCompositionChanged) - - // Non-atlcrack.h handlers - MESSAGE_HANDLER_EX(WM_GETOBJECT, OnGetObject) - - // Mouse events. - MESSAGE_HANDLER_EX(WM_MOUSEACTIVATE, OnMouseActivate) - MESSAGE_HANDLER_EX(WM_MOUSELEAVE, OnMouseRange) - MESSAGE_HANDLER_EX(WM_NCMOUSELEAVE, OnMouseRange) - MESSAGE_HANDLER_EX(WM_SETCURSOR, OnSetCursor); - - // Key events. - MESSAGE_HANDLER_EX(WM_KEYDOWN, OnKeyEvent) - MESSAGE_HANDLER_EX(WM_KEYUP, OnKeyEvent) - MESSAGE_HANDLER_EX(WM_SYSKEYDOWN, OnKeyEvent) - MESSAGE_HANDLER_EX(WM_SYSKEYUP, OnKeyEvent) - - // IME Events. - MESSAGE_HANDLER_EX(WM_IME_SETCONTEXT, OnImeMessages) - MESSAGE_HANDLER_EX(WM_IME_STARTCOMPOSITION, OnImeMessages) - MESSAGE_HANDLER_EX(WM_IME_COMPOSITION, OnImeMessages) - MESSAGE_HANDLER_EX(WM_IME_ENDCOMPOSITION, OnImeMessages) - MESSAGE_HANDLER_EX(WM_IME_REQUEST, OnImeMessages) - MESSAGE_HANDLER_EX(WM_CHAR, OnImeMessages) - MESSAGE_HANDLER_EX(WM_SYSCHAR, OnImeMessages) - MESSAGE_HANDLER_EX(WM_DEADCHAR, OnImeMessages) - MESSAGE_HANDLER_EX(WM_SYSDEADCHAR, OnImeMessages) - - // This list is in _ALPHABETICAL_ order! OR I WILL HURT YOU. - MSG_WM_ACTIVATE(OnActivate) - MSG_WM_ACTIVATEAPP(OnActivateApp) - MSG_WM_APPCOMMAND(OnAppCommand) - MSG_WM_CANCELMODE(OnCancelMode) - MSG_WM_CAPTURECHANGED(OnCaptureChanged) - MSG_WM_CLOSE(OnClose) - MSG_WM_COMMAND(OnCommand) - MSG_WM_CREATE(OnCreate) - MSG_WM_DESTROY(OnDestroy) - MSG_WM_DISPLAYCHANGE(OnDisplayChange) - MSG_WM_ERASEBKGND(OnEraseBkgnd) - MSG_WM_ENDSESSION(OnEndSession) - MSG_WM_ENTERSIZEMOVE(OnEnterSizeMove) - MSG_WM_EXITMENULOOP(OnExitMenuLoop) - MSG_WM_EXITSIZEMOVE(OnExitSizeMove) - MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo) - MSG_WM_HSCROLL(OnHScroll) - MSG_WM_INITMENU(OnInitMenu) - MSG_WM_INITMENUPOPUP(OnInitMenuPopup) - MSG_WM_INPUTLANGCHANGE(OnInputLangChange) - MSG_WM_KILLFOCUS(OnKillFocus) - MSG_WM_MOVE(OnMove) - MSG_WM_MOVING(OnMoving) - MSG_WM_NCACTIVATE(OnNCActivate) - MSG_WM_NCCALCSIZE(OnNCCalcSize) - MSG_WM_NCHITTEST(OnNCHitTest) - MSG_WM_NCPAINT(OnNCPaint) - MSG_WM_NOTIFY(OnNotify) - MSG_WM_PAINT(OnPaint) - MSG_WM_POWERBROADCAST(OnPowerBroadcast) - MSG_WM_SETFOCUS(OnSetFocus) - MSG_WM_SETICON(OnSetIcon) - MSG_WM_SETTEXT(OnSetText) - MSG_WM_SETTINGCHANGE(OnSettingChange) - MSG_WM_SIZE(OnSize) - MSG_WM_SYSCOMMAND(OnSysCommand) - MSG_WM_THEMECHANGED(OnThemeChanged) - MSG_WM_VSCROLL(OnVScroll) - MSG_WM_WINDOWPOSCHANGING(OnWindowPosChanging) - MSG_WM_WINDOWPOSCHANGED(OnWindowPosChanged) - END_MSG_MAP() - - // These are all virtual so that specialized Widgets can modify or augment - // processing. - // This list is in _ALPHABETICAL_ order! - // Note: in the base class these functions must do nothing but convert point - // coordinates to client coordinates (if necessary) and forward the - // handling to the appropriate Process* function. This is so that - // subclasses can easily override these methods to do different things - // and have a convenient function to call to get the default behavior. - virtual void OnActivate(UINT action, BOOL minimized, HWND window); - virtual void OnActivateApp(BOOL active, DWORD thread_id); - virtual LRESULT OnAppCommand(HWND window, short app_command, WORD device, - int keystate); - virtual void OnCancelMode(); - virtual void OnCaptureChanged(HWND hwnd); - virtual void OnClose(); - virtual void OnCommand(UINT notification_code, int command_id, HWND window); - virtual LRESULT OnCreate(CREATESTRUCT* create_struct); - // WARNING: If you override this be sure and invoke super, otherwise we'll - // leak a few things. - virtual void OnDestroy(); - virtual void OnDisplayChange(UINT bits_per_pixel, CSize screen_size); - virtual LRESULT OnDwmCompositionChanged(UINT msg, - WPARAM w_param, - LPARAM l_param); - virtual void OnEndSession(BOOL ending, UINT logoff); - virtual void OnEnterSizeMove(); - virtual LRESULT OnEraseBkgnd(HDC dc); - virtual void OnExitMenuLoop(BOOL is_track_popup_menu); - virtual void OnExitSizeMove(); - virtual LRESULT OnGetObject(UINT uMsg, WPARAM w_param, LPARAM l_param); - virtual void OnGetMinMaxInfo(MINMAXINFO* minmax_info); - virtual void OnHScroll(int scroll_type, short position, HWND scrollbar); - virtual LRESULT OnImeMessages(UINT message, WPARAM w_param, LPARAM l_param); - virtual void OnInitMenu(HMENU menu); - virtual void OnInitMenuPopup(HMENU menu, UINT position, BOOL is_system_menu); - virtual void OnInputLangChange(DWORD character_set, HKL input_language_id); - virtual LRESULT OnKeyEvent(UINT message, WPARAM w_param, LPARAM l_param); - virtual void OnKillFocus(HWND focused_window); - virtual LRESULT OnMouseActivate(UINT message, WPARAM w_param, LPARAM l_param); - virtual LRESULT OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param); - virtual void OnMove(const CPoint& point); - virtual void OnMoving(UINT param, LPRECT new_bounds); - virtual LRESULT OnNCActivate(BOOL active); - virtual LRESULT OnNCCalcSize(BOOL w_param, LPARAM l_param); - virtual LRESULT OnNCHitTest(const CPoint& pt); - virtual void OnNCPaint(HRGN rgn); - virtual LRESULT OnNCUAHDrawCaption(UINT msg, - WPARAM w_param, - LPARAM l_param); - virtual LRESULT OnNCUAHDrawFrame(UINT msg, WPARAM w_param, LPARAM l_param); - virtual LRESULT OnNotify(int w_param, NMHDR* l_param); - virtual void OnPaint(HDC dc); - virtual LRESULT OnPowerBroadcast(DWORD power_event, DWORD data); - virtual LRESULT OnReflectedMessage(UINT msg, WPARAM w_param, LPARAM l_param); - virtual LRESULT OnSetCursor(UINT message, WPARAM w_param, LPARAM l_param); - virtual void OnSetFocus(HWND focused_window); - virtual LRESULT OnSetIcon(UINT size_type, HICON new_icon); - virtual LRESULT OnSetText(const wchar_t* text); - virtual void OnSettingChange(UINT flags, const wchar_t* section); - virtual void OnSize(UINT param, const CSize& size); - virtual void OnSysCommand(UINT notification_code, CPoint click); - virtual void OnThemeChanged(); - virtual void OnVScroll(int scroll_type, short position, HWND scrollbar); - virtual void OnWindowPosChanging(WINDOWPOS* window_pos); - virtual void OnWindowPosChanged(WINDOWPOS* window_pos); - - // Deletes this window as it is destroyed, override to provide different - // behavior. - virtual void OnFinalMessage(HWND window); - - // Retrieve the show state of the window. This is one of the SW_SHOW* flags - // passed into Windows' ShowWindow method. For normal windows this defaults - // to SW_SHOWNORMAL, however windows (e.g. the main window) can override this - // method to provide different values (e.g. retrieve the user's specified - // show state from the shortcut starutp info). - virtual int GetShowState() const; - - // Returns the insets of the client area relative to the non-client area of - // the window. Override this function instead of OnNCCalcSize, which is - // crazily complicated. - virtual gfx::Insets GetClientAreaInsets() const; - - // Start tracking all mouse events so that this window gets sent mouse leave - // messages too. - void TrackMouseEvents(DWORD mouse_tracking_flags); - - // Called when a MSAA screen reader client is detected. - virtual void OnScreenReaderDetected(); - - // Executes the specified SC_command. - void ExecuteSystemMenuCommand(int command); - - // The TooltipManager. This is NULL if there is a problem creating the - // underlying tooltip window. - // WARNING: RootView's destructor calls into the TooltipManager. As such, this - // must be destroyed AFTER root_view_. - scoped_ptr<TooltipManagerWin> tooltip_manager_; - - scoped_refptr<DropTargetWin> drop_target_; - - const gfx::Rect& invalid_rect() const { return invalid_rect_; } - - // Saved window information from before entering fullscreen mode. - // TODO(beng): move to private once GetRestoredBounds() moves onto Widget. - SavedWindowInfo saved_window_info_; - - private: - typedef ScopedVector<ui::ViewProp> ViewProps; - - // Called after the WM_ACTIVATE message has been processed by the default - // windows procedure. - static void PostProcessActivateMessage(NativeWidgetWin* widget, - int activation_state); - - void SetInitParams(const Widget::InitParams& params); - - // Synchronously paints the invalid contents of the Widget. - void RedrawInvalidRect(); - - // Synchronously updates the invalid contents of the Widget. Valid for - // layered windows only. - void RedrawLayeredWindowContents(); - - // Lock or unlock the window from being able to redraw itself in response to - // updates to its invalid region. - class ScopedRedrawLock; - void LockUpdates(); - void UnlockUpdates(); - - // Determines whether the delegate expects the client size or the window size. - bool WidgetSizeIsClientSize() const; - - // Responds to the client area changing size, either at window creation time - // or subsequently. - void ClientAreaSizeChanged(); - - // Resets the window region for the current widget bounds if necessary. - // If |force| is true, the window region is reset to NULL even for native - // frame windows. - void ResetWindowRegion(bool force); - - // Calls DefWindowProc, safely wrapping the call in a ScopedRedrawLock to - // prevent frame flicker. DefWindowProc handling can otherwise render the - // classic-look window title bar directly. - LRESULT DefWindowProcWithRedrawLock(UINT message, - WPARAM w_param, - LPARAM l_param); - - // Stops ignoring SetWindowPos() requests (see below). - void StopIgnoringPosChanges() { ignore_window_pos_changes_ = false; } - - void RestoreEnabledIfNecessary(); - - void SetInitialFocus(); - - // Overridden from internal::InputMethodDelegate - virtual void DispatchKeyEventPostIME(const KeyEvent& key) OVERRIDE; - - // A delegate implementation that handles events received here. - // See class documentation for Widget in widget.h for a note about ownership. - internal::NativeWidgetDelegate* delegate_; - - // The following factory is used for calls to close the NativeWidgetWin - // instance. - base::WeakPtrFactory<NativeWidgetWin> close_widget_factory_; - - // The flags currently being used with TrackMouseEvent to track mouse - // messages. 0 if there is no active tracking. The value of this member is - // used when tracking is canceled. - DWORD active_mouse_tracking_flags_; - - // Should we keep an off-screen buffer? This is false by default, set to true - // when WS_EX_LAYERED is specified before the native window is created. - // - // NOTE: this is intended to be used with a layered window (a window with an - // extended window style of WS_EX_LAYERED). If you are using a layered window - // and NOT changing the layered alpha or anything else, then leave this value - // alone. OTOH if you are invoking SetLayeredWindowAttributes then you'll - // most likely want to set this to false, or after changing the alpha toggle - // the extended style bit to false than back to true. See MSDN for more - // details. - bool use_layered_buffer_; - - // The default alpha to be applied to the layered window. - BYTE layered_alpha_; - - // A canvas that contains the window contents in the case of a layered - // window. - scoped_ptr<gfx::CanvasSkia> layered_window_contents_; - - // We must track the invalid rect ourselves, for two reasons: - // For layered windows, Windows will not do this properly with - // InvalidateRect()/GetUpdateRect(). (In fact, it'll return misleading - // information from GetUpdateRect()). - // We also need to keep track of the invalid rectangle for the RootView should - // we need to paint the non-client area. The data supplied to WM_NCPAINT seems - // to be insufficient. - gfx::Rect invalid_rect_; - - // A factory that allows us to schedule a redraw for layered windows. - base::WeakPtrFactory<NativeWidgetWin> paint_layered_window_factory_; - - // See class documentation for Widget in widget.h for a note about ownership. - Widget::InitParams::Ownership ownership_; - - // True if we are allowed to update the layered window from the DIB backing - // store if necessary. - bool can_update_layered_window_; - - // Whether the focus should be restored next time we get enabled. Needed to - // restore focus correctly when Windows modal dialogs are displayed. - bool restore_focus_when_enabled_; - - // Instance of accessibility information and handling for MSAA root - base::win::ScopedComPtr<IAccessible> accessibility_root_; - - // Value determines whether the Widget is customized for accessibility. - static bool screen_reader_active_; - - // The maximum number of view events in our vector below. - static const int kMaxAccessibilityViewEvents = 20; - - // A vector used to access views for which we have sent notifications to - // accessibility clients. It is used as a circular queue. - std::vector<View*> accessibility_view_events_; - - // The current position of the view events vector. When incrementing, - // we always mod this value with the max view events above . - int accessibility_view_events_index_; - - // The last cursor that was active before the current one was selected. Saved - // so that we can restore it. - gfx::NativeCursor previous_cursor_; - - ViewProps props_; - - // True if we're in fullscreen mode. - bool fullscreen_; - - // If this is greater than zero, we should prevent attempts to make the window - // visible when we handle WM_WINDOWPOSCHANGING. Some calls like - // ShowWindow(SW_RESTORE) make the window visible in addition to restoring it, - // when all we want to do is restore it. - int force_hidden_count_; - - // The window styles before we modified them for the drag frame appearance. - DWORD drag_frame_saved_window_style_; - DWORD drag_frame_saved_window_ex_style_; - - // Represents the number of ScopedRedrawLocks active against this widget. - // If this is greater than zero, the widget should be locked against updates. - int lock_updates_count_; - - // The window styles of the window before updates were locked. - DWORD saved_window_style_; - - // When true, this flag makes us discard incoming SetWindowPos() requests that - // only change our position/size. (We still allow changes to Z-order, - // activation, etc.) - bool ignore_window_pos_changes_; - - // The following factory is used to ignore SetWindowPos() calls for short time - // periods. - base::WeakPtrFactory<NativeWidgetWin> ignore_pos_changes_factory_; - - // The last-seen monitor containing us, and its rect and work area. These are - // used to catch updates to the rect and work area and react accordingly. - HMONITOR last_monitor_; - gfx::Rect last_monitor_rect_, last_work_area_; - - // Set to true when the user presses the right mouse button on the caption - // area. We need this so we can correctly show the context menu on mouse-up. - bool is_right_mouse_pressed_on_caption_; - - // Whether all ancestors have been enabled. This is only used if is_modal_ is - // true. - bool restored_enabled_; - - // The compositor for accelerated drawing. - scoped_refptr<ui::Compositor> compositor_; - - // This flag can be initialized and checked after certain operations (such as - // DefWindowProc) to avoid stack-controlled NativeWidgetWin operations (such - // as unlocking the Window with a ScopedRedrawLock) after Widget destruction. - bool* destroyed_; - - // True if the widget is going to have a non_client_view. We cache this value - // rather than asking the Widget for the non_client_view so that we know at - // Init time, before the Widget has created the NonClientView. - bool has_non_client_view_; - - DISALLOW_COPY_AND_ASSIGN(NativeWidgetWin); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_ diff --git a/ui/views/widget/native_widget_win_unittest.cc b/ui/views/widget/native_widget_win_unittest.cc deleted file mode 100644 index 9ad5ecb..0000000 --- a/ui/views/widget/native_widget_win_unittest.cc +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/native_widget_win.h" - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/message_loop.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace views { -namespace { - -class NativeWidgetWinTest : public testing::Test { - public: - NativeWidgetWinTest() { - OleInitialize(NULL); - } - - ~NativeWidgetWinTest() { - OleUninitialize(); - } - - virtual void TearDown() { - // Flush the message loop because we have pending release tasks - // and these tasks if un-executed would upset Valgrind. - RunPendingMessages(); - } - - // Create a simple widget win. The caller is responsible for taking ownership - // of the returned value. - NativeWidgetWin* CreateNativeWidgetWin(); - - void RunPendingMessages() { - message_loop_.RunAllPending(); - } - - private: - MessageLoopForUI message_loop_; - - DISALLOW_COPY_AND_ASSIGN(NativeWidgetWinTest); -}; - -NativeWidgetWin* NativeWidgetWinTest::CreateNativeWidgetWin() { - scoped_ptr<Widget> widget(new Widget); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - params.bounds = gfx::Rect(50, 50, 650, 650); - widget->Init(params); - return static_cast<NativeWidgetWin*>(widget.release()->native_widget()); -} - -TEST_F(NativeWidgetWinTest, ZoomWindow) { - scoped_ptr<NativeWidgetWin> window(CreateNativeWidgetWin()); - window->ShowWindow(SW_HIDE); - EXPECT_FALSE(window->IsActive()); - window->ShowWindow(SW_MAXIMIZE); - EXPECT_TRUE(window->IsZoomed()); - window->CloseNow(); -} - -TEST_F(NativeWidgetWinTest, SetBoundsForZoomedWindow) { - scoped_ptr<NativeWidgetWin> window(CreateNativeWidgetWin()); - window->ShowWindow(SW_MAXIMIZE); - EXPECT_TRUE(window->IsZoomed()); - - // Create another window, so that it will be active. - scoped_ptr<NativeWidgetWin> window2(CreateNativeWidgetWin()); - window2->ShowWindow(SW_MAXIMIZE); - EXPECT_TRUE(window2->IsActive()); - EXPECT_FALSE(window->IsActive()); - - // Verify that setting the bounds of a zoomed window will unzoom it and not - // cause it to be activated. - window->SetBounds(gfx::Rect(50, 50, 650, 650)); - EXPECT_FALSE(window->IsZoomed()); - EXPECT_FALSE(window->IsActive()); - - // Cleanup. - window->CloseNow(); - window2->CloseNow(); -} - -} // namespace -} // namespace views diff --git a/ui/views/widget/root_view.cc b/ui/views/widget/root_view.cc deleted file mode 100644 index 4334e4d..0000000 --- a/ui/views/widget/root_view.cc +++ /dev/null @@ -1,455 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/root_view.h" - -#include <algorithm> - -#include "base/logging.h" -#include "base/message_loop.h" -#include "ui/base/accessibility/accessible_view_state.h" -#include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/base/keycodes/keyboard_codes.h" -#include "ui/gfx/canvas_skia.h" -#include "ui/gfx/compositor/layer.h" -#include "ui/views/focus/view_storage.h" -#include "ui/views/layout/fill_layout.h" -#include "ui/views/touchui/gesture_manager.h" -#include "ui/views/widget/widget.h" - -namespace views { -namespace internal { - -// static -const char RootView::kViewClassName[] = "views/RootView"; - -//////////////////////////////////////////////////////////////////////////////// -// RootView, public: - -// Creation and lifetime ------------------------------------------------------- - -RootView::RootView(Widget* widget) - : widget_(widget), - mouse_pressed_handler_(NULL), - mouse_move_handler_(NULL), - last_click_handler_(NULL), - explicit_mouse_handler_(false), - last_mouse_event_flags_(0), - last_mouse_event_x_(-1), - last_mouse_event_y_(-1), - gesture_manager_(GestureManager::GetInstance()), - touch_pressed_handler_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST(focus_search_(this, false, false)), - focus_traversable_parent_(NULL), - focus_traversable_parent_view_(NULL) { -} - -RootView::~RootView() { - // If we have children remove them explicitly so to make sure a remove - // notification is sent for each one of them. - if (has_children()) - RemoveAllChildViews(true); -} - -// Tree operations ------------------------------------------------------------- - -void RootView::SetContentsView(View* contents_view) { - DCHECK(contents_view && GetWidget()->native_widget()) << - "Can't be called until after the native widget is created!"; - // The ContentsView must be set up _after_ the window is created so that its - // Widget pointer is valid. - SetLayoutManager(new FillLayout); - if (has_children()) - RemoveAllChildViews(true); - AddChildView(contents_view); - - // Force a layout now, since the attached hierarchy won't be ready for the - // containing window's bounds. Note that we call Layout directly rather than - // calling the widget's size changed handler, since the RootView's bounds may - // not have changed, which will cause the Layout not to be done otherwise. - Layout(); -} - -View* RootView::GetContentsView() { - return child_count() > 0 ? child_at(0) : NULL; -} - -void RootView::NotifyNativeViewHierarchyChanged(bool attached, - gfx::NativeView native_view) { - PropagateNativeViewHierarchyChanged(attached, native_view, this); -} - -// Input ----------------------------------------------------------------------- - -bool RootView::OnKeyEvent(const KeyEvent& event) { - bool consumed = false; - - View* v = GetFocusManager()->GetFocusedView(); - // Special case to handle right-click context menus triggered by the - // keyboard. - if (v && v->IsEnabled() && ((event.key_code() == ui::VKEY_APPS) || - (event.key_code() == ui::VKEY_F10 && event.IsShiftDown()))) { - v->ShowContextMenu(v->GetKeyboardContextMenuLocation(), false); - return true; - } - for (; v && v != this && !consumed; v = v->parent()) { - consumed = (event.type() == ui::ET_KEY_PRESSED) ? - v->OnKeyPressed(event) : v->OnKeyReleased(event); - } - return consumed; -} - -// Focus ----------------------------------------------------------------------- - -void RootView::SetFocusTraversableParent(FocusTraversable* focus_traversable) { - DCHECK(focus_traversable != this); - focus_traversable_parent_ = focus_traversable; -} - -void RootView::SetFocusTraversableParentView(View* view) { - focus_traversable_parent_view_ = view; -} - -// System events --------------------------------------------------------------- - -void RootView::ThemeChanged() { - View::PropagateThemeChanged(); -} - -void RootView::LocaleChanged() { - View::PropagateLocaleChanged(); -} - -//////////////////////////////////////////////////////////////////////////////// -// RootView, FocusTraversable implementation: - -FocusSearch* RootView::GetFocusSearch() { - return &focus_search_; -} - -FocusTraversable* RootView::GetFocusTraversableParent() { - return focus_traversable_parent_; -} - -View* RootView::GetFocusTraversableParentView() { - return focus_traversable_parent_view_; -} - -//////////////////////////////////////////////////////////////////////////////// -// RootView, View overrides: - -const Widget* RootView::GetWidget() const { - return widget_; -} - -Widget* RootView::GetWidget() { - return const_cast<Widget*>(const_cast<const RootView*>(this)->GetWidget()); -} - -bool RootView::IsVisibleInRootView() const { - return IsVisible(); -} - -std::string RootView::GetClassName() const { - return kViewClassName; -} - -void RootView::SchedulePaintInRect(const gfx::Rect& rect) { - if (layer()) { - layer()->SchedulePaint(rect); - } else { - gfx::Rect xrect = ConvertRectToParent(rect); - gfx::Rect invalid_rect = GetLocalBounds().Intersect(xrect); - if (!invalid_rect.IsEmpty()) - widget_->SchedulePaintInRect(invalid_rect); - } -} - -bool RootView::OnMousePressed(const MouseEvent& event) { - MouseEvent e(event, this); - UpdateCursor(e); - SetMouseLocationAndFlags(e); - - // If mouse_pressed_handler_ is non null, we are currently processing - // a pressed -> drag -> released session. In that case we send the - // event to mouse_pressed_handler_ - if (mouse_pressed_handler_) { - MouseEvent mouse_pressed_event(e, this, mouse_pressed_handler_); - drag_info.Reset(); - mouse_pressed_handler_->ProcessMousePressed(mouse_pressed_event, - &drag_info); - return true; - } - DCHECK(!explicit_mouse_handler_); - - bool hit_disabled_view = false; - // Walk up the tree until we find a view that wants the mouse event. - for (mouse_pressed_handler_ = GetEventHandlerForPoint(e.location()); - mouse_pressed_handler_ && (mouse_pressed_handler_ != this); - mouse_pressed_handler_ = mouse_pressed_handler_->parent()) { - if (!mouse_pressed_handler_->IsEnabled()) { - // Disabled views should eat events instead of propagating them upwards. - hit_disabled_view = true; - break; - } - - // See if this view wants to handle the mouse press. - MouseEvent mouse_pressed_event(e, this, mouse_pressed_handler_); - - // Remove the double-click flag if the handler is different than the - // one which got the first click part of the double-click. - if (mouse_pressed_handler_ != last_click_handler_) - mouse_pressed_event.set_flags(e.flags() & ~ui::EF_IS_DOUBLE_CLICK); - - drag_info.Reset(); - bool handled = mouse_pressed_handler_->ProcessMousePressed( - mouse_pressed_event, &drag_info); - - // The view could have removed itself from the tree when handling - // OnMousePressed(). In this case, the removal notification will have - // reset mouse_pressed_handler_ to NULL out from under us. Detect this - // case and stop. (See comments in view.h.) - // - // NOTE: Don't return true here, because we don't want the frame to - // forward future events to us when there's no handler. - if (!mouse_pressed_handler_) - break; - - // If the view handled the event, leave mouse_pressed_handler_ set and - // return true, which will cause subsequent drag/release events to get - // forwarded to that view. - if (handled) { - last_click_handler_ = mouse_pressed_handler_; - return true; - } - } - - // Reset mouse_pressed_handler_ to indicate that no processing is occurring. - mouse_pressed_handler_ = NULL; - - // In the event that a double-click is not handled after traversing the - // entire hierarchy (even as a single-click when sent to a different view), - // it must be marked as handled to avoid anything happening from default - // processing if it the first click-part was handled by us. - if (last_click_handler_ && e.flags() & ui::EF_IS_DOUBLE_CLICK) - hit_disabled_view = true; - - last_click_handler_ = NULL; - return hit_disabled_view; -} - -bool RootView::OnMouseDragged(const MouseEvent& event) { - MouseEvent e(event, this); - UpdateCursor(e); - - if (mouse_pressed_handler_) { - SetMouseLocationAndFlags(e); - - MouseEvent mouse_event(e, this, mouse_pressed_handler_); - return mouse_pressed_handler_->ProcessMouseDragged(mouse_event, &drag_info); - } - return false; -} - -void RootView::OnMouseReleased(const MouseEvent& event) { - MouseEvent e(event, this); - UpdateCursor(e); - - if (mouse_pressed_handler_) { - MouseEvent mouse_released(e, this, mouse_pressed_handler_); - // We allow the view to delete us from ProcessMouseReleased. As such, - // configure state such that we're done first, then call View. - View* mouse_pressed_handler = mouse_pressed_handler_; - SetMouseHandler(NULL); - mouse_pressed_handler->ProcessMouseReleased(mouse_released); - // WARNING: we may have been deleted. - } -} - -void RootView::OnMouseCaptureLost() { - if (mouse_pressed_handler_) { - // Synthesize a release event for UpdateCursor. - MouseEvent release_event(ui::ET_MOUSE_RELEASED, last_mouse_event_x_, - last_mouse_event_y_, last_mouse_event_flags_); - UpdateCursor(release_event); - // We allow the view to delete us from OnMouseCaptureLost. As such, - // configure state such that we're done first, then call View. - View* mouse_pressed_handler = mouse_pressed_handler_; - SetMouseHandler(NULL); - mouse_pressed_handler->OnMouseCaptureLost(); - // WARNING: we may have been deleted. - } -} - -void RootView::OnMouseMoved(const MouseEvent& event) { - MouseEvent e(event, this); - View* v = GetEventHandlerForPoint(e.location()); - // Find the first enabled view, or the existing move handler, whichever comes - // first. The check for the existing handler is because if a view becomes - // disabled while handling moves, it's wrong to suddenly send ET_MOUSE_EXITED - // and ET_MOUSE_ENTERED events, because the mouse hasn't actually exited yet. - while (v && !v->IsEnabled() && (v != mouse_move_handler_)) - v = v->parent(); - if (v && v != this) { - if (v != mouse_move_handler_) { - if (mouse_move_handler_ != NULL) - mouse_move_handler_->OnMouseExited(e); - mouse_move_handler_ = v; - MouseEvent entered_event(e, this, mouse_move_handler_); - mouse_move_handler_->OnMouseEntered(entered_event); - } - MouseEvent moved_event(e, this, mouse_move_handler_); - mouse_move_handler_->OnMouseMoved(moved_event); - if (!(moved_event.flags() & ui::EF_IS_NON_CLIENT)) - widget_->SetCursor(mouse_move_handler_->GetCursor(moved_event)); - } else if (mouse_move_handler_ != NULL) { - mouse_move_handler_->OnMouseExited(e); - widget_->SetCursor(gfx::kNullCursor); - } -} - -void RootView::OnMouseExited(const MouseEvent& event) { - if (mouse_move_handler_ != NULL) { - mouse_move_handler_->OnMouseExited(event); - mouse_move_handler_ = NULL; - } -} - -bool RootView::OnMouseWheel(const MouseWheelEvent& event) { - MouseWheelEvent e(event, this); - bool consumed = false; - for (View* v = GetFocusManager()->GetFocusedView(); - v && v != this && !consumed; v = v->parent()) - consumed = v->OnMouseWheel(e); - return consumed; -} - -ui::TouchStatus RootView::OnTouchEvent(const TouchEvent& event) { - TouchEvent e(event, this); - - // If touch_pressed_handler_ is non null, we are currently processing - // a touch down on the screen situation. In that case we send the - // event to touch_pressed_handler_ - ui::TouchStatus status = ui::TOUCH_STATUS_UNKNOWN; - - if (touch_pressed_handler_) { - TouchEvent touch_event(e, this, touch_pressed_handler_); - status = touch_pressed_handler_->ProcessTouchEvent(touch_event); - if (gesture_manager_->ProcessTouchEventForGesture(e, this, status)) - status = ui::TOUCH_STATUS_SYNTH_MOUSE; - if (status == ui::TOUCH_STATUS_END) - touch_pressed_handler_ = NULL; - return status; - } - - // Walk up the tree until we find a view that wants the touch event. - for (touch_pressed_handler_ = GetEventHandlerForPoint(e.location()); - touch_pressed_handler_ && (touch_pressed_handler_ != this); - touch_pressed_handler_ = touch_pressed_handler_->parent()) { - if (!touch_pressed_handler_->IsEnabled()) { - // Disabled views eat events but are treated as not handled by the - // the GestureManager. - status = ui::TOUCH_STATUS_UNKNOWN; - break; - } - - // See if this view wants to handle the touch - TouchEvent touch_event(e, this, touch_pressed_handler_); - status = touch_pressed_handler_->ProcessTouchEvent(touch_event); - - // The view could have removed itself from the tree when handling - // OnTouchEvent(). So handle as per OnMousePressed. NB: we - // assume that the RootView itself cannot be so removed. - if (!touch_pressed_handler_) - break; - - // The touch event wasn't processed. Go up the view hierarchy and dispatch - // the touch event. - if (status == ui::TOUCH_STATUS_UNKNOWN) - continue; - - // If the touch didn't initiate a touch-sequence, then reset the touch event - // handler. Otherwise, leave it set so that subsequent touch events are - // dispatched to the same handler. - if (status != ui::TOUCH_STATUS_START) - touch_pressed_handler_ = NULL; - - if (gesture_manager_->ProcessTouchEventForGesture(e, this, status)) - status = ui::TOUCH_STATUS_SYNTH_MOUSE; - return status; - } - - // Reset touch_pressed_handler_ to indicate that no processing is occurring. - touch_pressed_handler_ = NULL; - - // Give the touch event to the gesture manager. - if (gesture_manager_->ProcessTouchEventForGesture(e, this, status)) - status = ui::TOUCH_STATUS_SYNTH_MOUSE; - return status; -} - -void RootView::SetMouseHandler(View *new_mh) { - // If we're clearing the mouse handler, clear explicit_mouse_handler_ as well. - explicit_mouse_handler_ = (new_mh != NULL); - mouse_pressed_handler_ = new_mh; -} - -void RootView::GetAccessibleState(ui::AccessibleViewState* state) { - state->role = ui::AccessibilityTypes::ROLE_APPLICATION; -} - -//////////////////////////////////////////////////////////////////////////////// -// RootView, protected: - -void RootView::ViewHierarchyChanged(bool is_add, View* parent, View* child) { - widget_->ViewHierarchyChanged(is_add, parent, child); - - if (!is_add) { - if (!explicit_mouse_handler_ && mouse_pressed_handler_ == child) - mouse_pressed_handler_ = NULL; - if (mouse_move_handler_ == child) - mouse_move_handler_ = NULL; - if (touch_pressed_handler_ == child) - touch_pressed_handler_ = NULL; - } -} - -void RootView::OnPaint(gfx::Canvas* canvas) { - if (!layer() || !layer()->fills_bounds_opaquely()) - canvas->GetSkCanvas()->drawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); - - // TODO (pkotwicz): Remove this once we switch over to Aura desktop. - // This is needed so that we can set the background behind the RWHV when the - // RWHV is not visible. Not needed once there is a view between the RootView - // and RWHV. - View::OnPaint(canvas); -} - -void RootView::CalculateOffsetToAncestorWithLayer(gfx::Point* offset, - ui::Layer** layer_parent) { - View::CalculateOffsetToAncestorWithLayer(offset, layer_parent); - if (!layer()) - widget_->CalculateOffsetToAncestorWithLayer(offset, layer_parent); -} - -//////////////////////////////////////////////////////////////////////////////// -// RootView, private: - -// Input ----------------------------------------------------------------------- - -void RootView::UpdateCursor(const MouseEvent& event) { - if (!(event.flags() & ui::EF_IS_NON_CLIENT)) { - View* v = GetEventHandlerForPoint(event.location()); - widget_->SetCursor(v->GetCursor(MouseEvent(event, this, v))); - } -} - -void RootView::SetMouseLocationAndFlags(const MouseEvent& event) { - last_mouse_event_flags_ = event.flags(); - last_mouse_event_x_ = event.x(); - last_mouse_event_y_ = event.y(); -} - -} // namespace internal -} // namespace views diff --git a/ui/views/widget/root_view.h b/ui/views/widget/root_view.h deleted file mode 100644 index d5df829..0000000 --- a/ui/views/widget/root_view.h +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_ROOT_VIEW_H_ -#define UI_VIEWS_WIDGET_ROOT_VIEW_H_ -#pragma once - -#include <string> - -#include "base/memory/ref_counted.h" -#include "ui/views/focus/focus_manager.h" -#include "ui/views/focus/focus_search.h" -#include "views/view.h" - -namespace ui { -enum TouchStatus; -} - -namespace views { - -class Widget; -class GestureManager; - -// This is a views-internal API and should not be used externally. -// Widget exposes this object as a View*. -namespace internal { - -//////////////////////////////////////////////////////////////////////////////// -// RootView class -// -// The RootView is the root of a View hierarchy. A RootView is attached to a -// Widget. The Widget is responsible for receiving events from the host -// environment, converting them to views-compatible events and then forwarding -// them to the RootView for propagation into the View hierarchy. -// -// A RootView can have only one child, called its "Contents View" which is -// sized to fill the bounds of the RootView (and hence the client area of the -// Widget). Call SetContentsView() after the associated Widget has been -// initialized to attach the contents view to the RootView. -// TODO(beng): Enforce no other callers to AddChildView/tree functions by -// overriding those methods as private here. -// TODO(beng): Clean up API further, make Widget a friend. -// TODO(sky): We don't really want to export this class. -// -class VIEWS_EXPORT RootView : public View, public FocusTraversable { - public: - static const char kViewClassName[]; - - // Creation and lifetime ----------------------------------------------------- - explicit RootView(Widget* widget); - virtual ~RootView(); - - // Tree operations ----------------------------------------------------------- - - // Sets the "contents view" of the RootView. This is the single child view - // that is responsible for laying out the contents of the widget. - void SetContentsView(View* contents_view); - View* GetContentsView(); - - // Called when parent of the host changed. - void NotifyNativeViewHierarchyChanged(bool attached, - gfx::NativeView native_view); - - // Input --------------------------------------------------------------------- - - // Process a key event. Send the event to the focused view and up the focus - // path, and finally to the default keyboard handler, until someone consumes - // it. Returns whether anyone consumed the event. - bool OnKeyEvent(const KeyEvent& event); - - // Provided only for testing: - void SetGestureManagerForTesting(GestureManager* g) { gesture_manager_ = g; } - - // Focus --------------------------------------------------------------------- - - // Used to set the FocusTraversable parent after the view has been created - // (typically when the hierarchy changes and this RootView is added/removed). - virtual void SetFocusTraversableParent(FocusTraversable* focus_traversable); - - // Used to set the View parent after the view has been created. - virtual void SetFocusTraversableParentView(View* view); - - // System events ------------------------------------------------------------- - - // Public API for broadcasting theme change notifications to this View - // hierarchy. - void ThemeChanged(); - - // Public API for broadcasting locale change notifications to this View - // hierarchy. - void LocaleChanged(); - - // Overridden from FocusTraversable: - virtual FocusSearch* GetFocusSearch() OVERRIDE; - virtual FocusTraversable* GetFocusTraversableParent() OVERRIDE; - virtual View* GetFocusTraversableParentView() OVERRIDE; - - // Overridden from View: - virtual const Widget* GetWidget() const OVERRIDE; - virtual Widget* GetWidget() OVERRIDE; - virtual bool IsVisibleInRootView() const OVERRIDE; - virtual std::string GetClassName() const OVERRIDE; - virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE; - virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE; - virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE; - virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE; - virtual void OnMouseCaptureLost() OVERRIDE; - virtual void OnMouseMoved(const MouseEvent& event) OVERRIDE; - virtual void OnMouseExited(const MouseEvent& event) OVERRIDE; - virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE; - virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE; - virtual void SetMouseHandler(View* new_mouse_handler) OVERRIDE; - virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; - - protected: - // Overridden from View: - virtual void ViewHierarchyChanged(bool is_add, View* parent, - View* child) OVERRIDE; - virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; - virtual void CalculateOffsetToAncestorWithLayer( - gfx::Point* offset, - ui::Layer** layer_parent) OVERRIDE; - - private: - friend class View; - friend class Widget; - - // Required so the GestureManager can call the Process* entry points - // with synthetic events as necessary. - friend class GestureManager; - - // Input --------------------------------------------------------------------- - - // Update the cursor given a mouse event. This is called by non mouse_move - // event handlers to honor the cursor desired by views located under the - // cursor during drag operations. The location of the mouse should be in the - // current coordinate system (i.e. any necessary transformation should be - // applied to the point prior to calling this). - void UpdateCursor(const MouseEvent& event); - - // Updates the last_mouse_* fields from e. The location of the mouse should be - // in the current coordinate system (i.e. any necessary transformation should - // be applied to the point prior to calling this). - void SetMouseLocationAndFlags(const MouseEvent& event); - - ////////////////////////////////////////////////////////////////////////////// - - // Tree operations ----------------------------------------------------------- - - // The host Widget - Widget* widget_; - - // Input --------------------------------------------------------------------- - - // The view currently handing down - drag - up - View* mouse_pressed_handler_; - - // The view currently handling enter / exit - View* mouse_move_handler_; - - // The last view to handle a mouse click, so that we can determine if - // a double-click lands on the same view as its single-click part. - View* last_click_handler_; - - // true if mouse_pressed_handler_ has been explicitly set - bool explicit_mouse_handler_; - - // Last position/flag of a mouse press/drag. Used if capture stops and we need - // to synthesize a release. - int last_mouse_event_flags_; - int last_mouse_event_x_; - int last_mouse_event_y_; - - // The gesture_manager_ for this. - GestureManager* gesture_manager_; - - // The view currently handling touch events. - View* touch_pressed_handler_; - - // Focus --------------------------------------------------------------------- - - // The focus search algorithm. - FocusSearch focus_search_; - - // Whether this root view belongs to the current active window. - // bool activated_; - - // The parent FocusTraversable, used for focus traversal. - FocusTraversable* focus_traversable_parent_; - - // The View that contains this RootView. This is used when we have RootView - // wrapped inside native components, and is used for the focus traversal. - View* focus_traversable_parent_view_; - - // Drag and drop ------------------------------------------------------------- - - // Tracks drag state for a view. - View::DragInfo drag_info; - - DISALLOW_IMPLICIT_CONSTRUCTORS(RootView); -}; - -} // namespace internal -} // namespace views - -#endif // UI_VIEWS_WIDGET_ROOT_VIEW_H_ diff --git a/ui/views/widget/tooltip_manager.cc b/ui/views/widget/tooltip_manager.cc deleted file mode 100644 index 7f4d193..0000000 --- a/ui/views/widget/tooltip_manager.cc +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/tooltip_manager.h" - -#include <vector> - -#include "base/string_split.h" -#include "base/utf_string_conversions.h" -#include "ui/base/text/text_elider.h" - -namespace { - -// Maximum number of characters we allow in a tooltip. -const size_t kMaxTooltipLength = 1024; - -// Maximum number of lines we allow in the tooltip. -const size_t kMaxLines = 6; - -} // namespace - -namespace views { - -// static -void TooltipManager::TrimTooltipToFit(string16* text, - int* max_width, - int* line_count, - int x, - int y) { - *max_width = 0; - *line_count = 0; - - // Clamp the tooltip length to kMaxTooltipLength so that we don't - // accidentally DOS the user with a mega tooltip. - if (text->length() > kMaxTooltipLength) - *text = text->substr(0, kMaxTooltipLength); - - // Determine the available width for the tooltip. - int available_width = GetMaxWidth(x, y); - - // Split the string into at most kMaxLines lines. - std::vector<string16> lines; - base::SplitString(*text, '\n', &lines); - if (lines.size() > kMaxLines) - lines.resize(kMaxLines); - *line_count = static_cast<int>(lines.size()); - - // Format each line to fit. - gfx::Font font = GetDefaultFont(); - string16 result; - for (std::vector<string16>::iterator i = lines.begin(); i != lines.end(); - ++i) { - string16 elided_text = ui::ElideText(*i, font, available_width, false); - *max_width = std::max(*max_width, font.GetStringWidth(elided_text)); - if (!result.empty()) - result.push_back('\n'); - result.append(elided_text); - } - *text = result; -} - -} // namespace views diff --git a/ui/views/widget/tooltip_manager.h b/ui/views/widget/tooltip_manager.h deleted file mode 100644 index f7d1a8b..0000000 --- a/ui/views/widget/tooltip_manager.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_TOOLTIP_MANAGER_H_ -#define UI_VIEWS_WIDGET_TOOLTIP_MANAGER_H_ -#pragma once - -#include <string> - -#include "base/basictypes.h" -#include "base/string16.h" -#include "views/views_export.h" - -namespace gfx { -class Font; -} // namespace gfx - -namespace views { - -class View; - -// TooltipManager takes care of the wiring to support tooltips for Views. You -// almost never need to interact directly with TooltipManager, rather look to -// the various tooltip methods on View. -class VIEWS_EXPORT TooltipManager { - public: - // Returns the height of tooltips. This should only be invoked from within - // GetTooltipTextOrigin. - static int GetTooltipHeight(); - - // Returns the default font used by tooltips. - static gfx::Font GetDefaultFont(); - - // Returns the maximum width of the tooltip. |x| and |y| give the location - // the tooltip is to be displayed on in screen coordinates. - static int GetMaxWidth(int x, int y); - - TooltipManager() {} - virtual ~TooltipManager() {} - - // Notification that the view hierarchy has changed in some way. - virtual void UpdateTooltip() = 0; - - // Invoked when the tooltip text changes for the specified views. - virtual void TooltipTextChanged(View* view) = 0; - - // Invoked when toolbar icon gets focus. - virtual void ShowKeyboardTooltip(View* view) = 0; - - // Invoked when toolbar loses focus. - virtual void HideKeyboardTooltip() = 0; - - protected: - // Trims the tooltip to fit, setting |text| to the clipped result, - // |max_width| to the width (in pixels) of the clipped text and |line_count| - // to the number of lines of text in the tooltip. |x| and |y| give the - // location of the tooltip in screen coordinates. - static void TrimTooltipToFit(string16* text, - int* max_width, - int* line_count, - int x, - int y); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_TOOLTIP_MANAGER_H_ diff --git a/ui/views/widget/tooltip_manager_gtk.cc b/ui/views/widget/tooltip_manager_gtk.cc deleted file mode 100644 index b33e5ad..0000000 --- a/ui/views/widget/tooltip_manager_gtk.cc +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/tooltip_manager_gtk.h" - -#include "base/logging.h" -#include "base/utf_string_conversions.h" -#include "ui/gfx/font.h" -#include "ui/gfx/screen.h" -#include "ui/views/focus/focus_manager.h" -#include "ui/views/widget/native_widget_gtk.h" -#include "views/view.h" - -// WARNING: this implementation is good for a start, but it doesn't give us -// control of tooltip positioning both on mouse events and when showing from -// keyboard. We may need to write our own to give us the control we need. - -namespace views { - -static gfx::Font* LoadDefaultFont() { - // Create a tooltip widget and extract the font from it (we have to realize - // it to make sure the correct font gets set). - GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP); - gtk_widget_set_name(window, "gtk-tooltip"); - GtkWidget* label = gtk_label_new(""); - gtk_widget_show(label); - - gtk_container_add(GTK_CONTAINER(window), label); - gtk_widget_realize(window); - - GtkStyle* style = gtk_widget_get_style(label); - gfx::Font* font = new gfx::Font(style->font_desc); - - gtk_widget_destroy(window); - - return font; -} - -// static -int TooltipManager::GetTooltipHeight() { - // This is only used to position the tooltip, and we don't yet support - // positioning the tooltip, it isn't worth trying to implement this. - return 0; -} - -// static -gfx::Font TooltipManager::GetDefaultFont() { - static gfx::Font* font = NULL; - if (!font) - font = LoadDefaultFont(); - - return *font; -} - -// static -int TooltipManager::GetMaxWidth(int x, int y) { - gfx::Rect monitor_bounds = - gfx::Screen::GetMonitorAreaNearestPoint(gfx::Point(x, y)); - // GtkLabel (gtk_label_ensure_layout) forces wrapping at this size. We mirror - // the size here otherwise tooltips wider than the size used by gtklabel end - // up with extraneous empty lines. - return monitor_bounds.width() == 0 ? 800 : (monitor_bounds.width() + 1) / 2; -} - -TooltipManagerGtk::TooltipManagerGtk(NativeWidgetGtk* widget) - : widget_(widget), - keyboard_view_(NULL), - tooltip_window_(widget->window_contents()) { -} - -bool TooltipManagerGtk::ShowTooltip(int x, int y, bool for_keyboard, - GtkTooltip* tooltip) { - const View* view = NULL; - gfx::Point view_loc; - if (keyboard_view_) { - view = keyboard_view_; - view_loc.SetPoint(view->width() / 2, view->height() / 2); - } else if (!for_keyboard) { - View* root_view = widget_->GetWidget()->GetRootView(); - view = root_view->GetEventHandlerForPoint(gfx::Point(x, y)); - view_loc.SetPoint(x, y); - View::ConvertPointFromWidget(view, &view_loc); - } else { - const FocusManager* focus_manager = widget_->GetWidget()->GetFocusManager(); - if (focus_manager) { - view = focus_manager->GetFocusedView(); - if (view) - view_loc.SetPoint(view->width() / 2, view->height() / 2); - } - } - - if (!view) - return false; - - string16 text; - if (!view->GetTooltipText(view_loc, &text)) - return false; - - // Sets the area of the tooltip. This way if different views in the same - // widget have tooltips the tooltip doesn't get stuck at the same location. - gfx::Rect vis_bounds = view->GetVisibleBounds(); - gfx::Point widget_loc(vis_bounds.origin()); - View::ConvertPointToWidget(view, &widget_loc); - GdkRectangle tip_area = { widget_loc.x(), widget_loc.y(), - vis_bounds.width(), vis_bounds.height() }; - gtk_tooltip_set_tip_area(tooltip, &tip_area); - - int max_width, line_count; - gfx::Point screen_loc(x, y); - View::ConvertPointToScreen(widget_->GetWidget()->GetRootView(), &screen_loc); - TrimTooltipToFit(&text, &max_width, &line_count, screen_loc.x(), - screen_loc.y()); - tooltip_window_.SetTooltipText(text); - - return true; -} - -void TooltipManagerGtk::UpdateTooltip() { - // UpdateTooltip may be invoked after the widget has been destroyed. - GtkWidget* widget = widget_->GetNativeView(); - if (!widget) - return; - - GdkDisplay* display = gtk_widget_get_display(widget); - if (display) - gtk_tooltip_trigger_tooltip_query(display); -} - -void TooltipManagerGtk::TooltipTextChanged(View* view) { - UpdateTooltip(); -} - -void TooltipManagerGtk::ShowKeyboardTooltip(View* view) { - if (view == keyboard_view_) - return; // We're already showing the tip for the specified view. - - // We have to hide the current tooltip, then show again. - HideKeyboardTooltip(); - - string16 tooltip_text; - if (!view->GetTooltipText(gfx::Point(), &tooltip_text)) - return; // The view doesn't have a tooltip, nothing to do. - - keyboard_view_ = view; - if (!SendShowHelpSignal()) { - keyboard_view_ = NULL; - return; - } -} - -void TooltipManagerGtk::HideKeyboardTooltip() { - if (!keyboard_view_) - return; - - SendShowHelpSignal(); - keyboard_view_ = NULL; -} - -bool TooltipManagerGtk::SendShowHelpSignal() { - GtkWidget* widget = widget_->window_contents(); - GType itype = G_TYPE_FROM_INSTANCE(G_OBJECT(widget)); - guint signal_id; - GQuark detail; - if (!g_signal_parse_name("show_help", itype, &signal_id, &detail, FALSE)) { - NOTREACHED(); - return false; - } - gboolean result; - g_signal_emit(widget, signal_id, 0, GTK_WIDGET_HELP_TOOLTIP, &result); - return true; -} - -} // namespace views diff --git a/ui/views/widget/tooltip_manager_gtk.h b/ui/views/widget/tooltip_manager_gtk.h deleted file mode 100644 index 7f1aee7..0000000 --- a/ui/views/widget/tooltip_manager_gtk.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_TOOLTIP_MANAGER_GTK_H_ -#define UI_VIEWS_WIDGET_TOOLTIP_MANAGER_GTK_H_ -#pragma once - -#include <gtk/gtk.h> - -#include "ui/base/gtk/tooltip_window_gtk.h" -#include "ui/views/widget/tooltip_manager.h" - -namespace views { - -class NativeWidgetGtk; - -// TooltipManager implementation for Gtk. -class TooltipManagerGtk : public TooltipManager { - public: - explicit TooltipManagerGtk(NativeWidgetGtk* widget); - virtual ~TooltipManagerGtk() {} - - // Shows the tooltip at the specified location. Returns true if the tooltip - // should be shown, false otherwise. - bool ShowTooltip(int x, int y, bool for_keyboard, GtkTooltip* gtk_tooltip); - - // TooltipManager. - virtual void UpdateTooltip(); - virtual void TooltipTextChanged(View* view); - virtual void ShowKeyboardTooltip(View* view); - virtual void HideKeyboardTooltip(); - - private: - // Sends the show_help signal to widget_. This signal triggers showing the - // keyboard tooltip if it isn't showing, or hides it if it is showing. - bool SendShowHelpSignal(); - - // Our owner. - NativeWidgetGtk* widget_; - - // The view supplied to the last invocation of ShowKeyboardTooltip. - View* keyboard_view_; - - // Customized tooltip window. - ui::TooltipWindowGtk tooltip_window_; - - DISALLOW_COPY_AND_ASSIGN(TooltipManagerGtk); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_TOOLTIP_MANAGER_GTK_H_ diff --git a/ui/views/widget/tooltip_manager_views.cc b/ui/views/widget/tooltip_manager_views.cc deleted file mode 100644 index fa3cb63..0000000 --- a/ui/views/widget/tooltip_manager_views.cc +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/tooltip_manager_views.h" - -#if defined(USE_X11) -#include <X11/Xlib.h> -#include <X11/extensions/XInput2.h> -#endif - -#if defined(OS_WIN) -#include <windowsx.h> -#endif - -#include "base/event_types.h" -#include "base/logging.h" -#include "base/time.h" -#include "base/utf_string_conversions.h" -#include "third_party/skia/include/core/SkColor.h" -#if defined(USE_AURA) -#include "ui/aura/client/aura_constants.h" -#include "ui/aura/event.h" -#include "ui/aura/window.h" -#endif -#include "ui/base/resource/resource_bundle.h" -#include "ui/gfx/font.h" -#include "ui/gfx/screen.h" -#include "ui/views/events/event.h" -#include "ui/views/focus/focus_manager.h" -#include "ui/views/widget/native_widget.h" -#include "views/background.h" -#include "views/border.h" -#include "views/view.h" - -namespace { -SkColor kTooltipBackground = 0xFF7F7F00; -int kTooltipTimeoutMs = 500; - -// FIXME: get cursor offset from actual cursor size. -int kCursorOffsetX = 10; -int kCursorOffsetY = 15; -} - -namespace views { - -// static -int TooltipManager::GetTooltipHeight() { - // Not used for linux and chromeos. - NOTREACHED(); - return 0; -} - -// static -gfx::Font TooltipManager::GetDefaultFont() { - return ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont); -} - -// static -int TooltipManager::GetMaxWidth(int x, int y) { - // FIXME: change this. This is for now just copied from TooltipManagerGtk. - - // We always display the tooltip inside the root view. So the max width is - // the width of the view. - gfx::Rect monitor_bounds = - gfx::Screen::GetMonitorAreaNearestPoint(gfx::Point(x, y)); - // GtkLabel (gtk_label_ensure_layout) forces wrapping at this size. We mirror - // the size here otherwise tooltips wider than the size used by gtklabel end - // up with extraneous empty lines. - return monitor_bounds.width() == 0 ? 800 : (monitor_bounds.width() + 1) / 2; -} - -TooltipManagerViews::TooltipManagerViews(views::View* root_view) - : root_view_(root_view), - tooltip_view_(NULL) { - tooltip_label_.set_background( - views::Background::CreateSolidBackground(kTooltipBackground)); - tooltip_widget_.reset(CreateTooltip()); - tooltip_widget_->SetContentsView(&tooltip_label_); - tooltip_widget_->Activate(); - tooltip_widget_->SetAlwaysOnTop(true); -} - -TooltipManagerViews::~TooltipManagerViews() { - tooltip_widget_->CloseNow(); -} - -void TooltipManagerViews::UpdateForMouseEvent(const MouseEvent& event) { - switch (event.type()) { - case ui::ET_MOUSE_EXITED: - // Mouse is exiting this widget. Stop showing the tooltip and the timer. - if (tooltip_timer_.IsRunning()) - tooltip_timer_.Stop(); - if (tooltip_widget_->IsVisible()) - tooltip_widget_->Hide(); - break; - case ui::ET_MOUSE_ENTERED: - // Mouse just entered this widget. Start the timer to show the tooltip. - if (tooltip_timer_.IsRunning()) - tooltip_timer_.Stop(); - tooltip_timer_.Start(FROM_HERE, - base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs), - this, &TooltipManagerViews::TooltipTimerFired); - break; - case ui::ET_MOUSE_MOVED: - OnMouseMoved(event.location().x(), event.location().y()); - break; - case ui::ET_MOUSE_PRESSED: - case ui::ET_MOUSE_RELEASED: - case ui::ET_MOUSE_DRAGGED: - case ui::ET_MOUSEWHEEL: - // Hide the tooltip for click, release, drag, wheel events. - if (tooltip_widget_->IsVisible()) - tooltip_widget_->Hide(); - break; - default: - NOTIMPLEMENTED(); - } -} - -void TooltipManagerViews::UpdateTooltip() { - UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); -} - -void TooltipManagerViews::TooltipTextChanged(View* view) { - if (tooltip_widget_->IsVisible()) - UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); -} - -void TooltipManagerViews::ShowKeyboardTooltip(View* view) { - NOTREACHED(); -} - -void TooltipManagerViews::HideKeyboardTooltip() { - NOTREACHED(); -} - -void TooltipManagerViews::TooltipTimerFired() { - UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); -} - -View* TooltipManagerViews::GetViewForTooltip(int x, int y, bool for_keyboard) { - View* view = NULL; - if (!for_keyboard) { - // Convert x,y from screen coordinates to |root_view_| coordinates. - gfx::Point point(x, y); - View::ConvertPointFromWidget(root_view_, &point); - view = root_view_->GetEventHandlerForPoint(point); - } else { - FocusManager* focus_manager = root_view_->GetFocusManager(); - if (focus_manager) - view = focus_manager->GetFocusedView(); - } - return view; -} - -void TooltipManagerViews::UpdateIfRequired(int x, int y, bool for_keyboard) { - View* view = GetViewForTooltip(x, y, for_keyboard); - string16 tooltip_text; - if (view) - view->GetTooltipText(gfx::Point(x, y), &tooltip_text); - -#if defined(USE_AURA) - // In aura, and aura::Window can also have a tooltip. If the view doesnot have - // a tooltip, we must also check for the aura::Window underneath the cursor. - if (tooltip_text.empty()) { - aura::Window* root = reinterpret_cast<aura::Window*>( - root_view_->GetWidget()->GetNativeView()); - if (root) { - aura::Window* window = root->GetEventHandlerForPoint(gfx::Point(x, y)); - if (window) { - void* property = window->GetProperty(aura::kTooltipTextKey); - if (property) - tooltip_text = *reinterpret_cast<string16*>(property); - } - } - } -#endif - - if (tooltip_view_ != view || tooltip_text_ != tooltip_text) { - tooltip_view_ = view; - tooltip_text_ = tooltip_text; - Update(); - } -} - -void TooltipManagerViews::Update() { - if (tooltip_text_.empty()) { - tooltip_widget_->Hide(); - } else { - int max_width, line_count; - string16 tooltip_text(tooltip_text_); - TrimTooltipToFit(&tooltip_text, &max_width, &line_count, - curr_mouse_pos_.x(), curr_mouse_pos_.y()); - tooltip_label_.SetText(tooltip_text); - - SetTooltipBounds(curr_mouse_pos_, max_width, - tooltip_label_.GetPreferredSize().height()); - tooltip_widget_->Show(); - } -} - -void TooltipManagerViews::SetTooltipBounds(gfx::Point mouse_pos, - int tooltip_width, - int tooltip_height) { - gfx::Rect tooltip_rect(mouse_pos.x(), mouse_pos.y(), tooltip_width, - tooltip_height); - - tooltip_rect.Offset(kCursorOffsetX, kCursorOffsetY); - gfx::Rect monitor_bounds = - gfx::Screen::GetMonitorAreaNearestPoint(tooltip_rect.origin()); - tooltip_widget_->SetBounds(tooltip_rect.AdjustToFit(monitor_bounds)); -} - -Widget* TooltipManagerViews::CreateTooltip() { - Widget* widget = new Widget; - Widget::InitParams params; - // For aura, since we set the type to TOOLTIP_TYPE, the widget will get - // auto-parented to the MenuAndTooltipsContainer. - params.type = Widget::InitParams::TYPE_TOOLTIP; - params.keep_on_top = true; - params.accept_events = false; - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - widget->Init(params); - widget->SetOpacity(0xFF); - return widget; -} - -void TooltipManagerViews::OnMouseMoved(int x, int y) { - if (tooltip_timer_.IsRunning()) - tooltip_timer_.Reset(); - curr_mouse_pos_.SetPoint(x, y); - - // If tooltip is visible, we may want to hide it. If it is not, we are ok. - if (tooltip_widget_->IsVisible()) - UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); -} - -} // namespace views diff --git a/ui/views/widget/tooltip_manager_views.h b/ui/views/widget/tooltip_manager_views.h deleted file mode 100644 index 29d7048..0000000 --- a/ui/views/widget/tooltip_manager_views.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_TOOLTIP_MANAGER_VIEWS_H_ -#define UI_VIEWS_WIDGET_TOOLTIP_MANAGER_VIEWS_H_ -#pragma once - -#include "base/message_loop.h" -#include "base/timer.h" -#include "ui/views/widget/native_widget.h" -#include "ui/views/widget/tooltip_manager.h" -#include "ui/views/widget/widget_delegate.h" -#include "views/controls/label.h" -#include "views/view.h" - -#if defined(USE_X11) -typedef union _XEvent XEvent; -#endif - -namespace views { - -class MouseEvent; -class Widget; - -// TooltipManager implementation for Views. -class TooltipManagerViews : public TooltipManager { - public: - explicit TooltipManagerViews(views::View* root_view); - virtual ~TooltipManagerViews(); - - // Updates the state of the tooltip based on the mouse event. The mouse event - // is the same event that goes to a Widget (i.e. it is in the Widget's - // coordinate system). - void UpdateForMouseEvent(const MouseEvent& event); - - // TooltipManager. - virtual void UpdateTooltip() OVERRIDE; - virtual void TooltipTextChanged(View* view) OVERRIDE; - virtual void ShowKeyboardTooltip(View* view) OVERRIDE; - virtual void HideKeyboardTooltip() OVERRIDE; - - private: - void TooltipTimerFired(); - View* GetViewForTooltip(int x, int y, bool for_keyboard); - - // Updates the tooltip if required (if there is any change in the tooltip - // text or the view. - void UpdateIfRequired(int x, int y, bool for_keyboard); - - // Updates the tooltip. Gets the tooltip text from tooltip_view_ and displays - // it at the current mouse position. - void Update(); - - // Adjusts the bounds given by the arguments to fit inside the parent view - // and applies the adjusted bounds to the tooltip_label_. - void SetTooltipBounds(gfx::Point mouse_pos, int tooltip_width, - int tooltip_height); - - // Creates a widget of type TYPE_TOOLTIP - Widget* CreateTooltip(); - - // Invoked when the mose moves. - void OnMouseMoved(int x, int y); - - scoped_ptr<Widget> tooltip_widget_; - views::View* root_view_; - View* tooltip_view_; - string16 tooltip_text_; - Label tooltip_label_; - - gfx::Point curr_mouse_pos_; - base::RepeatingTimer<TooltipManagerViews> tooltip_timer_; - - DISALLOW_COPY_AND_ASSIGN(TooltipManagerViews); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_TOOLTIP_MANAGER_VIEWS_H_ diff --git a/ui/views/widget/tooltip_manager_win.cc b/ui/views/widget/tooltip_manager_win.cc deleted file mode 100644 index fedb700..0000000 --- a/ui/views/widget/tooltip_manager_win.cc +++ /dev/null @@ -1,391 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/tooltip_manager_win.h" - -#include <windowsx.h> - -#include <limits> - -#include "base/bind.h" -#include "base/i18n/rtl.h" -#include "base/logging.h" -#include "base/message_loop.h" -#include "base/string_util.h" -#include "ui/base/l10n/l10n_util_win.h" -#include "ui/base/win/hwnd_util.h" -#include "ui/gfx/font.h" -#include "ui/gfx/screen.h" -#include "ui/views/widget/monitor_win.h" -#include "ui/views/widget/widget.h" -#include "views/view.h" - -namespace views { - -static int tooltip_height_ = 0; - -// Default timeout for the tooltip displayed using keyboard. -// Timeout is mentioned in milliseconds. -static const int kDefaultTimeout = 4000; - -// static -int TooltipManager::GetTooltipHeight() { - DCHECK_GT(tooltip_height_, 0); - return tooltip_height_; -} - -static gfx::Font DetermineDefaultFont() { - HWND window = CreateWindowEx( - WS_EX_TRANSPARENT | l10n_util::GetExtendedTooltipStyles(), - TOOLTIPS_CLASS, NULL, 0 , 0, 0, 0, 0, NULL, NULL, NULL, NULL); - if (!window) - return gfx::Font(); - HFONT hfont = reinterpret_cast<HFONT>(SendMessage(window, WM_GETFONT, 0, 0)); - gfx::Font font = hfont ? gfx::Font(hfont) : gfx::Font(); - DestroyWindow(window); - return font; -} - -// static -gfx::Font TooltipManager::GetDefaultFont() { - static gfx::Font* font = NULL; - if (!font) - font = new gfx::Font(DetermineDefaultFont()); - return *font; -} - -// static -int TooltipManager::GetMaxWidth(int x, int y) { - gfx::Rect monitor_bounds = - gfx::Screen::GetMonitorAreaNearestPoint(gfx::Point(x, y)); - // Allow the tooltip to be almost as wide as the screen. - // Otherwise, we would truncate important text, since we're not word-wrapping - // the text onto multiple lines. - return monitor_bounds.width() == 0 ? 800 : monitor_bounds.width() - 30; -} - -TooltipManagerWin::TooltipManagerWin(Widget* widget) - : widget_(widget), - tooltip_hwnd_(NULL), - last_mouse_pos_(-1, -1), - tooltip_showing_(false), - last_tooltip_view_(NULL), - last_view_out_of_sync_(false), - tooltip_width_(0), - keyboard_tooltip_hwnd_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST(keyboard_tooltip_factory_(this)) { - DCHECK(widget); - DCHECK(widget->GetNativeView()); -} - -TooltipManagerWin::~TooltipManagerWin() { - if (tooltip_hwnd_) - DestroyWindow(tooltip_hwnd_); - if (keyboard_tooltip_hwnd_) - DestroyWindow(keyboard_tooltip_hwnd_); -} - -bool TooltipManagerWin::Init() { - DCHECK(!tooltip_hwnd_); - // Create the tooltip control. - tooltip_hwnd_ = CreateWindowEx( - WS_EX_TRANSPARENT | l10n_util::GetExtendedTooltipStyles(), - TOOLTIPS_CLASS, NULL, TTS_NOPREFIX, 0, 0, 0, 0, - GetParent(), NULL, NULL, NULL); - if (!tooltip_hwnd_) - return false; - - l10n_util::AdjustUIFontForWindow(tooltip_hwnd_); - - // This effectively turns off clipping of tooltips. We need this otherwise - // multi-line text (\r\n) won't work right. The size doesn't really matter - // (just as long as its bigger than the monitor's width) as we clip to the - // screen size before rendering. - SendMessage(tooltip_hwnd_, TTM_SETMAXTIPWIDTH, 0, - std::numeric_limits<int16>::max()); - - // Add one tool that is used for all tooltips. - toolinfo_.cbSize = sizeof(toolinfo_); - toolinfo_.uFlags = TTF_TRANSPARENT | TTF_IDISHWND; - toolinfo_.hwnd = GetParent(); - toolinfo_.uId = reinterpret_cast<UINT_PTR>(GetParent()); - // Setting this tells windows to call GetParent() back (using a WM_NOTIFY - // message) for the actual tooltip contents. - toolinfo_.lpszText = LPSTR_TEXTCALLBACK; - toolinfo_.lpReserved = NULL; - SetRectEmpty(&toolinfo_.rect); - SendMessage(tooltip_hwnd_, TTM_ADDTOOL, 0, (LPARAM)&toolinfo_); - return true; -} - -gfx::NativeView TooltipManagerWin::GetParent() { - return widget_->GetNativeView(); -} - -void TooltipManagerWin::UpdateTooltip() { - // Set last_view_out_of_sync_ to indicate the view is currently out of sync. - // This doesn't update the view under the mouse immediately as it may cause - // timing problems. - last_view_out_of_sync_ = true; - last_tooltip_view_ = NULL; - // Hide the tooltip. - SendMessage(tooltip_hwnd_, TTM_POP, 0, 0); -} - -void TooltipManagerWin::TooltipTextChanged(View* view) { - if (view == last_tooltip_view_) - UpdateTooltip(last_mouse_pos_); -} - -LRESULT TooltipManagerWin::OnNotify(int w_param, - NMHDR* l_param, - bool* handled) { - *handled = false; - if (l_param->hwndFrom == tooltip_hwnd_ && keyboard_tooltip_hwnd_ == NULL) { - switch (l_param->code) { - case TTN_GETDISPINFO: { - if (last_view_out_of_sync_) { - // View under the mouse is out of sync, determine it now. - View* root_view = widget_->GetRootView(); - last_tooltip_view_ = - root_view->GetEventHandlerForPoint(last_mouse_pos_); - last_view_out_of_sync_ = false; - } - // Tooltip control is asking for the tooltip to display. - NMTTDISPINFOW* tooltip_info = - reinterpret_cast<NMTTDISPINFOW*>(l_param); - // Initialize the string, if we have a valid tooltip the string will - // get reset below. - tooltip_info->szText[0] = TEXT('\0'); - tooltip_text_.clear(); - tooltip_info->lpszText = NULL; - clipped_text_.clear(); - if (last_tooltip_view_ != NULL) { - tooltip_text_.clear(); - // Mouse is over a View, ask the View for its tooltip. - gfx::Point view_loc = last_mouse_pos_; - View::ConvertPointToView(widget_->GetRootView(), - last_tooltip_view_, &view_loc); - if (last_tooltip_view_->GetTooltipText(view_loc, &tooltip_text_) && - !tooltip_text_.empty()) { - // View has a valid tip, copy it into TOOLTIPINFO. - clipped_text_ = tooltip_text_; - gfx::Point screen_loc = last_mouse_pos_; - View::ConvertPointToScreen(widget_->GetRootView(), &screen_loc); - TrimTooltipToFit(&clipped_text_, &tooltip_width_, &line_count_, - screen_loc.x(), screen_loc.y()); - // Adjust the clipped tooltip text for locale direction. - base::i18n::AdjustStringForLocaleDirection(&clipped_text_); - tooltip_info->lpszText = const_cast<WCHAR*>(clipped_text_.c_str()); - } else { - tooltip_text_.clear(); - } - } - *handled = true; - return 0; - } - case TTN_POP: - tooltip_showing_ = false; - *handled = true; - return 0; - case TTN_SHOW: { - *handled = true; - tooltip_showing_ = true; - // The tooltip is about to show, allow the view to position it - gfx::Point text_origin; - if (tooltip_height_ == 0) - tooltip_height_ = CalcTooltipHeight(); - gfx::Point view_loc = last_mouse_pos_; - View::ConvertPointToView(widget_->GetRootView(), - last_tooltip_view_, &view_loc); - if (last_tooltip_view_->GetTooltipTextOrigin(view_loc, &text_origin) && - SetTooltipPosition(text_origin.x(), text_origin.y())) { - // Return true, otherwise the rectangle we specified is ignored. - return TRUE; - } - return 0; - } - default: - // Fall through. - break; - } - } - return 0; -} - -bool TooltipManagerWin::SetTooltipPosition(int text_x, int text_y) { - // NOTE: this really only tests that the y location fits on screen, but that - // is good enough for our usage. - - // Calculate the bounds the tooltip will get. - gfx::Point view_loc; - View::ConvertPointToScreen(last_tooltip_view_, &view_loc); - RECT bounds = { view_loc.x() + text_x, - view_loc.y() + text_y, - view_loc.x() + text_x + tooltip_width_, - view_loc.y() + line_count_ * GetTooltipHeight() }; - SendMessage(tooltip_hwnd_, TTM_ADJUSTRECT, TRUE, (LPARAM)&bounds); - - // Make sure the rectangle completely fits on the current monitor. If it - // doesn't, return false so that windows positions the tooltip at the - // default location. - gfx::Rect monitor_bounds = - views::GetMonitorBoundsForRect(gfx::Rect(bounds.left, bounds.right, - 0, 0)); - if (!monitor_bounds.Contains(gfx::Rect(bounds))) { - return false; - } - - ::SetWindowPos(tooltip_hwnd_, NULL, bounds.left, bounds.top, 0, 0, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); - return true; -} - -int TooltipManagerWin::CalcTooltipHeight() { - // Ask the tooltip for it's font. - int height; - HFONT hfont = reinterpret_cast<HFONT>( - SendMessage(tooltip_hwnd_, WM_GETFONT, 0, 0)); - if (hfont != NULL) { - HDC dc = GetDC(tooltip_hwnd_); - HFONT previous_font = static_cast<HFONT>(SelectObject(dc, hfont)); - int last_map_mode = SetMapMode(dc, MM_TEXT); - TEXTMETRIC font_metrics; - GetTextMetrics(dc, &font_metrics); - height = font_metrics.tmHeight; - // To avoid the DC referencing font_handle_, select the previous font. - SelectObject(dc, previous_font); - SetMapMode(dc, last_map_mode); - ReleaseDC(NULL, dc); - } else { - // Tooltip is using the system font. Use gfx::Font, which should pick - // up the system font. - height = gfx::Font().GetHeight(); - } - // Get the margins from the tooltip - RECT tooltip_margin; - SendMessage(tooltip_hwnd_, TTM_GETMARGIN, 0, (LPARAM)&tooltip_margin); - return height + tooltip_margin.top + tooltip_margin.bottom; -} - -void TooltipManagerWin::UpdateTooltip(const gfx::Point& mouse_pos) { - View* root_view = widget_->GetRootView(); - View* view = root_view->GetEventHandlerForPoint(mouse_pos); - if (view != last_tooltip_view_) { - // NOTE: This *must* be sent regardless of the visibility of the tooltip. - // It triggers Windows to ask for the tooltip again. - SendMessage(tooltip_hwnd_, TTM_POP, 0, 0); - last_tooltip_view_ = view; - } else if (last_tooltip_view_ != NULL) { - // Tooltip is showing, and mouse is over the same view. See if the tooltip - // text has changed. - gfx::Point view_point = mouse_pos; - View::ConvertPointToView(root_view, last_tooltip_view_, &view_point); - string16 new_tooltip_text; - bool has_tooltip_text = - last_tooltip_view_->GetTooltipText(view_point, &new_tooltip_text); - if (!has_tooltip_text || (new_tooltip_text != tooltip_text_)) { - // The text has changed, hide the popup. - SendMessage(tooltip_hwnd_, TTM_POP, 0, 0); - if (has_tooltip_text && !new_tooltip_text.empty() && tooltip_showing_) { - // New text is valid, show the popup. - SendMessage(tooltip_hwnd_, TTM_POPUP, 0, 0); - } - } - } -} - -void TooltipManagerWin::OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param) { - gfx::Point mouse_pos(l_param); - - if (u_msg >= WM_NCMOUSEMOVE && u_msg <= WM_NCXBUTTONDBLCLK) { - // NC message coordinates are in screen coordinates. - POINT temp = mouse_pos.ToPOINT(); - ::MapWindowPoints(HWND_DESKTOP, GetParent(), &temp, 1); - mouse_pos.SetPoint(temp.x, temp.y); - } - - if (u_msg != WM_MOUSEMOVE || last_mouse_pos_ != mouse_pos) { - last_mouse_pos_ = mouse_pos; - HideKeyboardTooltip(); - UpdateTooltip(mouse_pos); - } - // Forward the message onto the tooltip. - MSG msg; - msg.hwnd = GetParent(); - msg.message = u_msg; - msg.wParam = w_param; - msg.lParam = l_param; - SendMessage(tooltip_hwnd_, TTM_RELAYEVENT, 0, (LPARAM)&msg); -} - -void TooltipManagerWin::ShowKeyboardTooltip(View* focused_view) { - if (tooltip_showing_) { - SendMessage(tooltip_hwnd_, TTM_POP, 0, 0); - tooltip_text_.clear(); - } - HideKeyboardTooltip(); - string16 tooltip_text; - if (!focused_view->GetTooltipText(gfx::Point(), &tooltip_text)) - return; - gfx::Rect focused_bounds = focused_view->bounds(); - gfx::Point screen_point; - focused_view->ConvertPointToScreen(focused_view, &screen_point); - keyboard_tooltip_hwnd_ = CreateWindowEx( - WS_EX_TRANSPARENT | l10n_util::GetExtendedTooltipStyles(), - TOOLTIPS_CLASS, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL); - if (!keyboard_tooltip_hwnd_) - return; - - SendMessage(keyboard_tooltip_hwnd_, TTM_SETMAXTIPWIDTH, 0, - std::numeric_limits<int16>::max()); - int tooltip_width; - int line_count; - TrimTooltipToFit(&tooltip_text, &tooltip_width, &line_count, - screen_point.x(), screen_point.y()); - ReplaceSubstringsAfterOffset(&tooltip_text, 0, L"\n", L"\r\n"); - TOOLINFO keyboard_toolinfo; - memset(&keyboard_toolinfo, 0, sizeof(keyboard_toolinfo)); - keyboard_toolinfo.cbSize = sizeof(keyboard_toolinfo); - keyboard_toolinfo.hwnd = GetParent(); - keyboard_toolinfo.uFlags = TTF_TRACK | TTF_TRANSPARENT | TTF_IDISHWND; - keyboard_toolinfo.lpszText = const_cast<WCHAR*>(tooltip_text.c_str()); - SendMessage(keyboard_tooltip_hwnd_, TTM_ADDTOOL, 0, - reinterpret_cast<LPARAM>(&keyboard_toolinfo)); - SendMessage(keyboard_tooltip_hwnd_, TTM_TRACKACTIVATE, TRUE, - reinterpret_cast<LPARAM>(&keyboard_toolinfo)); - if (!tooltip_height_) - tooltip_height_ = CalcTooltipHeight(); - RECT rect_bounds = {screen_point.x(), - screen_point.y() + focused_bounds.height(), - screen_point.x() + tooltip_width, - screen_point.y() + focused_bounds.height() + - line_count * tooltip_height_ }; - gfx::Rect monitor_bounds = - views::GetMonitorBoundsForRect(gfx::Rect(rect_bounds)); - rect_bounds = gfx::Rect(rect_bounds).AdjustToFit(monitor_bounds).ToRECT(); - ::SetWindowPos(keyboard_tooltip_hwnd_, NULL, rect_bounds.left, - rect_bounds.top, 0, 0, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); - MessageLoop::current()->PostDelayedTask( - FROM_HERE, - base::Bind(&TooltipManagerWin::DestroyKeyboardTooltipWindow, - keyboard_tooltip_factory_.GetWeakPtr(), - keyboard_tooltip_hwnd_), - kDefaultTimeout); -} - -void TooltipManagerWin::HideKeyboardTooltip() { - if (keyboard_tooltip_hwnd_ != NULL) { - SendMessage(keyboard_tooltip_hwnd_, WM_CLOSE, 0, 0); - keyboard_tooltip_hwnd_ = NULL; - } -} - -void TooltipManagerWin::DestroyKeyboardTooltipWindow(HWND window_to_destroy) { - if (keyboard_tooltip_hwnd_ == window_to_destroy) - HideKeyboardTooltip(); -} - -} // namespace views diff --git a/ui/views/widget/tooltip_manager_win.h b/ui/views/widget/tooltip_manager_win.h deleted file mode 100644 index 9bbd68b..0000000 --- a/ui/views/widget/tooltip_manager_win.h +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_ -#define UI_VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_ -#pragma once - -#include <windows.h> -#include <commctrl.h> -#include <string> - -#include "base/basictypes.h" -#include "base/memory/weak_ptr.h" -#include "base/string16.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/point.h" -#include "ui/views/widget/tooltip_manager.h" - -namespace gfx { -class Point; -} - -namespace views { - -class View; -class Widget; - -// TooltipManager implementation for Windows. -// -// This class is intended to be used by NativeWidgetWin. To use this, you must -// do the following: -// Add the following to your MSG_MAP: -// -// MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) -// MESSAGE_RANGE_HANDLER(WM_NCMOUSEMOVE, WM_NCMOUSEMOVE, OnMouseRange) -// MSG_WM_NOTIFY(OnNotify) -// -// With the following implementations: -// LRESULT XXX::OnMouseRange(UINT u_msg, WPARAM w_param, LPARAM l_param, -// BOOL& handled) { -// tooltip_manager_->OnMouse(u_msg, w_param, l_param); -// handled = FALSE; -// return 0; -// } -// -// LRESULT XXX::OnNotify(int w_param, NMHDR* l_param) { -// bool handled; -// LRESULT result = tooltip_manager_->OnNotify(w_param, l_param, &handled); -// SetMsgHandled(handled); -// return result; -// } -// -// And of course you'll need to create the TooltipManager! -// -// Lastly, you'll need to override GetTooltipManager. -// -// See NativeWidgetWin for an example of this in action. -class TooltipManagerWin : public TooltipManager { - public: - // Creates a TooltipManager for the specified Widget and parent window. - explicit TooltipManagerWin(Widget* widget); - virtual ~TooltipManagerWin(); - - // Initializes the TooltipManager returning whether initialization was - // successful. If this returns false the TooltipManager should be destroyed - // and not used. - bool Init(); - - // Notification that the view hierarchy has changed in some way. - virtual void UpdateTooltip(); - - // Invoked when the tooltip text changes for the specified views. - virtual void TooltipTextChanged(View* view); - - // Invoked when toolbar icon gets focus. - virtual void ShowKeyboardTooltip(View* view); - - // Invoked when toolbar loses focus. - virtual void HideKeyboardTooltip(); - - // Message handlers. These forward to the tooltip control. - virtual void OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param); - LRESULT OnNotify(int w_param, NMHDR* l_param, bool* handled); - - protected: - // Returns the Widget we're showing tooltips for. - gfx::NativeView GetParent(); - - // Updates the tooltip for the specified location. - void UpdateTooltip(const gfx::Point& location); - - // Tooltip control window. - HWND tooltip_hwnd_; - - // Tooltip information. - TOOLINFO toolinfo_; - - // Last location of the mouse. This is in the coordinates of the rootview. - gfx::Point last_mouse_pos_; - - // Whether or not the tooltip is showing. - bool tooltip_showing_; - - private: - // Sets the tooltip position based on the x/y position of the text. If the - // tooltip fits, true is returned. - bool SetTooltipPosition(int text_x, int text_y); - - // Calculates the preferred height for tooltips. This always returns a - // positive value. - int CalcTooltipHeight(); - - // Invoked when the timer elapses and tooltip has to be destroyed. - void DestroyKeyboardTooltipWindow(HWND window_to_destroy); - - // Hosting Widget. - Widget* widget_; - - // The View the mouse is under. This is null if the mouse isn't under a - // View. - View* last_tooltip_view_; - - // Whether or not the view under the mouse needs to be refreshed. If this - // is true, when the tooltip is asked for the view under the mouse is - // refreshed. - bool last_view_out_of_sync_; - - // Text for tooltip from the view. - string16 tooltip_text_; - - // The clipped tooltip. - string16 clipped_text_; - - // Number of lines in the tooltip. - int line_count_; - - // Width of the last tooltip. - int tooltip_width_; - - // control window for tooltip displayed using keyboard. - HWND keyboard_tooltip_hwnd_; - - // Used to register DestroyTooltipWindow function with PostDelayedTask - // function. - base::WeakPtrFactory<TooltipManagerWin> keyboard_tooltip_factory_; - - DISALLOW_COPY_AND_ASSIGN(TooltipManagerWin); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_ diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc deleted file mode 100644 index 857dac5..0000000 --- a/ui/views/widget/widget.cc +++ /dev/null @@ -1,1218 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/widget.h" - -#include "base/logging.h" -#include "base/message_loop.h" -#include "base/utf_string_conversions.h" -#include "ui/base/hit_test.h" -#include "ui/base/l10n/l10n_font_util.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/gfx/compositor/compositor.h" -#include "ui/gfx/compositor/layer.h" -#include "ui/gfx/screen.h" -#include "ui/views/focus/focus_manager.h" -#include "ui/views/focus/focus_manager_factory.h" -#include "ui/views/focus/view_storage.h" -#include "ui/views/focus/widget_focus_manager.h" -#include "ui/views/ime/input_method.h" -#include "ui/views/widget/default_theme_provider.h" -#include "ui/views/widget/native_widget_private.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/tooltip_manager.h" -#include "ui/views/widget/widget_delegate.h" -#include "ui/views/window/custom_frame_view.h" -#include "views/controls/menu/menu_controller.h" -#include "views/views_delegate.h" - -namespace { - -// Set to true if a pure Views implementation is preferred -bool use_pure_views = false; - -// True to enable debug paint that indicates where to be painted. -bool debug_paint = false; - -} // namespace - -namespace views { - -// This class is used to keep track of the event a Widget is processing, and -// restore any previously active event afterwards. -class ScopedEvent { - public: - ScopedEvent(Widget* widget, const Event& event) - : widget_(widget), - event_(&event) { - widget->event_stack_.push(this); - } - - ~ScopedEvent() { - if (widget_) - widget_->event_stack_.pop(); - } - - void reset() { - widget_ = NULL; - } - - const Event* event() { - return event_; - } - - private: - Widget* widget_; - const Event* event_; - - DISALLOW_COPY_AND_ASSIGN(ScopedEvent); -}; - -// A default implementation of WidgetDelegate, used by Widget when no -// WidgetDelegate is supplied. -class DefaultWidgetDelegate : public WidgetDelegate { - public: - DefaultWidgetDelegate(Widget* widget, const Widget::InitParams& params) - : widget_(widget), - can_activate_(!params.child && - params.type != Widget::InitParams::TYPE_POPUP) { - } - virtual ~DefaultWidgetDelegate() {} - - // Overridden from WidgetDelegate: - virtual void DeleteDelegate() OVERRIDE { - delete this; - } - virtual Widget* GetWidget() { - return widget_; - } - virtual const Widget* GetWidget() const { - return widget_; - } - - virtual bool CanActivate() const { - return can_activate_; - } - - private: - Widget* widget_; - bool can_activate_; - - DISALLOW_COPY_AND_ASSIGN(DefaultWidgetDelegate); -}; - -//////////////////////////////////////////////////////////////////////////////// -// Widget, InitParams: - -Widget::InitParams::InitParams() - : type(TYPE_WINDOW), - delegate(NULL), - child(false), - transient(false), - transparent(false), - accept_events(true), - can_activate(true), - keep_on_top(false), - ownership(NATIVE_WIDGET_OWNS_WIDGET), - mirror_origin_in_rtl(false), - has_dropshadow(false), - show_state(ui::SHOW_STATE_DEFAULT), - double_buffer(false), - parent(NULL), - parent_widget(NULL), - native_widget(NULL), - top_level(false), - create_texture_for_layer(true) { -} - -Widget::InitParams::InitParams(Type type) - : type(type), - delegate(NULL), - child(type == TYPE_CONTROL), - transient(type == TYPE_BUBBLE || type == TYPE_POPUP || type == TYPE_MENU), - transparent(false), - accept_events(true), - can_activate(type != TYPE_POPUP && type != TYPE_MENU), - keep_on_top(type == TYPE_MENU), - ownership(NATIVE_WIDGET_OWNS_WIDGET), - mirror_origin_in_rtl(false), - has_dropshadow(false), - show_state(ui::SHOW_STATE_DEFAULT), - double_buffer(false), - parent(NULL), - parent_widget(NULL), - native_widget(NULL), - top_level(false), - create_texture_for_layer(true) { -} - -gfx::NativeView Widget::InitParams::GetParent() const { - return parent_widget ? parent_widget->GetNativeView() : parent; -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, public: - -Widget::Widget() - : native_widget_(NULL), - widget_delegate_(NULL), - non_client_view_(NULL), - dragged_view_(NULL), - event_stack_(), - ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET), - is_secondary_widget_(true), - frame_type_(FRAME_TYPE_DEFAULT), - disable_inactive_rendering_(false), - widget_closed_(false), - saved_show_state_(ui::SHOW_STATE_DEFAULT), - focus_on_creation_(true), - is_top_level_(false), - native_widget_initialized_(false), - is_mouse_button_pressed_(false), - last_mouse_event_was_move_(false) { -} - -Widget::~Widget() { - while (!event_stack_.empty()) { - event_stack_.top()->reset(); - event_stack_.pop(); - } - - DestroyRootView(); - if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET) - delete native_widget_; -} - -// static -Widget* Widget::CreateWindow(WidgetDelegate* delegate) { - return CreateWindowWithParentAndBounds(delegate, NULL, gfx::Rect()); -} - -// static -Widget* Widget::CreateWindowWithParent(WidgetDelegate* delegate, - gfx::NativeWindow parent) { - return CreateWindowWithParentAndBounds(delegate, parent, gfx::Rect()); -} - -// static -Widget* Widget::CreateWindowWithBounds(WidgetDelegate* delegate, - const gfx::Rect& bounds) { - return CreateWindowWithParentAndBounds(delegate, NULL, bounds); -} - -// static -Widget* Widget::CreateWindowWithParentAndBounds(WidgetDelegate* delegate, - gfx::NativeWindow parent, - const gfx::Rect& bounds) { - Widget* widget = new Widget; - Widget::InitParams params; - params.delegate = delegate; -#if defined(OS_WIN) || defined(USE_AURA) - params.parent = parent; -#endif - params.bounds = bounds; - widget->Init(params); - return widget; -} - -// static -void Widget::SetPureViews(bool pure) { - use_pure_views = pure; -} - -// static -bool Widget::IsPureViews() { -#if defined(USE_AURA) || defined(TOUCH_UI) - return true; -#else - return use_pure_views; -#endif -} - -// static -Widget* Widget::GetWidgetForNativeView(gfx::NativeView native_view) { - internal::NativeWidgetPrivate* native_widget = - internal::NativeWidgetPrivate::GetNativeWidgetForNativeView(native_view); - return native_widget ? native_widget->GetWidget() : NULL; -} - -// static -Widget* Widget::GetWidgetForNativeWindow(gfx::NativeWindow native_window) { - internal::NativeWidgetPrivate* native_widget = - internal::NativeWidgetPrivate::GetNativeWidgetForNativeWindow( - native_window); - return native_widget ? native_widget->GetWidget() : NULL; -} - -// static -Widget* Widget::GetTopLevelWidgetForNativeView(gfx::NativeView native_view) { - internal::NativeWidgetPrivate* native_widget = - internal::NativeWidgetPrivate::GetTopLevelNativeWidget(native_view); - return native_widget ? native_widget->GetWidget() : NULL; -} - - -// static -void Widget::GetAllChildWidgets(gfx::NativeView native_view, - Widgets* children) { - internal::NativeWidgetPrivate::GetAllChildWidgets(native_view, children); -} - -// static -void Widget::ReparentNativeView(gfx::NativeView native_view, - gfx::NativeView new_parent) { - internal::NativeWidgetPrivate::ReparentNativeView(native_view, new_parent); -} - -// static -int Widget::GetLocalizedContentsWidth(int col_resource_id) { - return ui::GetLocalizedContentsWidthForFont(col_resource_id, - ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont)); -} - -// static -int Widget::GetLocalizedContentsHeight(int row_resource_id) { - return ui::GetLocalizedContentsHeightForFont(row_resource_id, - ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont)); -} - -// static -gfx::Size Widget::GetLocalizedContentsSize(int col_resource_id, - int row_resource_id) { - return gfx::Size(GetLocalizedContentsWidth(col_resource_id), - GetLocalizedContentsHeight(row_resource_id)); -} - -// static -void Widget::SetDebugPaintEnabled(bool enabled) { - debug_paint = enabled; -} - -// static -bool Widget::IsDebugPaintEnabled() { - return debug_paint; -} - -// static -bool Widget::RequiresNonClientView(InitParams::Type type) { - return type == InitParams::TYPE_WINDOW || type == InitParams::TYPE_BUBBLE; -} - -void Widget::Init(const InitParams& params) { - is_top_level_ = params.top_level || - (!params.child && - params.type != InitParams::TYPE_CONTROL && - params.type != InitParams::TYPE_TOOLTIP); - widget_delegate_ = params.delegate ? - params.delegate : new DefaultWidgetDelegate(this, params); - ownership_ = params.ownership; - native_widget_ = params.native_widget ? - params.native_widget->AsNativeWidgetPrivate() : - internal::NativeWidgetPrivate::CreateNativeWidget(this); - GetRootView(); - default_theme_provider_.reset(new DefaultThemeProvider); - if (params.type == InitParams::TYPE_MENU) { - is_mouse_button_pressed_ = - internal::NativeWidgetPrivate::IsMouseButtonDown(); - } - native_widget_->InitNativeWidget(params); - if (RequiresNonClientView(params.type)) { - non_client_view_ = new NonClientView; - non_client_view_->SetFrameView(CreateNonClientFrameView()); - // Create the ClientView, add it to the NonClientView and add the - // NonClientView to the RootView. This will cause everything to be parented. - non_client_view_->set_client_view(widget_delegate_->CreateClientView(this)); - SetContentsView(non_client_view_); - SetInitialBounds(params.bounds); - if (params.show_state == ui::SHOW_STATE_MAXIMIZED) - Maximize(); - else if (params.show_state == ui::SHOW_STATE_MINIMIZED) - Minimize(); - UpdateWindowTitle(); - } - native_widget_initialized_ = true; -} - -// Unconverted methods (see header) -------------------------------------------- - -gfx::NativeView Widget::GetNativeView() const { - return native_widget_->GetNativeView(); -} - -gfx::NativeWindow Widget::GetNativeWindow() const { - return native_widget_->GetNativeWindow(); -} - -void Widget::AddObserver(Widget::Observer* observer) { - observers_.AddObserver(observer); -} - -void Widget::RemoveObserver(Widget::Observer* observer) { - observers_.RemoveObserver(observer); -} - -bool Widget::HasObserver(Widget::Observer* observer) { - return observers_.HasObserver(observer); -} - -bool Widget::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) { - return false; -} - -void Widget::ViewHierarchyChanged(bool is_add, View* parent, View* child) { - if (!is_add) { - if (child == dragged_view_) - dragged_view_ = NULL; - - FocusManager* focus_manager = GetFocusManager(); - if (focus_manager) - focus_manager->ViewRemoved(child); - ViewStorage::GetInstance()->ViewRemoved(child); - native_widget_->ViewRemoved(child); - } -} - -void Widget::NotifyNativeViewHierarchyChanged(bool attached, - gfx::NativeView native_view) { - if (!attached) { - FocusManager* focus_manager = GetFocusManager(); - // We are being removed from a window hierarchy. Treat this as - // the root_view_ being removed. - if (focus_manager) - focus_manager->ViewRemoved(root_view_.get()); - } - root_view_->NotifyNativeViewHierarchyChanged(attached, native_view); -} - -// Converted methods (see header) ---------------------------------------------- - -Widget* Widget::GetTopLevelWidget() { - return const_cast<Widget*>( - static_cast<const Widget*>(this)->GetTopLevelWidget()); -} - -const Widget* Widget::GetTopLevelWidget() const { - // GetTopLevelNativeWidget doesn't work during destruction because - // property is gone after gobject gets deleted. Short circuit here - // for toplevel so that InputMethod can remove itself from - // focus manager. - return is_top_level() ? this : native_widget_->GetTopLevelWidget(); -} - -void Widget::SetContentsView(View* view) { - root_view_->SetContentsView(view); - if (non_client_view_ != view) - non_client_view_ = NULL; -} - -View* Widget::GetContentsView() { - return root_view_->GetContentsView(); -} - -gfx::Rect Widget::GetWindowScreenBounds() const { - return native_widget_->GetWindowScreenBounds(); -} - -gfx::Rect Widget::GetClientAreaScreenBounds() const { - return native_widget_->GetClientAreaScreenBounds(); -} - -gfx::Rect Widget::GetRestoredBounds() const { - return native_widget_->GetRestoredBounds(); -} - -void Widget::SetBounds(const gfx::Rect& bounds) { - native_widget_->SetBounds(bounds); -} - -void Widget::SetSize(const gfx::Size& size) { - native_widget_->SetSize(size); -} - -void Widget::SetBoundsConstrained(const gfx::Rect& bounds) { - gfx::Rect work_area = - gfx::Screen::GetMonitorWorkAreaNearestPoint(bounds.origin()); - if (work_area.IsEmpty()) { - SetBounds(bounds); - } else { - // Inset the work area slightly. - work_area.Inset(10, 10, 10, 10); - SetBounds(work_area.AdjustToFit(bounds)); - } -} - -void Widget::MoveAboveWidget(Widget* widget) { - native_widget_->MoveAbove(widget->GetNativeView()); -} - -void Widget::MoveAbove(gfx::NativeView native_view) { - native_widget_->MoveAbove(native_view); -} - -void Widget::MoveToTop() { - native_widget_->MoveToTop(); -} - -void Widget::SetShape(gfx::NativeRegion shape) { - native_widget_->SetShape(shape); -} - -void Widget::Close() { - if (widget_closed_) { - // It appears we can hit this code path if you close a modal dialog then - // close the last browser before the destructor is hit, which triggers - // invoking Close again. - return; - } - - bool can_close = true; - if (non_client_view_) - can_close = non_client_view_->CanClose(); - if (can_close) { - SaveWindowPlacement(); - - // During tear-down the top-level focus manager becomes unavailable to - // GTK tabbed panes and their children, so normal deregistration via - // |FormManager::ViewRemoved()| calls are fouled. We clear focus here - // to avoid these redundant steps and to avoid accessing deleted views - // that may have been in focus. - if (is_top_level() && focus_manager_.get()) - focus_manager_->SetFocusedView(NULL); - - native_widget_->Close(); - widget_closed_ = true; - } -} - -void Widget::CloseNow() { - native_widget_->CloseNow(); -} - -void Widget::EnableClose(bool enable) { - if (non_client_view_) - non_client_view_->EnableClose(enable); - native_widget_->EnableClose(enable); -} - -void Widget::Show() { - if (non_client_view_) { - if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED && - !initial_restored_bounds_.IsEmpty()) { - native_widget_->ShowMaximizedWithBounds(initial_restored_bounds_); - } else { - native_widget_->ShowWithWindowState(saved_show_state_); - } - // |saved_show_state_| only applies the first time the window is shown. - // If we don't reset the value the window may be shown maximized every time - // it is subsequently shown after being hidden. - saved_show_state_ = ui::SHOW_STATE_NORMAL; - } else { - native_widget_->Show(); - } -} - -void Widget::Hide() { - native_widget_->Hide(); -} - -void Widget::ShowInactive() { - // If this gets called with saved_show_state_ == ui::SHOW_STATE_MAXIMIZED, - // call SetBounds()with the restored bounds to set the correct size. This - // normally should not happen, but if it does we should avoid showing unsized - // windows. - if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED && - !initial_restored_bounds_.IsEmpty()) { - SetBounds(initial_restored_bounds_); - saved_show_state_ = ui::SHOW_STATE_NORMAL; - } - native_widget_->ShowWithWindowState(ui::SHOW_STATE_INACTIVE); -} - -void Widget::Activate() { - native_widget_->Activate(); -} - -void Widget::Deactivate() { - native_widget_->Deactivate(); -} - -bool Widget::IsActive() const { - return native_widget_->IsActive(); -} - -void Widget::DisableInactiveRendering() { - SetInactiveRenderingDisabled(true); -} - -void Widget::SetAlwaysOnTop(bool on_top) { - native_widget_->SetAlwaysOnTop(on_top); -} - -void Widget::Maximize() { - native_widget_->Maximize(); -} - -void Widget::Minimize() { - native_widget_->Minimize(); -} - -void Widget::Restore() { - native_widget_->Restore(); -} - -bool Widget::IsMaximized() const { - return native_widget_->IsMaximized(); -} - -bool Widget::IsMinimized() const { - return native_widget_->IsMinimized(); -} - -void Widget::SetFullscreen(bool fullscreen) { - native_widget_->SetFullscreen(fullscreen); -} - -bool Widget::IsFullscreen() const { - return native_widget_->IsFullscreen(); -} - -void Widget::SetOpacity(unsigned char opacity) { - native_widget_->SetOpacity(opacity); -} - -void Widget::SetUseDragFrame(bool use_drag_frame) { - native_widget_->SetUseDragFrame(use_drag_frame); -} - -View* Widget::GetRootView() { - if (!root_view_.get()) { - // First time the root view is being asked for, create it now. - root_view_.reset(CreateRootView()); - } - return root_view_.get(); -} - -const View* Widget::GetRootView() const { - return root_view_.get(); -} - -bool Widget::IsVisible() const { - return native_widget_->IsVisible(); -} - -bool Widget::IsAccessibleWidget() const { - return native_widget_->IsAccessibleWidget(); -} - -ThemeProvider* Widget::GetThemeProvider() const { - const Widget* root_widget = GetTopLevelWidget(); - if (root_widget && root_widget != this) { - // Attempt to get the theme provider, and fall back to the default theme - // provider if not found. - ThemeProvider* provider = root_widget->GetThemeProvider(); - if (provider) - return provider; - - provider = root_widget->default_theme_provider_.get(); - if (provider) - return provider; - } - return default_theme_provider_.get(); -} - -FocusManager* Widget::GetFocusManager() { - Widget* toplevel_widget = GetTopLevelWidget(); - return toplevel_widget ? toplevel_widget->focus_manager_.get() : NULL; -} - -const FocusManager* Widget::GetFocusManager() const { - const Widget* toplevel_widget = GetTopLevelWidget(); - return toplevel_widget ? toplevel_widget->focus_manager_.get() : NULL; -} - -InputMethod* Widget::GetInputMethod() { - if (is_top_level()) { - if (!input_method_.get()) - input_method_.reset(native_widget_->CreateInputMethod()); - return input_method_.get(); - } else { - Widget* toplevel = GetTopLevelWidget(); - // If GetTopLevelWidget() returns itself which is not toplevel, - // the widget is detached from toplevel widget. - // TODO(oshima): Fix GetTopLevelWidget() to return NULL - // if there is no toplevel. We probably need to add GetTopMostWidget() - // to replace some use cases. - return (toplevel && toplevel != this) ? toplevel->GetInputMethod() : NULL; - } -} - -void Widget::RunShellDrag(View* view, const ui::OSExchangeData& data, - int operation) { - dragged_view_ = view; - native_widget_->RunShellDrag(view, data, operation); - // If the view is removed during the drag operation, dragged_view_ is set to - // NULL. - if (view && dragged_view_ == view) { - dragged_view_ = NULL; - view->OnDragDone(); - } -} - -void Widget::SchedulePaintInRect(const gfx::Rect& rect) { - native_widget_->SchedulePaintInRect(rect); -} - -void Widget::SetCursor(gfx::NativeCursor cursor) { - native_widget_->SetCursor(cursor); -} - -void Widget::ResetLastMouseMoveFlag() { - last_mouse_event_was_move_ = false; -} - -void Widget::SetNativeWindowProperty(const char* name, void* value) { - native_widget_->SetNativeWindowProperty(name, value); -} - -void* Widget::GetNativeWindowProperty(const char* name) const { - return native_widget_->GetNativeWindowProperty(name); -} - -void Widget::UpdateWindowTitle() { - if (!non_client_view_) - return; - - // If the non-client view is rendering its own title, it'll need to relayout - // now. - non_client_view_->Layout(); - - // Update the native frame's text. We do this regardless of whether or not - // the native frame is being used, since this also updates the taskbar, etc. - string16 window_title; - if (native_widget_->IsScreenReaderActive()) { - window_title = widget_delegate_->GetAccessibleWindowTitle(); - } else { - window_title = widget_delegate_->GetWindowTitle(); - } - base::i18n::AdjustStringForLocaleDirection(&window_title); - native_widget_->SetWindowTitle(window_title); -} - -void Widget::UpdateWindowIcon() { - if (non_client_view_) - non_client_view_->UpdateWindowIcon(); - native_widget_->SetWindowIcons(widget_delegate_->GetWindowIcon(), - widget_delegate_->GetWindowAppIcon()); -} - -FocusTraversable* Widget::GetFocusTraversable() { - return static_cast<internal::RootView*>(root_view_.get()); -} - -void Widget::ThemeChanged() { - root_view_->ThemeChanged(); -} - -void Widget::LocaleChanged() { - root_view_->LocaleChanged(); -} - -void Widget::SetFocusTraversableParent(FocusTraversable* parent) { - root_view_->SetFocusTraversableParent(parent); -} - -void Widget::SetFocusTraversableParentView(View* parent_view) { - root_view_->SetFocusTraversableParentView(parent_view); -} - -void Widget::ClearNativeFocus() { - native_widget_->ClearNativeFocus(); -} - -void Widget::FocusNativeView(gfx::NativeView native_view) { - native_widget_->FocusNativeView(native_view); -} - -void Widget::UpdateFrameAfterFrameChange() { - native_widget_->UpdateFrameAfterFrameChange(); -} - -NonClientFrameView* Widget::CreateNonClientFrameView() { - NonClientFrameView* frame_view = widget_delegate_->CreateNonClientFrameView(); - if (!frame_view) - frame_view = native_widget_->CreateNonClientFrameView(); - return frame_view ? frame_view : new CustomFrameView(this); -} - -bool Widget::ShouldUseNativeFrame() const { - if (frame_type_ != FRAME_TYPE_DEFAULT) - return frame_type_ == FRAME_TYPE_FORCE_NATIVE; - return native_widget_->ShouldUseNativeFrame(); -} - -void Widget::DebugToggleFrameType() { - if (frame_type_ == FRAME_TYPE_DEFAULT) { - frame_type_ = ShouldUseNativeFrame() ? FRAME_TYPE_FORCE_CUSTOM : - FRAME_TYPE_FORCE_NATIVE; - } else { - frame_type_ = frame_type_ == FRAME_TYPE_FORCE_CUSTOM ? - FRAME_TYPE_FORCE_NATIVE : FRAME_TYPE_FORCE_CUSTOM; - } - FrameTypeChanged(); -} - -void Widget::FrameTypeChanged() { - native_widget_->FrameTypeChanged(); -} - -const ui::Compositor* Widget::GetCompositor() const { - return native_widget_->GetCompositor(); -} - -ui::Compositor* Widget::GetCompositor() { - return native_widget_->GetCompositor(); -} - -void Widget::CalculateOffsetToAncestorWithLayer(gfx::Point* offset, - ui::Layer** layer_parent) { - native_widget_->CalculateOffsetToAncestorWithLayer(offset, layer_parent); -} - -void Widget::ReorderLayers() { - native_widget_->ReorderLayers(); -} - -void Widget::NotifyAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type, - bool send_native_event) { - // Send the notification to the delegate. - if (ViewsDelegate::views_delegate) - ViewsDelegate::views_delegate->NotifyAccessibilityEvent(view, event_type); - - if (send_native_event) - native_widget_->SendNativeAccessibilityEvent(view, event_type); -} - -const NativeWidget* Widget::native_widget() const { - return native_widget_; -} - -NativeWidget* Widget::native_widget() { - return native_widget_; -} - -const Event* Widget::GetCurrentEvent() { - return event_stack_.empty() ? NULL : event_stack_.top()->event(); -} - -void Widget::TooltipTextChanged(View* view) { - TooltipManager* manager = native_widget_private()->GetTooltipManager(); - if (manager) - manager->TooltipTextChanged(view); -} - -bool Widget::SetInitialFocus() { - if (!focus_on_creation_) - return true; - View* v = widget_delegate_->GetInitiallyFocusedView(); - if (v) - v->RequestFocus(); - return !!v; -} - -bool Widget::ConvertPointFromAncestor( - const Widget* ancestor, gfx::Point* point) const { - return native_widget_->ConvertPointFromAncestor(ancestor, point); -} - -View* Widget::GetChildViewParent() { - return GetContentsView() ? GetContentsView() : GetRootView(); -} - -gfx::Rect Widget::GetWorkAreaBoundsInScreen() const { - return native_widget_->GetWorkAreaBoundsInScreen(); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, NativeWidgetDelegate implementation: - -bool Widget::IsModal() const { - return widget_delegate_->IsModal(); -} - -bool Widget::IsDialogBox() const { - return !!widget_delegate_->AsDialogDelegate(); -} - -bool Widget::CanActivate() const { - return widget_delegate_->CanActivate(); -} - -bool Widget::IsInactiveRenderingDisabled() const { - return disable_inactive_rendering_; -} - -void Widget::EnableInactiveRendering() { - SetInactiveRenderingDisabled(false); -} - -void Widget::OnNativeWidgetActivationChanged(bool active) { - if (!active) { - SaveWindowPlacement(); - - // Close any open menus. - MenuController* menu_controller = MenuController::GetActiveInstance(); - if (menu_controller) - menu_controller->OnWidgetActivationChanged(); - } - - FOR_EACH_OBSERVER(Observer, observers_, - OnWidgetActivationChanged(this, active)); -} - -void Widget::OnNativeFocus(gfx::NativeView focused_view) { - WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(focused_view, - GetNativeView()); -} - -void Widget::OnNativeBlur(gfx::NativeView focused_view) { - WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(GetNativeView(), - focused_view); -} - -void Widget::OnNativeWidgetVisibilityChanged(bool visible) { - View* root = GetRootView(); - root->PropagateVisibilityNotifications(root, visible); - FOR_EACH_OBSERVER(Observer, observers_, - OnWidgetVisibilityChanged(this, visible)); - if (GetCompositor() && root->layer()) - root->layer()->SetVisible(visible); -} - -void Widget::OnNativeWidgetCreated() { - if (is_top_level()) - focus_manager_.reset(FocusManagerFactory::Create(this)); - - native_widget_->SetAccessibleRole( - widget_delegate_->GetAccessibleWindowRole()); - native_widget_->SetAccessibleState( - widget_delegate_->GetAccessibleWindowState()); - - if (widget_delegate_->IsModal()) - native_widget_->BecomeModal(); -} - -void Widget::OnNativeWidgetDestroying() { - FOR_EACH_OBSERVER(Observer, observers_, OnWidgetClosing(this)); - if (non_client_view_) - non_client_view_->WindowClosing(); - widget_delegate_->WindowClosing(); -} - -void Widget::OnNativeWidgetDestroyed() { - widget_delegate_->DeleteDelegate(); - widget_delegate_ = NULL; -} - -gfx::Size Widget::GetMinimumSize() { - return non_client_view_ ? non_client_view_->GetMinimumSize() : gfx::Size(); -} - -void Widget::OnNativeWidgetSizeChanged(const gfx::Size& new_size) { - root_view_->SetSize(new_size); - - // Size changed notifications can fire prior to full initialization - // i.e. during session restore. Avoid saving session state during these - // startup procedures. - if (native_widget_initialized_) - SaveWindowPlacement(); -} - -void Widget::OnNativeWidgetBeginUserBoundsChange() { - widget_delegate_->OnWindowBeginUserBoundsChange(); -} - -void Widget::OnNativeWidgetEndUserBoundsChange() { - widget_delegate_->OnWindowEndUserBoundsChange(); -} - -bool Widget::HasFocusManager() const { - return !!focus_manager_.get(); -} - -bool Widget::OnNativeWidgetPaintAccelerated(const gfx::Rect& dirty_region) { - ui::Compositor* compositor = GetCompositor(); - if (!compositor) - return false; - - // If the root view is animating, it is likely that it does not cover the same - // set of pixels it did at the last frame, so we must clear when compositing - // to avoid leaving ghosts. - bool force_clear = false; - if (GetRootView()->layer()) { - const ui::Transform& layer_transform = GetRootView()->layer()->transform(); - if (layer_transform != GetRootView()->GetTransform()) { - // The layer has not caught up to the view (i.e., the layer is still - // animating), and so a clear is required. - force_clear = true; - } else { - // Determine if the layer fills the client area. - gfx::Rect layer_bounds = GetRootView()->layer()->bounds(); - layer_transform.TransformRect(&layer_bounds); - gfx::Rect client_bounds = GetClientAreaScreenBounds(); - // Translate bounds to origin (client area bounds are offset to account - // for buttons, etc). - client_bounds.set_origin(gfx::Point(0, 0)); - if (!layer_bounds.Contains(client_bounds)) { - // It doesn't, and so a clear is required. - force_clear = true; - } - } - } - - compositor->Draw(force_clear); - return true; -} - -void Widget::OnNativeWidgetPaint(gfx::Canvas* canvas) { - GetRootView()->Paint(canvas); -} - -int Widget::GetNonClientComponent(const gfx::Point& point) { - return non_client_view_ ? - non_client_view_->NonClientHitTest(point) : - HTNOWHERE; -} - -bool Widget::OnKeyEvent(const KeyEvent& event) { - ScopedEvent scoped(this, event); - return static_cast<internal::RootView*>(GetRootView())->OnKeyEvent(event); -} - -bool Widget::OnMouseEvent(const MouseEvent& event) { - ScopedEvent scoped(this, event); - switch (event.type()) { - case ui::ET_MOUSE_PRESSED: - last_mouse_event_was_move_ = false; - // Make sure we're still visible before we attempt capture as the mouse - // press processing may have made the window hide (as happens with menus). - if (GetRootView()->OnMousePressed(event) && IsVisible()) { - is_mouse_button_pressed_ = true; - if (!native_widget_->HasMouseCapture()) - native_widget_->SetMouseCapture(); - return true; - } - return false; - case ui::ET_MOUSE_RELEASED: - last_mouse_event_was_move_ = false; - is_mouse_button_pressed_ = false; - // Release capture first, to avoid confusion if OnMouseReleased blocks. - if (native_widget_->HasMouseCapture() && - ShouldReleaseCaptureOnMouseReleased()) { - native_widget_->ReleaseMouseCapture(); - } - GetRootView()->OnMouseReleased(event); - return (event.flags() & ui::EF_IS_NON_CLIENT) ? false : true; - case ui::ET_MOUSE_MOVED: - case ui::ET_MOUSE_DRAGGED: - if (native_widget_->HasMouseCapture() && is_mouse_button_pressed_) { - last_mouse_event_was_move_ = false; - GetRootView()->OnMouseDragged(event); - } else if (!last_mouse_event_was_move_ || - last_mouse_event_position_ != event.location()) { - last_mouse_event_position_ = event.location(); - last_mouse_event_was_move_ = true; - GetRootView()->OnMouseMoved(event); - } - return false; - case ui::ET_MOUSE_EXITED: - last_mouse_event_was_move_ = false; - GetRootView()->OnMouseExited(event); - return false; - case ui::ET_MOUSEWHEEL: - return GetRootView()->OnMouseWheel( - reinterpret_cast<const MouseWheelEvent&>(event)); - default: - return false; - } - return true; -} - -void Widget::OnMouseCaptureLost() { - if (is_mouse_button_pressed_) - GetRootView()->OnMouseCaptureLost(); - is_mouse_button_pressed_ = false; -} - -ui::TouchStatus Widget::OnTouchEvent(const TouchEvent& event) { - ScopedEvent scoped(this, event); - return static_cast<internal::RootView*>(GetRootView())->OnTouchEvent(event); -} - -bool Widget::ExecuteCommand(int command_id) { - return widget_delegate_->ExecuteWindowsCommand(command_id); -} - -InputMethod* Widget::GetInputMethodDirect() { - return input_method_.get(); -} - -Widget* Widget::AsWidget() { - return this; -} - -const Widget* Widget::AsWidget() const { - return this; -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, FocusTraversable implementation: - -FocusSearch* Widget::GetFocusSearch() { - return root_view_->GetFocusSearch(); -} - -FocusTraversable* Widget::GetFocusTraversableParent() { - // We are a proxy to the root view, so we should be bypassed when traversing - // up and as a result this should not be called. - NOTREACHED(); - return NULL; -} - -View* Widget::GetFocusTraversableParentView() { - // We are a proxy to the root view, so we should be bypassed when traversing - // up and as a result this should not be called. - NOTREACHED(); - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, protected: - -internal::RootView* Widget::CreateRootView() { - return new internal::RootView(this); -} - -void Widget::DestroyRootView() { - non_client_view_ = NULL; - root_view_.reset(); - // Input method has to be destroyed before focus manager. - input_method_.reset(); - // Defer focus manager's destruction. This is for the case when the - // focus manager is referenced by a child NativeWidgetGtk (e.g. TabbedPane in - // a dialog). When gtk_widget_destroy is called on the parent, the destroy - // signal reaches parent first and then the child. Thus causing the parent - // NativeWidgetGtk's dtor executed before the child's. If child's view - // hierarchy references this focus manager, it crashes. This will defer focus - // manager's destruction after child NativeWidgetGtk's dtor. - FocusManager* focus_manager = focus_manager_.release(); - if (focus_manager) - MessageLoop::current()->DeleteSoon(FROM_HERE, focus_manager); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, private: - -bool Widget::ShouldReleaseCaptureOnMouseReleased() const { - return true; -} - -void Widget::SetInactiveRenderingDisabled(bool value) { - disable_inactive_rendering_ = value; - // We need to always notify the NonClientView so that it can trigger a paint. - // TODO: what's really needed is a way to know when either the active state - // changes or |disable_inactive_rendering_| changes. - if (non_client_view_) - non_client_view_->SetInactiveRenderingDisabled(value); - native_widget_->SetInactiveRenderingDisabled(value); -} - -void Widget::SaveWindowPlacement() { - // The window delegate does the actual saving for us. It seems like (judging - // by go/crash) that in some circumstances we can end up here after - // WM_DESTROY, at which point the window delegate is likely gone. So just - // bail. - if (!widget_delegate_) - return; - - ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL; - gfx::Rect bounds; - native_widget_->GetWindowPlacement(&bounds, &show_state); - widget_delegate_->SaveWindowPlacement(bounds, show_state); -} - -void Widget::SetInitialBounds(const gfx::Rect& bounds) { - if (!non_client_view_) - return; - - gfx::Rect saved_bounds; - if (GetSavedWindowPlacement(&saved_bounds, &saved_show_state_)) { - if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED) { - // If we're going to maximize, wait until Show is invoked to set the - // bounds. That way we avoid a noticable resize. - initial_restored_bounds_ = saved_bounds; - } else { - SetBounds(saved_bounds); - } - } else { - if (bounds.IsEmpty()) { - // No initial bounds supplied, so size the window to its content and - // center over its parent. - native_widget_->CenterWindow(non_client_view_->GetPreferredSize()); - } else { - // Use the supplied initial bounds. - SetBoundsConstrained(bounds); - } - } -} - -bool Widget::GetSavedWindowPlacement(gfx::Rect* bounds, - ui::WindowShowState* show_state) { - // First we obtain the window's saved show-style and store it. We need to do - // this here, rather than in Show() because by the time Show() is called, - // the window's size will have been reset (below) and the saved maximized - // state will have been lost. Sadly there's no way to tell on Windows when - // a window is restored from maximized state, so we can't more accurately - // track maximized state independently of sizing information. - - // Restore the window's placement from the controller. - if (widget_delegate_->GetSavedWindowPlacement(bounds, show_state)) { - if (!widget_delegate_->ShouldRestoreWindowSize()) { - bounds->set_size(non_client_view_->GetPreferredSize()); - } else { - gfx::Size minimum_size = GetMinimumSize(); - // Make sure the bounds are at least the minimum size. - if (bounds->width() < minimum_size.width()) - bounds->set_width(minimum_size.width()); - - if (bounds->height() < minimum_size.height()) - bounds->set_height(minimum_size.height()); - } - return true; - } - return false; -} - -void Widget::ReplaceInputMethod(InputMethod* input_method) { - input_method_.reset(input_method); - // TODO(oshima): Gtk's textfield doesn't need views InputMethod. - // Remove this check once gtk is removed. - if (input_method) { - input_method->set_delegate(native_widget_); - input_method->Init(this); - } -} - -namespace internal { - -//////////////////////////////////////////////////////////////////////////////// -// internal::NativeWidgetPrivate, NativeWidget implementation: - -internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { - return this; -} - -} // namespace internal -} // namespace views diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h deleted file mode 100644 index 4beda65..0000000 --- a/ui/views/widget/widget.h +++ /dev/null @@ -1,746 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_WIDGET_H_ -#define UI_VIEWS_WIDGET_WIDGET_H_ -#pragma once - -#include <set> -#include <stack> - -#include "base/gtest_prod_util.h" -#include "base/memory/scoped_ptr.h" -#include "base/observer_list.h" -#include "ui/base/accessibility/accessibility_types.h" -#include "ui/base/ui_base_types.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/rect.h" -#include "ui/views/focus/focus_manager.h" -#include "ui/views/widget/native_widget_delegate.h" -#include "ui/views/window/client_view.h" -#include "ui/views/window/non_client_view.h" - -#if defined(OS_WIN) -// Windows headers define macros for these function names which screw with us. -#if defined(IsMaximized) -#undef IsMaximized -#endif -#if defined(IsMinimized) -#undef IsMinimized -#endif -#if defined(CreateWindow) -#undef CreateWindow -#endif -#endif - -namespace gfx { -class Canvas; -class Point; -class Rect; -} - -namespace ui { -class Accelerator; -class Compositor; -class OSExchangeData; -class ThemeProvider; -enum TouchStatus; -} -using ui::ThemeProvider; - -namespace views { - -class DefaultThemeProvider; -class InputMethod; -class NativeWidget; -class NonClientFrameView; -class ScopedEvent; -class View; -class WidgetDelegate; -namespace internal { -class NativeWidgetPrivate; -class RootView; -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget class -// -// Encapsulates the platform-specific rendering, event receiving and widget -// management aspects of the UI framework. -// -// Owns a RootView and thus a View hierarchy. Can contain child Widgets. -// Widget is a platform-independent type that communicates with a platform or -// context specific NativeWidget implementation. -// -// A special note on ownership: -// -// Depending on the value of the InitParams' ownership field, the Widget -// either owns or is owned by its NativeWidget: -// -// ownership = NATIVE_WIDGET_OWNS_WIDGET (default) -// The Widget instance is owned by its NativeWidget. When the NativeWidget -// is destroyed (in response to a native destruction message), it deletes -// the Widget from its destructor. -// ownership = WIDGET_OWNS_NATIVE_WIDGET (non-default) -// The Widget instance owns its NativeWidget. This state implies someone -// else wants to control the lifetime of this object. When they destroy -// the Widget it is responsible for destroying the NativeWidget (from its -// destructor). -// -class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate, - public FocusTraversable { - public: - // Observers can listen to various events on the Widgets. - class VIEWS_EXPORT Observer { - public: - virtual void OnWidgetClosing(Widget* widget) {} - virtual void OnWidgetVisibilityChanged(Widget* widget, bool visible) {} - virtual void OnWidgetActivationChanged(Widget* widget, bool active) {} - }; - - typedef std::set<Widget*> Widgets; - - enum FrameType { - FRAME_TYPE_DEFAULT, // Use whatever the default would be. - FRAME_TYPE_FORCE_CUSTOM, // Force the custom frame. - FRAME_TYPE_FORCE_NATIVE // Force the native frame. - }; - - struct VIEWS_EXPORT InitParams { - enum Type { - TYPE_WINDOW, // A decorated Window, like a frame window. - // Widgets of TYPE_WINDOW will have a NonClientView. - TYPE_WINDOW_FRAMELESS, - // An undecorated Window. - TYPE_CONTROL, // A control, like a button. - TYPE_POPUP, // An undecorated Window, with transient properties. - TYPE_MENU, // An undecorated Window, with transient properties - // specialized to menus. - TYPE_TOOLTIP, - TYPE_BUBBLE, - }; - enum Ownership { - // Default. Creator is not responsible for managing the lifetime of the - // Widget, it is destroyed when the corresponding NativeWidget is - // destroyed. - NATIVE_WIDGET_OWNS_WIDGET, - // Used when the Widget is owned by someone other than the NativeWidget, - // e.g. a scoped_ptr in tests. - WIDGET_OWNS_NATIVE_WIDGET - }; - - InitParams(); - explicit InitParams(Type type); - - // If |parent_widget| is non-null, it's native view is returned, otherwise - // |parent| is returned. - gfx::NativeView GetParent() const; - - Type type; - // If NULL, a default implementation will be constructed. - WidgetDelegate* delegate; - bool child; - bool transient; - // If true, the widget may be fully or partially transparent. If false, - // we can perform optimizations based on the widget being fully opaque. - // Defaults to false. - bool transparent; - bool accept_events; - bool can_activate; - bool keep_on_top; - Ownership ownership; - bool mirror_origin_in_rtl; - bool has_dropshadow; - // Whether the widget should be maximized or minimized. - ui::WindowShowState show_state; - // Should the widget be double buffered? Default is false. - bool double_buffer; - gfx::NativeView parent; - Widget* parent_widget; - // Specifies the initial bounds of the Widget. Default is empty, which means - // the NativeWidget may specify a default size. - gfx::Rect bounds; - // When set, this value is used as the Widget's NativeWidget implementation. - // The Widget will not construct a default one. Default is NULL. - NativeWidget* native_widget; - bool top_level; - // Only used by NativeWidgetAura. Specifies whether the Layer created by - // aura::Window has a texture. The default is true. - bool create_texture_for_layer; - }; - - Widget(); - virtual ~Widget(); - - // Creates a decorated window Widget with the specified properties. - static Widget* CreateWindow(WidgetDelegate* delegate); - static Widget* CreateWindowWithParent(WidgetDelegate* delegate, - gfx::NativeWindow parent); - static Widget* CreateWindowWithBounds(WidgetDelegate* delegate, - const gfx::Rect& bounds); - static Widget* CreateWindowWithParentAndBounds(WidgetDelegate* delegate, - gfx::NativeWindow parent, - const gfx::Rect& bounds); - - // Enumerates all windows pertaining to us and notifies their - // view hierarchies that the locale has changed. - static void NotifyLocaleChanged(); - - // Closes all Widgets that aren't identified as "secondary widgets". Called - // during application shutdown when the last non-secondary widget is closed. - static void CloseAllSecondaryWidgets(); - - // Converts a rectangle from one Widget's coordinate system to another's. - // Returns false if the conversion couldn't be made, because either these two - // Widgets do not have a common ancestor or they are not on the screen yet. - // The value of |*rect| won't be changed when false is returned. - static bool ConvertRect(const Widget* source, - const Widget* target, - gfx::Rect* rect); - - // SetPureViews and IsPureViews update and return the state of a global - // setting that tracks whether to use available pure Views implementations. - static void SetPureViews(bool pure); - static bool IsPureViews(); - - // Retrieves the Widget implementation associated with the given - // NativeView or Window, or NULL if the supplied handle has no associated - // Widget. - static Widget* GetWidgetForNativeView(gfx::NativeView native_view); - static Widget* GetWidgetForNativeWindow(gfx::NativeWindow native_window); - - // Retrieves the top level widget in a native view hierarchy - // starting at |native_view|. Top level widget is a widget with - // TYPE_WINDOW, TYPE_WINDOW_FRAMELESS, POPUP or MENU and has its own - // focus manager. This may be itself if the |native_view| is top level, - // or NULL if there is no toplevel in a native view hierarchy. - static Widget* GetTopLevelWidgetForNativeView(gfx::NativeView native_view); - - // Returns all Widgets in |native_view|'s hierarchy, including itself if - // it is one. - static void GetAllChildWidgets(gfx::NativeView native_view, - Widgets* children); - - // Re-parent a NativeView and notify all Widgets in |native_view|'s hierarchy - // of the change. - static void ReparentNativeView(gfx::NativeView native_view, - gfx::NativeView new_parent); - - // Returns the preferred size of the contents view of this window based on - // its localized size data. The width in cols is held in a localized string - // resource identified by |col_resource_id|, the height in the same fashion. - // TODO(beng): This should eventually live somewhere else, probably closer to - // ClientView. - static int GetLocalizedContentsWidth(int col_resource_id); - static int GetLocalizedContentsHeight(int row_resource_id); - static gfx::Size GetLocalizedContentsSize(int col_resource_id, - int row_resource_id); - - // Enable/Disable debug paint. - static void SetDebugPaintEnabled(bool enabled); - static bool IsDebugPaintEnabled(); - - // Returns true if the specified type requires a NonClientView. - static bool RequiresNonClientView(InitParams::Type type); - - void Init(const InitParams& params); - - // Returns the gfx::NativeView associated with this Widget. - gfx::NativeView GetNativeView() const; - - // Returns the gfx::NativeWindow associated with this Widget. This may return - // NULL on some platforms if the widget was created with a type other than - // TYPE_WINDOW. - gfx::NativeWindow GetNativeWindow() const; - - // Add/remove observer. - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - bool HasObserver(Observer* observer); - - // Returns the accelerator given a command id. Returns false if there is - // no accelerator associated with a given id, which is a common condition. - virtual bool GetAccelerator(int cmd_id, ui::Accelerator* accelerator); - - // Forwarded from the RootView so that the widget can do any cleanup. - void ViewHierarchyChanged(bool is_add, View* parent, View* child); - - // Performs any necessary cleanup and forwards to RootView. - void NotifyNativeViewHierarchyChanged(bool attached, - gfx::NativeView native_view); - - // Returns the top level widget in a hierarchy (see is_top_level() for - // the definition of top level widget.) Will return NULL if called - // before the widget is attached to the top level widget's hierarchy. - Widget* GetTopLevelWidget(); - const Widget* GetTopLevelWidget() const; - - // Gets/Sets the WidgetDelegate. - WidgetDelegate* widget_delegate() const { return widget_delegate_; } - - // Sets the specified view as the contents of this Widget. There can only - // be one contents view child of this Widget's RootView. This view is sized to - // fit the entire size of the RootView. The RootView takes ownership of this - // View, unless it is set as not being parent-owned. - void SetContentsView(View* view); - View* GetContentsView(); - - // Returns the bounds of the Widget in screen coordinates. - gfx::Rect GetWindowScreenBounds() const; - - // Returns the bounds of the Widget's client area in screen coordinates. - gfx::Rect GetClientAreaScreenBounds() const; - - // Retrieves the restored bounds for the window. - gfx::Rect GetRestoredBounds() const; - - // Sizes and/or places the widget to the specified bounds, size or position. - void SetBounds(const gfx::Rect& bounds); - void SetSize(const gfx::Size& size); - - // Like SetBounds(), but ensures the Widget is fully visible on screen, - // resizing and/or repositioning as necessary. This is only useful for - // non-child widgets. - void SetBoundsConstrained(const gfx::Rect& bounds); - - // Places the widget in front of the specified widget in z-order. - void MoveAboveWidget(Widget* widget); - void MoveAbove(gfx::NativeView native_view); - void MoveToTop(); - - // Sets a shape on the widget. This takes ownership of shape. - void SetShape(gfx::NativeRegion shape); - - // Hides the widget then closes it after a return to the message loop. - virtual void Close(); - - // TODO(beng): Move off public API. - // Closes the widget immediately. Compare to |Close|. This will destroy the - // window handle associated with this Widget, so should not be called from - // any code that expects it to be valid beyond this call. - void CloseNow(); - - // Toggles the enable state for the Close button (and the Close menu item in - // the system menu). - void EnableClose(bool enable); - - // Shows or hides the widget, without changing activation state. - virtual void Show(); - void Hide(); - - // Like Show(), but does not activate the window. - void ShowInactive(); - - // Activates the widget, assuming it already exists and is visible. - void Activate(); - - // Deactivates the widget, making the next window in the Z order the active - // window. - void Deactivate(); - - // Returns whether the Widget is the currently active window. - virtual bool IsActive() const; - - // Prevents the window from being rendered as deactivated. This state is - // reset automatically as soon as the window becomes activated again. There is - // no ability to control the state through this API as this leads to sync - // problems. - void DisableInactiveRendering(); - - // Sets the widget to be on top of all other widgets in the windowing system. - void SetAlwaysOnTop(bool on_top); - - // Maximizes/minimizes/restores the window. - void Maximize(); - void Minimize(); - void Restore(); - - // Whether or not the window is maximized or minimized. - virtual bool IsMaximized() const; - bool IsMinimized() const; - - // Accessors for fullscreen state. - void SetFullscreen(bool fullscreen); - bool IsFullscreen() const; - - // Sets the opacity of the widget. This may allow widgets behind the widget - // in the Z-order to become visible, depending on the capabilities of the - // underlying windowing system. Note that the caller must then schedule a - // repaint to allow this change to take effect. - void SetOpacity(unsigned char opacity); - - // Sets whether or not the window should show its frame as a "transient drag - // frame" - slightly transparent and without the standard window controls. - void SetUseDragFrame(bool use_drag_frame); - - // Returns the View at the root of the View hierarchy contained by this - // Widget. - View* GetRootView(); - const View* GetRootView() const; - - // A secondary widget is one that is automatically closed (via Close()) when - // all non-secondary widgets are closed. - // Default is true. - // TODO(beng): This is an ugly API, should be handled implicitly via - // transience. - void set_is_secondary_widget(bool is_secondary_widget) { - is_secondary_widget_ = is_secondary_widget; - } - bool is_secondary_widget() const { return is_secondary_widget_; } - - // Returns whether the Widget is visible to the user. - virtual bool IsVisible() const; - - // Returns whether the Widget is customized for accessibility. - bool IsAccessibleWidget() const; - - // Returns the ThemeProvider that provides theme resources for this Widget. - virtual ThemeProvider* GetThemeProvider() const; - - // Returns the FocusManager for this widget. - // Note that all widgets in a widget hierarchy share the same focus manager. - // TODO(beng): remove virtual. - virtual FocusManager* GetFocusManager(); - virtual const FocusManager* GetFocusManager() const; - - // Returns the InputMethod for this widget. - // Note that all widgets in a widget hierarchy share the same input method. - InputMethod* GetInputMethod(); - - // Starts a drag operation for the specified view. This blocks until the drag - // operation completes. |view| can be NULL. - // If the view is non-NULL it can be accessed during the drag by calling - // dragged_view(). If the view has not been deleted during the drag, - // OnDragDone() is called on it. - void RunShellDrag(View* view, const ui::OSExchangeData& data, int operation); - - // Returns the view that requested the current drag operation via - // RunShellDrag(), or NULL if there is no such view or drag operation. - View* dragged_view() { return dragged_view_; } - - // Adds the specified |rect| in client area coordinates to the rectangle to be - // redrawn. - void SchedulePaintInRect(const gfx::Rect& rect); - - // Sets the currently visible cursor. If |cursor| is NULL, the cursor used - // before the current is restored. - void SetCursor(gfx::NativeCursor cursor); - - // Resets the last move flag so that we can go around the optimization - // that disregards duplicate mouse moves when ending animation requires - // a new hit-test to do some highlighting as in TabStrip::RemoveTabAnimation - // to cause the close button to highlight. - void ResetLastMouseMoveFlag(); - - // Sets/Gets a native window property on the underlying native window object. - // Returns NULL if the property does not exist. Setting the property value to - // NULL removes the property. - void SetNativeWindowProperty(const char* name, void* value); - void* GetNativeWindowProperty(const char* name) const; - - // Tell the window to update its title from the delegate. - void UpdateWindowTitle(); - - // Tell the window to update its icon from the delegate. - void UpdateWindowIcon(); - - // Retrieves the focus traversable for this widget. - FocusTraversable* GetFocusTraversable(); - - // Notifies the view hierarchy contained in this widget that theme resources - // changed. - void ThemeChanged(); - - // Notifies the view hierarchy contained in this widget that locale resources - // changed. - void LocaleChanged(); - - void SetFocusTraversableParent(FocusTraversable* parent); - void SetFocusTraversableParentView(View* parent_view); - - // Clear native focus set to the Widget's NativeWidget. - void ClearNativeFocus(); - - // Sets the focus to |native_view|. - void FocusNativeView(gfx::NativeView native_view); - - // Updates the frame after an event caused it to be changed. - virtual void UpdateFrameAfterFrameChange(); - - void set_frame_type(FrameType frame_type) { frame_type_ = frame_type; } - FrameType frame_type() const { return frame_type_; } - - // Creates an appropriate NonClientFrameView for this widget. The - // WidgetDelegate is given the first opportunity to create one, followed by - // the NativeWidget implementation. If both return NULL, a default one is - // created. - virtual NonClientFrameView* CreateNonClientFrameView(); - - // Whether we should be using a native frame. - bool ShouldUseNativeFrame() const; - - // Forces the frame into the alternate frame type (custom or native) depending - // on its current state. - void DebugToggleFrameType(); - - // Tell the window that something caused the frame type to change. - void FrameTypeChanged(); - - NonClientView* non_client_view() { - return const_cast<NonClientView*>( - const_cast<const Widget*>(this)->non_client_view()); - } - const NonClientView* non_client_view() const { - return non_client_view_; - } - - ClientView* client_view() { - return const_cast<ClientView*>( - const_cast<const Widget*>(this)->client_view()); - } - const ClientView* client_view() const { - // non_client_view_ may be NULL, especially during creation. - return non_client_view_ ? non_client_view_->client_view() : NULL; - } - - const ui::Compositor* GetCompositor() const; - ui::Compositor* GetCompositor(); - - // Invokes method of same name on the NativeWidget. - void CalculateOffsetToAncestorWithLayer(gfx::Point* offset, - ui::Layer** layer_parent); - - // Invokes method of same name on the NativeWidget. - void ReorderLayers(); - - // Notifies assistive technology that an accessibility event has - // occurred on |view|, such as when the view is focused or when its - // value changes. Pass true for |send_native_event| except for rare - // cases where the view is a native control that's already sending a - // native accessibility event and the duplicate event would cause - // problems. - void NotifyAccessibilityEvent( - View* view, - ui::AccessibilityTypes::Event event_type, - bool send_native_event); - - const NativeWidget* native_widget() const; - NativeWidget* native_widget(); - - internal::NativeWidgetPrivate* native_widget_private() { - return native_widget_; - } - const internal::NativeWidgetPrivate* native_widget_private() const { - return native_widget_; - } - - // Returns the current event being processed. If there are multiple events - // being processed at the same time (e.g. one event triggers another event), - // then the most recent event is returned. Returns NULL if no event is being - // processed. - const Event* GetCurrentEvent(); - - // Invoked when the tooltip text changes for the specified views. - void TooltipTextChanged(View* view); - - // Sets-up the focus manager with the view that should have focus when the - // window is shown the first time. Returns true if the initial focus has been - // set or the widget should not set the initial focus, or false if the caller - // should set the initial focus (if any). - bool SetInitialFocus(); - - void set_focus_on_creation(bool focus_on_creation) { - focus_on_creation_ = focus_on_creation; - } - - // Converts the |point| in ancestor's coordinate to this widget's coordinates. - // Returns false if |ancestor| is not an ancestor of this widget. - // The receiver has to be pure views widget (NativeWidgetViews) and - // ancestor can be of any type. - bool ConvertPointFromAncestor( - const Widget* ancestor, gfx::Point* point) const; - - // Returns a View* that any child Widgets backed by NativeWidgetViews - // are added to. The default implementation returns the contents view - // if it exists and the root view otherwise. - virtual View* GetChildViewParent(); - - // True if the widget is considered top level widget. Top level widget - // is a widget of TYPE_WINDOW, TYPE_WINDOW_FRAMELESS, BUBBLE, POPUP or MENU, - // and has a focus manager and input method object associated with it. - // TYPE_CONTROL and TYPE_TOOLTIP is not considered top level. - bool is_top_level() const { return is_top_level_; } - - // Returns the bounds of work area in the screen that Widget belongs to. - gfx::Rect GetWorkAreaBoundsInScreen() const; - - // Overridden from NativeWidgetDelegate: - virtual bool IsModal() const OVERRIDE; - virtual bool IsDialogBox() const OVERRIDE; - virtual bool CanActivate() const OVERRIDE; - virtual bool IsInactiveRenderingDisabled() const OVERRIDE; - virtual void EnableInactiveRendering() OVERRIDE; - virtual void OnNativeWidgetActivationChanged(bool active) OVERRIDE; - virtual void OnNativeFocus(gfx::NativeView focused_view) OVERRIDE; - virtual void OnNativeBlur(gfx::NativeView focused_view) OVERRIDE; - virtual void OnNativeWidgetVisibilityChanged(bool visible) OVERRIDE; - virtual void OnNativeWidgetCreated() OVERRIDE; - virtual void OnNativeWidgetDestroying() OVERRIDE; - virtual void OnNativeWidgetDestroyed() OVERRIDE; - virtual gfx::Size GetMinimumSize() OVERRIDE; - virtual void OnNativeWidgetSizeChanged(const gfx::Size& new_size) OVERRIDE; - virtual void OnNativeWidgetBeginUserBoundsChange() OVERRIDE; - virtual void OnNativeWidgetEndUserBoundsChange() OVERRIDE; - virtual bool HasFocusManager() const OVERRIDE; - virtual bool OnNativeWidgetPaintAccelerated( - const gfx::Rect& dirty_region) OVERRIDE; - virtual void OnNativeWidgetPaint(gfx::Canvas* canvas) OVERRIDE; - virtual int GetNonClientComponent(const gfx::Point& point) OVERRIDE; - virtual bool OnKeyEvent(const KeyEvent& event) OVERRIDE; - virtual bool OnMouseEvent(const MouseEvent& event) OVERRIDE; - virtual void OnMouseCaptureLost() OVERRIDE; - virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE; - virtual bool ExecuteCommand(int command_id) OVERRIDE; - virtual InputMethod* GetInputMethodDirect() OVERRIDE; - virtual Widget* AsWidget() OVERRIDE; - virtual const Widget* AsWidget() const OVERRIDE; - - // Overridden from FocusTraversable: - virtual FocusSearch* GetFocusSearch() OVERRIDE; - virtual FocusTraversable* GetFocusTraversableParent() OVERRIDE; - virtual View* GetFocusTraversableParentView() OVERRIDE; - - protected: - // Creates the RootView to be used within this Widget. Subclasses may override - // to create custom RootViews that do specialized event processing. - // TODO(beng): Investigate whether or not this is needed. - virtual internal::RootView* CreateRootView(); - - // Provided to allow the NativeWidget implementations to destroy the RootView - // _before_ the focus manager/tooltip manager. - // TODO(beng): remove once we fold those objects onto this one. - void DestroyRootView(); - - private: - // TODO(beng): Remove NativeWidgetGtk's dependence on the mouse state flags. - friend class NativeWidgetGtk; - - friend class NativeTextfieldViewsTest; - friend class NativeComboboxViewsTest; - friend class ScopedEvent; - - // Returns whether capture should be released on mouse release. - virtual bool ShouldReleaseCaptureOnMouseReleased() const; - - // Sets the value of |disable_inactive_rendering_|. If the value changes, - // both the NonClientView and WidgetDelegate are notified. - void SetInactiveRenderingDisabled(bool value); - - // Persists the window's restored position and "show" state using the - // window delegate. - void SaveWindowPlacement(); - - // Sizes and positions the window just after it is created. - void SetInitialBounds(const gfx::Rect& bounds); - - // Returns the bounds and "show" state from the delegate. Returns true if - // the delegate wants to use a specified bounds. - bool GetSavedWindowPlacement(gfx::Rect* bounds, - ui::WindowShowState* show_state); - - // Sets a different InputMethod instance to this widget. The instance - // must not be initialized, the ownership will be assumed by the widget. - // It's only for testing purpose. - void ReplaceInputMethod(InputMethod* input_method); - - internal::NativeWidgetPrivate* native_widget_; - - ObserverList<Observer> observers_; - - // Non-owned pointer to the Widget's delegate. May be NULL if no delegate is - // being used. - WidgetDelegate* widget_delegate_; - - // The root of the View hierarchy attached to this window. - // WARNING: see warning in tooltip_manager_ for ordering dependencies with - // this and tooltip_manager_. - scoped_ptr<internal::RootView> root_view_; - - // The View that provides the non-client area of the window (title bar, - // window controls, sizing borders etc). To use an implementation other than - // the default, this class must be sub-classed and this value set to the - // desired implementation before calling |InitWindow()|. - NonClientView* non_client_view_; - - // The focus manager keeping track of focus for this Widget and any of its - // children. NULL for non top-level widgets. - // WARNING: RootView's destructor calls into the FocusManager. As such, this - // must be destroyed AFTER root_view_. This is enforced in DestroyRootView(). - scoped_ptr<FocusManager> focus_manager_; - - // A theme provider to use when no other theme provider is specified. - scoped_ptr<DefaultThemeProvider> default_theme_provider_; - - // Valid for the lifetime of RunShellDrag(), indicates the view the drag - // started from. - View* dragged_view_; - - // The event stack. - std::stack<ScopedEvent*> event_stack_; - - // See class documentation for Widget above for a note about ownership. - InitParams::Ownership ownership_; - - // See set_is_secondary_widget(). - bool is_secondary_widget_; - - // The current frame type in use by this window. Defaults to - // FRAME_TYPE_DEFAULT. - FrameType frame_type_; - - // True when the window should be rendered as active, regardless of whether - // or not it actually is. - bool disable_inactive_rendering_; - - // Set to true if the widget is in the process of closing. - bool widget_closed_; - - // The saved "show" state for this window. See note in SetInitialBounds - // that explains why we save this. - ui::WindowShowState saved_show_state_; - - // The restored bounds used for the initial show. This is only used if - // |saved_show_state_| is maximized. - gfx::Rect initial_restored_bounds_; - - // Focus is automatically set to the view provided by the delegate - // when the widget is shown. Set this value to false to override - // initial focus for the widget. - bool focus_on_creation_; - - scoped_ptr<InputMethod> input_method_; - - // See |is_top_level()| accessor. - bool is_top_level_; - - // Tracks whether native widget has been initialized. - bool native_widget_initialized_; - - // TODO(beng): Remove NativeWidgetGtk's dependence on these: - // If true, the mouse is currently down. - bool is_mouse_button_pressed_; - - // TODO(beng): Remove NativeWidgetGtk's dependence on these: - // The following are used to detect duplicate mouse move events and not - // deliver them. Displaying a window may result in the system generating - // duplicate move events even though the mouse hasn't moved. - bool last_mouse_event_was_move_; - gfx::Point last_mouse_event_position_; - - DISALLOW_COPY_AND_ASSIGN(Widget); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_WIDGET_H_ diff --git a/ui/views/widget/widget_delegate.cc b/ui/views/widget/widget_delegate.cc deleted file mode 100644 index 94ebcf1..0000000 --- a/ui/views/widget/widget_delegate.cc +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/widget_delegate.h" - -#include "base/utf_string_conversions.h" -#include "third_party/skia/include/core/SkBitmap.h" -#include "ui/views/bubble/bubble_delegate.h" -#include "ui/views/widget/widget.h" -#include "ui/views/window/client_view.h" -#include "views/view.h" -#include "views/views_delegate.h" - -namespace views { - -//////////////////////////////////////////////////////////////////////////////// -// WidgetDelegate: - -WidgetDelegate::WidgetDelegate() : default_contents_view_(NULL) { -} - -void WidgetDelegate::OnWidgetMove() { -} - -void WidgetDelegate::OnDisplayChanged() { -} - -void WidgetDelegate::OnWorkAreaChanged() { -} - -View* WidgetDelegate::GetInitiallyFocusedView() { - return NULL; -} - -BubbleDelegateView* WidgetDelegate::AsBubbleDelegate() { - return NULL; -} - -DialogDelegate* WidgetDelegate::AsDialogDelegate() { - return NULL; -} - -bool WidgetDelegate::CanResize() const { - return false; -} - -bool WidgetDelegate::CanMaximize() const { - return false; -} - -bool WidgetDelegate::CanActivate() const { - return true; -} - -bool WidgetDelegate::IsModal() const { - return false; -} - -ui::AccessibilityTypes::Role WidgetDelegate::GetAccessibleWindowRole() const { - return ui::AccessibilityTypes::ROLE_WINDOW; -} - -ui::AccessibilityTypes::State WidgetDelegate::GetAccessibleWindowState() const { - return 0; -} - -string16 WidgetDelegate::GetAccessibleWindowTitle() const { - return GetWindowTitle(); -} - -string16 WidgetDelegate::GetWindowTitle() const { - return string16(); -} - -bool WidgetDelegate::ShouldShowWindowTitle() const { - return true; -} - -bool WidgetDelegate::ShouldShowClientEdge() const { - return true; -} - -SkBitmap WidgetDelegate::GetWindowAppIcon() { - // Use the window icon as app icon by default. - return GetWindowIcon(); -} - -// Returns the icon to be displayed in the window. -SkBitmap WidgetDelegate::GetWindowIcon() { - return SkBitmap(); -} - -bool WidgetDelegate::ShouldShowWindowIcon() const { - return false; -} - -bool WidgetDelegate::ExecuteWindowsCommand(int command_id) { - return false; -} - -std::string WidgetDelegate::GetWindowName() const { - return std::string(); -} - -void WidgetDelegate::SaveWindowPlacement(const gfx::Rect& bounds, - ui::WindowShowState show_state) { - std::string window_name = GetWindowName(); - if (!ViewsDelegate::views_delegate || window_name.empty()) - return; - - ViewsDelegate::views_delegate->SaveWindowPlacement( - GetWidget(), window_name, bounds, show_state); -} - -bool WidgetDelegate::GetSavedWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* show_state) const { - std::string window_name = GetWindowName(); - if (!ViewsDelegate::views_delegate || window_name.empty()) - return false; - - return ViewsDelegate::views_delegate->GetSavedWindowPlacement( - window_name, bounds, show_state); -} - -bool WidgetDelegate::ShouldRestoreWindowSize() const { - return true; -} - -View* WidgetDelegate::GetContentsView() { - if (!default_contents_view_) - default_contents_view_ = new View; - return default_contents_view_; -} - -ClientView* WidgetDelegate::CreateClientView(Widget* widget) { - return new ClientView(widget, GetContentsView()); -} - -NonClientFrameView* WidgetDelegate::CreateNonClientFrameView() { - return NULL; -} - -bool WidgetDelegate::WillProcessWorkAreaChange() const { - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// WidgetDelegateView: - -WidgetDelegateView::WidgetDelegateView() { -} - -WidgetDelegateView::~WidgetDelegateView() { -} - -Widget* WidgetDelegateView::GetWidget() { - return View::GetWidget(); -} - -const Widget* WidgetDelegateView::GetWidget() const { - return View::GetWidget(); -} - -} // namespace views diff --git a/ui/views/widget/widget_delegate.h b/ui/views/widget/widget_delegate.h deleted file mode 100644 index b771d33..0000000 --- a/ui/views/widget/widget_delegate.h +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_WIDGET_DELEGATE_H_ -#define UI_VIEWS_WIDGET_WIDGET_DELEGATE_H_ -#pragma once - -#include <string> - -#include "base/memory/scoped_ptr.h" -#include "ui/base/accessibility/accessibility_types.h" -#include "ui/base/ui_base_types.h" -#include "views/view.h" - -class SkBitmap; - -namespace gfx { -class Rect; -} - -namespace views { -class BubbleDelegateView; -class ClientView; -class DialogDelegate; -class NonClientFrameView; -class View; -class Widget; - -// WidgetDelegate interface -// Handles events on Widgets in context-specific ways. -class VIEWS_EXPORT WidgetDelegate { - public: - WidgetDelegate(); - - // Called whenever the widget's position changes. - virtual void OnWidgetMove(); - - // Called with the display changes (color depth or resolution). - virtual void OnDisplayChanged(); - - // Called when the work area (the desktop area minus task bars, - // menu bars, etc.) changes in size. - virtual void OnWorkAreaChanged(); - - // Returns the view that should have the focus when the widget is shown. If - // NULL no view is focused. - virtual View* GetInitiallyFocusedView(); - - // Moved from WindowDelegate: ------------------------------------------------ - // TODO(beng): sort - - virtual BubbleDelegateView* AsBubbleDelegate(); - virtual DialogDelegate* AsDialogDelegate(); - - // Returns true if the window can ever be resized. - virtual bool CanResize() const; - - // Returns true if the window can ever be maximized. - virtual bool CanMaximize() const; - - // Returns true if the window can be activated. - virtual bool CanActivate() const; - - // Returns true if the dialog should be displayed modally to the window that - // opened it. Only windows with WindowType == DIALOG can be modal. - virtual bool IsModal() const; - - virtual ui::AccessibilityTypes::Role GetAccessibleWindowRole() const; - - virtual ui::AccessibilityTypes::State GetAccessibleWindowState() const; - - // Returns the title to be read with screen readers. - virtual string16 GetAccessibleWindowTitle() const; - - // Returns the text to be displayed in the window title. - virtual string16 GetWindowTitle() const; - - // Returns true if the window should show a title in the title bar. - virtual bool ShouldShowWindowTitle() const; - - // Returns true if the window's client view wants a client edge. - virtual bool ShouldShowClientEdge() const; - - // Returns the app icon for the window. On Windows, this is the ICON_BIG used - // in Alt-Tab list and Win7's taskbar. - virtual SkBitmap GetWindowAppIcon(); - - // Returns the icon to be displayed in the window. - virtual SkBitmap GetWindowIcon(); - - // Returns true if a window icon should be shown. - virtual bool ShouldShowWindowIcon() const; - - // Execute a command in the window's controller. Returns true if the command - // was handled, false if it was not. - virtual bool ExecuteWindowsCommand(int command_id); - - // Returns the window's name identifier. Used to identify this window for - // state restoration. - virtual std::string GetWindowName() const; - - // Saves the window's bounds and "show" state. By default this uses the - // process' local state keyed by window name (See GetWindowName above). This - // behavior can be overridden to provide additional functionality. - virtual void SaveWindowPlacement(const gfx::Rect& bounds, - ui::WindowShowState show_state); - - // Retrieves the window's bounds and "show" states. - // This behavior can be overridden to provide additional functionality. - virtual bool GetSavedWindowPlacement(gfx::Rect* bounds, - ui::WindowShowState* show_state) const; - - // Returns true if the window's size should be restored. If this is false, - // only the window's origin is restored and the window is given its - // preferred size. - // Default is true. - virtual bool ShouldRestoreWindowSize() const; - - // Called when the window closes. The delegate MUST NOT delete itself during - // this call, since it can be called afterwards. See DeleteDelegate(). - virtual void WindowClosing() {} - - // Called when the window is destroyed. No events must be sent or received - // after this point. The delegate can use this opportunity to delete itself at - // this time if necessary. - virtual void DeleteDelegate() {} - - // Called when the user begins/ends to change the bounds of the window. - virtual void OnWindowBeginUserBoundsChange() {} - virtual void OnWindowEndUserBoundsChange() {} - - // Returns the Widget associated with this delegate. - virtual Widget* GetWidget() = 0; - virtual const Widget* GetWidget() const = 0; - - // Returns the View that is contained within this Widget. - virtual View* GetContentsView(); - - // Called by the Widget to create the Client View used to host the contents - // of the widget. - virtual ClientView* CreateClientView(Widget* widget); - - // Called by the Widget to create the NonClient Frame View for this widget. - // Return NULL to use the default one. - virtual NonClientFrameView* CreateNonClientFrameView(); - - // Returns true if the window can be notified with the work area change. - // Otherwise, the work area change for the top window will be processed by - // the default window manager. In some cases, like panel, we would like to - // manage the positions by ourselves. - virtual bool WillProcessWorkAreaChange() const; - - protected: - virtual ~WidgetDelegate() {} - - private: - View* default_contents_view_; - - DISALLOW_COPY_AND_ASSIGN(WidgetDelegate); -}; - -// A WidgetDelegate implementation that is-a View. Used to override GetWidget() -// to call View's GetWidget() for the common case where a WidgetDelegate -// implementation is-a View. -class VIEWS_EXPORT WidgetDelegateView : public WidgetDelegate, public View { - public: - WidgetDelegateView(); - virtual ~WidgetDelegateView(); - - // Overridden from WidgetDelegate: - virtual Widget* GetWidget() OVERRIDE; - virtual const Widget* GetWidget() const OVERRIDE; - - private: - DISALLOW_COPY_AND_ASSIGN(WidgetDelegateView); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_WIDGET_DELEGATE_H_ diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc deleted file mode 100644 index 90632c6..0000000 --- a/ui/views/widget/widget_unittest.cc +++ /dev/null @@ -1,829 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/message_loop.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/point.h" -#include "ui/views/test/test_views_delegate.h" -#include "ui/views/test/views_test_base.h" -#include "ui/views/widget/native_widget_delegate.h" -#include "views/views_delegate.h" - -#if defined(USE_AURA) -#include "ui/aura/window.h" -#include "ui/views/widget/native_widget_aura.h" -#elif defined(OS_WIN) -#include "ui/views/widget/native_widget_win.h" -#elif defined(TOOLKIT_USES_GTK) -#include "ui/views/widget/native_widget_gtk.h" -#endif - -namespace views { -namespace { - -// A generic typedef to pick up relevant NativeWidget implementations. -#if defined(USE_AURA) -typedef NativeWidgetAura NativeWidgetPlatform; -#elif defined(OS_WIN) -typedef NativeWidgetWin NativeWidgetPlatform; -#elif defined(TOOLKIT_USES_GTK) -typedef NativeWidgetGtk NativeWidgetPlatform; -#endif - -// A widget that assumes mouse capture always works. It won't on Gtk/Aura in -// testing, so we mock it. -#if defined(TOOLKIT_USES_GTK) || defined(USE_AURA) -class NativeWidgetCapture : public NativeWidgetPlatform { - public: - NativeWidgetCapture(internal::NativeWidgetDelegate* delegate) - : NativeWidgetPlatform(delegate), - mouse_capture_(false) {} - virtual ~NativeWidgetCapture() {} - - virtual void SetMouseCapture() OVERRIDE { - mouse_capture_ = true; - } - virtual void ReleaseMouseCapture() OVERRIDE { - if (mouse_capture_) - delegate()->OnMouseCaptureLost(); - mouse_capture_ = false; - } - virtual bool HasMouseCapture() const OVERRIDE { - return mouse_capture_; - } - - private: - bool mouse_capture_; - - DISALLOW_COPY_AND_ASSIGN(NativeWidgetCapture); -}; -#endif - -// A typedef that inserts our mock-capture NativeWidget implementation for -// relevant platforms. -#if defined(USE_AURA) -typedef NativeWidgetCapture NativeWidgetPlatformForTest; -#elif defined(OS_WIN) -typedef NativeWidgetWin NativeWidgetPlatformForTest; -#elif defined(TOOLKIT_USES_GTK) -typedef NativeWidgetCapture NativeWidgetPlatformForTest; -#endif - -// A view that always processes all mouse events. -class MouseView : public View { - public: - MouseView() : View() { - } - virtual ~MouseView() {} - - virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE { - return true; - } -}; - -typedef ViewsTestBase WidgetTest; - -NativeWidget* CreatePlatformNativeWidget( - internal::NativeWidgetDelegate* delegate) { - return new NativeWidgetPlatformForTest(delegate); -} - -Widget* CreateTopLevelPlatformWidget() { - Widget* toplevel = new Widget; - Widget::InitParams toplevel_params(Widget::InitParams::TYPE_WINDOW); - toplevel_params.native_widget = CreatePlatformNativeWidget(toplevel); - toplevel->Init(toplevel_params); - return toplevel; -} - -Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view) { - Widget* child = new Widget; - Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); - child_params.native_widget = CreatePlatformNativeWidget(child); - child_params.parent = parent_native_view; - child->Init(child_params); - child->SetContentsView(new View); - return child; -} - -#if defined(OS_WIN) && !defined(USE_AURA) -// On Windows, it is possible for us to have a child window that is TYPE_POPUP. -Widget* CreateChildPopupPlatformWidget(gfx::NativeView parent_native_view) { - Widget* child = new Widget; - Widget::InitParams child_params(Widget::InitParams::TYPE_POPUP); - child_params.child = true; - child_params.native_widget = CreatePlatformNativeWidget(child); - child_params.parent = parent_native_view; - child->Init(child_params); - child->SetContentsView(new View); - return child; -} -#endif - -Widget* CreateTopLevelNativeWidget() { - Widget* toplevel = new Widget; - Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - toplevel->Init(params); - toplevel->SetContentsView(new View); - return toplevel; -} - -Widget* CreateChildNativeWidgetWithParent(Widget* parent) { - Widget* child = new Widget; - Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); - params.parent_widget = parent; - child->Init(params); - child->SetContentsView(new View); - return child; -} - -Widget* CreateChildNativeWidget() { - return CreateChildNativeWidgetWithParent(NULL); -} - -bool WidgetHasMouseCapture(const Widget* widget) { - return static_cast<const internal::NativeWidgetPrivate*>(widget-> - native_widget())->HasMouseCapture(); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget::GetTopLevelWidget tests. - -TEST_F(WidgetTest, GetTopLevelWidget_Native) { - // Create a hierarchy of native widgets. - Widget* toplevel = CreateTopLevelPlatformWidget(); -#if defined(TOOLKIT_USES_GTK) - NativeWidgetGtk* native_widget = - static_cast<NativeWidgetGtk*>(toplevel->native_widget()); - gfx::NativeView parent = native_widget->window_contents(); -#else - gfx::NativeView parent = toplevel->GetNativeView(); -#endif - Widget* child = CreateChildPlatformWidget(parent); - - EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); - EXPECT_EQ(toplevel, child->GetTopLevelWidget()); - - toplevel->CloseNow(); - // |child| should be automatically destroyed with |toplevel|. -} - -TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) { - // Create a hierarchy consisting of a top level platform native widget and a - // child NativeWidget. - Widget* toplevel = CreateTopLevelPlatformWidget(); - Widget* child = CreateTopLevelNativeWidget(); - - EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); - EXPECT_EQ(child, child->GetTopLevelWidget()); - - toplevel->CloseNow(); - // |child| should be automatically destroyed with |toplevel|. -} - -// Creates a hierarchy consisting of a desktop platform native widget, a -// toplevel NativeWidget, and a child of that toplevel, another NativeWidget. -TEST_F(WidgetTest, GetTopLevelWidget_SyntheticDesktop) { - // Create a hierarchy consisting of a desktop platform native widget, - // a toplevel NativeWidget and a chlid NativeWidget. - Widget* desktop = CreateTopLevelPlatformWidget(); - Widget* toplevel = CreateTopLevelNativeWidget(); // Will be parented - // automatically to - // |toplevel|. - - Widget* child = CreateChildNativeWidgetWithParent(toplevel); - - EXPECT_EQ(desktop, desktop->GetTopLevelWidget()); - EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); - EXPECT_EQ(toplevel, child->GetTopLevelWidget()); - - desktop->CloseNow(); - // |toplevel|, |child| should be automatically destroyed with |toplevel|. -} - -// Tests some grab/ungrab events. -TEST_F(WidgetTest, DISABLED_GrabUngrab) { - Widget* toplevel = CreateTopLevelPlatformWidget(); - Widget* child1 = CreateChildNativeWidgetWithParent(toplevel); - Widget* child2 = CreateChildNativeWidgetWithParent(toplevel); - - toplevel->SetBounds(gfx::Rect(0, 0, 500, 500)); - - child1->SetBounds(gfx::Rect(10, 10, 300, 300)); - View* view = new MouseView(); - view->SetBounds(0, 0, 300, 300); - child1->GetRootView()->AddChildView(view); - - child2->SetBounds(gfx::Rect(200, 10, 200, 200)); - view = new MouseView(); - view->SetBounds(0, 0, 200, 200); - child2->GetRootView()->AddChildView(view); - - toplevel->Show(); - RunPendingMessages(); - - // Click on child1 - MouseEvent pressed(ui::ET_MOUSE_PRESSED, 45, 45, ui::EF_LEFT_BUTTON_DOWN); - toplevel->OnMouseEvent(pressed); - - EXPECT_TRUE(WidgetHasMouseCapture(toplevel)); - EXPECT_TRUE(WidgetHasMouseCapture(child1)); - EXPECT_FALSE(WidgetHasMouseCapture(child2)); - - MouseEvent released(ui::ET_MOUSE_RELEASED, 45, 45, ui::EF_LEFT_BUTTON_DOWN); - toplevel->OnMouseEvent(released); - - EXPECT_FALSE(WidgetHasMouseCapture(toplevel)); - EXPECT_FALSE(WidgetHasMouseCapture(child1)); - EXPECT_FALSE(WidgetHasMouseCapture(child2)); - - RunPendingMessages(); - - // Click on child2 - MouseEvent pressed2(ui::ET_MOUSE_PRESSED, 315, 45, ui::EF_LEFT_BUTTON_DOWN); - EXPECT_TRUE(toplevel->OnMouseEvent(pressed2)); - EXPECT_TRUE(WidgetHasMouseCapture(toplevel)); - EXPECT_TRUE(WidgetHasMouseCapture(child2)); - EXPECT_FALSE(WidgetHasMouseCapture(child1)); - - MouseEvent released2(ui::ET_MOUSE_RELEASED, 315, 45, ui::EF_LEFT_BUTTON_DOWN); - toplevel->OnMouseEvent(released2); - EXPECT_FALSE(WidgetHasMouseCapture(toplevel)); - EXPECT_FALSE(WidgetHasMouseCapture(child1)); - EXPECT_FALSE(WidgetHasMouseCapture(child2)); - - toplevel->CloseNow(); -} - -// Test if a focus manager and an inputmethod work without CHECK failure -// when window activation changes. -TEST_F(WidgetTest, ChangeActivation) { - Widget* top1 = CreateTopLevelPlatformWidget(); - // CreateInputMethod before activated - top1->GetInputMethod(); - top1->Show(); - RunPendingMessages(); - - Widget* top2 = CreateTopLevelPlatformWidget(); - top2->Show(); - RunPendingMessages(); - - top1->Activate(); - RunPendingMessages(); - - // Create InputMethod after deactivated. - top2->GetInputMethod(); - top2->Activate(); - RunPendingMessages(); - - top1->Activate(); - RunPendingMessages(); - - top1->CloseNow(); - top2->CloseNow(); -} - -// Tests visibility of child widgets. -TEST_F(WidgetTest, Visibility) { - Widget* toplevel = CreateTopLevelPlatformWidget(); -#if defined(TOOLKIT_USES_GTK) - NativeWidgetGtk* native_widget = - static_cast<NativeWidgetGtk*>(toplevel->native_widget()); - gfx::NativeView parent = native_widget->window_contents(); -#else - gfx::NativeView parent = toplevel->GetNativeView(); -#endif - Widget* child = CreateChildPlatformWidget(parent); - - EXPECT_FALSE(toplevel->IsVisible()); - EXPECT_FALSE(child->IsVisible()); - - child->Show(); - - EXPECT_FALSE(toplevel->IsVisible()); - EXPECT_FALSE(child->IsVisible()); - - toplevel->Show(); - - EXPECT_TRUE(toplevel->IsVisible()); - EXPECT_TRUE(child->IsVisible()); - - toplevel->CloseNow(); - // |child| should be automatically destroyed with |toplevel|. -} - -#if defined(OS_WIN) && !defined(USE_AURA) -// On Windows, it is possible to have child window that are TYPE_POPUP. Unlike -// regular child windows, these should be created as hidden and must be shown -// explicitly. -TEST_F(WidgetTest, Visibility_ChildPopup) { - Widget* toplevel = CreateTopLevelPlatformWidget(); - Widget* child_popup = CreateChildPopupPlatformWidget( - toplevel->GetNativeView()); - - EXPECT_FALSE(toplevel->IsVisible()); - EXPECT_FALSE(child_popup->IsVisible()); - - toplevel->Show(); - - EXPECT_TRUE(toplevel->IsVisible()); - EXPECT_FALSE(child_popup->IsVisible()); - - child_popup->Show(); - - EXPECT_TRUE(child_popup->IsVisible()); - - toplevel->CloseNow(); - // |child_popup| should be automatically destroyed with |toplevel|. -} -#endif - -// Tests visibility of synthetic child widgets. -TEST_F(WidgetTest, Visibility_Synthetic) { - // Create a hierarchy consisting of a desktop platform native widget, - // a toplevel NativeWidget and a chlid NativeWidget. - Widget* desktop = CreateTopLevelPlatformWidget(); - desktop->Show(); - - Widget* toplevel = CreateTopLevelNativeWidget(); // Will be parented - // automatically to - // |toplevel|. - - Widget* child = CreateChildNativeWidgetWithParent(toplevel); - - EXPECT_FALSE(toplevel->IsVisible()); - EXPECT_FALSE(child->IsVisible()); - - child->Show(); - - EXPECT_FALSE(toplevel->IsVisible()); - EXPECT_FALSE(child->IsVisible()); - - toplevel->Show(); - - EXPECT_TRUE(toplevel->IsVisible()); - EXPECT_TRUE(child->IsVisible()); - - desktop->CloseNow(); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget ownership tests. -// -// Tests various permutations of Widget ownership specified in the -// InitParams::Ownership param. - -// A WidgetTest that supplies a toplevel widget for NativeWidget to parent to. -class WidgetOwnershipTest : public WidgetTest { - public: - WidgetOwnershipTest() {} - virtual ~WidgetOwnershipTest() {} - - virtual void SetUp() { - WidgetTest::SetUp(); - desktop_widget_ = CreateTopLevelPlatformWidget(); - } - - virtual void TearDown() { - desktop_widget_->CloseNow(); - WidgetTest::TearDown(); - } - - private: - Widget* desktop_widget_; - - DISALLOW_COPY_AND_ASSIGN(WidgetOwnershipTest); -}; - -// A bag of state to monitor destructions. -struct OwnershipTestState { - OwnershipTestState() : widget_deleted(false), native_widget_deleted(false) {} - - bool widget_deleted; - bool native_widget_deleted; -}; - -// A platform NativeWidget subclass that updates a bag of state when it is -// destroyed. -class OwnershipTestNativeWidget : public NativeWidgetPlatform { - public: - OwnershipTestNativeWidget(internal::NativeWidgetDelegate* delegate, - OwnershipTestState* state) - : NativeWidgetPlatform(delegate), - state_(state) { - } - virtual ~OwnershipTestNativeWidget() { - state_->native_widget_deleted = true; - } - - private: - OwnershipTestState* state_; - - DISALLOW_COPY_AND_ASSIGN(OwnershipTestNativeWidget); -}; - -// A views NativeWidget subclass that updates a bag of state when it is -// destroyed. -class OwnershipTestNativeWidgetPlatform : public NativeWidgetPlatformForTest { - public: - OwnershipTestNativeWidgetPlatform(internal::NativeWidgetDelegate* delegate, - OwnershipTestState* state) - : NativeWidgetPlatformForTest(delegate), - state_(state) { - } - virtual ~OwnershipTestNativeWidgetPlatform() { - state_->native_widget_deleted = true; - } - - private: - OwnershipTestState* state_; - - DISALLOW_COPY_AND_ASSIGN(OwnershipTestNativeWidgetPlatform); -}; - -// A Widget subclass that updates a bag of state when it is destroyed. -class OwnershipTestWidget : public Widget { - public: - OwnershipTestWidget(OwnershipTestState* state) : state_(state) {} - virtual ~OwnershipTestWidget() { - state_->widget_deleted = true; - } - - private: - OwnershipTestState* state_; - - DISALLOW_COPY_AND_ASSIGN(OwnershipTestWidget); -}; - -// Widget owns its NativeWidget, part 1: NativeWidget is a platform-native -// widget. -TEST_F(WidgetOwnershipTest, Ownership_WidgetOwnsPlatformNativeWidget) { - OwnershipTestState state; - - scoped_ptr<Widget> widget(new OwnershipTestWidget(&state)); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.native_widget = - new OwnershipTestNativeWidgetPlatform(widget.get(), &state); - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - widget->Init(params); - - // Now delete the Widget, which should delete the NativeWidget. - widget.reset(); - - EXPECT_TRUE(state.widget_deleted); - EXPECT_TRUE(state.native_widget_deleted); - - // TODO(beng): write test for this ownership scenario and the NativeWidget - // being deleted out from under the Widget. -} - -// Widget owns its NativeWidget, part 2: NativeWidget is a NativeWidget. -TEST_F(WidgetOwnershipTest, Ownership_WidgetOwnsViewsNativeWidget) { - OwnershipTestState state; - - scoped_ptr<Widget> widget(new OwnershipTestWidget(&state)); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.native_widget = - new OwnershipTestNativeWidgetPlatform(widget.get(), &state); - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - widget->Init(params); - - // Now delete the Widget, which should delete the NativeWidget. - widget.reset(); - - EXPECT_TRUE(state.widget_deleted); - EXPECT_TRUE(state.native_widget_deleted); - - // TODO(beng): write test for this ownership scenario and the NativeWidget - // being deleted out from under the Widget. -} - -// Widget owns its NativeWidget, part 3: NativeWidget is a NativeWidget, -// destroy the parent view. -TEST_F(WidgetOwnershipTest, - Ownership_WidgetOwnsViewsNativeWidget_DestroyParentView) { - OwnershipTestState state; - - Widget* toplevel = CreateTopLevelPlatformWidget(); - - scoped_ptr<Widget> widget(new OwnershipTestWidget(&state)); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.native_widget = - new OwnershipTestNativeWidgetPlatform(widget.get(), &state); - params.parent_widget = toplevel; - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - widget->Init(params); - - // Now close the toplevel, which deletes the view hierarchy. - toplevel->CloseNow(); - - RunPendingMessages(); - - // This shouldn't delete the widget because it shouldn't be deleted - // from the native side. - EXPECT_FALSE(state.widget_deleted); - EXPECT_FALSE(state.native_widget_deleted); - - // Now delete it explicitly. - widget.reset(); - - EXPECT_TRUE(state.widget_deleted); - EXPECT_TRUE(state.native_widget_deleted); -} - -// NativeWidget owns its Widget, part 1: NativeWidget is a platform-native -// widget. -TEST_F(WidgetOwnershipTest, Ownership_PlatformNativeWidgetOwnsWidget) { - OwnershipTestState state; - - Widget* widget = new OwnershipTestWidget(&state); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.native_widget = - new OwnershipTestNativeWidgetPlatform(widget, &state); - widget->Init(params); - - // Now destroy the native widget. - widget->CloseNow(); - - EXPECT_TRUE(state.widget_deleted); - EXPECT_TRUE(state.native_widget_deleted); -} - -// NativeWidget owns its Widget, part 2: NativeWidget is a NativeWidget. -#if defined(OS_CHROMEOS) && defined(TOOLKIT_USES_GTK) -// Temporarily disable the test (http://crbug.com/104945). -TEST_F(WidgetOwnershipTest, DISABLED_Ownership_ViewsNativeWidgetOwnsWidget) { -#else -TEST_F(WidgetOwnershipTest, Ownership_ViewsNativeWidgetOwnsWidget) { -#endif - OwnershipTestState state; - - Widget* toplevel = CreateTopLevelPlatformWidget(); - - Widget* widget = new OwnershipTestWidget(&state); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.native_widget = - new OwnershipTestNativeWidgetPlatform(widget, &state); - params.parent_widget = toplevel; - widget->Init(params); - - // Now destroy the native widget. This is achieved by closing the toplevel. - toplevel->CloseNow(); - - // The NativeWidget won't be deleted until after a return to the message loop - // so we have to run pending messages before testing the destruction status. - RunPendingMessages(); - - EXPECT_TRUE(state.widget_deleted); - EXPECT_TRUE(state.native_widget_deleted); -} - -// NativeWidget owns its Widget, part 3: NativeWidget is a platform-native -// widget, destroyed out from under it by the OS. -TEST_F(WidgetOwnershipTest, - Ownership_PlatformNativeWidgetOwnsWidget_NativeDestroy) { - OwnershipTestState state; - - Widget* widget = new OwnershipTestWidget(&state); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.native_widget = - new OwnershipTestNativeWidgetPlatform(widget, &state); - widget->Init(params); - - // Now simulate a destroy of the platform native widget from the OS: -#if defined(USE_AURA) - delete widget->GetNativeView(); -#elif defined(OS_WIN) - DestroyWindow(widget->GetNativeView()); -#elif defined(TOOLKIT_USES_GTK) - gtk_widget_destroy(widget->GetNativeView()); -#endif - - EXPECT_TRUE(state.widget_deleted); - EXPECT_TRUE(state.native_widget_deleted); -} - -// NativeWidget owns its Widget, part 4: NativeWidget is a NativeWidget, -// destroyed by the view hierarchy that contains it. -#if defined(OS_CHROMEOS) && defined(TOOLKIT_USES_GTK) -// Temporarily disable the test (http://crbug.com/104945). -TEST_F(WidgetOwnershipTest, - DISABLED_Ownership_ViewsNativeWidgetOwnsWidget_NativeDestroy) { -#else -TEST_F(WidgetOwnershipTest, - Ownership_ViewsNativeWidgetOwnsWidget_NativeDestroy) { -#endif - OwnershipTestState state; - - Widget* toplevel = CreateTopLevelPlatformWidget(); - - Widget* widget = new OwnershipTestWidget(&state); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.native_widget = - new OwnershipTestNativeWidgetPlatform(widget, &state); - params.parent_widget = toplevel; - widget->Init(params); - - // Destroy the widget (achieved by closing the toplevel). - toplevel->CloseNow(); - - // The NativeWidget won't be deleted until after a return to the message loop - // so we have to run pending messages before testing the destruction status. - RunPendingMessages(); - - EXPECT_TRUE(state.widget_deleted); - EXPECT_TRUE(state.native_widget_deleted); -} - -// NativeWidget owns its Widget, part 5: NativeWidget is a NativeWidget, -// we close it directly. -TEST_F(WidgetOwnershipTest, - Ownership_ViewsNativeWidgetOwnsWidget_Close) { - OwnershipTestState state; - - Widget* toplevel = CreateTopLevelPlatformWidget(); - - Widget* widget = new OwnershipTestWidget(&state); - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.native_widget = - new OwnershipTestNativeWidgetPlatform(widget, &state); - params.parent_widget = toplevel; - widget->Init(params); - - // Destroy the widget. - widget->Close(); - toplevel->CloseNow(); - - // The NativeWidget won't be deleted until after a return to the message loop - // so we have to run pending messages before testing the destruction status. - RunPendingMessages(); - - EXPECT_TRUE(state.widget_deleted); - EXPECT_TRUE(state.native_widget_deleted); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget observer tests. -// - -class WidgetObserverTest : public WidgetTest, - Widget::Observer { - public: - WidgetObserverTest() - : active_(NULL), - widget_closed_(NULL), - widget_activated_(NULL), - widget_shown_(NULL), - widget_hidden_(NULL) { - } - - virtual ~WidgetObserverTest() {} - - virtual void OnWidgetClosing(Widget* widget) OVERRIDE { - if (active_ == widget) - active_ = NULL; - widget_closed_ = widget; - } - - virtual void OnWidgetActivationChanged(Widget* widget, - bool active) OVERRIDE { - if (active) { - if (widget_activated_) - widget_activated_->Deactivate(); - widget_activated_ = widget; - active_ = widget; - } else { - if (widget_activated_ == widget) - widget_activated_ = NULL; - widget_deactivated_ = widget; - } - } - - virtual void OnWidgetVisibilityChanged(Widget* widget, - bool visible) OVERRIDE { - if (visible) - widget_shown_ = widget; - else - widget_hidden_ = widget; - } - - void reset() { - active_ = NULL; - widget_closed_ = NULL; - widget_activated_ = NULL; - widget_deactivated_ = NULL; - widget_shown_ = NULL; - widget_hidden_ = NULL; - } - - Widget* NewWidget() { - Widget* widget = CreateTopLevelNativeWidget(); - widget->AddObserver(this); - return widget; - } - - const Widget* active() const { return active_; } - const Widget* widget_closed() const { return widget_closed_; } - const Widget* widget_activated() const { return widget_activated_; } - const Widget* widget_deactivated() const { return widget_deactivated_; } - const Widget* widget_shown() const { return widget_shown_; } - const Widget* widget_hidden() const { return widget_hidden_; } - - private: - - Widget* active_; - - Widget* widget_closed_; - Widget* widget_activated_; - Widget* widget_deactivated_; - Widget* widget_shown_; - Widget* widget_hidden_; -}; - -TEST_F(WidgetObserverTest, DISABLED_ActivationChange) { - Widget* toplevel = CreateTopLevelPlatformWidget(); - - Widget* toplevel1 = NewWidget(); - Widget* toplevel2 = NewWidget(); - - toplevel1->Show(); - toplevel2->Show(); - - reset(); - - toplevel1->Activate(); - - RunPendingMessages(); - EXPECT_EQ(toplevel1, widget_activated()); - - toplevel2->Activate(); - RunPendingMessages(); - EXPECT_EQ(toplevel1, widget_deactivated()); - EXPECT_EQ(toplevel2, widget_activated()); - EXPECT_EQ(toplevel2, active()); - - toplevel->CloseNow(); -} - -TEST_F(WidgetObserverTest, DISABLED_VisibilityChange) { - Widget* toplevel = CreateTopLevelPlatformWidget(); - - Widget* child1 = NewWidget(); - Widget* child2 = NewWidget(); - - toplevel->Show(); - child1->Show(); - child2->Show(); - - reset(); - - child1->Hide(); - EXPECT_EQ(child1, widget_hidden()); - - child2->Hide(); - EXPECT_EQ(child2, widget_hidden()); - - child1->Show(); - EXPECT_EQ(child1, widget_shown()); - - child2->Show(); - EXPECT_EQ(child2, widget_shown()); - - toplevel->CloseNow(); -} - -#if !defined(USE_AURA) && defined(OS_WIN) -// Aura needs shell to maximize/fullscreen window. -// NativeWidgetGtk doesn't implement GetRestoredBounds. -TEST_F(WidgetTest, GetRestoredBounds) { - Widget* toplevel = CreateTopLevelPlatformWidget(); - EXPECT_EQ(toplevel->GetWindowScreenBounds().ToString(), - toplevel->GetRestoredBounds().ToString()); - toplevel->Show(); - toplevel->Maximize(); - RunPendingMessages(); - EXPECT_NE(toplevel->GetWindowScreenBounds().ToString(), - toplevel->GetRestoredBounds().ToString()); - EXPECT_GT(toplevel->GetRestoredBounds().width(), 0); - EXPECT_GT(toplevel->GetRestoredBounds().height(), 0); - - toplevel->Restore(); - RunPendingMessages(); - EXPECT_EQ(toplevel->GetWindowScreenBounds().ToString(), - toplevel->GetRestoredBounds().ToString()); - - toplevel->SetFullscreen(true); - RunPendingMessages(); - EXPECT_NE(toplevel->GetWindowScreenBounds().ToString(), - toplevel->GetRestoredBounds().ToString()); - EXPECT_GT(toplevel->GetRestoredBounds().width(), 0); - EXPECT_GT(toplevel->GetRestoredBounds().height(), 0); -} -#endif - -} // namespace -} // namespace views diff --git a/ui/views/widget/window_manager.cc b/ui/views/widget/window_manager.cc deleted file mode 100644 index ead923c..0000000 --- a/ui/views/widget/window_manager.cc +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/window_manager.h" - -#include "base/compiler_specific.h" -#include "ui/views/events/event.h" -#include "ui/views/widget/widget.h" - -namespace { - -views::WindowManager* window_manager = NULL; - -class NullWindowManager : public views::WindowManager { - public: - NullWindowManager() : mouse_capture_(NULL) { - } - - virtual void StartMoveDrag(views::Widget* widget, - const gfx::Point& screen_point) OVERRIDE { - NOTIMPLEMENTED(); - } - - virtual void StartResizeDrag(views::Widget* widget, - const gfx::Point& screen_point, - int hittest_code) OVERRIDE { - NOTIMPLEMENTED(); - } - - virtual bool SetMouseCapture(views::Widget* widget) OVERRIDE { - if (mouse_capture_ == widget) - return true; - if (mouse_capture_) - return false; - mouse_capture_ = widget; - return true; - } - - virtual bool ReleaseMouseCapture(views::Widget* widget) OVERRIDE { - if (widget && mouse_capture_ != widget) - return false; - mouse_capture_ = NULL; - return true; - } - - virtual bool HasMouseCapture(const views::Widget* widget) const OVERRIDE { - return mouse_capture_ == widget; - } - - virtual bool HandleKeyEvent(views::Widget* widget, - const views::KeyEvent& event) OVERRIDE { - return false; - } - - virtual bool HandleMouseEvent(views::Widget* widget, - const views::MouseEvent& event) OVERRIDE { - if (mouse_capture_) { - views::MouseEvent translated(event, widget->GetRootView(), - mouse_capture_->GetRootView()); - mouse_capture_->OnMouseEvent(translated); - return true; - } - return false; - } - - virtual ui::TouchStatus HandleTouchEvent(views::Widget* widget, - const views::TouchEvent& event) OVERRIDE { - return ui::TOUCH_STATUS_UNKNOWN; - } - - void Register(views::Widget* widget) OVERRIDE {} - - private: - views::Widget* mouse_capture_; -}; - -} // namespace - -namespace views { - -WindowManager::WindowManager() { -} - -WindowManager::~WindowManager() { -} - -// static -void WindowManager::Install(WindowManager* wm) { - window_manager = wm; -} - -// static -WindowManager* WindowManager::Get() { - if (!window_manager) - window_manager = new NullWindowManager(); - return window_manager; -} - -} // namespace views diff --git a/ui/views/widget/window_manager.h b/ui/views/widget/window_manager.h deleted file mode 100644 index accef0a..0000000 --- a/ui/views/widget/window_manager.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIDGET_WINDOW_MANAGER_H_ -#define UI_VIEWS_WIDGET_WINDOW_MANAGER_H_ -#pragma once - -#include "base/basictypes.h" -#include "ui/base/events.h" -#include "views/views_export.h" - -namespace gfx { -class Point; -} - -namespace views { -class KeyEvent; -class MouseEvent; -class TouchEvent; -class Widget; - -// A interface to WindowManager. -class VIEWS_EXPORT WindowManager { - public: - WindowManager(); - virtual ~WindowManager(); - - // Starts moving window given by |widget|. |point| represents the - // initial location of the mouse pointer. - virtual void StartMoveDrag(Widget* widget, const gfx::Point& point) = 0; - - // Starts resizing window give by |widget|. |point| represents the - // initial location of the mouse pointer and |hittest_code| represents - // the edge of the window a user selected to resize the window. See - // ui/base/hit_test.h for the hittest_code definition. - virtual void StartResizeDrag( - Widget* widget, const gfx::Point& point, int hittest_code) = 0; - - // Sets mouse capture on |widget|. Returns false if other widget - // already has mouse capture. - virtual bool SetMouseCapture(Widget* widget) = 0; - - // Releases the mouse capture on |widget|. Returns false if |widget| - // haven't capture the mouse. - virtual bool ReleaseMouseCapture(Widget* widget) = 0; - - // Checks if the |widget| has mouse capture. - virtual bool HasMouseCapture(const Widget* widget) const = 0; - - // WindowManager handles mouse event first. It may reisze/move window, - // or send the event to widget that has mouse capture. - virtual bool HandleKeyEvent(Widget* widget, const KeyEvent& event) = 0; - - // WindowManager handles mouse event first. It may resize/move window, - // or send the event to widget that has mouse capture. - virtual bool HandleMouseEvent(Widget* widget, const MouseEvent& event) = 0; - - // WindowManager handles touch event first. It is currently used only to - // activate windows. But it can also be used to move/resize windows. - virtual ui::TouchStatus HandleTouchEvent(Widget* widget, - const TouchEvent& event) = 0; - - // Register widget to the window manager. - virtual void Register(Widget* widget) = 0; - - // Installs window manager. - static void Install(WindowManager* wm); - - // Returns installed WindowManager. - static WindowManager* Get(); - - private: - DISALLOW_COPY_AND_ASSIGN(WindowManager); -}; - -} // namespace views - -#endif // UI_VIEWS_WIDGET_WINDOW_MANAGER_H_ diff --git a/ui/views/window/client_view.cc b/ui/views/window/client_view.cc index 60992ec..0beaa89 100644 --- a/ui/views/window/client_view.cc +++ b/ui/views/window/client_view.cc @@ -7,8 +7,8 @@ #include "base/logging.h" #include "ui/base/accessibility/accessible_view_state.h" #include "ui/base/hit_test.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" +#include "views/widget/widget.h" +#include "views/widget/widget_delegate.h" namespace views { diff --git a/ui/views/window/custom_frame_view.cc b/ui/views/window/custom_frame_view.cc index 9019919..6f9cf62 100644 --- a/ui/views/window/custom_frame_view.cc +++ b/ui/views/window/custom_frame_view.cc @@ -15,15 +15,15 @@ #include "ui/gfx/canvas.h" #include "ui/gfx/font.h" #include "ui/gfx/path.h" -#include "ui/views/widget/widget_delegate.h" #include "ui/views/window/client_view.h" #include "ui/views/window/window_resources.h" #include "ui/views/window/window_shape.h" +#include "views/widget/widget_delegate.h" #if defined(USE_AURA) -#include "ui/views/widget/native_widget_aura.h" +#include "views/widget/native_widget_aura.h" #elif defined(OS_WIN) -#include "ui/views/widget/native_widget_win.h" +#include "views/widget/native_widget_win.h" #endif namespace views { diff --git a/ui/views/window/custom_frame_view.h b/ui/views/window/custom_frame_view.h index 2d2d3d4..d53eb21 100644 --- a/ui/views/window/custom_frame_view.h +++ b/ui/views/window/custom_frame_view.h @@ -6,9 +6,9 @@ #define UI_VIEWS_WINDOW_CUSTOM_FRAME_VIEW_H_ #pragma once -#include "ui/views/widget/widget.h" #include "ui/views/window/non_client_view.h" #include "views/controls/button/image_button.h" +#include "views/widget/widget.h" namespace gfx { class Canvas; diff --git a/ui/views/window/dialog_client_view.cc b/ui/views/window/dialog_client_view.cc index edd3da3..610ae8d 100644 --- a/ui/views/window/dialog_client_view.cc +++ b/ui/views/window/dialog_client_view.cc @@ -25,10 +25,10 @@ #include "ui/gfx/canvas_skia.h" #include "ui/gfx/font.h" #include "ui/views/layout/layout_constants.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/widget.h" #include "ui/views/window/dialog_delegate.h" #include "views/controls/button/text_button.h" +#include "views/widget/root_view.h" +#include "views/widget/widget.h" #if defined(OS_WIN) #include "ui/gfx/native_theme.h" diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc index 3b97b8a..8da29bb 100644 --- a/ui/views/window/dialog_delegate.cc +++ b/ui/views/window/dialog_delegate.cc @@ -5,8 +5,8 @@ #include "ui/views/window/dialog_delegate.h" #include "base/logging.h" -#include "ui/views/widget/widget.h" #include "views/controls/button/text_button.h" +#include "views/widget/widget.h" namespace views { diff --git a/ui/views/window/dialog_delegate.h b/ui/views/window/dialog_delegate.h index 88fdc31..530bbd9 100644 --- a/ui/views/window/dialog_delegate.h +++ b/ui/views/window/dialog_delegate.h @@ -9,8 +9,8 @@ #include "base/string16.h" #include "ui/base/accessibility/accessibility_types.h" #include "ui/base/ui_base_types.h" -#include "ui/views/widget/widget_delegate.h" #include "ui/views/window/dialog_client_view.h" +#include "views/widget/widget_delegate.h" namespace views { diff --git a/ui/views/window/native_frame_view.cc b/ui/views/window/native_frame_view.cc index 1605e3d..1a794ee 100644 --- a/ui/views/window/native_frame_view.cc +++ b/ui/views/window/native_frame_view.cc @@ -4,11 +4,11 @@ #include "ui/views/window/native_frame_view.h" -#include "ui/views/widget/native_widget.h" -#include "ui/views/widget/widget.h" +#include "views/widget/native_widget.h" +#include "views/widget/widget.h" #if defined(OS_WIN) && !defined(USE_AURA) -#include "ui/views/widget/native_widget_win.h" +#include "views/widget/native_widget_win.h" #endif namespace views { diff --git a/ui/views/window/non_client_view.cc b/ui/views/window/non_client_view.cc index 702042a..9e2be91 100644 --- a/ui/views/window/non_client_view.cc +++ b/ui/views/window/non_client_view.cc @@ -6,9 +6,9 @@ #include "ui/base/accessibility/accessible_view_state.h" #include "ui/base/hit_test.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/widget.h" #include "ui/views/window/client_view.h" +#include "views/widget/root_view.h" +#include "views/widget/widget.h" namespace views { |