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

Unified Diff: components/exo/wayland/server.cc

Issue 2548653005: exo: Add initial support for service side decorations. (Closed)
Patch Set: fix typo Created 4 years 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 | « components/exo/touch_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/exo/wayland/server.cc
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index 877e56c3867e29db172c7a33917205ec2fd45c26..754ac5bd637fbe79adb4544da5e2b21909e02f53 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -850,37 +850,6 @@ void bind_subcompositor(wl_client* client,
////////////////////////////////////////////////////////////////////////////////
// wl_shell_surface_interface:
-class ShellSurfaceSizeObserver : public views::WidgetObserver {
- public:
- ShellSurfaceSizeObserver(wl_resource* shell_surface_resource,
- const gfx::Size& initial_size)
- : shell_surface_resource_(shell_surface_resource),
- old_size_(initial_size) {
- wl_shell_surface_send_configure(shell_surface_resource,
- WL_SHELL_SURFACE_RESIZE_NONE,
- old_size_.width(), old_size_.height());
- }
-
- // Overridden from view::WidgetObserver:
- void OnWidgetDestroyed(views::Widget* widget) override { delete this; }
- void OnWidgetBoundsChanged(views::Widget* widget,
- const gfx::Rect& new_bounds) override {
- if (old_size_ == new_bounds.size())
- return;
-
- wl_shell_surface_send_configure(shell_surface_resource_,
- WL_SHELL_SURFACE_RESIZE_NONE,
- new_bounds.width(), new_bounds.height());
- old_size_ = new_bounds.size();
- }
-
- private:
- wl_resource* shell_surface_resource_;
- gfx::Size old_size_;
-
- DISALLOW_COPY_AND_ASSIGN(ShellSurfaceSizeObserver);
-};
-
void shell_surface_pong(wl_client* client,
wl_resource* resource,
uint32_t serial) {
@@ -903,7 +872,13 @@ void shell_surface_resize(wl_client* client,
}
void shell_surface_set_toplevel(wl_client* client, wl_resource* resource) {
- GetUserDataAs<ShellSurface>(resource)->SetEnabled(true);
+ ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource);
+ if (shell_surface->enabled())
+ return;
+
+ shell_surface->SetFrame(true);
+ shell_surface->SetRectangularShadow(true);
+ shell_surface->SetEnabled(true);
}
void shell_surface_set_transient(wl_client* client,
@@ -928,6 +903,7 @@ void shell_surface_set_transient(wl_client* client,
}
gfx::Point origin(x, y);
+ ShellSurface* parent_shell_surface = nullptr;
// Set parent if found and it is associated with a shell surface.
if (parent_widget &&
@@ -938,12 +914,18 @@ void shell_surface_set_transient(wl_client* client,
&origin);
// Shell surface widget delegate implementation of GetContentsView()
// returns a pointer to the shell surface instance.
- shell_surface->SetParent(static_cast<ShellSurface*>(
- parent_widget->widget_delegate()->GetContentsView()));
+ parent_shell_surface = static_cast<ShellSurface*>(
+ parent_widget->widget_delegate()->GetContentsView());
}
- shell_surface->SetOrigin(origin);
- shell_surface->SetActivatable(!(flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE));
+ if (flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE) {
+ shell_surface->SetOrigin(origin);
+ shell_surface->SetContainer(ash::kShellWindowId_SystemModalContainer);
+ } else {
+ shell_surface->SetFrame(true);
+ shell_surface->SetParent(parent_shell_surface);
+ }
+ shell_surface->SetRectangularShadow(true);
shell_surface->SetEnabled(true);
}
@@ -958,10 +940,6 @@ void shell_surface_set_fullscreen(wl_client* client,
shell_surface->SetEnabled(true);
shell_surface->SetFullscreen(true);
-
- views::Widget* widget = shell_surface->GetWidget();
- widget->AddObserver(new ShellSurfaceSizeObserver(
- resource, widget->GetWindowBoundsInScreen().size()));
}
void shell_surface_set_popup(wl_client* client,
@@ -984,10 +962,6 @@ void shell_surface_set_maximized(wl_client* client,
shell_surface->SetEnabled(true);
shell_surface->Maximize();
-
- views::Widget* widget = shell_surface->GetWidget();
- widget->AddObserver(new ShellSurfaceSizeObserver(
- resource, widget->GetWindowBoundsInScreen().size()));
}
void shell_surface_set_title(wl_client* client,
@@ -1013,6 +987,27 @@ const struct wl_shell_surface_interface shell_surface_implementation = {
////////////////////////////////////////////////////////////////////////////////
// wl_shell_interface:
+void HandleShellSurfaceCloseCallback(wl_resource* resource) {
+ // Shell surface interface doesn't have a close event. Just send a ping event
+ // for now.
+ uint32_t serial = wl_display_next_serial(
+ wl_client_get_display(wl_resource_get_client(resource)));
+ wl_shell_surface_send_ping(resource, serial);
+ wl_client_flush(wl_resource_get_client(resource));
+}
+
+uint32_t HandleShellSurfaceConfigureCallback(
+ wl_resource* resource,
+ const gfx::Size& size,
+ ash::wm::WindowStateType state_type,
+ bool resizing,
+ bool activated) {
+ wl_shell_surface_send_configure(resource, WL_SHELL_SURFACE_RESIZE_NONE,
+ size.width(), size.height());
+ wl_client_flush(wl_resource_get_client(resource));
+ return 0;
+}
+
void shell_get_shell_surface(wl_client* client,
wl_resource* resource,
uint32_t id,
@@ -1033,6 +1028,14 @@ void shell_get_shell_surface(wl_client* client,
// before they are enabled and can become visible.
shell_surface->SetEnabled(false);
+ shell_surface->set_close_callback(
+ base::Bind(&HandleShellSurfaceCloseCallback,
+ base::Unretained(shell_surface_resource)));
+
+ shell_surface->set_configure_callback(
+ base::Bind(&HandleShellSurfaceConfigureCallback,
+ base::Unretained(shell_surface_resource)));
+
shell_surface->set_surface_destroyed_callback(base::Bind(
&wl_resource_destroy, base::Unretained(shell_surface_resource)));
@@ -1498,8 +1501,11 @@ void remote_surface_set_rectangular_shadow(wl_client* client,
int32_t y,
int32_t width,
int32_t height) {
- GetUserDataAs<ShellSurface>(resource)->SetRectangularShadow(
- gfx::Rect(x, y, width, height));
+ ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource);
+ gfx::Rect content_bounds(x, y, width, height);
+
+ shell_surface->SetRectangularShadowContentBounds(content_bounds);
+ shell_surface->SetRectangularShadow(!content_bounds.IsEmpty());
}
void remote_surface_set_rectangular_shadow_background_opacity(
« no previous file with comments | « components/exo/touch_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698