diff options
Diffstat (limited to 'community/chromium/x11-ozone-fix-X11-screensaver-suspension.patch')
-rw-r--r-- | community/chromium/x11-ozone-fix-X11-screensaver-suspension.patch | 491 |
1 files changed, 0 insertions, 491 deletions
diff --git a/community/chromium/x11-ozone-fix-X11-screensaver-suspension.patch b/community/chromium/x11-ozone-fix-X11-screensaver-suspension.patch deleted file mode 100644 index a53615b5255..00000000000 --- a/community/chromium/x11-ozone-fix-X11-screensaver-suspension.patch +++ /dev/null @@ -1,491 +0,0 @@ -Patch-Source: https://github.com/archlinux/svntogit-packages/blob/94bc0c7eeee91ff11a3a416cca7d1ca4a042070f/trunk/x11-ozone-fix-X11-screensaver-suspension.patch -From 8c1ebea5f601b0b5247535dcdfd01755f3e6e1a6 Mon Sep 17 00:00:00 2001 -From: Andrew Wolfers <aswolfers@chromium.org> -Date: Tue, 19 Jul 2022 15:01:25 +0000 -Subject: [PATCH] [x11][ozone] Fix X11 screensaver suspension. - -X11 screensaver suspension was broken by https://crrev.com/c/3507472, -in which usage patterns were migrated to a non-stacking paradigm. - -"Non-stacking" screensaver suspension describes an overriding behavior, -such that the last suspending or un-suspending call defines the current -state. Conversely, a "stacking" screensaver suspension paradigm allows -for parallel suspension, such that suspending calls are expected to be -matched by an equal number of un-suspending calls. - -Documentation for `PlatformScreen::SetScreenSaverSuspended` (inherited -by `X11ScreenOzone`) explains that it should be used in a non-stacking -manner [1], which contradicts the child class's underlying -implementation [2]. - -> If XScreenSaverSuspend is called multiple times with suspend set to -> 'True', it must be called an equal number of times with suspend set -> to 'False' in order for the screensaver timer to be restarted. - -This change updates the documentation/API of the `PlatformScreen` -parent class to correctly describe the stacking behavior of child class -`X11ScreenOzone`. This change also updates the implementation of -`WaylandScreen` to a stacking version. Lastly, this change updates the -call sites of `PlatformScreen` according to the API change. - -[1] https://crsrc.org/c/ui/ozone/public/platform_screen.h;l=96 -[2] https://linux.die.net/man/3/xscreensaverunsetattributes - -Bug: b:193670013 -Bug: b:196213351 -Bug: 1329573 -Bug: 1339361 -Change-Id: I60975c8da9f86a0f26f3c32cf49c4a7eeeea6a12 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3759067 -Commit-Queue: Andrew Wolfers <aswolfers@chromium.org> -Reviewed-by: Thomas Anderson <thomasanderson@chromium.org> -Reviewed-by: Scott Violet <sky@chromium.org> -Cr-Commit-Position: refs/heads/main@{#1025717} - -(cherry picked from commit e61f08f8dbf1ec7cead427f3c497934e9d0db35f) ---- - ui/aura/screen_ozone.cc | 14 ++++++-- - ui/aura/screen_ozone.h | 29 ++++++++++++---- - ui/base/x/x11_util.h | 4 ++- - ui/display/screen.cc | 21 ++---------- - ui/display/screen.h | 34 ++++++------------- - .../platform/wayland/host/wayland_screen.cc | 31 +++++++++++++++++ - .../platform/wayland/host/wayland_screen.h | 30 +++++++++++++++- - ui/ozone/platform/x11/x11_screen_ozone.cc | 27 +++++++++++++-- - ui/ozone/platform/x11/x11_screen_ozone.h | 19 ++++++++++- - ui/ozone/public/platform_screen.cc | 8 +++-- - ui/ozone/public/platform_screen.h | 26 +++++++++++--- - 11 files changed, 182 insertions(+), 61 deletions(-) - -diff --git a/ui/aura/screen_ozone.cc b/ui/aura/screen_ozone.cc -index a78a6a48f1..09f62dc982 100644 ---- a/ui/aura/screen_ozone.cc -+++ b/ui/aura/screen_ozone.cc -@@ -4,6 +4,8 @@ - - #include "ui/aura/screen_ozone.h" - -+#include <memory> -+ - #include "ui/aura/client/screen_position_client.h" - #include "ui/aura/window.h" - #include "ui/aura/window_tree_host.h" -@@ -108,8 +110,16 @@ display::Display ScreenOzone::GetPrimaryDisplay() const { - } - - #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) --bool ScreenOzone::SetScreenSaverSuspended(bool suspend) { -- return platform_screen_->SetScreenSaverSuspended(suspend); -+ScreenOzone::ScreenSaverSuspenderOzone::ScreenSaverSuspenderOzone( -+ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender> suspender) -+ : suspender_(std::move(suspender)) {} -+ -+ScreenOzone::ScreenSaverSuspenderOzone::~ScreenSaverSuspenderOzone() = default; -+ -+std::unique_ptr<display::Screen::ScreenSaverSuspender> -+ScreenOzone::SuspendScreenSaver() { -+ return std::make_unique<ScreenSaverSuspenderOzone>( -+ platform_screen_->SuspendScreenSaver()); - } - #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) - -diff --git a/ui/aura/screen_ozone.h b/ui/aura/screen_ozone.h -index 2970a0e0e7..d033abf366 100644 ---- a/ui/aura/screen_ozone.h -+++ b/ui/aura/screen_ozone.h -@@ -11,10 +11,7 @@ - #include "build/chromeos_buildflags.h" - #include "ui/aura/aura_export.h" - #include "ui/display/screen.h" -- --namespace ui { --class PlatformScreen; --} -+#include "ui/ozone/public/platform_screen.h" - - namespace aura { - -@@ -48,6 +45,10 @@ class AURA_EXPORT ScreenOzone : public display::Screen { - display::Display GetDisplayMatching( - const gfx::Rect& match_rect) const override; - display::Display GetPrimaryDisplay() const override; -+#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) -+ std::unique_ptr<display::Screen::ScreenSaverSuspender> SuspendScreenSaver() -+ override; -+#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) - bool IsScreenSaverActive() const override; - base::TimeDelta CalculateIdleTime() const override; - void AddObserver(display::DisplayObserver* observer) override; -@@ -65,11 +66,27 @@ class AURA_EXPORT ScreenOzone : public display::Screen { - protected: - ui::PlatformScreen* platform_screen() { return platform_screen_.get(); } - -+ private: - #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) -- bool SetScreenSaverSuspended(bool suspend) override; -+ class ScreenSaverSuspenderOzone -+ : public display::Screen::ScreenSaverSuspender { -+ public: -+ explicit ScreenSaverSuspenderOzone( -+ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender> -+ suspender); -+ -+ ScreenSaverSuspenderOzone(const ScreenSaverSuspenderOzone&) = delete; -+ ScreenSaverSuspenderOzone& operator=(const ScreenSaverSuspenderOzone&) = -+ delete; -+ -+ ~ScreenSaverSuspenderOzone() override; -+ -+ private: -+ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender> -+ suspender_; -+ }; - #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) - -- private: - gfx::AcceleratedWidget GetAcceleratedWidgetForWindow( - aura::Window* window) const; - -diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h -index bf36efe170..0692571582 100644 ---- a/ui/base/x/x11_util.h -+++ b/ui/base/x/x11_util.h -@@ -337,7 +337,9 @@ COMPONENT_EXPORT(UI_BASE_X) bool IsCompositingManagerPresent(); - COMPONENT_EXPORT(UI_BASE_X) bool IsX11WindowFullScreen(x11::Window window); - - // Suspends or resumes the X screen saver, and returns whether the operation was --// successful. Must be called on the UI thread. -+// successful. Must be called on the UI thread. If called multiple times with -+// |suspend| set to true, the screen saver is not un-suspended until this method -+// is called an equal number of times with |suspend| set to false. - COMPONENT_EXPORT(UI_BASE_X) bool SuspendX11ScreenSaver(bool suspend); - - // Returns true if the window manager supports the given hint. -diff --git a/ui/display/screen.cc b/ui/display/screen.cc -index b9723889ce..70dc0a9f5c 100644 ---- a/ui/display/screen.cc -+++ b/ui/display/screen.cc -@@ -85,26 +85,11 @@ void Screen::SetDisplayForNewWindows(int64_t display_id) { - } - - #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) --std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() { -- SetScreenSaverSuspended(true); -- screen_saver_suspension_count_++; -- return base::WrapUnique(new Screen::ScreenSaverSuspender(this)); --} -- --Screen::ScreenSaverSuspender::~ScreenSaverSuspender() { -- // Check that this suspender still refers to the active screen. Particularly -- // in tests, the screen might be destructed before the suspender. -- if (screen_ == GetScreen()) { -- screen_->screen_saver_suspension_count_--; -- if (screen_->screen_saver_suspension_count_ == 0) { -- screen_->SetScreenSaverSuspended(false); -- } -- } --} -+Screen::ScreenSaverSuspender::~ScreenSaverSuspender() = default; - --bool Screen::SetScreenSaverSuspended(bool suspend) { -+std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() { - NOTIMPLEMENTED_LOG_ONCE(); -- return false; -+ return nullptr; - } - #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) - -diff --git a/ui/display/screen.h b/ui/display/screen.h -index a86c5b63cc..d04534006f 100644 ---- a/ui/display/screen.h -+++ b/ui/display/screen.h -@@ -133,28 +133,22 @@ class DISPLAY_EXPORT Screen { - // its existence. - class ScreenSaverSuspender { - public: -- ScreenSaverSuspender(const Screen&) = delete; -- ScreenSaverSuspender& operator=(const Screen&) = delete; -+ ScreenSaverSuspender() = default; - -- // Notifies |screen_| that this instance is being destructed, and causes its -- // platform-specific screensaver to be un-suspended if this is the last such -- // remaining instance. -- ~ScreenSaverSuspender(); -+ ScreenSaverSuspender(const ScreenSaverSuspender&) = delete; -+ ScreenSaverSuspender& operator=(const ScreenSaverSuspender&) = delete; - -- private: -- friend class Screen; -- -- explicit ScreenSaverSuspender(Screen* screen) : screen_(screen) {} -- -- Screen* screen_; -+ // Causes the platform-specific screensaver to be un-suspended iff this is -+ // the last remaining instance. -+ virtual ~ScreenSaverSuspender() = 0; - }; - - // Suspends the platform-specific screensaver until the returned -- // |ScreenSaverSuspender| is destructed. This method allows stacking multiple -- // overlapping calls, such that the platform-specific screensaver will not be -- // un-suspended until all returned |SreenSaverSuspender| instances have been -- // destructed. -- std::unique_ptr<ScreenSaverSuspender> SuspendScreenSaver(); -+ // |ScreenSaverSuspender| is destructed, or returns nullptr if suspension -+ // failed. This method allows stacking multiple overlapping calls, such that -+ // the platform-specific screensaver will not be un-suspended until all -+ // returned |ScreenSaverSuspender| instances have been destructed. -+ virtual std::unique_ptr<ScreenSaverSuspender> SuspendScreenSaver(); - #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) - - // Returns whether the screensaver is currently running. -@@ -200,12 +194,6 @@ class DISPLAY_EXPORT Screen { - const gfx::GpuExtraInfo& gpu_extra_info); - - protected: --#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) -- // Suspends or un-suspends the platform-specific screensaver, and returns -- // whether the operation was successful. -- virtual bool SetScreenSaverSuspended(bool suspend); --#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) -- - void set_shutdown(bool shutdown) { shutdown_ = shutdown; } - - private: -diff --git a/ui/ozone/platform/wayland/host/wayland_screen.cc b/ui/ozone/platform/wayland/host/wayland_screen.cc -index 0c7dc5c02b..18cd81b472 100644 ---- a/ui/ozone/platform/wayland/host/wayland_screen.cc -+++ b/ui/ozone/platform/wayland/host/wayland_screen.cc -@@ -327,6 +327,37 @@ display::Display WaylandScreen::GetDisplayMatching( - return display_matching ? *display_matching : GetPrimaryDisplay(); - } - -+std::unique_ptr<WaylandScreen::WaylandScreenSaverSuspender> -+WaylandScreen::WaylandScreenSaverSuspender::Create(WaylandScreen& screen) { -+ auto suspender = base::WrapUnique(new WaylandScreenSaverSuspender(screen)); -+ if (suspender->is_suspending_) { -+ screen.screen_saver_suspension_count_++; -+ return suspender; -+ } -+ -+ return nullptr; -+} -+ -+WaylandScreen::WaylandScreenSaverSuspender::WaylandScreenSaverSuspender( -+ WaylandScreen& screen) -+ : screen_(screen.GetWeakPtr()) { -+ is_suspending_ = screen.SetScreenSaverSuspended(true); -+} -+ -+WaylandScreen::WaylandScreenSaverSuspender::~WaylandScreenSaverSuspender() { -+ if (screen_ && is_suspending_) { -+ screen_->screen_saver_suspension_count_--; -+ if (screen_->screen_saver_suspension_count_ == 0) { -+ screen_->SetScreenSaverSuspended(false); -+ } -+ } -+} -+ -+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender> -+WaylandScreen::SuspendScreenSaver() { -+ return WaylandScreenSaverSuspender::Create(*this); -+} -+ - bool WaylandScreen::SetScreenSaverSuspended(bool suspend) { - if (!connection_->zwp_idle_inhibit_manager()) - return false; -diff --git a/ui/ozone/platform/wayland/host/wayland_screen.h b/ui/ozone/platform/wayland/host/wayland_screen.h -index 87358f4f06..8e5515104a 100644 ---- a/ui/ozone/platform/wayland/host/wayland_screen.h -+++ b/ui/ozone/platform/wayland/host/wayland_screen.h -@@ -68,7 +68,8 @@ class WaylandScreen : public PlatformScreen { - const gfx::Point& point) const override; - display::Display GetDisplayMatching( - const gfx::Rect& match_rect) const override; -- bool SetScreenSaverSuspended(bool suspend) override; -+ std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender> -+ SuspendScreenSaver() override; - bool IsScreenSaverActive() const override; - base::TimeDelta CalculateIdleTime() const override; - void AddObserver(display::DisplayObserver* observer) override; -@@ -76,7 +77,33 @@ class WaylandScreen : public PlatformScreen { - std::vector<base::Value> GetGpuExtraInfo( - const gfx::GpuExtraInfo& gpu_extra_info) override; - -+ protected: -+ // Suspends or un-suspends the platform-specific screensaver, and returns -+ // whether the operation was successful. Can be called more than once with the -+ // same value for |suspend|, but those states should not stack: the first -+ // alternating value should toggle the state of the suspend. -+ bool SetScreenSaverSuspended(bool suspend); -+ - private: -+ class WaylandScreenSaverSuspender -+ : public PlatformScreen::PlatformScreenSaverSuspender { -+ public: -+ WaylandScreenSaverSuspender(const WaylandScreenSaverSuspender&) = delete; -+ WaylandScreenSaverSuspender& operator=(const WaylandScreenSaverSuspender&) = -+ delete; -+ -+ ~WaylandScreenSaverSuspender() override; -+ -+ static std::unique_ptr<WaylandScreenSaverSuspender> Create( -+ WaylandScreen& screen); -+ -+ private: -+ explicit WaylandScreenSaverSuspender(WaylandScreen& screen); -+ -+ base::WeakPtr<WaylandScreen> screen_; -+ bool is_suspending_ = false; -+ }; -+ - // All parameters are in DIP screen coordinates/units except |physical_size|, - // which is in physical pixels. - void AddOrUpdateDisplay(uint32_t output_id, -@@ -103,6 +130,7 @@ class WaylandScreen : public PlatformScreen { - #endif - - wl::Object<zwp_idle_inhibitor_v1> idle_inhibitor_; -+ uint32_t screen_saver_suspension_count_ = 0; - - base::WeakPtrFactory<WaylandScreen> weak_factory_; - }; -diff --git a/ui/ozone/platform/x11/x11_screen_ozone.cc b/ui/ozone/platform/x11/x11_screen_ozone.cc -index 53265ab58a..b450df9c83 100644 ---- a/ui/ozone/platform/x11/x11_screen_ozone.cc -+++ b/ui/ozone/platform/x11/x11_screen_ozone.cc -@@ -4,6 +4,8 @@ - - #include "ui/ozone/platform/x11/x11_screen_ozone.h" - -+#include <memory> -+ - #include "base/containers/flat_set.h" - #include "ui/base/linux/linux_desktop.h" - #include "ui/base/x/x11_idle_query.h" -@@ -131,8 +133,29 @@ display::Display X11ScreenOzone::GetDisplayMatching( - return matching_display ? *matching_display : GetPrimaryDisplay(); - } - --bool X11ScreenOzone::SetScreenSaverSuspended(bool suspend) { -- return SuspendX11ScreenSaver(suspend); -+X11ScreenOzone::X11ScreenSaverSuspender::X11ScreenSaverSuspender() { -+ is_suspending_ = SuspendX11ScreenSaver(true); -+} -+ -+std::unique_ptr<X11ScreenOzone::X11ScreenSaverSuspender> -+X11ScreenOzone::X11ScreenSaverSuspender::Create() { -+ auto suspender = base::WrapUnique(new X11ScreenSaverSuspender()); -+ if (suspender->is_suspending_) { -+ return suspender; -+ } -+ -+ return nullptr; -+} -+ -+X11ScreenOzone::X11ScreenSaverSuspender::~X11ScreenSaverSuspender() { -+ if (is_suspending_) { -+ SuspendX11ScreenSaver(false); -+ } -+} -+ -+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender> -+X11ScreenOzone::SuspendScreenSaver() { -+ return X11ScreenSaverSuspender::Create(); - } - - bool X11ScreenOzone::IsScreenSaverActive() const { -diff --git a/ui/ozone/platform/x11/x11_screen_ozone.h b/ui/ozone/platform/x11/x11_screen_ozone.h -index d86acae9aa..81e0fd13d8 100644 ---- a/ui/ozone/platform/x11/x11_screen_ozone.h -+++ b/ui/ozone/platform/x11/x11_screen_ozone.h -@@ -50,7 +50,8 @@ class X11ScreenOzone : public PlatformScreen, - const gfx::Point& point) const override; - display::Display GetDisplayMatching( - const gfx::Rect& match_rect) const override; -- bool SetScreenSaverSuspended(bool suspend) override; -+ std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender> -+ SuspendScreenSaver() override; - bool IsScreenSaverActive() const override; - base::TimeDelta CalculateIdleTime() const override; - void AddObserver(display::DisplayObserver* observer) override; -@@ -66,6 +67,22 @@ class X11ScreenOzone : public PlatformScreen, - private: - friend class X11ScreenOzoneTest; - -+ class X11ScreenSaverSuspender -+ : public PlatformScreen::PlatformScreenSaverSuspender { -+ public: -+ X11ScreenSaverSuspender(const X11ScreenSaverSuspender&) = delete; -+ X11ScreenSaverSuspender& operator=(const X11ScreenSaverSuspender&) = delete; -+ -+ ~X11ScreenSaverSuspender() override; -+ -+ static std::unique_ptr<X11ScreenSaverSuspender> Create(); -+ -+ private: -+ X11ScreenSaverSuspender(); -+ -+ bool is_suspending_ = false; -+ }; -+ - // Overridden from ui::XDisplayManager::Delegate: - void OnXDisplayListUpdated() override; - float GetXDisplayScaleFactor() const override; -diff --git a/ui/ozone/public/platform_screen.cc b/ui/ozone/public/platform_screen.cc -index 98f599aa41..2353208396 100644 ---- a/ui/ozone/public/platform_screen.cc -+++ b/ui/ozone/public/platform_screen.cc -@@ -30,9 +30,13 @@ std::string PlatformScreen::GetCurrentWorkspace() { - return {}; - } - --bool PlatformScreen::SetScreenSaverSuspended(bool suspend) { -+PlatformScreen::PlatformScreenSaverSuspender::~PlatformScreenSaverSuspender() = -+ default; -+ -+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender> -+PlatformScreen::SuspendScreenSaver() { - NOTIMPLEMENTED_LOG_ONCE(); -- return false; -+ return nullptr; - } - - bool PlatformScreen::IsScreenSaverActive() const { -diff --git a/ui/ozone/public/platform_screen.h b/ui/ozone/public/platform_screen.h -index 091220a99f..e4adfafce3 100644 ---- a/ui/ozone/public/platform_screen.h -+++ b/ui/ozone/public/platform_screen.h -@@ -89,11 +89,27 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen { - virtual display::Display GetDisplayMatching( - const gfx::Rect& match_rect) const = 0; - -- // Suspends or un-suspends the platform-specific screensaver, and returns -- // whether the operation was successful. Can be called more than once with the -- // same value for |suspend|, but those states should not stack: the first -- // alternating value should toggle the state of the suspend. -- virtual bool SetScreenSaverSuspended(bool suspend); -+ // Object which suspends the platform-specific screensaver for the duration of -+ // its existence. -+ class PlatformScreenSaverSuspender { -+ public: -+ PlatformScreenSaverSuspender() = default; -+ -+ PlatformScreenSaverSuspender(const PlatformScreenSaverSuspender&) = delete; -+ PlatformScreenSaverSuspender& operator=( -+ const PlatformScreenSaverSuspender&) = delete; -+ -+ // Causes the platform-specific screensaver to be un-suspended iff this is -+ // the last remaining instance. -+ virtual ~PlatformScreenSaverSuspender() = 0; -+ }; -+ -+ // Suspends the platform-specific screensaver until the returned -+ // |PlatformScreenSaverSuspender| is destructed, or returns nullptr if -+ // suspension failed. This method allows stacking multiple overlapping calls, -+ // such that the platform-specific screensaver will not be un-suspended until -+ // all returned |PlatformScreenSaverSuspender| instances have been destructed. -+ virtual std::unique_ptr<PlatformScreenSaverSuspender> SuspendScreenSaver(); - - // Returns whether the screensaver is currently running. - virtual bool IsScreenSaverActive() const; |