Updating branch refs/heads/jannis/port-to-udev to 4f03b5d3d44b9dc43a98b63747b2a4a14a05e27a (commit) from 79ca8dd4917d52bd4b8a3369409dd64f8e5520ce (commit)
commit 4f03b5d3d44b9dc43a98b63747b2a4a14a05e27a Author: Jannis Pohlmann <jan...@xfce.org> Date: Sun Jan 17 03:11:05 2010 +0100 Use GUDev and sysfs paths to spawn thunar-volman on udev events. configure.in.in | 37 ++++++++---- thunar/Makefile.am | 7 ++- thunar/thunar-application.c | 137 ++++++++++++++++++++++++------------------- 3 files changed, 106 insertions(+), 75 deletions(-) diff --git a/configure.in.in b/configure.in.in index d4cbc5d..0f92f38 100644 --- a/configure.in.in +++ b/configure.in.in @@ -171,6 +171,12 @@ XDT_CHECK_OPTIONAL_PACKAGE([LIBSTARTUP_NOTIFICATION], [0.4], [startup-notification], [startup notification library]) +dnl *************************************************************** +dnl *** Optional support for GUDev (required for thunar-volman) *** +dnl *************************************************************** +XDT_CHECK_OPTIONAL_PACKAGE([GUDEV], [gudev-1.0], [145], [gudev], + [GUDev (required for thunar-volman)]) + dnl ************************* dnl *** Check for gtk-doc *** dnl ************************* @@ -288,28 +294,33 @@ echo echo "Build Configuration:" echo if test x"$DBUS_FOUND" = x"yes"; then -echo "* D-BUS support: yes" +echo "* D-BUS support: yes" else -echo "* D-BUS support: no" +echo "* D-BUS support: no" fi if test x"$GIO_UNIX_FOUND" = x"yes"; then -echo "* GIO UNIX features: yes" +echo "* GIO UNIX features: yes" else -echo "* GIO UNIX features: no" +echo "* GIO UNIX features: no" fi if test x"$LIBSTARTUP_NOTIFICATION_FOUND" = x"yes"; then -echo "* Startup Notification: yes" +echo "* Startup Notification: yes" +else +echo "* Startup Notification: no" +fi +if test x"$GUDEV_FOUND" = x"yes"; then +echo "* GUDev (required for thunar-volman): yes" else -echo "* Startup Notification: no" +echo "* GUDev (required for thunar-volman): no" fi -echo "* Debug Support: $enable_debug" -echo "* Generate Documentation: $enable_gen_doc" +echo "* Debug Support: $enable_debug" +echo "* Generate Documentation: $enable_gen_doc" echo echo "Additional Plugins:" echo -echo "* Advanced Properties: $ac_bm_thunar_plugin_apr" -echo "* Simple Builting Renamers: $ac_bm_thunar_plugin_sbr" -echo "* Trash Panel Applet: $ac_bm_thunar_plugin_tpa" -echo "* User Customizable Actions: $ac_bm_thunar_plugin_uca" -echo "* Wallpaper support: $ac_bm_thunar_plugin_wallpaper" +echo "* Advanced Properties: $ac_bm_thunar_plugin_apr" +echo "* Simple Builting Renamers: $ac_bm_thunar_plugin_sbr" +echo "* Trash Panel Applet: $ac_bm_thunar_plugin_tpa" +echo "* User Customizable Actions: $ac_bm_thunar_plugin_uca" +echo "* Wallpaper support: $ac_bm_thunar_plugin_wallpaper" echo diff --git a/thunar/Makefile.am b/thunar/Makefile.am index 6c5b20c..436933d 100644 --- a/thunar/Makefile.am +++ b/thunar/Makefile.am @@ -12,6 +12,7 @@ INCLUDES = \ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \ -DTHUNAR_VERSION_API=\"$(THUNAR_VERSION_API)\" \ -DSN_API_NOT_YET_FROZEN \ + -DG_UDEV_API_IS_SUBJECT_TO_CHANGE \ $(PLATFORM_CPPFLAGS) bin_SCRIPTS = \ @@ -219,8 +220,9 @@ Thunar_SOURCES = \ Thunar_CFLAGS = \ $(EXO_CFLAGS) \ - $(GTHREAD_CFLAGS) \ $(GIO_CFLAGS) \ + $(GTHREAD_CFLAGS) \ + $(GUDEV_CFLAGS) \ $(LIBSM_CFLAGS) \ $(LIBSTARTUP_NOTIFICATION_CFLAGS) \ $(LIBXFCE4UI_CFLAGS) \ @@ -235,8 +237,9 @@ Thunar_LDADD = \ $(top_builddir)/tdb/libtdb.la \ $(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la \ $(EXO_LIBS) \ - $(GTHREAD_LIBS) \ $(GIO_LIBS) \ + $(GTHREAD_LIBS) \ + $(GUDEV_LIBS) \ $(LIBSTARTUP_NOTIFICATION_LIBS) \ $(LIBSM_LIBS) \ $(LIBXFCE4UI_LIBS) diff --git a/thunar/thunar-application.c b/thunar/thunar-application.c index cf45b2e..b3709bc 100644 --- a/thunar/thunar-application.c +++ b/thunar/thunar-application.c @@ -36,6 +36,10 @@ #include <time.h> #endif +#ifdef HAVE_GUDEV +#include <gudev/gudev.h> +#endif + #include <libxfce4ui/libxfce4ui.h> #include <thunar/thunar-application.h> @@ -94,21 +98,23 @@ static void thunar_application_launch (ThunarApplicati GClosure *new_files_closure); static void thunar_application_window_destroyed (GtkWidget *window, ThunarApplication *application); -static void thunar_application_drive_connected (GVolumeMonitor *volume_monitor, - GDrive *drive, - ThunarApplication *application); -static void thunar_application_drive_disconnected (GVolumeMonitor *volume_monitor, - GDrive *drive, +#ifdef HAVE_GUDEV +static void thunar_application_uevent (GUdevClient *client, + const gchar *action, + GUdevDevice *device, ThunarApplication *application); +#if 0 static void thunar_application_drive_eject (GVolumeMonitor *volume_monitor, GDrive *drive, ThunarApplication *application); +#endif static gboolean thunar_application_volman_idle (gpointer user_data); static void thunar_application_volman_idle_destroy (gpointer user_data); static void thunar_application_volman_watch (GPid pid, gint status, gpointer user_data); static void thunar_application_volman_watch_destroy (gpointer user_data); +#endif static gboolean thunar_application_show_dialogs (gpointer user_data); static void thunar_application_show_dialogs_destroy (gpointer user_data); static void thunar_application_process_files (ThunarApplication *application); @@ -132,11 +138,13 @@ struct _ThunarApplication guint show_dialogs_timer_id; - GVolumeMonitor *volume_monitor; +#ifdef HAVE_GUDEV + GUdevClient *udev_client; GSList *volman_udis; guint volman_idle_id; guint volman_watch_id; +#endif GList *files_to_launch; }; @@ -191,7 +199,10 @@ thunar_application_class_init (ThunarApplicationClass *klass) static void thunar_application_init (ThunarApplication *application) { - gchar *path; +#ifdef HAVE_GUDEV + static const gchar *subsystems[] = { "block", "input", NULL }; +#endif + gchar *path; /* initialize the application */ application->preferences = thunar_preferences_get (); @@ -208,13 +219,23 @@ thunar_application_init (ThunarApplication *application) g_free (path); } +#ifdef HAVE_GUDEV +#if 0 /* connect to the volume manager */ application->volume_monitor = g_volume_monitor_get (); /* connect the volume manager support callbacks (used to spawn thunar-volman appropriately) */ - g_signal_connect (application->volume_monitor, "drive-connected", G_CALLBACK (thunar_application_drive_connected), application); - g_signal_connect (application->volume_monitor, "drive-disconnected", G_CALLBACK (thunar_application_drive_disconnected), application); g_signal_connect (application->volume_monitor, "drive-eject-button", G_CALLBACK (thunar_application_drive_eject), application); +#endif + + /* establish connection with udev */ + application->udev_client = g_udev_client_new (subsystems); + + /* connect to the client in order to be notified when devices are plugged in + * or disconnected from the computer */ + g_signal_connect (application->udev_client, "uevent", + G_CALLBACK (thunar_application_uevent), application); +#endif } @@ -238,6 +259,7 @@ thunar_application_finalize (GObject *object) g_free (path); } +#ifdef HAVE_GUDEV /* cancel any pending volman watch source */ if (G_UNLIKELY (application->volman_watch_id != 0)) g_source_remove (application->volman_watch_id); @@ -250,8 +272,14 @@ thunar_application_finalize (GObject *object) g_slist_foreach (application->volman_udis, (GFunc) g_free, NULL); g_slist_free (application->volman_udis); +#if 0 /* disconnect from the volume monitor */ g_object_unref (application->volume_monitor); +#endif + + /* disconnect from the udev client */ + g_object_unref (application->udev_client); +#endif /* drop any running "show dialogs" timer */ if (G_UNLIKELY (application->show_dialogs_timer_id != 0)) @@ -464,79 +492,66 @@ thunar_application_window_destroyed (GtkWidget *window, +#ifdef HAVE_GUDEV static void -thunar_application_drive_connected (GVolumeMonitor *volume_monitor, - GDrive *drive, - ThunarApplication *application) +thunar_application_uevent (GUdevClient *client, + const gchar *action, + GUdevDevice *device, + ThunarApplication *application) { - gchar *udi = NULL; + const gchar *sysfs_path; + GSList *lp; - _thunar_return_if_fail (G_IS_VOLUME_MONITOR (volume_monitor)); - _thunar_return_if_fail (application->volume_monitor == volume_monitor); - _thunar_return_if_fail (G_IS_DRIVE (drive)); + _thunar_return_if_fail (G_UDEV_IS_CLIENT (client)); + _thunar_return_if_fail (action != NULL && *action != '\0'); + _thunar_return_if_fail (G_UDEV_IS_DEVICE (device)); _thunar_return_if_fail (THUNAR_IS_APPLICATION (application)); + _thunar_return_if_fail (client == application->udev_client); - /* determine the HAL UDI for this drive */ - udi = g_drive_get_identifier (drive, G_VOLUME_IDENTIFIER_KIND_HAL_UDI); + /* determine the sysfs path of the device */ + sysfs_path = g_udev_device_get_sysfs_path (device); - /* check if we have a UDI */ - if (G_LIKELY (udi != NULL)) + /* distinguish between "add" and "remove" actions, ignore "change" and "move" */ + if (g_strcmp0 (action, "add") == 0) { - /* only insert the UDI if we don't have it already. free it otherwise */ - if (g_slist_find_custom (application->volman_udis, udi, (GCompareFunc) g_utf8_collate) == NULL) - application->volman_udis = g_slist_prepend (application->volman_udis, udi); - else - g_free (udi); - } + /* only insert the path if we don't have it already */ + if (g_slist_find_custom (application->volman_udis, sysfs_path, + (GCompareFunc) g_utf8_collate) == NULL) + { + application->volman_udis = g_slist_prepend (application->volman_udis, + g_strdup (sysfs_path)); - /* check if there's currently no active or scheduled handler */ - if (G_LIKELY (application->volman_idle_id == 0 && application->volman_watch_id == 0)) - { - /* schedule a new handler using the idle source, which invokes the handler */ - application->volman_idle_id = g_idle_add_full (G_PRIORITY_LOW, thunar_application_volman_idle, - application, thunar_application_volman_idle_destroy); + /* check if there's currently no active or scheduled handler */ + if (G_LIKELY (application->volman_idle_id == 0 + && application->volman_watch_id == 0)) + { + /* schedule a new handler using the idle source, which invokes the handler */ + application->volman_idle_id = + g_idle_add_full (G_PRIORITY_LOW, thunar_application_volman_idle, + application, thunar_application_volman_idle_destroy); + } + } } -} - - - -static void -thunar_application_drive_disconnected (GVolumeMonitor *volume_monitor, - GDrive *drive, - ThunarApplication *application) -{ - GSList *lp; - gchar *udi; - - _thunar_return_if_fail (G_IS_VOLUME_MONITOR (volume_monitor)); - _thunar_return_if_fail (application->volume_monitor == volume_monitor); - _thunar_return_if_fail (G_IS_DRIVE (drive)); - _thunar_return_if_fail (THUNAR_IS_APPLICATION (application)); - - /* determine the HAL UDI for this drive */ - udi = g_drive_get_identifier (drive, G_VOLUME_IDENTIFIER_KIND_HAL_UDI); - - /* check if we have a UDI */ - if (G_LIKELY (udi != NULL)) + else if (g_strcmp0 (action, "remove") == 0) { - /* look for the UDI in the list of pending UDIs */ - lp = g_slist_find_custom (application->volman_udis, udi, (GCompareFunc) g_utf8_collate); + /* look for the sysfs path in the list of pending paths */ + lp = g_slist_find_custom (application->volman_udis, sysfs_path, + (GCompareFunc) g_utf8_collate); if (G_LIKELY (lp != NULL)) { - /* free the UDI string */ + /* free the sysfs path string */ g_free (lp->data); - /* drop the UDI from the list of pending device UDIs */ + /* drop the sysfs path from the list of pending device paths */ application->volman_udis = g_slist_delete_link (application->volman_udis, lp); } - - g_free (udi); } } +#if 0 static void thunar_application_drive_eject (GVolumeMonitor *volume_monitor, GDrive *drive, @@ -583,6 +598,7 @@ thunar_application_drive_eject (GVolumeMonitor *volume_monitor, g_free (udi); } } +#endif @@ -694,6 +710,7 @@ thunar_application_volman_watch_destroy (gpointer user_data) { THUNAR_APPLICATION (user_data)->volman_watch_id = 0; } +#endif /* HAVE_GUDEV */ _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits