Index: ui/views/widget/desktop_aura/desktop_root_window_host_win.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc b/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc |
deleted file mode 100644 |
index 915e225220e08e848dd1a8268a7dfa53d4ef01cd..0000000000000000000000000000000000000000 |
--- a/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc |
+++ /dev/null |
@@ -1,1024 +0,0 @@ |
-// Copyright (c) 2012 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/desktop_aura/desktop_root_window_host_win.h" |
- |
-#include "base/win/metro.h" |
-#include "third_party/skia/include/core/SkPath.h" |
-#include "third_party/skia/include/core/SkRegion.h" |
-#include "ui/aura/client/aura_constants.h" |
-#include "ui/aura/client/cursor_client.h" |
-#include "ui/aura/client/focus_client.h" |
-#include "ui/aura/client/scoped_tooltip_disabler.h" |
-#include "ui/aura/root_window.h" |
-#include "ui/aura/window_property.h" |
-#include "ui/base/cursor/cursor_loader_win.h" |
-#include "ui/base/ime/input_method.h" |
-#include "ui/base/win/shell.h" |
-#include "ui/compositor/compositor_constants.h" |
-#include "ui/gfx/insets.h" |
-#include "ui/gfx/native_widget_types.h" |
-#include "ui/gfx/path.h" |
-#include "ui/gfx/path_win.h" |
-#include "ui/gfx/vector2d.h" |
-#include "ui/gfx/win/dpi.h" |
-#include "ui/native_theme/native_theme_aura.h" |
-#include "ui/native_theme/native_theme_win.h" |
-#include "ui/views/corewm/compound_event_filter.h" |
-#include "ui/views/corewm/corewm_switches.h" |
-#include "ui/views/corewm/input_method_event_filter.h" |
-#include "ui/views/corewm/tooltip_win.h" |
-#include "ui/views/corewm/window_animations.h" |
-#include "ui/views/ime/input_method_bridge.h" |
-#include "ui/views/widget/desktop_aura/desktop_cursor_loader_updater.h" |
-#include "ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h" |
-#include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h" |
-#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" |
-#include "ui/views/widget/root_view.h" |
-#include "ui/views/widget/widget_delegate.h" |
-#include "ui/views/widget/widget_hwnd_utils.h" |
-#include "ui/views/win/fullscreen_handler.h" |
-#include "ui/views/win/hwnd_message_handler.h" |
-#include "ui/views/window/native_frame_view.h" |
- |
-namespace views { |
- |
-namespace { |
- |
-gfx::Size GetExpandedWindowSize(DWORD window_style, gfx::Size size) { |
- if (!(window_style & WS_EX_COMPOSITED) || !ui::win::IsAeroGlassEnabled()) |
- return size; |
- |
- // Some AMD drivers can't display windows that are less than 64x64 pixels, |
- // so expand them to be at least that size. http://crbug.com/286609 |
- gfx::Size expanded(std::max(size.width(), 64), std::max(size.height(), 64)); |
- return expanded; |
-} |
- |
-void InsetBottomRight(gfx::Rect* rect, gfx::Vector2d vector) { |
- rect->Inset(0, 0, vector.x(), vector.y()); |
-} |
- |
-} // namespace |
- |
-DEFINE_WINDOW_PROPERTY_KEY(aura::Window*, kContentWindowForRootWindow, NULL); |
- |
-// Identifies the DesktopWindowTreeHostWin associated with the RootWindow. |
-DEFINE_WINDOW_PROPERTY_KEY(DesktopWindowTreeHostWin*, kDesktopWindowTreeHostKey, |
- NULL); |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DesktopWindowTreeHostWin, public: |
- |
-bool DesktopWindowTreeHostWin::is_cursor_visible_ = true; |
- |
-DesktopWindowTreeHostWin::DesktopWindowTreeHostWin( |
- internal::NativeWidgetDelegate* native_widget_delegate, |
- DesktopNativeWidgetAura* desktop_native_widget_aura) |
- : root_window_(NULL), |
- message_handler_(new HWNDMessageHandler(this)), |
- native_widget_delegate_(native_widget_delegate), |
- desktop_native_widget_aura_(desktop_native_widget_aura), |
- content_window_(NULL), |
- drag_drop_client_(NULL), |
- should_animate_window_close_(false), |
- pending_close_(false), |
- has_non_client_view_(false), |
- tooltip_(NULL) { |
-} |
- |
-DesktopWindowTreeHostWin::~DesktopWindowTreeHostWin() { |
- // WARNING: |content_window_| has been destroyed by the time we get here. |
- desktop_native_widget_aura_->OnDesktopWindowTreeHostDestroyed( |
- root_window_); |
-} |
- |
-// static |
-aura::Window* DesktopWindowTreeHostWin::GetContentWindowForHWND(HWND hwnd) { |
- aura::RootWindow* root = aura::RootWindow::GetForAcceleratedWidget(hwnd); |
- return root ? root->window()->GetProperty(kContentWindowForRootWindow) : NULL; |
-} |
- |
-// static |
-ui::NativeTheme* DesktopWindowTreeHost::GetNativeTheme(aura::Window* window) { |
- // Use NativeThemeWin for windows shown on the desktop, those not on the |
- // desktop come from Ash and get NativeThemeAura. |
- aura::WindowEventDispatcher* dispatcher = |
- window ? window->GetDispatcher() : NULL; |
- if (dispatcher) { |
- HWND host_hwnd = dispatcher->host()->GetAcceleratedWidget(); |
- if (host_hwnd && |
- DesktopWindowTreeHostWin::GetContentWindowForHWND(host_hwnd)) { |
- return ui::NativeThemeWin::instance(); |
- } |
- } |
- return ui::NativeThemeAura::instance(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DesktopWindowTreeHostWin, DesktopWindowTreeHost implementation: |
- |
-void DesktopWindowTreeHostWin::Init( |
- aura::Window* content_window, |
- const Widget::InitParams& params, |
- aura::RootWindow::CreateParams* rw_create_params) { |
- // TODO(beng): SetInitParams(). |
- content_window_ = content_window; |
- |
- aura::client::SetAnimationHost(content_window_, this); |
- |
- ConfigureWindowStyles(message_handler_.get(), params, |
- GetWidget()->widget_delegate(), |
- native_widget_delegate_); |
- |
- HWND parent_hwnd = NULL; |
- if (params.parent && params.parent->GetDispatcher()) { |
- parent_hwnd = |
- params.parent->GetDispatcher()->host()->GetAcceleratedWidget(); |
- } |
- |
- message_handler_->set_remove_standard_frame(params.remove_standard_frame); |
- |
- has_non_client_view_ = Widget::RequiresNonClientView(params.type); |
- |
- gfx::Rect pixel_bounds = gfx::win::DIPToScreenRect(params.bounds); |
- message_handler_->Init(parent_hwnd, pixel_bounds); |
- if (params.type == Widget::InitParams::TYPE_MENU) { |
- ::SetProp(GetAcceleratedWidget(), |
- kForceSoftwareCompositor, |
- reinterpret_cast<HANDLE>(true)); |
- } |
- CreateCompositor(GetAcceleratedWidget()); |
- |
- rw_create_params->host = this; |
-} |
- |
-void DesktopWindowTreeHostWin::OnRootWindowCreated( |
- aura::RootWindow* root, |
- const Widget::InitParams& params) { |
- root_window_ = root; |
- |
- // The cursor is not necessarily visible when the root window is created. |
- aura::client::CursorClient* cursor_client = |
- aura::client::GetCursorClient(root_window_->window()); |
- if (cursor_client) |
- is_cursor_visible_ = cursor_client->IsCursorVisible(); |
- |
- root_window_->window()->SetProperty(kContentWindowForRootWindow, |
- content_window_); |
- root_window_->window()->SetProperty(kDesktopWindowTreeHostKey, this); |
- |
- should_animate_window_close_ = |
- content_window_->type() != ui::wm::WINDOW_TYPE_NORMAL && |
- !views::corewm::WindowAnimationsDisabled(content_window_); |
- |
-// TODO this is not invoked *after* Init(), but should be ok. |
- SetWindowTransparency(); |
-} |
- |
-scoped_ptr<corewm::Tooltip> DesktopWindowTreeHostWin::CreateTooltip() { |
- DCHECK(!tooltip_); |
- tooltip_ = new corewm::TooltipWin(GetAcceleratedWidget()); |
- return scoped_ptr<corewm::Tooltip>(tooltip_); |
-} |
- |
-scoped_ptr<aura::client::DragDropClient> |
-DesktopWindowTreeHostWin::CreateDragDropClient( |
- DesktopNativeCursorManager* cursor_manager) { |
- drag_drop_client_ = new DesktopDragDropClientWin(root_window_->window(), |
- GetHWND()); |
- return scoped_ptr<aura::client::DragDropClient>(drag_drop_client_).Pass(); |
-} |
- |
-void DesktopWindowTreeHostWin::Close() { |
- // TODO(beng): Move this entire branch to DNWA so it can be shared with X11. |
- if (should_animate_window_close_) { |
- pending_close_ = true; |
- const bool is_animating = |
- content_window_->layer()->GetAnimator()->IsAnimatingProperty( |
- ui::LayerAnimationElement::VISIBILITY); |
- // Animation may not start for a number of reasons. |
- if (!is_animating) |
- message_handler_->Close(); |
- // else case, OnWindowHidingAnimationCompleted does the actual Close. |
- } else { |
- message_handler_->Close(); |
- } |
-} |
- |
-void DesktopWindowTreeHostWin::CloseNow() { |
- message_handler_->CloseNow(); |
-} |
- |
-aura::WindowTreeHost* DesktopWindowTreeHostWin::AsWindowTreeHost() { |
- return this; |
-} |
- |
-void DesktopWindowTreeHostWin::ShowWindowWithState( |
- ui::WindowShowState show_state) { |
- message_handler_->ShowWindowWithState(show_state); |
-} |
- |
-void DesktopWindowTreeHostWin::ShowMaximizedWithBounds( |
- const gfx::Rect& restored_bounds) { |
- gfx::Rect pixel_bounds = gfx::win::DIPToScreenRect(restored_bounds); |
- message_handler_->ShowMaximizedWithBounds(pixel_bounds); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsVisible() const { |
- return message_handler_->IsVisible(); |
-} |
- |
-void DesktopWindowTreeHostWin::SetSize(const gfx::Size& size) { |
- gfx::Size size_in_pixels = gfx::win::DIPToScreenSize(size); |
- gfx::Size expanded = GetExpandedWindowSize( |
- message_handler_->window_ex_style(), size_in_pixels); |
- window_enlargement_ = |
- gfx::Vector2d(expanded.width() - size_in_pixels.width(), |
- expanded.height() - size_in_pixels.height()); |
- message_handler_->SetSize(expanded); |
-} |
- |
-void DesktopWindowTreeHostWin::StackAtTop() { |
- message_handler_->StackAtTop(); |
-} |
- |
-void DesktopWindowTreeHostWin::CenterWindow(const gfx::Size& size) { |
- gfx::Size size_in_pixels = gfx::win::DIPToScreenSize(size); |
- gfx::Size expanded_size; |
- expanded_size = GetExpandedWindowSize(message_handler_->window_ex_style(), |
- size_in_pixels); |
- window_enlargement_ = |
- gfx::Vector2d(expanded_size.width() - size_in_pixels.width(), |
- expanded_size.height() - size_in_pixels.height()); |
- message_handler_->CenterWindow(expanded_size); |
-} |
- |
-void DesktopWindowTreeHostWin::GetWindowPlacement( |
- gfx::Rect* bounds, |
- ui::WindowShowState* show_state) const { |
- message_handler_->GetWindowPlacement(bounds, show_state); |
- InsetBottomRight(bounds, window_enlargement_); |
- *bounds = gfx::win::ScreenToDIPRect(*bounds); |
-} |
- |
-gfx::Rect DesktopWindowTreeHostWin::GetWindowBoundsInScreen() const { |
- gfx::Rect pixel_bounds = message_handler_->GetWindowBoundsInScreen(); |
- InsetBottomRight(&pixel_bounds, window_enlargement_); |
- return gfx::win::ScreenToDIPRect(pixel_bounds); |
-} |
- |
-gfx::Rect DesktopWindowTreeHostWin::GetClientAreaBoundsInScreen() const { |
- gfx::Rect pixel_bounds = message_handler_->GetClientAreaBoundsInScreen(); |
- InsetBottomRight(&pixel_bounds, window_enlargement_); |
- return gfx::win::ScreenToDIPRect(pixel_bounds); |
-} |
- |
-gfx::Rect DesktopWindowTreeHostWin::GetRestoredBounds() const { |
- gfx::Rect pixel_bounds = message_handler_->GetRestoredBounds(); |
- InsetBottomRight(&pixel_bounds, window_enlargement_); |
- return gfx::win::ScreenToDIPRect(pixel_bounds); |
-} |
- |
-gfx::Rect DesktopWindowTreeHostWin::GetWorkAreaBoundsInScreen() const { |
- MONITORINFO monitor_info; |
- monitor_info.cbSize = sizeof(monitor_info); |
- GetMonitorInfo(MonitorFromWindow(message_handler_->hwnd(), |
- MONITOR_DEFAULTTONEAREST), |
- &monitor_info); |
- gfx::Rect pixel_bounds = gfx::Rect(monitor_info.rcWork); |
- return gfx::win::ScreenToDIPRect(pixel_bounds); |
-} |
- |
-void DesktopWindowTreeHostWin::SetShape(gfx::NativeRegion native_region) { |
- if (native_region) { |
- message_handler_->SetRegion(gfx::CreateHRGNFromSkRegion(*native_region)); |
- } else { |
- message_handler_->SetRegion(NULL); |
- } |
- |
- delete native_region; |
-} |
- |
-void DesktopWindowTreeHostWin::Activate() { |
- message_handler_->Activate(); |
-} |
- |
-void DesktopWindowTreeHostWin::Deactivate() { |
- message_handler_->Deactivate(); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsActive() const { |
- return message_handler_->IsActive(); |
-} |
- |
-void DesktopWindowTreeHostWin::Maximize() { |
- message_handler_->Maximize(); |
-} |
- |
-void DesktopWindowTreeHostWin::Minimize() { |
- message_handler_->Minimize(); |
-} |
- |
-void DesktopWindowTreeHostWin::Restore() { |
- message_handler_->Restore(); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsMaximized() const { |
- return message_handler_->IsMaximized(); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsMinimized() const { |
- return message_handler_->IsMinimized(); |
-} |
- |
-bool DesktopWindowTreeHostWin::HasCapture() const { |
- return message_handler_->HasCapture(); |
-} |
- |
-void DesktopWindowTreeHostWin::SetAlwaysOnTop(bool always_on_top) { |
- message_handler_->SetAlwaysOnTop(always_on_top); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsAlwaysOnTop() const { |
- return message_handler_->IsAlwaysOnTop(); |
-} |
- |
-bool DesktopWindowTreeHostWin::SetWindowTitle(const base::string16& title) { |
- return message_handler_->SetTitle(title); |
-} |
- |
-void DesktopWindowTreeHostWin::ClearNativeFocus() { |
- message_handler_->ClearNativeFocus(); |
-} |
- |
-Widget::MoveLoopResult DesktopWindowTreeHostWin::RunMoveLoop( |
- const gfx::Vector2d& drag_offset, |
- Widget::MoveLoopSource source, |
- Widget::MoveLoopEscapeBehavior escape_behavior) { |
- const bool hide_on_escape = |
- escape_behavior == Widget::MOVE_LOOP_ESCAPE_BEHAVIOR_HIDE; |
- return message_handler_->RunMoveLoop(drag_offset, hide_on_escape) ? |
- Widget::MOVE_LOOP_SUCCESSFUL : Widget::MOVE_LOOP_CANCELED; |
-} |
- |
-void DesktopWindowTreeHostWin::EndMoveLoop() { |
- message_handler_->EndMoveLoop(); |
-} |
- |
-void DesktopWindowTreeHostWin::SetVisibilityChangedAnimationsEnabled( |
- bool value) { |
- message_handler_->SetVisibilityChangedAnimationsEnabled(value); |
- content_window_->SetProperty(aura::client::kAnimationsDisabledKey, !value); |
-} |
- |
-bool DesktopWindowTreeHostWin::ShouldUseNativeFrame() const { |
- return ui::win::IsAeroGlassEnabled(); |
-} |
- |
-bool DesktopWindowTreeHostWin::ShouldWindowContentsBeTransparent() const { |
- // If the window has a native frame, we assume it is an Aero Glass window, and |
- // is therefore transparent. Note: This is not equivalent to calling |
- // IsAeroGlassEnabled, because ShouldUseNativeFrame is overridden in a |
- // subclass. |
- return ShouldUseNativeFrame(); |
-} |
- |
-void DesktopWindowTreeHostWin::FrameTypeChanged() { |
- message_handler_->FrameTypeChanged(); |
- SetWindowTransparency(); |
-} |
- |
-NonClientFrameView* DesktopWindowTreeHostWin::CreateNonClientFrameView() { |
- return GetWidget()->ShouldUseNativeFrame() ? |
- new NativeFrameView(GetWidget()) : NULL; |
-} |
- |
-void DesktopWindowTreeHostWin::SetFullscreen(bool fullscreen) { |
- message_handler_->fullscreen_handler()->SetFullscreen(fullscreen); |
- // TODO(sky): workaround for ScopedFullscreenVisibility showing window |
- // directly. Instead of this should listen for visibility changes and then |
- // update window. |
- if (message_handler_->IsVisible() && !content_window_->TargetVisibility()) |
- content_window_->Show(); |
- SetWindowTransparency(); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsFullscreen() const { |
- return message_handler_->fullscreen_handler()->fullscreen(); |
-} |
- |
-void DesktopWindowTreeHostWin::SetOpacity(unsigned char opacity) { |
- message_handler_->SetOpacity(static_cast<BYTE>(opacity)); |
- content_window_->layer()->SetOpacity(opacity / 255.0); |
-} |
- |
-void DesktopWindowTreeHostWin::SetWindowIcons( |
- const gfx::ImageSkia& window_icon, const gfx::ImageSkia& app_icon) { |
- message_handler_->SetWindowIcons(window_icon, app_icon); |
-} |
- |
-void DesktopWindowTreeHostWin::InitModalType(ui::ModalType modal_type) { |
- message_handler_->InitModalType(modal_type); |
-} |
- |
-void DesktopWindowTreeHostWin::FlashFrame(bool flash_frame) { |
- message_handler_->FlashFrame(flash_frame); |
-} |
- |
-void DesktopWindowTreeHostWin::OnRootViewLayout() const { |
-} |
- |
-void DesktopWindowTreeHostWin::OnNativeWidgetFocus() { |
- // HWNDMessageHandler will perform the proper updating on its own. |
-} |
- |
-void DesktopWindowTreeHostWin::OnNativeWidgetBlur() { |
-} |
- |
-bool DesktopWindowTreeHostWin::IsAnimatingClosed() const { |
- return pending_close_; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DesktopWindowTreeHostWin, WindowTreeHost implementation: |
- |
-aura::RootWindow* DesktopWindowTreeHostWin::GetRootWindow() { |
- return root_window_; |
-} |
- |
-gfx::AcceleratedWidget DesktopWindowTreeHostWin::GetAcceleratedWidget() { |
- return message_handler_->hwnd(); |
-} |
- |
-void DesktopWindowTreeHostWin::Show() { |
- message_handler_->Show(); |
-} |
- |
-void DesktopWindowTreeHostWin::Hide() { |
- if (!pending_close_) |
- message_handler_->Hide(); |
-} |
- |
-void DesktopWindowTreeHostWin::ToggleFullScreen() { |
- SetWindowTransparency(); |
-} |
- |
-// GetBounds and SetBounds work in pixel coordinates, whereas other get/set |
-// methods work in DIP. |
- |
-gfx::Rect DesktopWindowTreeHostWin::GetBounds() const { |
- gfx::Rect bounds(message_handler_->GetClientAreaBounds()); |
- // If the window bounds were expanded we need to return the original bounds |
- // To achieve this we do the reverse of the expansion, i.e. add the |
- // window_expansion_top_left_delta_ to the origin and subtract the |
- // window_expansion_bottom_right_delta_ from the width and height. |
- gfx::Rect without_expansion( |
- bounds.x() + window_expansion_top_left_delta_.x(), |
- bounds.y() + window_expansion_top_left_delta_.y(), |
- bounds.width() - window_expansion_bottom_right_delta_.x() - |
- window_enlargement_.x(), |
- bounds.height() - window_expansion_bottom_right_delta_.y() - |
- window_enlargement_.y()); |
- return without_expansion; |
-} |
- |
-void DesktopWindowTreeHostWin::SetBounds(const gfx::Rect& bounds) { |
- // If the window bounds have to be expanded we need to subtract the |
- // window_expansion_top_left_delta_ from the origin and add the |
- // window_expansion_bottom_right_delta_ to the width and height |
- gfx::Size old_hwnd_size(message_handler_->GetClientAreaBounds().size()); |
- gfx::Size old_content_size = GetBounds().size(); |
- |
- gfx::Rect expanded( |
- bounds.x() - window_expansion_top_left_delta_.x(), |
- bounds.y() - window_expansion_top_left_delta_.y(), |
- bounds.width() + window_expansion_bottom_right_delta_.x(), |
- bounds.height() + window_expansion_bottom_right_delta_.y()); |
- |
- gfx::Rect new_expanded( |
- expanded.origin(), |
- GetExpandedWindowSize(message_handler_->window_ex_style(), |
- expanded.size())); |
- window_enlargement_ = |
- gfx::Vector2d(new_expanded.width() - expanded.width(), |
- new_expanded.height() - expanded.height()); |
- message_handler_->SetBounds(new_expanded); |
- |
- // The client area size may have changed even though the window bounds have |
- // not, if the window bounds were expanded to 64 pixels both times. |
- if (old_hwnd_size == new_expanded.size() && old_content_size != bounds.size()) |
- HandleClientSizeChanged(new_expanded.size()); |
-} |
- |
-gfx::Insets DesktopWindowTreeHostWin::GetInsets() const { |
- return gfx::Insets(); |
-} |
- |
-void DesktopWindowTreeHostWin::SetInsets(const gfx::Insets& insets) { |
-} |
- |
-gfx::Point DesktopWindowTreeHostWin::GetLocationOnNativeScreen() const { |
- return GetBounds().origin(); |
-} |
- |
-void DesktopWindowTreeHostWin::SetCapture() { |
- message_handler_->SetCapture(); |
-} |
- |
-void DesktopWindowTreeHostWin::ReleaseCapture() { |
- message_handler_->ReleaseCapture(); |
-} |
- |
-void DesktopWindowTreeHostWin::SetCursor(gfx::NativeCursor cursor) { |
- ui::CursorLoaderWin cursor_loader; |
- cursor_loader.SetPlatformCursor(&cursor); |
- |
- message_handler_->SetCursor(cursor.platform()); |
-} |
- |
-bool DesktopWindowTreeHostWin::QueryMouseLocation(gfx::Point* location_return) { |
- aura::client::CursorClient* cursor_client = |
- aura::client::GetCursorClient(root_window_->window()); |
- if (cursor_client && !cursor_client->IsMouseEventsEnabled()) { |
- *location_return = gfx::Point(0, 0); |
- return false; |
- } |
- POINT pt = {0}; |
- ::GetCursorPos(&pt); |
- *location_return = |
- gfx::Point(static_cast<int>(pt.x), static_cast<int>(pt.y)); |
- return true; |
-} |
- |
-bool DesktopWindowTreeHostWin::ConfineCursorToRootWindow() { |
- RECT window_rect = root_window_->window()->GetBoundsInScreen().ToRECT(); |
- ::ClipCursor(&window_rect); |
- return true; |
-} |
- |
-void DesktopWindowTreeHostWin::UnConfineCursor() { |
- ::ClipCursor(NULL); |
-} |
- |
-void DesktopWindowTreeHostWin::OnCursorVisibilityChanged(bool show) { |
- if (is_cursor_visible_ == show) |
- return; |
- is_cursor_visible_ = show; |
- ::ShowCursor(!!show); |
-} |
- |
-void DesktopWindowTreeHostWin::MoveCursorTo(const gfx::Point& location) { |
- POINT cursor_location = location.ToPOINT(); |
- ::ClientToScreen(GetHWND(), &cursor_location); |
- ::SetCursorPos(cursor_location.x, cursor_location.y); |
-} |
- |
-void DesktopWindowTreeHostWin::PostNativeEvent( |
- const base::NativeEvent& native_event) { |
-} |
- |
-void DesktopWindowTreeHostWin::OnDeviceScaleFactorChanged( |
- float device_scale_factor) { |
-} |
- |
-void DesktopWindowTreeHostWin::PrepareForShutdown() { |
-} |
- |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DesktopWindowTreeHostWin, ui::EventSource implementation: |
- |
-ui::EventProcessor* DesktopWindowTreeHostWin::GetEventProcessor() { |
- return delegate_->GetEventProcessor(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DesktopWindowTreeHostWin, aura::AnimationHost implementation: |
- |
-void DesktopWindowTreeHostWin::SetHostTransitionOffsets( |
- const gfx::Vector2d& top_left_delta, |
- const gfx::Vector2d& bottom_right_delta) { |
- gfx::Rect bounds_without_expansion = GetBounds(); |
- window_expansion_top_left_delta_ = top_left_delta; |
- window_expansion_bottom_right_delta_ = bottom_right_delta; |
- SetBounds(bounds_without_expansion); |
-} |
- |
-void DesktopWindowTreeHostWin::OnWindowHidingAnimationCompleted() { |
- if (pending_close_) |
- message_handler_->Close(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DesktopWindowTreeHostWin, HWNDMessageHandlerDelegate implementation: |
- |
-bool DesktopWindowTreeHostWin::IsWidgetWindow() const { |
- return has_non_client_view_; |
-} |
- |
-bool DesktopWindowTreeHostWin::IsUsingCustomFrame() const { |
- return !GetWidget()->ShouldUseNativeFrame(); |
-} |
- |
-void DesktopWindowTreeHostWin::SchedulePaint() { |
- GetWidget()->GetRootView()->SchedulePaint(); |
-} |
- |
-void DesktopWindowTreeHostWin::EnableInactiveRendering() { |
- native_widget_delegate_->EnableInactiveRendering(); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsInactiveRenderingDisabled() { |
- return native_widget_delegate_->IsInactiveRenderingDisabled(); |
-} |
- |
-bool DesktopWindowTreeHostWin::CanResize() const { |
- return GetWidget()->widget_delegate()->CanResize(); |
-} |
- |
-bool DesktopWindowTreeHostWin::CanMaximize() const { |
- return GetWidget()->widget_delegate()->CanMaximize(); |
-} |
- |
-bool DesktopWindowTreeHostWin::CanActivate() const { |
- if (IsModalWindowActive()) |
- return true; |
- return native_widget_delegate_->CanActivate(); |
-} |
- |
-bool DesktopWindowTreeHostWin::WidgetSizeIsClientSize() const { |
- const Widget* widget = GetWidget()->GetTopLevelWidget(); |
- return IsMaximized() || (widget && widget->ShouldUseNativeFrame()); |
-} |
- |
-bool DesktopWindowTreeHostWin::CanSaveFocus() const { |
- return GetWidget()->is_top_level(); |
-} |
- |
-void DesktopWindowTreeHostWin::SaveFocusOnDeactivate() { |
- GetWidget()->GetFocusManager()->StoreFocusedView(true); |
-} |
- |
-void DesktopWindowTreeHostWin::RestoreFocusOnActivate() { |
- RestoreFocusOnEnable(); |
-} |
- |
-void DesktopWindowTreeHostWin::RestoreFocusOnEnable() { |
- GetWidget()->GetFocusManager()->RestoreFocusedView(); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsModal() const { |
- return native_widget_delegate_->IsModal(); |
-} |
- |
-int DesktopWindowTreeHostWin::GetInitialShowState() const { |
- return SW_SHOWNORMAL; |
-} |
- |
-bool DesktopWindowTreeHostWin::WillProcessWorkAreaChange() const { |
- return GetWidget()->widget_delegate()->WillProcessWorkAreaChange(); |
-} |
- |
-int DesktopWindowTreeHostWin::GetNonClientComponent( |
- const gfx::Point& point) const { |
- gfx::Point dip_position = gfx::win::ScreenToDIPPoint(point); |
- return native_widget_delegate_->GetNonClientComponent(dip_position); |
-} |
- |
-void DesktopWindowTreeHostWin::GetWindowMask(const gfx::Size& size, |
- gfx::Path* path) { |
- if (GetWidget()->non_client_view()) { |
- GetWidget()->non_client_view()->GetWindowMask(size, path); |
- } else if (!window_enlargement_.IsZero()) { |
- gfx::Rect bounds(WidgetSizeIsClientSize() |
- ? message_handler_->GetClientAreaBoundsInScreen() |
- : message_handler_->GetWindowBoundsInScreen()); |
- InsetBottomRight(&bounds, window_enlargement_); |
- path->addRect(SkRect::MakeXYWH(0, 0, bounds.width(), bounds.height())); |
- } |
-} |
- |
-bool DesktopWindowTreeHostWin::GetClientAreaInsets(gfx::Insets* insets) const { |
- return false; |
-} |
- |
-void DesktopWindowTreeHostWin::GetMinMaxSize(gfx::Size* min_size, |
- gfx::Size* max_size) const { |
- *min_size = native_widget_delegate_->GetMinimumSize(); |
- *max_size = native_widget_delegate_->GetMaximumSize(); |
-} |
- |
-gfx::Size DesktopWindowTreeHostWin::GetRootViewSize() const { |
- return GetWidget()->GetRootView()->size(); |
-} |
- |
-void DesktopWindowTreeHostWin::ResetWindowControls() { |
- GetWidget()->non_client_view()->ResetWindowControls(); |
-} |
- |
-void DesktopWindowTreeHostWin::PaintLayeredWindow(gfx::Canvas* canvas) { |
- GetWidget()->GetRootView()->Paint(canvas); |
-} |
- |
-gfx::NativeViewAccessible DesktopWindowTreeHostWin::GetNativeViewAccessible() { |
- return GetWidget()->GetRootView()->GetNativeViewAccessible(); |
-} |
- |
-InputMethod* DesktopWindowTreeHostWin::GetInputMethod() { |
- return GetWidget()->GetInputMethodDirect(); |
-} |
- |
-bool DesktopWindowTreeHostWin::ShouldHandleSystemCommands() const { |
- return GetWidget()->widget_delegate()->ShouldHandleSystemCommands(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleAppDeactivated() { |
- native_widget_delegate_->EnableInactiveRendering(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleActivationChanged(bool active) { |
- // This can be invoked from HWNDMessageHandler::Init(), at which point we're |
- // not in a good state and need to ignore it. |
- if (!delegate_) |
- return; |
- |
- if (active) |
- delegate_->OnHostActivated(); |
- desktop_native_widget_aura_->HandleActivationChanged(active); |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleAppCommand(short command) { |
- // We treat APPCOMMAND ids as an extension of our command namespace, and just |
- // let the delegate figure out what to do... |
- return GetWidget()->widget_delegate() && |
- GetWidget()->widget_delegate()->ExecuteWindowsCommand(command); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleCancelMode() { |
- delegate_->OnHostCancelMode(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleCaptureLost() { |
- delegate_->OnHostLostWindowCapture(); |
- native_widget_delegate_->OnMouseCaptureLost(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleClose() { |
- GetWidget()->Close(); |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleCommand(int command) { |
- return GetWidget()->widget_delegate()->ExecuteWindowsCommand(command); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleAccelerator( |
- const ui::Accelerator& accelerator) { |
- GetWidget()->GetFocusManager()->ProcessAccelerator(accelerator); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleCreate() { |
- native_widget_delegate_->OnNativeWidgetCreated(true); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleDestroying() { |
- drag_drop_client_->OnNativeWidgetDestroying(GetHWND()); |
- native_widget_delegate_->OnNativeWidgetDestroying(); |
- |
- // Destroy the compositor before destroying the HWND since shutdown |
- // may try to swap to the window. |
- DestroyCompositor(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleDestroyed() { |
- desktop_native_widget_aura_->OnHostClosed(); |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleInitialFocus( |
- ui::WindowShowState show_state) { |
- return GetWidget()->SetInitialFocus(show_state); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleDisplayChange() { |
- GetWidget()->widget_delegate()->OnDisplayChanged(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleBeginWMSizeMove() { |
- native_widget_delegate_->OnNativeWidgetBeginUserBoundsChange(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleEndWMSizeMove() { |
- native_widget_delegate_->OnNativeWidgetEndUserBoundsChange(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleMove() { |
- native_widget_delegate_->OnNativeWidgetMove(); |
- if (delegate_) |
- delegate_->OnHostMoved(GetBounds().origin()); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleWorkAreaChanged() { |
- GetWidget()->widget_delegate()->OnWorkAreaChanged(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleVisibilityChanging(bool visible) { |
- native_widget_delegate_->OnNativeWidgetVisibilityChanging(visible); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleVisibilityChanged(bool visible) { |
- native_widget_delegate_->OnNativeWidgetVisibilityChanged(visible); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleClientSizeChanged( |
- const gfx::Size& new_size) { |
- if (delegate_) |
- NotifyHostResized(new_size); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleFrameChanged() { |
- SetWindowTransparency(); |
- // Replace the frame and layout the contents. |
- GetWidget()->non_client_view()->UpdateFrame(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleNativeFocus(HWND last_focused_window) { |
- // TODO(beng): inform the native_widget_delegate_. |
- InputMethod* input_method = GetInputMethod(); |
- if (input_method) |
- input_method->OnFocus(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleNativeBlur(HWND focused_window) { |
- // TODO(beng): inform the native_widget_delegate_. |
- InputMethod* input_method = GetInputMethod(); |
- if (input_method) |
- input_method->OnBlur(); |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleMouseEvent(const ui::MouseEvent& event) { |
- SendEventToProcessor(const_cast<ui::MouseEvent*>(&event)); |
- return event.handled(); |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleKeyEvent(const ui::KeyEvent& event) { |
- return false; |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleUntranslatedKeyEvent( |
- const ui::KeyEvent& event) { |
- ui::KeyEvent duplicate_event(event); |
- SendEventToProcessor(&duplicate_event); |
- return duplicate_event.handled(); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleTouchEvent( |
- const ui::TouchEvent& event) { |
- // HWNDMessageHandler asynchronously processes touch events. Because of this |
- // it's possible for the aura::RootWindow to have been destroyed by the time |
- // we attempt to process them. |
- if (!GetWidget()->GetNativeView()) |
- return; |
- |
- // Currently we assume the window that has capture gets touch events too. |
- aura::RootWindow* root = |
- aura::RootWindow::GetForAcceleratedWidget(GetCapture()); |
- if (root) { |
- DesktopWindowTreeHostWin* target = |
- root->window()->GetProperty(kDesktopWindowTreeHostKey); |
- if (target && target->HasCapture() && target != this) { |
- POINT target_location(event.location().ToPOINT()); |
- ClientToScreen(GetHWND(), &target_location); |
- ScreenToClient(target->GetHWND(), &target_location); |
- ui::TouchEvent target_event(event, static_cast<View*>(NULL), |
- static_cast<View*>(NULL)); |
- target_event.set_location(gfx::Point(target_location)); |
- target_event.set_root_location(target_event.location()); |
- target->SendEventToProcessor(&target_event); |
- return; |
- } |
- } |
- SendEventToProcessor(const_cast<ui::TouchEvent*>(&event)); |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleIMEMessage(UINT message, |
- WPARAM w_param, |
- LPARAM l_param, |
- LRESULT* result) { |
- MSG msg = {}; |
- msg.hwnd = GetHWND(); |
- msg.message = message; |
- msg.wParam = w_param; |
- msg.lParam = l_param; |
- return desktop_native_widget_aura_->input_method_event_filter()-> |
- input_method()->OnUntranslatedIMEMessage(msg, result); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleInputLanguageChange( |
- DWORD character_set, |
- HKL input_language_id) { |
- desktop_native_widget_aura_->input_method_event_filter()-> |
- input_method()->OnInputLocaleChanged(); |
-} |
- |
-bool DesktopWindowTreeHostWin::HandlePaintAccelerated( |
- const gfx::Rect& invalid_rect) { |
- return native_widget_delegate_->OnNativeWidgetPaintAccelerated(invalid_rect); |
-} |
- |
-void DesktopWindowTreeHostWin::HandlePaint(gfx::Canvas* canvas) { |
- compositor()->ScheduleRedrawRect(gfx::Rect()); |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleTooltipNotify(int w_param, |
- NMHDR* l_param, |
- LRESULT* l_result) { |
- return tooltip_ && tooltip_->HandleNotify(w_param, l_param, l_result); |
-} |
- |
-void DesktopWindowTreeHostWin::HandleTooltipMouseMove(UINT message, |
- WPARAM w_param, |
- LPARAM l_param) { |
- // TooltipWin implementation doesn't need this. |
- // TODO(sky): remove from HWNDMessageHandler once non-aura path nuked. |
-} |
- |
-void DesktopWindowTreeHostWin::HandleMenuLoop(bool in_menu_loop) { |
- if (in_menu_loop) { |
- tooltip_disabler_.reset( |
- new aura::client::ScopedTooltipDisabler(root_window_->window())); |
- } else { |
- tooltip_disabler_.reset(); |
- } |
-} |
- |
-bool DesktopWindowTreeHostWin::PreHandleMSG(UINT message, |
- WPARAM w_param, |
- LPARAM l_param, |
- LRESULT* result) { |
- return false; |
-} |
- |
-void DesktopWindowTreeHostWin::PostHandleMSG(UINT message, |
- WPARAM w_param, |
- LPARAM l_param) { |
-} |
- |
-bool DesktopWindowTreeHostWin::HandleScrollEvent( |
- const ui::ScrollEvent& event) { |
- SendEventToProcessor(const_cast<ui::ScrollEvent*>(&event)); |
- return event.handled(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DesktopWindowTreeHostWin, private: |
- |
-Widget* DesktopWindowTreeHostWin::GetWidget() { |
- return native_widget_delegate_->AsWidget(); |
-} |
- |
-const Widget* DesktopWindowTreeHostWin::GetWidget() const { |
- return native_widget_delegate_->AsWidget(); |
-} |
- |
-HWND DesktopWindowTreeHostWin::GetHWND() const { |
- return message_handler_->hwnd(); |
-} |
- |
-void DesktopWindowTreeHostWin::SetWindowTransparency() { |
- bool transparent = ShouldUseNativeFrame() && !IsFullscreen(); |
- root_window_->host()->compositor()->SetHostHasTransparentBackground( |
- transparent); |
- root_window_->window()->SetTransparent(transparent); |
- content_window_->SetTransparent(transparent); |
-} |
- |
-bool DesktopWindowTreeHostWin::IsModalWindowActive() const { |
- // This function can get called during window creation which occurs before |
- // root_window_ has been created. |
- if (!root_window_) |
- return false; |
- |
- aura::Window::Windows::const_iterator index; |
- for (index = root_window_->window()->children().begin(); |
- index != root_window_->window()->children().end(); |
- ++index) { |
- if ((*index)->GetProperty(aura::client::kModalKey) != |
- ui:: MODAL_TYPE_NONE && (*index)->TargetVisibility()) |
- return true; |
- } |
- return false; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// DesktopWindowTreeHost, public: |
- |
-// static |
-DesktopWindowTreeHost* DesktopWindowTreeHost::Create( |
- internal::NativeWidgetDelegate* native_widget_delegate, |
- DesktopNativeWidgetAura* desktop_native_widget_aura) { |
- return new DesktopWindowTreeHostWin(native_widget_delegate, |
- desktop_native_widget_aura); |
-} |
- |
-} // namespace views |