From 5b62d97288b03750d5570f9c59ec7c3f88f762b4 Mon Sep 17 00:00:00 2001 From: Ilya Fedin <fedin-ilja2010@ya.ru> Date: Wed, 6 Mar 2024 20:12:31 +0400 Subject: [PATCH] Update submodules --- .gitmodules | 3 + Telegram/CMakeLists.txt | 3 - .../linux/notifications_manager_linux.cpp | 72 ++++--- .../linux/org.freedesktop.portal.Inhibit.xml | 186 ------------------ Telegram/ThirdParty/xdg-desktop-portal | 1 + Telegram/lib_base | 2 +- Telegram/lib_webview | 2 +- cmake | 2 +- 8 files changed, 41 insertions(+), 230 deletions(-) delete mode 100644 Telegram/SourceFiles/platform/linux/org.freedesktop.portal.Inhibit.xml create mode 160000 Telegram/ThirdParty/xdg-desktop-portal diff --git a/.gitmodules b/.gitmodules index 101674a90..bf3c35f42 100644 --- a/.gitmodules +++ b/.gitmodules @@ -100,3 +100,6 @@ [submodule "Telegram/ThirdParty/libprisma"] path = Telegram/ThirdParty/libprisma url = https://github.com/desktop-app/libprisma.git +[submodule "Telegram/ThirdParty/xdg-desktop-portal"] + path = Telegram/ThirdParty/xdg-desktop-portal + url = https://github.com/flatpak/xdg-desktop-portal.git diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index e1766f5e6..64409ea88 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1651,9 +1651,6 @@ else() desktop-app::external_glibmm ) - include(${cmake_helpers_loc}/external/glib/generate_dbus.cmake) - generate_dbus(Telegram org.freedesktop.portal. XdpInhibit ${src_loc}/platform/linux/org.freedesktop.portal.Inhibit.xml) - if (NOT DESKTOP_APP_DISABLE_X11_INTEGRATION) target_link_libraries(Telegram PRIVATE diff --git a/Telegram/SourceFiles/platform/linux/notifications_manager_linux.cpp b/Telegram/SourceFiles/platform/linux/notifications_manager_linux.cpp index c94400ff1..0473edf72 100644 --- a/Telegram/SourceFiles/platform/linux/notifications_manager_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/notifications_manager_linux.cpp @@ -78,24 +78,24 @@ std::unique_ptr<base::Platform::DBus::ServiceWatcher> CreateServiceWatcher() { Gio::DBus::BusType::SESSION); const auto activatable = [&] { - try { - return ranges::contains( - base::Platform::DBus::ListActivatableNames(connection), - kService, - &Glib::ustring::raw); - } catch (...) { + const auto names = base::Platform::DBus::ListActivatableNames( + connection->gobj()); + + if (!names) { // avoid service restart loop in sandboxed environments return true; } + + return ranges::contains(*names, kService); }(); return std::make_unique<base::Platform::DBus::ServiceWatcher>( - connection, + connection->gobj(), kService, [=]( - const Glib::ustring &service, - const Glib::ustring &oldOwner, - const Glib::ustring &newOwner) { + const std::string &service, + const std::string &oldOwner, + const std::string &newOwner) { Core::Sandbox::Instance().customEnterFromEventLoop([&] { if (activatable && newOwner.empty()) { Core::App().notifications().clearAll(); @@ -115,27 +115,28 @@ void StartServiceAsync(Fn<void()> callback) { const auto connection = Gio::DBus::Connection::get_sync( Gio::DBus::BusType::SESSION); - base::Platform::DBus::StartServiceByNameAsync( - connection, + namespace DBus = base::Platform::DBus; + DBus::StartServiceByNameAsync( + connection->gobj(), kService, - [=](Fn<base::Platform::DBus::StartReply()> result) { + [=](Fn<DBus::Result<DBus::StartReply>()> result) { Core::Sandbox::Instance().customEnterFromEventLoop([&] { Noexcept([&] { - try { - result(); // get the error if any - } catch (const Glib::Error &e) { + // get the error if any + if (const auto ret = result(); !ret) { static const auto NotSupportedErrors = { "org.freedesktop.DBus.Error.ServiceUnknown", }; - const auto errorName = - Gio::DBus::ErrorUtils::get_remote_error(e) - .raw(); - - if (!ranges::contains( + if (ranges::none_of( NotSupportedErrors, - errorName)) { - throw; + [&](const auto &error) { + return strstr( + ret.error()->what(), + error); + })) { + throw std::runtime_error( + ret.error()->what()); } } }); @@ -156,25 +157,20 @@ bool GetServiceRegistered() { const auto connection = Gio::DBus::Connection::get_sync( Gio::DBus::BusType::SESSION); - const auto hasOwner = [&] { - try { - return base::Platform::DBus::NameHasOwner( - connection, - kService); - } catch (...) { - return false; - } - }(); + const auto hasOwner = base::Platform::DBus::NameHasOwner( + connection->gobj(), + kService + ).value_or(false); static const auto activatable = [&] { - try { - return ranges::contains( - base::Platform::DBus::ListActivatableNames(connection), - kService, - &Glib::ustring::raw); - } catch (...) { + const auto names = base::Platform::DBus::ListActivatableNames( + connection->gobj()); + + if (!names) { return false; } + + return ranges::contains(*names, kService); }(); return hasOwner || activatable; diff --git a/Telegram/SourceFiles/platform/linux/org.freedesktop.portal.Inhibit.xml b/Telegram/SourceFiles/platform/linux/org.freedesktop.portal.Inhibit.xml deleted file mode 100644 index e91bd22d3..000000000 --- a/Telegram/SourceFiles/platform/linux/org.freedesktop.portal.Inhibit.xml +++ /dev/null @@ -1,186 +0,0 @@ -<?xml version="1.0"?> -<!-- - Copyright (C) 2016 Red Hat, Inc. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library. If not, see <http://www.gnu.org/licenses/>. - - Author: Matthias Clasen <mclasen@redhat.com> ---> - -<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd"> - <!-- - org.freedesktop.portal.Inhibit: - @short_description: Portal for inhibiting session transitions - - This simple interface lets sandboxed applications inhibit the user - session from ending, suspending, idling or getting switched away. - - This documentation describes version 3 of this interface. - --> - <interface name="org.freedesktop.portal.Inhibit"> - <!-- - Inhibit: - @window: Identifier for the window - @flags: Flags identifying what is inhibited - @options: Vardict with optional further information - @handle: Object path for the #org.freedesktop.portal.Request object representing this call - - Inhibits a session status changes. To remove the inhibition, - call org.freedesktop.portal.Request.Close() on the returned - handle. - - The flags determine what changes are inhibited: - <simplelist> - <member>1: Logout</member> - <member>2: User Switch</member> - <member>4: Suspend</member> - <member>8: Idle</member> - </simplelist> - - Supported keys in the @options vardict include: - <variablelist> - <varlistentry> - <term>handle_token s</term> - <listitem><para> - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - </para></listitem> - </varlistentry> - <varlistentry> - <term>reason s</term> - <listitem><para>User-visible reason for the inhibition.</para></listitem> - </varlistentry> - </variablelist> - --> - <method name="Inhibit"> - <arg type="s" name="window" direction="in"/> - <arg type="u" name="flags" direction="in"/> - <arg type="a{sv}" name="options" direction="in"/> - <arg type="o" name="handle" direction="out"/> - </method> - - <!-- - CreateMonitor: - @window: the parent window - @options: Vardict with optional further information - @handle: Object path for the #org.freedesktop.portal.Request object representing this call - - Creates a monitoring session. While this session is - active, the caller will receive StateChanged signals - with updates on the session state. - - A successfully created session can at any time be closed using - org.freedesktop.portal.Session::Close, or may at any time be closed - by the portal implementation, which will be signalled via - #org.freedesktop.portal.Session::Closed. - - Supported keys in the @options vardict include: - <variablelist> - <varlistentry> - <term>handle_token s</term> - <listitem><para> - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - </para></listitem> - </varlistentry> - <varlistentry> - <term>session_handle_token s</term> - <listitem><para> - A string that will be used as the last element of the session handle. Must be a valid - object path element. See the #org.freedesktop.portal.Session documentation for - more information about the session handle. - </para></listitem> - </varlistentry> - </variablelist> - - The following results get returned via the #org.freedesktop.portal.Request::Response signal: - <variablelist> - <varlistentry> - <term>session_handle o</term> - <listitem><para> - The session handle. An object path for the - #org.freedesktop.portal.Session object representing the created - session. - </para></listitem> - </varlistentry> - </variablelist> - - This method was added in version 2 of this interface. - --> - <method name="CreateMonitor"> - <arg type="s" name="window" direction="in"/> - <arg type="a{sv}" name="options" direction="in"/> - <arg type="o" name="handle" direction="out"/> - </method> - - <!-- - StateChanged: - @session_handle: Object path for the #org.freedesktop.portal.Session object - @state: Vardict with information about the session state - - The StateChanged signal is sent to active monitoring sessions when - the session state changes. - - When the session state changes to 'Query End', clients with active monitoring - sessions are expected to respond by calling - org.freedesktop.portal.Inhibit.QueryEndResponse() within a second - of receiving the StateChanged signal. They may call org.freedesktop.portal.Inhibit.Inhibit() - first to inhibit logout, to prevent the session from proceeding to the Ending state. - - The following information may get returned in the @state vardict: - <variablelist> - <varlistentry> - <term>screensaver-active b</term> - <listitem><para> - Whether the screensaver is active. - </para></listitem> - </varlistentry> - <varlistentry> - <term>session-state u</term> - <listitem><para> - The state of the session. This member is new in version 3. - </para> - <simplelist> - <member>1: Running</member> - <member>2: Query End</member> - <member>3: Ending</member> - </simplelist> - </listitem> - </varlistentry> - </variablelist> - --> - <signal name="StateChanged"> - <arg type="o" name="session_handle" direction="out"/> - <arg type="a{sv}" name="state" direction="out"/> - </signal> - - <!-- - QueryEndResponse: - @session_handle: Object path for the #org.freedesktop.portal.Session object - - Acknowledges that the caller received the #org.freedesktop.portal.Inhibit::StateChanged - signal. This method should be called within one second or receiving a StateChanged - signal with the 'Query End' state. - - Since version 3. - --> - <method name="QueryEndResponse"> - <arg type="o" name="session_handle" direction="in"/> - </method> - - <property name="version" type="u" access="read"/> - </interface> -</node> diff --git a/Telegram/ThirdParty/xdg-desktop-portal b/Telegram/ThirdParty/xdg-desktop-portal new file mode 160000 index 000000000..fa8d41a2f --- /dev/null +++ b/Telegram/ThirdParty/xdg-desktop-portal @@ -0,0 +1 @@ +Subproject commit fa8d41a2f9a5d30a1e41568b6fb53b046dce14dc diff --git a/Telegram/lib_base b/Telegram/lib_base index 888a19075..cee9211bd 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit 888a19075b569eda3d18a977543320823b984ae0 +Subproject commit cee9211bd58e054f24ad5e7f122037f71a44b237 diff --git a/Telegram/lib_webview b/Telegram/lib_webview index 4fce8b197..27af88195 160000 --- a/Telegram/lib_webview +++ b/Telegram/lib_webview @@ -1 +1 @@ -Subproject commit 4fce8b1971721da739619acf36da0fe79d614a23 +Subproject commit 27af88195bca687e9d2a52b4fcd4e83ef5476be9 diff --git a/cmake b/cmake index a46279fcf..b699c232d 160000 --- a/cmake +++ b/cmake @@ -1 +1 @@ -Subproject commit a46279fcfe69ebcc806bb31679ccece5f7c07508 +Subproject commit b699c232d57d50070a7b1b861809e206624f48d4