Index: ui/views/mus/native_widget_mus.cc |
diff --git a/ui/views/mus/native_widget_mus.cc b/ui/views/mus/native_widget_mus.cc |
deleted file mode 100644 |
index 7b6d929e5c03f271b6caf0a8baa3e3383eb2287b..0000000000000000000000000000000000000000 |
--- a/ui/views/mus/native_widget_mus.cc |
+++ /dev/null |
@@ -1,1589 +0,0 @@ |
-// Copyright 2015 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. |
- |
-// This has to be before any other includes, else default is picked up. |
-// See base/logging for details on this. |
-#define NOTIMPLEMENTED_POLICY 5 |
- |
-#include "ui/views/mus/native_widget_mus.h" |
- |
-#include <map> |
-#include <utility> |
-#include <vector> |
- |
-#include "base/callback.h" |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "services/ui/public/cpp/property_type_converters.h" |
-#include "services/ui/public/cpp/window.h" |
-#include "services/ui/public/cpp/window_observer.h" |
-#include "services/ui/public/cpp/window_property.h" |
-#include "services/ui/public/cpp/window_tree_client.h" |
-#include "services/ui/public/interfaces/cursor.mojom.h" |
-#include "services/ui/public/interfaces/window_manager.mojom.h" |
-#include "services/ui/public/interfaces/window_manager_constants.mojom.h" |
-#include "services/ui/public/interfaces/window_tree.mojom.h" |
-#include "ui/aura/client/default_capture_client.h" |
-#include "ui/aura/client/window_parenting_client.h" |
-#include "ui/aura/layout_manager.h" |
-#include "ui/aura/mus/mus_util.h" |
-#include "ui/aura/mus/property_converter.h" |
-#include "ui/aura/window.h" |
-#include "ui/aura/window_property.h" |
-#include "ui/base/hit_test.h" |
-#include "ui/display/display.h" |
-#include "ui/display/screen.h" |
-#include "ui/events/event.h" |
-#include "ui/gfx/canvas.h" |
-#include "ui/gfx/geometry/dip_util.h" |
-#include "ui/gfx/path.h" |
-#include "ui/native_theme/native_theme.h" |
-#include "ui/platform_window/platform_window_delegate.h" |
-#include "ui/views/corewm/tooltip.h" |
-#include "ui/views/corewm/tooltip_aura.h" |
-#include "ui/views/corewm/tooltip_controller.h" |
-#include "ui/views/drag_utils.h" |
-#include "ui/views/mus/drag_drop_client_mus.h" |
-#include "ui/views/mus/drop_target_mus.h" |
-#include "ui/views/mus/input_method_mus.h" |
-#include "ui/views/mus/window_manager_connection.h" |
-#include "ui/views/mus/window_manager_constants_converters.h" |
-#include "ui/views/mus/window_manager_frame_values.h" |
-#include "ui/views/mus/window_tree_host_mus.h" |
-#include "ui/views/widget/drop_helper.h" |
-#include "ui/views/widget/native_widget_aura.h" |
-#include "ui/views/widget/tooltip_manager_aura.h" |
-#include "ui/views/widget/widget_delegate.h" |
-#include "ui/views/window/custom_frame_view.h" |
-#include "ui/wm/core/base_focus_rules.h" |
-#include "ui/wm/core/capture_controller.h" |
-#include "ui/wm/core/cursor_manager.h" |
-#include "ui/wm/core/default_screen_position_client.h" |
-#include "ui/wm/core/focus_controller.h" |
-#include "ui/wm/core/native_cursor_manager.h" |
- |
-DECLARE_WINDOW_PROPERTY_TYPE(ui::Window*); |
- |
-using PrimitiveType = aura::PropertyConverter::PrimitiveType; |
-using ui::mojom::EventResult; |
- |
-namespace views { |
-namespace { |
- |
-DEFINE_WINDOW_PROPERTY_KEY(ui::Window*, kMusWindow, nullptr); |
- |
-MUS_DEFINE_WINDOW_PROPERTY_KEY(NativeWidgetMus*, kNativeWidgetMusKey, nullptr); |
- |
-// This ensures that only the top-level aura Window can be activated. |
-class FocusRulesImpl : public wm::BaseFocusRules { |
- public: |
- explicit FocusRulesImpl(aura::Window* root) : root_(root) {} |
- ~FocusRulesImpl() override {} |
- |
- bool SupportsChildActivation(aura::Window* window) const override { |
- return root_ == window; |
- } |
- |
- private: |
- aura::Window* root_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FocusRulesImpl); |
-}; |
- |
-// This makes sure that an aura::Window focused (or activated) through the |
-// aura::client::FocusClient (or ActivationClient) focuses (or activates) the |
-// corresponding ui::Window too. |
-class FocusControllerMus : public wm::FocusController { |
- public: |
- explicit FocusControllerMus(wm::FocusRules* rules) : FocusController(rules) {} |
- ~FocusControllerMus() override {} |
- |
- private: |
- void FocusWindow(aura::Window* window) override { |
- FocusController::FocusWindow(window); |
- if (window) { |
- ui::Window* mus_window = window->GetRootWindow()->GetProperty(kMusWindow); |
- if (mus_window) |
- mus_window->SetFocus(); |
- } |
- } |
- |
- DISALLOW_COPY_AND_ASSIGN(FocusControllerMus); |
-}; |
- |
-class ContentWindowLayoutManager : public aura::LayoutManager { |
- public: |
- ContentWindowLayoutManager(aura::Window* outer, aura::Window* inner) |
- : outer_(outer), inner_(inner) {} |
- ~ContentWindowLayoutManager() override {} |
- |
- private: |
- // aura::LayoutManager: |
- void OnWindowResized() override { inner_->SetBounds(outer_->bounds()); } |
- void OnWindowAddedToLayout(aura::Window* child) override { |
- OnWindowResized(); |
- } |
- void OnWillRemoveWindowFromLayout(aura::Window* child) override {} |
- void OnWindowRemovedFromLayout(aura::Window* child) override {} |
- void OnChildWindowVisibilityChanged(aura::Window* child, |
- bool visible) override {} |
- void SetChildBounds(aura::Window* child, |
- const gfx::Rect& requested_bounds) override { |
- SetChildBoundsDirect(child, requested_bounds); |
- } |
- |
- aura::Window* outer_; |
- aura::Window* inner_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ContentWindowLayoutManager); |
-}; |
- |
-class NativeWidgetMusWindowParentingClient |
- : public aura::client::WindowParentingClient { |
- public: |
- explicit NativeWidgetMusWindowParentingClient(aura::Window* root_window) |
- : root_window_(root_window) { |
- aura::client::SetWindowParentingClient(root_window_, this); |
- } |
- ~NativeWidgetMusWindowParentingClient() override { |
- aura::client::SetWindowParentingClient(root_window_, nullptr); |
- } |
- |
- // Overridden from client::WindowParentingClient: |
- aura::Window* GetDefaultParent(aura::Window* context, |
- aura::Window* window, |
- const gfx::Rect& bounds) override { |
- return root_window_; |
- } |
- |
- private: |
- aura::Window* root_window_; |
- |
- DISALLOW_COPY_AND_ASSIGN(NativeWidgetMusWindowParentingClient); |
-}; |
- |
-// A screen position client that applies the offset of the ui::Window. |
-class ScreenPositionClientMus : public wm::DefaultScreenPositionClient { |
- public: |
- explicit ScreenPositionClientMus(ui::Window* mus_window) |
- : mus_window_(mus_window) {} |
- ~ScreenPositionClientMus() override {} |
- |
- // wm::DefaultScreenPositionClient: |
- void ConvertPointToScreen(const aura::Window* window, |
- gfx::Point* point) override { |
- wm::DefaultScreenPositionClient::ConvertPointToScreen(window, point); |
- gfx::Rect mus_bounds = mus_window_->GetBoundsInRoot(); |
- point->Offset(-mus_bounds.x(), -mus_bounds.y()); |
- } |
- void ConvertPointFromScreen(const aura::Window* window, |
- gfx::Point* point) override { |
- gfx::Rect mus_bounds = mus_window_->GetBoundsInRoot(); |
- point->Offset(mus_bounds.x(), mus_bounds.y()); |
- wm::DefaultScreenPositionClient::ConvertPointFromScreen(window, point); |
- } |
- |
- private: |
- ui::Window* mus_window_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ScreenPositionClientMus); |
-}; |
- |
-class NativeCursorManagerMus : public wm::NativeCursorManager { |
- public: |
- explicit NativeCursorManagerMus(ui::Window* mus_window) |
- : mus_window_(mus_window) {} |
- ~NativeCursorManagerMus() override {} |
- |
- // wm::NativeCursorManager: |
- void SetDisplay(const display::Display& display, |
- wm::NativeCursorManagerDelegate* delegate) override { |
- // We ignore this entirely, as cursor are set on the client. |
- } |
- |
- void SetCursor(gfx::NativeCursor cursor, |
- wm::NativeCursorManagerDelegate* delegate) override { |
- mus_window_->SetPredefinedCursor(ui::mojom::Cursor(cursor.native_type())); |
- delegate->CommitCursor(cursor); |
- } |
- |
- void SetVisibility(bool visible, |
- wm::NativeCursorManagerDelegate* delegate) override { |
- delegate->CommitVisibility(visible); |
- |
- if (visible) |
- SetCursor(delegate->GetCursor(), delegate); |
- else |
- mus_window_->SetPredefinedCursor(ui::mojom::Cursor::NONE); |
- } |
- |
- void SetCursorSet(ui::CursorSetType cursor_set, |
- wm::NativeCursorManagerDelegate* delegate) override { |
- // TODO(erg): For now, ignore the difference between SET_NORMAL and |
- // SET_LARGE here. This feels like a thing that mus should decide instead. |
- // |
- // Also, it's NOTIMPLEMENTED() in the desktop version!? Including not |
- // acknowledging the call in the delegate. |
- NOTIMPLEMENTED(); |
- } |
- |
- void SetMouseEventsEnabled( |
- bool enabled, |
- wm::NativeCursorManagerDelegate* delegate) override { |
- // TODO(erg): How do we actually implement this? |
- // |
- // Mouse event dispatch is potentially done in a different process, |
- // definitely in a different mojo service. Each app is fairly locked down. |
- delegate->CommitMouseEventsEnabled(enabled); |
- NOTIMPLEMENTED(); |
- } |
- |
- private: |
- ui::Window* mus_window_; |
- |
- DISALLOW_COPY_AND_ASSIGN(NativeCursorManagerMus); |
-}; |
- |
-// As the window manager renderers the non-client decorations this class does |
-// very little but honor the client area insets from the window manager. |
-class ClientSideNonClientFrameView : public NonClientFrameView { |
- public: |
- explicit ClientSideNonClientFrameView(views::Widget* widget) |
- : widget_(widget) {} |
- ~ClientSideNonClientFrameView() override {} |
- |
- private: |
- // Returns the default values of client area insets from the window manager. |
- static gfx::Insets GetDefaultWindowManagerInsets(bool is_maximized) { |
- const WindowManagerFrameValues& values = |
- WindowManagerFrameValues::instance(); |
- return is_maximized ? values.maximized_insets : values.normal_insets; |
- } |
- |
- // NonClientFrameView: |
- gfx::Rect GetBoundsForClientView() const override { |
- gfx::Rect result(GetLocalBounds()); |
- if (widget_->IsFullscreen()) |
- return result; |
- result.Inset(GetDefaultWindowManagerInsets(widget_->IsMaximized())); |
- return result; |
- } |
- gfx::Rect GetWindowBoundsForClientBounds( |
- const gfx::Rect& client_bounds) const override { |
- if (widget_->IsFullscreen()) |
- return client_bounds; |
- |
- const gfx::Insets insets( |
- GetDefaultWindowManagerInsets(widget_->IsMaximized())); |
- return gfx::Rect(client_bounds.x() - insets.left(), |
- client_bounds.y() - insets.top(), |
- client_bounds.width() + insets.width(), |
- client_bounds.height() + insets.height()); |
- } |
- int NonClientHitTest(const gfx::Point& point) override { return HTNOWHERE; } |
- void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask) override { |
- // The window manager provides the shape; do nothing. |
- } |
- void ResetWindowControls() override { |
- // TODO(sky): push to wm? |
- } |
- |
- // These have no implementation. The Window Manager handles the actual |
- // rendering of the icon/title. See NonClientFrameViewMash. The values |
- // associated with these methods are pushed to the server by the way of |
- // NativeWidgetMus functions. |
- void UpdateWindowIcon() override {} |
- void UpdateWindowTitle() override {} |
- void SizeConstraintsChanged() override {} |
- |
- gfx::Size GetPreferredSize() const override { |
- return widget_->non_client_view() |
- ->GetWindowBoundsForClientBounds( |
- gfx::Rect(widget_->client_view()->GetPreferredSize())) |
- .size(); |
- } |
- gfx::Size GetMinimumSize() const override { |
- return widget_->non_client_view() |
- ->GetWindowBoundsForClientBounds( |
- gfx::Rect(widget_->client_view()->GetMinimumSize())) |
- .size(); |
- } |
- gfx::Size GetMaximumSize() const override { |
- gfx::Size max_size = widget_->client_view()->GetMaximumSize(); |
- gfx::Size converted_size = |
- widget_->non_client_view() |
- ->GetWindowBoundsForClientBounds(gfx::Rect(max_size)) |
- .size(); |
- return gfx::Size(max_size.width() == 0 ? 0 : converted_size.width(), |
- max_size.height() == 0 ? 0 : converted_size.height()); |
- } |
- |
- views::Widget* widget_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ClientSideNonClientFrameView); |
-}; |
- |
-// Handles acknowledgment of an input event, either immediately when a nested |
-// message loop starts, or upon destruction. |
-class EventAckHandler : public base::MessageLoop::NestingObserver { |
- public: |
- explicit EventAckHandler( |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback) |
- : ack_callback_(std::move(ack_callback)) { |
- DCHECK(ack_callback_); |
- base::MessageLoop::current()->AddNestingObserver(this); |
- } |
- |
- ~EventAckHandler() override { |
- base::MessageLoop::current()->RemoveNestingObserver(this); |
- if (ack_callback_) { |
- ack_callback_->Run(handled_ ? EventResult::HANDLED |
- : EventResult::UNHANDLED); |
- } |
- } |
- |
- void set_handled(bool handled) { handled_ = handled; } |
- |
- // base::MessageLoop::NestingObserver: |
- void OnBeginNestedMessageLoop() override { |
- // Acknowledge the event immediately if a nested message loop starts. |
- // Otherwise we appear unresponsive for the life of the nested message loop. |
- if (ack_callback_) { |
- ack_callback_->Run(EventResult::HANDLED); |
- ack_callback_.reset(); |
- } |
- } |
- |
- private: |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback_; |
- bool handled_ = false; |
- |
- DISALLOW_COPY_AND_ASSIGN(EventAckHandler); |
-}; |
- |
-void OnMoveLoopEnd(bool* out_success, |
- base::Closure quit_closure, |
- bool in_success) { |
- *out_success = in_success; |
- quit_closure.Run(); |
-} |
- |
-ui::mojom::ShowState GetShowState(const ui::Window* window) { |
- if (!window || |
- !window->HasSharedProperty( |
- ui::mojom::WindowManager::kShowState_Property)) { |
- return ui::mojom::ShowState::DEFAULT; |
- } |
- |
- return static_cast<ui::mojom::ShowState>( |
- window->GetSharedProperty<PrimitiveType>( |
- ui::mojom::WindowManager::kShowState_Property)); |
-} |
- |
-// Set the app or window icon property for the window. |
-void SetIconProperty(ui::Window* window, |
- const char* const property, |
- const gfx::ImageSkia& icon) { |
- // TODO(crbug.com/667566): Support additional scales or gfx::Image[Skia]. |
- SkBitmap bitmap = icon.GetRepresentation(1.f).sk_bitmap(); |
- if (!bitmap.isNull()) |
- window->SetSharedProperty<SkBitmap>(property, bitmap); |
- else if (window->HasSharedProperty(property)) |
- window->ClearSharedProperty(property); |
-} |
- |
-// Helper function to get the device_scale_factor() of the display::Display |
-// nearest to |window|. |
-float ScaleFactorForDisplay(aura::Window* window) { |
- return display::Screen::GetScreen() |
- ->GetDisplayNearestWindow(window) |
- .device_scale_factor(); |
-} |
- |
-} // namespace |
- |
-class NativeWidgetMus::MusWindowObserver : public ui::WindowObserver { |
- public: |
- explicit MusWindowObserver(NativeWidgetMus* native_widget_mus) |
- : native_widget_mus_(native_widget_mus), |
- show_state_(ui::mojom::ShowState::DEFAULT) { |
- mus_window()->AddObserver(this); |
- } |
- |
- ~MusWindowObserver() override { |
- mus_window()->RemoveObserver(this); |
- } |
- |
- // ui::WindowObserver: |
- void OnWindowVisibilityChanging(ui::Window* window, bool visible) override { |
- native_widget_mus_->OnMusWindowVisibilityChanging(window, visible); |
- } |
- void OnWindowVisibilityChanged(ui::Window* window, bool visible) override { |
- native_widget_mus_->OnMusWindowVisibilityChanged(window, visible); |
- } |
- void OnWindowPredefinedCursorChanged(ui::Window* window, |
- ui::mojom::Cursor cursor) override { |
- DCHECK_EQ(window, mus_window()); |
- native_widget_mus_->set_last_cursor(cursor); |
- } |
- void OnWindowSharedPropertyChanged( |
- ui::Window* window, |
- const std::string& name, |
- const std::vector<uint8_t>* old_data, |
- const std::vector<uint8_t>* new_data) override { |
- if (name != ui::mojom::WindowManager::kShowState_Property) |
- return; |
- const ui::mojom::ShowState show_state = GetShowState(window); |
- if (show_state == show_state_) |
- return; |
- show_state_ = show_state; |
- ui::PlatformWindowState state = ui::PLATFORM_WINDOW_STATE_UNKNOWN; |
- switch (show_state_) { |
- case ui::mojom::ShowState::MINIMIZED: |
- state = ui::PLATFORM_WINDOW_STATE_MINIMIZED; |
- break; |
- case ui::mojom::ShowState::MAXIMIZED: |
- state = ui::PLATFORM_WINDOW_STATE_MAXIMIZED; |
- break; |
- case ui::mojom::ShowState::DEFAULT: |
- case ui::mojom::ShowState::INACTIVE: |
- case ui::mojom::ShowState::NORMAL: |
- case ui::mojom::ShowState::DOCKED: |
- // TODO(sky): support docked. |
- state = ui::PLATFORM_WINDOW_STATE_NORMAL; |
- break; |
- case ui::mojom::ShowState::FULLSCREEN: |
- state = ui::PLATFORM_WINDOW_STATE_FULLSCREEN; |
- break; |
- } |
- platform_window_delegate()->OnWindowStateChanged(state); |
- } |
- void OnWindowDestroyed(ui::Window* window) override { |
- DCHECK_EQ(mus_window(), window); |
- platform_window_delegate()->OnClosed(); |
- } |
- void OnWindowBoundsChanging(ui::Window* window, |
- const gfx::Rect& old_bounds, |
- const gfx::Rect& new_bounds) override { |
- DCHECK_EQ(window, mus_window()); |
- window_tree_host()->SetBoundsInPixels(gfx::ConvertRectToPixel( |
- ScaleFactorForDisplay(aura_window()), new_bounds)); |
- } |
- void OnWindowFocusChanged(ui::Window* gained_focus, |
- ui::Window* lost_focus) override { |
- if (gained_focus == mus_window()) |
- platform_window_delegate()->OnActivationChanged(true); |
- else if (lost_focus == mus_window()) |
- platform_window_delegate()->OnActivationChanged(false); |
- } |
- void OnRequestClose(ui::Window* window) override { |
- platform_window_delegate()->OnCloseRequest(); |
- } |
- |
- private: |
- ui::Window* mus_window() { return native_widget_mus_->window(); } |
- aura::Window* aura_window() { return native_widget_mus_->aura_window(); } |
- WindowTreeHostMus* window_tree_host() { |
- return native_widget_mus_->window_tree_host(); |
- } |
- ui::PlatformWindowDelegate* platform_window_delegate() { |
- return native_widget_mus_->window_tree_host(); |
- } |
- |
- NativeWidgetMus* native_widget_mus_; |
- ui::mojom::ShowState show_state_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MusWindowObserver); |
-}; |
- |
-class NativeWidgetMus::MusCaptureClient |
- : public aura::client::DefaultCaptureClient { |
- public: |
- MusCaptureClient(aura::Window* root_window, |
- aura::Window* aura_window, |
- ui::Window* mus_window) |
- : aura::client::DefaultCaptureClient(root_window), |
- aura_window_(aura_window), |
- mus_window_(mus_window) {} |
- ~MusCaptureClient() override {} |
- |
- // aura::client::DefaultCaptureClient: |
- void SetCapture(aura::Window* window) override { |
- aura::client::DefaultCaptureClient::SetCapture(window); |
- if (aura_window_ == window) |
- mus_window_->SetCapture(); |
- } |
- void ReleaseCapture(aura::Window* window) override { |
- aura::client::DefaultCaptureClient::ReleaseCapture(window); |
- if (aura_window_ == window) |
- mus_window_->ReleaseCapture(); |
- } |
- |
- private: |
- aura::Window* aura_window_; |
- ui::Window* mus_window_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MusCaptureClient); |
-}; |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeWidgetMus, public: |
- |
-NativeWidgetMus::NativeWidgetMus( |
- internal::NativeWidgetDelegate* delegate, |
- ui::Window* window, |
- ui::mojom::CompositorFrameSinkType compositor_frame_sink_type) |
- : window_(window), |
- last_cursor_(ui::mojom::Cursor::CURSOR_NULL), |
- native_widget_delegate_(delegate), |
- compositor_frame_sink_type_(compositor_frame_sink_type), |
- show_state_before_fullscreen_(ui::mojom::ShowState::DEFAULT), |
- ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), |
- content_(new aura::Window(this)), |
- last_drop_operation_(ui::DragDropTypes::DRAG_NONE), |
- close_widget_factory_(this) { |
- window_->set_input_event_handler(this); |
- mus_window_observer_ = base::MakeUnique<MusWindowObserver>(this); |
- |
- // TODO(fsamuel): Figure out lifetime of |window_|. |
- aura::SetMusWindow(content_, window_); |
- window->SetLocalProperty(kNativeWidgetMusKey, this); |
- window_tree_host_ = base::MakeUnique<WindowTreeHostMus>(this, window_); |
- input_method_ = |
- base::MakeUnique<InputMethodMus>(window_tree_host_.get(), window_); |
- window_tree_host_->SetSharedInputMethod(input_method_.get()); |
-} |
- |
-NativeWidgetMus::~NativeWidgetMus() { |
- if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) { |
- DCHECK(!window_); |
- delete native_widget_delegate_; |
- } else { |
- if (window_) |
- window_->set_input_event_handler(nullptr); |
- CloseNow(); |
- } |
-} |
- |
-// static |
-void NativeWidgetMus::NotifyFrameChanged(ui::WindowTreeClient* client) { |
- for (ui::Window* window : client->GetRoots()) { |
- NativeWidgetMus* native_widget = |
- window->GetLocalProperty(kNativeWidgetMusKey); |
- if (native_widget && native_widget->GetWidget()->non_client_view()) { |
- native_widget->GetWidget()->non_client_view()->Layout(); |
- native_widget->GetWidget()->non_client_view()->SchedulePaint(); |
- native_widget->UpdateClientArea(); |
- native_widget->UpdateHitTestMask(); |
- } |
- } |
-} |
- |
-// static |
-NativeWidgetMus* NativeWidgetMus::GetForWindow(ui::Window* window) { |
- DCHECK(window); |
- NativeWidgetMus* native_widget = |
- window->GetLocalProperty(kNativeWidgetMusKey); |
- return native_widget; |
-} |
- |
-// static |
-Widget* NativeWidgetMus::GetWidgetForWindow(ui::Window* window) { |
- NativeWidgetMus* native_widget = GetForWindow(window); |
- if (!native_widget) |
- return nullptr; |
- return native_widget->GetWidget(); |
-} |
- |
-aura::Window* NativeWidgetMus::GetRootWindow() { |
- return window_tree_host_->window(); |
-} |
- |
-void NativeWidgetMus::OnPlatformWindowClosed() { |
- native_widget_delegate_->OnNativeWidgetDestroying(); |
- |
- tooltip_manager_.reset(); |
- if (tooltip_controller_.get()) { |
- window_tree_host_->window()->RemovePreTargetHandler( |
- tooltip_controller_.get()); |
- aura::client::SetTooltipClient(window_tree_host_->window(), NULL); |
- tooltip_controller_.reset(); |
- } |
- |
- window_parenting_client_.reset(); // Uses |content_|. |
- capture_client_.reset(); // Uses |content_|. |
- |
- window_tree_host_->RemoveObserver(this); |
- window_tree_host_.reset(); |
- |
- cursor_manager_.reset(); // Uses |window_|. |
- |
- mus_window_observer_.reset(nullptr); |
- |
- window_ = nullptr; |
- content_ = nullptr; |
- |
- native_widget_delegate_->OnNativeWidgetDestroyed(); |
- if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) |
- delete this; |
-} |
- |
-void NativeWidgetMus::OnActivationChanged(bool active) { |
- if (!native_widget_delegate_) |
- return; |
- if (active) { |
- native_widget_delegate_->OnNativeFocus(); |
- GetWidget()->GetFocusManager()->RestoreFocusedView(); |
- } else { |
- native_widget_delegate_->OnNativeBlur(); |
- GetWidget()->GetFocusManager()->StoreFocusedView(true); |
- } |
- native_widget_delegate_->OnNativeWidgetActivationChanged(active); |
-} |
- |
-void NativeWidgetMus::UpdateClientArea() { |
- if (is_parallel_widget_in_window_manager()) |
- return; |
- |
- NonClientView* non_client_view = |
- native_widget_delegate_->AsWidget()->non_client_view(); |
- if (!non_client_view || !non_client_view->client_view()) |
- return; |
- |
- const gfx::Rect client_area_rect(non_client_view->client_view()->bounds()); |
- window_->SetClientArea(gfx::Insets( |
- client_area_rect.y(), client_area_rect.x(), |
- non_client_view->bounds().height() - client_area_rect.bottom(), |
- non_client_view->bounds().width() - client_area_rect.right())); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeWidgetMus, private: |
- |
-// static |
-void NativeWidgetMus::ConfigurePropertiesForNewWindow( |
- const Widget::InitParams& init_params, |
- std::map<std::string, std::vector<uint8_t>>* properties) { |
- properties->insert(init_params.mus_properties.begin(), |
- init_params.mus_properties.end()); |
- if (!init_params.bounds.IsEmpty()) { |
- (*properties)[ui::mojom::WindowManager::kBounds_InitProperty] = |
- mojo::ConvertTo<std::vector<uint8_t>>(init_params.bounds); |
- } |
- if (!init_params.name.empty()) { |
- (*properties)[ui::mojom::WindowManager::kName_Property] = |
- mojo::ConvertTo<std::vector<uint8_t>>(init_params.name); |
- } |
- (*properties)[ui::mojom::WindowManager::kAlwaysOnTop_Property] = |
- mojo::ConvertTo<std::vector<uint8_t>>( |
- static_cast<PrimitiveType>(init_params.keep_on_top)); |
- |
- (*properties)[ui::mojom::WindowManager::kWindowType_InitProperty] = |
- mojo::ConvertTo<std::vector<uint8_t>>( |
- static_cast<int32_t>(init_params.type)); |
- |
- if (!Widget::RequiresNonClientView(init_params.type)) |
- return; |
- |
- if (init_params.delegate) { |
- if (properties->count(ui::mojom::WindowManager::kResizeBehavior_Property) == |
- 0) { |
- (*properties)[ui::mojom::WindowManager::kResizeBehavior_Property] = |
- mojo::ConvertTo<std::vector<uint8_t>>(static_cast<PrimitiveType>( |
- init_params.delegate->GetResizeBehavior())); |
- } |
- |
- // TODO(crbug.com/667566): Support additional scales or gfx::Image[Skia]. |
- gfx::ImageSkia app_icon = init_params.delegate->GetWindowAppIcon(); |
- SkBitmap app_bitmap = app_icon.GetRepresentation(1.f).sk_bitmap(); |
- if (!app_bitmap.isNull()) { |
- (*properties)[ui::mojom::WindowManager::kAppIcon_Property] = |
- mojo::ConvertTo<std::vector<uint8_t>>(app_bitmap); |
- } |
- // TODO(crbug.com/667566): Support additional scales or gfx::Image[Skia]. |
- gfx::ImageSkia window_icon = init_params.delegate->GetWindowIcon(); |
- SkBitmap window_bitmap = window_icon.GetRepresentation(1.f).sk_bitmap(); |
- if (!window_bitmap.isNull()) { |
- (*properties)[ui::mojom::WindowManager::kWindowIcon_Property] = |
- mojo::ConvertTo<std::vector<uint8_t>>(window_bitmap); |
- } |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeWidgetMus, internal::NativeWidgetPrivate implementation: |
- |
-NonClientFrameView* NativeWidgetMus::CreateNonClientFrameView() { |
- return new ClientSideNonClientFrameView(GetWidget()); |
-} |
- |
-void NativeWidgetMus::InitNativeWidget(const Widget::InitParams& params) { |
- NativeWidgetAura::RegisterNativeWidgetForWindow(this, content_); |
- aura::Window* hosted_window = window_tree_host_->window(); |
- |
- ownership_ = params.ownership; |
- window_->SetCanFocus(params.activatable == |
- Widget::InitParams::ACTIVATABLE_YES); |
- window_->SetCanAcceptEvents(params.accept_events); |
- |
- window_tree_host_->AddObserver(this); |
- window_tree_host_->InitHost(); |
- window_tree_host_->window()->Show(); |
- hosted_window->SetProperty(kMusWindow, window_); |
- |
- // TODO(moshayedi): crbug.com/641039. Investigate whether there are any cases |
- // where we need input method but don't have the WindowManagerConnection here. |
- if (WindowManagerConnection::Exists()) |
- input_method_->Init(WindowManagerConnection::Get()->connector()); |
- |
- focus_client_ = |
- base::MakeUnique<FocusControllerMus>(new FocusRulesImpl(hosted_window)); |
- |
- aura::client::SetFocusClient(hosted_window, focus_client_.get()); |
- aura::client::SetActivationClient(hosted_window, focus_client_.get()); |
- screen_position_client_ = base::MakeUnique<ScreenPositionClientMus>(window_); |
- aura::client::SetScreenPositionClient(hosted_window, |
- screen_position_client_.get()); |
- |
- drag_drop_client_ = base::MakeUnique<DragDropClientMus>(window_); |
- aura::client::SetDragDropClient(hosted_window, drag_drop_client_.get()); |
- drop_target_ = base::MakeUnique<DropTargetMus>(content_); |
- window_->SetCanAcceptDrops(drop_target_.get()); |
- drop_helper_ = base::MakeUnique<DropHelper>(GetWidget()->GetRootView()); |
- aura::client::SetDragDropDelegate(content_, this); |
- |
- if (params.type != Widget::InitParams::TYPE_TOOLTIP) { |
- tooltip_manager_ = base::MakeUnique<TooltipManagerAura>(GetWidget()); |
- tooltip_controller_ = base::MakeUnique<corewm::TooltipController>( |
- base::MakeUnique<corewm::TooltipAura>()); |
- aura::client::SetTooltipClient(window_tree_host_->window(), |
- tooltip_controller_.get()); |
- window_tree_host_->window()->AddPreTargetHandler(tooltip_controller_.get()); |
- } |
- |
- // TODO(erg): Remove this check when ash/mus/move_event_handler.cc's |
- // direct usage of ui::Window::SetPredefinedCursor() is switched to a |
- // private method on WindowManagerClient. |
- if (!is_parallel_widget_in_window_manager()) { |
- cursor_manager_ = base::MakeUnique<wm::CursorManager>( |
- base::MakeUnique<NativeCursorManagerMus>(window_)); |
- aura::client::SetCursorClient(hosted_window, cursor_manager_.get()); |
- } |
- |
- window_parenting_client_ = |
- base::MakeUnique<NativeWidgetMusWindowParentingClient>(hosted_window); |
- hosted_window->AddPreTargetHandler(focus_client_.get()); |
- hosted_window->SetLayoutManager( |
- new ContentWindowLayoutManager(hosted_window, content_)); |
- capture_client_ = |
- base::MakeUnique<MusCaptureClient>(hosted_window, content_, window_); |
- |
- content_->SetType(ui::wm::WINDOW_TYPE_NORMAL); |
- content_->Init(params.layer_type); |
- if (window_->visible()) |
- content_->Show(); |
- content_->SetTransparent(true); |
- content_->SetFillsBoundsCompletely(false); |
- content_->set_ignore_events(!params.accept_events); |
- hosted_window->AddChild(content_); |
- |
- ui::Window* parent_mus = params.parent_mus; |
- |
- // Set-up transiency if appropriate. |
- if (params.parent && !params.child) { |
- aura::Window* parent_root_aura = params.parent->GetRootWindow(); |
- ui::Window* parent_root_mus = parent_root_aura->GetProperty(kMusWindow); |
- if (parent_root_mus) { |
- parent_root_mus->AddTransientWindow(window_); |
- if (!parent_mus) |
- parent_mus = parent_root_mus; |
- } |
- } |
- |
- if (parent_mus) |
- parent_mus->AddChild(window_); |
- |
- // TODO(sky): deal with show state. |
- if (!params.bounds.size().IsEmpty()) |
- SetBounds(params.bounds); |
- |
- // TODO(beng): much else, see [Desktop]NativeWidgetAura. |
- |
- native_widget_delegate_->OnNativeWidgetCreated(false); |
-} |
- |
-void NativeWidgetMus::OnWidgetInitDone() { |
- // The client area is calculated from the NonClientView. During |
- // InitNativeWidget() the NonClientView has not been created. When this |
- // function is called the NonClientView has been created, so that we can |
- // correctly calculate the client area and push it to the ui::Window. |
- UpdateClientArea(); |
- UpdateHitTestMask(); |
-} |
- |
-bool NativeWidgetMus::ShouldUseNativeFrame() const { |
- NOTIMPLEMENTED(); |
- return false; |
-} |
- |
-bool NativeWidgetMus::ShouldWindowContentsBeTransparent() const { |
- NOTIMPLEMENTED(); |
- return true; |
-} |
- |
-void NativeWidgetMus::FrameTypeChanged() { |
- NOTIMPLEMENTED(); |
-} |
- |
-Widget* NativeWidgetMus::GetWidget() { |
- return native_widget_delegate_->AsWidget(); |
-} |
- |
-const Widget* NativeWidgetMus::GetWidget() const { |
- return native_widget_delegate_->AsWidget(); |
-} |
- |
-gfx::NativeView NativeWidgetMus::GetNativeView() const { |
- return content_; |
-} |
- |
-gfx::NativeWindow NativeWidgetMus::GetNativeWindow() const { |
- return content_; |
-} |
- |
-Widget* NativeWidgetMus::GetTopLevelWidget() { |
- return GetWidget(); |
-} |
- |
-const ui::Compositor* NativeWidgetMus::GetCompositor() const { |
- return window_tree_host_->compositor(); |
-} |
- |
-const ui::Layer* NativeWidgetMus::GetLayer() const { |
- return content_ ? content_->layer() : nullptr; |
-} |
- |
-void NativeWidgetMus::ReorderNativeViews() { |
- NOTIMPLEMENTED(); |
-} |
- |
-void NativeWidgetMus::ViewRemoved(View* view) { |
- NOTIMPLEMENTED(); |
-} |
- |
-// These methods are wrong in mojo. They're not usually used to associate data |
-// with a window; they are used to pass data from one layer to another (and in |
-// chrome/ to unsafely pass raw pointers around--I can only find two places |
-// where we do the "safe" thing and even that requires casting an integer to a |
-// void*). They can't be used safely in a world where we separate things with |
-// mojo. |
-// |
-// It's also used to communicate between views and aura; in views, we set |
-// properties on a widget, and read these properties directly in aura code. |
-void NativeWidgetMus::SetNativeWindowProperty(const char* name, void* value) { |
- if (content_) |
- content_->SetNativeWindowProperty(name, value); |
-} |
- |
-void* NativeWidgetMus::GetNativeWindowProperty(const char* name) const { |
- return content_ ? content_->GetNativeWindowProperty(name) : nullptr; |
-} |
- |
-TooltipManager* NativeWidgetMus::GetTooltipManager() const { |
- return tooltip_manager_.get(); |
-} |
- |
-void NativeWidgetMus::SetCapture() { |
- if (content_) |
- content_->SetCapture(); |
-} |
- |
-void NativeWidgetMus::ReleaseCapture() { |
- if (content_) |
- content_->ReleaseCapture(); |
-} |
- |
-bool NativeWidgetMus::HasCapture() const { |
- return content_ && content_->HasCapture(); |
-} |
- |
-ui::InputMethod* NativeWidgetMus::GetInputMethod() { |
- return window_tree_host_ ? window_tree_host_->GetInputMethod() : nullptr; |
-} |
- |
-void NativeWidgetMus::CenterWindow(const gfx::Size& size) { |
- if (is_parallel_widget_in_window_manager()) |
- return; |
- // TODO(beng): clear user-placed property and set preferred size property. |
- window_->SetSharedProperty<gfx::Size>( |
- ui::mojom::WindowManager::kPreferredSize_Property, size); |
- |
- gfx::Rect bounds = display::Screen::GetScreen() |
- ->GetDisplayNearestWindow(content_) |
- .work_area(); |
- bounds.ClampToCenteredSize(size); |
- window_->SetBounds(bounds); |
-} |
- |
-void NativeWidgetMus::GetWindowPlacement( |
- gfx::Rect* bounds, |
- ui::WindowShowState* maximized) const { |
- NOTIMPLEMENTED(); |
-} |
- |
-bool NativeWidgetMus::SetWindowTitle(const base::string16& title) { |
- if (!window_ || is_parallel_widget_in_window_manager()) |
- return false; |
- const char* kWindowTitle_Property = |
- ui::mojom::WindowManager::kWindowTitle_Property; |
- const base::string16 current_title = |
- window_->HasSharedProperty(kWindowTitle_Property) |
- ? window_->GetSharedProperty<base::string16>(kWindowTitle_Property) |
- : base::string16(); |
- if (current_title == title) |
- return false; |
- window_->SetSharedProperty<base::string16>(kWindowTitle_Property, title); |
- return true; |
-} |
- |
-void NativeWidgetMus::SetWindowIcons(const gfx::ImageSkia& window_icon, |
- const gfx::ImageSkia& app_icon) { |
- if (is_parallel_widget_in_window_manager()) |
- return; |
- |
- SetIconProperty(window_, ui::mojom::WindowManager::kWindowIcon_Property, |
- window_icon); |
- SetIconProperty(window_, ui::mojom::WindowManager::kAppIcon_Property, |
- app_icon); |
-} |
- |
-void NativeWidgetMus::InitModalType(ui::ModalType modal_type) { |
- if (modal_type != ui::MODAL_TYPE_NONE) |
- window_->SetModal(); |
-} |
- |
-gfx::Rect NativeWidgetMus::GetWindowBoundsInScreen() const { |
- if (!window_) |
- return gfx::Rect(); |
- |
- // Correct for the origin of the display. |
- const int64_t window_display_id = window_->GetRoot()->display_id(); |
- for (display::Display display : |
- display::Screen::GetScreen()->GetAllDisplays()) { |
- if (display.id() == window_display_id) { |
- gfx::Point display_origin = display.bounds().origin(); |
- gfx::Rect bounds_in_screen = window_->GetBoundsInRoot(); |
- bounds_in_screen.Offset(display_origin.x(), display_origin.y()); |
- return bounds_in_screen; |
- } |
- } |
- // Unknown display, assume primary display at 0,0. |
- return window_->GetBoundsInRoot(); |
-} |
- |
-gfx::Rect NativeWidgetMus::GetClientAreaBoundsInScreen() const { |
- // View-to-screen coordinate system transformations depend on this returning |
- // the full window bounds, for example View::ConvertPointToScreen(). |
- return GetWindowBoundsInScreen(); |
-} |
- |
-gfx::Rect NativeWidgetMus::GetRestoredBounds() const { |
- // Restored bounds should only be relevant if the window is minimized, |
- // maximized, fullscreen or docked. However, in some places the code expects |
- // GetRestoredBounds() to return the current window bounds if the window is |
- // not in either state. |
- if (IsMinimized() || IsMaximized() || IsFullscreen()) { |
- const char* kRestoreBounds_Property = |
- ui::mojom::WindowManager::kRestoreBounds_Property; |
- if (window_->HasSharedProperty(kRestoreBounds_Property)) |
- return window_->GetSharedProperty<gfx::Rect>(kRestoreBounds_Property); |
- } |
- return GetWindowBoundsInScreen(); |
-} |
- |
-std::string NativeWidgetMus::GetWorkspace() const { |
- return std::string(); |
-} |
- |
-void NativeWidgetMus::SetBounds(const gfx::Rect& bounds_in_screen) { |
- if (!(window_ && window_tree_host_)) |
- return; |
- |
- // TODO(jamescook): Needs something like aura::ScreenPositionClient so higher |
- // level code can move windows between displays. crbug.com/645291 |
- gfx::Point origin(bounds_in_screen.origin()); |
- const gfx::Point display_origin = display::Screen::GetScreen() |
- ->GetDisplayMatching(bounds_in_screen) |
- .bounds() |
- .origin(); |
- origin.Offset(-display_origin.x(), -display_origin.y()); |
- |
- gfx::Size size(bounds_in_screen.size()); |
- const gfx::Size min_size = GetMinimumSize(); |
- const gfx::Size max_size = GetMaximumSize(); |
- if (!max_size.IsEmpty()) |
- size.SetToMin(max_size); |
- size.SetToMax(min_size); |
- window_->SetBounds(gfx::Rect(origin, size)); |
- // Observer on |window_tree_host_| expected to synchronously update bounds. |
- DCHECK_EQ(gfx::ConvertRectToPixel(ScaleFactorForDisplay(content_), |
- window_->bounds()) |
- .ToString(), |
- window_tree_host_->GetBoundsInPixels().ToString()); |
-} |
- |
-void NativeWidgetMus::SetSize(const gfx::Size& size) { |
- if (!window_tree_host_) |
- return; |
- |
- gfx::Rect bounds = window_tree_host_->GetBoundsInPixels(); |
- SetBounds(gfx::Rect(bounds.origin(), size)); |
-} |
- |
-void NativeWidgetMus::StackAbove(gfx::NativeView native_view) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void NativeWidgetMus::StackAtTop() { |
- NOTIMPLEMENTED(); |
-} |
- |
-void NativeWidgetMus::SetShape(std::unique_ptr<SkRegion> shape) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void NativeWidgetMus::Close() { |
- Hide(); |
- if (!close_widget_factory_.HasWeakPtrs()) { |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&NativeWidgetMus::CloseNow, |
- close_widget_factory_.GetWeakPtr())); |
- } |
-} |
- |
-void NativeWidgetMus::CloseNow() { |
- // Depending upon ownership |window_| may have been destroyed. |
- if (window_) |
- window_->Destroy(); |
-} |
- |
-void NativeWidgetMus::Show() { |
- ShowWithWindowState(ui::SHOW_STATE_NORMAL); |
-} |
- |
-void NativeWidgetMus::Hide() { |
- if (!(window_ && window_tree_host_)) |
- return; |
- |
- // NOTE: |window_tree_host_| and |window_| visibility is updated in |
- // OnMusWindowVisibilityChanged(). |
- window_->SetVisible(false); |
-} |
- |
-void NativeWidgetMus::ShowMaximizedWithBounds( |
- const gfx::Rect& restored_bounds) { |
- if (!window_) |
- return; |
- |
- window_->SetSharedProperty<gfx::Rect>( |
- ui::mojom::WindowManager::kRestoreBounds_Property, restored_bounds); |
- ShowWithWindowState(ui::SHOW_STATE_MAXIMIZED); |
-} |
- |
-void NativeWidgetMus::ShowWithWindowState(ui::WindowShowState state) { |
- if (!(window_ && window_tree_host_)) |
- return; |
- |
- // Matches NativeWidgetAura. |
- switch (state) { |
- case ui::SHOW_STATE_MAXIMIZED: |
- SetShowState(ui::mojom::ShowState::MAXIMIZED); |
- break; |
- case ui::SHOW_STATE_FULLSCREEN: |
- SetShowState(ui::mojom::ShowState::FULLSCREEN); |
- break; |
- case ui::SHOW_STATE_DOCKED: |
- SetShowState(ui::mojom::ShowState::DOCKED); |
- break; |
- default: |
- break; |
- } |
- |
- // NOTE: |window_tree_host_| and |window_| visibility is updated in |
- // OnMusWindowVisibilityChanged(). |
- window_->SetVisible(true); |
- if (native_widget_delegate_->CanActivate()) { |
- if (state != ui::SHOW_STATE_INACTIVE) |
- Activate(); |
- GetWidget()->SetInitialFocus(state); |
- } |
- |
- // Matches NativeWidgetAura. |
- if (state == ui::SHOW_STATE_MINIMIZED) |
- Minimize(); |
-} |
- |
-bool NativeWidgetMus::IsVisible() const { |
- // TODO(beng): this should probably be wired thru PlatformWindow. |
- return window_ && window_->visible(); |
-} |
- |
-void NativeWidgetMus::Activate() { |
- if (!window_) |
- return; |
- |
- static_cast<aura::client::ActivationClient*>(focus_client_.get()) |
- ->ActivateWindow(content_); |
-} |
- |
-void NativeWidgetMus::Deactivate() { |
- if (IsActive()) |
- window_->window_tree()->ClearFocus(); |
-} |
- |
-bool NativeWidgetMus::IsActive() const { |
- ui::Window* focused = |
- window_ ? window_->window_tree()->GetFocusedWindow() : nullptr; |
- return focused && window_->Contains(focused); |
-} |
- |
-void NativeWidgetMus::SetAlwaysOnTop(bool always_on_top) { |
- if (window_ && !is_parallel_widget_in_window_manager()) { |
- window_->SetSharedProperty<bool>( |
- ui::mojom::WindowManager::kAlwaysOnTop_Property, always_on_top); |
- } |
-} |
- |
-bool NativeWidgetMus::IsAlwaysOnTop() const { |
- return window_ && |
- window_->HasSharedProperty( |
- ui::mojom::WindowManager::kAlwaysOnTop_Property) && |
- window_->GetSharedProperty<bool>( |
- ui::mojom::WindowManager::kAlwaysOnTop_Property); |
-} |
- |
-void NativeWidgetMus::SetVisibleOnAllWorkspaces(bool always_visible) { |
- // Not needed for chromeos. |
-} |
- |
-bool NativeWidgetMus::IsVisibleOnAllWorkspaces() const { |
- return false; |
-} |
- |
-void NativeWidgetMus::Maximize() { |
- SetShowState(ui::mojom::ShowState::MAXIMIZED); |
-} |
- |
-void NativeWidgetMus::Minimize() { |
- SetShowState(ui::mojom::ShowState::MINIMIZED); |
-} |
- |
-bool NativeWidgetMus::IsMaximized() const { |
- return GetShowState(window_) == ui::mojom::ShowState::MAXIMIZED; |
-} |
- |
-bool NativeWidgetMus::IsMinimized() const { |
- return GetShowState(window_) == ui::mojom::ShowState::MINIMIZED; |
-} |
- |
-void NativeWidgetMus::Restore() { |
- SetShowState(ui::mojom::ShowState::NORMAL); |
-} |
- |
-void NativeWidgetMus::SetFullscreen(bool fullscreen) { |
- if (IsFullscreen() == fullscreen) |
- return; |
- if (fullscreen) { |
- show_state_before_fullscreen_ = GetShowState(window_); |
- SetShowState(ui::mojom::ShowState::FULLSCREEN); |
- } else { |
- switch (show_state_before_fullscreen_) { |
- case ui::mojom::ShowState::MAXIMIZED: |
- Maximize(); |
- break; |
- case ui::mojom::ShowState::MINIMIZED: |
- Minimize(); |
- break; |
- case ui::mojom::ShowState::DEFAULT: |
- case ui::mojom::ShowState::NORMAL: |
- case ui::mojom::ShowState::INACTIVE: |
- case ui::mojom::ShowState::FULLSCREEN: |
- case ui::mojom::ShowState::DOCKED: |
- // TODO(sad): This may not be sufficient. |
- Restore(); |
- break; |
- } |
- } |
-} |
- |
-bool NativeWidgetMus::IsFullscreen() const { |
- return GetShowState(window_) == ui::mojom::ShowState::FULLSCREEN; |
-} |
- |
-void NativeWidgetMus::SetOpacity(float opacity) { |
- if (window_) |
- window_->SetOpacity(opacity); |
-} |
- |
-void NativeWidgetMus::FlashFrame(bool flash_frame) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void NativeWidgetMus::RunShellDrag(View* view, |
- const ui::OSExchangeData& data, |
- const gfx::Point& location, |
- int drag_operations, |
- ui::DragDropTypes::DragEventSource source) { |
- if (window_) |
- views::RunShellDrag(content_, data, location, drag_operations, source); |
-} |
- |
-void NativeWidgetMus::SchedulePaintInRect(const gfx::Rect& rect) { |
- if (content_) |
- content_->SchedulePaintInRect(rect); |
-} |
- |
-void NativeWidgetMus::SetCursor(gfx::NativeCursor cursor) { |
- if (!window_) |
- return; |
- |
- // TODO(erg): In aura, our incoming cursor is really two |
- // parts. cursor.native_type() is an integer for standard cursors and is all |
- // we support right now. If native_type() == kCursorCustom, than we should |
- // also send an image, but as the cursor code is currently written, the image |
- // is in a platform native format that's already uploaded to the window |
- // server. |
- ui::mojom::Cursor new_cursor = ui::mojom::Cursor(cursor.native_type()); |
- if (last_cursor_ != new_cursor) |
- window_->SetPredefinedCursor(new_cursor); |
-} |
- |
-bool NativeWidgetMus::IsMouseEventsEnabled() const { |
- NOTIMPLEMENTED(); |
- return true; |
-} |
- |
-void NativeWidgetMus::ClearNativeFocus() { |
- if (!IsActive()) |
- return; |
- ui::Window* focused = |
- window_ ? window_->window_tree()->GetFocusedWindow() : nullptr; |
- if (focused && window_->Contains(focused) && focused != window_) |
- window_->SetFocus(); |
- // Move aura-focus back to |content_|, so that the Widget still receives |
- // events correctly. |
- aura::client::GetFocusClient(content_)->ResetFocusWithinActiveWindow( |
- content_); |
-} |
- |
-gfx::Rect NativeWidgetMus::GetWorkAreaBoundsInScreen() const { |
- NOTIMPLEMENTED(); |
- return gfx::Rect(); |
-} |
- |
-Widget::MoveLoopResult NativeWidgetMus::RunMoveLoop( |
- const gfx::Vector2d& drag_offset, |
- Widget::MoveLoopSource source, |
- Widget::MoveLoopEscapeBehavior escape_behavior) { |
- ReleaseCapture(); |
- |
- base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); |
- base::MessageLoop::ScopedNestableTaskAllower allow_nested(loop); |
- base::RunLoop run_loop; |
- |
- ui::mojom::MoveLoopSource mus_source = |
- source == Widget::MOVE_LOOP_SOURCE_MOUSE |
- ? ui::mojom::MoveLoopSource::MOUSE |
- : ui::mojom::MoveLoopSource::TOUCH; |
- |
- bool success = false; |
- gfx::Point cursor_location = |
- display::Screen::GetScreen()->GetCursorScreenPoint(); |
- window_->PerformWindowMove( |
- mus_source, cursor_location, |
- base::Bind(OnMoveLoopEnd, &success, run_loop.QuitClosure())); |
- |
- run_loop.Run(); |
- |
- return success ? Widget::MOVE_LOOP_SUCCESSFUL : Widget::MOVE_LOOP_CANCELED; |
-} |
- |
-void NativeWidgetMus::EndMoveLoop() { |
- window_->CancelWindowMove(); |
-} |
- |
-void NativeWidgetMus::SetVisibilityChangedAnimationsEnabled(bool value) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void NativeWidgetMus::SetVisibilityAnimationDuration( |
- const base::TimeDelta& duration) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void NativeWidgetMus::SetVisibilityAnimationTransition( |
- Widget::VisibilityTransition transition) { |
- NOTIMPLEMENTED(); |
-} |
- |
-bool NativeWidgetMus::IsTranslucentWindowOpacitySupported() const { |
- NOTIMPLEMENTED(); |
- return true; |
-} |
- |
-void NativeWidgetMus::OnSizeConstraintsChanged() { |
- if (!window_ || is_parallel_widget_in_window_manager()) |
- return; |
- |
- int32_t behavior = ui::mojom::kResizeBehaviorNone; |
- if (GetWidget()->widget_delegate()) |
- behavior = GetWidget()->widget_delegate()->GetResizeBehavior(); |
- window_->SetSharedProperty<PrimitiveType>( |
- ui::mojom::WindowManager::kResizeBehavior_Property, behavior); |
-} |
- |
-void NativeWidgetMus::RepostNativeEvent(gfx::NativeEvent native_event) { |
- NOTIMPLEMENTED(); |
-} |
- |
-std::string NativeWidgetMus::GetName() const { |
- return window_->GetName(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeWidgetMus, aura::WindowDelegate implementation: |
- |
-gfx::Size NativeWidgetMus::GetMinimumSize() const { |
- return native_widget_delegate_->GetMinimumSize(); |
-} |
- |
-gfx::Size NativeWidgetMus::GetMaximumSize() const { |
- return native_widget_delegate_->GetMaximumSize(); |
-} |
- |
-void NativeWidgetMus::OnBoundsChanged(const gfx::Rect& old_bounds, |
- const gfx::Rect& new_bounds) { |
- // This is handled in OnHost{Resized,Moved}() like DesktopNativeWidgetAura |
- // instead of here like in NativeWidgetAura. |
-} |
- |
-gfx::NativeCursor NativeWidgetMus::GetCursor(const gfx::Point& point) { |
- return gfx::NativeCursor(); |
-} |
- |
-int NativeWidgetMus::GetNonClientComponent(const gfx::Point& point) const { |
- return native_widget_delegate_->GetNonClientComponent(point); |
-} |
- |
-bool NativeWidgetMus::ShouldDescendIntoChildForEventHandling( |
- aura::Window* child, |
- const gfx::Point& location) { |
- views::WidgetDelegate* widget_delegate = GetWidget()->widget_delegate(); |
- return !widget_delegate || |
- widget_delegate->ShouldDescendIntoChildForEventHandling(child, location); |
-} |
- |
-bool NativeWidgetMus::CanFocus() { |
- return true; |
-} |
- |
-void NativeWidgetMus::OnCaptureLost() { |
- native_widget_delegate_->OnMouseCaptureLost(); |
-} |
- |
-void NativeWidgetMus::OnPaint(const ui::PaintContext& context) { |
- native_widget_delegate_->OnNativeWidgetPaint(context); |
-} |
- |
-void NativeWidgetMus::OnDeviceScaleFactorChanged(float device_scale_factor) { |
-} |
- |
-void NativeWidgetMus::OnWindowDestroying(aura::Window* window) { |
-} |
- |
-void NativeWidgetMus::OnWindowDestroyed(aura::Window* window) { |
- // Cleanup happens in OnPlatformWindowClosed(). |
-} |
- |
-void NativeWidgetMus::OnWindowTargetVisibilityChanged(bool visible) { |
-} |
- |
-bool NativeWidgetMus::HasHitTestMask() const { |
- return native_widget_delegate_->HasHitTestMask(); |
-} |
- |
-void NativeWidgetMus::GetHitTestMask(gfx::Path* mask) const { |
- native_widget_delegate_->GetHitTestMask(mask); |
-} |
- |
-void NativeWidgetMus::SetShowState(ui::mojom::ShowState show_state) { |
- if (!window_) |
- return; |
- window_->SetSharedProperty<PrimitiveType>( |
- ui::mojom::WindowManager::kShowState_Property, |
- static_cast<PrimitiveType>(show_state)); |
-} |
- |
-void NativeWidgetMus::OnKeyEvent(ui::KeyEvent* event) { |
- if (event->is_char()) { |
- // If a ui::InputMethod object is attached to the root window, character |
- // events are handled inside the object and are not passed to this function. |
- // If such object is not attached, character events might be sent (e.g. on |
- // Windows). In this case, we just skip these. |
- return; |
- } |
- // Renderer may send a key event back to us if the key event wasn't handled, |
- // and the window may be invisible by that time. |
- if (!content_->IsVisible()) |
- return; |
- |
- native_widget_delegate_->OnKeyEvent(event); |
-} |
- |
-void NativeWidgetMus::OnMouseEvent(ui::MouseEvent* event) { |
- DCHECK(content_->IsVisible()); |
- |
- if (tooltip_manager_.get()) |
- tooltip_manager_->UpdateTooltip(); |
- TooltipManagerAura::UpdateTooltipManagerForCapture(GetWidget()); |
- |
- native_widget_delegate_->OnMouseEvent(event); |
- // WARNING: we may have been deleted. |
-} |
- |
-void NativeWidgetMus::OnScrollEvent(ui::ScrollEvent* event) { |
- if (event->type() == ui::ET_SCROLL) { |
- native_widget_delegate_->OnScrollEvent(event); |
- if (event->handled()) |
- return; |
- |
- // Convert unprocessed scroll events into wheel events. |
- ui::MouseWheelEvent mwe(*event->AsScrollEvent()); |
- native_widget_delegate_->OnMouseEvent(&mwe); |
- if (mwe.handled()) |
- event->SetHandled(); |
- } else { |
- native_widget_delegate_->OnScrollEvent(event); |
- } |
-} |
- |
-void NativeWidgetMus::OnGestureEvent(ui::GestureEvent* event) { |
- native_widget_delegate_->OnGestureEvent(event); |
-} |
- |
-void NativeWidgetMus::OnHostResized(const aura::WindowTreeHost* host) { |
- native_widget_delegate_->OnNativeWidgetSizeChanged( |
- host->window()->bounds().size()); |
- UpdateClientArea(); |
- UpdateHitTestMask(); |
-} |
- |
-void NativeWidgetMus::OnHostMovedInPixels( |
- const aura::WindowTreeHost* host, |
- const gfx::Point& new_origin_in_pixels) { |
- native_widget_delegate_->OnNativeWidgetMove(); |
-} |
- |
-void NativeWidgetMus::OnHostCloseRequested(const aura::WindowTreeHost* host) { |
- GetWidget()->Close(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeWidgetMus, aura::WindowDragDropDelegate implementation: |
- |
-void NativeWidgetMus::OnDragEntered(const ui::DropTargetEvent& event) { |
- DCHECK(drop_helper_); |
- last_drop_operation_ = drop_helper_->OnDragOver( |
- event.data(), event.location(), event.source_operations()); |
-} |
- |
-int NativeWidgetMus::OnDragUpdated(const ui::DropTargetEvent& event) { |
- DCHECK(drop_helper_); |
- last_drop_operation_ = drop_helper_->OnDragOver( |
- event.data(), event.location(), event.source_operations()); |
- return last_drop_operation_; |
-} |
- |
-void NativeWidgetMus::OnDragExited() { |
- DCHECK(drop_helper_); |
- drop_helper_->OnDragExit(); |
-} |
- |
-int NativeWidgetMus::OnPerformDrop(const ui::DropTargetEvent& event) { |
- DCHECK(drop_helper_); |
- return drop_helper_->OnDrop(event.data(), event.location(), |
- last_drop_operation_); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeWidgetMus, ui::InputEventHandler implementation: |
- |
-void NativeWidgetMus::OnWindowInputEvent( |
- ui::Window* view, |
- const ui::Event& event_in, |
- std::unique_ptr<base::Callback<void(EventResult)>>* ack_callback) { |
- std::unique_ptr<ui::Event> event = ui::Event::Clone(event_in); |
- |
- if (event->IsKeyEvent()) { |
- input_method_->DispatchKeyEvent(event->AsKeyEvent(), |
- std::move(*ack_callback)); |
- return; |
- } |
- |
- // Take ownership of the callback, indicating that we will handle it. |
- EventAckHandler ack_handler(std::move(*ack_callback)); |
- |
- // TODO(markdittmer): This should be this->OnEvent(event.get()), but that |
- // can't happen until IME is refactored out of in WindowTreeHostMus. |
- platform_window_delegate()->DispatchEvent(event.get()); |
- // NOTE: |this| may be deleted. |
- |
- ack_handler.set_handled(event->handled()); |
- // |ack_handler| acks the event on destruction if necessary. |
-} |
- |
-void NativeWidgetMus::OnMusWindowVisibilityChanging(ui::Window* window, |
- bool visible) { |
- if (window == window_) |
- native_widget_delegate_->OnNativeWidgetVisibilityChanging(visible); |
-} |
- |
-void NativeWidgetMus::OnMusWindowVisibilityChanged(ui::Window* window, |
- bool visible) { |
- if (window != window_) |
- return; |
- |
- if (visible) { |
- window_tree_host_->Show(); |
- GetNativeWindow()->Show(); |
- } else { |
- window_tree_host_->Hide(); |
- GetNativeWindow()->Hide(); |
- } |
- native_widget_delegate_->OnNativeWidgetVisibilityChanged(visible); |
-} |
- |
-void NativeWidgetMus::UpdateHitTestMask() { |
- // The window manager (or other underlay window provider) is not allowed to |
- // set a hit test mask, as that could interfere with a client app mask. |
- if (is_parallel_widget_in_window_manager()) |
- return; |
- |
- if (!native_widget_delegate_->HasHitTestMask()) { |
- window_->ClearHitTestMask(); |
- return; |
- } |
- |
- gfx::Path mask_path; |
- native_widget_delegate_->GetHitTestMask(&mask_path); |
- // TODO(jamescook): Use the full path for the mask. |
- gfx::Rect mask_rect = |
- gfx::ToEnclosingRect(gfx::SkRectToRectF(mask_path.getBounds())); |
- window_->SetHitTestMask(mask_rect); |
-} |
- |
-} // namespace views |