diff --git a/widget/gtk/WakeLockListener.cpp b/widget/gtk/WakeLockListener.cpp index 31a795306cfd..52e865153199 100644 --- a/widget/gtk/WakeLockListener.cpp +++ b/widget/gtk/WakeLockListener.cpp @@ -24,7 +24,6 @@ #if defined(MOZ_WAYLAND) # include "mozilla/widget/nsWaylandDisplay.h" # include "nsWindow.h" -# include "mozilla/dom/power/PowerManagerService.h" #endif #ifdef MOZ_ENABLE_DBUS @@ -48,8 +47,6 @@ using namespace mozilla::widget; NS_IMPL_ISUPPORTS(WakeLockListener, nsIDOMMozWakeLockListener) -StaticRefPtr WakeLockListener::sSingleton; - #define WAKE_LOCK_LOG(str, ...) \ MOZ_LOG(gLinuxWakeLockLog, mozilla::LogLevel::Debug, \ ("[%p] " str, this, ##__VA_ARGS__)) @@ -716,21 +713,6 @@ bool WakeLockTopic::SwitchToNextWakeLockType() { return false; } -/* static */ -WakeLockListener* WakeLockListener::GetSingleton(bool aCreate) { - if (!sSingleton && aCreate) { - sSingleton = new WakeLockListener(); - } - return sSingleton; -} - -/* static */ -void WakeLockListener::Shutdown() { - MOZ_LOG(gLinuxWakeLockLog, mozilla::LogLevel::Debug, - ("WakeLockListener::Shutdown()")); - sSingleton = nullptr; -} - nsresult WakeLockListener::Callback(const nsAString& topic, const nsAString& state) { if (!topic.Equals(u"screen"_ns) && !topic.Equals(u"video-playing"_ns) && diff --git a/widget/gtk/WakeLockListener.h b/widget/gtk/WakeLockListener.h index 400783a6ed71..34827c2e4bc1 100644 --- a/widget/gtk/WakeLockListener.h +++ b/widget/gtk/WakeLockListener.h @@ -8,18 +8,11 @@ #ifndef __WakeLockListener_h__ #define __WakeLockListener_h__ -#include - -#include "mozilla/StaticPtr.h" #include "nsHashKeys.h" #include "nsRefPtrHashtable.h" #include "nsIDOMWakeLockListener.h" -#ifdef MOZ_ENABLE_DBUS -# include "mozilla/DBusHelpers.h" -#endif - class WakeLockTopic; /** @@ -30,17 +23,11 @@ class WakeLockListener final : public nsIDOMMozWakeLockListener { public: NS_DECL_ISUPPORTS; - static WakeLockListener* GetSingleton(bool aCreate = true); - static void Shutdown(); - - virtual nsresult Callback(const nsAString& topic, - const nsAString& state) override; + nsresult Callback(const nsAString& topic, const nsAString& state) override; private: ~WakeLockListener() = default; - static mozilla::StaticRefPtr sSingleton; - // Map of topic names to |WakeLockTopic|s. // We assume a small, finite-sized set of topics. nsRefPtrHashtable mTopics; diff --git a/widget/gtk/nsAppShell.cpp b/widget/gtk/nsAppShell.cpp index e57e43293c14..be1f7b9f8ae6 100644 --- a/widget/gtk/nsAppShell.cpp +++ b/widget/gtk/nsAppShell.cpp @@ -267,6 +267,29 @@ void nsAppShell::StartDBusListening() { reinterpret_cast(DBusConnectClientResponse), this); } +mozilla::StaticRefPtr sWakeLockListener; + +static void AddScreenWakeLockListener() { + nsCOMPtr powerManager = + do_GetService(POWERMANAGERSERVICE_CONTRACTID); + if (powerManager) { + sWakeLockListener = new WakeLockListener(); + powerManager->AddWakeLockListener(sWakeLockListener); + } else { + NS_WARNING( + "Failed to retrieve PowerManagerService, wakelocks will be broken!"); + } +} + +static void RemoveScreenWakeLockListener() { + nsCOMPtr powerManager = + do_GetService(POWERMANAGERSERVICE_CONTRACTID); + if (powerManager) { + powerManager->RemoveWakeLockListener(sWakeLockListener); + sWakeLockListener = nullptr; + } +} + void nsAppShell::StopDBusListening() { if (mLogin1Proxy) { g_signal_handlers_disconnect_matched(mLogin1Proxy, G_SIGNAL_MATCH_DATA, 0, @@ -293,22 +316,11 @@ void nsAppShell::StopDBusListening() { nsresult nsAppShell::Init() { mozilla::hal::Init(); - if (XRE_IsParentProcess()) { - nsCOMPtr powerManagerService = - do_GetService(POWERMANAGERSERVICE_CONTRACTID); - - if (powerManagerService) { - powerManagerService->AddWakeLockListener( - WakeLockListener::GetSingleton()); - } else { - NS_WARNING( - "Failed to retrieve PowerManagerService, wakelocks will be broken!"); - } - #ifdef MOZ_ENABLE_DBUS + if (XRE_IsParentProcess()) { StartDBusListening(); -#endif } +#endif if (!sPollFunc) { sPollFunc = g_main_context_get_poll_func(nullptr); @@ -408,6 +420,19 @@ failed: return NS_ERROR_FAILURE; } +NS_IMETHODIMP nsAppShell::Run() { + if (XRE_IsParentProcess()) { + AddScreenWakeLockListener(); + } + + nsresult rv = nsBaseAppShell::Run(); + + if (XRE_IsParentProcess()) { + RemoveScreenWakeLockListener(); + } + return rv; +} + void nsAppShell::ScheduleNativeEventCallback() { unsigned char buf[] = {NOTIFY_TOKEN}; Unused << write(mPipeFDs[1], buf, 1); diff --git a/widget/gtk/nsAppShell.h b/widget/gtk/nsAppShell.h index f907fff7bae3..812e1fb77dae 100644 --- a/widget/gtk/nsAppShell.h +++ b/widget/gtk/nsAppShell.h @@ -15,16 +15,17 @@ #endif #include #include "nsBaseAppShell.h" -#include "nsCOMPtr.h" class nsAppShell : public nsBaseAppShell { public: - nsAppShell() : mTag(0) { mPipeFDs[0] = mPipeFDs[1] = 0; } + nsAppShell() = default; // nsBaseAppShell overrides: nsresult Init(); - virtual void ScheduleNativeEventCallback() override; - virtual bool ProcessNextNativeEvent(bool mayWait) override; + NS_IMETHOD Run() override; + + void ScheduleNativeEventCallback() override; + bool ProcessNextNativeEvent(bool mayWait) override; #ifdef MOZ_ENABLE_DBUS void StartDBusListening(); @@ -48,8 +49,8 @@ class nsAppShell : public nsBaseAppShell { static gboolean EventProcessorCallback(GIOChannel* source, GIOCondition condition, gpointer data); - int mPipeFDs[2]; - unsigned mTag; + int mPipeFDs[2] = {0, 0}; + unsigned mTag = 0; #ifdef MOZ_ENABLE_DBUS RefPtr mLogin1Proxy; diff --git a/widget/gtk/nsWidgetFactory.cpp b/widget/gtk/nsWidgetFactory.cpp index 7da65f5c8f92..7f06e8f9f3cb 100644 --- a/widget/gtk/nsWidgetFactory.cpp +++ b/widget/gtk/nsWidgetFactory.cpp @@ -64,5 +64,4 @@ void nsWidgetGtk2ModuleDtor() { KeymapWrapper::Shutdown(); nsGTKToolkit::Shutdown(); nsAppShellShutdown(); - WakeLockListener::Shutdown(); }