| 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,
|
|
|