blob: f4dd993de2343de60b7de5c11323406e87a7263c [file] [log] [blame]
// 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.
#ifndef UI_VIEWS_MUS_NATIVE_WIDGET_MUS_H_
#define UI_VIEWS_MUS_NATIVE_WIDGET_MUS_H_
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "services/ui/public/cpp/input_event_handler.h"
#include "services/ui/public/interfaces/window_tree.mojom.h"
#include "ui/aura/window_delegate.h"
#include "ui/aura/window_tree_host_observer.h"
#include "ui/platform_window/platform_window_delegate.h"
#include "ui/views/mus/mus_export.h"
#include "ui/views/mus/window_tree_host_mus.h"
#include "ui/views/widget/native_widget_private.h"
namespace aura {
namespace client {
class DefaultCaptureClient;
class ScreenPositionClient;
class WindowTreeClient;
}
class Window;
}
namespace bitmap_uploader {
class BitmapUploader;
}
namespace ui {
class Window;
class WindowTreeClient;
namespace mojom {
enum class Cursor;
enum class EventResult;
}
}
namespace shell {
class Connector;
}
namespace ui {
class Event;
class ViewProp;
}
namespace wm {
class CursorManager;
class FocusController;
}
namespace views {
class SurfaceContextFactory;
class WidgetDelegate;
// An implementation of NativeWidget that binds to a ui::Window. Because Aura
// is used extensively within Views code, this code uses aura and binds to the
// ui::Window via a Mus-specific aura::WindowTreeHost impl. Because the root
// aura::Window in a hierarchy is created without a delegate by the
// aura::WindowTreeHost, we must create a child aura::Window in this class
// (content_) and attach it to the root.
class VIEWS_MUS_EXPORT NativeWidgetMus
: public internal::NativeWidgetPrivate,
public aura::WindowDelegate,
public aura::WindowTreeHostObserver,
public NON_EXPORTED_BASE(ui::InputEventHandler) {
public:
NativeWidgetMus(internal::NativeWidgetDelegate* delegate,
shell::Connector* connector,
ui::Window* window,
ui::mojom::SurfaceType surface_type);
~NativeWidgetMus() override;
// Configures the set of properties supplied to the window manager when
// creating a new Window for a Widget.
static void ConfigurePropertiesForNewWindow(
const Widget::InitParams& init_params,
std::map<std::string, std::vector<uint8_t>>* properties);
// Notifies all widgets the frame constants changed in some way.
static void NotifyFrameChanged(ui::WindowTreeClient* client);
// Returns the widget for a ui::Window, or null if there is none.
static Widget* GetWidgetForWindow(ui::Window* window);
ui::Window* window() { return window_; }
WindowTreeHostMus* window_tree_host() { return window_tree_host_.get(); }
aura::Window* GetRootWindow();
void OnPlatformWindowClosed();
void OnActivationChanged(bool active);
protected:
// Updates the client area in the ui::Window.
virtual void UpdateClientArea();
// internal::NativeWidgetPrivate:
NonClientFrameView* CreateNonClientFrameView() override;
void InitNativeWidget(const Widget::InitParams& params) override;
void OnWidgetInitDone() override;
bool ShouldUseNativeFrame() const override;
bool ShouldWindowContentsBeTransparent() const override;
void FrameTypeChanged() override;
Widget* GetWidget() override;
const Widget* GetWidget() const override;
gfx::NativeView GetNativeView() const override;
gfx::NativeWindow GetNativeWindow() const override;
Widget* GetTopLevelWidget() override;
const ui::Compositor* GetCompositor() const override;
const ui::Layer* GetLayer() const override;
void ReorderNativeViews() override;
void ViewRemoved(View* view) override;
void SetNativeWindowProperty(const char* name, void* value) override;
void* GetNativeWindowProperty(const char* name) const override;
TooltipManager* GetTooltipManager() const override;
void SetCapture() override;
void ReleaseCapture() override;
bool HasCapture() const override;
ui::InputMethod* GetInputMethod() override;
void CenterWindow(const gfx::Size& size) override;
void GetWindowPlacement(gfx::Rect* bounds,
ui::WindowShowState* maximized) const override;
bool SetWindowTitle(const base::string16& title) override;
void SetWindowIcons(const gfx::ImageSkia& window_icon,
const gfx::ImageSkia& app_icon) override;
void InitModalType(ui::ModalType modal_type) override;
gfx::Rect GetWindowBoundsInScreen() const override;
gfx::Rect GetClientAreaBoundsInScreen() const override;
gfx::Rect GetRestoredBounds() const override;
std::string GetWorkspace() const override;
void SetBounds(const gfx::Rect& bounds) override;
void SetSize(const gfx::Size& size) override;
void StackAbove(gfx::NativeView native_view) override;
void StackAtTop() override;
void StackBelow(gfx::NativeView native_view) override;
void SetShape(SkRegion* shape) override;
void Close() override;
void CloseNow() override;
void Show() override;
void Hide() override;
void ShowMaximizedWithBounds(const gfx::Rect& restored_bounds) override;
void ShowWithWindowState(ui::WindowShowState state) override;
bool IsVisible() const override;
void Activate() override;
void Deactivate() override;
bool IsActive() const override;
void SetAlwaysOnTop(bool always_on_top) override;
bool IsAlwaysOnTop() const override;
void SetVisibleOnAllWorkspaces(bool always_visible) override;
void Maximize() override;
void Minimize() override;
bool IsMaximized() const override;
bool IsMinimized() const override;
void Restore() override;
void SetFullscreen(bool fullscreen) override;
bool IsFullscreen() const override;
void SetOpacity(float opacity) override;
void FlashFrame(bool flash_frame) override;
void RunShellDrag(View* view,
const ui::OSExchangeData& data,
const gfx::Point& location,
int operation,
ui::DragDropTypes::DragEventSource source) override;
void SchedulePaintInRect(const gfx::Rect& rect) override;
void SetCursor(gfx::NativeCursor cursor) override;
bool IsMouseEventsEnabled() const override;
void ClearNativeFocus() override;
gfx::Rect GetWorkAreaBoundsInScreen() const override;
Widget::MoveLoopResult RunMoveLoop(
const gfx::Vector2d& drag_offset,
Widget::MoveLoopSource source,
Widget::MoveLoopEscapeBehavior escape_behavior) override;
void EndMoveLoop() override;
void SetVisibilityChangedAnimationsEnabled(bool value) override;
void SetVisibilityAnimationDuration(const base::TimeDelta& duration) override;
void SetVisibilityAnimationTransition(
Widget::VisibilityTransition transition) override;
ui::NativeTheme* GetNativeTheme() const override;
void OnRootViewLayout() override;
bool IsTranslucentWindowOpacitySupported() const override;
void OnSizeConstraintsChanged() override;
void RepostNativeEvent(gfx::NativeEvent native_event) override;
std::string GetName() const override;
// Overridden from aura::WindowDelegate:
gfx::Size GetMinimumSize() const override;
gfx::Size GetMaximumSize() const override;
void OnBoundsChanged(const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds) override;
gfx::NativeCursor GetCursor(const gfx::Point& point) override;
int GetNonClientComponent(const gfx::Point& point) const override;
bool ShouldDescendIntoChildForEventHandling(
aura::Window* child,
const gfx::Point& location) override;
bool CanFocus() override;
void OnCaptureLost() override;
void OnPaint(const ui::PaintContext& context) override;
void OnDeviceScaleFactorChanged(float device_scale_factor) override;
void OnWindowDestroying(aura::Window* window) override;
void OnWindowDestroyed(aura::Window* window) override;
void OnWindowTargetVisibilityChanged(bool visible) override;
bool HasHitTestMask() const override;
void GetHitTestMask(gfx::Path* mask) const override;
// Overridden from ui::EventHandler:
void OnKeyEvent(ui::KeyEvent* event) override;
void OnMouseEvent(ui::MouseEvent* event) override;
void OnScrollEvent(ui::ScrollEvent* event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
// Overridden from aura::WindowTreeHostObserver:
void OnHostCloseRequested(const aura::WindowTreeHost* host) override;
// Overridden from ui::InputEventHandler:
void OnWindowInputEvent(
ui::Window* view,
const ui::Event& event,
std::unique_ptr<base::Callback<void(ui::mojom::EventResult)>>*
ack_callback) override;
private:
friend class NativeWidgetMusTest;
class MusWindowObserver;
class MusCaptureClient;
ui::PlatformWindowDelegate* platform_window_delegate() {
return window_tree_host();
}
void set_last_cursor(ui::mojom::Cursor cursor) { last_cursor_ = cursor; }
void SetShowState(ui::mojom::ShowState show_state);
void OnMusWindowVisibilityChanging(ui::Window* window);
void OnMusWindowVisibilityChanged(ui::Window* window);
// Propagates the widget hit test mask, if any, to the ui::Window.
// TODO(jamescook): Wire this through views::Widget so widgets can push
// updates if needed.
void UpdateHitTestMask();
ui::Window* window_;
ui::mojom::Cursor last_cursor_;
internal::NativeWidgetDelegate* native_widget_delegate_;
const ui::mojom::SurfaceType surface_type_;
ui::mojom::ShowState show_state_before_fullscreen_;
// See class documentation for Widget in widget.h for a note about ownership.
Widget::InitParams::Ownership ownership_;
// Functions with the same name require the ui::WindowObserver to be in
// a separate class.
std::unique_ptr<MusWindowObserver> mus_window_observer_;
// Aura configuration.
std::unique_ptr<SurfaceContextFactory> context_factory_;
std::unique_ptr<WindowTreeHostMus> window_tree_host_;
aura::Window* content_;
std::unique_ptr<wm::FocusController> focus_client_;
std::unique_ptr<MusCaptureClient> capture_client_;
std::unique_ptr<aura::client::WindowTreeClient> window_tree_client_;
std::unique_ptr<aura::client::ScreenPositionClient> screen_position_client_;
std::unique_ptr<wm::CursorManager> cursor_manager_;
// Bitmap management.
std::unique_ptr<bitmap_uploader::BitmapUploader> bitmap_uploader_;
std::unique_ptr<ui::ViewProp> prop_;
base::WeakPtrFactory<NativeWidgetMus> close_widget_factory_;
DISALLOW_COPY_AND_ASSIGN(NativeWidgetMus);
};
} // namespace views
#endif // UI_VIEWS_MUS_NATIVE_WIDGET_MUS_H_