diff --git a/widget/gtk/nsUserIdleServiceGTK.h b/widget/gtk/nsUserIdleServiceGTK.h --- a/widget/gtk/nsUserIdleServiceGTK.h +++ b/widget/gtk/nsUserIdleServiceGTK.h @@ -14,18 +14,20 @@ class nsUserIdleServiceGTK; class UserIdleServiceImpl { public: - NS_INLINE_DECL_REFCOUNTING(UserIdleServiceImpl); + explicit UserIdleServiceImpl(nsUserIdleServiceGTK* aUserIdleService) + : mUserIdleServiceGTK(aUserIdleService){}; virtual bool PollIdleTime(uint32_t* aIdleTime) = 0; - virtual bool ProbeImplementation( - RefPtr aUserIdleServiceGTK) = 0; + virtual bool ProbeImplementation() = 0; + + virtual ~UserIdleServiceImpl() = default; protected: - virtual ~UserIdleServiceImpl() = default; + nsUserIdleServiceGTK* mUserIdleServiceGTK; }; #define IDLE_SERVICE_MUTTER 0 #define IDLE_SERVICE_XSCREENSAVER 1 #define IDLE_SERVICE_NONE 2 @@ -61,11 +63,11 @@ nsUserIdleServiceGTK() = default; private: ~nsUserIdleServiceGTK() = default; - RefPtr mIdleService; + mozilla::UniquePtr mIdleService; #ifdef MOZ_ENABLE_DBUS int mIdleServiceType = IDLE_SERVICE_MUTTER; #else int mIdleServiceType = IDLE_SERVICE_XSCREENSAVER; #endif diff --git a/widget/gtk/nsUserIdleServiceGTK.cpp b/widget/gtk/nsUserIdleServiceGTK.cpp --- a/widget/gtk/nsUserIdleServiceGTK.cpp +++ b/widget/gtk/nsUserIdleServiceGTK.cpp @@ -74,12 +74,11 @@ MOZ_LOG(sIdleLog, LogLevel::Warning, ("XSSQueryExtension returned false!\n")); return false; } - bool ProbeImplementation( - RefPtr aUserIdleServiceGTK) override { + bool ProbeImplementation() override { MOZ_LOG(sIdleLog, LogLevel::Info, ("UserIdleServiceX11::UserIdleServiceX11()\n")); if (!mozilla::widget::GdkIsX11Display()) { return false; @@ -114,15 +113,17 @@ // We're missing X11 symbols return false; } // UserIdleServiceX11 uses sync init, confirm it now. - aUserIdleServiceGTK->AcceptServiceCallback(); + mUserIdleServiceGTK->AcceptServiceCallback(); return true; } - protected: + explicit UserIdleServiceX11(nsUserIdleServiceGTK* aUserIdleService) + : UserIdleServiceImpl(aUserIdleService){}; + ~UserIdleServiceX11() { # ifdef MOZ_X11 if (mXssInfo) { XFree(mXssInfo); } @@ -164,11 +165,11 @@ mCancellable) ->Then( GetCurrentSerialEventTarget(), __func__, // It's safe to capture this as we use mCancellable to stop // listening. - [self = RefPtr{this}, this](RefPtr&& aResult) { + [this](RefPtr&& aResult) { if (!g_variant_is_of_type(aResult, G_VARIANT_TYPE_TUPLE) || g_variant_n_children(aResult) != 1) { MOZ_LOG(sIdleLog, LogLevel::Info, ("PollIdleTime() Unexpected params type: %s\n", g_variant_get_type_string(aResult))); @@ -191,25 +192,25 @@ mLastIdleTime = idleTime; mPollInProgress = false; MOZ_LOG(sIdleLog, LogLevel::Info, ("Async handler got %d\n", mLastIdleTime)); }, - [self = RefPtr{this}, this](GUniquePtr&& aError) { + [this](GUniquePtr&& aError) { mPollInProgress = false; g_warning("Failed to call GetIdletime(): %s\n", aError->message); + mUserIdleServiceGTK->RejectAndTryNextServiceCallback(); }); } *aIdleTime = mLastIdleTime; MOZ_LOG(sIdleLog, LogLevel::Info, ("PollIdleTime() returns %d\n", *aIdleTime)); return true; } - bool ProbeImplementation( - RefPtr aUserIdleServiceGTK) override { + bool ProbeImplementation() override { MOZ_LOG(sIdleLog, LogLevel::Info, ("UserIdleServiceMutter::UserIdleServiceMutter()\n")); mCancellable = dont_AddRef(g_cancellable_new()); CreateDBusProxyForBus( @@ -219,23 +220,23 @@ nullptr, "org.gnome.Mutter.IdleMonitor", "/org/gnome/Mutter/IdleMonitor/Core", "org.gnome.Mutter.IdleMonitor", mCancellable) ->Then( GetCurrentSerialEventTarget(), __func__, - [self = RefPtr{this}, service = RefPtr{aUserIdleServiceGTK}]( - RefPtr&& aProxy) { - self->mProxy = std::move(aProxy); - service->AcceptServiceCallback(); + [this](RefPtr&& aProxy) { + mProxy = std::move(aProxy); + mUserIdleServiceGTK->AcceptServiceCallback(); }, - [self = RefPtr{this}, service = RefPtr{aUserIdleServiceGTK}]( - GUniquePtr&& aError) { - service->RejectAndTryNextServiceCallback(); + [this](GUniquePtr&& aError) { + mUserIdleServiceGTK->RejectAndTryNextServiceCallback(); }); return true; } - protected: + explicit UserIdleServiceMutter(nsUserIdleServiceGTK* aUserIdleService) + : UserIdleServiceImpl(aUserIdleService){}; + ~UserIdleServiceMutter() { if (mCancellable) { g_cancellable_cancel(mCancellable); mCancellable = nullptr; } @@ -257,23 +258,23 @@ MOZ_ASSERT(!mIdleService); switch (mIdleServiceType) { #ifdef MOZ_ENABLE_DBUS case IDLE_SERVICE_MUTTER: - mIdleService = new UserIdleServiceMutter(); + mIdleService = MakeUnique(this); break; #endif #ifdef MOZ_X11 case IDLE_SERVICE_XSCREENSAVER: - mIdleService = new UserIdleServiceX11(); + mIdleService = MakeUnique(this); break; #endif default: return; } - if (!mIdleService->ProbeImplementation(this)) { + if (!mIdleService->ProbeImplementation()) { RejectAndTryNextServiceCallback(); } } void nsUserIdleServiceGTK::AcceptServiceCallback() { @@ -289,19 +290,19 @@ mIdleServiceType)); // Delete recent non-working service MOZ_ASSERT(mIdleService, "Nothing to reject?"); mIdleService = nullptr; + mIdleServiceInitialized = false; mIdleServiceType++; if (mIdleServiceType < IDLE_SERVICE_NONE) { MOZ_LOG(sIdleLog, LogLevel::Info, ("nsUserIdleServiceGTK try next idle service\n")); ProbeService(); } else { MOZ_LOG(sIdleLog, LogLevel::Info, ("nsUserIdleServiceGTK failed\n")); - mIdleServiceInitialized = false; } } bool nsUserIdleServiceGTK::PollIdleTime(uint32_t* aIdleTime) { if (!mIdleServiceInitialized) {