[Goodies-commits] r4667 - in xfburn/trunk: . xfburn

David Mohr squisher at xfce.org
Thu Apr 24 01:16:49 CEST 2008


Author: squisher
Date: 2008-04-23 23:16:49 +0000 (Wed, 23 Apr 2008)
New Revision: 4667

Modified:
   xfburn/trunk/NEWS
   xfburn/trunk/TODO
   xfburn/trunk/configure.in.in
   xfburn/trunk/xfburn/Makefile.am
   xfburn/trunk/xfburn/xfburn-device-box.c
   xfburn/trunk/xfburn/xfburn-device-list.c
   xfburn/trunk/xfburn/xfburn-hal-manager.c
   xfburn/trunk/xfburn/xfburn-hal-manager.h
Log:
Finished XfburnHalManager, device box now gets updated by hal when the drive status changes

Modified: xfburn/trunk/NEWS
===================================================================
--- xfburn/trunk/NEWS	2008-04-23 23:16:31 UTC (rev 4666)
+++ xfburn/trunk/NEWS	2008-04-23 23:16:49 UTC (rev 4667)
@@ -15,6 +15,7 @@
 - Add new icons based on icons from the Tango icontheme
 - List columns are resizable now (bug #2930)
 - Disable "Burn composition" button where there is no files in composition
+- Use HAL to update disc status when a disc is inserted / removed
 
 xfburn 0.2.0beta
 ================

Modified: xfburn/trunk/TODO
===================================================================
--- xfburn/trunk/TODO	2008-04-23 23:16:31 UTC (rev 4666)
+++ xfburn/trunk/TODO	2008-04-23 23:16:49 UTC (rev 4667)
@@ -19,7 +19,7 @@
 - fix available writing speeds detection
   - and sort them [DONE]
 - implement means to calculate available write speeds at the right moment
-  (when the disk is inserted) - requires a lot of UI thinking 
+  (when the disk is inserted) - requires a lot of UI thinking [DONE]
 - only allow usage of drives with matching capabilities
   - when burning ISO image, only show drives capable of 
     burning to desired disk, or report that we cannot
@@ -35,7 +35,7 @@
 - recode copy disk with libburn
 - update columns resizing by using column enum index
 - disable burn buttons before proper image file is selected [DONE]
-- take advantage of gvfs in addition to thunar-vfs
+- take advantage of gvfs in addition to thunar-vfs until thunar-vfs gets deprecated
 - disable device selection before image is selected
   - once image is selected, populate device selection box
     only with appropriate devices (i.e. if it's 1200MB image,
@@ -45,4 +45,6 @@
 - inform user in red label if no image has been selected [DONE]
 - Erase disc should work for all RW discs
 - hide disc status in blank dialog
-- refresh disc status after blanking is done
+  - rather, display correct disc status [DONE]
+  - add refresh button and disable blank if invalid disc
+- refresh disc status after blanking is done [DONE]

Modified: xfburn/trunk/configure.in.in
===================================================================
--- xfburn/trunk/configure.in.in	2008-04-23 23:16:31 UTC (rev 4666)
+++ xfburn/trunk/configure.in.in	2008-04-23 23:16:49 UTC (rev 4667)
@@ -10,7 +10,7 @@
 
 dnl Initialize autoconf
 AC_COPYRIGHT([Copyright (c) 2005-2008 Jean-François Wauthy <pollux at xfce.org>])
-AC_INIT([xfburn], [xfburn_version], [pollux at xfce.org])
+AC_INIT([xfburn], [xfburn_version], [xfburn at xfce.org])
 
 dnl Initialize automake
 AM_INIT_AUTOMAKE([AC_PACKAGE_TARNAME()], [AC_PACKAGE_VERSION()])
@@ -40,6 +40,13 @@
 			[Disable the use of Thunar's VFS layer to show mime type and icons in file browser]))
 AM_CONDITIONAL([HAVE_THUNAR_VFS], [test "x$THUNAR_VFS_FOUND" = "xyes"])
 
+dnl **********************************
+dnl *** Optional support for D-BUS ***
+dnl **********************************
+dnl (taken from thunar-0.8.0)
+XDT_CHECK_OPTIONAL_PACKAGE([DBUS], [dbus-glib-1],
+                           [0.34], [dbus], [D-BUS support])
+
 dnl ********************************
 dnl *** Check for HAL (optional) ***
 dnl ********************************

Modified: xfburn/trunk/xfburn/Makefile.am
===================================================================
--- xfburn/trunk/xfburn/Makefile.am	2008-04-23 23:16:31 UTC (rev 4666)
+++ xfburn/trunk/xfburn/Makefile.am	2008-04-23 23:16:49 UTC (rev 4667)
@@ -24,6 +24,7 @@
 	xfburn-copy-cd-progress-dialog.h				\
 	xfburn-copy-dvd-dialog.h					\
 	xfburn-create-iso-progress-dialog.h				\
+	xfburn-hal-manager.h						\
 	xfburn-device-box.h						\
 	xfburn-device-list.h						\
 	xfburn-format-dvd-dialog.h					\
@@ -52,6 +53,7 @@
 	xfburn-compositions-notebook.c					\
 	xfburn-settings.c						\
 	xfburn-copy-dvd-dialog.c					\
+	xfburn-hal-manager.c						\
 	xfburn-device-box.c						\
 	xfburn-device-list.c						\
 	xfburn-format-dvd-dialog.c					\
@@ -74,7 +76,8 @@
 	$(LIBISOFS_CFLAGS)						\
 	$(LIBXFCEGUI4_CFLAGS)						\
 	$(EXO_CFLAGS)							\
-	$(THUNAR_VFS_CFLAGS)						
+	$(THUNAR_VFS_CFLAGS)						\
+	$(HAL_CFLAGS)
 
 xfburn_LDADD = 								\
 	$(GTHREAD_LIBS)							\

Modified: xfburn/trunk/xfburn/xfburn-device-box.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-device-box.c	2008-04-23 23:16:31 UTC (rev 4666)
+++ xfburn/trunk/xfburn/xfburn-device-box.c	2008-04-23 23:16:49 UTC (rev 4667)
@@ -30,6 +30,7 @@
 
 #include "xfburn-device-list.h"
 #include "xfburn-device-box.h"
+#include "xfburn-hal-manager.h"
 
 #define XFBURN_DEVICE_BOX_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFBURN_TYPE_DEVICE_BOX, XfburnDeviceBoxPrivate))
 
@@ -89,6 +90,9 @@
 #ifdef HAVE_THUNAR_VFS
   ThunarVfsVolumeManager *thunar_volman;
 #endif
+#ifdef HAVE_HAL
+  GObject *hal_manager;
+#endif
 } XfburnDeviceBoxPrivate;
 
 /* prototypes */
@@ -102,8 +106,8 @@
 static void cb_speed_refresh_clicked (GtkButton *button, XfburnDeviceBox *box);
 static gboolean check_disc_validity (XfburnDeviceBoxPrivate *priv);
 static void cb_combo_device_changed (GtkComboBox *combo, XfburnDeviceBox *box);
-#ifdef HAVE_THUNAR_VFS
-static void cb_volumes_changed (ThunarVfsVolumeManager *volman, gpointer volumes, XfburnDeviceBox *box);
+#ifdef HAVE_HAL
+static void cb_volumes_changed (XfburnHalManager *halman, XfburnDeviceBox *box);
 #endif
 
 /* globals */
@@ -276,11 +280,17 @@
   g_signal_connect (G_OBJECT (priv->combo_device), "changed", G_CALLBACK (cb_combo_device_changed), box);
   gtk_combo_box_set_active (GTK_COMBO_BOX (priv->combo_device), 0);
 
+#ifdef HAVE_HAL
+  priv->hal_manager = xfburn_hal_manager_new();
+  g_signal_connect (priv->hal_manager, "volume-changed", G_CALLBACK (cb_volumes_changed), box);
+#endif
 #ifdef HAVE_THUNAR_VFS
   priv->thunar_volman = thunar_vfs_volume_manager_get_default ();
   if (priv->thunar_volman != NULL) {
+    /*
     g_signal_connect (G_OBJECT (priv->thunar_volman), "volumes-added", G_CALLBACK (cb_volumes_changed), box);
     g_signal_connect (G_OBJECT (priv->thunar_volman), "volumes-removed", G_CALLBACK (cb_volumes_changed), box);
+    */
   } else {
     g_warning ("Error trying to access the thunar-vfs-volume-manager!");
   }
@@ -527,16 +537,20 @@
   g_signal_emit (G_OBJECT (box), signals[DEVICE_CHANGED], 0, device);
 }
 
-#ifdef HAVE_THUNAR_VFS
+#ifdef HAVE_HAL
 static void
-cb_volumes_changed (ThunarVfsVolumeManager *volman, gpointer volumes, XfburnDeviceBox *box)
+cb_volumes_changed (XfburnHalManager *halman, XfburnDeviceBox *box)
 {
-  DBG ("Volume change!");
+  //DBG ("Volume change!");
   usleep (1000001);
   cb_speed_refresh_clicked (NULL, box);
 }
 #endif
 
+#ifdef HAVE_THUNAR_VFS
+//(ThunarVfsVolumeManager *volman, gpointer volumes, XfburnDeviceBox *box)
+#endif
+
 /******************/
 /* public methods */
 /******************/

Modified: xfburn/trunk/xfburn/xfburn-device-list.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-device-list.c	2008-04-23 23:16:31 UTC (rev 4666)
+++ xfburn/trunk/xfburn/xfburn-device-list.c	2008-04-23 23:16:49 UTC (rev 4667)
@@ -108,7 +108,7 @@
 
   DBG ("disc_status = %d", disc_status);
   if (!(disc_status == BURN_DISC_BLANK || disc_status == BURN_DISC_APPENDABLE)) {
-    g_warning ("no writable / appendable disc found in drive, speed list not updated");
+    DBG ("no writable / appendable disc found in drive, speed list not updated");
     return;
   }
 

Modified: xfburn/trunk/xfburn/xfburn-hal-manager.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-hal-manager.c	2008-04-23 23:16:31 UTC (rev 4666)
+++ xfburn/trunk/xfburn/xfburn-hal-manager.c	2008-04-23 23:16:49 UTC (rev 4667)
@@ -1,6 +1,7 @@
-/* $Id: xfburn-hal-manager.c 4382 2006-11-01 17:08:37Z pollux $ */
+/* $Id: xfburn-hal-manager.c 4382 2006-11-01 17:08:37Z dmohr $ */
 /*
  *  Copyright (c) 2005-2006 Jean-François Wauthy (pollux at xfce.org)
+ *  Copyright (c) 2008      David Mohr (dmohr at mcbf.net)
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -21,10 +22,16 @@
 #include <config.h>
 #endif /* !HAVE_CONFIG_H */
 
+#ifdef HAVE_HAL
+
 #ifdef HAVE_STRING_H
 #include <string.h>
 #endif
 
+#include <libhal-storage.h>
+
+#include <errno.h>
+
 #include <libxfce4util/libxfce4util.h>
 
 #include "xfburn-global.h"
@@ -34,13 +41,33 @@
 
 static void xfburn_hal_manager_class_init (XfburnHalManagerClass * klass);
 static void xfburn_hal_manager_init (XfburnHalManager * sp);
+static void xfburn_hal_manager_finalize (GObject * object);
 
-static void cb_new_output (XfburnHalManager * dialog, const gchar * output, gpointer data);
+static void hal_finalize (LibHalContext  *hal_context);
+static void cb_device_added (LibHalContext *ctx, const char *udi);
+static void cb_device_removed (LibHalContext *ctx, const char *udi);
+static void cb_prop_modified (LibHalContext *ctx, const char *udi, const char *key,
+                              dbus_bool_t is_removed, dbus_bool_t is_added);
 
+#define XFBURN_HAL_MANAGER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFBURN_TYPE_HAL_MANAGER, XfburnHalManagerPrivate))
+
+enum {
+  VOLUME_CHANGED,
+  LAST_SIGNAL,
+}; 
+
+typedef struct {
+  LibHalContext  *hal_context;
+  DBusConnection *dbus_connection;
+} XfburnHalManagerPrivate;
+
+static XfburnHalManager *halman = NULL;
+
 /*********************/
 /* class declaration */
 /*********************/
 static XfburnProgressDialogClass *parent_class = NULL;
+static guint signals[LAST_SIGNAL];
 
 GtkType
 xfburn_hal_manager_get_type ()
@@ -69,52 +96,130 @@
 static void
 xfburn_hal_manager_class_init (XfburnHalManagerClass * klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  
+  g_type_class_add_private (klass, sizeof (XfburnHalManagerPrivate));
+  
   parent_class = g_type_class_peek_parent (klass);
+
+  object_class->finalize = xfburn_hal_manager_finalize;
+
+  signals[VOLUME_CHANGED] = g_signal_new ("volume-changed", XFBURN_TYPE_HAL_MANAGER, G_SIGNAL_ACTION,
+                                          G_STRUCT_OFFSET (XfburnHalManagerClass, volume_changed),
+                                          NULL, NULL, g_cclosure_marshal_VOID__VOID,
+                                          G_TYPE_NONE, 0);
 }
 
 static void
 xfburn_hal_manager_init (XfburnHalManager * obj)
 {
-  g_signal_connect_after (G_OBJECT (obj), "output", G_CALLBACK (cb_new_output), NULL);
+  XfburnHalManagerPrivate *priv = XFBURN_HAL_MANAGER_GET_PRIVATE (obj);
+  LibHalContext  *hal_context = NULL;
+  DBusError derror;
+  //GError *error = NULL;
+
+  DBusConnection *dbus_connection;
+
+  //if (halman != NULL)
+  //  g_error ("The HAL context was already there when trying to create a hal-manager!");
+  
+  /* dbus & hal init code taken from exo */
+  /* initialize D-Bus error */
+  dbus_error_init (&derror);
+
+  /* try to connect to the system bus */
+  dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &derror);
+  if (G_LIKELY (dbus_connection != NULL)) {
+    /* try to allocate a new HAL context */
+    hal_context = libhal_ctx_new ();
+    if (G_LIKELY (hal_context != NULL)) {
+      /* setup the D-Bus connection for the HAL context */
+      libhal_ctx_set_dbus_connection (hal_context, dbus_connection);
+
+      /* try to initialize the HAL context */
+      libhal_ctx_init (hal_context, &derror);
+    } else {
+      /* record the allocation failure of the context */
+      dbus_set_error_const (&derror, DBUS_ERROR_NO_MEMORY, g_strerror (ENOMEM));
+    }
+  }
+
+  /* check if we failed */
+  if (dbus_error_is_set (&derror)) {
+    /* check if a HAL context was allocated */
+    if (G_UNLIKELY (hal_context != NULL)) {
+      /* drop the allocated HAL context */
+      hal_finalize (hal_context);
+      hal_context = NULL;
+    }
+    DBG ("Connection to dbus or hal failed!");
+    dbus_error_free (&derror);
+  } else {
+    libhal_ctx_set_device_added (hal_context, cb_device_added);
+    libhal_ctx_set_device_removed (hal_context, cb_device_removed);
+    libhal_ctx_set_device_property_modified (hal_context, cb_prop_modified);
+  }
+
+  priv->hal_context = hal_context;
+  priv->dbus_connection = dbus_connection;
 }
 
