| 
					
				 | 
			
			
				@@ -0,0 +1,74 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* portal.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright 2021 Georges Basile Stavracas Neto <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * This program is free software: you can redistribute it and/or modify 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * it under the terms of the GNU General Public License as published by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * the Free Software Foundation, either version 2 of the License, or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * (at your option) any later version. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * This program 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 General Public License for more details. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * You should have received a copy of the GNU General Public License 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * SPDX-License-Identifier: GPL-2.0-or-later 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "portal.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "pipewire.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static GDBusConnection *connection = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static GDBusProxy *proxy = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void ensure_proxy(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	g_autoptr(GError) error = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!connection) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			blog(LOG_WARNING, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			     "[portals] Error retrieving D-Bus connection: %s", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			     error->message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!proxy) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		proxy = g_dbus_proxy_new_sync( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			connection, G_DBUS_PROXY_FLAGS_NONE, NULL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"org.freedesktop.portal.Desktop", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"/org/freedesktop/portal/desktop", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"org.freedesktop.portal.ScreenCast", NULL, &error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			blog(LOG_WARNING, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			     "[portals] Error retrieving D-Bus proxy: %s", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			     error->message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+uint32_t portal_get_available_capture_types(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	g_autoptr(GVariant) cached_source_types = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	uint32_t available_source_types; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ensure_proxy(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!proxy) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	cached_source_types = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		g_dbus_proxy_get_cached_property(proxy, "AvailableSourceTypes"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	available_source_types = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cached_source_types ? g_variant_get_uint32(cached_source_types) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    : 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return available_source_types; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |