Description: Use synchronous notifications when they are supported
Author: ?
Index: gnome-settings-daemon-2.30.0/plugins/common/gsd-osd-notification.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gnome-settings-daemon-2.30.0/plugins/common/gsd-osd-notification.c 2010-04-23 17:05:08.862133020 +0100
@@ -0,0 +1,296 @@
+/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * gsd-osd-notification.c
+ * Copyright (C) 2010 Chris Coulson <chrisccoulson@ubuntu.com>
+ * Copyright (C) 2009 Canonical Ltd
+ *
+ * gsd-osd-notification.c 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * gsd-osd-notification.c 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/>.
+ */
+
+#include <libnotify/notify.h>
+#include "gsd-osd-notification.h"
+
+struct _GsdOsdNotificationPrivate
+{
+ NotifyNotification *notification;
+ char **icon_names;
+ char *hint;
+ guint icon_array_size;
+};
+
+#define GSD_OSD_NOTIFICATION_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_OSD_NOTIFICATION, GsdOsdNotificationPrivate))
+
+enum
+{
+ PROP_0,
+ PROP_ICON_NAMES,
+ PROP_HINT
+};
+
+static NotifyNotification *icon_only_notification = NULL;
+static gulong handler_id;
+
+#define NOTIFY_CAP_PRIVATE_SYNCHRONOUS "x-canonical-private-synchronous"
+#define NOTIFY_CAP_PRIVATE_ICON_ONLY "x-canonical-private-icon-only"
+#define NOTIFY_HINT_TRUE "true"
+
+G_DEFINE_TYPE (GsdOsdNotification, gsd_osd_notification, G_TYPE_OBJECT);
+
+static const char*
+_calculate_icon (GsdOsdNotification *notifier, guint value, gboolean muted)
+{
+ guint s;
+
+ s = (notifier->priv->icon_array_size -1) * value / 100 + 1;
+ s = MAX (s, 1);
+ s = MIN (s, notifier->priv->icon_array_size -1);
+ if (value <= 0)
+ s = 0;
+
+ return muted ? notifier->priv->icon_names[0] : notifier->priv->icon_names[s];
+}
+
+void
+gsd_osd_notification_set_icon_array (GsdOsdNotification *notifier, const char **icon_names)
+{
+ g_return_if_fail (GSD_IS_OSD_NOTIFICATION (notifier));
+
+ g_strfreev (notifier->priv->icon_names);
+ notifier->priv->icon_names = g_strdupv ((gchar **) icon_names);
+
+ notifier->priv->icon_array_size = g_strv_length ((gchar **) icon_names);
+}
+
+void
+gsd_osd_notification_set_hint (GsdOsdNotification *notifier, const char *hint)
+{
+ g_return_if_fail (GSD_IS_OSD_NOTIFICATION (notifier));
+
+ g_free (notifier->priv->hint);
+ notifier->priv->hint = g_strdup (hint);
+}
+
+gboolean
+gsd_osd_notification_is_supported (void)
+{
+ GList *caps;
+ gboolean has_cap;
+
+ caps = notify_get_server_caps ();
+ has_cap = (g_list_find_custom (caps, NOTIFY_CAP_PRIVATE_SYNCHRONOUS, (GCompareFunc) g_strcmp0) != NULL);
+ g_list_foreach (caps, (GFunc) g_free, NULL);
+ g_list_free (caps);
+
+ return has_cap;
+}
+
+static void
+notification_closed_cb (NotifyNotification *notification,
+ gpointer data)
+{
+ g_signal_handler_disconnect (icon_only_notification, handler_id);
+ g_object_unref (icon_only_notification);
+ icon_only_notification = NULL;
+}
+
+gboolean
+gsd_osd_notification_show_icon_only (const char *icon, const char *hint)
+{
+ g_return_val_if_fail (icon != NULL, FALSE);
+ g_return_val_if_fail (hint != NULL, FALSE);
+
+ if (!gsd_osd_notification_is_supported ())
+ return FALSE;
+
+ if (icon_only_notification == NULL) {
+ icon_only_notification = notify_notification_new (" ", "", icon);
+ notify_notification_set_hint_string (icon_only_notification, NOTIFY_CAP_PRIVATE_SYNCHRONOUS, hint);
+ notify_notification_set_hint_string (icon_only_notification, NOTIFY_CAP_PRIVATE_ICON_ONLY, NOTIFY_HINT_TRUE);
+ handler_id = g_signal_connect (icon_only_notification, "closed", G_CALLBACK (notification_closed_cb), NULL);
+ } else {
+ notify_notification_set_hint_string (icon_only_notification, NOTIFY_CAP_PRIVATE_SYNCHRONOUS, hint);
+ notify_notification_update (icon_only_notification, " ", "", icon);
+ }
+
+ if (!notify_notification_show (icon_only_notification, NULL)) {
+ g_signal_handler_disconnect (icon_only_notification, handler_id);
+ g_object_unref (icon_only_notification);
+ icon_only_notification = NULL;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean
+gsd_osd_notification_show_value (GsdOsdNotification *notifier, gint value, gboolean muted)
+{
+ const char *icon;
+
+ g_return_val_if_fail (GSD_IS_OSD_NOTIFICATION (notifier), FALSE);
+ g_return_val_if_fail (notifier->priv->icon_names != NULL, FALSE);
+ g_return_val_if_fail (notifier->priv->hint != NULL, FALSE);
+
+ if (!gsd_osd_notification_is_supported ())
+ return FALSE;
+
+ if (notifier->priv->notification == NULL) {
+ notifier->priv->notification = notify_notification_new (" ", "", NULL);
+ notify_notification_set_hint_string (notifier->priv->notification, NOTIFY_CAP_PRIVATE_SYNCHRONOUS, notifier->priv->hint);
+}
+ if (notifier->priv->notification != NULL) {
+ value = MIN (value, 101);
+ value = MAX (value, -1);
+ icon = _calculate_icon (notifier, value, muted);
+ notify_notification_set_hint_int32(notifier->priv->notification, "value", (muted && value > 0) ? 0 : value);
+ notify_notification_update (notifier->priv->notification, " ", "", icon);
+ } else {
+ return FALSE;
+ }
+
+ if (!notify_notification_show (notifier->priv->notification, NULL))
+ return FALSE;
+
+ return TRUE;
+}
+
+gboolean
+gsd_osd_notification_show_overshoot (GsdOsdNotification *notifier, GsdOsdNotifierOvershootType type)
+{
+ gint value;
+ gboolean muted;
+
+ g_return_val_if_fail (type == GSD_OSD_NOTIFICATION_UNDERSHOOT || type == GSD_OSD_NOTIFICATION_OVERSHOOT, FALSE);
+
+ switch (type)
+ {
+ case GSD_OSD_NOTIFICATION_UNDERSHOOT:
+ value = -1;
+ muted = TRUE;
+ break;
+ case GSD_OSD_NOTIFICATION_OVERSHOOT:
+ value = 101;
+ muted = FALSE;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ return gsd_osd_notification_show_value (notifier, value, muted);
+}
+
+GsdOsdNotification*
+gsd_osd_notification_new (const char **icon_names, const char *hint)
+{
+ return (GsdOsdNotification *) g_object_new (GSD_TYPE_OSD_NOTIFICATION,
+ "icon-names", icon_names,
+ "hint", hint,
+ NULL);
+}
+
+static void
+gsd_osd_notification_init (GsdOsdNotification *object)
+{
+ object->priv = GSD_OSD_NOTIFICATION_PRIVATE (object);
+
+ if (!notify_is_initted ())
+ notify_init (g_get_application_name ());
+
+ object->priv->hint = NULL;
+ object->priv->icon_names = NULL;
+ object->priv->notification = NULL;
+}
+
+static void
+gsd_osd_notification_finalize (GObject *object)
+{
+ GsdOsdNotification *notifier = GSD_OSD_NOTIFICATION (object);
+
+ g_strfreev (notifier->priv->icon_names);
+ g_free (notifier->priv->hint);
+
+ if (notifier->priv->notification)
+ g_object_unref (notifier->priv->notification);
+
+ G_OBJECT_CLASS (gsd_osd_notification_parent_class)->finalize (object);
+}
+
+static void
+gsd_osd_notification_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+ g_return_if_fail (GSD_IS_OSD_NOTIFICATION (object));
+ GsdOsdNotification *notifier = GSD_OSD_NOTIFICATION (object);
+
+ switch (prop_id)
+ {
+ case PROP_ICON_NAMES:
+ gsd_osd_notification_set_icon_array (notifier, (const char**) g_value_get_boxed (value));
+ break;
+ case PROP_HINT:
+ gsd_osd_notification_set_hint (notifier, g_value_get_string (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gsd_osd_notification_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+ g_return_if_fail (GSD_IS_OSD_NOTIFICATION (object));
+ GsdOsdNotification *notifier = GSD_OSD_NOTIFICATION (object);
+
+ switch (prop_id)
+ {
+ case PROP_ICON_NAMES:
+ g_value_set_boxed (value, notifier->priv->icon_names);
+ break;
+ case PROP_HINT:
+ g_value_set_string (value, notifier->priv->hint);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gsd_osd_notification_class_init (GsdOsdNotificationClass *klass)
+{
+ GObjectClass* object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = gsd_osd_notification_finalize;
+ object_class->set_property = gsd_osd_notification_set_property;
+ object_class->get_property = gsd_osd_notification_get_property;
+
+ g_object_class_install_property (object_class,
+ PROP_ICON_NAMES,
+ g_param_spec_boxed ("icon-names",
+ "Icon name array",
+ "An array of icon names for the notification",
+ G_TYPE_STRV,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (object_class,
+ PROP_HINT,
+ g_param_spec_string ("hint",
+ "Notification hint",
+ "Hint for the notification",
+ NULL,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+
+ g_type_class_add_private (klass, sizeof (GsdOsdNotificationPrivate));
+}
Index: gnome-settings-daemon-2.30.0/plugins/common/gsd-osd-notification.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gnome-settings-daemon-2.30.0/plugins/common/gsd-osd-notification.h 2010-04-23 17:05:08.862133020 +0100
@@ -0,0 +1,75 @@
+/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * gsd-osd-notification.c
+ * Copyright (C) 2010 Chris Coulson <chrisccoulson@ubuntu.com>
+ * Copyright (C) 2009 Canonical Ltd
+ *
+ * gsd-osd-notification.c 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * gsd-osd-notification.c 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/>.
+ */
+
+#ifndef _GSD_OSD_NOTIFICATION_H_
+#define _GSD_OSD_NOTIFICATION_H_
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GSD_TYPE_OSD_NOTIFICATION (gsd_osd_notification_get_type ())
+#define GSD_OSD_NOTIFICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSD_TYPE_OSD_NOTIFICATION, GsdOsdNotification))
+#define GSD_OSD_NOTIFICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSD_TYPE_OSD_NOTIFICATION, GsdOsdNotificationClass))
+#define GSD_IS_OSD_NOTIFICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSD_TYPE_OSD_NOTIFICATION))
+#define GSD_IS_OSD_NOTIFICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSD_TYPE_OSD_NOTIFICATION))
+#define GSD_OSD_NOTIFICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSD_TYPE_OSD_NOTIFICATION, GsdOsdNotificationClass))
+
+typedef struct _GsdOsdNotificationClass GsdOsdNotificationClass;
+typedef struct _GsdOsdNotification GsdOsdNotification;
+typedef struct _GsdOsdNotificationPrivate GsdOsdNotificationPrivate;
+
+struct _GsdOsdNotificationClass
+{
+ GObjectClass parent_class;
+};
+
+struct _GsdOsdNotification
+{
+ GObject parent_instance;
+
+ GsdOsdNotificationPrivate *priv;
+};
+
+typedef enum {
+ GSD_OSD_NOTIFICATION_NO_OVERSHOOT = 0,
+ GSD_OSD_NOTIFICATION_UNDERSHOOT,
+ GSD_OSD_NOTIFICATION_OVERSHOOT,
+} GsdOsdNotifierOvershootType;
+
+GType gsd_osd_notification_get_type (void) G_GNUC_CONST;
+GsdOsdNotification* gsd_osd_notification_new (const char **icon_names,
+ const char *hint);
+void gsd_osd_notification_set_icon_array (GsdOsdNotification *notifier,
+ const char **icon_names);
+void gsd_osd_notification_set_hint (GsdOsdNotification *notifier,
+ const char *hint);
+gboolean gsd_osd_notification_is_supported (void);
+gboolean gsd_osd_notification_show_value (GsdOsdNotification *notifier,
+ gint value,
+ gboolean muted);
+gboolean gsd_osd_notification_show_overshoot (GsdOsdNotification *notifier,
+ GsdOsdNotifierOvershootType type);
+gboolean gsd_osd_notification_show_icon_only (const char *icon,
+ const char *hint);
+
+G_END_DECLS
+
+#endif /* _GSD_OSD_NOTIFICATION_H_ */
Index: gnome-settings-daemon-2.30.0/plugins/media-keys/gsd-media-keys-manager.c
===================================================================
--- gnome-settings-daemon-2.30.0.orig/plugins/media-keys/gsd-media-keys-manager.c 2010-03-29 09:15:04.000000000 +0100
+++ gnome-settings-daemon-2.30.0/plugins/media-keys/gsd-media-keys-manager.c 2010-04-23 17:05:08.862133020 +0100
@@ -49,6 +49,7 @@
#include "eggaccelerators.h"
#include "acme.h"
#include "gsd-media-keys-window.h"
+#include "gsd-osd-notification.h"
#ifdef HAVE_PULSE
#include <canberra-gtk.h>
@@ -82,6 +83,7 @@
GtkWidget *dialog;
GConfClient *conf_client;
GVolumeMonitor *volume_monitor;
+ GsdOsdNotification *notifier;
/* Multihead stuff */
GdkScreen *current_screen;
@@ -108,6 +110,13 @@
static gpointer manager_object = NULL;
+static const char *volume_icons[] = {
+ "notification-audio-volume-muted",
+ "notification-audio-volume-low",
+ "notification-audio-volume-medium",
+ "notification-audio-volume-high",
+ NULL
+};
static void
init_screens (GsdMediaKeysManager *manager)
@@ -612,11 +621,13 @@
}
/* Show the dialogue */
- dialog_init (manager);
- gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
- "media-eject",
- FALSE);
- dialog_show (manager);
+ if (!gsd_osd_notification_show_icon_only ("notification-device-eject", "Eject")) {
+ dialog_init (manager);
+ gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
+ "media-eject",
+ FALSE);
+ dialog_show (manager);
+ }
/* Clean up the drive selection and exit if no suitable
* drives are found */
@@ -641,23 +652,44 @@
GConfClient *client = manager->priv->conf_client;
gboolean state = gconf_client_get_bool (client, TOUCHPAD_ENABLED_KEY, NULL);
- dialog_init (manager);
- gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
- (!state) ? "touchpad-enabled" : "touchpad-disabled",
- FALSE);
- dialog_show (manager);
+ if (!gsd_osd_notification_show_icon_only ((!state) ? "touchpad-enabled" : "touchpad-disabled", "Touchpad")) {
+ dialog_init (manager);
+ gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
+ (!state) ? "touchpad-enabled" : "touchpad-disabled",
+ FALSE);
+ dialog_show (manager);
+ }
gconf_client_set_bool (client, TOUCHPAD_ENABLED_KEY, !state, NULL);
}
#ifdef HAVE_PULSE
+play_volume_event_sound (GtkWidget *widget)
+{
+ ca_gtk_play_for_widget (widget, 0,
+ CA_PROP_EVENT_ID, "audio-volume-change",
+ CA_PROP_EVENT_DESCRIPTION, "volume changed hrough key press",
+ CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl",
+ NULL);
+}
+
static void
update_dialog (GsdMediaKeysManager *manager,
guint vol,
gboolean muted,
- gboolean sound_changed)
+ gboolean sound_changed,
+ GsdOsdNotifierOvershootType overshoot)
{
+ GtkWidget *window;
+
vol = (int) (100 * (double) vol / PA_VOLUME_NORM);
+ if (overshoot != GSD_OSD_NOTIFICATION_NO_OVERSHOOT) {
+ if (gsd_osd_notification_show_overshoot (manager->priv->notifier, overshoot))
+ goto done;
+ } else {
+ if (gsd_osd_notification_show_value (manager->priv->notifier, vol, muted))
+ goto done;
+ }
vol = CLAMP (vol, 0, 100);
dialog_init (manager);
@@ -668,12 +700,18 @@
GSD_MEDIA_KEYS_WINDOW_ACTION_VOLUME);
dialog_show (manager);
- if (sound_changed != FALSE && muted == FALSE)
- ca_gtk_play_for_widget (manager->priv->dialog, 0,
- CA_PROP_EVENT_ID, "audio-volume-change",
- CA_PROP_EVENT_DESCRIPTION, "volume changed through key press",
- CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl",
- NULL);
+done:
+ if (sound_changed != FALSE && muted == FALSE) {
+ if (manager->priv->dialog == NULL) {
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_screen (GTK_WINDOW (window), manager->priv->current_screen);
+ gtk_widget_realize (window);
+ play_volume_event_sound (window);
+ gtk_widget_destroy (window);
+ } else {
+ play_volume_event_sound (manager->priv->dialog);
+ }
+ }
}
static void
@@ -683,6 +721,7 @@
gboolean muted;
guint vol, norm_vol_step;
int vol_step;
+ GsdOsdNotifierOvershootType overshoot = GSD_OSD_NOTIFICATION_NO_OVERSHOOT;
gboolean sound_changed;
if (manager->priv->stream == NULL)
@@ -722,7 +761,10 @@
if (gvc_mixer_stream_set_volume (manager->priv->stream, vol) != FALSE) {
gvc_mixer_stream_push_volume (manager->priv->stream);
sound_changed = TRUE;
+ gvc_mixer_stream_push_volume (manager->priv->stream);
}
+ } else {
+ overshoot = GSD_OSD_NOTIFICATION_UNDERSHOOT;
}
break;
case VOLUME_UP_KEY:
@@ -750,12 +792,14 @@
gvc_mixer_stream_push_volume (manager->priv->stream);
sound_changed = TRUE;
}
+ } else {
+ overshoot = GSD_OSD_NOTIFICATION_OVERSHOOT;
}
}
break;
}
- update_dialog (manager, vol, muted, sound_changed);
+ update_dialog (manager, vol, muted, sound_changed, overshoot);
}
static void
@@ -900,8 +944,11 @@
static gboolean
do_multimedia_player_action (GsdMediaKeysManager *manager,
+ const char *icon,
const char *key)
{
+ if (icon != NULL)
+ gsd_osd_notification_show_icon_only (icon, key);
return gsd_media_player_key_pressed (manager, key);
}
@@ -972,19 +1019,19 @@
execute (manager, "gcalctool", FALSE, FALSE);
break;
case PLAY_KEY:
- return do_multimedia_player_action (manager, "Play");
+ return do_multimedia_player_action (manager, NULL, "Play");
break;
case PAUSE_KEY:
- return do_multimedia_player_action (manager, "Pause");
+ return do_multimedia_player_action (manager, NULL, "Pause");
break;
case STOP_KEY:
- return do_multimedia_player_action (manager, "Stop");
+ return do_multimedia_player_action (manager, NULL, "Stop");
break;
case PREVIOUS_KEY:
- return do_multimedia_player_action (manager, "Previous");
+ return do_multimedia_player_action (manager, NULL, "Previous");
break;
case NEXT_KEY:
- return do_multimedia_player_action (manager, "Next");
+ return do_multimedia_player_action (manager, NULL, "Next");
break;
default:
g_assert_not_reached ();
@@ -1121,6 +1168,8 @@
gvc_mixer_control_open (manager->priv->volume);
+ manager->priv->notifier = gsd_osd_notification_new (volume_icons, "volume");
+
gnome_settings_profile_end ("gvc_mixer_control_new");
#endif /* HAVE_PULSE */
g_idle_add ((GSourceFunc) start_media_keys_idle_cb, manager);
@@ -1218,6 +1267,9 @@
}
g_list_free (priv->media_players);
priv->media_players = NULL;
+
+ if (manager->priv->notifier != NULL)
+ g_object_unref (manager->priv->notifier);
}
static void
Index: gnome-settings-daemon-2.30.0/plugins/common/Makefile.am
===================================================================
--- gnome-settings-daemon-2.30.0.orig/plugins/common/Makefile.am 2010-03-10 11:59:38.000000000 +0000
+++ gnome-settings-daemon-2.30.0/plugins/common/Makefile.am 2010-04-23 17:10:43.209632216 +0100
@@ -7,17 +7,21 @@
gsd-keygrab.c \
gsd-keygrab.h \
gsd-osd-window.c \
- gsd-osd-window.h
+ gsd-osd-window.h \
+ gsd-osd-notification.c \
+ gsd-osd-notification.h
libcommon_la_CPPFLAGS = \
$(AM_CPPFLAGS)
libcommon_la_CFLAGS = \
$(SETTINGS_PLUGIN_CFLAGS) \
+ $(LIBNOTIFY_CFLAGS) \
$(AM_CFLAGS)
libcommon_la_LDFLAGS = \
$(GSD_PLUGIN_LDFLAGS) $(X11_LIBS)
libcommon_la_LIBADD = \
- $(SETTINGS_PLUGIN_LIBS)
+ $(SETTINGS_PLUGIN_LIBS) \
+ $(LIBNOTIFY_LIBS)