[Xfce4-commits] [apps/xfce4-notifyd] 01/29: Get rid of dbus-glib.
noreply at xfce.org
noreply at xfce.org
Wed Jun 29 23:19:51 CEST 2016
This is an automated email from the git hooks/post-receive script.
ochosi pushed a commit to branch master
in repository apps/xfce4-notifyd.
commit 76f397d57ac10bf51418fdfbb0760c2b45d75eda
Author: Ali Abdallah <aliovx at gmail.com>
Date: Sun Oct 11 19:23:32 2015 +0200
Get rid of dbus-glib.
---
Makefile.am | 37 ++-
configure.ac.in | 15 +-
xfce4-notifyd/notify-dbus.xml | 2 +-
xfce4-notifyd/xfce-notify-daemon.c | 569 ++++++++++++++++++++-----------------
4 files changed, 346 insertions(+), 277 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index df81bea..b7f069b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -22,7 +22,8 @@ bin_PROGRAMS = xfce4-notifyd-config/xfce4-notifyd-config
xfce4_notifyd_xfce4_notifyd_SOURCES = \
xfce4-notifyd/main.c \
- xfce4-notifyd/notify-dbus.h \
+ xfce4-notifyd/xfce-notify-gbus.c \
+ xfce4-notifyd/xfce-notify-gbus.h \
xfce4-notifyd/xfce-notify-daemon.c \
xfce4-notifyd/xfce-notify-daemon.h \
xfce4-notifyd/xfce-notify-enum-types.c \
@@ -42,13 +43,14 @@ common_cflags = \
$(GTK_CFLAGS) \
$(LIBXFCE4UTIL_CFLAGS) \
$(LIBXFCE4UI_CFLAGS) \
- $(DBUS_GLIB_CFLAGS) \
$(XFCONF_CFLAGS)
xfce4_notifyd_xfce4_notifyd_CFLAGS = \
-DG_LOG_DOMAIN=\"xfce4-notifyd\" \
$(common_cflags) \
- $(LIBX11_CFLAGS)
+ $(LIBX11_CFLAGS) \
+ $(GIO_CFLAGS) \
+ $(GIO_UNIX_CFLAGS)
xfce4_notifyd_config_xfce4_notifyd_config_CFLAGS = \
-DG_LOG_DOMAIN=\"xfce4-notifyd-config\" \
@@ -59,12 +61,13 @@ common_ldadd = \
$(GTK_LIBS) \
$(LIBXFCE4UTIL_LIBS) \
$(LIBXFCE4UI_LIBS) \
- $(DBUS_GLIB_LIBS) \
- $(XFCONF_LIBS)
+ $(XFCONF_LIBS) \
+ $(GIO_LIBS) \
+ $(GIO_UNIX_LIBS)
xfce4_notifyd_xfce4_notifyd_LDADD = \
$(common_ldadd) \
- $(LIBX11_LIBS)
+ $(LIBX11_LIBS)
xfce4_notifyd_config_xfce4_notifyd_config_LDADD = \
$(common_ldadd) \
@@ -107,7 +110,8 @@ zomgponiesthemedir = $(theme_dir)/ZOMG-PONIES!/xfce-notify-4.0
dist_zomgponiestheme_DATA = themes/ZOMG-PONIES!/gtkrc
built_xfce4_notifyd = \
- xfce4-notifyd/notify-dbus.h
+ xfce4-notifyd/xfce-notify-gbus.c \
+ xfce4-notifyd/xfce-notify-gbus.h
clean_xfce4_notifyd = \
$(built_xfce4_notifyd)
@@ -158,18 +162,13 @@ DISTCLEANFILES = \
$(distclean_intltool) \
$(distclean_service)
-xfce4-notifyd/notify-dbus.h: $(srcdir)/xfce4-notifyd/notify-dbus.xml Makefile
-if USE_OLD_GET_SERVER_INFORMATION_SIGNATURE
- $(AM_V_GEN) (\
- sed -e 's,<arg direction="out" name="spec_version" type="s"/>,,' $< > $(<F).tmp \
- && $(DBUS_BINDING_TOOL) --mode=glib-server --prefix=notify $(<F).tmp > $@ \
- && rm -f $(<F).tmp \
- )
-else
- $(AM_V_GEN) (\
- $(DBUS_BINDING_TOOL) --mode=glib-server --prefix=notify $< > $@ \
- )
-endif
+xfce4-notifyd/xfce-notify-gbus.h:
+xfce4-notifyd/xfce-notify-gbus.c: $(srcdir)/xfce4-notifyd/notify-dbus.xml Makefile
+ $(AM_V_GEN) $(GDBUS_CODEGEN) \
+ --interface-prefix org.freedesktop.Notifications \
+ --c-namespace XfceNotify \
+ --generate-c-code xfce4-notifyd/xfce-notify-gbus \
+ $(srcdir)/xfce4-notifyd/notify-dbus.xml
if MAINTAINER_MODE
diff --git a/configure.ac.in b/configure.ac.in
index cf5258f..b62361e 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -65,10 +65,21 @@ XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.4.0])
XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.7.0])
XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [0.1.0svn-r26876])
XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.14.0])
-XDT_CHECK_PACKAGE([DBUS], [dbus-1], [1.0.0])
-XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.72])
+XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.26.0])
+XDT_CHECK_PACKAGE([GIO_UNIX], [gio-unix-2.0], [2.26.0])
XDT_CHECK_PACKAGE([LIBNOTIFY], [libnotify], [0.7.0])
+dnl ***********************************
+dnl *** Check for gdbus-codegen ***
+dnl ***********************************
+AC_ARG_VAR([GDBUS_CODEGEN], [D-Bus code and documentation generator from XML D-Bus interface definitions])
+AC_PATH_PROG([GDBUS_CODEGEN], [gdbus-codegen], [no])
+if test x"$GDBUS_CODEGEN" = x"no"; then
+ AC_MSG_ERROR([could not find gdbus-codegen in \$PATH. You can run
+ ./configure GDBUS_CODEGEN=/path/to/gdbus-codegen to define
+ a custom location for it.])
+fi
+
AC_PATH_PROG([DBUS_BINDING_TOOL], [dbus-binding-tool])
AS_IF([test -z "$DBUS_BINDING_TOOL"],
[
diff --git a/xfce4-notifyd/notify-dbus.xml b/xfce4-notifyd/notify-dbus.xml
index 98a82ef..660d152 100644
--- a/xfce4-notifyd/notify-dbus.xml
+++ b/xfce4-notifyd/notify-dbus.xml
@@ -2,7 +2,7 @@
<node name="/org/freedesktop/Notifications">
<interface name="org.freedesktop.Notifications">
-
+ <annotation name="org.gtk.GDBus.C.Name" value="GBus" />
<method name="GetCapabilities">
<arg direction="out" name="capabilities" type="as"/>
</method>
diff --git a/xfce4-notifyd/xfce-notify-daemon.c b/xfce4-notifyd/xfce-notify-daemon.c
index ec2972a..4276c78 100644
--- a/xfce4-notifyd/xfce-notify-daemon.c
+++ b/xfce4-notifyd/xfce-notify-daemon.c
@@ -1,8 +1,10 @@
+/* vi:set et ai sw=4 sts=4 ts=4: */
/*
* xfce4-notifyd
*
* Copyright (c) 2008-2009 Brian Tarricone <bjt23 at cornell.edu>
* Copyright (c) 2009 Jérôme Guelfucci <jeromeg at xfce.org>
+ * Copyright (c) 2015 Ali Abdallah <ali at xfce.org>
*
* The workarea per monitor code is taken from
* http://trac.galago-project.org/attachment/ticket/5/10-nd-improve-multihead-support.patch
@@ -33,11 +35,12 @@
#include <libxfce4ui/libxfce4ui.h>
#include <gdk/gdkx.h>
+#include <gio/gio.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
#include <xfconf/xfconf.h>
+#include "xfce-notify-gbus.h"
+
#include "xfce-notify-daemon.h"
#include "xfce-notify-window.h"
#include "xfce-notify-marshal.h"
@@ -47,13 +50,14 @@
struct _XfceNotifyDaemon
{
- GObject parent;
+ XfceNotifyGBusSkeleton parent;
+ XfceNotifyOrgXfceNotifyd *xfce_iface_skeleton;
gint expire_timeout;
+ guint bus_name_id;
gdouble initial_opacity;
GtkCornerType notify_location;
- DBusGConnection *dbus_conn;
XfconfChannel *settings;
GTree *active_notifications;
@@ -69,15 +73,10 @@ struct _XfceNotifyDaemon
typedef struct
{
- GObjectClass parent;
+ XfceNotifyGBusSkeletonClass parent;
+
} XfceNotifyDaemonClass;
-enum
-{
- SIG_NOTIFICATION_CLOSED = 0,
- SIG_ACTION_INVOKED,
- N_SIGS,
-};
enum
{
@@ -92,6 +91,7 @@ static void xfce_notify_daemon_update_reserved_rectangles(gpointer key,
gpointer value,
gpointer data);
static void xfce_notify_daemon_finalize(GObject *obj);
+static void xfce_notify_daemon_constructed(GObject *obj);
static GQuark xfce_notify_daemon_get_n_monitors_quark(void);
@@ -105,45 +105,48 @@ static void xfce_gdk_rectangle_largest_box(GdkRectangle *src1,
static void xfce_notify_daemon_get_workarea(GdkScreen *screen,
guint monitor,
GdkRectangle *rect);
+static void daemon_quit (XfceNotifyDaemon *xndaemon);
static gboolean xfce_notify_daemon_close_timeout(gpointer data);
-static gboolean notify_get_capabilities(XfceNotifyDaemon *xndaemon,
- gchar ***OUT_capabilities,
- GError *error);
-static gboolean notify_notify(XfceNotifyDaemon *xndaemon,
- const gchar *app_name,
- guint replaces_id,
- const gchar *app_icon,
- const gchar *summary,
- const gchar *body,
- const gchar **actions,
- GHashTable *hints,
- gint expire_timeout,
- guint *OUT_id,
- GError **error);
-static gboolean notify_close_notification(XfceNotifyDaemon *xndaemon,
- guint id,
- GError **error);
-static gboolean notify_get_server_information(XfceNotifyDaemon *xndaemon,
- gchar **OUT_name,
- gchar **OUT_vendor,
- gchar **OUT_version,
-#ifndef USE_OLD_GET_SERVER_INFORMATION_SIGNATURE
- gchar **OUT_spec_version,
-#endif
- GError **error);
-static gboolean notify_quit(XfceNotifyDaemon *xndaemon,
- GError **error);
+static GdkPixbuf *notify_pixbuf_from_image_data(GVariant *image_data);
+
+/* DBus method callbacks forward declarations */
+static gboolean notify_get_capabilities (XfceNotifyGBus *skeleton,
+ GDBusMethodInvocation *invocation,
+ XfceNotifyDaemon *xndaemon);
+
+
+static gboolean notify_notify (XfceNotifyGBus *skeleton,
+ GDBusMethodInvocation *invocation,
+ const gchar *app_name,
+ guint replaces_id,
+ const gchar *app_icon,
+ const gchar *summary,
+ const gchar *body,
+ const gchar **actions,
+ GVariant *hints,
+ gint expire_timeout,
+ XfceNotifyDaemon *xndaemon);
+
+
+static gboolean notify_close_notification (XfceNotifyGBus *skeleton,
+ GDBusMethodInvocation *invocation,
+ guint id,
+ XfceNotifyDaemon *xndaemon);
-static GdkPixbuf *notify_pixbuf_from_image_data(const GValue *image_data);
-#include "notify-dbus.h"
+static gboolean notify_get_server_information (XfceNotifyGBus *skeleton,
+ GDBusMethodInvocation *invocation,
+ XfceNotifyDaemon *xndaemon);
-static guint signals[N_SIGS] = { 0, };
+static gboolean notify_quit (XfceNotifyOrgXfceNotifyd *skeleton,
+ GDBusMethodInvocation *invocation,
+ XfceNotifyDaemon *xndaemon);
-G_DEFINE_TYPE(XfceNotifyDaemon, xfce_notify_daemon, G_TYPE_OBJECT)
+
+G_DEFINE_TYPE(XfceNotifyDaemon, xfce_notify_daemon, XFCE_NOTIFY_TYPE_GBUS_SKELETON)
static void
@@ -152,38 +155,10 @@ xfce_notify_daemon_class_init(XfceNotifyDaemonClass *klass)
GObjectClass *gobject_class = (GObjectClass *)klass;
gobject_class->finalize = xfce_notify_daemon_finalize;
-
- signals[SIG_NOTIFICATION_CLOSED] = g_signal_new("notification-closed",
- XFCE_TYPE_NOTIFY_DAEMON,
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL,
-#ifdef USE_OLD_NOTIFICATION_CLOSED_SIGNATURE
- g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1,
- G_TYPE_UINT
-#else /* libnotify 0.4.5 adds support */
- xfce_notify_marshal_VOID__UINT_UINT,
- G_TYPE_NONE, 2,
- G_TYPE_UINT,
- G_TYPE_UINT
-#endif
- );
-
- signals[SIG_ACTION_INVOKED] = g_signal_new("action-invoked",
- XFCE_TYPE_NOTIFY_DAEMON,
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL,
- xfce_notify_marshal_VOID__UINT_STRING,
- G_TYPE_NONE, 2,
- G_TYPE_UINT,
- G_TYPE_STRING);
-
- dbus_g_object_type_install_info(G_TYPE_FROM_CLASS(klass),
- &dbus_glib_notify_object_info);
+ gobject_class->constructed = xfce_notify_daemon_constructed;
}
+
static gint
xfce_direct_compare(gconstpointer a,
gconstpointer b,
@@ -192,6 +167,7 @@ xfce_direct_compare(gconstpointer a,
return (gint)((gchar *)a - (gchar *)b);
}
+
static GQuark
xfce_notify_daemon_get_n_monitors_quark(void)
{
@@ -311,13 +287,93 @@ xfce_notify_daemon_init_placement_data(XfceNotifyDaemon *xndaemon)
}
}
+
+static void
+xfce_notify_bus_name_acquired_cb (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ XfceNotifyDaemon *xndaemon;
+ GError *error = NULL;
+ gboolean exported;
+
+
+ xndaemon = XFCE_NOTIFY_DAEMON(user_data);
+
+ exported = g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (xndaemon),
+ connection,
+ "/org/freedesktop/Notifications",
+ &error);
+ if (exported)
+ {
+ /* Connect dbus signals callbacks */
+ g_signal_connect (xndaemon, "handle-notify",
+ G_CALLBACK(notify_notify), xndaemon);
+
+ g_signal_connect (xndaemon, "handle-get-capabilities",
+ G_CALLBACK(notify_get_capabilities), xndaemon);
+
+ g_signal_connect (xndaemon, "handle-get-server-information",
+ G_CALLBACK(notify_get_server_information), xndaemon);
+
+ g_signal_connect (xndaemon, "handle-close-notification",
+ G_CALLBACK(notify_close_notification), xndaemon);
+ }
+ else
+ {
+ g_warning ("Failed to export interface: %s", error->message);
+ g_error_free (error);
+ gtk_main_quit ();
+ }
+
+ xndaemon->xfce_iface_skeleton = xfce_notify_org_xfce_notifyd_skeleton_new();
+ exported = g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON(xndaemon->xfce_iface_skeleton),
+ connection,
+ "/org/freedesktop/Notifications",
+ &error);
+ if (exported)
+ g_signal_connect (xndaemon->xfce_iface_skeleton, "handle-quit",
+ G_CALLBACK(notify_quit), xndaemon);
+ else
+ {
+ g_warning ("Failed to export interface: %s", error->message);
+ g_error_free (error);
+ gtk_main_quit ();
+ }
+}
+
static void
-xfce_notify_daemon_init(XfceNotifyDaemon *xndaemon)
+xfce_notify_bus_name_lost_cb (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
{
+ g_print (_("Another notification daemon is running, exiting\n"));
+ daemon_quit(XFCE_NOTIFY_DAEMON(user_data));
+}
+
+static void xfce_notify_daemon_constructed (GObject *obj)
+{
+ XfceNotifyDaemon *self;
+
+ self = XFCE_NOTIFY_DAEMON (obj);
+
+ self->bus_name_id = g_bus_own_name (G_BUS_TYPE_SESSION,
+ "org.freedesktop.Notifications",
+ G_BUS_NAME_OWNER_FLAGS_REPLACE,
+ xfce_notify_bus_name_acquired_cb,
+ NULL,
+ xfce_notify_bus_name_lost_cb,
+ self,
+ NULL);
+}
+static void
+xfce_notify_daemon_init(XfceNotifyDaemon *xndaemon)
+{
xndaemon->active_notifications = g_tree_new_full(xfce_direct_compare,
- NULL, NULL,
- (GDestroyNotify)gtk_widget_destroy);
+ NULL, NULL,
+ (GDestroyNotify)gtk_widget_destroy);
+
xndaemon->last_notification_id = 1;
xndaemon->reserved_rectangles = NULL;
@@ -332,6 +388,23 @@ static void
xfce_notify_daemon_finalize(GObject *obj)
{
XfceNotifyDaemon *xndaemon = XFCE_NOTIFY_DAEMON(obj);
+ GDBusConnection *connection;
+
+ connection = g_dbus_interface_skeleton_get_connection(G_DBUS_INTERFACE_SKELETON(xndaemon));
+
+
+ if ( g_dbus_interface_skeleton_has_connection(G_DBUS_INTERFACE_SKELETON(xndaemon),
+ connection))
+ {
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON(xndaemon));
+ }
+
+ if (xndaemon->xfce_iface_skeleton &&
+ g_dbus_interface_skeleton_has_connection(G_DBUS_INTERFACE_SKELETON(xndaemon->xfce_iface_skeleton),
+ connection))
+ {
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON(xndaemon->xfce_iface_skeleton));
+ }
if(xndaemon->reserved_rectangles && xndaemon->monitors_workarea) {
gint nscreen, i, j;
@@ -363,9 +436,6 @@ xfce_notify_daemon_finalize(GObject *obj)
if(xndaemon->settings)
g_object_unref(xndaemon->settings);
- if(xndaemon->dbus_conn)
- dbus_g_connection_unref(xndaemon->dbus_conn);
-
G_OBJECT_CLASS(xfce_notify_daemon_parent_class)->finalize(obj);
}
@@ -388,8 +458,10 @@ xfce_notify_daemon_window_action_invoked(XfceNotifyWindow *window,
XfceNotifyDaemon *xndaemon = user_data;
guint id = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(window),
"--notify-id"));
- g_signal_emit(G_OBJECT(xndaemon), signals[SIG_ACTION_INVOKED], 0,
- id, action);
+
+ xfce_notify_gbus_emit_action_invoked (XFCE_NOTIFY_GBUS(xndaemon),
+ id,
+ action);
}
static void
@@ -409,7 +481,6 @@ xfce_notify_daemon_window_closed(XfceNotifyWindow *window,
xndaemon->reserved_rectangles[screen][monitor] = list;
g_tree_remove(xndaemon->active_notifications, id_p);
-
if (g_tree_nnodes(xndaemon->active_notifications) == 0) {
/* All notifications expired */
/* Set a timeout to close xfce4-notifyd if it is idle
@@ -424,13 +495,9 @@ xfce_notify_daemon_window_closed(XfceNotifyWindow *window,
xndaemon);
}
-#ifdef USE_OLD_NOTIFICATION_CLOSED_SIGNATURE
- g_signal_emit(G_OBJECT(xndaemon), signals[SIG_NOTIFICATION_CLOSED], 0,
- GPOINTER_TO_UINT(id_p));
-#else /* added to libnotify 0.4.5 */
- g_signal_emit(G_OBJECT(xndaemon), signals[SIG_NOTIFICATION_CLOSED], 0,
- GPOINTER_TO_UINT(id_p), (guint)reason);
-#endif
+ xfce_notify_gbus_emit_notification_closed (XFCE_NOTIFY_GBUS(xndaemon),
+ GPOINTER_TO_UINT(id_p),
+ (guint)reason);
}
/* Gets the largest rectangle in src1 which does not contain src2.
@@ -827,31 +894,20 @@ xfce_notify_daemon_update_reserved_rectangles(gpointer key,
}
-static gboolean
-xfce_notify_daemon_close_timeout(gpointer data)
-{
- notify_quit(XFCE_NOTIFY_DAEMON(data), NULL);
-
- return FALSE;
-}
-static gboolean
-notify_get_capabilities(XfceNotifyDaemon *xndaemon,
- gchar ***OUT_capabilities,
- GError *error)
+static gboolean notify_get_capabilities (XfceNotifyGBus *skeleton,
+ GDBusMethodInvocation *invocation,
+ XfceNotifyDaemon *xndaemon)
{
- gint i = 0;
-
- *OUT_capabilities = g_new(gchar *, 7);
- (*OUT_capabilities)[i++] = g_strdup("actions");
- (*OUT_capabilities)[i++] = g_strdup("body");
- (*OUT_capabilities)[i++] = g_strdup("body-markup");
- (*OUT_capabilities)[i++] = g_strdup("body-hyperlinks");
- (*OUT_capabilities)[i++] = g_strdup("icon-static");
- (*OUT_capabilities)[i++] = g_strdup("x-canonical-private-icon-only");
- (*OUT_capabilities)[i++] = NULL;
-
- if (g_tree_nnodes(xndaemon->active_notifications) == 0) {
+ const gchar *const capabilities[] =
+ {
+ "actions", "body", "body-hyperlinks", "body-markup", "icon-static",
+ "x-canonical-private-icon-only", NULL
+ };
+
+ xfce_notify_gbus_complete_get_capabilities(skeleton, invocation, capabilities);
+
+ if (g_tree_nnodes(xndaemon->active_notifications) == 0) {
/* No active notifications, reset the close timeout */
if(xndaemon->close_timeout)
g_source_remove(xndaemon->close_timeout);
@@ -865,38 +921,84 @@ notify_get_capabilities(XfceNotifyDaemon *xndaemon,
return TRUE;
}
+
static gboolean
-notify_show_window(gpointer window)
+notify_show_window (gpointer window)
{
- gtk_widget_show(GTK_WIDGET(window));
- return FALSE;
+ gtk_widget_show(GTK_WIDGET(window));
+ return FALSE;
}
-static gboolean
-notify_notify(XfceNotifyDaemon *xndaemon,
- const gchar *app_name,
- guint replaces_id,
- const gchar *app_icon,
- const gchar *summary,
- const gchar *body,
- const gchar **actions,
- GHashTable *hints,
- gint expire_timeout,
- guint *OUT_id,
- GError **error)
+
+static gboolean notify_notify (XfceNotifyGBus *skeleton,
+ GDBusMethodInvocation *invocation,
+ const gchar *app_name,
+ guint replaces_id,
+ const gchar *app_icon,
+ const gchar *summary,
+ const gchar *body,
+ const gchar **actions,
+ GVariant *hints,
+ gint expire_timeout,
+ XfceNotifyDaemon *xndaemon)
{
- XfceNotifyWindow *window;
+ XfceNotifyWindow *window;
GdkPixbuf *pix;
- GValue *urgency_data, *value_data;
-
- if((urgency_data = g_hash_table_lookup(hints, "urgency"))
- && G_VALUE_HOLDS(urgency_data, G_TYPE_UCHAR)
- && g_value_get_uchar(urgency_data) == URGENCY_CRITICAL)
+ GVariant *image_data = NULL;
+ const gchar *desktop_id = NULL;
+ gint value_hint = 0;
+ gboolean value_hint_set = FALSE;
+ gboolean x_canonical = FALSE;
+ GVariant *item;
+ GVariantIter iter;
+ guint OUT_id;
+
+ g_variant_iter_init (&iter, hints);
+
+ while ((item = g_variant_iter_next_value (&iter)))
{
- /* don't expire urgent notifications */
- expire_timeout = 0;
+ const char *key;
+ GVariant *value;
+
+ g_variant_get (item,
+ "{sv}",
+ &key,
+ &value);
+
+ if (g_strcmp0 (key, "urgency") == 0)
+ {
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE_BYTE) &&
+ (g_variant_get_byte(value) == URGENCY_CRITICAL))
+ {
+ /* don't expire urgent notifications */
+ expire_timeout = 0;
+ }
+ }
+ else if ((g_strcmp0 (key, "image_data") == 0) ||
+ (g_strcmp0 (key, "icon_data") == 0) ||
+ (g_strcmp0 (key, "image-data") == 0) ||
+ (g_strcmp0 (key, "icon-data") == 0))
+ {
+ image_data = value;
+ }
+ else if ((g_strcmp0 (key, "desktop_entry") == 0) ||
+ (g_strcmp0 (key, "desktop-entry") == 0))
+ {
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
+ desktop_id = g_variant_get_string (value, NULL);
+ }
+ else if (g_strcmp0 (key, "value") == 0)
+ {
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT32))
+ {
+ value_hint = g_variant_get_int32 (value);
+ value_hint_set = TRUE;
+ }
+ }
+ else if (g_strcmp0 (key, "x-canonical-private-icon-only") == 0)
+ x_canonical = TRUE;
}
-
+
if(expire_timeout == -1)
expire_timeout = xndaemon->expire_timeout;
@@ -911,7 +1013,7 @@ notify_notify(XfceNotifyDaemon *xndaemon,
xfce_notify_window_set_expire_timeout(window, expire_timeout);
xfce_notify_window_set_opacity(window, xndaemon->initial_opacity);
- *OUT_id = replaces_id;
+ OUT_id = replaces_id;
} else {
window = XFCE_NOTIFY_WINDOW(xfce_notify_window_new_with_actions(summary, body,
app_icon,
@@ -919,12 +1021,12 @@ notify_notify(XfceNotifyDaemon *xndaemon,
actions));
xfce_notify_window_set_opacity(window, xndaemon->initial_opacity);
- *OUT_id = xfce_notify_daemon_generate_id(xndaemon);
+ OUT_id = xfce_notify_daemon_generate_id(xndaemon);
g_object_set_data(G_OBJECT(window), "--notify-id",
- GUINT_TO_POINTER(*OUT_id));
+ GUINT_TO_POINTER(OUT_id));
g_tree_insert(xndaemon->active_notifications,
- GUINT_TO_POINTER(*OUT_id), window);
+ GUINT_TO_POINTER(OUT_id), window);
g_signal_connect(G_OBJECT(window), "action-invoked",
G_CALLBACK(xfce_notify_daemon_window_action_invoked),
@@ -941,9 +1043,6 @@ notify_notify(XfceNotifyDaemon *xndaemon,
}
if(!app_icon || !*app_icon) {
- GValue *image_data = g_hash_table_lookup(hints, "image_data");
- if(!image_data)
- image_data = g_hash_table_lookup(hints, "icon_data");
if(image_data) {
pix = notify_pixbuf_from_image_data(image_data);
if(pix) {
@@ -951,11 +1050,10 @@ notify_notify(XfceNotifyDaemon *xndaemon,
g_object_unref(G_OBJECT(pix));
}
} else {
- GValue *desktop_id = g_hash_table_lookup(hints, "desktop_id");
if(desktop_id) {
gchar *resource = g_strdup_printf("applications%c%s.desktop",
G_DIR_SEPARATOR,
- g_value_get_string(desktop_id));
+ desktop_id);
XfceRc *rcfile = xfce_rc_config_open(XFCE_RESOURCE_DATA,
resource, TRUE);
if(rcfile) {
@@ -983,16 +1081,11 @@ notify_notify(XfceNotifyDaemon *xndaemon,
}
}
- if(g_hash_table_lookup(hints, "x-canonical-private-icon-only"))
- xfce_notify_window_set_icon_only(window, TRUE);
+ xfce_notify_window_set_icon_only(window, x_canonical);
+
+ if(value_hint_set)
+ xfce_notify_window_set_gauge_value(window, value_hint);
else
- xfce_notify_window_set_icon_only(window, FALSE);
-
- if((value_data = g_hash_table_lookup(hints, "value"))
- && G_VALUE_HOLDS_INT(value_data))
- {
- xfce_notify_window_set_gauge_value(window, g_value_get_int(value_data));
- } else
xfce_notify_window_unset_gauge_value(window);
gtk_widget_realize(GTK_WIDGET(window));
@@ -1002,41 +1095,39 @@ notify_notify(XfceNotifyDaemon *xndaemon,
g_source_remove(xndaemon->close_timeout);
xndaemon->close_timeout = 0;
+ xfce_notify_gbus_complete_notify(skeleton, invocation, OUT_id);
- return TRUE;
+ return TRUE;
}
-static gboolean
-notify_close_notification(XfceNotifyDaemon *xndaemon,
- guint id,
- GError **error)
+
+static gboolean notify_close_notification (XfceNotifyGBus *skeleton,
+ GDBusMethodInvocation *invocation,
+ guint id,
+ XfceNotifyDaemon *xndaemon)
{
- XfceNotifyWindow *window = g_tree_lookup(xndaemon->active_notifications,
+ XfceNotifyWindow *window = g_tree_lookup(xndaemon->active_notifications,
GUINT_TO_POINTER(id));
if(window)
xfce_notify_window_closed(window, XFCE_NOTIFY_CLOSE_REASON_CLIENT);
+
+ xfce_notify_gbus_complete_close_notification(skeleton, invocation);
return TRUE;
}
-static gboolean
-notify_get_server_information(XfceNotifyDaemon *xndaemon,
- gchar **OUT_name,
- gchar **OUT_vendor,
- gchar **OUT_version,
-#ifndef USE_OLD_GET_SERVER_INFORMATION_SIGNATURE
- gchar **OUT_spec_version,
-#endif
- GError **error)
+static gboolean notify_get_server_information (XfceNotifyGBus *skeleton,
+ GDBusMethodInvocation *invocation,
+ XfceNotifyDaemon *xndaemon)
{
- *OUT_name = g_strdup("Xfce Notify Daemon");
- *OUT_vendor = g_strdup("Xfce");
- *OUT_version = g_strdup(VERSION);
-#ifndef USE_OLD_GET_SERVER_INFORMATION_SIGNATURE
- *OUT_spec_version = g_strdup(NOTIFICATIONS_SPEC_VERSION);
-#endif
-
+ xfce_notify_gbus_complete_get_server_information(skeleton,
+ invocation,
+ "Xfce Notify Daemon",
+ "Xfce",
+ VERSION,
+ NOTIFICATIONS_SPEC_VERSION);
+
if (g_tree_nnodes(xndaemon->active_notifications) == 0) {
/* No active notifications, reset the close timeout */
if(xndaemon->close_timeout)
@@ -1051,63 +1142,72 @@ notify_get_server_information(XfceNotifyDaemon *xndaemon,
return TRUE;
}
-static gboolean
-notify_quit(XfceNotifyDaemon *xndaemon,
- GError **error)
+
+static void daemon_quit (XfceNotifyDaemon *xndaemon)
{
- gint i, main_level = gtk_main_level();
+ gint i, main_level = gtk_main_level();
for(i = 0; i < main_level; ++i)
gtk_main_quit();
+}
+
+
+static gboolean notify_quit (XfceNotifyOrgXfceNotifyd *skeleton,
+ GDBusMethodInvocation *invocation,
+ XfceNotifyDaemon *xndaemon)
+{
+ xfce_notify_org_xfce_notifyd_complete_quit (skeleton, invocation);
+ daemon_quit(xndaemon);
return TRUE;
}
+static gboolean
+xfce_notify_daemon_close_timeout(gpointer data)
+{
+ daemon_quit (XFCE_NOTIFY_DAEMON(data));
+ return FALSE;
+}
+
+
static GdkPixbuf *
-notify_pixbuf_from_image_data(const GValue *image_data)
+notify_pixbuf_from_image_data(GVariant *image_data)
{
GdkPixbuf *pix = NULL;
- GType struct_gtype;
gint32 width, height, rowstride, bits_per_sample, channels;
gboolean has_alpha;
- GArray *pixel_array;
+ GVariant *pixel_data;
gsize correct_len;
-
- struct_gtype = dbus_g_type_get_struct("GValueArray", G_TYPE_INT,
- G_TYPE_INT, G_TYPE_INT,
- G_TYPE_BOOLEAN, G_TYPE_INT,
- G_TYPE_INT,
- DBUS_TYPE_G_UCHAR_ARRAY,
- G_TYPE_INVALID);
- if(!G_VALUE_HOLDS(image_data, struct_gtype)) {
- g_message("Image data is not the correct type");
- return NULL;
- }
-
- if(!dbus_g_type_struct_get(image_data,
- 0, &width,
- 1, &height,
- 2, &rowstride,
- 3, &has_alpha,
- 4, &bits_per_sample,
- 5, &channels,
- 6, &pixel_array,
- G_MAXUINT))
+ guchar *data;
+
+ if (!g_variant_is_of_type (image_data, G_VARIANT_TYPE ("(iiibiiay)")))
{
- g_message("Unable to retrieve image data struct members");
- return NULL;
- }
+ g_warning ("Image data is not the correct type");
+ return NULL;
+ }
+
+ g_variant_get (image_data,
+ "(iiibii at ay)",
+ &width,
+ &height,
+ &rowstride,
+ &has_alpha,
+ &bits_per_sample,
+ &channels,
+ &pixel_data);
correct_len = (height - 1) * rowstride + width
* ((channels * bits_per_sample + 7) / 8);
- if(correct_len != pixel_array->len) {
- g_message("Pixel data length (%d) did not match expected value (%u)",
- pixel_array->len, (guint)correct_len);
+ if(correct_len != g_variant_get_size (pixel_data)) {
+ g_message ("Pixel data length (%lu) did not match expected value (%u)",
+ g_variant_get_size (pixel_data), (guint)correct_len);
return NULL;
}
+
+ data = (guchar *) g_memdup (g_variant_get_data (pixel_data),
+ g_variant_get_size (pixel_data));
- pix = gdk_pixbuf_new_from_data(g_memdup(pixel_array->data,
- pixel_array->len),
+ pix = gdk_pixbuf_new_from_data(data,
GDK_COLORSPACE_RGB, has_alpha,
bits_per_sample, width, height,
rowstride,
@@ -1201,50 +1301,10 @@ xfce_notify_daemon_settings_changed(XfconfChannel *channel,
}
}
-static gboolean
-xfce_notify_daemon_start(XfceNotifyDaemon *xndaemon,
- GError **error)
-{
- int ret;
- DBusError derror;
-
- xndaemon->dbus_conn = dbus_g_bus_get(DBUS_BUS_SESSION, error);
- if(G_UNLIKELY(!xndaemon->dbus_conn)) {
- if(error && !*error) {
- g_set_error(error, DBUS_GERROR, DBUS_GERROR_FAILED,
- _("Unable to connect to D-Bus session bus"));
- }
- return FALSE;
- }
-
- dbus_error_init(&derror);
- ret = dbus_bus_request_name(dbus_g_connection_get_connection(xndaemon->dbus_conn),
- "org.freedesktop.Notifications",
- DBUS_NAME_FLAG_DO_NOT_QUEUE,
- &derror);
- if(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
- if(dbus_error_is_set(&derror)) {
- if(error)
- dbus_set_g_error(error, &derror);
- dbus_error_free(&derror);
- } else if(error) {
- g_set_error(error, DBUS_GERROR, DBUS_GERROR_FAILED,
- _("Another notification xndaemon is already running"));
- }
-
- return FALSE;
- }
-
- dbus_g_connection_register_g_object(xndaemon->dbus_conn,
- "/org/freedesktop/Notifications",
- G_OBJECT(xndaemon));
-
- return TRUE;
-}
static gboolean
-xfce_notify_daemon_load_config(XfceNotifyDaemon *xndaemon,
- GError **error)
+xfce_notify_daemon_load_config (XfceNotifyDaemon *xndaemon,
+ GError **error)
{
gchar *theme;
@@ -1285,8 +1345,7 @@ xfce_notify_daemon_new_unique(GError **error)
{
XfceNotifyDaemon *xndaemon = g_object_new(XFCE_TYPE_NOTIFY_DAEMON, NULL);
- if(!xfce_notify_daemon_start(xndaemon, error)
- || !xfce_notify_daemon_load_config(xndaemon, error))
+ if(!xfce_notify_daemon_load_config(xndaemon, error))
{
g_object_unref(G_OBJECT(xndaemon));
return NULL;
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list