summaryrefslogtreecommitdiffstats
path: root/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc')
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc992
1 files changed, 0 insertions, 992 deletions
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
deleted file mode 100644
index 938a05b2c4b..00000000000
--- a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
+++ /dev/null
@@ -1,992 +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/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/ime/win/tsf_bridge.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 DesktopRootWindowHostWin associated with the RootWindow.
-DEFINE_WINDOW_PROPERTY_KEY(DesktopRootWindowHostWin*, kDesktopRootWindowHostKey,
- NULL);
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHostWin, public:
-
-DesktopRootWindowHostWin::DesktopRootWindowHostWin(
- 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),
- is_cursor_visible_(true) {
-}
-
-DesktopRootWindowHostWin::~DesktopRootWindowHostWin() {
- // WARNING: |content_window_| has been destroyed by the time we get here.
- desktop_native_widget_aura_->OnDesktopRootWindowHostDestroyed(
- root_window_);
-}
-
-// static
-aura::Window* DesktopRootWindowHostWin::GetContentWindowForHWND(HWND hwnd) {
- aura::RootWindow* root = aura::RootWindow::GetForAcceleratedWidget(hwnd);
- return root ? root->window()->GetProperty(kContentWindowForRootWindow) : NULL;
-}
-
-// static
-ui::NativeTheme* DesktopRootWindowHost::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 &&
- DesktopRootWindowHostWin::GetContentWindowForHWND(host_hwnd)) {
- return ui::NativeThemeWin::instance();
- }
- }
- return ui::NativeThemeAura::instance();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHostWin, DesktopRootWindowHost implementation:
-
-void DesktopRootWindowHostWin::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);
-
- if (params.type == Widget::InitParams::TYPE_MENU) {
- ::SetProp(GetAcceleratedWidget(),
- kForceSoftwareCompositor,
- reinterpret_cast<HANDLE>(true));
- }
-
- gfx::Rect pixel_bounds = gfx::win::DIPToScreenRect(params.bounds);
- message_handler_->Init(parent_hwnd, pixel_bounds);
-
- rw_create_params->host = this;
-}
-
-void DesktopRootWindowHostWin::OnRootWindowCreated(
- aura::RootWindow* root,
- const Widget::InitParams& params) {
- root_window_ = root;
-
- root_window_->window()->SetProperty(kContentWindowForRootWindow,
- content_window_);
- root_window_->window()->SetProperty(kDesktopRootWindowHostKey, this);
-
- should_animate_window_close_ =
- content_window_->type() != aura::client::WINDOW_TYPE_NORMAL &&
- !views::corewm::WindowAnimationsDisabled(content_window_);
-
-// TODO this is not invoked *after* Init(), but should be ok.
- SetWindowTransparency();
-}
-
-scoped_ptr<corewm::Tooltip> DesktopRootWindowHostWin::CreateTooltip() {
- DCHECK(!tooltip_);
- tooltip_ = new corewm::TooltipWin(GetAcceleratedWidget());
- return scoped_ptr<corewm::Tooltip>(tooltip_);
-}
-
-scoped_ptr<aura::client::DragDropClient>
-DesktopRootWindowHostWin::CreateDragDropClient(
- DesktopNativeCursorManager* cursor_manager) {
- drag_drop_client_ = new DesktopDragDropClientWin(root_window_->window(),
- GetHWND());
- return scoped_ptr<aura::client::DragDropClient>(drag_drop_client_).Pass();
-}
-
-void DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::CloseNow() {
- message_handler_->CloseNow();
-}
-
-aura::RootWindowHost* DesktopRootWindowHostWin::AsRootWindowHost() {
- return this;
-}
-
-void DesktopRootWindowHostWin::ShowWindowWithState(
- ui::WindowShowState show_state) {
- message_handler_->ShowWindowWithState(show_state);
-}
-
-void DesktopRootWindowHostWin::ShowMaximizedWithBounds(
- const gfx::Rect& restored_bounds) {
- gfx::Rect pixel_bounds = gfx::win::DIPToScreenRect(restored_bounds);
- message_handler_->ShowMaximizedWithBounds(pixel_bounds);
-}
-
-bool DesktopRootWindowHostWin::IsVisible() const {
- return message_handler_->IsVisible();
-}
-
-void DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::StackAtTop() {
- message_handler_->StackAtTop();
-}
-
-void DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::GetWindowBoundsInScreen() const {
- gfx::Rect pixel_bounds = message_handler_->GetWindowBoundsInScreen();
- InsetBottomRight(&pixel_bounds, window_enlargement_);
- return gfx::win::ScreenToDIPRect(pixel_bounds);
-}
-
-gfx::Rect DesktopRootWindowHostWin::GetClientAreaBoundsInScreen() const {
- gfx::Rect pixel_bounds = message_handler_->GetClientAreaBoundsInScreen();
- InsetBottomRight(&pixel_bounds, window_enlargement_);
- return gfx::win::ScreenToDIPRect(pixel_bounds);
-}
-
-gfx::Rect DesktopRootWindowHostWin::GetRestoredBounds() const {
- gfx::Rect pixel_bounds = message_handler_->GetRestoredBounds();
- InsetBottomRight(&pixel_bounds, window_enlargement_);
- return gfx::win::ScreenToDIPRect(pixel_bounds);
-}
-
-gfx::Rect DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::SetShape(gfx::NativeRegion native_region) {
- if (native_region) {
- message_handler_->SetRegion(gfx::CreateHRGNFromSkRegion(*native_region));
- } else {
- message_handler_->SetRegion(NULL);
- }
-
- delete native_region;
-}
-
-void DesktopRootWindowHostWin::Activate() {
- message_handler_->Activate();
-}
-
-void DesktopRootWindowHostWin::Deactivate() {
- message_handler_->Deactivate();
-}
-
-bool DesktopRootWindowHostWin::IsActive() const {
- return message_handler_->IsActive();
-}
-
-void DesktopRootWindowHostWin::Maximize() {
- message_handler_->Maximize();
-}
-
-void DesktopRootWindowHostWin::Minimize() {
- message_handler_->Minimize();
-}
-
-void DesktopRootWindowHostWin::Restore() {
- message_handler_->Restore();
-}
-
-bool DesktopRootWindowHostWin::IsMaximized() const {
- return message_handler_->IsMaximized();
-}
-
-bool DesktopRootWindowHostWin::IsMinimized() const {
- return message_handler_->IsMinimized();
-}
-
-bool DesktopRootWindowHostWin::HasCapture() const {
- return message_handler_->HasCapture();
-}
-
-void DesktopRootWindowHostWin::SetAlwaysOnTop(bool always_on_top) {
- message_handler_->SetAlwaysOnTop(always_on_top);
-}
-
-bool DesktopRootWindowHostWin::IsAlwaysOnTop() const {
- return message_handler_->IsAlwaysOnTop();
-}
-
-bool DesktopRootWindowHostWin::SetWindowTitle(const string16& title) {
- return message_handler_->SetTitle(title);
-}
-
-void DesktopRootWindowHostWin::ClearNativeFocus() {
- message_handler_->ClearNativeFocus();
-}
-
-Widget::MoveLoopResult DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::EndMoveLoop() {
- message_handler_->EndMoveLoop();
-}
-
-void DesktopRootWindowHostWin::SetVisibilityChangedAnimationsEnabled(
- bool value) {
- message_handler_->SetVisibilityChangedAnimationsEnabled(value);
- content_window_->SetProperty(aura::client::kAnimationsDisabledKey, !value);
-}
-
-bool DesktopRootWindowHostWin::ShouldUseNativeFrame() {
- return ui::win::IsAeroGlassEnabled();
-}
-
-void DesktopRootWindowHostWin::FrameTypeChanged() {
- message_handler_->FrameTypeChanged();
- SetWindowTransparency();
-}
-
-NonClientFrameView* DesktopRootWindowHostWin::CreateNonClientFrameView() {
- return GetWidget()->ShouldUseNativeFrame() ?
- new NativeFrameView(GetWidget()) : NULL;
-}
-
-void DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::IsFullscreen() const {
- return message_handler_->fullscreen_handler()->fullscreen();
-}
-
-void DesktopRootWindowHostWin::SetOpacity(unsigned char opacity) {
- message_handler_->SetOpacity(static_cast<BYTE>(opacity));
- content_window_->layer()->SetOpacity(opacity / 255.0);
-}
-
-void DesktopRootWindowHostWin::SetWindowIcons(
- const gfx::ImageSkia& window_icon, const gfx::ImageSkia& app_icon) {
- message_handler_->SetWindowIcons(window_icon, app_icon);
-}
-
-void DesktopRootWindowHostWin::InitModalType(ui::ModalType modal_type) {
- message_handler_->InitModalType(modal_type);
-}
-
-void DesktopRootWindowHostWin::FlashFrame(bool flash_frame) {
- message_handler_->FlashFrame(flash_frame);
-}
-
-void DesktopRootWindowHostWin::OnRootViewLayout() const {
-}
-
-void DesktopRootWindowHostWin::OnNativeWidgetFocus() {
- // HWNDMessageHandler will perform the proper updating on its own.
-}
-
-void DesktopRootWindowHostWin::OnNativeWidgetBlur() {
-}
-
-bool DesktopRootWindowHostWin::IsAnimatingClosed() const {
- return pending_close_;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHostWin, RootWindowHost implementation:
-
-aura::RootWindow* DesktopRootWindowHostWin::GetRootWindow() {
- return root_window_;
-}
-
-gfx::AcceleratedWidget DesktopRootWindowHostWin::GetAcceleratedWidget() {
- return message_handler_->hwnd();
-}
-
-void DesktopRootWindowHostWin::Show() {
- message_handler_->Show();
-}
-
-void DesktopRootWindowHostWin::Hide() {
- if (!pending_close_)
- message_handler_->Hide();
-}
-
-void DesktopRootWindowHostWin::ToggleFullScreen() {
- SetWindowTransparency();
-}
-
-// GetBounds and SetBounds work in pixel coordinates, whereas other get/set
-// methods work in DIP.
-
-gfx::Rect DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::GetInsets() const {
- return gfx::Insets();
-}
-
-void DesktopRootWindowHostWin::SetInsets(const gfx::Insets& insets) {
-}
-
-gfx::Point DesktopRootWindowHostWin::GetLocationOnNativeScreen() const {
- return GetBounds().origin();
-}
-
-void DesktopRootWindowHostWin::SetCapture() {
- message_handler_->SetCapture();
-}
-
-void DesktopRootWindowHostWin::ReleaseCapture() {
- message_handler_->ReleaseCapture();
-}
-
-void DesktopRootWindowHostWin::SetCursor(gfx::NativeCursor cursor) {
- ui::CursorLoaderWin cursor_loader;
- cursor_loader.SetPlatformCursor(&cursor);
-
- message_handler_->SetCursor(cursor.platform());
-}
-
-bool DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::ConfineCursorToRootWindow() {
- RECT window_rect = root_window_->window()->GetBoundsInScreen().ToRECT();
- ::ClipCursor(&window_rect);
- return true;
-}
-
-void DesktopRootWindowHostWin::UnConfineCursor() {
- ::ClipCursor(NULL);
-}
-
-void DesktopRootWindowHostWin::OnCursorVisibilityChanged(bool show) {
- if (is_cursor_visible_ == show)
- return;
- is_cursor_visible_ = show;
- ::ShowCursor(!!show);
-}
-
-void DesktopRootWindowHostWin::MoveCursorTo(const gfx::Point& location) {
- POINT cursor_location = location.ToPOINT();
- ::ClientToScreen(GetHWND(), &cursor_location);
- ::SetCursorPos(cursor_location.x, cursor_location.y);
-}
-
-void DesktopRootWindowHostWin::PostNativeEvent(
- const base::NativeEvent& native_event) {
-}
-
-void DesktopRootWindowHostWin::OnDeviceScaleFactorChanged(
- float device_scale_factor) {
-}
-
-void DesktopRootWindowHostWin::PrepareForShutdown() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHostWin, aura::AnimationHost implementation:
-
-void DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::OnWindowHidingAnimationCompleted() {
- if (pending_close_)
- message_handler_->Close();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHostWin, HWNDMessageHandlerDelegate implementation:
-
-bool DesktopRootWindowHostWin::IsWidgetWindow() const {
- return has_non_client_view_;
-}
-
-bool DesktopRootWindowHostWin::IsUsingCustomFrame() const {
- return !GetWidget()->ShouldUseNativeFrame();
-}
-
-void DesktopRootWindowHostWin::SchedulePaint() {
- GetWidget()->GetRootView()->SchedulePaint();
-}
-
-void DesktopRootWindowHostWin::EnableInactiveRendering() {
- native_widget_delegate_->EnableInactiveRendering();
-}
-
-bool DesktopRootWindowHostWin::IsInactiveRenderingDisabled() {
- return native_widget_delegate_->IsInactiveRenderingDisabled();
-}
-
-bool DesktopRootWindowHostWin::CanResize() const {
- return GetWidget()->widget_delegate()->CanResize();
-}
-
-bool DesktopRootWindowHostWin::CanMaximize() const {
- return GetWidget()->widget_delegate()->CanMaximize();
-}
-
-bool DesktopRootWindowHostWin::CanActivate() const {
- if (IsModalWindowActive())
- return true;
- return native_widget_delegate_->CanActivate();
-}
-
-bool DesktopRootWindowHostWin::WidgetSizeIsClientSize() const {
- const Widget* widget = GetWidget()->GetTopLevelWidget();
- return IsMaximized() || (widget && widget->ShouldUseNativeFrame());
-}
-
-bool DesktopRootWindowHostWin::CanSaveFocus() const {
- return GetWidget()->is_top_level();
-}
-
-void DesktopRootWindowHostWin::SaveFocusOnDeactivate() {
- GetWidget()->GetFocusManager()->StoreFocusedView(true);
-}
-
-void DesktopRootWindowHostWin::RestoreFocusOnActivate() {
- RestoreFocusOnEnable();
-}
-
-void DesktopRootWindowHostWin::RestoreFocusOnEnable() {
- GetWidget()->GetFocusManager()->RestoreFocusedView();
-}
-
-bool DesktopRootWindowHostWin::IsModal() const {
- return native_widget_delegate_->IsModal();
-}
-
-int DesktopRootWindowHostWin::GetInitialShowState() const {
- return SW_SHOWNORMAL;
-}
-
-bool DesktopRootWindowHostWin::WillProcessWorkAreaChange() const {
- return GetWidget()->widget_delegate()->WillProcessWorkAreaChange();
-}
-
-int DesktopRootWindowHostWin::GetNonClientComponent(
- const gfx::Point& point) const {
- gfx::Point dip_position = gfx::win::ScreenToDIPPoint(point);
- return native_widget_delegate_->GetNonClientComponent(dip_position);
-}
-
-void DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::GetClientAreaInsets(gfx::Insets* insets) const {
- return false;
-}
-
-void DesktopRootWindowHostWin::GetMinMaxSize(gfx::Size* min_size,
- gfx::Size* max_size) const {
- *min_size = native_widget_delegate_->GetMinimumSize();
- *max_size = native_widget_delegate_->GetMaximumSize();
-}
-
-gfx::Size DesktopRootWindowHostWin::GetRootViewSize() const {
- return GetWidget()->GetRootView()->size();
-}
-
-void DesktopRootWindowHostWin::ResetWindowControls() {
- GetWidget()->non_client_view()->ResetWindowControls();
-}
-
-void DesktopRootWindowHostWin::PaintLayeredWindow(gfx::Canvas* canvas) {
- GetWidget()->GetRootView()->Paint(canvas);
-}
-
-gfx::NativeViewAccessible DesktopRootWindowHostWin::GetNativeViewAccessible() {
- return GetWidget()->GetRootView()->GetNativeViewAccessible();
-}
-
-InputMethod* DesktopRootWindowHostWin::GetInputMethod() {
- return GetWidget()->GetInputMethodDirect();
-}
-
-bool DesktopRootWindowHostWin::ShouldHandleSystemCommands() const {
- return GetWidget()->widget_delegate()->ShouldHandleSystemCommands();
-}
-
-void DesktopRootWindowHostWin::HandleAppDeactivated() {
- native_widget_delegate_->EnableInactiveRendering();
-}
-
-void DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::HandleCancelMode() {
- delegate_->OnHostCancelMode();
-}
-
-void DesktopRootWindowHostWin::HandleCaptureLost() {
- delegate_->OnHostLostWindowCapture();
- native_widget_delegate_->OnMouseCaptureLost();
-}
-
-void DesktopRootWindowHostWin::HandleClose() {
- GetWidget()->Close();
-}
-
-bool DesktopRootWindowHostWin::HandleCommand(int command) {
- return GetWidget()->widget_delegate()->ExecuteWindowsCommand(command);
-}
-
-void DesktopRootWindowHostWin::HandleAccelerator(
- const ui::Accelerator& accelerator) {
- GetWidget()->GetFocusManager()->ProcessAccelerator(accelerator);
-}
-
-void DesktopRootWindowHostWin::HandleCreate() {
- // TODO(beng): moar
- NOTIMPLEMENTED();
-
- native_widget_delegate_->OnNativeWidgetCreated(true);
-
- // 1. Window property association
- // 2. MouseWheel.
-}
-
-void DesktopRootWindowHostWin::HandleDestroying() {
- drag_drop_client_->OnNativeWidgetDestroying(GetHWND());
- native_widget_delegate_->OnNativeWidgetDestroying();
-}
-
-void DesktopRootWindowHostWin::HandleDestroyed() {
- desktop_native_widget_aura_->OnHostClosed();
-}
-
-bool DesktopRootWindowHostWin::HandleInitialFocus() {
- return GetWidget()->SetInitialFocus();
-}
-
-void DesktopRootWindowHostWin::HandleDisplayChange() {
- GetWidget()->widget_delegate()->OnDisplayChanged();
-}
-
-void DesktopRootWindowHostWin::HandleBeginWMSizeMove() {
- native_widget_delegate_->OnNativeWidgetBeginUserBoundsChange();
-}
-
-void DesktopRootWindowHostWin::HandleEndWMSizeMove() {
- native_widget_delegate_->OnNativeWidgetEndUserBoundsChange();
-}
-
-void DesktopRootWindowHostWin::HandleMove() {
- native_widget_delegate_->OnNativeWidgetMove();
- if (delegate_)
- delegate_->OnHostMoved(GetBounds().origin());
-}
-
-void DesktopRootWindowHostWin::HandleWorkAreaChanged() {
- GetWidget()->widget_delegate()->OnWorkAreaChanged();
-}
-
-void DesktopRootWindowHostWin::HandleVisibilityChanging(bool visible) {
- native_widget_delegate_->OnNativeWidgetVisibilityChanging(visible);
-}
-
-void DesktopRootWindowHostWin::HandleVisibilityChanged(bool visible) {
- native_widget_delegate_->OnNativeWidgetVisibilityChanged(visible);
-}
-
-void DesktopRootWindowHostWin::HandleClientSizeChanged(
- const gfx::Size& new_size) {
- if (delegate_)
- delegate_->OnHostResized(new_size);
-}
-
-void DesktopRootWindowHostWin::HandleFrameChanged() {
- SetWindowTransparency();
- // Replace the frame and layout the contents.
- GetWidget()->non_client_view()->UpdateFrame();
-}
-
-void DesktopRootWindowHostWin::HandleNativeFocus(HWND last_focused_window) {
- // TODO(beng): inform the native_widget_delegate_.
- InputMethod* input_method = GetInputMethod();
- if (input_method)
- input_method->OnFocus();
-}
-
-void DesktopRootWindowHostWin::HandleNativeBlur(HWND focused_window) {
- // TODO(beng): inform the native_widget_delegate_.
- InputMethod* input_method = GetInputMethod();
- if (input_method)
- input_method->OnBlur();
-}
-
-bool DesktopRootWindowHostWin::HandleMouseEvent(const ui::MouseEvent& event) {
- if (base::win::IsTSFAwareRequired() && event.IsAnyButton())
- ui::TSFBridge::GetInstance()->CancelComposition();
- return delegate_->OnHostMouseEvent(const_cast<ui::MouseEvent*>(&event));
-}
-
-bool DesktopRootWindowHostWin::HandleKeyEvent(const ui::KeyEvent& event) {
- return false;
-}
-
-bool DesktopRootWindowHostWin::HandleUntranslatedKeyEvent(
- const ui::KeyEvent& event) {
- ui::KeyEvent duplicate_event(event);
- return delegate_->OnHostKeyEvent(&duplicate_event);
-}
-
-void DesktopRootWindowHostWin::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) {
- DesktopRootWindowHostWin* target =
- root->window()->GetProperty(kDesktopRootWindowHostKey);
- 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->delegate_->OnHostTouchEvent(&target_event);
- return;
- }
- }
- delegate_->OnHostTouchEvent(
- const_cast<ui::TouchEvent*>(&event));
-}
-
-bool DesktopRootWindowHostWin::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 DesktopRootWindowHostWin::HandleInputLanguageChange(
- DWORD character_set,
- HKL input_language_id) {
- desktop_native_widget_aura_->input_method_event_filter()->
- input_method()->OnInputLocaleChanged();
-}
-
-bool DesktopRootWindowHostWin::HandlePaintAccelerated(
- const gfx::Rect& invalid_rect) {
- return native_widget_delegate_->OnNativeWidgetPaintAccelerated(invalid_rect);
-}
-
-void DesktopRootWindowHostWin::HandlePaint(gfx::Canvas* canvas) {
- delegate_->OnHostPaint(gfx::Rect());
-}
-
-bool DesktopRootWindowHostWin::HandleTooltipNotify(int w_param,
- NMHDR* l_param,
- LRESULT* l_result) {
- return tooltip_ && tooltip_->HandleNotify(w_param, l_param, l_result);
-}
-
-void DesktopRootWindowHostWin::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.
-}
-
-bool DesktopRootWindowHostWin::PreHandleMSG(UINT message,
- WPARAM w_param,
- LPARAM l_param,
- LRESULT* result) {
- return false;
-}
-
-void DesktopRootWindowHostWin::PostHandleMSG(UINT message,
- WPARAM w_param,
- LPARAM l_param) {
-}
-
-bool DesktopRootWindowHostWin::HandleScrollEvent(
- const ui::ScrollEvent& event) {
- return delegate_->OnHostScrollEvent(const_cast<ui::ScrollEvent*>(&event));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHostWin, private:
-
-Widget* DesktopRootWindowHostWin::GetWidget() {
- return native_widget_delegate_->AsWidget();
-}
-
-const Widget* DesktopRootWindowHostWin::GetWidget() const {
- return native_widget_delegate_->AsWidget();
-}
-
-HWND DesktopRootWindowHostWin::GetHWND() const {
- return message_handler_->hwnd();
-}
-
-void DesktopRootWindowHostWin::SetWindowTransparency() {
- bool transparent = ShouldUseNativeFrame() && !IsFullscreen();
- root_window_->compositor()->SetHostHasTransparentBackground(transparent);
- root_window_->window()->SetTransparent(transparent);
- content_window_->SetTransparent(transparent);
-}
-
-bool DesktopRootWindowHostWin::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;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHost, public:
-
-// static
-DesktopRootWindowHost* DesktopRootWindowHost::Create(
- internal::NativeWidgetDelegate* native_widget_delegate,
- DesktopNativeWidgetAura* desktop_native_widget_aura) {
- return new DesktopRootWindowHostWin(native_widget_delegate,
- desktop_native_widget_aura);
-}
-
-} // namespace views