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

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

Issue 2396883003: exo: Fix dragging edge cases (Closed)
Patch Set: Fix unit tests Created 4 years, 2 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/wayland/server.cc
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index 53b20f9432e12933ea581195d6beb1b66a0a4470..e267dee66179e411cf9ad4ff61a562f0a7695429 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -1535,6 +1535,14 @@ void remote_surface_unset_system_modal(wl_client* client,
GetUserDataAs<ShellSurface>(resource)->SetSystemModal(false);
}
+void remote_surface_set_moving(wl_client* client, wl_resource* resource) {
+ GetUserDataAs<ShellSurface>(resource)->SetMoving();
+}
+
+void remote_surface_unset_moving(wl_client* client, wl_resource* resource) {
+ GetUserDataAs<ShellSurface>(resource)->UnsetMoving(false /* revert */);
+}
+
const struct zcr_remote_surface_v1_interface remote_surface_implementation = {
remote_surface_destroy,
remote_surface_set_app_id,
@@ -1553,7 +1561,9 @@ const struct zcr_remote_surface_v1_interface remote_surface_implementation = {
remote_surface_pin,
remote_surface_unpin,
remote_surface_set_system_modal,
- remote_surface_unset_system_modal};
+ remote_surface_unset_system_modal,
+ remote_surface_set_moving,
+ remote_surface_unset_moving};
////////////////////////////////////////////////////////////////////////////////
// notification_surface_interface:
@@ -1570,7 +1580,7 @@ const struct zcr_notification_surface_v1_interface
// Implements remote shell interface and monitors workspace state needed
// for the remote shell interface.
-class WaylandRemoteShell : public WMHelper::MaximizeModeObserver,
+class WaylandRemoteShell : public WMHelper::ShellObserver,
public WMHelper::ActivationObserver,
public display::DisplayObserver {
public:
@@ -1579,7 +1589,7 @@ class WaylandRemoteShell : public WMHelper::MaximizeModeObserver,
remote_shell_resource_(remote_shell_resource),
weak_ptr_factory_(this) {
auto* helper = WMHelper::GetInstance();
- helper->AddMaximizeModeObserver(this);
+ helper->AddShellObserver(this);
helper->AddActivationObserver(this);
display::Screen::GetScreen()->AddObserver(this);
@@ -1587,12 +1597,12 @@ class WaylandRemoteShell : public WMHelper::MaximizeModeObserver,
? ZCR_REMOTE_SHELL_V1_LAYOUT_MODE_TABLET
: ZCR_REMOTE_SHELL_V1_LAYOUT_MODE_WINDOWED;
- SendPrimaryDisplayMetrics();
+ SendDisplayMetrics();
SendActivated(helper->GetActiveWindow(), nullptr);
}
~WaylandRemoteShell() override {
auto* helper = WMHelper::GetInstance();
- helper->RemoveMaximizeModeObserver(this);
+ helper->RemoveShellObserver(this);
helper->RemoveActivationObserver(this);
display::Screen::GetScreen()->RemoveObserver(this);
}
@@ -1609,40 +1619,40 @@ class WaylandRemoteShell : public WMHelper::MaximizeModeObserver,
}
// Overridden from display::DisplayObserver:
- void OnDisplayAdded(const display::Display& new_display) override {}
- void OnDisplayRemoved(const display::Display& new_display) override {}
+ void OnDisplayAdded(const display::Display& new_display) override {
+ if (IsMultiDisplaySupported())
+ ScheduleSendDisplayMetrics();
+ }
+
+ void OnDisplayRemoved(const display::Display& new_display) override {
+ if (IsMultiDisplaySupported())
+ ScheduleSendDisplayMetrics();
+ }
+
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override {
- if (display::Screen::GetScreen()->GetPrimaryDisplay().id() != display.id())
+ if (!IsMultiDisplaySupported() &&
+ display::Screen::GetScreen()->GetPrimaryDisplay().id() != display.id())
return;
- // No need to update when a primary dislpay has changed without bounds
+ // No need to update when a primary display has changed without bounds
// change. See WaylandPrimaryDisplayObserver::OnDisplayMetricsChanged
// for more details.
if (changed_metrics &
(DISPLAY_METRIC_BOUNDS | DISPLAY_METRIC_DEVICE_SCALE_FACTOR |
DISPLAY_METRIC_ROTATION | DISPLAY_METRIC_WORK_AREA)) {
- SendDisplayMetrics(display);
+ ScheduleSendDisplayMetrics();
}
}
- // Overridden from WMHelper::MaximizeModeObserver:
+ // Overridden from WMHelper::ShellObserver:
void OnMaximizeModeStarted() override {
layout_mode_ = ZCR_REMOTE_SHELL_V1_LAYOUT_MODE_TABLET;
-
- send_configure_after_layout_change_ = true;
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
- FROM_HERE, base::Bind(&WaylandRemoteShell::MaybeSendConfigure,
- weak_ptr_factory_.GetWeakPtr()),
- base::TimeDelta::FromMilliseconds(kConfigureDelayAfterLayoutSwitchMs));
+ ScheduleSendDisplayMetrics(kConfigureDelayAfterLayoutSwitchMs);
}
void OnMaximizeModeEnded() override {
layout_mode_ = ZCR_REMOTE_SHELL_V1_LAYOUT_MODE_WINDOWED;
- send_configure_after_layout_change_ = true;
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
- FROM_HERE, base::Bind(&WaylandRemoteShell::MaybeSendConfigure,
- weak_ptr_factory_.GetWeakPtr()),
- base::TimeDelta::FromMilliseconds(kConfigureDelayAfterLayoutSwitchMs));
+ ScheduleSendDisplayMetrics(kConfigureDelayAfterLayoutSwitchMs);
}
// Overridden from WMHelper::ActivationObserver:
@@ -1652,27 +1662,46 @@ class WaylandRemoteShell : public WMHelper::MaximizeModeObserver,
}
private:
- void SendPrimaryDisplayMetrics() {
- const display::Display primary =
- display::Screen::GetScreen()->GetPrimaryDisplay();
-
- SendDisplayMetrics(primary);
+ bool IsMultiDisplaySupported() const {
+ return wl_resource_get_version(remote_shell_resource_) >= 2;
}
- void MaybeSendConfigure() {
- if (send_configure_after_layout_change_)
- SendPrimaryDisplayMetrics();
+ void ScheduleSendDisplayMetrics(int delay_ms = 0) {
+ needs_send_display_metrics_ = true;
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE, base::Bind(&WaylandRemoteShell::SendDisplayMetrics,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::TimeDelta::FromMilliseconds(delay_ms));
}
- void SendDisplayMetrics(const display::Display& display) {
- send_configure_after_layout_change_ = false;
+ void SendDisplayMetrics() {
+ if (!needs_send_display_metrics_)
+ return;
+ needs_send_display_metrics_ = false;
+
+ const display::Screen* screen = display::Screen::GetScreen();
+ const display::Display primary = screen->GetPrimaryDisplay();
+
+ gfx::Size size = primary.size();
+
+ if (IsMultiDisplaySupported()) {
+ // Virtual screen is the bounding box of the displays in screen
+ // coordinates.
+ gfx::Rect bounds;
+ for (const auto& display : screen->GetAllDisplays())
+ bounds.Union(display.bounds());
+
+ display_->set_virtual_origin(bounds.origin());
+ size = bounds.size();
+ }
- const gfx::Insets& work_area_insets = display.GetWorkAreaInsets();
+ // TODO(domlaskowski): Send insets for each workspace.
+ const gfx::Insets& work_area_insets = primary.GetWorkAreaInsets();
zcr_remote_shell_v1_send_configuration_changed(
- remote_shell_resource_, display.size().width(), display.size().height(),
- OutputTransform(display.rotation()),
- wl_fixed_from_double(display.device_scale_factor()),
+ remote_shell_resource_, size.width(), size.height(),
+ OutputTransform(primary.rotation()),
+ wl_fixed_from_double(primary.device_scale_factor()),
work_area_insets.left(), work_area_insets.top(),
work_area_insets.right(), work_area_insets.bottom(), layout_mode_);
wl_client_flush(wl_resource_get_client(remote_shell_resource_));
@@ -1717,7 +1746,7 @@ class WaylandRemoteShell : public WMHelper::MaximizeModeObserver,
// The remote shell resource associated with observer.
wl_resource* const remote_shell_resource_;
- bool send_configure_after_layout_change_ = false;
+ bool needs_send_display_metrics_ = true;
int layout_mode_ = ZCR_REMOTE_SHELL_V1_LAYOUT_MODE_WINDOWED;
@@ -1840,7 +1869,7 @@ const struct zcr_remote_shell_v1_interface remote_shell_implementation = {
remote_shell_destroy, remote_shell_get_remote_surface,
remote_shell_get_notification_surface};
-const uint32_t remote_shell_version = 1;
+const uint32_t remote_shell_version = 2;
void bind_remote_shell(wl_client* client,
void* data,

Powered by Google App Engine
This is Rietveld 408576698