| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ash/mus/frame/move_event_handler.h" | |
| 6 | |
| 7 #include "ash/mus/bridge/wm_window_mus.h" | |
| 8 #include "services/ui/public/cpp/window.h" | |
| 9 #include "services/ui/public/cpp/window_manager_delegate.h" | |
| 10 #include "services/ui/public/cpp/window_property.h" | |
| 11 #include "services/ui/public/interfaces/cursor.mojom.h" | |
| 12 #include "ui/aura/window.h" | |
| 13 #include "ui/base/hit_test.h" | |
| 14 #include "ui/events/event.h" | |
| 15 | |
| 16 MUS_DECLARE_WINDOW_PROPERTY_TYPE(ash::mus::MoveEventHandler*) | |
| 17 | |
| 18 namespace { | |
| 19 | |
| 20 // Key used for storing identifier sent to clients for windows. | |
| 21 MUS_DEFINE_LOCAL_WINDOW_PROPERTY_KEY(ash::mus::MoveEventHandler*, | |
| 22 kWmMoveEventHandler, | |
| 23 nullptr); | |
| 24 | |
| 25 } // namespace | |
| 26 | |
| 27 namespace ash { | |
| 28 namespace mus { | |
| 29 namespace { | |
| 30 | |
| 31 ui::mojom::Cursor CursorForWindowComponent(int window_component) { | |
| 32 switch (window_component) { | |
| 33 case HTBOTTOM: | |
| 34 return ui::mojom::Cursor::SOUTH_RESIZE; | |
| 35 case HTBOTTOMLEFT: | |
| 36 return ui::mojom::Cursor::SOUTH_WEST_RESIZE; | |
| 37 case HTBOTTOMRIGHT: | |
| 38 return ui::mojom::Cursor::SOUTH_EAST_RESIZE; | |
| 39 case HTLEFT: | |
| 40 return ui::mojom::Cursor::WEST_RESIZE; | |
| 41 case HTRIGHT: | |
| 42 return ui::mojom::Cursor::EAST_RESIZE; | |
| 43 case HTTOP: | |
| 44 return ui::mojom::Cursor::NORTH_RESIZE; | |
| 45 case HTTOPLEFT: | |
| 46 return ui::mojom::Cursor::NORTH_WEST_RESIZE; | |
| 47 case HTTOPRIGHT: | |
| 48 return ui::mojom::Cursor::NORTH_EAST_RESIZE; | |
| 49 default: | |
| 50 return ui::mojom::Cursor::CURSOR_NULL; | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 void OnMoveLoopCompleted(const base::Callback<void(bool success)>& end_closure, | |
| 55 wm::WmToplevelWindowEventHandler::DragResult result) { | |
| 56 end_closure.Run(result == | |
| 57 wm::WmToplevelWindowEventHandler::DragResult::SUCCESS); | |
| 58 } | |
| 59 | |
| 60 } // namespace | |
| 61 | |
| 62 MoveEventHandler::MoveEventHandler( | |
| 63 ui::Window* mus_window, | |
| 64 ui::WindowManagerClient* window_manager_client, | |
| 65 aura::Window* aura_window) | |
| 66 : wm_window_(WmWindowMus::Get(mus_window)), | |
| 67 window_manager_client_(window_manager_client), | |
| 68 root_window_(aura_window->GetRootWindow()), | |
| 69 toplevel_window_event_handler_(wm_window_->GetShell()) { | |
| 70 root_window_->AddObserver(this); | |
| 71 root_window_->AddPreTargetHandler(this); | |
| 72 | |
| 73 mus_window->SetLocalProperty(kWmMoveEventHandler, this); | |
| 74 } | |
| 75 | |
| 76 MoveEventHandler::~MoveEventHandler() { | |
| 77 Detach(); | |
| 78 } | |
| 79 | |
| 80 // static | |
| 81 MoveEventHandler* MoveEventHandler::GetForWindow(WmWindow* wm_window) { | |
| 82 return WmWindowMus::GetMusWindow(wm_window)->GetLocalProperty( | |
| 83 kWmMoveEventHandler); | |
| 84 } | |
| 85 | |
| 86 void MoveEventHandler::AttemptToStartDrag( | |
| 87 const gfx::Point& point_in_parent, | |
| 88 int window_component, | |
| 89 aura::client::WindowMoveSource source, | |
| 90 const base::Callback<void(bool success)>& end_closure) { | |
| 91 toplevel_window_event_handler_.AttemptToStartDrag( | |
| 92 wm_window_, point_in_parent, window_component, source, | |
| 93 base::Bind(&OnMoveLoopCompleted, end_closure)); | |
| 94 } | |
| 95 | |
| 96 bool MoveEventHandler::IsDragInProgress() { | |
| 97 return toplevel_window_event_handler_.is_drag_in_progress(); | |
| 98 } | |
| 99 | |
| 100 void MoveEventHandler::RevertDrag() { | |
| 101 toplevel_window_event_handler_.RevertDrag(); | |
| 102 } | |
| 103 | |
| 104 void MoveEventHandler::Detach() { | |
| 105 if (!root_window_) | |
| 106 return; | |
| 107 | |
| 108 root_window_->RemoveObserver(this); | |
| 109 root_window_->RemovePreTargetHandler(this); | |
| 110 root_window_ = nullptr; | |
| 111 } | |
| 112 | |
| 113 void MoveEventHandler::OnMouseEvent(ui::MouseEvent* event) { | |
| 114 toplevel_window_event_handler_.OnMouseEvent(event, wm_window_); | |
| 115 if (!toplevel_window_event_handler_.is_drag_in_progress() && | |
| 116 (event->type() == ui::ET_POINTER_MOVED || | |
| 117 event->type() == ui::ET_MOUSE_MOVED)) { | |
| 118 const int hit_test_location = | |
| 119 wm_window_->GetNonClientComponent(event->location()); | |
| 120 window_manager_client_->SetNonClientCursor( | |
| 121 wm_window_->mus_window(), CursorForWindowComponent(hit_test_location)); | |
| 122 } | |
| 123 } | |
| 124 | |
| 125 void MoveEventHandler::OnGestureEvent(ui::GestureEvent* event) { | |
| 126 toplevel_window_event_handler_.OnGestureEvent(event, wm_window_); | |
| 127 } | |
| 128 | |
| 129 void MoveEventHandler::OnCancelMode(ui::CancelModeEvent* event) { | |
| 130 toplevel_window_event_handler_.RevertDrag(); | |
| 131 } | |
| 132 | |
| 133 void MoveEventHandler::OnWindowDestroying(aura::Window* window) { | |
| 134 DCHECK_EQ(root_window_, window); | |
| 135 Detach(); | |
| 136 } | |
| 137 | |
| 138 } // namespace mus | |
| 139 } // namespace ash | |
| OLD | NEW |