+static void
+xfburn_hal_manager_finalize (GObject * object)
+{
+  XfburnHalManagerPrivate *priv = XFBURN_HAL_MANAGER_GET_PRIVATE (object);
+
+  hal_finalize (priv->hal_context);
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
 /*           */
 /* internals */
 /*           */
 static void
-cb_new_output (XfburnHalManager * dialog, const gchar * output, gpointer data)
+hal_finalize (LibHalContext  *hal_context)
 {
-  static gint readcd_end = -1;
+  DBusError derror;
 
-  if (strstr (output, READCD_DONE)) {
-    xfburn_progress_dialog_set_status (XFBURN_PROGRESS_DIALOG (dialog), XFBURN_PROGRESS_DIALOG_STATUS_COMPLETED);
-  }
-  else if (strstr (output, READCD_PROGRESS)) {
-    gint readcd_done = -1;
-    gdouble fraction;
+  libhal_ctx_shutdown (hal_context, &derror);
+  libhal_ctx_free (hal_context);
+}
 
-    sscanf (output, "%*s %d", &readcd_done);
-    fraction = ((gdouble) readcd_done) / readcd_end;
+static void cb_device_added (LibHalContext *ctx, const char *udi)
+{
+  DBG ("HAL: device added");
+  g_signal_emit (halman, signals[VOLUME_CHANGED], 0);
+}
 
-    xfburn_progress_dialog_set_progress_bar_fraction (XFBURN_PROGRESS_DIALOG (dialog), fraction);
-  }
-  else if (strstr (output, READCD_CAPACITY)) {
-    xfburn_progress_dialog_set_action_text (XFBURN_PROGRESS_DIALOG (dialog), _("Reading CD..."));
-    sscanf (output, "%*s %d", &readcd_end);
-  }
+static void cb_device_removed (LibHalContext *ctx, const char *udi)
+{
+  DBG ("HAL: device removed");
+  g_signal_emit (halman, signals[VOLUME_CHANGED], 0);
 }
 
+static void cb_prop_modified (LibHalContext *ctx, const char *udi,
+                              const char *key, dbus_bool_t is_removed, dbus_bool_t is_added)
+{
+  /* Lets ignore this for now,
+   * way too many of these get triggered when a disc is
+   * inserted or removed!
+  DBG ("HAL: property modified");
+  g_signal_emit (halman, signals[VOLUME_CHANGED], 0);
+  */
+}
+
 /*        */
 /* public */
 /*        */
 
-GtkWidget *
+GObject *
 xfburn_hal_manager_new ()
 {
-  XfburnHalManager *obj;
 
-  obj = XFBURN_CREATE_HAL_MANAGER (g_object_new (XFBURN_TYPE_CREATE_HAL_MANAGER,
-                                                         "show-buffers", FALSE, "title", _("Create ISO from CD"), NULL));
+  if (halman == NULL)
+    halman = XFBURN_CREATE_HAL_MANAGER (g_object_new (XFBURN_TYPE_HAL_MANAGER, NULL));
 
-  return GTK_WIDGET (obj);
+  return G_OBJECT (halman);
 }
+#endif /* HAVE_HAL */

Modified: xfburn/trunk/xfburn/xfburn-hal-manager.h
===================================================================
--- xfburn/trunk/xfburn/xfburn-hal-manager.h	2008-04-23 23:16:31 UTC (rev 4666)
+++ xfburn/trunk/xfburn/xfburn-hal-manager.h	2008-04-23 23:16:49 UTC (rev 4667)
@@ -18,9 +18,11 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-#ifndef __XFBURN_CREATE_HAL_MANAGER_H__
-#define __XFBURN_CREATE_HAL_MANAGER_H__
+#ifndef __XFBURN_HAL_MANAGER_H__
+#define __XFBURN_HAL_MANAGER_H__
 
+#ifdef HAVE_HAL
+
 #ifdef	HAVE_CONFIG_H
 #include <config.h>
 #endif /* !HAVE_CONFIG_H */
@@ -31,27 +33,30 @@
 
 G_BEGIN_DECLS
 
-#define XFBURN_TYPE_CREATE_HAL_MANAGER         (xfburn_hal_manager_get_type ())
-#define XFBURN_CREATE_HAL_MANAGER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), XFBURN_TYPE_CREATE_HAL_MANAGER, XfburnHalManager))
-#define XFBURN_CREATE_HAL_MANAGER_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), XFBURN_TYPE_CREATE_HAL_MANAGER, XfburnHalManagerClass))
-#define XFBURN_IS_CREATE_HAL_MANAGER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), XFBURN_TYPE_CREATE_HAL_MANAGER))
-#define XFBURN_IS_CREATE_HAL_MANAGER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), XFBURN_TYPE_CREATE_HAL_MANAGER))
-#define XFBURN_CREATE_HAL_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), XFBURN_TYPE_CREATE_HAL_MANAGER, XfburnHalManagerClass))
+#define XFBURN_TYPE_HAL_MANAGER         (xfburn_hal_manager_get_type ())
+#define XFBURN_CREATE_HAL_MANAGER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), XFBURN_TYPE_HAL_MANAGER, XfburnHalManager))
+#define XFBURN_CREATE_HAL_MANAGER_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), XFBURN_TYPE_HAL_MANAGER, XfburnHalManagerClass))
+#define XFBURN_IS_CREATE_HAL_MANAGER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), XFBURN_TYPE_HAL_MANAGER))
+#define XFBURN_IS_CREATE_HAL_MANAGER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), XFBURN_TYPE_HAL_MANAGER))
+#define XFBURN_CREATE_HAL_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), XFBURN_TYPE_HAL_MANAGER, XfburnHalManagerClass))
 
 typedef struct
 {
-  XfburnProgressDialog parent;
+  GObject parent;
 } XfburnHalManager;
 
 typedef struct
 {
   XfburnProgressDialogClass parent_class;
-  /* Add Signal Functions Here */
+  
+  void (*volume_changed) (XfburnHalManager *halman);
 } XfburnHalManagerClass;
 
 GtkType xfburn_hal_manager_get_type ();
-GtkWidget *xfburn_hal_manager_new ();
+GObject *xfburn_hal_manager_new ();
 
 G_END_DECLS
 
-#endif /* XFBURN_CREATE_HAL_MANAGER_H */
+#endif /* HAVE_HAL */
+
+#endif /* XFBURN_HAL_MANAGER_H */




More information about the Goodies-commits mailing list