diff --git a/Source/Editor/GUI/Dialogs/ColorPickerDialog.cs b/Source/Editor/GUI/Dialogs/ColorPickerDialog.cs
index 2d6a3882b..d89f353f1 100644
--- a/Source/Editor/GUI/Dialogs/ColorPickerDialog.cs
+++ b/Source/Editor/GUI/Dialogs/ColorPickerDialog.cs
@@ -326,8 +326,11 @@ namespace FlaxEditor.GUI.Dialogs
// Update eye dropper tool
if (_activeEyedropper)
{
+ // Try reading the color under the cursor in realtime if supported by the platform
Float2 mousePosition = Platform.MousePosition;
- SelectedColor = ScreenUtilities.GetColorAt(mousePosition);
+ Color color = ScreenUtilities.GetColorAt(mousePosition);
+ if (color != Color.Transparent)
+ SelectedColor = color;
}
}
diff --git a/Source/Engine/Platform/Base/ScreenUtilitiesBase.h b/Source/Engine/Platform/Base/ScreenUtilitiesBase.h
index 635e4441e..18ac8c61f 100644
--- a/Source/Engine/Platform/Base/ScreenUtilitiesBase.h
+++ b/Source/Engine/Platform/Base/ScreenUtilitiesBase.h
@@ -22,7 +22,7 @@ public:
/// Gets the pixel color at the specified coordinates.
///
/// Screen-space coordinate to read.
- /// Pixel color at the specified coordinates.
+ /// Pixel color at the specified coordinates, or transparent color when color couldn't be picked up.
API_FUNCTION() static Color32 GetColorAt(const Float2& pos)
{
return Color32::Transparent;
diff --git a/Source/Engine/Platform/Linux/LinuxScreenUtilities.cpp b/Source/Engine/Platform/Linux/LinuxScreenUtilities.cpp
index b4012ca8a..f6339e72e 100644
--- a/Source/Engine/Platform/Linux/LinuxScreenUtilities.cpp
+++ b/Source/Engine/Platform/Linux/LinuxScreenUtilities.cpp
@@ -7,12 +7,25 @@
#include "Engine/Core/Math/Vector2.h"
#include "Engine/Core/Delegate.h"
#include "Engine/Core/Log.h"
+#include "Engine/Core/Math/Vector4.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Platform/Linux/LinuxPlatform.h"
#include "Engine/Platform/Linux/IncludeX11.h"
+#include
+#include
+
Delegate ScreenUtilitiesBase::PickColorDone;
+namespace PortalImpl
+{
+ XdpPortal* Portal = nullptr;
+ int64 MainLoopReady = 0;
+
+ gpointer GLibMainLoop(gpointer data);
+ void PickColorCallback(GObject* source, GAsyncResult* result, gpointer data);
+}
+
Color32 LinuxScreenUtilities::GetColorAt(const Float2& pos)
{
X11::Display* display = (X11::Display*)Platform::GetXDisplay();
@@ -38,16 +51,11 @@ Color32 LinuxScreenUtilities::GetColorAt(const Float2& pos)
}
else
{
- // XWayland doesn't support XGetImage...
- // TODO: Fallback to Wayland implementation here?
- return Color32::Black;
+ // XWayland doesn't support XGetImage
}
}
- else
- {
- // TODO: Wayland
- ASSERT(false);
- }
+
+ return Color32::Transparent;
}
void OnScreenUtilsXEventCallback(void* eventPtr)
@@ -83,12 +91,68 @@ void LinuxScreenUtilities::PickColor()
X11::XFreeCursor(display, cursor);
LinuxPlatform::xEventReceived.Bind(OnScreenUtilsXEventCallback);
+ return;
}
- else
+
+ if (PortalImpl::MainLoopReady == 0)
{
- // TODO: Wayland
- ASSERT(false);
+ // Initialize portal
+ GError* error = nullptr;
+ PortalImpl::Portal = xdp_portal_initable_new(&error);
+ if (error != nullptr)
+ {
+ PortalImpl::MainLoopReady = 2;
+ LOG(Error, "Failed to initialize XDP Portal");
+ return;
+ }
+
+ // Run the GLib main loop in other thread in order to process asynchronous callbacks
+ g_thread_new(nullptr, PortalImpl::GLibMainLoop, nullptr);
+ while (Platform::AtomicRead(&PortalImpl::MainLoopReady) != 1)
+ Platform::Sleep(1);
+ }
+
+ if (PortalImpl::Portal != nullptr)
+ {
+ // Enter color picking mode, the callback receives the final color
+ xdp_portal_pick_color(PortalImpl::Portal, nullptr, nullptr, PortalImpl::PickColorCallback, nullptr);
}
}
+gpointer PortalImpl::GLibMainLoop(gpointer data)
+{
+ GMainContext* mainContext = g_main_context_get_thread_default();
+ GMainLoop* mainLoop = g_main_loop_new(mainContext, false);
+
+ Platform::AtomicStore(&PortalImpl::MainLoopReady, 1);
+
+ g_main_loop_run(mainLoop);
+ g_main_loop_unref(mainLoop);
+ return nullptr;
+}
+
+void PortalImpl::PickColorCallback(GObject* source, GAsyncResult* result, gpointer data)
+{
+ GError* error = nullptr;
+ GVariant* variant = xdp_portal_pick_color_finish(PortalImpl::Portal, result, &error);
+ if (error)
+ {
+ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ LOG(Info, "XDP Portal pick color cancelled");
+ else
+ LOG(Error, "XDP Portal pick color failed: {}", String(error->message));
+ return;
+ }
+
+ // The color is stored in a triple double variant, extract the values
+ Double4 colorDouble;
+ g_variant_get(variant, "(ddd)", &colorDouble.X, &colorDouble.Y, &colorDouble.Z);
+ g_variant_unref(variant);
+ colorDouble.W = 1.0f;
+ Vector4 colorVector = colorDouble;
+ Color32 color = Color32(colorVector);
+
+ ScreenUtilities::PickColorDone(color);
+}
+
#endif
diff --git a/Source/ThirdParty/SDL/SDL.Build.cs b/Source/ThirdParty/SDL/SDL.Build.cs
index c5599a987..6e917b2c1 100644
--- a/Source/ThirdParty/SDL/SDL.Build.cs
+++ b/Source/ThirdParty/SDL/SDL.Build.cs
@@ -42,6 +42,9 @@ public class SDL : DepsModule
break;
case TargetPlatform.Linux:
+ options.OutputFiles.Add(Path.Combine(depsRoot, "libSDL3.a"));
+ options.PublicDependencies.Add("libportal");
+ break;
case TargetPlatform.Mac:
options.OutputFiles.Add(Path.Combine(depsRoot, "libSDL3.a"));
break;
diff --git a/Source/ThirdParty/libportal/LICENSE.txt b/Source/ThirdParty/libportal/LICENSE.txt
new file mode 100644
index 000000000..0a041280b
--- /dev/null
+++ b/Source/ThirdParty/libportal/LICENSE.txt
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/Source/ThirdParty/libportal/include/libportal/account.h b/Source/ThirdParty/libportal/include/libportal/account.h
new file mode 100644
index 000000000..58bc8dcf6
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/account.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+typedef enum {
+ XDP_USER_INFORMATION_FLAG_NONE = 0
+} XdpUserInformationFlags;
+
+XDP_PUBLIC
+void xdp_portal_get_user_information (XdpPortal *portal,
+ XdpParent *parent,
+ const char *reason,
+ XdpUserInformationFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+GVariant * xdp_portal_get_user_information_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/background.h b/Source/ThirdParty/libportal/include/libportal/background.h
new file mode 100644
index 000000000..5ce17340b
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/background.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpBackgroundFlags:
+ * @XDP_BACKGROUND_FLAG_NONE: No options
+ * @XDP_BACKGROUND_FLAG_AUTOSTART: Request autostart as well
+ * @XDP_BACKGROUND_FLAG_ACTIVATABLE: Whether the application is D-Bus-activatable
+ *
+ * Options to use when requesting background.
+ */
+typedef enum {
+ XDP_BACKGROUND_FLAG_NONE = 0,
+ XDP_BACKGROUND_FLAG_AUTOSTART = 1 << 0,
+ XDP_BACKGROUND_FLAG_ACTIVATABLE = 1 << 1
+} XdpBackgroundFlags;
+
+XDP_PUBLIC
+void xdp_portal_request_background (XdpPortal *portal,
+ XdpParent *parent,
+ char *reason,
+ GPtrArray *commandline,
+ XdpBackgroundFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+XDP_PUBLIC
+gboolean xdp_portal_request_background_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_set_background_status (XdpPortal *portal,
+ const char *status_message,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_set_background_status_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/camera.h b/Source/ThirdParty/libportal/include/libportal/camera.h
new file mode 100644
index 000000000..f0e44be5b
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/camera.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+XDP_PUBLIC
+gboolean xdp_portal_is_camera_present (XdpPortal *portal);
+
+typedef enum {
+ XDP_CAMERA_FLAG_NONE = 0
+} XdpCameraFlags;
+
+XDP_PUBLIC
+void xdp_portal_access_camera (XdpPortal *portal,
+ XdpParent *parent,
+ XdpCameraFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_access_camera_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+int xdp_portal_open_pipewire_remote_for_camera (XdpPortal *portal);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/dynamic-launcher.h b/Source/ThirdParty/libportal/include/libportal/dynamic-launcher.h
new file mode 100644
index 000000000..ac81daad3
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/dynamic-launcher.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2022, Matthew Leeds
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpLauncherType:
+ * @XDP_LAUNCHER_APPLICATION: a launcher for a regular application
+ * @XDP_LAUNCHER_WEBAPP: a launcher for a web app
+ *
+ * The type of a launcher.
+ */
+typedef enum {
+ XDP_LAUNCHER_APPLICATION = 1 << 0,
+ XDP_LAUNCHER_WEBAPP = 1 << 1
+} XdpLauncherType;
+
+XDP_PUBLIC
+void xdp_portal_dynamic_launcher_prepare_install (XdpPortal *portal,
+ XdpParent *parent,
+ const char *name,
+ GVariant *icon_v,
+ XdpLauncherType launcher_type,
+ const char *target,
+ gboolean editable_name,
+ gboolean editable_icon,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+GVariant *xdp_portal_dynamic_launcher_prepare_install_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+char *xdp_portal_dynamic_launcher_request_install_token (XdpPortal *portal,
+ const char *name,
+ GVariant *icon_v,
+ GError **error);
+
+XDP_PUBLIC
+gboolean xdp_portal_dynamic_launcher_install (XdpPortal *portal,
+ const char *token,
+ const char *desktop_file_id,
+ const char *desktop_entry,
+ GError **error);
+
+XDP_PUBLIC
+gboolean xdp_portal_dynamic_launcher_uninstall (XdpPortal *portal,
+ const char *desktop_file_id,
+ GError **error);
+
+XDP_PUBLIC
+char *xdp_portal_dynamic_launcher_get_desktop_entry (XdpPortal *portal,
+ const char *desktop_file_id,
+ GError **error);
+
+XDP_PUBLIC
+GVariant *xdp_portal_dynamic_launcher_get_icon (XdpPortal *portal,
+ const char *desktop_file_id,
+ char **out_icon_format,
+ guint *out_icon_size,
+ GError **error);
+
+XDP_PUBLIC
+gboolean xdp_portal_dynamic_launcher_launch (XdpPortal *portal,
+ const char *desktop_file_id,
+ const char *activation_token,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/email.h b/Source/ThirdParty/libportal/include/libportal/email.h
new file mode 100644
index 000000000..c6a539d4c
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/email.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+typedef enum {
+ XDP_EMAIL_FLAG_NONE = 0
+} XdpEmailFlags;
+
+XDP_PUBLIC
+void xdp_portal_compose_email (XdpPortal *portal,
+ XdpParent *parent,
+ const char *const *addresses,
+ const char *const *cc,
+ const char *const *bcc,
+ const char *subject,
+ const char *body,
+ const char *const *attachments,
+ XdpEmailFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_compose_email_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/filechooser.h b/Source/ThirdParty/libportal/include/libportal/filechooser.h
new file mode 100644
index 000000000..99a26a8cd
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/filechooser.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpOpenFileFlags:
+ * @XDP_OPEN_FILE_FLAG_NONE: No options
+ * @XDP_OPEN_FILE_FLAG_MULTIPLE: Allow selecting multiple files
+ *
+ * Options for opening files.
+ */
+typedef enum {
+ XDP_OPEN_FILE_FLAG_NONE = 0,
+ XDP_OPEN_FILE_FLAG_MULTIPLE = 1 << 0,
+} XdpOpenFileFlags;
+
+XDP_PUBLIC
+void xdp_portal_open_file (XdpPortal *portal,
+ XdpParent *parent,
+ const char *title,
+ GVariant *filters,
+ GVariant *current_filter,
+ GVariant *choices,
+ XdpOpenFileFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+GVariant *xdp_portal_open_file_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+typedef enum {
+ XDP_SAVE_FILE_FLAG_NONE = 0
+} XdpSaveFileFlags;
+
+XDP_PUBLIC
+void xdp_portal_save_file (XdpPortal *portal,
+ XdpParent *parent,
+ const char *title,
+ const char *current_name,
+ const char *current_folder,
+ const char *current_file,
+ GVariant *filters,
+ GVariant *current_filter,
+ GVariant *choices,
+ XdpSaveFileFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+GVariant *xdp_portal_save_file_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_save_files (XdpPortal *portal,
+ XdpParent *parent,
+ const char *title,
+ const char *current_name,
+ const char *current_folder,
+ GVariant *files,
+ GVariant *choices,
+ XdpSaveFileFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+GVariant *xdp_portal_save_files_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/glib-backports.h b/Source/ThirdParty/libportal/include/libportal/glib-backports.h
new file mode 100644
index 000000000..9b6b661c1
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/glib-backports.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2024 GNOME Foundation Inc.
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+#include
+
+#if !GLIB_CHECK_VERSION(2, 76, 0)
+
+static inline gboolean
+g_clear_fd (int *fd_ptr,
+ GError **error)
+{
+ int fd = *fd_ptr;
+
+ *fd_ptr = -1;
+
+ if (fd < 0)
+ return TRUE;
+
+ /* Suppress "Not available before" warning */
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ return g_close (fd, error);
+ G_GNUC_END_IGNORE_DEPRECATIONS
+}
+
+static inline void
+_g_clear_fd_ignore_error (int *fd_ptr)
+{
+ /* Don't overwrite thread-local errno if closing the fd fails */
+ int errsv = errno;
+
+ /* Suppress "Not available before" warning */
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+
+ if (!g_clear_fd (fd_ptr, NULL))
+ {
+ /* Do nothing: we ignore all errors, except for EBADF which
+ * is a programming error, checked for by g_close(). */
+ }
+
+ G_GNUC_END_IGNORE_DEPRECATIONS
+
+ errno = errsv;
+}
+
+#define g_autofd __attribute__((cleanup(_g_clear_fd_ignore_error)))
+
+#endif
+
+#if !GLIB_CHECK_VERSION(2, 84, 0)
+static inline unsigned int
+backport_steal_handle_id (unsigned int *handle_pointer)
+{
+ unsigned int handle;
+
+ handle = *handle_pointer;
+ *handle_pointer = 0;
+
+ return handle;
+}
+#define g_steal_handle_id(hp) backport_steal_handle_id (hp)
+#endif
diff --git a/Source/ThirdParty/libportal/include/libportal/inhibit.h b/Source/ThirdParty/libportal/include/libportal/inhibit.h
new file mode 100644
index 000000000..1ae7e4d94
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/inhibit.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpInhibitFlags:
+ * @XDP_INHIBIT_FLAG_LOGOUT: Inhibit logout
+ * @XDP_INHIBIT_FLAG_USER_SWITCH: Inhibit user switching
+ * @XDP_INHIBIT_FLAG_SUSPEND: Inhibit suspend
+ * @XDP_INHIBIT_FLAG_IDLE: Inhibit the session going idle
+ *
+ * Flags that determine what session status changes are inhibited.
+ */
+typedef enum {
+ XDP_INHIBIT_FLAG_LOGOUT = 1 << 0,
+ XDP_INHIBIT_FLAG_USER_SWITCH = 1 << 1,
+ XDP_INHIBIT_FLAG_SUSPEND = 1 << 2,
+ XDP_INHIBIT_FLAG_IDLE = 1 << 3
+} XdpInhibitFlags;
+
+XDP_PUBLIC
+void xdp_portal_session_inhibit (XdpPortal *portal,
+ XdpParent *parent,
+ const char *reason,
+ XdpInhibitFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+int xdp_portal_session_inhibit_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_session_uninhibit (XdpPortal *portal,
+ int id);
+
+/**
+ * XdpLoginSessionState:
+ * @XDP_LOGIN_SESSION_RUNNING: the session is running
+ * @XDP_LOGIN_SESSION_QUERY_END: the session is in the query end phase,
+ * during which applications can save their state or inhibit the
+ * session from ending
+ * @XDP_LOGIN_SESSION_ENDING: the session is about to end
+ *
+ * The values of this enum are returned in the [signal@Portal::session-state-changed] signal
+ * to indicate the current state of the user session.
+ */
+typedef enum {
+ XDP_LOGIN_SESSION_RUNNING = 1,
+ XDP_LOGIN_SESSION_QUERY_END = 2,
+ XDP_LOGIN_SESSION_ENDING = 3,
+} XdpLoginSessionState;
+
+typedef enum {
+ XDP_SESSION_MONITOR_FLAG_NONE = 0
+} XdpSessionMonitorFlags;
+
+XDP_PUBLIC
+void xdp_portal_session_monitor_start (XdpPortal *portal,
+ XdpParent *parent,
+ XdpSessionMonitorFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_session_monitor_start_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_session_monitor_stop (XdpPortal *portal);
+
+XDP_PUBLIC
+void xdp_portal_session_monitor_query_end_response (XdpPortal *portal);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/inputcapture-pointerbarrier.h b/Source/ThirdParty/libportal/include/libportal/inputcapture-pointerbarrier.h
new file mode 100644
index 000000000..52db9bbf0
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/inputcapture-pointerbarrier.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022, Red Hat, Inc.
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+#define XDP_TYPE_INPUT_CAPTURE_POINTER_BARRIER (xdp_input_capture_pointer_barrier_get_type ())
+
+XDP_PUBLIC
+G_DECLARE_FINAL_TYPE (XdpInputCapturePointerBarrier, xdp_input_capture_pointer_barrier, XDP, INPUT_CAPTURE_POINTER_BARRIER, GObject)
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/inputcapture-private.h b/Source/ThirdParty/libportal/include/libportal/inputcapture-private.h
new file mode 100644
index 000000000..ff52aae42
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/inputcapture-private.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2022, Red Hat, Inc.
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include "inputcapture-pointerbarrier.h"
+#include "inputcapture-zone.h"
+
+guint
+_xdp_input_capture_pointer_barrier_get_id (XdpInputCapturePointerBarrier *barrier);
+
+void
+_xdp_input_capture_pointer_barrier_set_is_active (XdpInputCapturePointerBarrier *barrier, gboolean active);
+
+void
+_xdp_input_capture_zone_invalidate_and_free (XdpInputCaptureZone *zone);
diff --git a/Source/ThirdParty/libportal/include/libportal/inputcapture-zone.h b/Source/ThirdParty/libportal/include/libportal/inputcapture-zone.h
new file mode 100644
index 000000000..88bfb5137
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/inputcapture-zone.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022, Red Hat, Inc.
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+#define XDP_TYPE_INPUT_CAPTURE_ZONE (xdp_input_capture_zone_get_type ())
+
+XDP_PUBLIC
+G_DECLARE_FINAL_TYPE (XdpInputCaptureZone, xdp_input_capture_zone, XDP, INPUT_CAPTURE_ZONE, GObject)
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/inputcapture.h b/Source/ThirdParty/libportal/include/libportal/inputcapture.h
new file mode 100644
index 000000000..fff94687f
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/inputcapture.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+
+G_BEGIN_DECLS
+
+#define XDP_TYPE_INPUT_CAPTURE_SESSION (xdp_input_capture_session_get_type ())
+
+XDP_PUBLIC
+G_DECLARE_FINAL_TYPE (XdpInputCaptureSession, xdp_input_capture_session, XDP, INPUT_CAPTURE_SESSION, GObject)
+
+/**
+ * XdpInputCapability:
+ * @XDP_INPUT_CAPABILITY_NONE: no device
+ * @XDP_INPUT_CAPABILITY_KEYBOARD: capture the keyboard
+ * @XDP_INPUT_CAPABILITY_POINTER: capture pointer events
+ * @XDP_INPUT_CAPABILITY_TOUCHSCREEN: capture touchscreen events
+ *
+ * Flags to specify what input device capabilities should be captured
+ */
+typedef enum {
+ XDP_INPUT_CAPABILITY_NONE = 0,
+ XDP_INPUT_CAPABILITY_KEYBOARD = 1 << 0,
+ XDP_INPUT_CAPABILITY_POINTER = 1 << 1,
+ XDP_INPUT_CAPABILITY_TOUCHSCREEN = 1 << 2
+} XdpInputCapability;
+
+
+XDP_PUBLIC
+void xdp_portal_create_input_capture_session (XdpPortal *portal,
+ XdpParent *parent,
+ XdpInputCapability capabilities,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+XdpInputCaptureSession * xdp_portal_create_input_capture_session_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+XdpSession *xdp_input_capture_session_get_session (XdpInputCaptureSession *session);
+
+XDP_PUBLIC
+GList * xdp_input_capture_session_get_zones (XdpInputCaptureSession *session);
+
+XDP_PUBLIC
+void xdp_input_capture_session_set_pointer_barriers (XdpInputCaptureSession *session,
+ GList *barriers,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+GList * xdp_input_capture_session_set_pointer_barriers_finish (XdpInputCaptureSession *session,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_input_capture_session_enable (XdpInputCaptureSession *session);
+
+XDP_PUBLIC
+void xdp_input_capture_session_disable (XdpInputCaptureSession *session);
+
+XDP_PUBLIC
+void xdp_input_capture_session_release_at (XdpInputCaptureSession *session,
+ guint activation_id,
+ gdouble cursor_x_position,
+ gdouble cursor_y_position);
+
+XDP_PUBLIC
+void xdp_input_capture_session_release (XdpInputCaptureSession *session,
+ guint activation_id);
+
+XDP_PUBLIC
+int xdp_input_capture_session_connect_to_eis (XdpInputCaptureSession *session,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/location.h b/Source/ThirdParty/libportal/include/libportal/location.h
new file mode 100644
index 000000000..2eaba47a6
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/location.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpLocationAccuracy:
+ * @XDP_LOCATION_ACCURACY_NONE: No particular accuracy
+ * @XDP_LOCATION_ACCURACY_COUNTRY: Country-level accuracy
+ * @XDP_LOCATION_ACCURACY_CITY: City-level accuracy
+ * @XDP_LOCATION_ACCURACY_NEIGHBORHOOD: Neighborhood-level accuracy
+ * @XDP_LOCATION_ACCURACY_STREET: Street-level accuracy
+ * @XDP_LOCATION_ACCURACY_EXACT: Maximum accuracy
+ *
+ * The values of this enum indicate the desired level
+ * of accuracy for location information.
+ */
+typedef enum {
+ XDP_LOCATION_ACCURACY_NONE,
+ XDP_LOCATION_ACCURACY_COUNTRY,
+ XDP_LOCATION_ACCURACY_CITY,
+ XDP_LOCATION_ACCURACY_NEIGHBORHOOD,
+ XDP_LOCATION_ACCURACY_STREET,
+ XDP_LOCATION_ACCURACY_EXACT
+} XdpLocationAccuracy;
+
+typedef enum {
+ XDP_LOCATION_MONITOR_FLAG_NONE = 0
+} XdpLocationMonitorFlags;
+
+XDP_PUBLIC
+void xdp_portal_location_monitor_start (XdpPortal *portal,
+ XdpParent *parent,
+ guint distance_threshold,
+ guint time_threshold,
+ XdpLocationAccuracy accuracy,
+ XdpLocationMonitorFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_location_monitor_start_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_location_monitor_stop (XdpPortal *portal);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/notification.h b/Source/ThirdParty/libportal/include/libportal/notification.h
new file mode 100644
index 000000000..cbee0ef2d
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/notification.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+typedef enum {
+ XDP_NOTIFICATION_FLAG_NONE = 0
+} XdpNotificationFlags;
+
+XDP_PUBLIC
+void xdp_portal_add_notification (XdpPortal *portal,
+ const char *id,
+ GVariant *notification,
+ XdpNotificationFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_add_notification_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_remove_notification (XdpPortal *portal,
+ const char *id);
+
+XDP_PUBLIC
+GVariant *xdp_portal_get_supported_notification_options (XdpPortal *portal,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/openuri.h b/Source/ThirdParty/libportal/include/libportal/openuri.h
new file mode 100644
index 000000000..87cb1cf6b
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/openuri.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpOpenUriFlags:
+ * @XDP_OPEN_URI_FLAG_NONE: No options
+ * @XDP_OPEN_URI_FLAG_ASK: Use an application chooser for the given uri
+ * @XDP_OPEN_URI_FLAG_WRITABLE: Allow writing to file (if uri points to a local file that is exported in the document portal and app is sandboxed itself)
+ *
+ * Options for opening uris.
+ */
+typedef enum {
+ XDP_OPEN_URI_FLAG_NONE = 0,
+ XDP_OPEN_URI_FLAG_ASK = 1 << 0,
+ XDP_OPEN_URI_FLAG_WRITABLE = 1 << 1
+} XdpOpenUriFlags;
+
+XDP_PUBLIC
+void xdp_portal_open_uri (XdpPortal *portal,
+ XdpParent *parent,
+ const char *uri,
+ XdpOpenUriFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_open_uri_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_open_directory (XdpPortal *portal,
+ XdpParent *parent,
+ const char *uri,
+ XdpOpenUriFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_open_directory_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/parent-private.h b/Source/ThirdParty/libportal/include/libportal/parent-private.h
new file mode 100644
index 000000000..7d1385d2a
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/parent-private.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021, Georges Basile Stavracas Neto
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include "parent.h"
+
+G_BEGIN_DECLS
+
+typedef void (* XdpParentExported) (XdpParent *parent,
+ const char *handle,
+ gpointer data);
+typedef gboolean (* XdpParentExport) (XdpParent *parent,
+ XdpParentExported callback,
+ gpointer data);
+typedef void (* XdpParentUnexport) (XdpParent *parent);
+
+struct _XdpParent {
+ /*< private >*/
+ XdpParentExport parent_export;
+ XdpParentUnexport parent_unexport;
+ GObject *object;
+ XdpParentExported callback;
+ char *exported_handle;
+ gpointer data;
+};
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/parent.h b/Source/ThirdParty/libportal/include/libportal/parent.h
new file mode 100644
index 000000000..be05f4d15
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/parent.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2021, Georges Basile Stavracas Neto
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+#define XDP_TYPE_PARENT (xdp_parent_get_type ())
+
+XDP_PUBLIC
+GType xdp_parent_get_type (void) G_GNUC_CONST;
+
+XDP_PUBLIC
+XdpParent *xdp_parent_copy (XdpParent *source);
+
+XDP_PUBLIC
+void xdp_parent_free (XdpParent *parent);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (XdpParent, xdp_parent_free)
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/portal-gtk3.h b/Source/ThirdParty/libportal/include/libportal/portal-gtk3.h
new file mode 100644
index 000000000..81a02fe6a
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/portal-gtk3.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+#include
+
+#if GTK_CHECK_VERSION(3,96,0) || GTK_CHECK_VERSION(4,0,0)
+#error "To use libportal with GTK4, include portal-gtk4.h"
+#endif
+
+G_BEGIN_DECLS
+
+XDP_PUBLIC
+XdpParent *xdp_parent_new_gtk (GtkWindow *window);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/portal-gtk4.h b/Source/ThirdParty/libportal/include/libportal/portal-gtk4.h
new file mode 100644
index 000000000..9a965d096
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/portal-gtk4.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+#include
+
+#if !(GTK_CHECK_VERSION(3,96,0) || GTK_CHECK_VERSION(4,0,0))
+#error "To use libportal with GTK3, include portal-gtk3.h"
+#endif
+
+G_BEGIN_DECLS
+
+XDP_PUBLIC
+XdpParent *xdp_parent_new_gtk (GtkWindow *window);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/portal-helpers.h b/Source/ThirdParty/libportal/include/libportal/portal-helpers.h
new file mode 100644
index 000000000..ac754e699
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/portal-helpers.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ * Copyright (C) 2024 GNOME Foundation, Inc.
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ *
+ * Authors:
+ * Matthias Clasen
+ * Hubert Figuière
+ */
+
+#pragma once
+
+#include
+
+#include
+
+G_BEGIN_DECLS
+
+#ifndef XDP_PUBLIC
+#define XDP_PUBLIC extern
+#endif
+
+#define XDP_TYPE_PORTAL (xdp_portal_get_type ())
+
+XDP_PUBLIC
+G_DECLARE_FINAL_TYPE (XdpPortal, xdp_portal, XDP, PORTAL, GObject)
+
+XDP_PUBLIC
+XdpPortal *xdp_portal_new (void);
+
+XDP_PUBLIC
+XdpPortal *xdp_portal_initable_new (GError **error);
+
+XDP_PUBLIC
+gboolean xdp_portal_running_under_flatpak (void);
+
+XDP_PUBLIC
+gboolean xdp_portal_running_under_snap (GError **error);
+
+XDP_PUBLIC
+gboolean xdp_portal_running_under_sandbox (void);
+
+XDP_PUBLIC
+XdpSettings *xdp_portal_get_settings (XdpPortal *portal);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/portal-private.h b/Source/ThirdParty/libportal/include/libportal/portal-private.h
new file mode 100644
index 000000000..d68bd756d
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/portal-private.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include "glib-backports.h"
+#include "parent-private.h"
+#include "portal-helpers.h"
+
+struct _XdpPortal {
+ GObject parent_instance;
+
+ GError *init_error;
+ GDBusConnection *bus;
+ char *sender;
+
+ /* inhibit */
+ int next_inhibit_id;
+ GHashTable *inhibit_handles;
+ char *session_monitor_handle;
+ guint state_changed_signal;
+
+ /* spawn */
+ guint spawn_exited_signal;
+
+ /* updates */
+ char *update_monitor_handle;
+ guint update_available_signal;
+ guint update_progress_signal;
+
+ /* location */
+ char *location_monitor_handle;
+ guint location_updated_signal;
+
+ /* notification */
+ guint action_invoked_signal;
+ guint notification_interface_version;
+ GVariant *supported_notification_options;
+
+ /* screencast */
+ guint screencast_interface_version;
+ guint remote_desktop_interface_version;
+
+ /* background */
+ guint background_interface_version;
+};
+
+const char * portal_get_bus_name (void);
+
+#define PORTAL_BUS_NAME (portal_get_bus_name ())
+#define PORTAL_OBJECT_PATH "/org/freedesktop/portal/desktop"
+#define REQUEST_PATH_PREFIX "/org/freedesktop/portal/desktop/request/"
+#define SESSION_PATH_PREFIX "/org/freedesktop/portal/desktop/session/"
+#define REQUEST_INTERFACE "org.freedesktop.portal.Request"
+#define SESSION_INTERFACE "org.freedesktop.portal.Session"
+#define SETTINGS_INTERFACE "org.freedesktop.portal.Settings"
+
+#define FLATPAK_PORTAL_BUS_NAME "org.freedesktop.portal.Flatpak"
+#define FLATPAK_PORTAL_OBJECT_PATH "/org/freedesktop/portal/Flatpak"
+#define FLATPAK_PORTAL_INTERFACE "org.freedesktop.portal.Flatpak"
diff --git a/Source/ThirdParty/libportal/include/libportal/portal-qt5.h b/Source/ThirdParty/libportal/include/libportal/portal-qt5.h
new file mode 100644
index 000000000..062b72619
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/portal-qt5.h
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2020-2022, Jan Grulich
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+XDP_PUBLIC
+XdpParent *xdp_parent_new_qt (QWindow *window);
+
+namespace XdpQt {
+
+// Returns a global instance of XdpPortal object and takes care
+// of its deletion
+XDP_PUBLIC
+XdpPortal *globalPortalObject();
+
+// Account portal helpers
+struct GetUserInformationResult {
+ QString id;
+ QString name;
+ QString image;
+};
+
+XDP_PUBLIC
+GetUserInformationResult getUserInformationResultFromGVariant(GVariant *variant);
+
+// FileChooser portal helpers
+enum FileChooserFilterRuleType{
+ Pattern = 0,
+ Mimetype = 1
+};
+
+struct FileChooserFilterRule {
+ FileChooserFilterRuleType type;
+ QString rule;
+};
+
+struct FileChooserFilter {
+ QString label;
+ QList rules;
+};
+
+struct FileChooserChoice {
+ QString id;
+ QString label;
+ QMap options;
+ QString selected;
+};
+
+XDP_PUBLIC
+GVariant *filechooserFilesToGVariant(const QStringList &files);
+
+XDP_PUBLIC
+GVariant *filechooserFilterToGVariant(const FileChooserFilter &filter);
+
+XDP_PUBLIC
+GVariant *filechooserFiltersToGVariant(const QList &filters);
+
+XDP_PUBLIC
+GVariant *filechooserChoicesToGVariant(const QList &choices);
+
+struct FileChooserResult {
+ QMap choices;
+ QStringList uris;
+};
+
+XDP_PUBLIC
+FileChooserResult filechooserResultFromGVariant(GVariant *variant);
+
+// Notification portal helpers
+struct NotificationButton {
+ QString label;
+ QString action;
+ QVariant target;
+};
+
+struct Notification {
+ QString title;
+ QString body;
+ QString icon;
+ QPixmap pixmap;
+ QString priority;
+ QString defaultAction;
+ QVariant defaultTarget;
+ QList buttons;
+};
+
+XDP_PUBLIC
+GVariant *notificationToGVariant(const Notification ¬ification);
+
+XDP_PUBLIC
+QVariant GVariantToQVariant(GVariant *variant);
+
+} // namespace XdpQt
diff --git a/Source/ThirdParty/libportal/include/libportal/portal-qt6.h b/Source/ThirdParty/libportal/include/libportal/portal-qt6.h
new file mode 100644
index 000000000..1658778ee
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/portal-qt6.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2020-2022, Jan Grulich
+ * Copyright (C) 2023, Neal Gompa
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+XDP_PUBLIC
+XdpParent *xdp_parent_new_qt (QWindow *window);
+
+namespace XdpQt {
+
+// Returns a global instance of XdpPortal object and takes care
+// of its deletion
+XDP_PUBLIC
+XdpPortal *globalPortalObject();
+
+// Account portal helpers
+struct GetUserInformationResult {
+ QString id;
+ QString name;
+ QString image;
+};
+
+XDP_PUBLIC
+GetUserInformationResult getUserInformationResultFromGVariant(GVariant *variant);
+
+// FileChooser portal helpers
+enum FileChooserFilterRuleType{
+ Pattern = 0,
+ Mimetype = 1
+};
+
+struct FileChooserFilterRule {
+ FileChooserFilterRuleType type;
+ QString rule;
+};
+
+struct FileChooserFilter {
+ QString label;
+ QList rules;
+};
+
+struct FileChooserChoice {
+ QString id;
+ QString label;
+ QMap options;
+ QString selected;
+};
+
+XDP_PUBLIC
+GVariant *filechooserFilesToGVariant(const QStringList &files);
+
+XDP_PUBLIC
+GVariant *filechooserFilterToGVariant(const FileChooserFilter &filter);
+
+XDP_PUBLIC
+GVariant *filechooserFiltersToGVariant(const QList &filters);
+
+XDP_PUBLIC
+GVariant *filechooserChoicesToGVariant(const QList &choices);
+
+struct FileChooserResult {
+ QMap choices;
+ QStringList uris;
+};
+
+XDP_PUBLIC
+FileChooserResult filechooserResultFromGVariant(GVariant *variant);
+
+// Notification portal helpers
+struct NotificationButton {
+ QString label;
+ QString action;
+ QVariant target;
+};
+
+struct Notification {
+ QString title;
+ QString body;
+ QString icon;
+ QPixmap pixmap;
+ QString priority;
+ QString defaultAction;
+ QVariant defaultTarget;
+ QList buttons;
+};
+
+XDP_PUBLIC
+GVariant *notificationToGVariant(const Notification ¬ification);
+
+XDP_PUBLIC
+QVariant GVariantToQVariant(GVariant *variant);
+
+} // namespace XdpQt
diff --git a/Source/ThirdParty/libportal/include/libportal/portal.h b/Source/ThirdParty/libportal/include/libportal/portal.h
new file mode 100644
index 000000000..3618b81e9
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/portal.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
diff --git a/Source/ThirdParty/libportal/include/libportal/print.h b/Source/ThirdParty/libportal/include/libportal/print.h
new file mode 100644
index 000000000..3c41c6251
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/print.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+typedef enum {
+ XDP_PRINT_FLAG_NONE = 0
+} XdpPrintFlags;
+
+XDP_PUBLIC
+void xdp_portal_prepare_print (XdpPortal *portal,
+ XdpParent *parent,
+ const char *title,
+ GVariant *settings,
+ GVariant *page_setup,
+ XdpPrintFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+GVariant *xdp_portal_prepare_print_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_print_file (XdpPortal *portal,
+ XdpParent *parent,
+ const char *title,
+ guint token,
+ const char *file,
+ XdpPrintFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_print_file_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/remote.h b/Source/ThirdParty/libportal/include/libportal/remote.h
new file mode 100644
index 000000000..e5e75cb19
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/remote.h
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpSessionState:
+ * @XDP_SESSION_INITIAL: the session has not been started.
+ * @XDP_SESSION_ACTIVE: the session is active.
+ * @XDP_SESSION_CLOSED: the session is no longer active.
+ *
+ * The state of a session.
+ */
+typedef enum {
+ XDP_SESSION_INITIAL,
+ XDP_SESSION_ACTIVE,
+ XDP_SESSION_CLOSED
+} XdpSessionState;
+
+/**
+ * XdpOutputType:
+ * @XDP_OUTPUT_NONE: do not select any output
+ * @XDP_OUTPUT_MONITOR: allow selecting monitors
+ * @XDP_OUTPUT_WINDOW: allow selecting individual application windows
+ * @XDP_OUTPUT_VIRTUAL: allow creating new virtual displays
+ *
+ * Flags to specify what kind of sources to offer for a screencast session.
+ */
+typedef enum {
+ XDP_OUTPUT_NONE = 0,
+ XDP_OUTPUT_MONITOR = 1 << 0,
+ XDP_OUTPUT_WINDOW = 1 << 1,
+ XDP_OUTPUT_VIRTUAL = 1 << 2,
+} XdpOutputType;
+
+/**
+ * XdpDeviceType:
+ * @XDP_DEVICE_NONE: no device
+ * @XDP_DEVICE_KEYBOARD: control the keyboard.
+ * @XDP_DEVICE_POINTER: control the pointer.
+ * @XDP_DEVICE_TOUCHSCREEN: control the touchscreen.
+ *
+ * Flags to specify what input devices to control for a remote desktop session.
+ */
+typedef enum {
+ XDP_DEVICE_NONE = 0,
+ XDP_DEVICE_KEYBOARD = 1 << 0,
+ XDP_DEVICE_POINTER = 1 << 1,
+ XDP_DEVICE_TOUCHSCREEN = 1 << 2
+} XdpDeviceType;
+
+/**
+ * XdpScreencastFlags:
+ * @XDP_SCREENCAST_FLAG_NONE: No options
+ * @XDP_SCREENCAST_FLAG_MULTIPLE: allow opening multiple streams
+ *
+ * Options for starting screen casts.
+ */
+typedef enum {
+ XDP_SCREENCAST_FLAG_NONE = 0,
+ XDP_SCREENCAST_FLAG_MULTIPLE = 1 << 0
+} XdpScreencastFlags;
+
+/**
+ * XdpCursorMode:
+ * @XDP_CURSOR_MODE_HIDDEN: no cursor
+ * @XDP_CURSOR_MODE_EMBEDDED: cursor is embedded on the stream
+ * @XDP_CURSOR_MODE_METADATA: cursor is sent as metadata of the stream
+ *
+ * Options for how the cursor is handled.
+ */
+typedef enum {
+ XDP_CURSOR_MODE_HIDDEN = 1 << 0,
+ XDP_CURSOR_MODE_EMBEDDED = 1 << 1,
+ XDP_CURSOR_MODE_METADATA = 1 << 2,
+} XdpCursorMode;
+
+/**
+ * XdpPersistMode:
+ * @XDP_PERSIST_MODE_NONE: do not persist
+ * @XDP_PERSIST_MODE_TRANSIENT: persist as long as the application is alive
+ * @XDP_PERSIST_MODE_PERSISTENT: persist until the user revokes this permission
+ *
+ * Options for how the screencast session should persist.
+ */
+typedef enum {
+ XDP_PERSIST_MODE_NONE,
+ XDP_PERSIST_MODE_TRANSIENT,
+ XDP_PERSIST_MODE_PERSISTENT,
+} XdpPersistMode;
+
+XDP_PUBLIC
+void xdp_portal_create_screencast_session (XdpPortal *portal,
+ XdpOutputType outputs,
+ XdpScreencastFlags flags,
+ XdpCursorMode cursor_mode,
+ XdpPersistMode persist_mode,
+ const char *restore_token,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+XdpSession *xdp_portal_create_screencast_session_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+/**
+ * XdpRemoteDesktopFlags:
+ * @XDP_REMOTE_DESKTOP_FLAG_NONE: No options
+ * @XDP_REMOTE_DESKTOP_FLAG_MULTIPLE: allow opening multiple streams
+ *
+ * Options for starting remote desktop sessions.
+ */
+typedef enum {
+ XDP_REMOTE_DESKTOP_FLAG_NONE = 0,
+ XDP_REMOTE_DESKTOP_FLAG_MULTIPLE = 1 << 0
+} XdpRemoteDesktopFlags;
+
+XDP_PUBLIC
+void xdp_portal_create_remote_desktop_session (XdpPortal *portal,
+ XdpDeviceType devices,
+ XdpOutputType outputs,
+ XdpRemoteDesktopFlags flags,
+ XdpCursorMode cursor_mode,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+void xdp_portal_create_remote_desktop_session_full (XdpPortal *portal,
+ XdpDeviceType devices,
+ XdpOutputType outputs,
+ XdpRemoteDesktopFlags flags,
+ XdpCursorMode cursor_mode,
+ XdpPersistMode persist_mode,
+ const char *restore_token,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+
+XDP_PUBLIC
+XdpSession *xdp_portal_create_remote_desktop_session_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+XdpSessionState xdp_session_get_session_state (XdpSession *session);
+
+XDP_PUBLIC
+void xdp_session_start (XdpSession *session,
+ XdpParent *parent,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_session_start_finish (XdpSession *session,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+int xdp_session_open_pipewire_remote (XdpSession *session);
+
+XDP_PUBLIC
+XdpDeviceType xdp_session_get_devices (XdpSession *session);
+
+XDP_PUBLIC
+GVariant * xdp_session_get_streams (XdpSession *session);
+
+XDP_PUBLIC
+int xdp_session_connect_to_eis (XdpSession *session,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_session_pointer_motion (XdpSession *session,
+ double dx,
+ double dy);
+
+XDP_PUBLIC
+void xdp_session_pointer_position (XdpSession *session,
+ guint stream,
+ double x,
+ double y);
+/**
+ * XdpButtonState:
+ * @XDP_BUTTON_RELEASED: the button is down
+ * @XDP_BUTTON_PRESSED: the button is up
+ *
+ * The XdpButtonState enumeration is used to describe
+ * the state of buttons.
+ */
+typedef enum {
+ XDP_BUTTON_RELEASED = 0,
+ XDP_BUTTON_PRESSED = 1
+} XdpButtonState;
+
+XDP_PUBLIC
+void xdp_session_pointer_button (XdpSession *session,
+ int button,
+ XdpButtonState state);
+
+XDP_PUBLIC
+void xdp_session_pointer_axis (XdpSession *session,
+ gboolean finish,
+ double dx,
+ double dy);
+
+/**
+ * XdpDiscreteAxis:
+ * @XDP_AXIS_HORIZONTAL_SCROLL: the horizontal scroll axis
+ * @XDP_AXIS_VERTICAL_SCROLL: the horizontal scroll axis
+ *
+ * The `XdpDiscreteAxis` enumeration is used to describe
+ * the discrete scroll axes.
+ */
+typedef enum {
+ XDP_AXIS_HORIZONTAL_SCROLL = 0,
+ XDP_AXIS_VERTICAL_SCROLL = 1
+} XdpDiscreteAxis;
+
+XDP_PUBLIC
+void xdp_session_pointer_axis_discrete (XdpSession *session,
+ XdpDiscreteAxis axis,
+ int steps);
+
+/**
+ * XdpKeyState:
+ * @XDP_KEY_RELEASED: the key is down
+ * @XDP_KEY_PRESSED: the key is up
+ *
+ * The `XdpKeyState` enumeration is used to describe
+ * the state of keys.
+ */
+typedef enum {
+ XDP_KEY_RELEASED = 0,
+ XDP_KEY_PRESSED = 1
+} XdpKeyState;
+
+XDP_PUBLIC
+void xdp_session_keyboard_key (XdpSession *session,
+ gboolean keysym,
+ int key,
+ XdpKeyState state);
+
+XDP_PUBLIC
+void xdp_session_touch_down (XdpSession *session,
+ guint stream,
+ guint slot,
+ double x,
+ double y);
+
+XDP_PUBLIC
+void xdp_session_touch_position (XdpSession *session,
+ guint stream,
+ guint slot,
+ double x,
+ double y);
+
+XDP_PUBLIC
+void xdp_session_touch_up (XdpSession *session,
+ guint slot);
+
+
+XDP_PUBLIC
+XdpPersistMode xdp_session_get_persist_mode (XdpSession *session);
+
+XDP_PUBLIC
+char *xdp_session_get_restore_token (XdpSession *session);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/screenshot.h b/Source/ThirdParty/libportal/include/libportal/screenshot.h
new file mode 100644
index 000000000..77ce0bca8
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/screenshot.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+typedef enum {
+ XDP_SCREENSHOT_FLAG_NONE = 0,
+ XDP_SCREENSHOT_FLAG_INTERACTIVE = 1 << 0
+} XdpScreenshotFlags;
+
+XDP_PUBLIC
+void xdp_portal_take_screenshot (XdpPortal *portal,
+ XdpParent *parent,
+ XdpScreenshotFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+char * xdp_portal_take_screenshot_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_pick_color (XdpPortal *portal,
+ XdpParent *parent,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+GVariant * xdp_portal_pick_color_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/session-private.h b/Source/ThirdParty/libportal/include/libportal/session-private.h
new file mode 100644
index 000000000..c45252043
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/session-private.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+#include
+
+struct _XdpSession {
+ GObject parent_instance;
+
+ /* Generic Session implementation */
+ XdpPortal *portal;
+ char *id;
+ gboolean is_closed;
+ XdpSessionType type;
+ guint signal_id;
+
+ /* RemoteDesktop/ScreenCast */
+ XdpSessionState state;
+ XdpDeviceType devices;
+ GVariant *streams;
+
+ XdpPersistMode persist_mode;
+ char *restore_token;
+
+ gboolean uses_eis;
+
+ /* InputCapture */
+ XdpInputCaptureSession *input_capture_session; /* weak ref */
+};
+
+XdpSession * _xdp_session_new (XdpPortal *portal,
+ const char *id,
+ XdpSessionType type);
+
+void _xdp_session_set_session_state (XdpSession *session,
+ XdpSessionState state);
+
+void _xdp_session_set_devices (XdpSession *session,
+ XdpDeviceType devices);
+
+void _xdp_session_set_streams (XdpSession *session,
+ GVariant *streams);
+
+void _xdp_session_close (XdpSession *session);
diff --git a/Source/ThirdParty/libportal/include/libportal/session.h b/Source/ThirdParty/libportal/include/libportal/session.h
new file mode 100644
index 000000000..e9f021455
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/session.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+#define XDP_TYPE_SESSION (xdp_session_get_type ())
+
+XDP_PUBLIC
+G_DECLARE_FINAL_TYPE (XdpSession, xdp_session, XDP, SESSION, GObject)
+
+/**
+ * XdpSessionType:
+ * @XDP_SESSION_SCREENCAST: a screencast session.
+ * @XDP_SESSION_REMOTE_DESKTOP: a remote desktop session.
+ * @XDP_SESSION_INPUT_CAPTURE: an input capture session.
+ *
+ * The type of a session.
+ */
+typedef enum {
+ XDP_SESSION_SCREENCAST,
+ XDP_SESSION_REMOTE_DESKTOP,
+ XDP_SESSION_INPUT_CAPTURE,
+} XdpSessionType;
+
+XDP_PUBLIC
+void xdp_session_close (XdpSession *session);
+
+XDP_PUBLIC
+XdpSessionType xdp_session_get_session_type (XdpSession *session);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/settings-private.h b/Source/ThirdParty/libportal/include/libportal/settings-private.h
new file mode 100644
index 000000000..1c5ee3cb1
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/settings-private.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 GNOME Foundation, Inc.
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ *
+ * Authors:
+ * Hubert Figuière
+ */
+
+#pragma once
+
+#include
+
+#include "settings.h"
+
+G_BEGIN_DECLS
+
+XdpSettings * _xdp_settings_new (XdpPortal *portal);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/settings.h b/Source/ThirdParty/libportal/include/libportal/settings.h
new file mode 100644
index 000000000..c6b7f0687
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/settings.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 GNOME Foundation, Inc.
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ *
+ * Authors:
+ * Hubert Figuière
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+#define XDP_TYPE_SETTINGS (xdp_settings_get_type ())
+
+XDP_PUBLIC
+G_DECLARE_FINAL_TYPE (XdpSettings, xdp_settings, XDP, SETTINGS, GObject)
+
+XDP_PUBLIC
+GVariant *xdp_settings_read_value (XdpSettings *settings, const char *namespace, const char *key, GCancellable *cancellable, GError **error);
+
+XDP_PUBLIC
+void
+xdp_settings_read (XdpSettings *settings, const char *namespace,
+ const gchar *key,
+ GCancellable *cancellable, GError **error,
+ const gchar *format, ...);
+
+XDP_PUBLIC
+guint xdp_settings_read_uint (XdpSettings *settings, const char *namespace, const char *key, GCancellable *cancellable, GError **error);
+
+XDP_PUBLIC
+char *xdp_settings_read_string (XdpSettings *settings, const char *namespace, const char *key, GCancellable *cancellable, GError **error);
+
+XDP_PUBLIC
+GVariant *xdp_settings_read_all_values (XdpSettings *settings, const char *const *namespaces, GCancellable *cancellable, GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/spawn.h b/Source/ThirdParty/libportal/include/libportal/spawn.h
new file mode 100644
index 000000000..69c49c733
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/spawn.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpSpawnFlags:
+ * @XDP_SPAWN_FLAG_NONE: No flags
+ * @XDP_SPAWN_FLAG_CLEARENV: Clear the environment
+ * @XDP_SPAWN_FLAG_LATEST: Spawn the latest version of the app
+ * @XDP_SPAWN_FLAG_SANDBOX: Spawn in a sandbox (equivalent to the --sandbox option of flatpak run)
+ * @XDP_SPAWN_FLAG_NO_NETWORK: Spawn without network (equivalent to the --unshare=network option of flatpak run)
+ * @XDP_SPAWN_FLAG_WATCH: Kill the sandbox when the caller disappears from the session bus
+ *
+ * Flags influencing the spawn operation and how the
+ * new sandbox is created.
+ */
+typedef enum {
+ XDP_SPAWN_FLAG_NONE = 0,
+ XDP_SPAWN_FLAG_CLEARENV = 1 << 0,
+ XDP_SPAWN_FLAG_LATEST = 1 << 1,
+ XDP_SPAWN_FLAG_SANDBOX = 1 << 2,
+ XDP_SPAWN_FLAG_NO_NETWORK = 1 << 3,
+ XDP_SPAWN_FLAG_WATCH = 1 << 4,
+} XdpSpawnFlags;
+
+XDP_PUBLIC
+void xdp_portal_spawn (XdpPortal *portal,
+ const char *cwd,
+ const char * const *argv,
+ int *fds,
+ int *map_to,
+ int n_fds,
+ const char * const *env,
+ XdpSpawnFlags flags,
+ const char * const *sandbox_expose,
+ const char * const *sandbox_expose_ro,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+pid_t xdp_portal_spawn_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_spawn_signal (XdpPortal *portal,
+ pid_t pid,
+ int signal,
+ gboolean to_process_group);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/trash.h b/Source/ThirdParty/libportal/include/libportal/trash.h
new file mode 100644
index 000000000..ec85dc90b
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/trash.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+XDP_PUBLIC
+void xdp_portal_trash_file (XdpPortal *portal,
+ const char *path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_trash_file_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/types.h b/Source/ThirdParty/libportal/include/libportal/types.h
new file mode 100644
index 000000000..648101bf7
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/types.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2021, Georges Basile Stavracas Neto
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+typedef struct _XdpParent XdpParent;
+typedef struct _XdpPortal XdpPortal;
+typedef struct _XdpSettings XdpSettings;
diff --git a/Source/ThirdParty/libportal/include/libportal/updates.h b/Source/ThirdParty/libportal/include/libportal/updates.h
new file mode 100644
index 000000000..670beba75
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/updates.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2018, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpUpdateStatus:
+ * @XDP_UPDATE_STATUS_RUNNING: Installation in progress
+ * @XDP_UPDATE_STATUS_EMPTY: Nothing to install
+ * @XDP_UPDATE_STATUS_DONE: Installation finished successfully
+ * @XDP_UPDATE_STATUS_FAILED: Installation failed
+ *
+ * The values of this enum are returned in the
+ * [signal@Portal::update-progress] signal to indicate
+ * the current progress of an installation.
+ */
+typedef enum {
+ XDP_UPDATE_STATUS_RUNNING,
+ XDP_UPDATE_STATUS_EMPTY,
+ XDP_UPDATE_STATUS_DONE,
+ XDP_UPDATE_STATUS_FAILED
+} XdpUpdateStatus;
+
+typedef enum
+{
+ XDP_UPDATE_MONITOR_FLAG_NONE = 0,
+} XdpUpdateMonitorFlags;
+
+XDP_PUBLIC
+void xdp_portal_update_monitor_start (XdpPortal *portal,
+ XdpUpdateMonitorFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_update_monitor_start_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+XDP_PUBLIC
+void xdp_portal_update_monitor_stop (XdpPortal *portal);
+
+typedef enum
+{
+ XDP_UPDATE_INSTALL_FLAG_NONE = 0,
+} XdpUpdateInstallFlags;
+
+XDP_PUBLIC
+void xdp_portal_update_install (XdpPortal *portal,
+ XdpParent *parent,
+ XdpUpdateInstallFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_update_install_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/libportal/wallpaper.h b/Source/ThirdParty/libportal/include/libportal/wallpaper.h
new file mode 100644
index 000000000..bbe8a470b
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/libportal/wallpaper.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019, Matthias Clasen
+ *
+ * This file 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, version 3.0 of the
+ * License.
+ *
+ * This file 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 program. If not, see .
+ *
+ * SPDX-License-Identifier: LGPL-3.0-only
+ */
+
+#pragma once
+
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * XdpWallpaperFlags:
+ * @XDP_WALLPAPER_FLAG_NONE: No flags
+ * @XDP_WALLPAPER_FLAG_BACKGROUND: Set wallpaper on the desktop background
+ * @XDP_WALLPAPER_FLAG_LOCKSCREEN: Set wallpaper on the lockscreen
+ * @XDP_WALLPAPER_FLAG_PREVIEW: Request the preview to be shown
+ *
+ * The values of this enumeration determine where the wallpaper is being set.
+ */
+typedef enum {
+ XDP_WALLPAPER_FLAG_NONE = 0,
+ XDP_WALLPAPER_FLAG_BACKGROUND = 1 << 0,
+ XDP_WALLPAPER_FLAG_LOCKSCREEN = 1 << 1,
+ XDP_WALLPAPER_FLAG_PREVIEW = 1 << 2
+} XdpWallpaperFlags;
+
+#define XDP_WALLPAPER_TARGET_BOTH (XDP_WALLPAPER_TARGET_BACKGROUND|XDP_WALLPAPER_TARGET_LOCKSCREEN)
+
+XDP_PUBLIC
+void xdp_portal_set_wallpaper (XdpPortal *portal,
+ XdpParent *parent,
+ const char *uri,
+ XdpWallpaperFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer data);
+
+XDP_PUBLIC
+gboolean xdp_portal_set_wallpaper_finish (XdpPortal *portal,
+ GAsyncResult *result,
+ GError **error);
+
+G_END_DECLS
diff --git a/Source/ThirdParty/libportal/include/portal-enums.h b/Source/ThirdParty/libportal/include/portal-enums.h
new file mode 100644
index 000000000..4c659e8c6
--- /dev/null
+++ b/Source/ThirdParty/libportal/include/portal-enums.h
@@ -0,0 +1,148 @@
+
+/* This file is generated by glib-mkenums, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */
+
+#pragma once
+
+#include
+#include
+
+G_BEGIN_DECLS
+
+/* enumerations from "account.h" */
+XDP_PUBLIC
+GType xdp_user_information_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_USER_INFORMATION_FLAGS (xdp_user_information_flags_get_type ())
+
+/* enumerations from "background.h" */
+XDP_PUBLIC
+GType xdp_background_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_BACKGROUND_FLAGS (xdp_background_flags_get_type ())
+
+/* enumerations from "camera.h" */
+XDP_PUBLIC
+GType xdp_camera_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_CAMERA_FLAGS (xdp_camera_flags_get_type ())
+
+/* enumerations from "dynamic-launcher.h" */
+XDP_PUBLIC
+GType xdp_launcher_type_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_LAUNCHER_TYPE (xdp_launcher_type_get_type ())
+
+/* enumerations from "email.h" */
+XDP_PUBLIC
+GType xdp_email_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_EMAIL_FLAGS (xdp_email_flags_get_type ())
+
+/* enumerations from "filechooser.h" */
+XDP_PUBLIC
+GType xdp_open_file_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_OPEN_FILE_FLAGS (xdp_open_file_flags_get_type ())
+XDP_PUBLIC
+GType xdp_save_file_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_SAVE_FILE_FLAGS (xdp_save_file_flags_get_type ())
+
+/* enumerations from "inhibit.h" */
+XDP_PUBLIC
+GType xdp_inhibit_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_INHIBIT_FLAGS (xdp_inhibit_flags_get_type ())
+XDP_PUBLIC
+GType xdp_login_session_state_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_LOGIN_SESSION_STATE (xdp_login_session_state_get_type ())
+XDP_PUBLIC
+GType xdp_session_monitor_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_SESSION_MONITOR_FLAGS (xdp_session_monitor_flags_get_type ())
+
+/* enumerations from "inputcapture.h" */
+XDP_PUBLIC
+GType xdp_input_capability_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_INPUT_CAPABILITY (xdp_input_capability_get_type ())
+
+/* enumerations from "location.h" */
+XDP_PUBLIC
+GType xdp_location_accuracy_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_LOCATION_ACCURACY (xdp_location_accuracy_get_type ())
+XDP_PUBLIC
+GType xdp_location_monitor_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_LOCATION_MONITOR_FLAGS (xdp_location_monitor_flags_get_type ())
+
+/* enumerations from "notification.h" */
+XDP_PUBLIC
+GType xdp_notification_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_NOTIFICATION_FLAGS (xdp_notification_flags_get_type ())
+
+/* enumerations from "openuri.h" */
+XDP_PUBLIC
+GType xdp_open_uri_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_OPEN_URI_FLAGS (xdp_open_uri_flags_get_type ())
+
+/* enumerations from "print.h" */
+XDP_PUBLIC
+GType xdp_print_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_PRINT_FLAGS (xdp_print_flags_get_type ())
+
+/* enumerations from "remote.h" */
+XDP_PUBLIC
+GType xdp_session_state_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_SESSION_STATE (xdp_session_state_get_type ())
+XDP_PUBLIC
+GType xdp_output_type_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_OUTPUT_TYPE (xdp_output_type_get_type ())
+XDP_PUBLIC
+GType xdp_device_type_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_DEVICE_TYPE (xdp_device_type_get_type ())
+XDP_PUBLIC
+GType xdp_screencast_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_SCREENCAST_FLAGS (xdp_screencast_flags_get_type ())
+XDP_PUBLIC
+GType xdp_cursor_mode_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_CURSOR_MODE (xdp_cursor_mode_get_type ())
+XDP_PUBLIC
+GType xdp_persist_mode_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_PERSIST_MODE (xdp_persist_mode_get_type ())
+XDP_PUBLIC
+GType xdp_remote_desktop_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_REMOTE_DESKTOP_FLAGS (xdp_remote_desktop_flags_get_type ())
+XDP_PUBLIC
+GType xdp_button_state_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_BUTTON_STATE (xdp_button_state_get_type ())
+XDP_PUBLIC
+GType xdp_discrete_axis_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_DISCRETE_AXIS (xdp_discrete_axis_get_type ())
+XDP_PUBLIC
+GType xdp_key_state_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_KEY_STATE (xdp_key_state_get_type ())
+
+/* enumerations from "screenshot.h" */
+XDP_PUBLIC
+GType xdp_screenshot_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_SCREENSHOT_FLAGS (xdp_screenshot_flags_get_type ())
+
+/* enumerations from "session.h" */
+XDP_PUBLIC
+GType xdp_session_type_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_SESSION_TYPE (xdp_session_type_get_type ())
+
+/* enumerations from "spawn.h" */
+XDP_PUBLIC
+GType xdp_spawn_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_SPAWN_FLAGS (xdp_spawn_flags_get_type ())
+
+/* enumerations from "updates.h" */
+XDP_PUBLIC
+GType xdp_update_status_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_UPDATE_STATUS (xdp_update_status_get_type ())
+XDP_PUBLIC
+GType xdp_update_monitor_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_UPDATE_MONITOR_FLAGS (xdp_update_monitor_flags_get_type ())
+XDP_PUBLIC
+GType xdp_update_install_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_UPDATE_INSTALL_FLAGS (xdp_update_install_flags_get_type ())
+
+/* enumerations from "wallpaper.h" */
+XDP_PUBLIC
+GType xdp_wallpaper_flags_get_type (void) G_GNUC_CONST;
+#define XDP_TYPE_WALLPAPER_FLAGS (xdp_wallpaper_flags_get_type ())
+G_END_DECLS
+
+/* Generated data ends here */
+
diff --git a/Source/ThirdParty/libportal/libportal.Build.cs b/Source/ThirdParty/libportal/libportal.Build.cs
new file mode 100644
index 000000000..6fab950f9
--- /dev/null
+++ b/Source/ThirdParty/libportal/libportal.Build.cs
@@ -0,0 +1,47 @@
+// Copyright (c) 2012-2025 Wojciech Figat. All rights reserved.
+
+using System.IO;
+using Flax.Build;
+using Flax.Build.NativeCpp;
+
+///
+/// https://github.com/flatpak/libportal
+///
+public class libportal : DepsModule
+{
+ ///
+ public override void Init()
+ {
+ base.Init();
+
+ LicenseType = LicenseTypes.Custom;
+ LicenseFilePath = "LICENSE.txt";
+
+ // Merge third-party modules into engine binary
+ BinaryModuleName = "FlaxEngine";
+ }
+
+ ///
+ public override void Setup(BuildOptions options)
+ {
+ base.Setup(options);
+
+ var depsRoot = options.DepsFolder;
+ switch (options.Platform.Target)
+ {
+ case TargetPlatform.Linux:
+ options.OutputFiles.Add(Path.Combine(depsRoot, "libportal.a"));
+
+ options.PublicIncludePaths.Add("/usr/include/glib-2.0");
+ options.PublicIncludePaths.Add("/usr/lib/glib-2.0/include");
+
+
+ //options.SourceFiles.Add(Path.Combine(FolderPath, "portal-enums.c"));
+ options.SourceFiles.AddRange(Directory.GetFiles(FolderPath, "*.c", SearchOption.TopDirectoryOnly));
+ break;
+ default: throw new InvalidPlatformException(options.Platform.Target);
+ }
+
+ options.PublicIncludePaths.Add(Path.Combine(Globals.EngineRoot, @"Source\ThirdParty\libportal\include"));
+ }
+}
diff --git a/Source/ThirdParty/libportal/portal-enums.c b/Source/ThirdParty/libportal/portal-enums.c
new file mode 100644
index 000000000..64cc5d107
--- /dev/null
+++ b/Source/ThirdParty/libportal/portal-enums.c
@@ -0,0 +1,673 @@
+
+/* This file is generated by glib-mkenums, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */
+
+
+#include "config.h"
+
+#include
+/* enumerations from "account.h" */
+GType
+xdp_user_information_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_USER_INFORMATION_FLAG_NONE, "XDP_USER_INFORMATION_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpUserInformationFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "background.h" */
+GType
+xdp_background_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_BACKGROUND_FLAG_NONE, "XDP_BACKGROUND_FLAG_NONE", "none" },
+ { XDP_BACKGROUND_FLAG_AUTOSTART, "XDP_BACKGROUND_FLAG_AUTOSTART", "autostart" },
+ { XDP_BACKGROUND_FLAG_ACTIVATABLE, "XDP_BACKGROUND_FLAG_ACTIVATABLE", "activatable" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpBackgroundFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "camera.h" */
+GType
+xdp_camera_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_CAMERA_FLAG_NONE, "XDP_CAMERA_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpCameraFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "dynamic-launcher.h" */
+GType
+xdp_launcher_type_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_LAUNCHER_APPLICATION, "XDP_LAUNCHER_APPLICATION", "application" },
+ { XDP_LAUNCHER_WEBAPP, "XDP_LAUNCHER_WEBAPP", "webapp" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpLauncherType"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "email.h" */
+GType
+xdp_email_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_EMAIL_FLAG_NONE, "XDP_EMAIL_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpEmailFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "filechooser.h" */
+GType
+xdp_open_file_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_OPEN_FILE_FLAG_NONE, "XDP_OPEN_FILE_FLAG_NONE", "none" },
+ { XDP_OPEN_FILE_FLAG_MULTIPLE, "XDP_OPEN_FILE_FLAG_MULTIPLE", "multiple" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpOpenFileFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_save_file_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_SAVE_FILE_FLAG_NONE, "XDP_SAVE_FILE_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpSaveFileFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "inhibit.h" */
+GType
+xdp_inhibit_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_INHIBIT_FLAG_LOGOUT, "XDP_INHIBIT_FLAG_LOGOUT", "logout" },
+ { XDP_INHIBIT_FLAG_USER_SWITCH, "XDP_INHIBIT_FLAG_USER_SWITCH", "user-switch" },
+ { XDP_INHIBIT_FLAG_SUSPEND, "XDP_INHIBIT_FLAG_SUSPEND", "suspend" },
+ { XDP_INHIBIT_FLAG_IDLE, "XDP_INHIBIT_FLAG_IDLE", "idle" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpInhibitFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_login_session_state_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_LOGIN_SESSION_RUNNING, "XDP_LOGIN_SESSION_RUNNING", "running" },
+ { XDP_LOGIN_SESSION_QUERY_END, "XDP_LOGIN_SESSION_QUERY_END", "query-end" },
+ { XDP_LOGIN_SESSION_ENDING, "XDP_LOGIN_SESSION_ENDING", "ending" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpLoginSessionState"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_session_monitor_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_SESSION_MONITOR_FLAG_NONE, "XDP_SESSION_MONITOR_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpSessionMonitorFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "inputcapture.h" */
+GType
+xdp_input_capability_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_INPUT_CAPABILITY_NONE, "XDP_INPUT_CAPABILITY_NONE", "none" },
+ { XDP_INPUT_CAPABILITY_KEYBOARD, "XDP_INPUT_CAPABILITY_KEYBOARD", "keyboard" },
+ { XDP_INPUT_CAPABILITY_POINTER, "XDP_INPUT_CAPABILITY_POINTER", "pointer" },
+ { XDP_INPUT_CAPABILITY_TOUCHSCREEN, "XDP_INPUT_CAPABILITY_TOUCHSCREEN", "touchscreen" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpInputCapability"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "location.h" */
+GType
+xdp_location_accuracy_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_LOCATION_ACCURACY_NONE, "XDP_LOCATION_ACCURACY_NONE", "none" },
+ { XDP_LOCATION_ACCURACY_COUNTRY, "XDP_LOCATION_ACCURACY_COUNTRY", "country" },
+ { XDP_LOCATION_ACCURACY_CITY, "XDP_LOCATION_ACCURACY_CITY", "city" },
+ { XDP_LOCATION_ACCURACY_NEIGHBORHOOD, "XDP_LOCATION_ACCURACY_NEIGHBORHOOD", "neighborhood" },
+ { XDP_LOCATION_ACCURACY_STREET, "XDP_LOCATION_ACCURACY_STREET", "street" },
+ { XDP_LOCATION_ACCURACY_EXACT, "XDP_LOCATION_ACCURACY_EXACT", "exact" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpLocationAccuracy"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_location_monitor_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_LOCATION_MONITOR_FLAG_NONE, "XDP_LOCATION_MONITOR_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpLocationMonitorFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "notification.h" */
+GType
+xdp_notification_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_NOTIFICATION_FLAG_NONE, "XDP_NOTIFICATION_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpNotificationFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "openuri.h" */
+GType
+xdp_open_uri_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_OPEN_URI_FLAG_NONE, "XDP_OPEN_URI_FLAG_NONE", "none" },
+ { XDP_OPEN_URI_FLAG_ASK, "XDP_OPEN_URI_FLAG_ASK", "ask" },
+ { XDP_OPEN_URI_FLAG_WRITABLE, "XDP_OPEN_URI_FLAG_WRITABLE", "writable" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpOpenUriFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "print.h" */
+GType
+xdp_print_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_PRINT_FLAG_NONE, "XDP_PRINT_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpPrintFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "remote.h" */
+GType
+xdp_session_state_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_SESSION_INITIAL, "XDP_SESSION_INITIAL", "initial" },
+ { XDP_SESSION_ACTIVE, "XDP_SESSION_ACTIVE", "active" },
+ { XDP_SESSION_CLOSED, "XDP_SESSION_CLOSED", "closed" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpSessionState"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_output_type_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_OUTPUT_NONE, "XDP_OUTPUT_NONE", "none" },
+ { XDP_OUTPUT_MONITOR, "XDP_OUTPUT_MONITOR", "monitor" },
+ { XDP_OUTPUT_WINDOW, "XDP_OUTPUT_WINDOW", "window" },
+ { XDP_OUTPUT_VIRTUAL, "XDP_OUTPUT_VIRTUAL", "virtual" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpOutputType"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_device_type_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_DEVICE_NONE, "XDP_DEVICE_NONE", "none" },
+ { XDP_DEVICE_KEYBOARD, "XDP_DEVICE_KEYBOARD", "keyboard" },
+ { XDP_DEVICE_POINTER, "XDP_DEVICE_POINTER", "pointer" },
+ { XDP_DEVICE_TOUCHSCREEN, "XDP_DEVICE_TOUCHSCREEN", "touchscreen" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpDeviceType"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_screencast_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_SCREENCAST_FLAG_NONE, "XDP_SCREENCAST_FLAG_NONE", "none" },
+ { XDP_SCREENCAST_FLAG_MULTIPLE, "XDP_SCREENCAST_FLAG_MULTIPLE", "multiple" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpScreencastFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_cursor_mode_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_CURSOR_MODE_HIDDEN, "XDP_CURSOR_MODE_HIDDEN", "hidden" },
+ { XDP_CURSOR_MODE_EMBEDDED, "XDP_CURSOR_MODE_EMBEDDED", "embedded" },
+ { XDP_CURSOR_MODE_METADATA, "XDP_CURSOR_MODE_METADATA", "metadata" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpCursorMode"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_persist_mode_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_PERSIST_MODE_NONE, "XDP_PERSIST_MODE_NONE", "none" },
+ { XDP_PERSIST_MODE_TRANSIENT, "XDP_PERSIST_MODE_TRANSIENT", "transient" },
+ { XDP_PERSIST_MODE_PERSISTENT, "XDP_PERSIST_MODE_PERSISTENT", "persistent" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpPersistMode"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_remote_desktop_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_REMOTE_DESKTOP_FLAG_NONE, "XDP_REMOTE_DESKTOP_FLAG_NONE", "none" },
+ { XDP_REMOTE_DESKTOP_FLAG_MULTIPLE, "XDP_REMOTE_DESKTOP_FLAG_MULTIPLE", "multiple" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpRemoteDesktopFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_button_state_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_BUTTON_RELEASED, "XDP_BUTTON_RELEASED", "released" },
+ { XDP_BUTTON_PRESSED, "XDP_BUTTON_PRESSED", "pressed" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpButtonState"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_discrete_axis_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_AXIS_HORIZONTAL_SCROLL, "XDP_AXIS_HORIZONTAL_SCROLL", "horizontal-scroll" },
+ { XDP_AXIS_VERTICAL_SCROLL, "XDP_AXIS_VERTICAL_SCROLL", "vertical-scroll" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpDiscreteAxis"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_key_state_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_KEY_RELEASED, "XDP_KEY_RELEASED", "released" },
+ { XDP_KEY_PRESSED, "XDP_KEY_PRESSED", "pressed" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpKeyState"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "screenshot.h" */
+GType
+xdp_screenshot_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_SCREENSHOT_FLAG_NONE, "XDP_SCREENSHOT_FLAG_NONE", "none" },
+ { XDP_SCREENSHOT_FLAG_INTERACTIVE, "XDP_SCREENSHOT_FLAG_INTERACTIVE", "interactive" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpScreenshotFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "session.h" */
+GType
+xdp_session_type_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_SESSION_SCREENCAST, "XDP_SESSION_SCREENCAST", "screencast" },
+ { XDP_SESSION_REMOTE_DESKTOP, "XDP_SESSION_REMOTE_DESKTOP", "remote-desktop" },
+ { XDP_SESSION_INPUT_CAPTURE, "XDP_SESSION_INPUT_CAPTURE", "input-capture" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpSessionType"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "spawn.h" */
+GType
+xdp_spawn_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_SPAWN_FLAG_NONE, "XDP_SPAWN_FLAG_NONE", "none" },
+ { XDP_SPAWN_FLAG_CLEARENV, "XDP_SPAWN_FLAG_CLEARENV", "clearenv" },
+ { XDP_SPAWN_FLAG_LATEST, "XDP_SPAWN_FLAG_LATEST", "latest" },
+ { XDP_SPAWN_FLAG_SANDBOX, "XDP_SPAWN_FLAG_SANDBOX", "sandbox" },
+ { XDP_SPAWN_FLAG_NO_NETWORK, "XDP_SPAWN_FLAG_NO_NETWORK", "no-network" },
+ { XDP_SPAWN_FLAG_WATCH, "XDP_SPAWN_FLAG_WATCH", "watch" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpSpawnFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "updates.h" */
+GType
+xdp_update_status_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_UPDATE_STATUS_RUNNING, "XDP_UPDATE_STATUS_RUNNING", "running" },
+ { XDP_UPDATE_STATUS_EMPTY, "XDP_UPDATE_STATUS_EMPTY", "empty" },
+ { XDP_UPDATE_STATUS_DONE, "XDP_UPDATE_STATUS_DONE", "done" },
+ { XDP_UPDATE_STATUS_FAILED, "XDP_UPDATE_STATUS_FAILED", "failed" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpUpdateStatus"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_update_monitor_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_UPDATE_MONITOR_FLAG_NONE, "XDP_UPDATE_MONITOR_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpUpdateMonitorFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+xdp_update_install_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { XDP_UPDATE_INSTALL_FLAG_NONE, "XDP_UPDATE_INSTALL_FLAG_NONE", "none" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("XdpUpdateInstallFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+/* enumerations from "wallpaper.h" */
+GType
+xdp_wallpaper_flags_get_type (void)
+{
+ static gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { XDP_WALLPAPER_FLAG_NONE, "XDP_WALLPAPER_FLAG_NONE", "none" },
+ { XDP_WALLPAPER_FLAG_BACKGROUND, "XDP_WALLPAPER_FLAG_BACKGROUND", "background" },
+ { XDP_WALLPAPER_FLAG_LOCKSCREEN, "XDP_WALLPAPER_FLAG_LOCKSCREEN", "lockscreen" },
+ { XDP_WALLPAPER_FLAG_PREVIEW, "XDP_WALLPAPER_FLAG_PREVIEW", "preview" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("XdpWallpaperFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+
+
+/* Generated data ends here */
+
diff --git a/Source/Tools/Flax.Build/Deps/Dependencies/libportal.cs b/Source/Tools/Flax.Build/Deps/Dependencies/libportal.cs
new file mode 100644
index 000000000..74d3cecb1
--- /dev/null
+++ b/Source/Tools/Flax.Build/Deps/Dependencies/libportal.cs
@@ -0,0 +1,90 @@
+// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
+
+using System.Collections.Generic;
+using System.IO;
+using Flax.Build;
+
+namespace Flax.Deps.Dependencies;
+
+///
+/// libportal.
+///
+///
+class libportal : Dependency
+{
+ ///
+ public override TargetPlatform[] Platforms
+ {
+ get
+ {
+ switch (BuildPlatform)
+ {
+ case TargetPlatform.Linux:
+ return new[]
+ {
+ TargetPlatform.Linux,
+ };
+ default: return new TargetPlatform[0];
+ }
+ }
+ }
+
+ ///
+ public override void Build(BuildOptions options)
+ {
+ var dstPath = Path.Combine(options.ThirdPartyFolder, "libportal");
+ var includePath = Path.Combine(dstPath, "include");
+
+ string root = options.IntermediateFolder;
+ var configs = new string[]
+ {
+ "-Dbackend-qt6=disabled",
+ "-Dbackend-qt5=disabled",
+ "-Dbackend-gtk4=disabled",
+ "-Dbackend-gtk3=disabled",
+ "-Dintrospection=false",
+ "-Dtests=false",
+ "-Ddocs=false",
+ "-Dvapi=false",
+ "--buildtype release",
+ "--default-library static",
+ };
+
+ CloneGitRepo(root, "https://github.com/flatpak/libportal");
+ GitFetch(root);
+ GitResetToCommit(root, "8f5dc8d192f6e31dafe69e35219e3b707bde71ce"); // 0.9.1
+
+ foreach (var platform in options.Platforms)
+ {
+ BuildStarted(platform);
+ switch (platform)
+ {
+ case TargetPlatform.Linux:
+ {
+ foreach (var architecture in new TargetArchitecture[] { TargetArchitecture.x64 /*, TargetArchitecture.ARM64*/ })
+ {
+ var buildDir = $"build_{architecture}";
+ Utilities.Run("meson", $"{buildDir} {string.Join(" ", configs)}", null, root, Utilities.RunOptions.DefaultTool);
+ Utilities.Run("ninja", $"-C {buildDir} ", null, root, Utilities.RunOptions.DefaultTool);
+
+ var depsFolder = GetThirdPartyFolder(options, platform, architecture);
+ Utilities.FileCopy(Path.Combine(root, buildDir, "libportal", "libportal.a"), Path.Combine(depsFolder, "libportal.a"));
+ Utilities.FileCopy(Path.Combine(root, buildDir, "libportal", "portal-enums.h"), Path.Combine(includePath, "portal-enums.h"));
+ Utilities.FileCopy(Path.Combine(root, buildDir, "libportal", "portal-enums.c"), Path.Combine(dstPath, "portal-enums.c"));
+ }
+
+ Utilities.FileCopy(Path.Combine(root, "COPYING"), Path.Combine(dstPath, "LICENSE.txt"));
+
+ if (!Directory.Exists(includePath))
+ Directory.CreateDirectory(includePath);
+ if (!Directory.Exists(Path.Combine(includePath, "libportal")))
+ Directory.CreateDirectory(Path.Combine(includePath, "libportal"));
+
+ foreach (var file in Directory.GetFiles(Path.Combine(root, "libportal"), "*.h"))
+ Utilities.FileCopy(file, Path.Combine(includePath, "libportal", Path.GetFileName(file)));
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/Source/Tools/Flax.Build/Platforms/Linux/LinuxToolchain.cs b/Source/Tools/Flax.Build/Platforms/Linux/LinuxToolchain.cs
index 5de782398..e2d5ca1a3 100644
--- a/Source/Tools/Flax.Build/Platforms/Linux/LinuxToolchain.cs
+++ b/Source/Tools/Flax.Build/Platforms/Linux/LinuxToolchain.cs
@@ -126,7 +126,16 @@ namespace Flax.Build.Platforms
args.Add("-lXcursor");
args.Add("-lXinerama");
args.Add("-lXfixes");
- args.Add("-lwayland-client");
+
+ if (EngineConfiguration.WithSDL(options))
+ {
+ // Link Wayland
+ args.Add("-lwayland-client");
+
+ // Link GLib for libportal
+ args.Add("-lglib-2.0");
+ args.Add("-lgio-2.0");
+ }
}
///