| 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 #ifndef UI_VIEWS_MUS_NATIVE_WIDGET_MUS_H_ | |
| 6 #define UI_VIEWS_MUS_NATIVE_WIDGET_MUS_H_ | |
| 7 | |
| 8 #include <stdint.h> | |
| 9 | |
| 10 #include <map> | |
| 11 #include <memory> | |
| 12 #include <string> | |
| 13 #include <vector> | |
| 14 | |
| 15 #include "base/callback.h" | |
| 16 #include "base/macros.h" | |
| 17 #include "base/memory/weak_ptr.h" | |
| 18 #include "services/ui/public/cpp/input_event_handler.h" | |
| 19 #include "services/ui/public/interfaces/window_tree.mojom.h" | |
| 20 #include "ui/aura/client/drag_drop_delegate.h" | |
| 21 #include "ui/aura/window_delegate.h" | |
| 22 #include "ui/aura/window_tree_host_observer.h" | |
| 23 #include "ui/platform_window/platform_window_delegate.h" | |
| 24 #include "ui/views/mus/mus_export.h" | |
| 25 #include "ui/views/mus/window_tree_host_mus.h" | |
| 26 #include "ui/views/widget/native_widget_private.h" | |
| 27 | |
| 28 namespace aura { | |
| 29 namespace client { | |
| 30 class DragDropClient; | |
| 31 class ScreenPositionClient; | |
| 32 class WindowParentingClient; | |
| 33 } | |
| 34 class Window; | |
| 35 } | |
| 36 | |
| 37 namespace ui { | |
| 38 class Window; | |
| 39 class WindowTreeClient; | |
| 40 namespace mojom { | |
| 41 enum class Cursor; | |
| 42 enum class EventResult; | |
| 43 } | |
| 44 } | |
| 45 | |
| 46 namespace ui { | |
| 47 class Event; | |
| 48 } | |
| 49 | |
| 50 namespace wm { | |
| 51 class CursorManager; | |
| 52 class FocusController; | |
| 53 } | |
| 54 | |
| 55 namespace views { | |
| 56 namespace corewm { | |
| 57 class TooltipController; | |
| 58 } | |
| 59 class DropHelper; | |
| 60 class DropTargetMus; | |
| 61 class InputMethodMus; | |
| 62 class TooltipManagerAura; | |
| 63 | |
| 64 // An implementation of NativeWidget that binds to a ui::Window. Because Aura | |
| 65 // is used extensively within Views code, this code uses aura and binds to the | |
| 66 // ui::Window via a Mus-specific aura::WindowTreeHost impl. Because the root | |
| 67 // aura::Window in a hierarchy is created without a delegate by the | |
| 68 // aura::WindowTreeHost, we must create a child aura::Window in this class | |
| 69 // (content_) and attach it to the root. | |
| 70 class VIEWS_MUS_EXPORT NativeWidgetMus | |
| 71 : public internal::NativeWidgetPrivate, | |
| 72 public aura::WindowDelegate, | |
| 73 public aura::WindowTreeHostObserver, | |
| 74 public aura::client::DragDropDelegate, | |
| 75 public NON_EXPORTED_BASE(ui::InputEventHandler) { | |
| 76 public: | |
| 77 NativeWidgetMus( | |
| 78 internal::NativeWidgetDelegate* delegate, | |
| 79 ui::Window* window, | |
| 80 ui::mojom::CompositorFrameSinkType compositor_frame_sink_type); | |
| 81 ~NativeWidgetMus() override; | |
| 82 | |
| 83 // Configures the set of properties supplied to the window manager when | |
| 84 // creating a new Window for a Widget. | |
| 85 static void ConfigurePropertiesForNewWindow( | |
| 86 const Widget::InitParams& init_params, | |
| 87 std::map<std::string, std::vector<uint8_t>>* properties); | |
| 88 | |
| 89 // Notifies all widgets the frame constants changed in some way. | |
| 90 static void NotifyFrameChanged(ui::WindowTreeClient* client); | |
| 91 | |
| 92 // Returns the native widget for a ui::Window, or null if there is none. | |
| 93 static NativeWidgetMus* GetForWindow(ui::Window* window); | |
| 94 | |
| 95 // Returns the widget for a ui::Window, or null if there is none. | |
| 96 static Widget* GetWidgetForWindow(ui::Window* window); | |
| 97 | |
| 98 ui::mojom::CompositorFrameSinkType compositor_frame_sink_type() const { | |
| 99 return compositor_frame_sink_type_; | |
| 100 } | |
| 101 ui::Window* window() { return window_; } | |
| 102 aura::Window* aura_window() { return content_; } | |
| 103 WindowTreeHostMus* window_tree_host() { return window_tree_host_.get(); } | |
| 104 | |
| 105 aura::Window* GetRootWindow(); | |
| 106 | |
| 107 void OnPlatformWindowClosed(); | |
| 108 void OnActivationChanged(bool active); | |
| 109 | |
| 110 protected: | |
| 111 // Updates the client area in the ui::Window. | |
| 112 virtual void UpdateClientArea(); | |
| 113 | |
| 114 // internal::NativeWidgetPrivate: | |
| 115 NonClientFrameView* CreateNonClientFrameView() override; | |
| 116 void InitNativeWidget(const Widget::InitParams& params) override; | |
| 117 void OnWidgetInitDone() override; | |
| 118 bool ShouldUseNativeFrame() const override; | |
| 119 bool ShouldWindowContentsBeTransparent() const override; | |
| 120 void FrameTypeChanged() override; | |
| 121 Widget* GetWidget() override; | |
| 122 const Widget* GetWidget() const override; | |
| 123 gfx::NativeView GetNativeView() const override; | |
| 124 gfx::NativeWindow GetNativeWindow() const override; | |
| 125 Widget* GetTopLevelWidget() override; | |
| 126 const ui::Compositor* GetCompositor() const override; | |
| 127 const ui::Layer* GetLayer() const override; | |
| 128 void ReorderNativeViews() override; | |
| 129 void ViewRemoved(View* view) override; | |
| 130 void SetNativeWindowProperty(const char* name, void* value) override; | |
| 131 void* GetNativeWindowProperty(const char* name) const override; | |
| 132 TooltipManager* GetTooltipManager() const override; | |
| 133 void SetCapture() override; | |
| 134 void ReleaseCapture() override; | |
| 135 bool HasCapture() const override; | |
| 136 ui::InputMethod* GetInputMethod() override; | |
| 137 void CenterWindow(const gfx::Size& size) override; | |
| 138 void GetWindowPlacement(gfx::Rect* bounds, | |
| 139 ui::WindowShowState* maximized) const override; | |
| 140 bool SetWindowTitle(const base::string16& title) override; | |
| 141 void SetWindowIcons(const gfx::ImageSkia& window_icon, | |
| 142 const gfx::ImageSkia& app_icon) override; | |
| 143 void InitModalType(ui::ModalType modal_type) override; | |
| 144 gfx::Rect GetWindowBoundsInScreen() const override; | |
| 145 gfx::Rect GetClientAreaBoundsInScreen() const override; | |
| 146 gfx::Rect GetRestoredBounds() const override; | |
| 147 std::string GetWorkspace() const override; | |
| 148 void SetBounds(const gfx::Rect& bounds_in_screen) override; | |
| 149 void SetSize(const gfx::Size& size) override; | |
| 150 void StackAbove(gfx::NativeView native_view) override; | |
| 151 void StackAtTop() override; | |
| 152 void SetShape(std::unique_ptr<SkRegion> shape) override; | |
| 153 void Close() override; | |
| 154 void CloseNow() override; | |
| 155 void Show() override; | |
| 156 void Hide() override; | |
| 157 void ShowMaximizedWithBounds(const gfx::Rect& restored_bounds) override; | |
| 158 void ShowWithWindowState(ui::WindowShowState state) override; | |
| 159 bool IsVisible() const override; | |
| 160 void Activate() override; | |
| 161 void Deactivate() override; | |
| 162 bool IsActive() const override; | |
| 163 void SetAlwaysOnTop(bool always_on_top) override; | |
| 164 bool IsAlwaysOnTop() const override; | |
| 165 void SetVisibleOnAllWorkspaces(bool always_visible) override; | |
| 166 bool IsVisibleOnAllWorkspaces() const override; | |
| 167 void Maximize() override; | |
| 168 void Minimize() override; | |
| 169 bool IsMaximized() const override; | |
| 170 bool IsMinimized() const override; | |
| 171 void Restore() override; | |
| 172 void SetFullscreen(bool fullscreen) override; | |
| 173 bool IsFullscreen() const override; | |
| 174 void SetOpacity(float opacity) override; | |
| 175 void FlashFrame(bool flash_frame) override; | |
| 176 void RunShellDrag(View* view, | |
| 177 const ui::OSExchangeData& data, | |
| 178 const gfx::Point& location, | |
| 179 int drag_operations, | |
| 180 ui::DragDropTypes::DragEventSource source) override; | |
| 181 void SchedulePaintInRect(const gfx::Rect& rect) override; | |
| 182 void SetCursor(gfx::NativeCursor cursor) override; | |
| 183 bool IsMouseEventsEnabled() const override; | |
| 184 void ClearNativeFocus() override; | |
| 185 gfx::Rect GetWorkAreaBoundsInScreen() const override; | |
| 186 Widget::MoveLoopResult RunMoveLoop( | |
| 187 const gfx::Vector2d& drag_offset, | |
| 188 Widget::MoveLoopSource source, | |
| 189 Widget::MoveLoopEscapeBehavior escape_behavior) override; | |
| 190 void EndMoveLoop() override; | |
| 191 void SetVisibilityChangedAnimationsEnabled(bool value) override; | |
| 192 void SetVisibilityAnimationDuration(const base::TimeDelta& duration) override; | |
| 193 void SetVisibilityAnimationTransition( | |
| 194 Widget::VisibilityTransition transition) override; | |
| 195 bool IsTranslucentWindowOpacitySupported() const override; | |
| 196 void OnSizeConstraintsChanged() override; | |
| 197 void RepostNativeEvent(gfx::NativeEvent native_event) override; | |
| 198 std::string GetName() const override; | |
| 199 | |
| 200 // Overridden from aura::WindowDelegate: | |
| 201 gfx::Size GetMinimumSize() const override; | |
| 202 gfx::Size GetMaximumSize() const override; | |
| 203 void OnBoundsChanged(const gfx::Rect& old_bounds, | |
| 204 const gfx::Rect& new_bounds) override; | |
| 205 gfx::NativeCursor GetCursor(const gfx::Point& point) override; | |
| 206 int GetNonClientComponent(const gfx::Point& point) const override; | |
| 207 bool ShouldDescendIntoChildForEventHandling( | |
| 208 aura::Window* child, | |
| 209 const gfx::Point& location) override; | |
| 210 bool CanFocus() override; | |
| 211 void OnCaptureLost() override; | |
| 212 void OnPaint(const ui::PaintContext& context) override; | |
| 213 void OnDeviceScaleFactorChanged(float device_scale_factor) override; | |
| 214 void OnWindowDestroying(aura::Window* window) override; | |
| 215 void OnWindowDestroyed(aura::Window* window) override; | |
| 216 void OnWindowTargetVisibilityChanged(bool visible) override; | |
| 217 bool HasHitTestMask() const override; | |
| 218 void GetHitTestMask(gfx::Path* mask) const override; | |
| 219 | |
| 220 // Overridden from ui::EventHandler: | |
| 221 void OnKeyEvent(ui::KeyEvent* event) override; | |
| 222 void OnMouseEvent(ui::MouseEvent* event) override; | |
| 223 void OnScrollEvent(ui::ScrollEvent* event) override; | |
| 224 void OnGestureEvent(ui::GestureEvent* event) override; | |
| 225 | |
| 226 // Overridden from aura::WindowTreeHostObserver: | |
| 227 void OnHostResized(const aura::WindowTreeHost* host) override; | |
| 228 void OnHostMovedInPixels(const aura::WindowTreeHost* host, | |
| 229 const gfx::Point& new_origin_in_pixels) override; | |
| 230 void OnHostCloseRequested(const aura::WindowTreeHost* host) override; | |
| 231 | |
| 232 // Overridden from aura::client::DragDropDelegate: | |
| 233 void OnDragEntered(const ui::DropTargetEvent& event) override; | |
| 234 int OnDragUpdated(const ui::DropTargetEvent& event) override; | |
| 235 void OnDragExited() override; | |
| 236 int OnPerformDrop(const ui::DropTargetEvent& event) override; | |
| 237 | |
| 238 // Overridden from ui::InputEventHandler: | |
| 239 void OnWindowInputEvent( | |
| 240 ui::Window* view, | |
| 241 const ui::Event& event, | |
| 242 std::unique_ptr<base::Callback<void(ui::mojom::EventResult)>>* | |
| 243 ack_callback) override; | |
| 244 | |
| 245 private: | |
| 246 friend class NativeWidgetMusTest; | |
| 247 class MusWindowObserver; | |
| 248 class MusCaptureClient; | |
| 249 | |
| 250 ui::PlatformWindowDelegate* platform_window_delegate() { | |
| 251 return window_tree_host(); | |
| 252 } | |
| 253 | |
| 254 // Returns true if this NativeWidgetMus exists on the window manager side | |
| 255 // to provide the frame decorations. | |
| 256 bool is_parallel_widget_in_window_manager() { | |
| 257 return compositor_frame_sink_type_ == | |
| 258 ui::mojom::CompositorFrameSinkType::UNDERLAY; | |
| 259 } | |
| 260 | |
| 261 void set_last_cursor(ui::mojom::Cursor cursor) { last_cursor_ = cursor; } | |
| 262 void SetShowState(ui::mojom::ShowState show_state); | |
| 263 | |
| 264 void OnMusWindowVisibilityChanging(ui::Window* window, bool visible); | |
| 265 void OnMusWindowVisibilityChanged(ui::Window* window, bool visible); | |
| 266 | |
| 267 // Propagates the widget hit test mask, if any, to the ui::Window. | |
| 268 // TODO(jamescook): Wire this through views::Widget so widgets can push | |
| 269 // updates if needed. | |
| 270 void UpdateHitTestMask(); | |
| 271 | |
| 272 ui::Window* window_; | |
| 273 ui::mojom::Cursor last_cursor_; | |
| 274 | |
| 275 internal::NativeWidgetDelegate* native_widget_delegate_; | |
| 276 | |
| 277 const ui::mojom::CompositorFrameSinkType compositor_frame_sink_type_; | |
| 278 ui::mojom::ShowState show_state_before_fullscreen_; | |
| 279 | |
| 280 // See class documentation for Widget in widget.h for a note about ownership. | |
| 281 Widget::InitParams::Ownership ownership_; | |
| 282 | |
| 283 // Functions with the same name require the ui::WindowObserver to be in | |
| 284 // a separate class. | |
| 285 std::unique_ptr<MusWindowObserver> mus_window_observer_; | |
| 286 | |
| 287 // Receives drop events for |window_|. | |
| 288 std::unique_ptr<DropTargetMus> drop_target_; | |
| 289 | |
| 290 // Aura configuration. | |
| 291 std::unique_ptr<WindowTreeHostMus> window_tree_host_; | |
| 292 aura::Window* content_; | |
| 293 std::unique_ptr<wm::FocusController> focus_client_; | |
| 294 std::unique_ptr<MusCaptureClient> capture_client_; | |
| 295 std::unique_ptr<aura::client::DragDropClient> drag_drop_client_; | |
| 296 std::unique_ptr<aura::client::WindowParentingClient> window_parenting_client_; | |
| 297 std::unique_ptr<aura::client::ScreenPositionClient> screen_position_client_; | |
| 298 std::unique_ptr<wm::CursorManager> cursor_manager_; | |
| 299 | |
| 300 std::unique_ptr<DropHelper> drop_helper_; | |
| 301 int last_drop_operation_; | |
| 302 | |
| 303 std::unique_ptr<corewm::TooltipController> tooltip_controller_; | |
| 304 std::unique_ptr<TooltipManagerAura> tooltip_manager_; | |
| 305 | |
| 306 std::unique_ptr<InputMethodMus> input_method_; | |
| 307 | |
| 308 base::WeakPtrFactory<NativeWidgetMus> close_widget_factory_; | |
| 309 | |
| 310 DISALLOW_COPY_AND_ASSIGN(NativeWidgetMus); | |
| 311 }; | |
| 312 | |
| 313 } // namespace views | |
| 314 | |
| 315 #endif // UI_VIEWS_MUS_NATIVE_WIDGET_MUS_H_ | |
| OLD | NEW |