mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 10:08:56 +01:00 
			
		
		
		
	Add a portal backend for GNotification
This talks to the org.freedesktop.portal.Notification portal instead of directly to gnome-shell. https://bugzilla.gnome.org/show_bug.cgi?id=768498
This commit is contained in:
		@@ -263,6 +263,7 @@ unix_sources = \
 | 
				
			|||||||
	gcontenttypeprivate.h 	\
 | 
						gcontenttypeprivate.h 	\
 | 
				
			||||||
	gfdonotificationbackend.c \
 | 
						gfdonotificationbackend.c \
 | 
				
			||||||
	ggtknotificationbackend.c \
 | 
						ggtknotificationbackend.c \
 | 
				
			||||||
 | 
						gportalnotificationbackend.c \
 | 
				
			||||||
	$(NULL)
 | 
						$(NULL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if OS_COCOA
 | 
					if OS_COCOA
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -915,6 +915,7 @@ extern GType _g_network_monitor_nm_get_type (void);
 | 
				
			|||||||
#ifdef G_OS_UNIX
 | 
					#ifdef G_OS_UNIX
 | 
				
			||||||
extern GType g_fdo_notification_backend_get_type (void);
 | 
					extern GType g_fdo_notification_backend_get_type (void);
 | 
				
			||||||
extern GType g_gtk_notification_backend_get_type (void);
 | 
					extern GType g_gtk_notification_backend_get_type (void);
 | 
				
			||||||
 | 
					extern GType g_portal_notification_backend_get_type (void);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_COCOA
 | 
					#ifdef HAVE_COCOA
 | 
				
			||||||
@@ -1116,6 +1117,7 @@ _g_io_modules_ensure_loaded (void)
 | 
				
			|||||||
      g_type_ensure (_g_unix_volume_monitor_get_type ());
 | 
					      g_type_ensure (_g_unix_volume_monitor_get_type ());
 | 
				
			||||||
      g_type_ensure (g_fdo_notification_backend_get_type ());
 | 
					      g_type_ensure (g_fdo_notification_backend_get_type ());
 | 
				
			||||||
      g_type_ensure (g_gtk_notification_backend_get_type ());
 | 
					      g_type_ensure (g_gtk_notification_backend_get_type ());
 | 
				
			||||||
 | 
					      g_type_ensure (g_portal_notification_backend_get_type ());
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef HAVE_COCOA
 | 
					#ifdef HAVE_COCOA
 | 
				
			||||||
      g_type_ensure (g_cocoa_notification_backend_get_type ());
 | 
					      g_type_ensure (g_cocoa_notification_backend_get_type ());
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										97
									
								
								gio/gportalnotificationbackend.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								gio/gportalnotificationbackend.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,97 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Copyright © 2016 Red Hat, Inc.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This library is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					* modify it under the terms of the GNU Lesser General Public
 | 
				
			||||||
 | 
					* License as published by the Free Software Foundation; either
 | 
				
			||||||
 | 
					* version 2 of the License, or (at your option) any later version.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This library is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					* but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
				
			||||||
 | 
					* Lesser General Public License for more details.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* You should have received a copy of the GNU Lesser General
 | 
				
			||||||
 | 
					* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* Author: Matthias Clasen
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					#include "gnotificationbackend.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "giomodule-priv.h"
 | 
				
			||||||
 | 
					#include "gdbusconnection.h"
 | 
				
			||||||
 | 
					#include "gapplication.h"
 | 
				
			||||||
 | 
					#include "gnotification-private.h"
 | 
				
			||||||
 | 
					#include "gportalsupport.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define G_TYPE_PORTAL_NOTIFICATION_BACKEND  (g_portal_notification_backend_get_type ())
 | 
				
			||||||
 | 
					#define G_PORTAL_NOTIFICATION_BACKEND(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_PORTAL_NOTIFICATION_BACKEND, GPortalNotificationBackend))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _GPortalNotificationBackend GPortalNotificationBackend;
 | 
				
			||||||
 | 
					typedef GNotificationBackendClass       GPortalNotificationBackendClass;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct _GPortalNotificationBackend
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  GNotificationBackend parent;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GType g_portal_notification_backend_get_type (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_CODE (GPortalNotificationBackend, g_portal_notification_backend, G_TYPE_NOTIFICATION_BACKEND,
 | 
				
			||||||
 | 
					  _g_io_modules_ensure_extension_points_registered ();
 | 
				
			||||||
 | 
					  g_io_extension_point_implement (G_NOTIFICATION_BACKEND_EXTENSION_POINT_NAME,
 | 
				
			||||||
 | 
					                                 g_define_type_id, "portal", 110))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					g_portal_notification_backend_is_supported (void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return glib_should_use_portal ();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					g_portal_notification_backend_send_notification (GNotificationBackend *backend,
 | 
				
			||||||
 | 
					                                                 const gchar          *id,
 | 
				
			||||||
 | 
					                                                 GNotification        *notification)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  g_dbus_connection_call (backend->dbus_connection,
 | 
				
			||||||
 | 
					                          "org.freedesktop.portal.Desktop",
 | 
				
			||||||
 | 
					                          "/org/freedesktop/portal/desktop",
 | 
				
			||||||
 | 
					                          "org.freedesktop.portal.Notification",
 | 
				
			||||||
 | 
					                          "AddNotification",
 | 
				
			||||||
 | 
					                          g_variant_new ("(s@a{sv})",
 | 
				
			||||||
 | 
					                                         id,
 | 
				
			||||||
 | 
					                                         g_notification_serialize (notification)),
 | 
				
			||||||
 | 
					                          G_VARIANT_TYPE_UNIT,
 | 
				
			||||||
 | 
					                          G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					g_portal_notification_backend_withdraw_notification (GNotificationBackend *backend,
 | 
				
			||||||
 | 
					                                                     const gchar          *id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  g_dbus_connection_call (backend->dbus_connection,
 | 
				
			||||||
 | 
					                          "org.freedesktop.portal.Desktop",
 | 
				
			||||||
 | 
					                          "/org/freedesktop/portal/desktop",
 | 
				
			||||||
 | 
					                          "org.freedesktop.portal.Notification",
 | 
				
			||||||
 | 
					                          "RemoveNotification",
 | 
				
			||||||
 | 
					                          g_variant_new ("(s)", id),
 | 
				
			||||||
 | 
					                          G_VARIANT_TYPE_UNIT,
 | 
				
			||||||
 | 
					                          G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					g_portal_notification_backend_init (GPortalNotificationBackend *backend)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					g_portal_notification_backend_class_init (GPortalNotificationBackendClass *class)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  GNotificationBackendClass *backend_class = G_NOTIFICATION_BACKEND_CLASS (class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  backend_class->is_supported = g_portal_notification_backend_is_supported;
 | 
				
			||||||
 | 
					  backend_class->send_notification = g_portal_notification_backend_send_notification;
 | 
				
			||||||
 | 
					  backend_class->withdraw_notification = g_portal_notification_backend_withdraw_notification;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user