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

Unified Diff: components/exo/shell_surface.cc

Issue 2040743002: exo: Implement version 2 of remote shell interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remote-shell-version-2
Patch Set: popup placement fix Created 4 years, 6 months 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
Index: components/exo/shell_surface.cc
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc
index 277b4890b16d7934a8320174eaec525d3855e709..4555dda5ac44b0aca4a82632cf28e759cfd8c991 100644
--- a/components/exo/shell_surface.cc
+++ b/components/exo/shell_surface.cc
@@ -161,15 +161,14 @@ ShellSurface::ShellSurface(Surface* surface,
ShellSurface* parent,
const gfx::Rect& initial_bounds,
bool activatable,
- bool resizeable,
int container)
: widget_(nullptr),
surface_(surface),
parent_(parent ? parent->GetWidget()->GetNativeWindow() : nullptr),
initial_bounds_(initial_bounds),
activatable_(activatable),
- resizeable_(resizeable),
container_(container),
+ pending_show_widget_(false),
scale_(1.0),
pending_scale_(1.0),
scoped_configure_(nullptr),
@@ -190,7 +189,6 @@ ShellSurface::ShellSurface(Surface* surface)
nullptr,
gfx::Rect(),
true,
- true,
ash::kShellWindowId_DefaultContainer) {}
ShellSurface::~ShellSurface() {
@@ -270,6 +268,18 @@ void ShellSurface::Maximize() {
widget_->Maximize();
}
+void ShellSurface::Minimize() {
+ TRACE_EVENT0("exo", "ShellSurface::Minimize");
+
+ if (!widget_)
+ return;
+
+ // Note: This will ask client to configure its surface even if already
+ // minimized.
+ ScopedConfigure scoped_configure(this, true);
+ widget_->Minimize();
+}
+
void ShellSurface::Restore() {
TRACE_EVENT0("exo", "ShellSurface::Restore");
@@ -277,7 +287,7 @@ void ShellSurface::Restore() {
return;
// Note: This will ask client to configure its surface even if not already
- // maximized.
+ // maximized or minimized.
ScopedConfigure scoped_configure(this, true);
widget_->Restore();
}
@@ -325,14 +335,14 @@ void ShellSurface::SetApplicationId(const std::string& application_id) {
void ShellSurface::Move() {
TRACE_EVENT0("exo", "ShellSurface::Move");
- if (widget_)
+ if (widget_ && !widget_->movement_disabled())
AttemptToStartDrag(HTCAPTION);
}
void ShellSurface::Resize(int component) {
TRACE_EVENT1("exo", "ShellSurface::Resize", "component", component);
- if (widget_)
+ if (widget_ && !widget_->movement_disabled())
AttemptToStartDrag(component);
}
@@ -443,9 +453,13 @@ void ShellSurface::OnSurfaceCommit() {
scale_ = pending_scale_;
}
- // Show widget if not already visible.
- if (!widget_->IsClosed() && !widget_->IsVisible())
+ // Show widget if needed.
+ if (pending_show_widget_) {
+ DCHECK(!widget_->IsClosed());
+ DCHECK(!widget_->IsVisible());
+ pending_show_widget_ = false;
widget_->Show();
+ }
}
}
@@ -480,12 +494,16 @@ void ShellSurface::OnSurfaceDestroying(Surface* surface) {
////////////////////////////////////////////////////////////////////////////////
// views::WidgetDelegate overrides:
+bool ShellSurface::CanResize() const {
+ return initial_bounds_.IsEmpty();
+}
+
bool ShellSurface::CanMaximize() const {
- return resizeable_;
+ return true;
}
-bool ShellSurface::CanResize() const {
- return resizeable_;
+bool ShellSurface::CanMinimize() const {
+ return true;
}
base::string16 ShellSurface::GetWindowTitle() const {
@@ -553,6 +571,9 @@ void ShellSurface::OnPostWindowStateTypeChange(
if (widget_)
UpdateWidgetBounds();
+
+ if (!state_changed_callback_.is_null())
+ state_changed_callback_.Run(old_type, new_type);
}
////////////////////////////////////////////////////////////////////////////////
@@ -690,13 +711,7 @@ void ShellSurface::CreateShellSurfaceWidget(ui::WindowShowState show_state) {
params.show_state = show_state;
params.parent =
ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), container_);
- if (!initial_bounds_.IsEmpty()) {
- params.bounds = initial_bounds_;
- if (parent_) {
- aura::Window::ConvertRectToTarget(GetMainSurface(parent_), params.parent,
- &params.bounds);
- }
- }
+ params.bounds = initial_bounds_;
bool activatable = activatable_ && !surface_->GetHitTestBounds().IsEmpty();
params.activatable = activatable ? views::Widget::InitParams::ACTIVATABLE_YES
: views::Widget::InitParams::ACTIVATABLE_NO;
@@ -705,6 +720,9 @@ void ShellSurface::CreateShellSurfaceWidget(ui::WindowShowState show_state) {
widget_ = new ShellSurfaceWidget(this);
widget_->Init(params);
+ // Disable movement if initial bounds were specified.
+ widget_->set_movement_disabled(!initial_bounds_.IsEmpty());
+
aura::Window* window = widget_->GetNativeWindow();
window->SetName("ExoShellSurface");
window->AddChild(surface_);
@@ -727,6 +745,9 @@ void ShellSurface::CreateShellSurfaceWidget(ui::WindowShowState show_state) {
ash::wm::ToWindowShowState(ash::wm::WINDOW_STATE_TYPE_AUTO_POSITIONED) ==
show_state &&
initial_bounds_.IsEmpty());
+
+ // Show widget next time Commit() is called.
+ pending_show_widget_ = true;
}
void ShellSurface::Configure() {
@@ -877,8 +898,13 @@ gfx::Rect ShellSurface::GetVisibleBounds() const {
gfx::Point ShellSurface::GetSurfaceOrigin() const {
gfx::Rect window_bounds = widget_->GetWindowBoundsInScreen();
- gfx::Rect visible_bounds = GetVisibleBounds();
+ // If initial bounds were specified then surface origin is always relative
+ // to those bounds.
+ if (!initial_bounds_.IsEmpty())
+ return initial_bounds_.origin() - window_bounds.OffsetFromOrigin();
+
+ gfx::Rect visible_bounds = GetVisibleBounds();
switch (resize_component_) {
case HTCAPTION:
return origin_ - visible_bounds.OffsetFromOrigin();

Powered by Google App Engine
This is Rietveld 408576698