Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Unified Diff: ui/views/mus/native_widget_mus.cc

Issue 1419793006: Makes windowmanager draw non-client area (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add include Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/mus/native_widget_mus.h ('k') | ui/views/mus/window_manager_client_area_insets.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
index f9b43d30380ac342e012212ce63ece6be24d80b9..507e83f470afbef93f3413fd5219aebebf09a802 100644
--- a/ui/views/mus/native_widget_mus.cc
+++ b/ui/views/mus/native_widget_mus.cc
@@ -10,9 +10,15 @@
#include "ui/aura/client/default_capture_client.h"
#include "ui/aura/layout_manager.h"
#include "ui/aura/window.h"
+#include "ui/base/hit_test.h"
+#include "ui/compositor/clip_transform_recorder.h"
+#include "ui/compositor/paint_recorder.h"
+#include "ui/gfx/canvas.h"
#include "ui/native_theme/native_theme_aura.h"
+#include "ui/views/mus/window_manager_client_area_insets.h"
#include "ui/views/mus/window_tree_host_mus.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/focus_controller.h"
@@ -20,6 +26,8 @@
namespace views {
namespace {
+WindowManagerClientAreaInsets* window_manager_client_area_insets = nullptr;
+
// TODO: figure out what this should be.
class FocusRulesImpl : public wm::BaseFocusRules {
public:
@@ -61,6 +69,60 @@ class ContentWindowLayoutManager : public aura::LayoutManager {
DISALLOW_COPY_AND_ASSIGN(ContentWindowLayoutManager);
};
+// 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) {
+ if (!window_manager_client_area_insets)
+ return gfx::Insets();
+ return is_maximized ? window_manager_client_area_insets->maximized_insets
+ : window_manager_client_area_insets->normal_insets;
+ }
+
+ // NonClientFrameView:
+ gfx::Rect GetBoundsForClientView() const override {
+ gfx::Rect result(GetLocalBounds());
+ result.Inset(GetDefaultWindowManagerInsets(widget_->IsMaximized()));
+ return result;
+ }
+ gfx::Rect GetWindowBoundsForClientBounds(
+ const gfx::Rect& client_bounds) const override {
+ 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?
+ }
+ void UpdateWindowIcon() override {
+ // NOTIMPLEMENTED();
+ }
+ void UpdateWindowTitle() override {
+ // NOTIMPLEMENTED();
+ }
+ void SizeConstraintsChanged() override {
+ // NOTIMPLEMENTED();
+ }
+
+ views::Widget* widget_;
+
+ DISALLOW_COPY_AND_ASSIGN(ClientSideNonClientFrameView);
+};
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -78,6 +140,15 @@ NativeWidgetMus::NativeWidgetMus(internal::NativeWidgetDelegate* delegate,
content_(new aura::Window(this)) {}
NativeWidgetMus::~NativeWidgetMus() {}
+// static
+void NativeWidgetMus::SetWindowManagerClientAreaInsets(
+ const WindowManagerClientAreaInsets& insets) {
+ delete window_manager_client_area_insets;
+ // This is called early on, so we don't bother trying to relayout existing
+ // NativeWidgetMus. When we support restarting the WM we'll need to do that.
+ window_manager_client_area_insets = new WindowManagerClientAreaInsets(insets);
+}
+
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetMus, private:
@@ -87,12 +158,20 @@ void NativeWidgetMus::UpdateClientAreaInWindowManager() {
if (!non_client_view || !non_client_view->client_view())
return;
- window_->SetClientArea(non_client_view->client_view()->bounds());
+ 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, internal::NativeWidgetPrivate implementation:
+NonClientFrameView* NativeWidgetMus::CreateNonClientFrameView() {
+ return new ClientSideNonClientFrameView(GetWidget());
+}
+
void NativeWidgetMus::InitNativeWidget(const Widget::InitParams& params) {
window_tree_host_.reset(
new WindowTreeHostMus(shell_, window_, surface_type_));
@@ -119,11 +198,6 @@ void NativeWidgetMus::InitNativeWidget(const Widget::InitParams& params) {
// TODO(beng): much else, see [Desktop]NativeWidgetAura.
}
-NonClientFrameView* NativeWidgetMus::CreateNonClientFrameView() {
- // NOTIMPLEMENTED();
- return nullptr;
-}
-
bool NativeWidgetMus::ShouldUseNativeFrame() const {
// NOTIMPLEMENTED();
return false;
@@ -386,7 +460,7 @@ void NativeWidgetMus::RunShellDrag(
}
void NativeWidgetMus::SchedulePaintInRect(const gfx::Rect& rect) {
- // NOTIMPLEMENTED();
+ content_->SchedulePaintInRect(rect);
}
void NativeWidgetMus::SetCursor(gfx::NativeCursor cursor) {
« no previous file with comments | « ui/views/mus/native_widget_mus.h ('k') | ui/views/mus/window_manager_client_area_insets.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698