From 2dfe85832717ccfd9268a5b767f03eb4e8665b8f Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 1 Jul 2023 10:30:48 +0400 Subject: [PATCH] Support D-Bus activation --- Telegram/CMakeLists.txt | 1 + .../platform/linux/specific_linux.cpp | 50 +++++++++++++++++++ lib/xdg/org.telegram.desktop.desktop | 1 + lib/xdg/org.telegram.desktop.service | 3 ++ 4 files changed, 55 insertions(+) create mode 100644 lib/xdg/org.telegram.desktop.service diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index d61a678dd..991101b61 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1730,5 +1730,6 @@ if (LINUX AND DESKTOP_APP_USE_PACKAGED) install(FILES "Resources/art/icon256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "telegram.png") install(FILES "Resources/art/icon512.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" RENAME "telegram.png") install(FILES "../lib/xdg/org.telegram.desktop.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + install(FILES "../lib/xdg/org.telegram.desktop.service" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/dbus-1/services") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/org.telegram.desktop.metainfo.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo") endif() diff --git a/Telegram/SourceFiles/platform/linux/specific_linux.cpp b/Telegram/SourceFiles/platform/linux/specific_linux.cpp index ba1b42d27..f0f673c7f 100644 --- a/Telegram/SourceFiles/platform/linux/specific_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/specific_linux.cpp @@ -322,6 +322,55 @@ bool GenerateDesktopFile( return true; } +bool GenerateServiceFile(bool silent = false) { + const auto executable = ExecutablePathForShortcuts(); + if (executable.isEmpty()) { + return false; + } + + const auto targetPath = QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation) + u"/dbus-1/services/"_q; + + const auto targetFile = targetPath + + QGuiApplication::desktopFileName().chopped(8) + + u".service"_q; + + DEBUG_LOG(("App Info: placing .service file to %1").arg(targetPath)); + if (!QDir(targetPath).exists()) QDir().mkpath(targetPath); + + const auto target = Glib::KeyFile::create(); + constexpr auto group = "D-BUS Service"; + + target->set_string( + group, + "Name", + QGuiApplication::desktopFileName().chopped(8).toStdString()); + + target->set_string( + group, + "Exec", + KShell::joinArgs({ executable }).replace( + '\\', + qstr("\\\\")).toStdString()); + + try { + target->save_to_file(targetFile.toStdString()); + } catch (const std::exception &e) { + if (!silent) { + LOG(("App Error: %1").arg(QString::fromStdString(e.what()))); + } + return false; + } + + QProcess::execute(u"systemctl"_q, { + u"--user"_q, + u"reload"_q, + u"dbus"_q, + }); + + return true; +} + void InstallLauncher() { static const auto DisabledByEnv = !qEnvironmentVariableIsEmpty( "DESKTOPINTEGRATION"); @@ -335,6 +384,7 @@ void InstallLauncher() { QStandardPaths::ApplicationsLocation) + '/'; GenerateDesktopFile(applicationsPath); + GenerateServiceFile(); const auto icons = QStandardPaths::writableLocation( QStandardPaths::GenericDataLocation) + u"/icons/"_q; diff --git a/lib/xdg/org.telegram.desktop.desktop b/lib/xdg/org.telegram.desktop.desktop index 38fbe2c63..d4bd3b8b4 100644 --- a/lib/xdg/org.telegram.desktop.desktop +++ b/lib/xdg/org.telegram.desktop.desktop @@ -11,6 +11,7 @@ Categories=Chat;Network;InstantMessaging;Qt; MimeType=x-scheme-handler/tg; Keywords=tg;chat;im;messaging;messenger;sms;tdesktop; Actions=quit; +DBusActivatable=true SingleMainWindow=true X-GNOME-UsesNotifications=true X-GNOME-SingleWindow=true diff --git a/lib/xdg/org.telegram.desktop.service b/lib/xdg/org.telegram.desktop.service new file mode 100644 index 000000000..0f9caabbc --- /dev/null +++ b/lib/xdg/org.telegram.desktop.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.telegram.desktop +Exec=telegram-desktop