Author: nick
Date: 2008-07-18 13:50:35 +0000 (Fri, 18 Jul 2008)
New Revision: 27338
Modified:
xfce4-settings/trunk/ChangeLog
xfce4-settings/trunk/dialogs/mouse-settings/main.c
xfce4-settings/trunk/xfce4-settings-helper/Makefile.am
xfce4-settings/trunk/xfce4-settings-helper/pointers.c
Log:
* dialogs/mouse-settings/main.c, xfce4-settings-helper/pointers.c,
xfce4-settings-helper/Makefile.am: Show a notification when a
mouse device is added. Notifications has a button to open
the settings dialog, which will select the new device (if possible).
Modified: xfce4-settings/trunk/ChangeLog
===================================================================
--- xfce4-settings/trunk/ChangeLog 2008-07-18 11:34:38 UTC (rev 27337)
+++ xfce4-settings/trunk/ChangeLog 2008-07-18 13:50:35 UTC (rev 27338)
@@ -1,5 +1,12 @@
2008-07-18 Nick Schermer <[EMAIL PROTECTED]>
+ * dialogs/mouse-settings/main.c, xfce4-settings-helper/pointers.c,
+ xfce4-settings-helper/Makefile.am: Show a notification when a
+ mouse device is added. Notifications has a button to open
+ the settings dialog, which will select the new device (if possible).
+
+2008-07-18 Nick Schermer <[EMAIL PROTECTED]>
+
* dialogs/mouse-settings/main.c: Properly fix previous commit. Also
make the code more readable.
Modified: xfce4-settings/trunk/dialogs/mouse-settings/main.c
===================================================================
--- xfce4-settings/trunk/dialogs/mouse-settings/main.c 2008-07-18 11:34:38 UTC
(rev 27337)
+++ xfce4-settings/trunk/dialogs/mouse-settings/main.c 2008-07-18 13:50:35 UTC
(rev 27338)
@@ -79,9 +79,11 @@
/* option entries */
static gboolean opt_version = FALSE;
+static gchar *opt_device_name = NULL;
static GOptionEntry option_entries[] =
{
- { "version", 'v', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_version,
N_("Version information"), NULL },
+ { "version", 'v', 0, G_OPTION_ARG_NONE, &opt_version, N_("Version
information"), NULL },
+ { "device", 'd', 0, G_OPTION_ARG_STRING, &opt_device_name, N_("Active
device in the dialog"), N_("[NAME..]") },
{ NULL }
};
@@ -788,7 +790,7 @@
GtkTreeIter iter;
GtkListStore *store;
GtkWidget *treeview;
- GtkTreePath *path;
+ GtkTreePath *path = NULL;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
GtkTreeSelection *selection;
@@ -868,6 +870,14 @@
COLUMN_DEVICE_XID,
device_info->id,
COLUMN_DEVICE_NBUTTONS,
num_buttons, -1);
+ /* check if we should select this device */
+ if (opt_device_name && strcmp (opt_device_name, device_info->name)
== 0)
+ {
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
+ g_free (opt_device_name);
+ opt_device_name = NULL;
+ }
+
/* cleanup */
g_free (device_name);
g_free (display_name);
@@ -884,11 +894,9 @@
{
/* set the treeview model */
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL
(store));
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
COLUMN_DEVICE_XID, GTK_SORT_ASCENDING);
#if GTK_CHECK_VERSION (2, 12, 0)
gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview),
COLUMN_DEVICE_DISPLAY_NAME);
#endif
- g_object_unref (G_OBJECT (store));
/* icon renderer */
renderer = gtk_cell_renderer_pixbuf_new ();
@@ -907,11 +915,19 @@
g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK
(mouse_settings_device_selection_changed), gxml);
}
- /* select the first mouse in the tree */
- path = gtk_tree_path_new_first ();
+ /* select the mouse in the tree */
+ if (G_LIKELY (path == NULL))
+ path = gtk_tree_path_new_first ();
gtk_tree_selection_select_path (selection, path);
gtk_tree_path_free (path);
+ /* sort after selecting the path */
+ if (G_LIKELY (create_store))
+ {
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
COLUMN_DEVICE_XID, GTK_SORT_ASCENDING);
+ g_object_unref (G_OBJECT (store));
+ }
+
/* unlock */
locked--;
}
@@ -1113,6 +1129,12 @@
if (G_LIKELY (pointers_channel && xsettings_channel))
{
+#if HAVE_LIBNOTIFY
+ /* this is a property we use for notifications, make sure it's there
so users van change it */
+ if (!xfconf_channel_has_property (pointers_channel,
"/ShowNotifications"))
+ xfconf_channel_set_bool (pointers_channel, "/ShowNotifications",
TRUE);
+#endif /* !HAVE_LIBNOTIFY */
+
/* load the glade xml file */
gxml = glade_xml_new_from_buffer (mouse_dialog_glade,
mouse_dialog_glade_length, NULL, NULL);
if (G_LIKELY (gxml))
@@ -1258,5 +1280,8 @@
/* shutdown xfconf */
xfconf_shutdown ();
+ /* cleanup */
+ g_free (opt_device_name);
+
return EXIT_SUCCESS;
}
Modified: xfce4-settings/trunk/xfce4-settings-helper/Makefile.am
===================================================================
--- xfce4-settings/trunk/xfce4-settings-helper/Makefile.am 2008-07-18
11:34:38 UTC (rev 27337)
+++ xfce4-settings/trunk/xfce4-settings-helper/Makefile.am 2008-07-18
13:50:35 UTC (rev 27338)
@@ -3,6 +3,7 @@
INCLUDES = \
-I${top_srcdir} \
-DDATADIR=\"$(datadir)\" \
+ -DBINDIR=\"$(bindir)\" \
-DSRCDIR=\"$(top_srcdir)\" \
-DLOCALEDIR=\"$(localedir)\" \
-DG_LOG_DOMAIN=\"xfce4-settings-helper\" \
Modified: xfce4-settings/trunk/xfce4-settings-helper/pointers.c
===================================================================
--- xfce4-settings/trunk/xfce4-settings-helper/pointers.c 2008-07-18
11:34:38 UTC (rev 27337)
+++ xfce4-settings/trunk/xfce4-settings-helper/pointers.c 2008-07-18
13:50:35 UTC (rev 27338)
@@ -32,11 +32,15 @@
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <xfconf/xfconf.h>
+#include <libxfce4util/libxfce4util.h>
#ifdef HAVE_HAL
#include <dbus/dbus.h>
#include <dbus/dbus-glib-lowlevel.h>
#include <hal/libhal.h>
+#if HAVE_LIBNOTIFY
+#include <libnotify/notify.h>
+#endif /* !HAVE_LIBNOTIFY */
#endif /* !HAVE_HAL */
#include "pointers.h"
@@ -72,6 +76,13 @@
const
gchar *property_name,
const
GValue *value);
#ifdef HAVE_HAL
+#if HAVE_LIBNOTIFY
+static void xfce_pointers_helper_notification_closed
(NotifyNotification *notification,
+
XfcePointersHelper *helper);
+static void xfce_pointers_helper_notification_clicked
(NotifyNotification *notification,
+ gchar
*action,
+ gpointer
user_data);
+#endif /* !HAVE_LIBNOTIFY */
static gboolean xfce_pointers_helper_device_added_timeout (gpointer
user_data);
static void xfce_pointers_helper_device_added_timeout_destroyed (gpointer
user_data);
static void xfce_pointers_helper_device_added
(LibHalContext *context,
@@ -90,17 +101,24 @@
GObject __parent__;
/* xfconf channel */
- XfconfChannel *channel;
+ XfconfChannel *channel;
#ifdef HAVE_HAL
/* timeout for adding hal devices */
- guint timeout_id;
+ guint timeout_id;
/* dbus connection */
- DBusConnection *connection;
+ DBusConnection *connection;
/* hal context */
- LibHalContext *context;
+ LibHalContext *context;
+
+ /* last plugged device name */
+ gchar *last_device;
+
+#ifdef HAVE_LIBNOTIFY
+ NotifyNotification *notification;
+#endif /* !HAVE_LIBNOTIFY */
#endif /* !HAVE_HAL */
};
@@ -133,6 +151,10 @@
helper->timeout_id = 0;
helper->context = NULL;
helper->connection = NULL;
+ helper->last_device = NULL;
+#ifdef HAVE_LIBNOTIFY
+ helper->notification = NULL;
+#endif /* !HAVE_LIBNOTIFY */
#endif /* !HAVE_HAL */
if (XQueryExtension (GDK_DISPLAY (), "XInputExtension", &dummy, &dummy,
&dummy))
@@ -147,6 +169,11 @@
g_signal_connect (G_OBJECT (helper->channel), "property-changed",
G_CALLBACK (xfce_pointers_helper_channel_property_changed), NULL);
#ifdef HAVE_HAL
+#ifdef HAVE_LIBNOTIFY
+ /* setup a connection with the notification daemon */
+ if (!notify_init ("xfce4-settings-helper"))
+ g_critical ("Failed to connect to the notification daemon.");
+#endif /* !HAVE_LIBNOTIFY */
/* initialize the dbus error variable */
dbus_error_init (&derror);
@@ -222,6 +249,15 @@
/* release the dbus connection */
if (G_LIKELY (helper->connection))
dbus_connection_unref (helper->connection);
+
+ /* cleanup last device name */
+ g_free (helper->last_device);
+
+#ifdef HAVE_LIBNOTIFY
+ /* close an opened notification */
+ if (G_UNLIKELY (helper->notification))
+ notify_notification_close (helper->notification, NULL);
+#endif /* !HAVE_LIBNOTIFY */
#endif /* !HAVE_HAL */
/* release the channel */
@@ -591,6 +627,49 @@
#ifdef HAVE_HAL
+#if HAVE_LIBNOTIFY
+static void
+xfce_pointers_helper_notification_closed (NotifyNotification *notification,
+ XfcePointersHelper *helper)
+{
+ g_return_if_fail (helper->notification == notification);
+
+ /* set to null */
+ helper->notification = NULL;
+}
+
+
+
+static void
+xfce_pointers_helper_notification_clicked (NotifyNotification *notification,
+ gchar *action,
+ gpointer user_data)
+{
+ XfcePointersHelper *helper = XFCE_POINTERS_HELPER (user_data);
+ GError *error = NULL;
+ gchar *command;
+ const gchar *path = BINDIR G_DIR_SEPARATOR_S "xfce4-mouse-settings";
+
+ /* build a command */
+ if (G_LIKELY (helper->last_device))
+ command = g_strdup_printf ("%s -d '%s'", path, helper->last_device);
+ else
+ command = g_strdup (path);
+
+ /* try to spwn the xfce4-mouse-setting dialog */
+ if (!g_spawn_command_line_async (command, &error))
+ {
+ g_critical ("Failed to spawn the mouse settings dialog: %s",
error->message);
+ g_error_free (error);
+ }
+
+ /* cleanup */
+ g_free (command);
+}
+#endif /* !HAVE_LIBNOTIFY */
+
+
+
static gboolean
xfce_pointers_helper_device_added_timeout (gpointer user_data)
{
@@ -601,6 +680,36 @@
/* restore the devices */
xfce_pointers_helper_restore_devices (helper);
+#if HAVE_LIBNOTIFY
+ /* show a notification */
+ if (xfconf_channel_get_bool (helper->channel, "/ShowNotifications", TRUE)
+ && notify_is_initted ())
+ {
+ if (helper->notification == NULL)
+ {
+ /* create a new notification */
+ helper->notification = notify_notification_new (_("New Mouse
Device"), _("A new mouse device has been plugged. Click the button "
+ "below to
configure the new device."), "input-mouse", NULL);
+ g_signal_connect (G_OBJECT (helper->notification), "closed",
G_CALLBACK (xfce_pointers_helper_notification_closed), helper);
+ notify_notification_add_action (helper->notification, "configure",
_("Open Mouse Settings Dialog"), xfce_pointers_helper_notification_clicked,
helper, NULL);
+ }
+
+ /* show the notification for (another) 4 seconds */
+ notify_notification_set_timeout (helper->notification, 4000);
+
+ /* show the notification */
+ if (!notify_notification_show (helper->notification, NULL))
+ {
+ /* show warning with the notification information */
+ g_warning ("Failed to show notification: %s", _("New Mouse
Device"));
+
+ /* failed to show the notification */
+ notify_notification_close (helper->notification, NULL);
+ helper->notification = NULL;
+ }
+ }
+#endif /* !HAVE_LIBNOTIFY */
+
GDK_THREADS_LEAVE ();
return FALSE;
@@ -611,8 +720,10 @@
static void
xfce_pointers_helper_device_added_timeout_destroyed (gpointer user_data)
{
+ XfcePointersHelper *helper = XFCE_POINTERS_HELPER (user_data);
+
/* reset the timeout id */
- XFCE_POINTERS_HELPER (user_data)->timeout_id = 0;
+ helper->timeout_id = 0;
}
@@ -627,9 +738,13 @@
helper = libhal_ctx_get_user_data (context);
/* check if an input device has been added and no timeout is running */
- if (libhal_device_query_capability (context, udi, "input", NULL)
+ if (libhal_device_query_capability (context, udi, "input.mouse", NULL)
&& helper->timeout_id == 0)
{
+ /* set the device name */
+ g_free (helper->last_device);
+ helper->last_device = libhal_device_get_property_string (context, udi,
"info.product", NULL);
+
/* queue a new timeout */
helper->timeout_id = g_timeout_add_full (G_PRIORITY_LOW, 1000,
xfce_pointers_helper_device_added_timeout,
helper,
xfce_pointers_helper_device_added_timeout_destroyed);
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits