diff --git a/Telegram/SourceFiles/platform/linux/specific_linux.cpp b/Telegram/SourceFiles/platform/linux/specific_linux.cpp index a0bd14b9e5..e9426dce3c 100644 --- a/Telegram/SourceFiles/platform/linux/specific_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/specific_linux.cpp @@ -306,7 +306,7 @@ std::optional XCBLastUserInputTime() { } #ifndef TDESKTOP_DISABLE_DBUS_INTEGRATION -std::optional DBusLastUserInputTime() { +std::optional FreedesktopDBusLastUserInputTime() { static auto NotSupported = false; if (NotSupported) { @@ -341,7 +341,51 @@ std::optional DBusLastUserInputTime() { NotSupported = true; } - LOG(("Unable to get last user input time: %1: %2") + LOG(("App Error: Unable to get last user input time " + "from org.freedesktop.ScreenSaver: %1: %2") + .arg(reply.error().name()) + .arg(reply.error().message())); + } + + return std::nullopt; +} + +std::optional MutterDBusLastUserInputTime() { + static auto NotSupported = false; + + if (NotSupported) { + return std::nullopt; + } + + static const auto Message = QDBusMessage::createMethodCall( + qsl("org.gnome.Mutter.IdleMonitor"), + qsl("/org/gnome/Mutter/IdleMonitor/Core"), + qsl("org.gnome.Mutter.IdleMonitor"), + qsl("GetIdletime")); + + const QDBusReply reply = QDBusConnection::sessionBus().call( + Message); + + static const auto NotSupportedErrors = { + QDBusError::ServiceUnknown, + }; + + static const auto NotSupportedErrorsToLog = { + QDBusError::Disconnected, + QDBusError::AccessDenied, + }; + + if (reply.isValid()) { + return (crl::now() - static_cast(reply.value())); + } else if (ranges::contains(NotSupportedErrors, reply.error().type())) { + NotSupported = true; + } else { + if (ranges::contains(NotSupportedErrorsToLog, reply.error().type())) { + NotSupported = true; + } + + LOG(("App Error: Unable to get last user input time " + "from org.gnome.Mutter.IdleMonitor: %1: %2") .arg(reply.error().name()) .arg(reply.error().message())); } @@ -663,7 +707,15 @@ std::optional LastUserInputTime() { } #ifndef TDESKTOP_DISABLE_DBUS_INTEGRATION - return DBusLastUserInputTime(); + const auto freedesktopResult = FreedesktopDBusLastUserInputTime(); + if (freedesktopResult.has_value()) { + return freedesktopResult; + } + + const auto mutterResult = MutterDBusLastUserInputTime(); + if (mutterResult.has_value()) { + return mutterResult; + } #endif // !TDESKTOP_DISABLE_DBUS_INTEGRATION return std::nullopt;