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