[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