[Xfce4-commits] <thunar-volman:jannis/port-to-udev> Initial work on porting thunar-volman to gudev/GIO.
Jannis Pohlmann
noreply at xfce.org
Mon Jul 19 18:16:02 CEST 2010
Updating branch refs/heads/jannis/port-to-udev
to 1b45dc74f7a6143378fb7957cb437c6cf99e8b78 (commit)
from d454b8f15c34fb2f9b31a3f4d56e3ec12ba9b4cd (commit)
commit 1b45dc74f7a6143378fb7957cb437c6cf99e8b78
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Mon Jul 19 18:14:25 2010 +0200
Initial work on porting thunar-volman to gudev/GIO.
Block devices are now opened in Thunar. Their contents are not
investigated in order to distinguish iPods/cameras/media players from
normal storage devices yet.
.gitignore | 40 ++
autogen.sh | 54 +--
configure.in.in | 74 +---
thunar-volman/Makefile.am | 71 ++--
thunar-volman/main.c | 206 ++++---
thunar-volman/tvm-block-device.c | 884 +++++++-----------------------
thunar-volman/tvm-block-device.h | 36 +-
thunar-volman/tvm-camera-device.c | 89 ---
thunar-volman/tvm-camera-device.h | 35 --
thunar-volman/tvm-command-entry.c | 411 --------------
thunar-volman/tvm-command-entry.h | 61 --
thunar-volman/tvm-context.c | 93 +++
thunar-volman/tvm-context.h | 59 ++
thunar-volman/tvm-crypto-volume.c | 483 ----------------
thunar-volman/tvm-crypto-volume.h | 35 --
thunar-volman/tvm-device.c | 240 +++-----
thunar-volman/tvm-device.h | 67 +--
thunar-volman/tvm-gio-extensions.c | 64 +++
thunar-volman/tvm-gio-extensions.h | 34 ++
thunar-volman/tvm-input-device.c | 101 ----
thunar-volman/tvm-input-device.h | 35 --
thunar-volman/tvm-pango-extensions.c | 177 ------
thunar-volman/tvm-pango-extensions.h | 36 --
thunar-volman/tvm-pda-device.c | 120 ----
thunar-volman/tvm-pda-device.h | 35 --
thunar-volman/tvm-preferences-dialog.c | 719 ------------------------
thunar-volman/tvm-preferences-dialog.h | 43 --
thunar-volman/tvm-preferences.c | 963 --------------------------------
thunar-volman/tvm-preferences.h | 43 --
thunar-volman/tvm-printer-device.c | 80 ---
thunar-volman/tvm-printer-device.h | 35 --
thunar-volman/tvm-prompt.c | 173 ------
thunar-volman/tvm-prompt.h | 51 --
thunar-volman/tvm-run.c | 297 ++---------
thunar-volman/tvm-run.h | 51 +-
thunar-volman/xfce-heading.c | 755 -------------------------
thunar-volman/xfce-heading.h | 82 ---
thunar-volman/xfce-titled-dialog.c | 370 ------------
thunar-volman/xfce-titled-dialog.h | 75 ---
39 files changed, 864 insertions(+), 6413 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..689645c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,40 @@
+*.gmo
+*.o
+*.la
+*.so
+*.a
+.deps
+.intltool-merge-cache
+.libs
+aclocal.m4
+autom4te.cache
+compile
+config.guess
+config.h
+config.h.in
+config.h.in~
+config.log
+config.status
+config.sub
+configure
+configure.in
+depcomp
+INSTALL
+install-sh
+intltool-extract.in
+intltool-merge.in
+intltool-update.in
+libtool
+ltmain.sh
+Makefile
+Makefile.in
+Makefile.in.in
+missing
+mkinstalldirs
+POTFILES
+stamp-it
+stamp-h1
+thunar-volman-settings
+thunar-volman-settings.desktop
+texput.log
+thunar-volman
diff --git a/autogen.sh b/autogen.sh
index 9769a5c..9ec5e44 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,12 +1,21 @@
-#!/bin/sh
-#
-# $Id$
-#
-# Copyright (c) 2002-2006
-# The Thunar development team. All rights reserved.
-#
-# Written for Thunar by Benedikt Meurer <benny at xfce.org>.
-#
+# vi:set et ai sw=2 sts=2 ts=2: */
+# -
+# Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
+#
+# 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 the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program 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, write to the Free
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
(type xdt-autogen) >/dev/null 2>&1 || {
cat >&2 <<EOF
@@ -18,29 +27,4 @@ EOF
exit 1
}
-# verify that po/LINGUAS is present
-(test -f po/LINGUAS) >/dev/null 2>&1 || {
- cat >&2 <<EOF
-autogen.sh: The file po/LINGUAS could not be found. Please check your snapshot
- or try to checkout again.
-EOF
- exit 1
-}
-
-# substitute revision and linguas
-linguas=`sed -e '/^#/d' po/LINGUAS`
-if test -d .git/svn; then
- revision=`git svn find-rev trunk 2>/dev/null ||
- git svn find-rev origin/trunk 2>/dev/null ||
- git svn find-rev HEAD 2>/dev/null ||
- git svn find-rev master 2>/dev/null`
-else
- revision=`LC_ALL=C svn info $0 | awk '/^Revision: / {printf "%05d\n", $2}'`
-fi
-sed -e "s/@LINGUAS@/${linguas}/g" \
- -e "s/@REVISION@/${revision}/g" \
- < "configure.in.in" > "configure.in"
-
-exec xdt-autogen $@
-
-# vi:set ts=2 sw=2 et ai:
+XDT_AUTOGEN_REQUIRED_VERSION="4.7.2" exec xdt-autogen $@
diff --git a/configure.in.in b/configure.in.in
index e99da55..439e9ad 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -81,79 +81,23 @@ dnl ***********************************
dnl *** Check for required packages ***
dnl ***********************************
XDT_CHECK_PACKAGE([DBUS], [dbus-glib-1], [0.34])
-XDT_CHECK_PACKAGE([EXO_HAL], [exo-hal-0.3], [0.3.7.1svn-r27445])
-XDT_CHECK_PACKAGE([HAL], [hal], [0.5.0])
-XDT_CHECK_PACKAGE([THUNAR_VFS], [thunar-vfs-1], [0.5.1])
+XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.18.0])
+XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.18.0])
+XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.18.0])
+XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.14.0])
+XDT_CHECK_PACKAGE([GUDEV], [gudev-1.0], [145])
+XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.7.0])
+XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.7.0])
dnl ***********************************
dnl *** Check for debugging support ***
dnl ***********************************
-AC_ARG_ENABLE([debug],
-AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes/full@:>@], [Turn on debugging @<:@default=tvm_debug_default@:>@]),
- [], [enable_debug=tvm_debug_default])
-AC_MSG_CHECKING([whether to enable debugging support])
-if test x"$enable_debug" = x"full" -o x"$enable_debug" = x"yes"; then
- dnl Print the result
- AC_MSG_RESULT([$enable_debug])
-
- dnl Make sure we detect possible errors (if supported)
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -Wall -Werror"
- AC_MSG_CHECKING([whether $CC accepts -Wall -Werror])
- AC_COMPILE_IFELSE(AC_LANG_SOURCE([int x;]), [
- AC_MSG_RESULT([yes])
- PLATFORM_CFLAGS="$PLATFORM_CFLAGS -Wall -Werror"
- ], [
- AC_MSG_RESULT([no])
- ])
- CFLAGS="$save_CFLAGS"
-
- dnl Paranoia for --enable-debug=full
- if test x"$enable_debug" = x"full"; then
- dnl Enable extensive debugging
- PLATFORM_CPPFLAGS="$PLATFORM_CPPFLAGS -DG_ENABLE_DEBUG"
-
- dnl Use -O0 -g3 if the compiler supports it
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -O0 -g3"
- AC_MSG_CHECKING([whether $CC accepts -O0 -g3])
- AC_COMPILE_IFELSE(AC_LANG_SOURCE([int x;]), [
- AC_MSG_RESULT([yes])
- PLATFORM_CFLAGS="$PLATFORM_CFLAGS -O0 -g3"
- ], [
- AC_MSG_RESULT([no])
- ])
- CFLAGS="$save_CFLAGS"
- fi
-else
- dnl Print the result
- AC_MSG_RESULT([$enable_debug])
-
- dnl Disable debugging (release build)
- PLATFORM_CPPFLAGS="$PLATFORM_CPPFLAGS -DNDEBUG"
-
- dnl Disable object cast checks
- PLATFORM_CPPFLAGS="$PLATFORM_CPPFLAGS -DG_DISABLE_CAST_CHECKS"
-
- dnl Disable all checks for --enable-debug=no
- if test x"$enable_debug" = x"no"; then
- PLATFORM_CPPFLAGS="$PLATFORM_CPPFLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS"
- fi
-fi
+XDT_FEATURE_DEBUG()
dnl **************************************
dnl *** Check for linker optimizations ***
dnl **************************************
-AC_MSG_CHECKING([whether $LD accepts -O1])
-case `$LD -O1 -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
- PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -Wl,-O1"
- AC_MSG_RESULT([yes])
- ;;
-*)
- AC_MSG_RESULT([no])
- ;;
-esac
+XDT_FEATURE_LINKER_OPTS()
dnl *********************************
dnl *** Substitute platform flags ***
diff --git a/thunar-volman/Makefile.am b/thunar-volman/Makefile.am
index c072b41..66aa8e9 100644
--- a/thunar-volman/Makefile.am
+++ b/thunar-volman/Makefile.am
@@ -1,4 +1,21 @@
-# $Id$
+# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
+# -
+# Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
+#
+# 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 the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program 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, write to the Free
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
INCLUDES = \
-I$(top_builddir) \
@@ -17,40 +34,24 @@ thunar_volman_SOURCES = \
main.c \
tvm-block-device.c \
tvm-block-device.h \
- tvm-camera-device.c \
- tvm-camera-device.h \
- tvm-command-entry.c \
- tvm-command-entry.h \
- tvm-crypto-volume.c \
- tvm-crypto-volume.h \
+ tvm-context.c \
+ tvm-context.h \
tvm-device.c \
tvm-device.h \
- tvm-input-device.c \
- tvm-input-device.h \
- tvm-pango-extensions.c \
- tvm-pango-extensions.h \
- tvm-pda-device.c \
- tvm-pda-device.h \
- tvm-preferences-dialog.c \
- tvm-preferences-dialog.h \
- tvm-preferences.c \
- tvm-preferences.h \
- tvm-printer-device.c \
- tvm-printer-device.h \
- tvm-prompt.c \
- tvm-prompt.h \
+ tvm-gio-extensions.c \
+ tvm-gio-extensions.h \
tvm-run.c \
- tvm-run.h \
- xfce-heading.c \
- xfce-heading.h \
- xfce-titled-dialog.c \
- xfce-titled-dialog.h
+ tvm-run.h
thunar_volman_CFLAGS = \
$(DBUS_CFLAGS) \
- $(EXO_HAL_CFLAGS) \
- $(HAL_CFLAGS) \
- $(THUNAR_VFS_CFLAGS) \
+ $(GLIB_CFLAGS) \
+ $(GIO_CFLAGS) \
+ $(GTHREAD_CFLAGS) \
+ $(GTK_CFLAGS) \
+ $(GUDEV_CFLAGS) \
+ $(LIBXFCE4UTIL_CFLAGS) \
+ $(XFCONF_CFLAGS) \
$(PLATFORM_CFLAGS)
thunar_volman_LDFLAGS = \
@@ -59,8 +60,10 @@ thunar_volman_LDFLAGS = \
thunar_volman_LDADD = \
$(DBUS_LIBS) \
- $(EXO_HAL_LIBS) \
- $(HAL_LIBS) \
- $(THUNAR_VFS_LIBS)
-
-# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
+ $(GLIB_LIBS) \
+ $(GIO_LIBS) \
+ $(GTHREAD_LIBS) \
+ $(GTK_LIBS) \
+ $(GUDEV_LIBS) \
+ $(LIBXFCE4UTIL_LIBS) \
+ $(XFCONF_LIBS)
diff --git a/thunar-volman/main.c b/thunar-volman/main.c
index e4e4f15..96f16dd 100644
--- a/thunar-volman/main.c
+++ b/thunar-volman/main.c
@@ -1,66 +1,86 @@
-/* $Id$ */
+/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
*
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
- * This program 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.
+ * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
+#include <glib.h>
#include <glib/gstdio.h>
-#include <exo-hal/exo-hal.h>
+#include <gtk/gtk.h>
-#include <thunar-vfs/thunar-vfs.h>
+#include <gudev/gudev.h>
+#include <libxfce4util/libxfce4util.h>
+
+#include <xfconf/xfconf.h>
+
+#include <thunar-volman/tvm-context.h>
#include <thunar-volman/tvm-device.h>
-#include <thunar-volman/tvm-preferences-dialog.h>
-/* --- globals --- */
-static gchar *opt_hal_udi = NULL;
+/* variables for command line options */
+static gchar *opt_sysfs_path = NULL;
static gboolean opt_configure = FALSE;
static gboolean opt_version = FALSE;
-/* --- command line options --- */
+/* command line options */
static GOptionEntry option_entries[] =
{
- { "device-added", 'a', 0, G_OPTION_ARG_STRING, &opt_hal_udi, N_ ("The HAL device UDI of the newly added device"), NULL, },
+ { "device-added", 'a', 0, G_OPTION_ARG_STRING, &opt_sysfs_path, N_ ("The syfs path of the newly added device"), NULL, },
{ "configure", 'c', 0, G_OPTION_ARG_NONE, &opt_configure, N_ ("Configure management of removable drives and media"), NULL, },
- { "version", 'v', 0, G_OPTION_ARG_NONE, &opt_version, N_ ("Print version information and exit"), NULL, },
+ { "version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, N_ ("Print version information and exit"), NULL, },
{ NULL, },
};
+/* udev subsystems supported by thunar-volman */
+static const gchar *supported_udev_subsystems[] =
+{
+ "block",
+ "input",
+ NULL,
+};
+
+
+
int
-main (int argc, char **argv)
+main (int argc,
+ char **argv)
{
- TvmPreferences *preferences;
- GtkWidget *dialog;
- GError *err = NULL;
+ XfconfChannel *channel;
+ GUdevClient *client;
+ GUdevDevice *device;
+ TvmContext *context = NULL;
+ GMainLoop *loop = NULL;
+ GError *error = NULL;
+ gint exit_code = EXIT_SUCCESS;
/* setup translation domain */
xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
@@ -69,96 +89,106 @@ main (int argc, char **argv)
g_set_application_name (_("Thunar Volume Manager"));
#ifdef G_ENABLE_DEBUG
- /* Do NOT remove this line for now, If something doesn't work,
- * fix your code instead!
- */
+ /* Do NOT remove this line for now. If something doesn't work, fix your code instead */
g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING);
#endif
- /* initialize the GThread system */
+ /* initialize the threading system */
if (!g_thread_supported ())
g_thread_init (NULL);
- /* initialize Gtk+ */
- if (!gtk_init_with_args (&argc, &argv, NULL, option_entries, GETTEXT_PACKAGE, &err))
+ /* initialize GTK+ */
+ if (!gtk_init_with_args (&argc, &argv, NULL, option_entries, GETTEXT_PACKAGE, &error))
{
- /* check if we have an error message */
- if (G_LIKELY (err == NULL))
- {
- /* no error message, the GUI initialization failed */
- const gchar *display_name = gdk_get_display_arg_name ();
- g_fprintf (stderr, "thunar-volman: %s: %s.\n", _("Failed to open display"), (display_name != NULL) ? display_name : " ");
- }
- else
- {
- /* yep, there's an error, so print it */
- g_fprintf (stderr, "%s: %s.\n", g_get_prgname (), err->message);
- g_error_free (err);
- }
+ g_fprintf (stderr, "%s: %s.\n", g_get_prgname (), error->message);
+ g_error_free (error);
return EXIT_FAILURE;
}
- /* check if we should print version information */
- if (G_UNLIKELY (opt_version))
+ /* initialize xfconf */
+ if (!xfconf_init (&error))
{
- g_print ("%s %s (Xfce %s)\n\n", PACKAGE_NAME, PACKAGE_VERSION, xfce_version_string ());
- g_print ("%s\n", "Copyright (c) 2004-2007");
- g_print ("\t%s\n\n", _("The Thunar development team. All rights reserved."));
- g_print ("%s\n\n", _("Written by Benedikt Meurer <benny at xfce.org>."));
- g_print (_("Please report bugs to <%s>."), PACKAGE_BUGREPORT);
- g_print ("\n");
- return EXIT_SUCCESS;
+ g_fprintf (stderr, "%s: %s.\n", g_get_prgname (), error->message);
+ g_error_free (error);
+ return EXIT_FAILURE;
}
- /* initialize the ThunarVFS library */
- thunar_vfs_init ();
-
- /* load the preferences for the volume manager */
- preferences = tvm_preferences_get ();
-
- /* check if we should configure the volume manager */
- if (G_UNLIKELY (opt_configure))
+ /* check if we should print the version information */
+ if (opt_version)
{
- /* bring up the preferences dialog */
- dialog = tvm_preferences_dialog_new ();
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
+ /* the --configure/-c option of thunar-volman exists for backwards-compatibility
+ * reasons only. what we really do here is spawning thunar-volman-settings */
+ if (!g_spawn_command_line_sync ("thunar-volman-settings", NULL, NULL, &exit_code,
+ &error))
+ {
+ g_fprintf (stderr, "%s: %s.\n", g_get_prgname (), error->message);
+ g_error_free (error);
+ exit_code = WEXITSTATUS (exit_code);
+ }
}
- else if (G_LIKELY (opt_hal_udi != NULL))
+ else if (opt_sysfs_path != NULL)
{
- /* make sure the specified UDI is valid */
- if (!exo_hal_udi_validate (opt_hal_udi, -1, NULL))
+ /* create an udev client */
+ client = g_udev_client_new (supported_udev_subsystems);
+
+ /* determine the device belonging to the sysfs path */
+ device = g_udev_client_query_by_sysfs_path (client, opt_sysfs_path);
+
+ if (device != NULL)
{
- /* TRANSLATORS: A HAL device UDI must match certain conditions to be valid (to be exact, it must be a valid D-Bus object path) */
- g_set_error (&err, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("The specified UDI \"%s\" is not a valid HAL device UDI"), opt_hal_udi);
+ /* get a reference on the thunar-volman settings channel */
+ channel = xfconf_channel_get ("thunar-volman");
+
+ /* create a new main loop */
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* allocate a new TvmContext */
+ context = tvm_context_new (client, device, channel, loop, &error);
+
+ /* handle the new device in an idle handler */
+ g_idle_add ((GSourceFunc) tvm_context_run, context);
+
+ /* release channel and device */
+ g_object_unref (device);
}
else
{
- /* try to handle the newly added device */
- tvm_device_added (preferences, opt_hal_udi, &err);
+ g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+ _("There is no device with the sysfs path \"%s\""),
+ opt_sysfs_path);
}
+
+ /* release the udev client */
+ g_object_unref (client);
}
else
{
- /* TRANSLATORS: thunar-volman wasn't invoked with either --device-added or --configure. */
- g_set_error (&err, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("Must specify the new HAL device UDI with --device-added"));
+ /* TRANSLATORS: thunar-volman wasn't invoked with either --device-added or
+ * --configure */
+ g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+ _("Must specify the sysfs path of new devices with --device-added"));
}
- /* flush the preferences */
- g_object_unref (G_OBJECT (preferences));
-
- /* shutdown thunar-vfs */
- thunar_vfs_shutdown ();
+ /* run the main loop */
+ if (loop != NULL)
+ {
+ g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+ }
- /* check if an error occurred */
- if (G_UNLIKELY (err != NULL))
+ if (error != NULL)
{
- /* tell the user about the problem */
- g_fprintf (stderr, "%s: %s.\n", g_get_prgname (), err->message);
- g_error_free (err);
- return EXIT_FAILURE;
+ g_fprintf (stderr, "%s: %s.\n", g_get_prgname (), error->message);
+ g_error_free (error);
+ exit_code = EXIT_FAILURE;
}
- return EXIT_SUCCESS;
-}
+ /* release the device context */
+ if (context != NULL)
+ tvm_context_free (context);
+
+ /* free xfconf resources */
+ xfconf_shutdown ();
+ return exit_code;
+}
diff --git a/thunar-volman/tvm-block-device.c b/thunar-volman/tvm-block-device.c
index de4e774..26c9483 100644
--- a/thunar-volman/tvm-block-device.c
+++ b/thunar-volman/tvm-block-device.c
@@ -1,782 +1,286 @@
-/* $Id$ */
+/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
- * Copyright (c) 2007-2008 Benedikt Meurer <benny at xfce.org>.
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
*
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
- * This program 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.
+ * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
+#include <gio/gio.h>
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
+#include <gtk/gtk.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gudev/gudev.h>
+
+#include <libxfce4util/libxfce4util.h>
#include <thunar-volman/tvm-block-device.h>
-#include <thunar-volman/tvm-crypto-volume.h>
-#include <thunar-volman/tvm-prompt.h>
+#include <thunar-volman/tvm-context.h>
+#include <thunar-volman/tvm-device.h>
+#include <thunar-volman/tvm-gio-extensions.h>
#include <thunar-volman/tvm-run.h>
-static gboolean tvm_file_test (const gchar *directory,
- const gchar *filename,
- GFileTest test);
-static gboolean tvm_block_device_autoipod (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error);
-static gboolean tvm_block_device_autophoto (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error);
-static gboolean tvm_block_device_autorun (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error);
-static gboolean tvm_block_device_mount (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- GError **error);
-static gboolean tvm_block_device_mounted (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error);
+typedef gboolean (*TvmBlockDeviceHandler) (TvmContext *context,
+ GMount *mount,
+ GError **error);
-static gboolean
-tvm_file_test (const gchar *directory,
- const gchar *filename,
- GFileTest test)
-{
- const gchar *name;
- gboolean result = FALSE;
- gchar *path;
- GDir *dp;
-
- /* try to open the specified directory */
- dp = g_dir_open (directory, 0, NULL);
- if (G_LIKELY (dp != NULL))
- {
- while (!result)
- {
- /* read the next entry */
- name = g_dir_read_name (dp);
- if (G_UNLIKELY (name == NULL))
- break;
+static gboolean tvm_block_device_autobrowse (TvmContext *context,
+ GMount *mount,
+ GError **error);
- /* check if we have a potential match */
- if (g_ascii_strcasecmp (name, filename) == 0)
- {
- /* check if test condition met */
- path = g_build_filename (directory, name, NULL);
- result = g_file_test (path, test);
- g_free (path);
- }
- }
- /* cleanup */
- g_dir_close (dp);
- }
- return result;
-}
+static TvmBlockDeviceHandler block_device_handlers[] =
+{
+#if 0
+ tvm_block_device_autoipod,
+ tvm_block_device_autophoto,
+ tvm_block_device_autorun,
+#endif
+ tvm_block_device_autobrowse,
+};
static gboolean
-tvm_block_device_autoipod (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error)
+tvm_block_device_autobrowse (TvmContext *context,
+ GMount *mount,
+ GError **error)
{
+ gboolean autobrowse;
gboolean result = FALSE;
- gboolean autoipod;
- gboolean is_audio_player = FALSE;
- gchar *autoipod_command;
- gchar *autophoto_command;
- gchar *storage_udi;
- gchar *path_dcim = NULL;
- gchar *product;
- gint response = TVM_RESPONSE_NONE;
-
- /* check if music players should be handled automatically */
- g_object_get (G_OBJECT (preferences), "autoipod", &autoipod, "autoipod-command", &autoipod_command, NULL);
- if (G_LIKELY (autoipod && autoipod_command != NULL && *autoipod_command != '\0'))
- {
- /* determine the storage device UDI */
- storage_udi = libhal_device_get_property_string (context, udi, "block.storage_device", NULL);
- if (G_LIKELY (storage_udi != NULL))
- {
- /* check if we have a portable audio player here */
- if (libhal_device_query_capability (context, storage_udi, "portable_audio_player", NULL))
- {
- is_audio_player = TRUE;
- /* check if we have an iPod here */
- product = libhal_device_get_property_string (context, storage_udi, "info.product", NULL);
- if (product != NULL && strcmp (product, "iPod") != 0)
- {
- /* an iPod may have photos */
- path_dcim = g_build_filename (mount_point, "dcim", NULL);
- if (!g_file_test (path_dcim, G_FILE_TEST_IS_DIR))
- {
- /* no photos */
- g_free (path_dcim);
- path_dcim = NULL;
- }
- else
- {
- /* add the "content.photos" capability to this device */
- libhal_device_add_capability (context, udi, "content.photos", NULL);
- }
- }
- libhal_free_string (product);
- }
-
- /* check if autophoto command is specified, else we cannot handle the photos on the iPod anyway */
- g_object_get (G_OBJECT (preferences), "autophoto-command", &autophoto_command, NULL);
- if (G_UNLIKELY (autophoto_command == NULL || *autophoto_command == '\0'))
- {
- /* cannot handle photos */
- g_free (path_dcim);
- path_dcim = NULL;
- }
-
- /* iPods can carry both music and photos... */
- if (G_LIKELY (path_dcim != NULL))
- {
- /* ...so we need to prompt what to do */
- response = tvm_prompt (context, udi, "gnome-dev-ipod", _("Photos and Music"),
- _("Photos were found on your portable music player."),
- _("Would you like to import the photos or manage the music?"),
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("Import _Photos"), TVM_RESPONSE_PHOTOS,
- _("Manage _Music"), TVM_RESPONSE_MUSIC,
- NULL);
- }
- else
- {
- /* no photos, so we can manage only music */
- if(is_audio_player)
- response = TVM_RESPONSE_MUSIC;
- }
+ GError *err = NULL;
- /* check what to do */
- if (response == TVM_RESPONSE_MUSIC)
- {
- /* run the preferred application to manage music players */
- result = tvm_run_command (context, udi, autoipod_command, device_file, mount_point, error);
- }
- else if (response == TVM_RESPONSE_PHOTOS)
- {
- /* run the preferred application to manage photos */
- result = tvm_run_command (context, udi, autophoto_command, device_file, mount_point, error);
- }
+ g_return_val_if_fail (context != NULL, FALSE);
+ g_return_val_if_fail (G_IS_MOUNT (mount), FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- /* cleanup */
- libhal_free_string (storage_udi);
- g_free (autophoto_command);
- g_free (path_dcim);
- }
+ /* check whether auto-browsing of volumes is enabled */
+ autobrowse = xfconf_channel_get_bool (context->channel, "/autobrowse/enabled", FALSE);
+ if (autobrowse)
+ {
+ /* try to open the mount point in thunar */
+ result = tvm_run_command (context, mount, "Thunar %m", &err);
}
- /* cleanup */
- g_free (autoipod_command);
+ /* forward errors to the caller */
+ if (err != NULL)
+ g_propagate_error (error, err);
return result;
}
-static gboolean
-tvm_block_device_autophoto (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error)
+static void
+tvm_block_device_mounted (TvmContext *context,
+ GMount *mount,
+ GError **error)
{
- gboolean result = FALSE;
- gboolean autophoto;
- gchar *autophoto_command;
- gint response;
+ gboolean success = FALSE;
+ GError *err = NULL;
+ guint n;
- /* check autophoto support is enabled */
- g_object_get (G_OBJECT (preferences), "autophoto", &autophoto, "autophoto-command", &autophoto_command, NULL);
- if (G_LIKELY (autophoto && autophoto_command != NULL && *autophoto_command != '\0'))
- {
- /* check if we have photos on the volume */
- if (tvm_file_test (mount_point, "dcim", G_FILE_TEST_IS_DIR))
- {
- /* add the "content.photos" capability to this device */
- libhal_device_add_capability (context, udi, "content.photos", NULL);
-
- /* ask the user whether to import photos */
- response = tvm_prompt (context, udi, "camera-photo", _("Photo Import"),
- _("A photo card has been detected."),
- _("There are photos on the card. Would you like to add these photos to your album?"),
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("Import _Photos"), TVM_RESPONSE_PHOTOS,
- NULL);
- if (G_LIKELY (response == TVM_RESPONSE_PHOTOS))
- {
- /* run the preferred application to manage photos */
- result = tvm_run_command (context, udi, autophoto_command, device_file, mount_point, error);
- }
- else
- {
- /* pretend that we handled the device */
- result = TRUE;
- }
- }
- }
- g_free (autophoto_command);
+ g_return_if_fail (context != NULL);
+ g_return_if_fail (G_IS_MOUNT (mount));
+ g_return_if_fail (error == NULL || *error == NULL);
- return result;
+ /* try block device handlers (iPod, cameras etc.) until one succeeds */
+ for (n = 0; !success && n < G_N_ELEMENTS (block_device_handlers); ++n)
+ success = (block_device_handlers[n]) (context, mount, &err);
+
+ /* forward errors to the caller */
+ if (err != NULL)
+ g_propagate_error (error, err);
}
-static gboolean
-tvm_block_device_autorun (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error)
+static void
+tvm_block_device_mount_finish (GVolume *volume,
+ GAsyncResult *result,
+ TvmContext *context)
{
- struct stat statb_mount_point;
- struct stat statb_autoopen;
- gboolean result;
- gboolean autoopen;
- gboolean autoplay;
- gboolean autorun;
- gchar *autoplay_command;
- gchar *path_autoopen;
- gchar line[1024];
- gchar *message;
- gchar *wine;
- gchar **argv;
- FILE *fp;
- gint response;
- gint n;
-
- /* check if autoplay video CDs/DVDs is enabled */
- g_object_get (G_OBJECT (preferences), "autoplay-video-cd", &autoplay, "autoplay-video-cd-command", &autoplay_command, NULL);
- if (G_LIKELY (autoplay))
- {
- /* check if we have a video CD or video DVD here */
- if (tvm_file_test (mount_point, "vcd", G_FILE_TEST_IS_DIR) || tvm_file_test (mount_point, "video_ts", G_FILE_TEST_IS_DIR))
- {
- /* try to spawn the preferred video CD/DVD-Player */
- result = tvm_run_command (context, udi, autoplay_command, device_file, mount_point, error);
- g_free (autoplay_command);
- return result;
- }
- }
- g_free (autoplay_command);
+ GMount *mount;
+ GError *error = NULL;
+
+ g_return_if_fail (G_IS_VOLUME (volume));
+ g_return_if_fail (G_IS_ASYNC_RESULT (result));
+ g_return_if_fail (context != NULL);
+
+ g_debug ("finish");
- /* check if autorun support is enabled */
- g_object_get (G_OBJECT (preferences), "autorun", &autorun, NULL);
- if (G_LIKELY (autorun))
+ /* finish mounting the volume */
+ if (g_volume_mount_finish (volume, result, &error))
{
- /* "Autostart Files" (Desktop Application Autostart Specification) */
- static const gchar *AUTORUN[] = { ".autorun", "autorun", "autorun.sh" };
- for (n = 0; n < G_N_ELEMENTS (AUTORUN); ++n)
+ /* get the moint point of the volume */
+ mount = g_volume_get_mount (volume);
+
+ if (mount != NULL)
{
- /* check if one of the autorun files is present and executable */
- if (tvm_file_test (mount_point, AUTORUN[n], G_FILE_TEST_IS_EXECUTABLE)
- && tvm_file_test (mount_point, AUTORUN[n], G_FILE_TEST_IS_REGULAR))
- {
- /* prompt the user whether to execute this file */
- message = g_strdup_printf (_("Would you like to allow \"%s\" to run?"), AUTORUN[n]);
- response = tvm_prompt (context, udi, "gnome-fs-executable", _("Auto-Run Confirmation"),
- _("Auto-Run capability detected"), message,
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("_Allow Auto-Run"), TVM_RESPONSE_AUTORUN,
- NULL);
- g_free (message);
-
- /* check if we should autorun */
- if (response == TVM_RESPONSE_AUTORUN)
- {
- /* prepare argv to launch autorun file */
- argv = g_new (gchar *, 2);
- argv[0] = g_build_filename (mount_point, AUTORUN[n], NULL);
- argv[1] = NULL;
-
- /* try to launch the autorun file */
- result = g_spawn_async (mount_point, argv, NULL, 0, NULL, NULL, NULL, error);
-
- /* cleanup */
- g_strfreev (argv);
-
- /* outa here */
- return result;
- }
- }
- }
+ /* inspect volume contents and perform actions based on them */
+ tvm_block_device_mounted (context, mount, &error);
- /* check if wine is present */
- wine = g_find_program_in_path ("wine");
- if (G_UNLIKELY (wine != NULL))
+ /* release the mount point */
+ g_object_unref (mount);
+ }
+ else
{
- /* check if we have an autorun.exe file */
- if (tvm_file_test (mount_point, "autorun.exe", G_FILE_TEST_IS_REGULAR))
- {
- /* prompt the user whether to execute this file */
- message = g_strdup_printf (_("Would you like to allow \"%s\" to run?"), "autorun.exe");
- response = tvm_prompt (context, udi, "gnome-fs-executable", _("Auto-Run Confirmation"),
- _("Auto-Run capability detected"), message,
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("_Allow Auto-Run"), TVM_RESPONSE_AUTORUN,
- NULL);
- g_free (message);
-
- /* check if we should autorun */
- if (response == TVM_RESPONSE_AUTORUN)
- {
- /* prepare argv to launch autorun.exe file */
- argv = g_new (gchar *, 3);
- argv[0] = wine;
- argv[1] = g_strdup ("autorun.exe");
- argv[2] = NULL;
-
- /* try to launch the autorun.exe file via wine */
- result = g_spawn_async (mount_point, argv, NULL, 0, NULL, NULL, NULL, error);
-
- /* cleanup */
- g_strfreev (argv);
-
- /* outa here */
- return result;
- }
- }
+ /* could not locate the mount point */
+ g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+ _("Unable to locate mount point"));
}
- g_free (wine);
}
- /* check if autoopen support is enabled */
- g_object_get (G_OBJECT (preferences), "autoopen", &autoopen, NULL);
- if (G_LIKELY (autoopen))
- {
- /* "Autoopen Files" (Desktop Application Autostart Specification) */
- static const gchar *AUTOOPEN[] = { ".autoopen", "autoopen" };
- for (n = 0; n < G_N_ELEMENTS (AUTOOPEN); ++n)
- {
- /* check if one of the autoopen files is present */
- path_autoopen = g_build_filename (mount_point, AUTOOPEN[n], NULL);
- fp = fopen (path_autoopen, "r");
- g_free (path_autoopen);
+ /* release the volume */
+ g_object_unref (volume);
- /* check if the file could be opened */
- if (G_UNLIKELY (fp != NULL))
- {
- /* read the first line of the file (MUST NOT be an absolute path) */
- if (fgets (line, sizeof (line), fp) != NULL && !g_path_is_absolute (line))
- {
- /* determine the absolute path of the file */
- path_autoopen = g_build_filename (mount_point, line, NULL);
-
- /* the file must exist on exactly this device */
- if (stat (mount_point, &statb_mount_point) == 0 && stat (path_autoopen, &statb_autoopen) == 0
- && S_ISREG (statb_autoopen.st_mode) && (statb_autoopen.st_mode & 0111) == 0
- && (statb_mount_point.st_dev == statb_autoopen.st_dev))
- {
- /* prompt the user whether to autoopen this file */
- message = g_strdup_printf (_("Would you like to open \"%s\"?"), AUTOOPEN[n]);
- response = tvm_prompt (context, udi, "gnome-fs-executable", _("Auto-Open Confirmation"),
- _("Auto-Open capability detected"), message,
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("_Open"), TVM_RESPONSE_AUTOOPEN,
- NULL);
- g_free (message);
-
- /* check if we should autoopen */
- if (response == TVM_RESPONSE_AUTOOPEN)
- {
- /* prepare the command to autoopen */
- argv = g_new (gchar *, 3);
- argv[0] = g_strdup ("Thunar");
- argv[1] = path_autoopen;
- argv[2] = NULL;
-
- /* let Thunar open the file */
- result = g_spawn_async (mount_point, argv, NULL, 0, NULL, NULL, NULL, error);
-
- /* cleanup */
- g_free (path_autoopen);
- fclose (fp);
- return result;
- }
- }
-
- /* cleanup */
- g_free (path_autoopen);
- }
-
- /* close the file handle */
- fclose (fp);
- }
- }
- }
+ /* move error information into the context */
+ if (error != NULL)
+ g_propagate_error (context->error, error);
- /* not handled */
- return FALSE;
+ /* finish processing the device */
+ tvm_device_handler_finished (context);
}
-static gboolean
-tvm_block_device_mount (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- GError **error)
+static void
+tvm_block_device_mount (TvmContext *context)
{
- DBusError derror;
- gboolean result = FALSE;
- GSList *mount_points;
- gchar *device_file;
- gchar *argv[4];
- gint status;
-
- /* check if we should ignore the volume, if so, pretend that we succeed */
- if (libhal_device_get_property_bool (context, udi, "volume.ignore", NULL))
- return TRUE;
-
- /* generate the command to mount the device */
- argv[0] = (gchar *) "exo-mount";
- argv[1] = (gchar *) "--hal-udi";
- argv[2] = (gchar *) udi;
- argv[3] = NULL;
-
- /* let exo-mount mount the device */
- if (!g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &status, error))
- {
- /* failed to spawn the exo-mount command */
- return FALSE;
- }
- else if (!WIFEXITED (status) || WEXITSTATUS (status) != 0)
- {
- /* exo-mount failed, but already displayed an error */
- return TRUE;
- }
-
- /* initalize D-Bus error */
- dbus_error_init (&derror);
-
- /* successfully mounted the device, determine the device file */
- device_file = libhal_device_get_property_string (context, udi, "block.device", &derror);
- if (G_UNLIKELY (device_file == NULL))
- {
- /* propagate the error */
- dbus_set_g_error (error, &derror);
- return FALSE;
- }
-
- /* determine the active mount point(s) for the device from the kernel */
- mount_points = exo_mount_point_list_matched (EXO_MOUNT_POINT_MATCH_ACTIVE | EXO_MOUNT_POINT_MATCH_DEVICE, device_file, NULL, NULL, error);
- if (G_LIKELY (mount_points != NULL))
- {
- /* try to handled the mounted volume */
- result = tvm_block_device_mounted (preferences, context, udi, device_file, ((ExoMountPoint *) mount_points->data)->folder, error);
-
- /* release the mount points */
- g_slist_foreach (mount_points, (GFunc) exo_mount_point_free, NULL);
- g_slist_free (mount_points);
- }
-
- /* release the device file */
- libhal_free_string (device_file);
-
- return result;
-}
-
+ GMountOperation *mount_operation;
+ GVolume *volume;
+ g_return_if_fail (context != NULL);
+ /* determine the GVolume corresponding to the udev device */
+ volume =
+ tvm_g_volume_monitor_get_volume_for_kind (context->monitor,
+ G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE,
+ g_udev_device_get_device_file (context->device));
-static gboolean
-tvm_block_device_mounted (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error)
-{
- gboolean autobrowse;
- gboolean result;
- GError *err = NULL;
-
- /* check if we have a portable media player here */
- result = tvm_block_device_autoipod (preferences, context, udi, device_file, mount_point, &err);
- if (G_LIKELY (!result && err == NULL))
+ /* check if we have a volume */
+ if (volume != NULL)
{
- /* check if we have a digital photo camera here */
- result = tvm_block_device_autophoto (preferences, context, udi, device_file, mount_point, &err);
- if (G_LIKELY (!result && err == NULL))
+ /* check if we can mount the volume */
+ if (g_volume_can_mount (volume))
{
- /* try autorun (video CD/DVD, autoopen, etc.) first */
- result = tvm_block_device_autorun (preferences, context, udi, device_file, mount_point, &err);
- if (G_LIKELY (!result && err == NULL))
- {
- /* check if we should autobrowse the mount point folder */
- g_object_get (G_OBJECT (preferences), "autobrowse", &autobrowse, NULL);
- if (G_LIKELY (autobrowse))
- {
- /* open the mount point folder in Thunar */
- result = tvm_run_command (context, udi, "Thunar %m", device_file, mount_point, &err);
- }
- }
+ /* try to mount the volume asynchronously */
+ mount_operation = gtk_mount_operation_new (NULL);
+ g_volume_mount (volume, G_MOUNT_MOUNT_NONE, mount_operation,
+ NULL, (GAsyncReadyCallback) tvm_block_device_mount_finish, context);
+ g_object_unref (mount_operation);
+ }
+ else
+ {
+ g_set_error (context->error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+ _("Unable to mount the device"));
+
+ /* finish processing the device */
+ tvm_device_handler_finished (context);
}
}
-
- /* check if we need to propagate an error */
- if (G_UNLIKELY (err != NULL))
+ else
{
- /* propagate the error */
- g_propagate_error (error, err);
- result = FALSE;
+ g_set_error (context->error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+ _("Could not detect the volume corresponding to the device"));
+
+ /* finish processing the device */
+ tvm_device_handler_finished (context);
}
-
- return result;
}
-/**
- * tvm_block_device_added:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the HAL device UDI of the newly added block device.
- * @capability : the capability, which caused this handler to be run.
- * @error : return location for errors or %NULL.
- *
- * See #TvmDeviceCallback for further information.
- *
- * Return value: %TRUE if handled, %FALSE if not handled or an
- * unrecoverable error occurred.
- **/
-gboolean
-tvm_block_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error)
+void
+tvm_block_device_added (TvmContext *context)
{
- DBusError derror;
- gboolean disc_has_audio;
- gboolean disc_has_data;
- gboolean automount;
- gboolean autoplay;
- gboolean is_cdrom;
- gboolean has_filesystem;
- gboolean has_crypto;
- gchar *storage_udi;
- gchar *drive_type;
- gchar *fsusage;
- gint response;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_return_val_if_fail (capability != NULL, FALSE);
- g_return_val_if_fail (context != NULL, FALSE);
-
- /* initialize D-Bus error */
- dbus_error_init (&derror);
-
- /* verify that we have a mountable volume here */
- if (!libhal_device_get_property_bool (context, udi, "block.is_volume", &derror))
- {
-err0: /* check if we have an error to propagate */
- if (dbus_error_is_set (&derror))
- {
- /* propagate the error */
- dbus_set_g_error (error, &derror);
- dbus_error_free (&derror);
- }
-
- return FALSE;
- }
-
- /* determine the HAL UDI of the backing storage device */
- storage_udi = libhal_device_get_property_string (context, udi, "block.storage_device", &derror);
- if (G_UNLIKELY (storage_udi == NULL))
- goto err0;
-
- /* if the partition_table_changed flag is set, we don't want to mount as a partitioning tool might be modifying this device */
- if (libhal_device_get_property_bool (context, storage_udi, "storage.partition_table_changed", NULL))
+ const gchar *devtype;
+ const gchar *id_type;
+ const gchar *media_state;
+ const gchar *id_fs_usage;
+ gboolean is_cdrom;
+ gboolean is_partition;
+ gboolean is_volume;
+ guint64 audio_tracks;
+
+ g_return_if_fail (context != NULL);
+
+ /* collect general device information */
+ devtype = g_udev_device_get_devtype (context->device);
+ id_type = g_udev_device_get_property (context->device, "ID_TYPE");
+ id_fs_usage = g_udev_device_get_property (context->device, "ID_FS_USAGE");
+
+ /* distinguish device types */
+ is_cdrom = (g_strcmp0 (id_type, "cd") == 0);
+ is_partition = (g_strcmp0 (devtype, "partition") == 0);
+ is_volume = (g_strcmp0 (devtype, "disk") == 0)
+ && (g_strcmp0 (id_fs_usage, "filesystem") == 0);
+
+ if (is_cdrom)
{
-err1: libhal_free_string (storage_udi);
- goto err0;
- }
-
- /* check if this device supports removable media */
- if (libhal_device_get_property_bool (context, storage_udi, "storage.removable", NULL))
- {
- /* check if the device is locked */
- if (libhal_device_get_property_bool (context, storage_udi, "info.locked", NULL))
+ /* silently ignore CD drives without media */
+ if (g_udev_device_get_property_as_boolean (context->device, "ID_CDROM_MEDIA"))
{
- /* pretend that we handled the device */
- libhal_free_string (storage_udi);
- return TRUE;
- }
-
- /* determine the drive type */
- drive_type = libhal_device_get_property_string (context, storage_udi, "storage.drive_type", &derror);
- if (G_UNLIKELY (drive_type == NULL))
- goto err1;
-
- /* check if we have a CD-ROM here */
- is_cdrom = (strcmp (drive_type, "cdrom") == 0);
-
- /* we don't need the storage UDI any more */
- libhal_free_string (storage_udi);
-
- /* free the drive type */
- libhal_free_string (drive_type);
-
- /* CD-ROMs deserve special handling */
- if (G_LIKELY (is_cdrom))
- {
- /* check for blank discs */
- if (libhal_device_get_property_bool (context, udi, "volume.disc.is_blank", NULL))
+ /* collect CD information */
+ media_state = g_udev_device_get_property (context->device,
+ "ID_CDROM_MEDIA_STATE");
+ audio_tracks =
+ g_udev_device_get_property_as_uint64 (context->device,
+ "ID_CDROM_MEDIA_TRACK_COUNT_AUDIO");
+
+ if (g_strcmp0 (media_state, "blank") == 0)
{
- /* run the preferred CD-Burner application */
- return tvm_run_cdburner (preferences, context, udi, error);
+#if 0
+ tvm_run_burn_software (client, device, channel, &error);
+#endif
+ }
+ else if (audio_tracks > 0)
+ {
+#if 0
+ /* TODO detect mixed CDs with audio AND data tracks */
+ tvm_run_cd_player (client, device, channel, &error);
+#endif
}
else
{
- /* check if we have DATA/AUDIO tracks */
- disc_has_audio = libhal_device_get_property_bool (context, udi, "volume.disc.has_audio", NULL);
- disc_has_data = libhal_device_get_property_bool (context, udi, "volume.disc.has_data", NULL);
- if (G_UNLIKELY (disc_has_audio && disc_has_data))
- {
- /* check if we need to prompt the user */
- g_object_get (G_OBJECT (preferences), "automount-media", &automount, "autoplay-audio-cd", &autoplay, NULL);
- if (G_LIKELY (automount && autoplay))
- {
- /* ask what do with the mixed audio/data disc */
- response = tvm_prompt (context, udi, "gnome-dev-cdrom-audio", _("Audio / Data CD"),
- _("The CD in the drive contains both music and files."),
- _("Would you like to listen to music or browse the files?"),
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("_Browse Files"), TVM_RESPONSE_BROWSE,
- _("_Play CD"), TVM_RESPONSE_PLAY,
- NULL);
- switch (response)
- {
- case TVM_RESPONSE_PLAY:
- goto autoplay_disc;
-
- case TVM_RESPONSE_BROWSE:
- goto automount_disc;
-
- default:
- break;
- }
- }
- else if (automount)
- {
- /* just automount the media */
- goto automount_disc;
- }
- else if (autoplay)
- {
- /* just autoplay the disc */
- goto autoplay_disc;
- }
- }
- else if (G_LIKELY (disc_has_audio))
- {
-autoplay_disc: /* run the preferred CD-Player application */
- return tvm_run_cdplayer (preferences, context, udi, error);
- }
- else if (G_LIKELY (disc_has_data))
- {
-automount_disc: /* check if we should automount removable media */
- g_object_get (G_OBJECT (preferences), "automount-media", &automount, NULL);
- if (G_LIKELY (automount))
- {
- /* try to mount the CD-ROM in the disc */
- return tvm_block_device_mount (preferences, context, udi, error);
- }
- }
+ /* mount the CD/DVD and continue with inspecting its contents */
+ tvm_block_device_mount (context);
}
}
}
- else
+ else if (is_partition || is_volume)
{
- /* we don't need the storage UDI any more */
- libhal_free_string (storage_udi);
+ /* mount the partition and continue with inspecting its contents */
+ tvm_block_device_mount (context);
}
-
- /* determine the file system usage of the volume */
- fsusage = libhal_device_get_property_string (context, udi, "volume.fsusage", NULL);
- has_crypto = (G_UNLIKELY (fsusage != NULL && strcmp (fsusage, "crypto") == 0));
- has_filesystem = (G_LIKELY (fsusage != NULL && strcmp (fsusage, "filesystem") == 0));
- libhal_free_string (fsusage);
-
- /* check if we have a crypto volume to setup here */
- if (G_UNLIKELY (has_crypto))
- {
- /* try to setup the crypto volume */
- return tvm_crypto_volume_setup (preferences, context, udi, error);
- }
- else if (G_LIKELY (has_filesystem))
+ else
{
- /* check if we should automount drives, otherwise, we're done here */
- g_object_get (G_OBJECT (preferences), "automount-drives", &automount, NULL);
- if (G_UNLIKELY (!automount))
- return FALSE;
+ /* generate an error for logging */
+ g_set_error (context->error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+ _("Unknown block device type"));
- /* try to mount the block device */
- return tvm_block_device_mount (preferences, context, udi, error);
+ /* finish processing the device */
+ tvm_device_handler_finished (context);
}
-
- return FALSE;
}
-
-
-
-
diff --git a/thunar-volman/tvm-block-device.h b/thunar-volman/tvm-block-device.h
index 2f51e6a..5f6f1d7 100644
--- a/thunar-volman/tvm-block-device.h
+++ b/thunar-volman/tvm-block-device.h
@@ -1,34 +1,34 @@
-/* $Id$ */
+/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
*
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
- * This program 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.
+ * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
#ifndef __TVM_BLOCK_DEVICE_H__
#define __TVM_BLOCK_DEVICE_H__
+#include <glib.h>
+
+#include <thunar-volman/tvm-context.h>
#include <thunar-volman/tvm-device.h>
G_BEGIN_DECLS
-gboolean tvm_block_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error) G_GNUC_INTERNAL;
+void tvm_block_device_added (TvmContext *context);
G_END_DECLS
diff --git a/thunar-volman/tvm-camera-device.c b/thunar-volman/tvm-camera-device.c
deleted file mode 100644
index fb04a5a..0000000
--- a/thunar-volman/tvm-camera-device.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include <thunar-volman/tvm-camera-device.h>
-#include <thunar-volman/tvm-prompt.h>
-#include <thunar-volman/tvm-run.h>
-
-
-
-/**
- * tvm_block_camera_added:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the HAL device UDI of the newly added camera device.
- * @capability : the capability, which caused this handler to be run.
- * @error : return location for errors or %NULL.
- *
- * See #TvmDeviceCallback for further information.
- *
- * Return value: %TRUE if handled, %FALSE if not handled or an
- * unrecoverable error occurred.
- **/
-gboolean
-tvm_camera_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error)
-{
- gboolean result = FALSE;
- gboolean autophoto;
- gchar *autophoto_command;
- gchar *access_method;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_return_val_if_fail (capability != NULL, FALSE);
- g_return_val_if_fail (context != NULL, FALSE);
-
- /* check if this is a non-mass-storage camera device, handled by gphoto2 */
- access_method = libhal_device_get_property_string (context, udi, "camera.access_method", NULL);
- if ((access_method != NULL && strcmp (access_method, "ptp") == 0)
- || libhal_device_get_property_bool (context, udi, "camera.libgphoto2.support", NULL))
- {
- /* check if autophoto support is enabled */
- g_object_get (G_OBJECT (preferences), "autophoto", &autophoto, "autophoto-command", &autophoto_command, NULL);
- if (G_LIKELY (autophoto && autophoto_command != NULL && *autophoto_command != '\0'))
- {
- /* run the preferred photo management application */
- result = tvm_run_command (context, udi, autophoto_command, NULL, NULL, error);
- }
- g_free (autophoto_command);
- }
- libhal_free_string (access_method);
-
- return result;
-}
-
-
-
-
diff --git a/thunar-volman/tvm-camera-device.h b/thunar-volman/tvm-camera-device.h
deleted file mode 100644
index df09a27..0000000
--- a/thunar-volman/tvm-camera-device.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_CAMERA_DEVICE_H__
-#define __TVM_CAMERA_DEVICE_H__
-
-#include <thunar-volman/tvm-device.h>
-
-G_BEGIN_DECLS
-
-gboolean tvm_camera_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error) G_GNUC_INTERNAL;
-
-G_END_DECLS
-
-#endif /* !__TVM_CAMERA_DEVICE_H__ */
diff --git a/thunar-volman/tvm-command-entry.c b/thunar-volman/tvm-command-entry.c
deleted file mode 100644
index 8f2e349..0000000
--- a/thunar-volman/tvm-command-entry.c
+++ /dev/null
@@ -1,411 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2005-2007 Benedikt Meurer <benny at xfce.org>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include <thunar-volman/tvm-command-entry.h>
-
-
-
-/* Property identifiers */
-enum
-{
- PROP_0,
- PROP_COMMAND,
-};
-
-
-
-static void tvm_command_entry_class_init (TvmCommandEntryClass *klass);
-static void tvm_command_entry_init (TvmCommandEntry *command_entry);
-static void tvm_command_entry_finalize (GObject *object);
-static void tvm_command_entry_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void tvm_command_entry_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void tvm_command_entry_clicked (GtkWidget *button,
- TvmCommandEntry *command_entry);
-
-
-
-static GObjectClass *tvm_command_entry_parent_class;
-
-
-
-GType
-tvm_command_entry_get_type (void)
-{
- static GType type = G_TYPE_INVALID;
-
- if (G_UNLIKELY (type == G_TYPE_INVALID))
- {
- static const GTypeInfo info =
- {
- sizeof (TvmCommandEntryClass),
- NULL,
- NULL,
- (GClassInitFunc) tvm_command_entry_class_init,
- NULL,
- NULL,
- sizeof (TvmCommandEntry),
- 0,
- (GInstanceInitFunc) tvm_command_entry_init,
- NULL,
- };
-
- type = g_type_register_static (GTK_TYPE_HBOX, I_("TvmCommandEntry"), &info, 0);
- }
-
- return type;
-}
-
-
-
-static void
-tvm_command_entry_class_init (TvmCommandEntryClass *klass)
-{
- GObjectClass *gobject_class;
-
- /* determine the parent type class */
- tvm_command_entry_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->finalize = tvm_command_entry_finalize;
- gobject_class->get_property = tvm_command_entry_get_property;
- gobject_class->set_property = tvm_command_entry_set_property;
-
- /**
- * TvmCommandEntry:command:
- *
- * The command currently entered into this command entry widget.
- **/
- g_object_class_install_property (gobject_class,
- PROP_COMMAND,
- g_param_spec_string ("command",
- "command",
- "command",
- NULL,
- EXO_PARAM_READWRITE));
-}
-
-
-
-static void
-tvm_command_entry_init (TvmCommandEntry *command_entry)
-{
- GtkWidget *button;
- GtkWidget *align;
- GtkWidget *image;
-
- gtk_box_set_spacing (GTK_BOX (command_entry), 2);
-
- align = g_object_new (GTK_TYPE_ALIGNMENT, "width-request", 10, NULL);
- gtk_box_pack_start (GTK_BOX (command_entry), align, FALSE, FALSE, 0);
- gtk_widget_show (align);
-
- command_entry->label = g_object_new (GTK_TYPE_LABEL, "use-underline", TRUE, "xalign", 0.0f, NULL);
- gtk_box_pack_start (GTK_BOX (command_entry), command_entry->label, FALSE, FALSE, 10);
- gtk_widget_show (command_entry->label);
-
- command_entry->entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (command_entry->label), command_entry->entry);
- exo_mutual_binding_new (G_OBJECT (command_entry->entry), "text", G_OBJECT (command_entry), "command");
- gtk_box_pack_start (GTK_BOX (command_entry), command_entry->entry, TRUE, TRUE, 0);
- gtk_widget_show (command_entry->entry);
-
- button = gtk_button_new ();
- g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (tvm_command_entry_clicked), command_entry);
- gtk_box_pack_start (GTK_BOX (command_entry), button, FALSE, FALSE, 0);
- gtk_widget_show (button);
-
- image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON);
- gtk_container_add (GTK_CONTAINER (button), image);
- gtk_widget_show (image);
-}
-
-
-
-static void
-tvm_command_entry_finalize (GObject *object)
-{
- TvmCommandEntry *command_entry = TVM_COMMAND_ENTRY (object);
-
- /* cleanup properties */
- g_free (command_entry->command);
-
- (*G_OBJECT_CLASS (tvm_command_entry_parent_class)->finalize) (object);
-}
-
-
-
-static void
-tvm_command_entry_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- TvmCommandEntry *command_entry = TVM_COMMAND_ENTRY (object);
-
- switch (prop_id)
- {
- case PROP_COMMAND:
- g_value_set_string (value, tvm_command_entry_get_command (command_entry));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-
-
-static void
-tvm_command_entry_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- TvmCommandEntry *command_entry = TVM_COMMAND_ENTRY (object);
-
- switch (prop_id)
- {
- case PROP_COMMAND:
- tvm_command_entry_set_command (command_entry, g_value_get_string (value));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-
-
-
-static void
-tvm_command_entry_clicked (GtkWidget *button,
- TvmCommandEntry *command_entry)
-{
- GtkFileFilter *filter;
- GtkWidget *toplevel;
- GtkWidget *chooser;
- gchar *filename;
- gchar *s;
-
- g_return_if_fail (GTK_IS_BUTTON (button));
- g_return_if_fail (TVM_IS_COMMAND_ENTRY (command_entry));
-
- /* determine the toplevel widget */
- toplevel = gtk_widget_get_toplevel (button);
- if (toplevel == NULL || !GTK_WIDGET_TOPLEVEL (toplevel))
- return;
-
- chooser = gtk_file_chooser_dialog_new (_("Select an Application"),
- GTK_WINDOW (toplevel),
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), TRUE);
-
- /* add file chooser filters */
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("All Files"));
- gtk_file_filter_add_pattern (filter, "*");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Executable Files"));
- gtk_file_filter_add_mime_type (filter, "application/x-csh");
- gtk_file_filter_add_mime_type (filter, "application/x-executable");
- gtk_file_filter_add_mime_type (filter, "application/x-perl");
- gtk_file_filter_add_mime_type (filter, "application/x-python");
- gtk_file_filter_add_mime_type (filter, "application/x-ruby");
- gtk_file_filter_add_mime_type (filter, "application/x-shellscript");
- gtk_file_filter_add_pattern (filter, "*.pl");
- gtk_file_filter_add_pattern (filter, "*.py");
- gtk_file_filter_add_pattern (filter, "*.rb");
- gtk_file_filter_add_pattern (filter, "*.sh");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
- gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Perl Scripts"));
- gtk_file_filter_add_mime_type (filter, "application/x-perl");
- gtk_file_filter_add_pattern (filter, "*.pl");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Python Scripts"));
- gtk_file_filter_add_mime_type (filter, "application/x-python");
- gtk_file_filter_add_pattern (filter, "*.py");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Ruby Scripts"));
- gtk_file_filter_add_mime_type (filter, "application/x-ruby");
- gtk_file_filter_add_pattern (filter, "*.rb");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Shell Scripts"));
- gtk_file_filter_add_mime_type (filter, "application/x-csh");
- gtk_file_filter_add_mime_type (filter, "application/x-shellscript");
- gtk_file_filter_add_pattern (filter, "*.sh");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
-
- /* use the bindir as default folder */
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), BINDIR);
-
- /* setup the currently selected file */
- g_object_get (G_OBJECT (command_entry), "command", &filename, NULL);
- if (G_LIKELY (filename != NULL))
- {
- /* use only the first argument */
- s = strchr (filename, ' ');
- if (G_UNLIKELY (s != NULL))
- *s = '\0';
-
- /* check if we have a file name */
- if (G_LIKELY (*filename != '\0'))
- {
- /* check if the filename is not an absolute path */
- if (G_LIKELY (!g_path_is_absolute (filename)))
- {
- /* try to lookup the filename in $PATH */
- s = g_find_program_in_path (filename);
- if (G_LIKELY (s != NULL))
- {
- /* use the absolute path instead */
- g_free (filename);
- filename = s;
- }
- }
-
- /* check if we have an absolute path now */
- if (G_LIKELY (g_path_is_absolute (filename)))
- gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (chooser), filename);
- }
-
- /* release the filename */
- g_free (filename);
- }
-
- /* run the chooser dialog */
- if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT)
- {
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
- tvm_command_entry_set_command (command_entry, filename);
- g_free (filename);
- }
-
- gtk_widget_destroy (chooser);
-}
-
-
-
-/**
- * tvm_command_entry_new:
- *
- * Allocates a new #TvmCommandEntry instance.
- *
- * Return value: the newly allocated #TvmCommandEntry.
- **/
-GtkWidget*
-tvm_command_entry_new (void)
-{
- return g_object_new (TVM_TYPE_COMMAND_ENTRY, NULL);
-}
-
-
-
-/**
- * tvm_command_entry_new:
- * @label : the label for the command entry.
- *
- * Allocates a new #TvmCommandEntry instance with the @label.
- *
- * Return value: the newly allocated #TvmCommandEntry.
- **/
-GtkWidget*
-tvm_command_entry_new_with_label (const gchar *label)
-{
- TvmCommandEntry *entry;
-
- g_return_val_if_fail (label == NULL || g_utf8_validate (label, -1, NULL), NULL);
-
- entry = g_object_new (TVM_TYPE_COMMAND_ENTRY, NULL);
- if (G_LIKELY (label != NULL))
- g_object_set (G_OBJECT (entry->label), "label", label, "use-underline", TRUE, NULL);
- return GTK_WIDGET (entry);
-}
-
-
-
-/**
- * tvm_command_entry_get_command:
- * @command_entry : a #TvmCommandEntry.
- *
- * Returns the command of the @command_entry.
- *
- * Return value: the command in the @command_entry.
- **/
-const gchar*
-tvm_command_entry_get_command (TvmCommandEntry *command_entry)
-{
- g_return_val_if_fail (TVM_IS_COMMAND_ENTRY (command_entry), NULL);
- return command_entry->command;
-}
-
-
-
-/**
- * tvm_command_entry_set_command:
- * @command_entry : a #TvmCommandEntry.
- * @command : the new command.
- *
- * Sets the command in @command_entry to @command.
- **/
-void
-tvm_command_entry_set_command (TvmCommandEntry *command_entry,
- const gchar *command)
-{
- g_return_if_fail (TVM_IS_COMMAND_ENTRY (command_entry));
- g_return_if_fail (g_utf8_validate (command, -1, NULL));
-
- /* update to the new command */
- g_free (command_entry->command);
- command_entry->command = g_strdup (command);
- g_object_notify (G_OBJECT (command_entry), "command");
-}
-
diff --git a/thunar-volman/tvm-command-entry.h b/thunar-volman/tvm-command-entry.h
deleted file mode 100644
index 73b213f..0000000
--- a/thunar-volman/tvm-command-entry.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2005-2007 Benedikt Meurer <benny at xfce.org>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_COMMAND_ENTRY_H__
-#define __TVM_COMMAND_ENTRY_H__
-
-#include <exo/exo.h>
-
-G_BEGIN_DECLS
-
-typedef struct _TvmCommandEntryClass TvmCommandEntryClass;
-typedef struct _TvmCommandEntry TvmCommandEntry;
-
-#define TVM_TYPE_COMMAND_ENTRY (tvm_command_entry_get_type ())
-#define TVM_COMMAND_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TVM_TYPE_COMMAND_ENTRY, TvmCommandEntry))
-#define TVM_COMMAND_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TVM_TYPE_COMMAND_ENTRY, TvmCommandEntryClass))
-#define TVM_IS_COMMAND_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TVM_TYPE_COMMAND_ENTRY))
-#define TVM_IS_COMMAND_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TVM_TYPE_COMMAND_ENTRY))
-#define TVM_COMMAND_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TVM_TYPE_COMMAND_ENTRY, TvmCommandEntryClass))
-
-struct _TvmCommandEntryClass
-{
- GtkHBoxClass __parent__;
-};
-
-struct _TvmCommandEntry
-{
- GtkHBox __parent__;
- GtkWidget *entry;
- GtkWidget *label;
- gchar *command;
-};
-
-GType tvm_command_entry_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL;
-
-GtkWidget *tvm_command_entry_new (void) G_GNUC_INTERNAL G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-GtkWidget *tvm_command_entry_new_with_label (const gchar *label) G_GNUC_INTERNAL G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-
-const gchar *tvm_command_entry_get_command (TvmCommandEntry *command_entry) G_GNUC_INTERNAL;
-void tvm_command_entry_set_command (TvmCommandEntry *command_entry,
- const gchar *command) G_GNUC_INTERNAL;
-
-G_END_DECLS
-
-#endif /* !__TVM_COMMAND_ENTRY_H__ */
diff --git a/thunar-volman/tvm-context.c b/thunar-volman/tvm-context.c
new file mode 100644
index 0000000..8685f70
--- /dev/null
+++ b/thunar-volman/tvm-context.c
@@ -0,0 +1,93 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
+ *
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <gudev/gudev.h>
+
+#include <xfconf/xfconf.h>
+
+#include <thunar-volman/tvm-context.h>
+#include <thunar-volman/tvm-device.h>
+
+
+
+TvmContext *
+tvm_context_new (GUdevClient *client,
+ GUdevDevice *device,
+ XfconfChannel *channel,
+ GMainLoop *loop,
+ GError **error)
+{
+ TvmContext *context;
+
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
+ g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
+ g_return_val_if_fail (XFCONF_IS_CHANNEL (channel), NULL);
+ g_return_val_if_fail (loop != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ context = g_slice_new0 (TvmContext);
+
+ context->client = g_object_ref (client);
+ context->device = g_object_ref (device);
+ context->channel = g_object_ref (channel);
+ context->error = error;
+ context->loop = g_main_loop_ref (loop);
+ context->handlers = NULL;
+ context->monitor = g_volume_monitor_get ();
+
+ return context;
+}
+
+
+
+void
+tvm_context_free (TvmContext *context)
+{
+ if (context == NULL)
+ return;
+
+ g_main_loop_unref (context->loop);
+
+ g_list_free (context->handlers);
+
+ g_object_unref (context->monitor);
+ g_object_unref (context->channel);
+ g_object_unref (context->device);
+ g_object_unref (context->client);
+
+ g_slice_free (TvmContext, context);
+}
+
+
+
+gboolean
+tvm_context_run (TvmContext *context)
+{
+ tvm_device_added (context);
+
+ return FALSE;
+}
diff --git a/thunar-volman/tvm-context.h b/thunar-volman/tvm-context.h
new file mode 100644
index 0000000..9dbd33e
--- /dev/null
+++ b/thunar-volman/tvm-context.h
@@ -0,0 +1,59 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
+ *
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __TVM_CONTEXT_H__
+#define __TVM_CONTEXT_H__
+
+#include <gio/gio.h>
+
+#include <gudev/gudev.h>
+
+#include <xfconf/xfconf.h>
+
+G_BEGIN_DECLS
+
+typedef struct _TvmContext TvmContext;
+
+
+
+TvmContext *tvm_context_new (GUdevClient *client,
+ GUdevDevice *device,
+ XfconfChannel *channel,
+ GMainLoop *loop,
+ GError **error) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
+void tvm_context_free (TvmContext *context);
+gboolean tvm_context_run (TvmContext *context);
+
+
+
+struct _TvmContext
+{
+ GVolumeMonitor *monitor;
+ XfconfChannel *channel;
+ GUdevClient *client;
+ GUdevDevice *device;
+ GMainLoop *loop;
+ GError **error;
+ GList *handlers;
+};
+
+G_END_DECLS
+
+#endif /* !__TVM_CONTEXT_H__ */
diff --git a/thunar-volman/tvm-crypto-volume.c b/thunar-volman/tvm-crypto-volume.c
deleted file mode 100644
index 550089e..0000000
--- a/thunar-volman/tvm-crypto-volume.c
+++ /dev/null
@@ -1,483 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2008 Benedikt Meurer <benny at xfce.org>.
- * Copyright (c) 2008 Colin Leroy <colin at colino.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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#include <errno.h>
-
-#include <dbus/dbus-glib-lowlevel.h>
-#include <thunar-volman/tvm-block-device.h>
-#include <thunar-volman/tvm-crypto-volume.h>
-#include <libhal-storage.h>
-
-static void
-tvm_crypto_volume_prompt_update_text (GtkEditable *editable,
- gchar *new_text,
- gint new_text_len,
- gint *position,
- gpointer data)
-{
- gchar **response = (gchar **)data;
- if (response == NULL)
- return;
- g_free(*response);
- *response = gtk_editable_get_chars(editable, 0, -1);
-}
-
-typedef struct _CryptoDialogValidate {
- GtkWidget *dialog;
- gint response;
-} CryptoDialogValidate;
-
-void
-tvm_crypto_volume_prompt_validate_text (GtkEntry *entry,
- gpointer data)
-{
- CryptoDialogValidate *validate_data = (CryptoDialogValidate *)data;
- gtk_dialog_response(GTK_DIALOG(validate_data->dialog), validate_data->response);
-}
-
-static void
-tvm_crypto_volume_hal_device_removed (LibHalContext *context,
- const gchar *udi)
-{
- const gchar *dialog_udi;
- GtkWidget *dialog = libhal_ctx_get_user_data (context);
-
- /* check if the active UDI of the dialog was removed */
- dialog_udi = g_object_get_data (G_OBJECT (dialog), "udi");
- if (exo_str_is_equal (dialog_udi, udi))
- {
- /* cancel the dialog */
- gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
- }
-}
-
- /**
- * tvm_crypto_volume_ask_password:
- * @context : a #LibHalContext.
- * @udi : the UDI of the device being added, which is watched for removal.
- * @icon : the icon or %NULL.
- * @title : the prompt title.
- * @response_text : the response text.
- * @visible : whether text typed should be visible.
- * @default_response : Which response to return on Enter.
- * @primary_text : the primary prompt text.
- * @secondary_text : the secondary prompt text.
- * @first_button_text : the first button text.
- * @... : %NULL-terminated list of button text, response id pairs.
- *
- * Return value: the selected response.
- **/
-static gint
-tvm_crypto_volume_ask_password (LibHalContext *context,
- const gchar *udi,
- const gchar *icon,
- const gchar *title,
- gchar **response_text,
- gboolean visible,
- gint default_response,
- const gchar *primary_text,
- const gchar *secondary_text,
- const gchar *first_button_text,
- ...)
-{
- GtkWidget *dialog;
- GtkWidget *image;
- GtkWidget *label;
- GtkWidget *hbox;
- GtkWidget *vbox;
- GtkWidget *entry;
- DBusError derror;
- va_list args;
- gint response;
- CryptoDialogValidate validate_data;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), 0);
- g_return_val_if_fail (context != NULL, GTK_RESPONSE_CANCEL);
-
- /* allocate a new dialog */
- dialog = gtk_dialog_new ();
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
- g_object_set_data_full (G_OBJECT (dialog), "udi", g_strdup (udi), g_free);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 6);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 12);
-
- /* setup the specified title */
- if (G_LIKELY (title != NULL))
- gtk_window_set_title (GTK_WINDOW (dialog), title);
-
- /* setup the specified buttons */
- if (G_LIKELY (first_button_text != NULL))
- {
- va_start (args, first_button_text);
- for (response = va_arg (args, gint); first_button_text != NULL; )
- {
- /* insert the button */
- gtk_dialog_add_button (GTK_DIALOG (dialog), first_button_text, response);
- first_button_text = va_arg (args, const gchar *);
- if (G_UNLIKELY (first_button_text == NULL))
- break;
- response = va_arg (args, gint);
- }
- va_end (args);
- }
-
- /* setup the hbox */
- hbox = gtk_hbox_new (FALSE, 12);
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, 0);
- gtk_widget_show (hbox);
-
- /* setup the specified icon */
- if (G_LIKELY (icon != NULL))
- {
- /* setup an image for the icon */
- image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.0f, 0.0f);
- gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
- gtk_widget_show (image);
- }
-
- /* setup the vbox */
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
- gtk_widget_show (vbox);
- g_object_set_data(G_OBJECT(dialog), "main_vbox", vbox);
-
- /* setup the primary text */
- label = gtk_label_new (primary_text);
- gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
- gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
- gtk_widget_show (label);
-
- /* setup the secondary text */
- if (G_LIKELY (secondary_text != NULL))
- {
- label = gtk_label_new (secondary_text);
- gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
- gtk_widget_show (label);
- g_object_set_data(G_OBJECT(dialog), "secondary_text", label);
- }
-
- entry = gtk_entry_new();
- gtk_entry_set_visibility(GTK_ENTRY(entry), visible);
- gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
- gtk_widget_show (entry);
- g_object_set_data(G_OBJECT(dialog), "pass_entry", entry);
-
- /* initialize D-Bus error */
- dbus_error_init (&derror);
-
- /* setup HAL to watch the UDI for removal */
- libhal_ctx_set_user_data (context, dialog);
- libhal_ctx_set_device_removed (context, tvm_crypto_volume_hal_device_removed);
- libhal_device_property_watch_all (context, &derror);
-
- /* setup handler for the entered text */
- if (response_text)
- *response_text = NULL;
- g_signal_connect_after(G_OBJECT(entry), "insert-text",
- G_CALLBACK(tvm_crypto_volume_prompt_update_text),
- (gpointer) response_text);
- validate_data.dialog = dialog;
- validate_data.response = default_response;
- g_signal_connect(G_OBJECT(entry), "activate",
- G_CALLBACK(tvm_crypto_volume_prompt_validate_text),
- (gpointer) &validate_data);
-
- /* run the dialog */
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy(dialog);
-
- /* cleanup */
- libhal_ctx_set_device_removed (context, NULL);
- libhal_ctx_set_user_data (context, NULL);
- dbus_error_free (&derror);
-
- return response;
-}
-
-static gboolean
-progress_pulse(gpointer data)
-{
- GtkProgressBar *progress = GTK_PROGRESS_BAR(data);
- g_return_val_if_fail(progress != NULL, FALSE);
-
- gtk_progress_bar_pulse(progress);
-
- return TRUE;
-}
-
-static void
-tvm_crypto_volume_dbus_call_done (DBusPendingCall *call,
- void *user_data)
-{
- gtk_main_quit();
-}
-
-static gchar *
-tvm_crypto_volume_mount_install_crypto_volume (LibHalContext *context,
- const gchar *udi,
- LibHalVolume *volume,
- const gchar *password,
- gboolean *pass_error,
- GError **error)
-{
- gchar *plain_udi = NULL;
- DBusMessage *message = NULL;
- DBusMessage *result = NULL;
- DBusConnection *dbus_connection = NULL;
- DBusPendingCall *call = NULL;
- DBusError derror;
- dbus_bool_t send_err;
- *pass_error = FALSE;
- GtkWidget *window = NULL;
- GtkWidget *label, *vbox, *hbox;
- GtkWidget *wait_progress;
- GtkWidget *image;
- guint animator_id;
- g_clear_error(error);
-
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_container_set_border_width(GTK_CONTAINER(window), 8);
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
- gtk_window_set_title(GTK_WINDOW(window), _("Encrypted volume"));
- gtk_window_set_modal(GTK_WINDOW(window), TRUE);
- gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
-
- vbox = gtk_vbox_new(FALSE, 6);
- hbox = gtk_hbox_new(FALSE, 6);
- image = gtk_image_new_from_icon_name ("gtk-dialog-authentication", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.0f, 0.0f);
- gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
- gtk_widget_show (image);
-
- label = gtk_label_new(_("<span weight=\"bold\" size=\"larger\">Mounting encrypted volume...</span>"));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
- gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
- gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 0);
-
- label = gtk_label_new(_("Setting up the crypto layer..."));
- gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
- gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 0);
-
- wait_progress = gtk_progress_bar_new();
- gtk_box_pack_start(GTK_BOX(vbox), wait_progress, TRUE, FALSE, 0);
-
- gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
-
- gtk_container_add(GTK_CONTAINER(window), hbox);
- gtk_widget_show_all(hbox);
- animator_id = g_timeout_add(100, progress_pulse, wait_progress);
-
- gtk_widget_show_now(window);
-
- message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
- "org.freedesktop.Hal.Device.Volume.Crypto",
- "Setup");
-
- if (G_UNLIKELY (message == NULL))
- {
- /* out of memory */
-oom: g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, g_strerror (ENOMEM));
- goto out;
- }
-
- if (!dbus_message_append_args (message,
- DBUS_TYPE_STRING, &password,
- DBUS_TYPE_INVALID)) {
- dbus_message_unref (message);
- goto oom;
- }
-
- dbus_error_init (&derror);
-
- dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &derror);
- if (G_UNLIKELY (dbus_connection == NULL))
- {
- /* propagate the error */
- dbus_set_g_error (error, &derror);
- goto out;
- }
-
- send_err = dbus_connection_send_with_reply (dbus_connection, message, &call, -1);
- if (G_UNLIKELY (send_err == FALSE))
- {
- /* release the result */
- dbus_message_unref (message);
- goto out;
- }
-
- dbus_pending_call_set_notify(call, tvm_crypto_volume_dbus_call_done, NULL, NULL);
- gtk_main();
-
- result = dbus_pending_call_steal_reply(call);
- /* release the message */
- dbus_message_unref (message);
-
- /* release the connection */
- dbus_connection_unref (dbus_connection);
-
- if (G_UNLIKELY (dbus_set_error_from_message(&derror, result)))
- {
- /* try to translate the error appropriately */
- if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.PermissionDenied") == 0)
- {
- /* TRANSLATORS: The user tried to setup a crypto layer (LUKS-encrpyted volume) but got Permission denied. */
- g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("You are not privileged to setup the crypto layer"));
- }
- else if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.Crypto.SetupPasswordError") == 0)
- {
- /* TRANSLATORS: The user tried to setup a crypto layer (LUKS-encrpyted volume) and typed the wrong password. */
- g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("Wrong password"));
- *pass_error = TRUE;
- }
- else
- {
- /* no precise error message, use the HAL one */
- dbus_set_g_error (error, &derror);
- }
-
- /* release the DBus error */
- dbus_error_free (&derror);
- dbus_message_unref (result);
- plain_udi = NULL;
- goto out;
- }
- else
- {
- dbus_message_unref (result);
- plain_udi = libhal_volume_crypto_get_clear_volume_udi (context, volume);
- }
-
-out:
- g_source_remove(animator_id);
- gtk_widget_destroy(window);
- return plain_udi;
-}
-
-/**
- * tvm_crypto_volume_setup:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the HAL volume UDI of the newly added crypto volume.
- * @error : return location for errors or %NULL.
- *
- * Tries to setup the crypto layer for the volume with the
- * specified @udi.
- *
- * Return value: %TRUE if handled, %FALSE if not handled or an
- * unrecoverable error occurred.
- */
-gboolean
-tvm_crypto_volume_setup (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- GError **error)
-{
- gchar *password = NULL;
- gboolean pass_error = FALSE;
- gint num_tries = 0;
- gchar *plain_udi = NULL;
- LibHalVolume *volume = NULL;
- gboolean result = FALSE;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_return_val_if_fail (context != NULL, FALSE);
-
- volume = libhal_volume_from_udi (context, udi);
- g_return_val_if_fail(volume != NULL, FALSE);
- plain_udi = libhal_volume_crypto_get_clear_volume_udi (context, volume);
- if (plain_udi != NULL) {
- libhal_volume_free(volume);
- libhal_free_string(plain_udi);
- return TRUE;
- }
-
- for (num_tries = 0; num_tries < 3; num_tries++) {
- gint response,len;
- response = tvm_crypto_volume_ask_password (context, udi, "gtk-dialog-authentication", _("Encrypted volume"),
- &password, FALSE, GTK_RESPONSE_OK,
- pass_error? _("<span weight=\"bold\" size=\"larger\">Wrong password.</span>")
- :_("<span weight=\"bold\" size=\"larger\">This volume is encrypted.</span>"),
- _("Please enter your password to decrypt and mount the volume."),
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("_Mount"), GTK_RESPONSE_OK,
- NULL);
- if (response == GTK_RESPONSE_CANCEL || response == GTK_RESPONSE_DELETE_EVENT) {
- g_clear_error(error);
- num_tries = 3;
- } else if (password) {
- plain_udi = tvm_crypto_volume_mount_install_crypto_volume(context, udi, volume, password, &pass_error, error);
- }
- if (password) {
- len = strlen(password);
- memset(password, 0, len);
- g_debug("zeroed password %p", password);
- g_free(password);
- }
- if (*error != NULL && !pass_error) {
- /* display an error message to the user (exo-mount won't do it as it won't see the clear device */
- GtkWidget *message = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- "%s.", _("Failed to setup the encrypted volume"));
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message), "%s.", (*error)->message);
- gtk_dialog_run (GTK_DIALOG (message));
- gtk_widget_destroy (message);
- break;
- }
- if (plain_udi != NULL) {
- libhal_free_string(plain_udi);
- result = TRUE;
- break;
- }
- }
- return result;
-}
-
-
diff --git a/thunar-volman/tvm-crypto-volume.h b/thunar-volman/tvm-crypto-volume.h
deleted file mode 100644
index 0e4ebf3..0000000
--- a/thunar-volman/tvm-crypto-volume.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2008 Benedikt Meurer <benny at xfce.org>.
- * Copyright (c) 2008 Colin Leroy <colin at colino.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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_CRYPTO_VOLUME_H__
-#define __TVM_CRYPTO_VOLUME_H__
-
-#include <thunar-volman/tvm-device.h>
-
-G_BEGIN_DECLS
-
-gboolean tvm_crypto_volume_setup (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- GError **error) G_GNUC_INTERNAL;
-
-G_END_DECLS
-
-#endif /* !__TVM_CRYPTO_VOLUME_H__ */
diff --git a/thunar-volman/tvm-device.c b/thunar-volman/tvm-device.c
index 584b222..6c0c045 100644
--- a/thunar-volman/tvm-device.c
+++ b/thunar-volman/tvm-device.c
@@ -1,203 +1,139 @@
-/* $Id$ */
+/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
*
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
- * This program 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.
+ * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
+#include <glib.h>
+
+#include <gudev/gudev.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <libxfce4util/libxfce4util.h>
+
+#include <xfconf/xfconf.h>
#include <thunar-volman/tvm-block-device.h>
-#include <thunar-volman/tvm-camera-device.h>
+#include <thunar-volman/tvm-context.h>
#include <thunar-volman/tvm-device.h>
-#include <thunar-volman/tvm-input-device.h>
-#include <thunar-volman/tvm-pda-device.h>
-#include <thunar-volman/tvm-printer-device.h>
typedef struct _TvmDeviceHandler TvmDeviceHandler;
+
+
+
+static void tvm_device_try_next_handler (TvmContext *context);
+
+
+
struct _TvmDeviceHandler
{
- const gchar *capability;
- TvmDeviceCallback callback;
+ const gchar *subsystem;
+ TvmDeviceHandlerFunc func;
};
-static const TvmDeviceHandler handlers[] =
+static TvmDeviceHandler subsystem_handlers[] =
{
- { "block", tvm_block_device_added, },
- { "camera", tvm_camera_device_added, },
- { "input.keyboard", tvm_input_device_added, },
- { "input.mouse", tvm_input_device_added, },
- { "input.tablet", tvm_input_device_added, },
- { "pda", tvm_pda_device_added, },
- { "printer", tvm_printer_device_added, },
+ { "block", tvm_block_device_added },
+#if 0
+ { "input", tvm_input_device_added },
+ { "sound", tvm_sound_device_added },
+ { "video4linux", tvm_video_device_added },
+#endif
};
-static gint
-strptrcmp (gconstpointer strptr1,
- gconstpointer strptr2)
+void
+tvm_device_handler_finished (TvmContext *context)
{
- return strcmp (*((const gchar **) strptr1),
- *((const gchar **) strptr2));
+ g_return_if_fail (context != NULL);
+
+ if (context->error != NULL && *context->error != NULL)
+ {
+ g_list_free (context->handlers);
+ g_main_loop_quit (context->loop);
+ }
+ else
+ {
+ if (context->handlers != NULL)
+ tvm_device_try_next_handler (context);
+ else
+ g_main_loop_quit (context->loop);
+ }
}
-/**
- * tvm_device_added:
- * @preferences : a #TvmPreferences.
- * @udi : the HAL device UDI of the newly added device.
- * @error : return location for errors or %NULL.
- *
- * Invoked whenever a new device is added, where @udi is the
- * HAL device UDI of the device in question. Returns %FALSE if
- * an unrecoverable error occurred, %TRUE otherwise.
- *
- * Return value: %FALSE in case of an unrecoverable error,
- * %TRUE otherwise.
- **/
-gboolean
-tvm_device_added (TvmPreferences *preferences,
- const gchar *udi,
- GError **error)
+static void
+tvm_device_try_next_handler (TvmContext *context)
{
- DBusConnection *connection;
- LibHalContext *context;
- DBusError derror;
- GError *err = NULL;
- gchar **capabilities;
- gint n_capabilities;
- gint i, j, n;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
- /* try to allocate a new HAL context */
- context = libhal_ctx_new ();
- if (G_UNLIKELY (context == NULL))
- {
- /* out of memory */
- g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, g_strerror (ENOMEM));
- return FALSE;
- }
+ TvmDeviceHandler *handler;
- /* initialize D-Bus error */
- dbus_error_init (&derror);
+ g_return_if_fail (context != NULL);
- /* try to connect to the system bus */
- connection = dbus_bus_get (DBUS_BUS_SYSTEM, &derror);
- if (G_UNLIKELY (connection == NULL))
- {
-err0: /* release the HAL context */
- libhal_ctx_free (context);
+ handler = context->handlers->data;
+ context->handlers = g_list_delete_link (context->handlers, context->handlers);
- /* propagate the error */
- dbus_set_g_error (error, &derror);
- return FALSE;
- }
+ handler->func (context);
+}
- /* setup the D-Bus connection for the GLib main loop */
- dbus_connection_setup_with_g_main (connection, NULL);
- /* setup the D-Bus connection for the HAL context */
- libhal_ctx_set_dbus_connection (context, connection);
- /* the HAL context now owns the connection */
- dbus_connection_unref (connection);
+void
+tvm_device_added (TvmContext *context)
+{
+ const gchar *const *keys = NULL;
+ const gchar *subsystem;
+ gint n;
- /* try to initialize the HAL context */
- if (!libhal_ctx_init (context, &derror))
- goto err0;
+ g_return_if_fail (context != NULL);
- /* query the capabilities of the device */
- capabilities = libhal_device_get_property_strlist (context, udi, "info.capabilities", &derror);
- if (G_UNLIKELY (capabilities == NULL))
- {
- /* shutdown the HAL context */
- libhal_ctx_shutdown (context, NULL);
- goto err0;
- }
+#ifdef DEBUG
+ g_debug ("tvm_device_added:");
+ keys = g_udev_device_get_property_keys (context->device);
+ for (n = 0; keys != NULL && keys[n] != NULL; ++n)
+ g_debug (" %s = %s", keys[n], g_udev_device_get_property (context->device, keys[n]));
+#endif
- /* determine the number of capabilities */
- n_capabilities = g_strv_length (capabilities);
+ /* determine the subsystem to which the device belongs */
+ subsystem = g_udev_device_get_subsystem (context->device);
- /* sort the capabilities */
- qsort (capabilities, n_capabilities, sizeof (*capabilities), strptrcmp);
+ /* find all subsystem handlers for this subsystem */
+ for (n = G_N_ELEMENTS (subsystem_handlers)-1; n >= 0; --n)
+ if (g_strcmp0 (subsystem, subsystem_handlers[n].subsystem) == 0)
+ context->handlers = g_list_prepend (context->handlers, &subsystem_handlers[n]);
- /* try various handlers until one of them succeeds */
- for (i = 0, j = 0; err == NULL && i < G_N_ELEMENTS (handlers) && j < n_capabilities; ++i)
+ /* check if we have at least one handler */
+ if (context->handlers != NULL)
{
- /* search for a handler with the capability */
- for (n = -1; j < n_capabilities; )
- {
- /* check if we have a match here */
- n = strcmp (capabilities[j], handlers[i].capability);
- if (G_LIKELY (n >= 0))
- break;
- ++j;
- }
-
- /* check if we have a potential match */
- if (n == 0)
- {
- /* try to handle the device */
- if ((*handlers[i].callback) (preferences, context, udi, capabilities[j], &err))
- break;
- ++j;
- }
+ /* try the next handler in the list */
+ tvm_device_try_next_handler (context);
}
-
- /* cleanup the capabilities */
- libhal_free_string_array (capabilities);
-
- /* shutdown the HAL context */
- libhal_ctx_shutdown (context, NULL);
- libhal_ctx_free (context);
-
- /* check if we failed */
- if (G_UNLIKELY (err != NULL))
+ else
{
- /* propagate the error */
- g_propagate_error (error, err);
- return FALSE;
+ g_set_error (context->error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+ _("Device type not supported"));
+ g_main_loop_quit (context->loop);
}
-
- return TRUE;
}
-
-
diff --git a/thunar-volman/tvm-device.h b/thunar-volman/tvm-device.h
index 4934383..5f4417e 100644
--- a/thunar-volman/tvm-device.h
+++ b/thunar-volman/tvm-device.h
@@ -1,57 +1,42 @@
-/* $Id$ */
+/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
+ * Copyright (c) 2010 Jannis Pohlmann <>
*
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
- * This program 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.
+ * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
#ifndef __TVM_DEVICE_H__
#define __TVM_DEVICE_H__
-#include <libhal.h>
+#include <glib.h>
-#include <exo-hal/exo-hal.h>
-
-#include <thunar-volman/tvm-preferences.h>
+#include <thunar-volman/tvm-context.h>
G_BEGIN_DECLS
-/**
- * TvmDeviceCallback:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the HAL device UDI of the newly added device.
- * @capability : the capability that caused this callback to be invoked.
- * @error : return location for errors or %NULL.
- *
- * Prototype for device callbacks, which are invoked if a device is inserted,
- * with a capability they claim to be able to handle. Returns %TRUE if the
- * device was handled, %FALSE if the device cannot be handled or an unrecoverable
- * error occurred (in which case the @error should be set).
- *
- * Return value:
- **/
-typedef gboolean (*TvmDeviceCallback) (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error);
-
-gboolean tvm_device_added (TvmPreferences *preferences,
- const gchar *udi,
- GError **error) G_GNUC_INTERNAL;
+/* callback function type for device handlers */
+typedef void (*TvmDeviceHandlerCallback) (TvmContext *context);
+
+/* function type for device handlers */
+typedef void (*TvmDeviceHandlerFunc) (TvmContext *context);
+
+
+
+void tvm_device_added (TvmContext *context);
+void tvm_device_handler_finished (TvmContext *context);
G_END_DECLS
diff --git a/thunar-volman/tvm-gio-extensions.c b/thunar-volman/tvm-gio-extensions.c
new file mode 100644
index 0000000..46df3bc
--- /dev/null
+++ b/thunar-volman/tvm-gio-extensions.c
@@ -0,0 +1,64 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
+ *
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gio/gio.h>
+
+#include <thunar-volman/tvm-gio-extensions.h>
+
+
+
+GVolume *
+tvm_g_volume_monitor_get_volume_for_kind (GVolumeMonitor *monitor,
+ const gchar *kind,
+ const gchar *identifier)
+{
+ GVolume *volume = NULL;
+ GList *volumes;
+ GList *lp;
+ gchar *value;
+
+ g_return_val_if_fail (G_IS_VOLUME_MONITOR (monitor), NULL);
+ g_return_val_if_fail (kind != NULL && *kind != '\0', NULL);
+ g_return_val_if_fail (identifier != NULL && *identifier != '\0', NULL);
+
+ volumes = g_volume_monitor_get_volumes (monitor);
+
+ for (lp = volumes; volume == NULL && lp != NULL; lp = lp->next)
+ {
+ value = g_volume_get_identifier (lp->data, kind);
+ if (value != NULL)
+ {
+ if (g_strcmp0 (value, identifier) == 0)
+ volume = g_object_ref (lp->data);
+
+ g_free (value);
+ }
+
+ g_object_unref (lp->data);
+ }
+
+ g_list_free (volumes);
+
+ return volume;
+}
diff --git a/thunar-volman/tvm-gio-extensions.h b/thunar-volman/tvm-gio-extensions.h
new file mode 100644
index 0000000..c4d1c7d
--- /dev/null
+++ b/thunar-volman/tvm-gio-extensions.h
@@ -0,0 +1,34 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
+ *
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __TVM_GIO_EXTENSIONS_H__
+#define __TVM_GIO_EXTENSIONS_H__
+
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+GVolume *tvm_g_volume_monitor_get_volume_for_kind (GVolumeMonitor *monitor,
+ const gchar *kind,
+ const gchar *identifier);
+
+G_END_DECLS
+
+#endif /* !__TVM_GIO_EXTENSIONS_H__ */
diff --git a/thunar-volman/tvm-input-device.c b/thunar-volman/tvm-input-device.c
deleted file mode 100644
index 664e856..0000000
--- a/thunar-volman/tvm-input-device.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include <thunar-volman/tvm-input-device.h>
-#include <thunar-volman/tvm-run.h>
-
-
-
-static const struct
-{
- const gchar *capability;
- const gchar *auto_option_name;
- const gchar *auto_command_name;
-} commands[] = {
- { "input.keyboard", "autokeyboard", "autokeyboard-command", },
- { "input.mouse", "automouse", "automouse-command", },
- { "input.tablet", "autotablet", "autotablet-command", },
-};
-
-
-
-/**
- * tvm_input_device_added:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the HAL device UDI of the newly added input device.
- * @capability : the capability, which caused this handler to be run.
- * @error : return location for errors or %NULL.
- *
- * See #TvmDeviceCallback for further information.
- *
- * Return value: %TRUE if handled, %FALSE if not handled or an
- * unrecoverable error occurred.
- **/
-gboolean
-tvm_input_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error)
-{
- gboolean result = FALSE;
- gboolean auto_enabled;
- gchar *auto_command;
- guint n;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_return_val_if_fail (capability != NULL, FALSE);
- g_return_val_if_fail (context != NULL, FALSE);
-
- /* check which type of input device we have */
- for (n = 0; n < G_N_ELEMENTS (commands); ++n)
- if (strcmp (commands[n].capability, capability) == 0)
- break;
- if (G_LIKELY (n < G_N_ELEMENTS (commands)))
- {
- /* check if this handling is enabled and we have a command */
- g_object_get (G_OBJECT (preferences), commands[n].auto_option_name, &auto_enabled, commands[n].auto_command_name, &auto_command, NULL);
- if (G_LIKELY (auto_enabled && auto_command != NULL && *auto_command != '\0'))
- {
- /* try to run the command */
- result = tvm_run_command (context, udi, auto_command, NULL, NULL, error);
- }
- g_free (auto_command);
- }
-
- return result;
-}
-
-
-
-
diff --git a/thunar-volman/tvm-input-device.h b/thunar-volman/tvm-input-device.h
deleted file mode 100644
index 211b9ac..0000000
--- a/thunar-volman/tvm-input-device.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_INPUT_DEVICE_H__
-#define __TVM_INPUT_DEVICE_H__
-
-#include <thunar-volman/tvm-device.h>
-
-G_BEGIN_DECLS
-
-gboolean tvm_input_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error) G_GNUC_INTERNAL;
-
-G_END_DECLS
-
-#endif /* !__TVM_INPUT_DEVICE_H__ */
diff --git a/thunar-volman/tvm-pango-extensions.c b/thunar-volman/tvm-pango-extensions.c
deleted file mode 100644
index bb95891..0000000
--- a/thunar-volman/tvm-pango-extensions.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2006-2007 Benedikt Meurer <benny at xfce.org>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-
-#include <thunar-volman/tvm-pango-extensions.h>
-
-
-
-static PangoAttrList *tvm_pango_attr_list_wrap (PangoAttribute *attribute, ...) G_GNUC_MALLOC;
-
-
-
-static PangoAttrList*
-tvm_pango_attr_list_wrap (PangoAttribute *attribute, ...)
-{
- PangoAttrList *attr_list;
- va_list args;
-
- /* allocate a new attribute list */
- attr_list = pango_attr_list_new ();
-
- /* add all specified attributes */
- va_start (args, attribute);
- while (attribute != NULL)
- {
- attribute->start_index = 0;
- attribute->end_index = -1;
- pango_attr_list_insert (attr_list, attribute);
- attribute = va_arg (args, PangoAttribute *);
- }
- va_end (args);
-
- return attr_list;
-}
-
-
-
-/**
- * tvm_pango_attr_list_big:
- *
- * Returns a #PangoAttrList for rendering big text.
- * The returned list is owned by the callee and must
- * not be freed or modified by the caller.
- *
- * Return value: a #PangoAttrList for rendering big text.
- **/
-PangoAttrList*
-tvm_pango_attr_list_big (void)
-{
- static PangoAttrList *attr_list = NULL;
- if (G_UNLIKELY (attr_list == NULL))
- attr_list = tvm_pango_attr_list_wrap (pango_attr_scale_new (PANGO_SCALE_LARGE), NULL);
- return attr_list;
-}
-
-
-
-/**
- * tvm_pango_attr_list_big_bold:
- *
- * Returns a #PangoAttrList for rendering big bold text.
- * The returned list is owned by the callee and must
- * not be freed or modified by the caller.
- *
- * Return value: a #PangoAttrList for rendering big bold text.
- **/
-PangoAttrList*
-tvm_pango_attr_list_big_bold (void)
-{
- static PangoAttrList *attr_list = NULL;
- if (G_UNLIKELY (attr_list == NULL))
- attr_list = tvm_pango_attr_list_wrap (pango_attr_scale_new (PANGO_SCALE_LARGE), pango_attr_weight_new (PANGO_WEIGHT_BOLD), NULL);
- return attr_list;
-}
-
-
-
-/**
- * tvm_pango_attr_list_bold:
- *
- * Returns a #PangoAttrList for rendering bold text.
- * The returned list is owned by the callee and must
- * not be freed or modified by the caller.
- *
- * Return value: a #PangoAttrList for rendering bold text.
- **/
-PangoAttrList*
-tvm_pango_attr_list_bold (void)
-{
- static PangoAttrList *attr_list = NULL;
- if (G_UNLIKELY (attr_list == NULL))
- attr_list = tvm_pango_attr_list_wrap (pango_attr_weight_new (PANGO_WEIGHT_BOLD), NULL);
- return attr_list;
-}
-
-
-
-/**
- * tvm_pango_attr_list_italic:
- *
- * Returns a #PangoAttrList for rendering italic text.
- * The returned list is owned by the callee and must
- * not be freed or modified by the caller.
- *
- * Return value: a #PangoAttrList for rendering italic text.
- **/
-PangoAttrList*
-tvm_pango_attr_list_italic (void)
-{
- static PangoAttrList *attr_list = NULL;
- if (G_UNLIKELY (attr_list == NULL))
- attr_list = tvm_pango_attr_list_wrap (pango_attr_style_new (PANGO_STYLE_ITALIC), NULL);
- return attr_list;
-}
-
-
-
-/**
- * tvm_pango_attr_list_small_italic:
- *
- * Returns a #PangoAttrList for rendering small italic text.
- * The returned list is owned by the callee and must
- * not be freed or modified by the caller.
- *
- * Return value: a #PangoAttrList for rendering small italic text.
- **/
-PangoAttrList*
-tvm_pango_attr_list_small_italic (void)
-{
- static PangoAttrList *attr_list = NULL;
- if (G_UNLIKELY (attr_list == NULL))
- attr_list = tvm_pango_attr_list_wrap (pango_attr_scale_new (PANGO_SCALE_SMALL), pango_attr_style_new (PANGO_STYLE_ITALIC), NULL);
- return attr_list;
-}
-
-
-
-/**
- * tvm_pango_attr_list_underline_single:
- *
- * Returns a #PangoAttrList for underlining text using a single line.
- * The returned list is owned by the callee and must not be freed
- * or modified by the caller.
- *
- * Return value: a #PangoAttrList for underlining text using a single line.
- **/
-PangoAttrList*
-tvm_pango_attr_list_underline_single (void)
-{
- static PangoAttrList *attr_list = NULL;
- if (G_UNLIKELY (attr_list == NULL))
- attr_list = tvm_pango_attr_list_wrap (pango_attr_underline_new (PANGO_UNDERLINE_SINGLE), NULL);
- return attr_list;
-}
diff --git a/thunar-volman/tvm-pango-extensions.h b/thunar-volman/tvm-pango-extensions.h
deleted file mode 100644
index e527667..0000000
--- a/thunar-volman/tvm-pango-extensions.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2006-2007 Benedikt Meurer <benny at xfce.org>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_PANGO_EXTENSIONS_H__
-#define __TVM_PANGO_EXTENSIONS_H__
-
-#include <pango/pango.h>
-
-G_BEGIN_DECLS
-
-PangoAttrList *tvm_pango_attr_list_big (void) G_GNUC_CONST G_GNUC_INTERNAL;
-PangoAttrList *tvm_pango_attr_list_big_bold (void) G_GNUC_CONST G_GNUC_INTERNAL;
-PangoAttrList *tvm_pango_attr_list_bold (void) G_GNUC_CONST G_GNUC_INTERNAL;
-PangoAttrList *tvm_pango_attr_list_italic (void) G_GNUC_CONST G_GNUC_INTERNAL;
-PangoAttrList *tvm_pango_attr_list_small_italic (void) G_GNUC_CONST G_GNUC_INTERNAL;
-PangoAttrList *tvm_pango_attr_list_underline_single (void) G_GNUC_CONST G_GNUC_INTERNAL;
-
-G_END_DECLS
-
-#endif /* !__TVM_PANGO_EXTENSIONS_H__ */
diff --git a/thunar-volman/tvm-pda-device.c b/thunar-volman/tvm-pda-device.c
deleted file mode 100644
index 8e3b942..0000000
--- a/thunar-volman/tvm-pda-device.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include <dbus/dbus-glib-lowlevel.h>
-
-#include <thunar-volman/tvm-pda-device.h>
-#include <thunar-volman/tvm-run.h>
-
-
-
-static const struct
-{
- const gchar *platform;
- const gchar *auto_option_name;
- const gchar *auto_command_name;
-} commands[] = {
- { "palm", "autopalm", "autopalm-command", },
- { "pocketpc", "autopocketpc", "autopocketpc-command", },
-};
-
-
-
-/**
- * tvm_pda_device_added:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the HAL device UDI of the newly added PDA device.
- * @capability : the capability, which caused this handler to be run.
- * @error : return location for errors or %NULL.
- *
- * See #TvmDeviceCallback for further information.
- *
- * Return value: %TRUE if handled, %FALSE if not handled or an
- * unrecoverable error occurred.
- **/
-gboolean
-tvm_pda_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error)
-{
- DBusError derror;
- gboolean result = FALSE;
- gboolean auto_enabled;
- gchar *auto_command;
- gchar *platform;
- guint n;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_return_val_if_fail (capability != NULL, FALSE);
- g_return_val_if_fail (context != NULL, FALSE);
-
- /* initialize D-Bus error */
- dbus_error_init (&derror);
-
- /* determine the PDA platform */
- platform = libhal_device_get_property_string (context, udi, "pda.platform", &derror);
- if (G_UNLIKELY (platform == NULL))
- {
- /* propagate the error */
- dbus_set_g_error (error, &derror);
- dbus_error_free (&derror);
- return FALSE;
- }
-
- /* check if we can handle that platform */
- for (n = 0; n < G_N_ELEMENTS (commands); ++n)
- if (strcmp (commands[n].platform, platform) == 0)
- break;
- if (G_LIKELY (n < G_N_ELEMENTS (commands)))
- {
- /* check if this handling is enabled and we have a command */
- g_object_get (G_OBJECT (preferences), commands[n].auto_option_name, &auto_enabled, commands[n].auto_command_name, &auto_command, NULL);
- if (G_LIKELY (auto_enabled && auto_command != NULL && *auto_command != '\0'))
- {
- /* try to run the command */
- result = tvm_run_command (context, udi, auto_command, NULL, NULL, error);
- }
- g_free (auto_command);
- }
-
- /* cleanup */
- libhal_free_string (platform);
-
- return result;
-}
-
-
-
-
diff --git a/thunar-volman/tvm-pda-device.h b/thunar-volman/tvm-pda-device.h
deleted file mode 100644
index 41edfbf..0000000
--- a/thunar-volman/tvm-pda-device.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_PDA_DEVICE_H__
-#define __TVM_PDA_DEVICE_H__
-
-#include <thunar-volman/tvm-device.h>
-
-G_BEGIN_DECLS
-
-gboolean tvm_pda_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error) G_GNUC_INTERNAL;
-
-G_END_DECLS
-
-#endif /* !__TVM_PDA_DEVICE_H__ */
diff --git a/thunar-volman/tvm-preferences-dialog.c b/thunar-volman/tvm-preferences-dialog.c
deleted file mode 100644
index 614e68b..0000000
--- a/thunar-volman/tvm-preferences-dialog.c
+++ /dev/null
@@ -1,719 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2005-2007 Benedikt Meurer <benny at xfce.org>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <thunar-volman/tvm-command-entry.h>
-#include <thunar-volman/tvm-pango-extensions.h>
-#include <thunar-volman/tvm-preferences-dialog.h>
-#include <thunar-volman/xfce-titled-dialog.h>
-
-
-
-static void tvm_preferences_dialog_class_init (TvmPreferencesDialogClass *klass);
-static void tvm_preferences_dialog_init (TvmPreferencesDialog *dialog);
-static void tvm_preferences_dialog_finalize (GObject *object);
-static void tvm_preferences_dialog_help_clicked (GtkWidget *button,
- TvmPreferencesDialog *dialog);
-
-
-
-struct _TvmPreferencesDialogClass
-{
- XfceTitledDialogClass __parent__;
-};
-
-struct _TvmPreferencesDialog
-{
- XfceTitledDialog __parent__;
- TvmPreferences *preferences;
-};
-
-
-
-static GObjectClass *tvm_preferences_dialog_parent_class;
-
-
-
-GType
-tvm_preferences_dialog_get_type (void)
-{
- static GType type = G_TYPE_INVALID;
-
- if (G_UNLIKELY (type == G_TYPE_INVALID))
- {
- static const GTypeInfo info =
- {
- sizeof (TvmPreferencesDialogClass),
- NULL,
- NULL,
- (GClassInitFunc) tvm_preferences_dialog_class_init,
- NULL,
- NULL,
- sizeof (TvmPreferencesDialog),
- 0,
- (GInstanceInitFunc) tvm_preferences_dialog_init,
- NULL,
- };
-
- type = g_type_register_static (XFCE_TYPE_TITLED_DIALOG, I_("TvmPreferencesDialog"), &info, 0);
- }
-
- return type;
-}
-
-
-
-static void
-tvm_preferences_dialog_class_init (TvmPreferencesDialogClass *klass)
-{
- GObjectClass *gobject_class;
-
- /* determine the parent type class */
- tvm_preferences_dialog_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->finalize = tvm_preferences_dialog_finalize;
-}
-
-
-
-static void
-tvm_preferences_dialog_init (TvmPreferencesDialog *dialog)
-{
- GtkSizeGroup *size_group;
- GtkWidget *notebook;
- GtkWidget *button;
- GtkWidget *entry;
- GtkWidget *frame;
- GtkWidget *image;
- GtkWidget *label;
- GtkWidget *table;
- GtkWidget *vbox;
-
- /* grab a reference on the preferences */
- dialog->preferences = tvm_preferences_get ();
-
- /* configure the dialog properties */
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
- gtk_window_set_icon_name (GTK_WINDOW (dialog), "gnome-dev-removable");
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- gtk_window_set_title (GTK_WINDOW (dialog), _("Removable Drives and Media"));
- xfce_titled_dialog_set_subtitle (XFCE_TITLED_DIALOG (dialog), _("Configure management of removable drives and media"));
-
- /* add "Help" button */
- button = gtk_button_new_from_stock (GTK_STOCK_HELP);
- g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (tvm_preferences_dialog_help_clicked), dialog);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), button, FALSE, FALSE, 0);
- gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (GTK_DIALOG (dialog)->action_area), button, TRUE);
- gtk_widget_show (button);
-
- /* add "Close" button */
- gtk_dialog_add_buttons (GTK_DIALOG (dialog),
- GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
- NULL);
-
- notebook = gtk_notebook_new ();
- gtk_container_set_border_width (GTK_CONTAINER (notebook), 6);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, TRUE, TRUE, 0);
- gtk_widget_show (notebook);
-
-
- /*
- Storage
- */
- label = gtk_label_new (_("Storage"));
- vbox = g_object_new (GTK_TYPE_VBOX, "border-width", 12, "spacing", 12, NULL);
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
- gtk_widget_show (label);
- gtk_widget_show (vbox);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Removable Storage"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (5, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("gnome-dev-removable", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("_Mount removable drives when hot-plugged"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "automount-drives", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- button = gtk_check_button_new_with_mnemonic (_("Mount removable media when _inserted"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "automount-media", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- button = gtk_check_button_new_with_mnemonic (_("B_rowse removable media when inserted"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autobrowse", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- button = gtk_check_button_new_with_mnemonic (_("_Auto-run programs on new drives and media"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autorun", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- button = gtk_check_button_new_with_mnemonic (_("Auto-open files on new drives and media"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoopen", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 4, 5, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Blank CDs and DVDs"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (3, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("tvm-burn-cd", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("_Burn a CD or DVD when a blank disc is inserted"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoburn", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- /* use a size group to make sure both labels request the same width */
- size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-
- entry = tvm_command_entry_new_with_label (_("Command for _Data CDs:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoburn-data-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_size_group_add_widget (size_group, TVM_COMMAND_ENTRY (entry)->label);
- gtk_widget_show (entry);
-
- entry = tvm_command_entry_new_with_label (_("Command for A_udio CDs:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoburn-audio-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_size_group_add_widget (size_group, TVM_COMMAND_ENTRY (entry)->label);
- gtk_widget_show (entry);
-
- /* release the size group */
- g_object_unref (G_OBJECT (size_group));
-
-
- /*
- Multimedia
- */
- label = gtk_label_new (_("Multimedia"));
- vbox = g_object_new (GTK_TYPE_VBOX, "border-width", 12, "spacing", 12, NULL);
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
- gtk_widget_show (label);
- gtk_widget_show (vbox);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Audio CDs"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("gnome-dev-cdrom-audio", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Play _audio CDs when inserted"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoplay-audio-cd", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("_Command:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoplay-audio-cd-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Video CDs/DVDs"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("gnome-dev-cdrom", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Play _video CDs and DVDs when inserted"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoplay-video-cd", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("C_ommand:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoplay-video-cd-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Portable Music Players"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("gnome-dev-ipod", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Play _music files when connected"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoipod", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("C_ommand:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoipod-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
-
- /*
- Cameras
- */
- label = gtk_label_new (_("Cameras"));
- vbox = g_object_new (GTK_TYPE_VBOX, "border-width", 12, "spacing", 12, NULL);
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
- gtk_widget_show (label);
- gtk_widget_show (vbox);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Digital Cameras"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("camera-photo", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Import digital photographs when connected"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autophoto", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("_Command:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autophoto-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
-
- /*
- PDAs
- */
- label = gtk_label_new (_("PDAs"));
- vbox = g_object_new (GTK_TYPE_VBOX, "border-width", 12, "spacing", 12, NULL);
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
- gtk_widget_show (label);
- gtk_widget_show (vbox);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Palm™"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("palm-pilot", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Sync _Palm™ devices when connected"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autopalm", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("_Command:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autopalm-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Pocket PCs"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("tvm-dev-pocketpc", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Sync Pocket P_C devices when connected"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autopocketpc", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("C_ommand:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autopocketpc-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
-
- /*
- Printers
- */
- label = gtk_label_new (_("Printers"));
- vbox = g_object_new (GTK_TYPE_VBOX, "border-width", 12, "spacing", 12, NULL);
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
- gtk_widget_show (label);
- gtk_widget_show (vbox);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Printers"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("gnome-dev-printer", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Automatically run a program when a _printer is connected"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoprinter", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("_Command:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autoprinter-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
-
- /*
- Input Devices
- */
- label = gtk_label_new (_("Input Devices"));
- vbox = g_object_new (GTK_TYPE_VBOX, "border-width", 12, "spacing", 12, NULL);
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
- gtk_widget_show (label);
- gtk_widget_show (vbox);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Keyboards"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("gnome-dev-keyboard", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Automatically run a program when an USB _keyboard is connected"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autokeyboard", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("_Command:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autokeyboard-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Mice"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("gnome-dev-mouse-optical", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Automatically run a program when an USB _mouse is connected"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "automouse", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("C_ommand:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "automouse-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-
- frame = g_object_new (GTK_TYPE_FRAME, "border-width", 0, "shadow-type", GTK_SHADOW_NONE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
- gtk_widget_show (frame);
-
- label = gtk_label_new (_("Tablet"));
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_bold ());
- gtk_frame_set_label_widget (GTK_FRAME (frame), label);
- gtk_widget_show (label);
-
- table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 3);
- gtk_table_set_col_spacings (GTK_TABLE (table), 12);
- gtk_container_set_border_width (GTK_CONTAINER (table), 8);
- gtk_container_add (GTK_CONTAINER (frame), table);
- gtk_widget_show (table);
-
- image = gtk_image_new_from_icon_name ("tvm-dev-tablet", GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.5f, 0.0f);
- gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 3, GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (image);
-
- button = gtk_check_button_new_with_mnemonic (_("Automatically run a program when a _tablet is connected"));
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autotablet", G_OBJECT (button), "active");
- gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (button);
-
- entry = tvm_command_entry_new_with_label (_("Com_mand:"));
- exo_binding_new (G_OBJECT (button), "active", G_OBJECT (entry), "sensitive");
- exo_mutual_binding_new (G_OBJECT (dialog->preferences), "autotablet-command", G_OBJECT (entry), "command");
- gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
- gtk_widget_show (entry);
-}
-
-
-
-static void
-tvm_preferences_dialog_finalize (GObject *object)
-{
- TvmPreferencesDialog *dialog = TVM_PREFERENCES_DIALOG (object);
-
- /* release our reference on the preferences */
- g_object_unref (G_OBJECT (dialog->preferences));
-
- (*G_OBJECT_CLASS (tvm_preferences_dialog_parent_class)->finalize) (object);
-}
-
-
-
-static void
-tvm_preferences_dialog_help_clicked (GtkWidget *button,
- TvmPreferencesDialog *dialog)
-{
- GtkWidget *message;
- GError *err = NULL;
- gchar **argv;
- gchar *bindir;
- gchar *prefix;
- gchar *path;
-
- g_return_if_fail (TVM_IS_PREFERENCES_DIALOG (dialog));
- g_return_if_fail (GTK_IS_BUTTON (button));
-
- /* try to locate Thunar in the $PATH */
- path = g_find_program_in_path ("Thunar");
- if (G_UNLIKELY (path == NULL))
- path = g_find_program_in_path ("thunar");
- if (G_LIKELY (path != NULL))
- {
- bindir = g_path_get_dirname (path);
- prefix = g_path_get_dirname (bindir);
- g_free (bindir);
- g_free (path);
-
- /* now check if ThunarHelp is in $prefix/libexec */
- path = g_build_filename (prefix, "libexec", "ThunarHelp", NULL);
- if (!g_file_test (path, G_FILE_TEST_IS_EXECUTABLE))
- {
- /* release path */
- g_free (path);
-
- /* try to support Debian weirdness */
- path = g_build_filename (prefix, "lib", "thunar", "ThunarHelp", NULL);
- if (!g_file_test (path, G_FILE_TEST_IS_EXECUTABLE))
- {
- /* release path */
- g_free (path);
- path = NULL;
- }
- }
- }
-
- /* no ThunarHelp, weird! */
- if (G_UNLIKELY (path == NULL))
- path = g_strdup ("ThunarHelp");
-
- /* prepare command to run help */
- argv = g_new (gchar *, 4);
- argv[0] = path;
- argv[1] = g_strdup ("using-removable-media");
- argv[2] = g_strdup ("management-of-removable-drives-and-media");
- argv[3] = NULL;
-
- /* try to open the user manual */
- if (!gdk_spawn_on_screen (gtk_widget_get_screen (button), NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &err))
- {
- /* display an error message to the user */
- message = gtk_message_dialog_new (GTK_WINDOW (dialog),
- GTK_DIALOG_DESTROY_WITH_PARENT
- | GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- "%s.", _("Failed to open the documentation browser"));
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message), "%s.", err->message);
- gtk_dialog_run (GTK_DIALOG (message));
- gtk_widget_destroy (message);
- g_error_free (err);
- }
-
- /* cleanup */
- g_strfreev (argv);
-}
-
-
-
-/**
- * tvm_preferences_dialog_new:
- * @parent : a #GtkWindow or %NULL.
- *
- * Allocates a new #TvmPreferencesDialog widget.
- *
- * Return value: the newly allocated #TvmPreferencesDialog.
- **/
-GtkWidget*
-tvm_preferences_dialog_new (void)
-{
- return g_object_new (TVM_TYPE_PREFERENCES_DIALOG, NULL);
-}
-
-
-
-/* vim:set encoding=UTF-8: */
diff --git a/thunar-volman/tvm-preferences-dialog.h b/thunar-volman/tvm-preferences-dialog.h
deleted file mode 100644
index 2c26142..0000000
--- a/thunar-volman/tvm-preferences-dialog.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2005-2007 Benedikt Meurer <benny at xfce.org>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_PREFERENCES_DIALOG_H__
-#define __TVM_PREFERENCES_DIALOG_H__
-
-#include <thunar-volman/tvm-preferences.h>
-
-G_BEGIN_DECLS
-
-typedef struct _TvmPreferencesDialogClass TvmPreferencesDialogClass;
-typedef struct _TvmPreferencesDialog TvmPreferencesDialog;
-
-#define TVM_TYPE_PREFERENCES_DIALOG (tvm_preferences_dialog_get_type ())
-#define TVM_PREFERENCES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TVM_TYPE_PREFERENCES_DIALOG, TvmPreferencesDialog))
-#define TVM_PREFERENCES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TVM_TYPE_PREFERENCES_DIALOG, TvmPreferencesDialogClass))
-#define TVM_IS_PREFERENCES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TVM_TYPE_PREFERENCES_DIALOG))
-#define TVM_IS_PREFERENCES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TVM_TYPE_PREFERENCES_DIALOG))
-#define TVM_PREFERENCES_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TVM_TYPE_PREFERENCES_DIALOG, TvmPreferencesDialogClass))
-
-GType tvm_preferences_dialog_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL;
-
-GtkWidget *tvm_preferences_dialog_new (void) G_GNUC_INTERNAL G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-
-G_END_DECLS
-
-#endif /* !__TVM_PREFERENCES_DIALOG_H__ */
diff --git a/thunar-volman/tvm-preferences.c b/thunar-volman/tvm-preferences.c
deleted file mode 100644
index 5896ca2..0000000
--- a/thunar-volman/tvm-preferences.c
+++ /dev/null
@@ -1,963 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2005-2007 Benedikt Meurer <benny at xfce.org>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include <thunar-vfs/thunar-vfs.h>
-
-#include <thunar-volman/tvm-preferences.h>
-
-
-
-/* Property identifiers */
-enum
-{
- PROP_0,
- PROP_AUTOMOUNT_DRIVES,
- PROP_AUTOMOUNT_MEDIA,
- PROP_AUTOBROWSE,
- PROP_AUTORUN,
- PROP_AUTOOPEN,
- PROP_AUTOBURN,
- PROP_AUTOBURN_DATA_COMMAND,
- PROP_AUTOBURN_AUDIO_COMMAND,
- PROP_AUTOPLAY_AUDIO_CD,
- PROP_AUTOPLAY_AUDIO_CD_COMMAND,
- PROP_AUTOPLAY_VIDEO_CD,
- PROP_AUTOPLAY_VIDEO_CD_COMMAND,
- PROP_AUTOIPOD,
- PROP_AUTOIPOD_COMMAND,
- PROP_AUTOPHOTO,
- PROP_AUTOPHOTO_COMMAND,
- PROP_AUTOPALM,
- PROP_AUTOPALM_COMMAND,
- PROP_AUTOPOCKETPC,
- PROP_AUTOPOCKETPC_COMMAND,
- PROP_AUTOPRINTER,
- PROP_AUTOPRINTER_COMMAND,
- PROP_AUTOKEYBOARD,
- PROP_AUTOKEYBOARD_COMMAND,
- PROP_AUTOMOUSE,
- PROP_AUTOMOUSE_COMMAND,
- PROP_AUTOTABLET,
- PROP_AUTOTABLET_COMMAND,
- N_PROPERTIES,
-};
-
-
-
-static void tvm_preferences_class_init (TvmPreferencesClass *klass);
-static void tvm_preferences_init (TvmPreferences *preferences);
-static void tvm_preferences_dispose (GObject *object);
-static void tvm_preferences_finalize (GObject *object);
-static void tvm_preferences_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void tvm_preferences_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void tvm_preferences_resume_monitor (TvmPreferences *preferences);
-static void tvm_preferences_suspend_monitor (TvmPreferences *preferences);
-static void tvm_preferences_monitor (ThunarVfsMonitor *monitor,
- ThunarVfsMonitorHandle *handle,
- ThunarVfsMonitorEvent event,
- ThunarVfsPath *handle_path,
- ThunarVfsPath *event_path,
- gpointer user_data);
-static void tvm_preferences_queue_load (TvmPreferences *preferences);
-static void tvm_preferences_queue_store (TvmPreferences *preferences);
-static gboolean tvm_preferences_load_idle (gpointer user_data);
-static void tvm_preferences_load_idle_destroy (gpointer user_data);
-static gboolean tvm_preferences_store_idle (gpointer user_data);
-static void tvm_preferences_store_idle_destroy (gpointer user_data);
-
-
-
-struct _TvmPreferencesClass
-{
- GObjectClass __parent__;
-};
-
-struct _TvmPreferences
-{
- GObject __parent__;
-
- ThunarVfsMonitorHandle *handle;
- ThunarVfsMonitor *monitor;
-
- GValue values[N_PROPERTIES];
-
- gboolean loading_in_progress;
-
- gint load_idle_id;
- gint store_idle_id;
-};
-
-
-
-static GObjectClass *tvm_preferences_parent_class;
-
-
-
-GType
-tvm_preferences_get_type (void)
-{
- static GType type = G_TYPE_INVALID;
-
- if (G_UNLIKELY (type == G_TYPE_INVALID))
- {
- static const GTypeInfo info =
- {
- sizeof (TvmPreferencesClass),
- NULL,
- NULL,
- (GClassInitFunc) tvm_preferences_class_init,
- NULL,
- NULL,
- sizeof (TvmPreferences),
- 0,
- (GInstanceInitFunc) tvm_preferences_init,
- NULL,
- };
-
- type = g_type_register_static (G_TYPE_OBJECT, I_("TvmPreferences"), &info, 0);
- }
-
- return type;
-}
-
-
-
-static void
-transform_string_to_boolean (const GValue *src,
- GValue *dst)
-{
- g_value_set_boolean (dst, strcmp (g_value_get_string (src), "FALSE") != 0);
-}
-
-
-
-static void
-tvm_preferences_class_init (TvmPreferencesClass *klass)
-{
- GObjectClass *gobject_class;
-
- /* register transformation functions */
- if (!g_value_type_transformable (G_TYPE_STRING, G_TYPE_BOOLEAN))
- g_value_register_transform_func (G_TYPE_STRING, G_TYPE_BOOLEAN, transform_string_to_boolean);
-
- /* determine the parent type class */
- tvm_preferences_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->dispose = tvm_preferences_dispose;
- gobject_class->finalize = tvm_preferences_finalize;
- gobject_class->get_property = tvm_preferences_get_property;
- gobject_class->set_property = tvm_preferences_set_property;
-
- /**
- * TvmPreferences:automount-drives:
- *
- * Mount removable drives when hot-plugged.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOMOUNT_DRIVES,
- g_param_spec_boolean ("automount-drives",
- "automount-drives",
- "automount-drives",
- TRUE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:automount-media:
- *
- * Mount removable media when inserted.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOMOUNT_MEDIA,
- g_param_spec_boolean ("automount-media",
- "automount-media",
- "automount-media",
- TRUE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autobrowse:
- *
- * Browse removable media when inserted.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOBROWSE,
- g_param_spec_boolean ("autobrowse",
- "autobrowse",
- "autobrowse",
- TRUE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autorun:
- *
- * Auto-run programs on new drives and media.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTORUN,
- g_param_spec_boolean ("autorun",
- "autorun",
- "autorun",
- TRUE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoopen:
- *
- * Auto-open files on new drives and media.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOOPEN,
- g_param_spec_boolean ("autoopen",
- "autoopen",
- "autoopen",
- TRUE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoburn:
- *
- * Burn a CD or DVD if a blank disc is inserted.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOBURN,
- g_param_spec_boolean ("autoburn",
- "autoburn",
- "autoburn",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoburn-data-command:
- *
- * Command to burn a new data CD/DVD.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOBURN_DATA_COMMAND,
- g_param_spec_string ("autoburn-data-command",
- "autoburn-data-command",
- "autoburn-data-command",
- "xfburn",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoburn-audio-command:
- *
- * Command to burn a new audio CD.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOBURN_AUDIO_COMMAND,
- g_param_spec_string ("autoburn-audio-command",
- "autoburn-audio-command",
- "autoburn-audio-command",
- "xfburn",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoplay-audio-cd:
- *
- * Play audio discs when inserted.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPLAY_AUDIO_CD,
- g_param_spec_boolean ("autoplay-audio-cd",
- "autoplay-audio-cd",
- "autoplay-audio-cd",
- TRUE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoplay-audio-cd-command:
- *
- * Command to run the preferred audio CD player.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPLAY_AUDIO_CD_COMMAND,
- g_param_spec_string ("autoplay-audio-cd-command",
- "autoplay-audio-cd-command",
- "autoplay-audio-cd-command",
- "totem %d",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoplay-video-cd:
- *
- * Play video CDs and DVDs when inserted.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPLAY_VIDEO_CD,
- g_param_spec_boolean ("autoplay-video-cd",
- "autoplay-video-cd",
- "autoplay-video-cd",
- TRUE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoplay-video-cd-command:
- *
- * Command to run the preferred video CD/DVD-Player.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPLAY_VIDEO_CD_COMMAND,
- g_param_spec_string ("autoplay-video-cd-command",
- "autoplay-video-cd-command",
- "autoplay-video-cd-command",
- "totem %d",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoipod:
- *
- * Play music files when portable music player is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOIPOD,
- g_param_spec_boolean ("autoipod",
- "autoipod",
- "autoipod",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoipod-command:
- *
- * Command to run when portable music player is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOIPOD_COMMAND,
- g_param_spec_string ("autoipod-command",
- "autoipod-command",
- "autoipod-command",
- "",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autophoto:
- *
- * Import photos when digital camera is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPHOTO,
- g_param_spec_boolean ("autophoto",
- "autophoto",
- "autophoto",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autophoto-command:
- *
- * Command to run when digitcal camera is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPHOTO_COMMAND,
- g_param_spec_string ("autophoto-command",
- "autophoto-command",
- "autophoto-command",
- "",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autopalm:
- *
- * Sync Palm devices when connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPALM,
- g_param_spec_boolean ("autopalm",
- "autopalm",
- "autopalm",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autopalm-command:
- *
- * Command to run when Palm device is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPALM_COMMAND,
- g_param_spec_string ("autopalm-command",
- "autopalm-command",
- "autopalm-command",
- "gpilotd-control-applet",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autopocketpc:
- *
- * Sync PocketPC devices when connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPOCKETPC,
- g_param_spec_boolean ("autopocketpc",
- "autopocketpc",
- "autopocketpc",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autopocketpc-command:
- *
- * Command to run when PocketPC device is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPOCKETPC_COMMAND,
- g_param_spec_string ("autopocketpc-command",
- "autopocketpc-command",
- "autopocketpc-command",
- "multisync",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoprinter:
- *
- * Automatically run a program when a printer is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPRINTER,
- g_param_spec_boolean ("autoprinter",
- "autoprinter",
- "autoprinter",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autoprinter-command:
- *
- * Command to run when a printer is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOPRINTER_COMMAND,
- g_param_spec_string ("autoprinter-command",
- "autoprinter-command",
- "autoprinter-command",
- "gnome-printer-add hal://%h",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autokeyboard:
- *
- * Automatically run a program when an USB keyboard is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOKEYBOARD,
- g_param_spec_boolean ("autokeyboard",
- "autokeyboard",
- "autokeyboard",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autokeyboard-command:
- *
- * Command to run when an USB keyboard is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOKEYBOARD_COMMAND,
- g_param_spec_string ("autokeyboard-command",
- "autokeyboard-command",
- "autokeyboard-command",
- "",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:automouse:
- *
- * Automatically run a program when an USB mouse is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOMOUSE,
- g_param_spec_boolean ("automouse",
- "automouse",
- "automouse",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:automouse-command:
- *
- * Command to run when an USB mouse is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOMOUSE_COMMAND,
- g_param_spec_string ("automouse-command",
- "automouse-command",
- "automouse-command",
- "",
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autotablet:
- *
- * Automatically run a program when a table is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOTABLET,
- g_param_spec_boolean ("autotablet",
- "autotablet",
- "autotablet",
- FALSE,
- EXO_PARAM_READWRITE));
-
- /**
- * TvmPreferences:autotablet-command:
- *
- * Command to run when a table is connected.
- **/
- g_object_class_install_property (gobject_class,
- PROP_AUTOTABLET_COMMAND,
- g_param_spec_string ("autotablet-command",
- "autotablet-command",
- "autotablet-command",
- "",
- EXO_PARAM_READWRITE));
-}
-
-
-
-static void
-tvm_preferences_init (TvmPreferences *preferences)
-{
- /* grab a reference on the VFS monitor */
- preferences->monitor = thunar_vfs_monitor_get_default ();
-
- /* load the settings */
- tvm_preferences_load_idle (preferences);
-
- /* launch the file monitor */
- tvm_preferences_resume_monitor (preferences);
-}
-
-
-
-static void
-tvm_preferences_dispose (GObject *object)
-{
- TvmPreferences *preferences = TVM_PREFERENCES (object);
-
- /* flush preferences */
- if (G_UNLIKELY (preferences->store_idle_id != 0))
- {
- tvm_preferences_store_idle (preferences);
- g_source_remove (preferences->store_idle_id);
- }
-
- (*G_OBJECT_CLASS (tvm_preferences_parent_class)->dispose) (object);
-}
-
-
-
-static void
-tvm_preferences_finalize (GObject *object)
-{
- TvmPreferences *preferences = TVM_PREFERENCES (object);
- guint n;
-
- /* stop any pending load idle source */
- if (G_UNLIKELY (preferences->load_idle_id != 0))
- g_source_remove (preferences->load_idle_id);
-
- /* stop the file monitor */
- if (G_LIKELY (preferences->monitor != NULL))
- {
- tvm_preferences_suspend_monitor (preferences);
- g_object_unref (G_OBJECT (preferences->monitor));
- }
-
- /* release the property values */
- for (n = 1; n < N_PROPERTIES; ++n)
- if (G_IS_VALUE (preferences->values + n))
- g_value_unset (preferences->values + n);
-
- (*G_OBJECT_CLASS (tvm_preferences_parent_class)->finalize) (object);
-}
-
-
-
-static void
-tvm_preferences_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- TvmPreferences *preferences = TVM_PREFERENCES (object);
- GValue *src;
-
- src = preferences->values + prop_id;
- if (G_IS_VALUE (src))
- g_value_copy (src, value);
- else
- g_param_value_set_default (pspec, value);
-}
-
-
-
-static void
-tvm_preferences_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- TvmPreferences *preferences = TVM_PREFERENCES (object);
- GValue *dst;
-
- dst = preferences->values + prop_id;
- if (G_UNLIKELY (!G_IS_VALUE (dst)))
- {
- g_value_init (dst, pspec->value_type);
- g_param_value_set_default (pspec, dst);
- }
-
- if (g_param_values_cmp (pspec, value, dst) != 0)
- {
- g_value_copy (value, dst);
- tvm_preferences_queue_store (preferences);
- }
-}
-
-
-
-static void
-tvm_preferences_resume_monitor (TvmPreferences *preferences)
-{
- ThunarVfsPath *path;
- gchar *filename;
-
- /* verify that the monitor is suspended */
- if (G_LIKELY (preferences->handle == NULL))
- {
- /* determine the save location for tvmrc to monitor */
- filename = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, "Thunar/volmanrc", TRUE);
- if (G_LIKELY (filename != NULL))
- {
- /* determine the VFS path for the filename */
- path = thunar_vfs_path_new (filename, NULL);
- if (G_LIKELY (path != NULL))
- {
- /* add the monitor handle for the file */
- preferences->handle = thunar_vfs_monitor_add_file (preferences->monitor, path, tvm_preferences_monitor, preferences);
- thunar_vfs_path_unref (path);
- }
-
- /* release the filename */
- g_free (filename);
- }
- }
-}
-
-
-
-static void
-tvm_preferences_suspend_monitor (TvmPreferences *preferences)
-{
- /* verify that the monitor is active */
- if (G_LIKELY (preferences->handle != NULL))
- {
- /* disconnect the handle from the monitor */
- thunar_vfs_monitor_remove (preferences->monitor, preferences->handle);
- preferences->handle = NULL;
- }
-}
-
-
-
-static void
-tvm_preferences_monitor (ThunarVfsMonitor *monitor,
- ThunarVfsMonitorHandle *handle,
- ThunarVfsMonitorEvent event,
- ThunarVfsPath *handle_path,
- ThunarVfsPath *event_path,
- gpointer user_data)
-{
- TvmPreferences *preferences = TVM_PREFERENCES (user_data);
-
- g_return_if_fail (TVM_IS_PREFERENCES (preferences));
- g_return_if_fail (THUNAR_VFS_IS_MONITOR (monitor));
- g_return_if_fail (preferences->monitor == monitor);
- g_return_if_fail (preferences->handle == handle);
-
- /* schedule a reload whenever the file is created/changed */
- if (event == THUNAR_VFS_MONITOR_EVENT_CHANGED || event == THUNAR_VFS_MONITOR_EVENT_CREATED)
- tvm_preferences_queue_load (preferences);
-}
-
-
-
-static void
-tvm_preferences_queue_load (TvmPreferences *preferences)
-{
- if (preferences->load_idle_id == 0 && preferences->store_idle_id == 0)
- {
- preferences->load_idle_id = g_idle_add_full (G_PRIORITY_LOW, tvm_preferences_load_idle,
- preferences, tvm_preferences_load_idle_destroy);
- }
-}
-
-
-
-static void
-tvm_preferences_queue_store (TvmPreferences *preferences)
-{
- if (preferences->store_idle_id == 0 && !preferences->loading_in_progress)
- {
- preferences->store_idle_id = g_idle_add_full (G_PRIORITY_LOW, tvm_preferences_store_idle,
- preferences, tvm_preferences_store_idle_destroy);
- }
-}
-
-
-
-static gchar*
-property_name_to_option_name (const gchar *property_name)
-{
- const gchar *s;
- gboolean upper = TRUE;
- gchar *option;
- gchar *t;
-
- option = g_new (gchar, strlen (property_name) + 1);
- for (s = property_name, t = option; *s != '\0'; ++s)
- {
- if (*s == '-')
- {
- upper = TRUE;
- }
- else if (upper)
- {
- *t++ = g_ascii_toupper (*s);
- upper = FALSE;
- }
- else
- {
- *t++ = *s;
- }
- }
- *t = '\0';
-
- return option;
-}
-
-
-
-static gboolean
-tvm_preferences_load_idle (gpointer user_data)
-{
- TvmPreferences *preferences = TVM_PREFERENCES (user_data);
- const gchar *string;
- GParamSpec **specs;
- GParamSpec *spec;
- XfceRc *rc;
- GValue dst = { 0, };
- GValue src = { 0, };
- gchar *option;
- guint nspecs;
- guint n;
-
- rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, "Thunar/volmanrc", TRUE);
- if (G_UNLIKELY (rc == NULL))
- {
- g_warning ("Failed to load tvm preferences.");
- return FALSE;
- }
-
- g_object_freeze_notify (G_OBJECT (preferences));
-
- xfce_rc_set_group (rc, "Configuration");
-
- preferences->loading_in_progress = TRUE;
-
- specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (preferences), &nspecs);
- for (n = 0; n < nspecs; ++n)
- {
- spec = specs[n];
-
- option = property_name_to_option_name (spec->name);
- string = xfce_rc_read_entry (rc, option, NULL);
- g_free (option);
-
- if (G_UNLIKELY (string == NULL))
- continue;
-
- g_value_init (&src, G_TYPE_STRING);
- g_value_set_static_string (&src, string);
-
- if (spec->value_type == G_TYPE_STRING)
- {
- g_object_set_property (G_OBJECT (preferences), spec->name, &src);
- }
- else if (g_value_type_transformable (G_TYPE_STRING, spec->value_type))
- {
- g_value_init (&dst, spec->value_type);
- if (g_value_transform (&src, &dst))
- g_object_set_property (G_OBJECT (preferences), spec->name, &dst);
- g_value_unset (&dst);
- }
- else
- {
- g_warning ("Failed to load property \"%s\"", spec->name);
- }
-
- g_value_unset (&src);
- }
- g_free (specs);
-
- preferences->loading_in_progress = FALSE;
-
- xfce_rc_close (rc);
-
- g_object_thaw_notify (G_OBJECT (preferences));
-
- return FALSE;
-}
-
-
-
-static void
-tvm_preferences_load_idle_destroy (gpointer user_data)
-{
- TVM_PREFERENCES (user_data)->load_idle_id = 0;
-}
-
-
-
-static gboolean
-tvm_preferences_store_idle (gpointer user_data)
-{
- TvmPreferences *preferences = TVM_PREFERENCES (user_data);
- const gchar *string;
- GParamSpec **specs;
- GParamSpec *spec;
- XfceRc *rc;
- GValue dst = { 0, };
- GValue src = { 0, };
- gchar *option;
- guint nspecs;
- guint n;
-
- rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, "Thunar/volmanrc", FALSE);
- if (G_UNLIKELY (rc == NULL))
- {
- g_warning ("Failed to store thunar-volman preferences.");
- return FALSE;
- }
-
- /* suspend the monitor (hopefully tricking FAM to avoid unnecessary reloads) */
- tvm_preferences_suspend_monitor (preferences);
-
- xfce_rc_set_group (rc, "Configuration");
-
- specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (preferences), &nspecs);
- for (n = 0; n < nspecs; ++n)
- {
- spec = specs[n];
-
- g_value_init (&dst, G_TYPE_STRING);
-
- if (spec->value_type == G_TYPE_STRING)
- {
- g_object_get_property (G_OBJECT (preferences), spec->name, &dst);
- }
- else
- {
- g_value_init (&src, spec->value_type);
- g_object_get_property (G_OBJECT (preferences), spec->name, &src);
- g_value_transform (&src, &dst);
- g_value_unset (&src);
- }
-
- /* determine the option name for the spec */
- option = property_name_to_option_name (spec->name);
-
- /* store the setting */
- string = g_value_get_string (&dst);
- if (G_LIKELY (string != NULL))
- xfce_rc_write_entry (rc, option, string);
-
- /* cleanup */
- g_value_unset (&dst);
- g_free (option);
- }
-
- /* cleanup */
- xfce_rc_close (rc);
- g_free (specs);
-
- /* restart the monitor */
- tvm_preferences_resume_monitor (preferences);
-
- return FALSE;
-}
-
-
-
-static void
-tvm_preferences_store_idle_destroy (gpointer user_data)
-{
- TVM_PREFERENCES (user_data)->store_idle_id = 0;
-}
-
-
-
-/**
- * tvm_preferences_get:
- *
- * Queries the global #TvmPreferences instance, which is shared
- * by all modules. The function automatically takes a reference
- * for the caller, so you'll need to call g_object_unref() when
- * you're done with it.
- *
- * Return value: the global #TvmPreferences instance.
- **/
-TvmPreferences*
-tvm_preferences_get (void)
-{
- static TvmPreferences *preferences = NULL;
-
- if (G_UNLIKELY (preferences == NULL))
- {
- preferences = g_object_new (TVM_TYPE_PREFERENCES, NULL);
- g_object_add_weak_pointer (G_OBJECT (preferences), (gpointer) &preferences);
- }
- else
- {
- g_object_ref (G_OBJECT (preferences));
- }
-
- return preferences;
-}
-
-
diff --git a/thunar-volman/tvm-preferences.h b/thunar-volman/tvm-preferences.h
deleted file mode 100644
index 3c80e07..0000000
--- a/thunar-volman/tvm-preferences.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2005-2007 Benedikt Meurer <benny at xfce.org>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_PREFERENCES_H__
-#define __TVM_PREFERENCES_H__
-
-#include <exo/exo.h>
-
-G_BEGIN_DECLS
-
-typedef struct _TvmPreferencesClass TvmPreferencesClass;
-typedef struct _TvmPreferences TvmPreferences;
-
-#define TVM_TYPE_PREFERENCES (tvm_preferences_get_type ())
-#define TVM_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TVM_TYPE_PREFERENCES, TvmPreferences))
-#define TVM_PREFERENCES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TVM_TYPE_PREFERENCES, TvmPreferencesClass))
-#define TVM_IS_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TVM_TYPE_PREFERENCES))
-#define TVM_IS_PREFERENCES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TVM_TYPE_PREFERENCES))
-#define TVM_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TVM_TYPE_PREFERENCES, TvmPreferencesClass))
-
-GType tvm_preferences_get_type (void) G_GNUC_CONST;
-
-TvmPreferences *tvm_preferences_get (void);
-
-G_END_DECLS
-
-#endif /* !__TVM_PREFERENCES_H__ */
diff --git a/thunar-volman/tvm-printer-device.c b/thunar-volman/tvm-printer-device.c
deleted file mode 100644
index 2ae24f8..0000000
--- a/thunar-volman/tvm-printer-device.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include <thunar-volman/tvm-printer-device.h>
-#include <thunar-volman/tvm-run.h>
-
-
-
-/**
- * tvm_printer_device_added:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the HAL device UDI of the newly added printer device.
- * @capability : the capability, which caused this handler to be run.
- * @error : return location for errors or %NULL.
- *
- * See #TvmDeviceCallback for further information.
- *
- * Return value: %TRUE if handled, %FALSE if not handled or an
- * unrecoverable error occurred.
- **/
-gboolean
-tvm_printer_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error)
-{
- gboolean result = FALSE;
- gboolean autoprinter;
- gchar *autoprinter_command;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_return_val_if_fail (capability != NULL, FALSE);
- g_return_val_if_fail (context != NULL, FALSE);
-
- /* check if we have a command to run for newly connected printers */
- g_object_get (G_OBJECT (preferences), "autoprinter", &autoprinter, "autoprinter-command", &autoprinter_command, NULL);
- if (G_LIKELY (autoprinter && autoprinter_command != NULL && *autoprinter_command != '\0'))
- {
- /* run the selected command for the user */
- result = tvm_run_command (context, udi, autoprinter_command, NULL, NULL, error);
- }
- g_free (autoprinter_command);
-
- return result;
-}
-
-
-
-
diff --git a/thunar-volman/tvm-printer-device.h b/thunar-volman/tvm-printer-device.h
deleted file mode 100644
index ef34ce9..0000000
--- a/thunar-volman/tvm-printer-device.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_PRINTER_DEVICE_H__
-#define __TVM_PRINTER_DEVICE_H__
-
-#include <thunar-volman/tvm-device.h>
-
-G_BEGIN_DECLS
-
-gboolean tvm_printer_device_added (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- const gchar *capability,
- GError **error) G_GNUC_INTERNAL;
-
-G_END_DECLS
-
-#endif /* !__TVM_PRINTER_DEVICE_H__ */
diff --git a/thunar-volman/tvm-prompt.c b/thunar-volman/tvm-prompt.c
deleted file mode 100644
index 756bfa5..0000000
--- a/thunar-volman/tvm-prompt.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-
-#include <thunar-volman/tvm-pango-extensions.h>
-#include <thunar-volman/tvm-prompt.h>
-
-
-
-static void
-hal_device_removed (LibHalContext *context,
- const gchar *udi)
-{
- const gchar *dialog_udi;
- GtkWidget *dialog = libhal_ctx_get_user_data (context);
-
- /* check if the active UDI of the dialog was removed */
- dialog_udi = g_object_get_data (G_OBJECT (dialog), "udi");
- if (exo_str_is_equal (dialog_udi, udi))
- {
- /* cancel the dialog */
- gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
- }
-}
-
-
-
-/**
- * tvm_prompt:
- * @context : a #LibHalContext.
- * @udi : the UDI of the device being added, which is watched for removal.
- * @icon : the icon or %NULL.
- * @title : the prompt title.
- * @primary_text : the primary prompt text.
- * @secondary_text : the secondary prompt text.
- * @first_button_text : the first button text.
- * @... : %NULL-terminated list of button text, response id pairs.
- *
- * Return value: the selected response.
- **/
-gint
-tvm_prompt (LibHalContext *context,
- const gchar *udi,
- const gchar *icon,
- const gchar *title,
- const gchar *primary_text,
- const gchar *secondary_text,
- const gchar *first_button_text,
- ...)
-{
- GtkWidget *dialog;
- GtkWidget *image;
- GtkWidget *label;
- GtkWidget *hbox;
- GtkWidget *vbox;
- DBusError derror;
- va_list args;
- gint response;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), GTK_RESPONSE_CANCEL);
- g_return_val_if_fail (context != NULL, GTK_RESPONSE_CANCEL);
-
- /* allocate a new dialog */
- dialog = gtk_dialog_new ();
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
- g_object_set_data_full (G_OBJECT (dialog), "udi", g_strdup (udi), g_free);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 6);
- gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 12);
-
- /* setup the specified title */
- if (G_LIKELY (title != NULL))
- gtk_window_set_title (GTK_WINDOW (dialog), title);
-
- /* setup the specified buttons */
- if (G_LIKELY (first_button_text != NULL))
- {
- va_start (args, first_button_text);
- for (response = va_arg (args, gint); first_button_text != NULL; )
- {
- /* insert the button */
- gtk_dialog_add_button (GTK_DIALOG (dialog), first_button_text, response);
- first_button_text = va_arg (args, const gchar *);
- if (G_UNLIKELY (first_button_text == NULL))
- break;
- response = va_arg (args, gint);
- }
- va_end (args);
- }
-
- /* setup the hbox */
- hbox = gtk_hbox_new (FALSE, 12);
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, 0);
- gtk_widget_show (hbox);
-
- /* setup the specified icon */
- if (G_LIKELY (icon != NULL))
- {
- /* setup an image for the icon */
- image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_DIALOG);
- gtk_misc_set_alignment (GTK_MISC (image), 0.0f, 0.0f);
- gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
- gtk_widget_show (image);
- }
-
- /* setup the vbox */
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
- gtk_widget_show (vbox);
-
- /* setup the primary text */
- label = gtk_label_new (primary_text);
- gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
- gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_big_bold ());
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
- gtk_widget_show (label);
-
- /* setup the secondary text */
- if (G_LIKELY (secondary_text != NULL))
- {
- label = gtk_label_new (secondary_text);
- gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
- gtk_widget_show (label);
- }
-
- /* initialize D-Bus error */
- dbus_error_init (&derror);
-
- /* setup HAL to watch the UDI for removal */
- libhal_ctx_set_user_data (context, dialog);
- libhal_ctx_set_device_removed (context, hal_device_removed);
- libhal_device_property_watch_all (context, &derror);
-
- /* run the dialog */
- response = gtk_dialog_run (GTK_DIALOG (dialog));
-
- /* cleanup */
- libhal_ctx_set_device_removed (context, NULL);
- libhal_ctx_set_user_data (context, NULL);
- gtk_widget_destroy (dialog);
- dbus_error_free (&derror);
-
- return response;
-}
-
-
diff --git a/thunar-volman/tvm-prompt.h b/thunar-volman/tvm-prompt.h
deleted file mode 100644
index ec0c2b7..0000000
--- a/thunar-volman/tvm-prompt.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __TVM_PROMPT_H__
-#define __TVM_PROMPT_H__
-
-#include <thunar-volman/tvm-device.h>
-
-G_BEGIN_DECLS
-
-enum
-{
- TVM_RESPONSE_NONE,
- TVM_RESPONSE_PLAY,
- TVM_RESPONSE_MUSIC,
- TVM_RESPONSE_BROWSE,
- TVM_RESPONSE_PHOTOS,
- TVM_RESPONSE_AUTORUN,
- TVM_RESPONSE_AUTOOPEN,
- TVM_RESPONSE_BURN_DATA_CD,
- TVM_RESPONSE_BURN_AUDIO_CD,
-};
-
-gint tvm_prompt (LibHalContext *context,
- const gchar *udi,
- const gchar *icon,
- const gchar *title,
- const gchar *primary_text,
- const gchar *secondary_text,
- const gchar *first_button_text,
- ...) G_GNUC_INTERNAL G_GNUC_NULL_TERMINATED;
-
-G_END_DECLS
-
-#endif /* !__TVM_PROMPT_H__ */
diff --git a/thunar-volman/tvm-run.c b/thunar-volman/tvm-run.c
index 1f2f951..23ea8aa 100644
--- a/thunar-volman/tvm-run.c
+++ b/thunar-volman/tvm-run.c
@@ -1,255 +1,54 @@
-/* $Id$ */
+/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
*
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
- * This program 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.
+ * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
+#include <gio/gio.h>
-#include <thunar-volman/tvm-prompt.h>
+#include <thunar-volman/tvm-context.h>
#include <thunar-volman/tvm-run.h>
-static void tvm_run_resolve (LibHalContext *context,
- const gchar *udi,
- gchar **device_file_return,
- gchar **mount_point_return);
-
-
-
-static void
-tvm_run_resolve (LibHalContext *context,
- const gchar *udi,
- gchar **device_file_return,
- gchar **mount_point_return)
-{
- GSList *mount_points;
- gchar *device_file;
-
- /* initialize return values */
- if (device_file_return != NULL)
- *device_file_return = NULL;
- if (mount_point_return != NULL)
- *mount_point_return = NULL;
-
- /* determine the device file path of the device */
- device_file = libhal_device_get_property_string (context, udi, "block.device", NULL);
- if (G_LIKELY (device_file != NULL))
- {
- /* determine the active mount point(s) for the device from the kernel */
- mount_points = exo_mount_point_list_matched (EXO_MOUNT_POINT_MATCH_ACTIVE | EXO_MOUNT_POINT_MATCH_DEVICE, device_file, NULL, NULL, NULL);
- if (G_LIKELY (mount_points != NULL))
- {
- /* return the mount point folder path */
- if (G_LIKELY (mount_point_return != NULL))
- *mount_point_return = g_strdup (((ExoMountPoint *) mount_points->data)->folder);
-
- /* release the mount points */
- g_slist_foreach (mount_points, (GFunc) exo_mount_point_free, NULL);
- g_slist_free (mount_points);
- }
-
- /* return the device file path */
- if (G_LIKELY (device_file_return != NULL))
- *device_file_return = g_strdup (device_file);
-
- /* cleanup */
- libhal_free_string (device_file);
- }
-}
-
-
-
-/**
- * tvm_run_cdburner:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the UDI of the blank CD/DVD.
- * @error : return location for errors or %NULL.
- *
- * Tries to spawn the preferred CD-Burner application for the
- * given @udi. Returns %TRUE if the device was handled, %FALSE
- * if not handled or an unrecoverable error occurred.
- *
- * Return value: %TRUE if handled, %FALSE otherwise.
- **/
-gboolean
-tvm_run_cdburner (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- GError **error)
-{
- const gchar *autoburn_command_name;
- gboolean autoburn;
- gboolean result = FALSE;
- gboolean is_dvd;
- gchar *autoburn_command;
- gchar *disc_type;
- gint response;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_return_val_if_fail (context != NULL, FALSE);
-
- /* check if autoburn is enabled */
- g_object_get (G_OBJECT (preferences), "autoburn", &autoburn, NULL);
- if (G_UNLIKELY (!autoburn))
- return TRUE;
-
- /* check if we have a DVD here */
- disc_type = libhal_device_get_property_string (context, udi, "volume.disc.type", NULL);
- is_dvd = (disc_type != NULL && strncmp (disc_type, "dvd_", 4) == 0);
- libhal_free_string (disc_type);
-
- /* ask the user what to do now */
- if (G_LIKELY (is_dvd))
- {
- /* ask what to do with the empty DVD */
- response = tvm_prompt (context, udi, "gnome-dev-disc-dvdr",
- _("Choose Disc Type"),
- _("You have inserted a blank disc."),
- _("What would you like to do?"),
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("Make _DVD"), TVM_RESPONSE_BURN_DATA_CD,
- NULL);
- }
- else
- {
- /* ask whether to burn data or audio CD */
- response = tvm_prompt (context, udi, "gnome-dev-disc-cdr",
- _("Choose Disc Type"),
- _("You have inserted a blank disc."),
- _("What would you like to do?"),
- _("Ig_nore"), GTK_RESPONSE_CANCEL,
- _("Make _Data CD"), TVM_RESPONSE_BURN_DATA_CD,
- _("Make _Audio CD"), TVM_RESPONSE_BURN_AUDIO_CD,
- NULL);
- }
-
- /* determine the autoburn command name */
- if (response == TVM_RESPONSE_BURN_DATA_CD)
- autoburn_command_name = "autoburn-data-command";
- else if (response == TVM_RESPONSE_BURN_AUDIO_CD)
- autoburn_command_name = "autoburn-audio-command";
- else
- return TRUE;
-
- /* determine the command */
- g_object_get (G_OBJECT (preferences), autoburn_command_name, &autoburn_command, NULL);
- if (G_LIKELY (autoburn_command != NULL && *autoburn_command != '\0'))
- {
- /* try to execute the preferred CD-Burner application */
- result = tvm_run_command (context, udi, autoburn_command, NULL, NULL, error);
- }
- g_free (autoburn_command);
-
- return result;
-}
-
-
-
-/**
- * tvm_run_cdplayer:
- * @preferences : a #TvmPreferences.
- * @context : a #LibHalContext.
- * @udi : the UDI of the Audio CD.
- * @error : return location for errors or %NULL.
- *
- * Tries to spawn the preferred CD-Player application for the
- * given @udi. Returns %TRUE if the device was handled, %FALSE
- * if not handled or an unrecoverable error occurred.
- *
- * Return value: %TRUE if handled, %FALSE otherwise.
- **/
-gboolean
-tvm_run_cdplayer (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- GError **error)
-{
- gboolean autoplay;
- gboolean result = TRUE;
- gchar *autoplay_command;
-
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_return_val_if_fail (context != NULL, FALSE);
-
- /* check if autoplay is enabled and we have a command */
- g_object_get (G_OBJECT (preferences), "autoplay-audio-cd", &autoplay, "autoplay-audio-cd-command", &autoplay_command, NULL);
- if (G_LIKELY (autoplay && autoplay_command != NULL && *autoplay_command != '\0'))
- {
- /* try to run the preferred CD-Player application */
- result = tvm_run_command (context, udi, autoplay_command, NULL, NULL, error);
- }
- g_free (autoplay_command);
-
- return result;
-}
-
-
-
-/**
- * tvm_run_command:
- * @context : a #LibHalContext.
- * @udi : the UDI of the device for which to run the @command.
- * @command : the command line of the application to spawn.
- * @device_file : the value to substitute for <literal>%d</literal> or %NULL.
- * @mount_point : the value to substitute for <literal>%m</literal> or %NULL.
- * @error : return location for errors or %NULL.
- *
- * Substitutes special values in @command and tries to spawn the application
- * identified by the @command.
- *
- * The HAL UDI will be substituted for <literal>%h</literal>, the device file path
- * for <literal>%d</literal> and the mount point for <literal>%m</literal>.
- *
- * Return value: %TRUE if the command was spawn successfully, %FALSE otherwise.
- **/
gboolean
-tvm_run_command (LibHalContext *context,
- const gchar *udi,
- const gchar *command,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error)
+tvm_run_command (TvmContext *context,
+ GMount *mount,
+ const gchar *command,
+ GError **error)
{
+ const gchar *device_file;
const gchar *p;
gboolean result;
GString *command_line;
- gchar *quoted;
- gchar *device;
- gchar *folder;
+ GError *err = NULL;
+ GFile *mount_point;
gchar **argv;
+ gchar *mount_path;
+ gchar *quoted;
- g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
g_return_val_if_fail (context != NULL, FALSE);
+ g_return_val_if_fail (G_IS_MOUNT (mount), FALSE);
+ g_return_val_if_fail (command != NULL && *command != '\0', FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
/* perform the required substitutions */
command_line = g_string_new (NULL);
@@ -262,30 +61,18 @@ tvm_run_command (LibHalContext *context,
switch (*++p)
{
case 'd': /* device file */
- /* check if know the device file path */
+ device_file = g_udev_device_get_device_file (context->device);
if (G_LIKELY (device_file != NULL))
- device = g_strdup (device_file);
- else
- tvm_run_resolve (context, udi, &device, NULL);
- if (G_LIKELY (device != NULL))
- g_string_append (command_line, device);
- g_free (device);
- break;
-
- case 'h': /* HAL UDI */
- g_string_append (command_line, udi);
+ g_string_append (command_line, device_file);
break;
case 'm': /* mount point */
- /* check if know the mount point */
- if (G_LIKELY (mount_point != NULL))
- folder = g_strdup (mount_point);
- else
- tvm_run_resolve (context, udi, NULL, &folder);
- if (G_LIKELY (folder != NULL))
+ mount_point = g_mount_get_root (mount);
+ mount_path = g_file_get_path (mount_point);
+ if (G_LIKELY (mount_path != NULL))
{
/* substitute mount point quoted */
- quoted = g_shell_quote (folder);
+ quoted = g_shell_quote (mount_path);
g_string_append (command_line, quoted);
g_free (quoted);
}
@@ -294,7 +81,8 @@ tvm_run_command (LibHalContext *context,
/* %m must always be substituted */
g_string_append (command_line, "\"\"");
}
- g_free (folder);
+ g_free (mount_path);
+ g_object_unref (mount_point);
break;
case '%':
@@ -315,11 +103,14 @@ tvm_run_command (LibHalContext *context,
}
/* try to parse the command line */
- result = g_shell_parse_argv (command_line->str, NULL, &argv, error);
+ result = g_shell_parse_argv (command_line->str, NULL, &argv, &err);
if (G_LIKELY (result))
{
+ g_debug ("%s", command_line->str);
+
/* try to spawn the command asynchronously in the users home directory */
- result = g_spawn_async (g_get_home_dir (), argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, error);
+ result = g_spawn_async (g_get_home_dir (), argv, NULL, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, &err);
/* cleanup */
g_strfreev (argv);
@@ -328,8 +119,8 @@ tvm_run_command (LibHalContext *context,
/* cleanup */
g_string_free (command_line, TRUE);
+ if (err != NULL)
+ g_propagate_error (error, err);
+
return result;
}
-
-
-
diff --git a/thunar-volman/tvm-run.h b/thunar-volman/tvm-run.h
index 9e50a98..cd450db 100644
--- a/thunar-volman/tvm-run.h
+++ b/thunar-volman/tvm-run.h
@@ -1,45 +1,36 @@
-/* $Id$ */
+/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
*
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * 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 the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
- * This program 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.
+ * This program 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
#ifndef __TVM_RUN_H__
#define __TVM_RUN_H__
-#include <thunar-volman/tvm-device.h>
+#include <gio/gio.h>
-G_BEGIN_DECLS
-
-gboolean tvm_run_cdburner (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- GError **error) G_GNUC_INTERNAL;
+#include <thunar-volman/tvm-context.h>
-gboolean tvm_run_cdplayer (TvmPreferences *preferences,
- LibHalContext *context,
- const gchar *udi,
- GError **error) G_GNUC_INTERNAL;
+G_BEGIN_DECLS
-gboolean tvm_run_command (LibHalContext *context,
- const gchar *udi,
- const gchar *command,
- const gchar *device_file,
- const gchar *mount_point,
- GError **error) G_GNUC_INTERNAL;
+gboolean tvm_run_command (TvmContext *context,
+ GMount *mount,
+ const gchar *command,
+ GError **error);
G_END_DECLS
diff --git a/thunar-volman/xfce-heading.c b/thunar-volman/xfce-heading.c
deleted file mode 100644
index e0ebdcd..0000000
--- a/thunar-volman/xfce-heading.c
+++ /dev/null
@@ -1,755 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2006 Benedikt Meurer <benny at xfce.org>.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "xfce-heading.h"
-
-
-
-#define XFCE_HEADING_BORDER 6
-#define XFCE_HEADING_SPACING 12
-#define XFCE_HEADING_ICON_SIZE 48
-
-#define XFCE_HEADING_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFCE_TYPE_HEADING, XfceHeadingPrivate))
-
-
-
-/* Property identifiers */
-enum
-{
- PROP_0,
- PROP_ICON,
- PROP_ICON_NAME,
- PROP_SUBTITLE,
- PROP_TITLE,
-};
-
-
-
-static void xfce_heading_class_init (XfceHeadingClass *klass);
-static void xfce_heading_init (XfceHeading *heading);
-static void xfce_heading_finalize (GObject *object);
-static void xfce_heading_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void xfce_heading_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void xfce_heading_realize (GtkWidget *widget);
-static void xfce_heading_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void xfce_heading_style_set (GtkWidget *widget,
- GtkStyle *previous_style);
-static gboolean xfce_heading_expose_event (GtkWidget *widget,
- GdkEventExpose *event);
-static AtkObject *xfce_heading_get_accessible (GtkWidget *widget);
-static PangoLayout *xfce_heading_make_layout (XfceHeading *heading);
-static GdkPixbuf *xfce_heading_make_pixbuf (XfceHeading *heading);
-
-
-
-struct _XfceHeadingPrivate
-{
- GdkPixbuf *icon;
- gchar *icon_name;
- gchar *subtitle;
- gchar *title;
-};
-
-
-
-G_DEFINE_TYPE (XfceHeading, xfce_heading, GTK_TYPE_WIDGET);
-
-
-
-static void
-xfce_heading_class_init (XfceHeadingClass *klass)
-{
- GtkWidgetClass *gtkwidget_class;
- GObjectClass *gobject_class;
-
- /* add our private data to the class */
- g_type_class_add_private (klass, sizeof (XfceHeadingPrivate));
-
- gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->finalize = xfce_heading_finalize;
- gobject_class->get_property = xfce_heading_get_property;
- gobject_class->set_property = xfce_heading_set_property;
-
- gtkwidget_class = GTK_WIDGET_CLASS (klass);
- gtkwidget_class->realize = xfce_heading_realize;
- gtkwidget_class->size_request = xfce_heading_size_request;
- gtkwidget_class->style_set = xfce_heading_style_set;
- gtkwidget_class->expose_event = xfce_heading_expose_event;
- gtkwidget_class->get_accessible = xfce_heading_get_accessible;
-
- /**
- * XfceHeading:icon:
- *
- * The #GdkPixbuf to display as icon, or %NULL to use the
- * "icon-name" property.
- *
- * Since: 4.4.0
- **/
- g_object_class_install_property (gobject_class,
- PROP_ICON,
- g_param_spec_object ("icon",
- "icon",
- "icon",
- GDK_TYPE_PIXBUF,
- G_PARAM_READWRITE));
-
- /**
- * XfceHeading:icon-name:
- *
- * If the "icon" property value is %NULL this is the name of
- * the icon to display instead (looked up using the icon theme).
- * If this property is also %NULL or the specified icon does not
- * exist in the selected icon theme, no icon will be displayed.
- *
- * Since: 4.4.0
- **/
- g_object_class_install_property (gobject_class,
- PROP_ICON_NAME,
- g_param_spec_string ("icon-name",
- "icon-name",
- "icon-name",
- NULL,
- G_PARAM_READWRITE));
-
- /**
- * XfceHeading:subtitle:
- *
- * The sub title that should be displayed below the
- * title. May be %NULL or the empty string to display
- * only the title.
- *
- * Since: 4.4.0
- **/
- g_object_class_install_property (gobject_class,
- PROP_SUBTITLE,
- g_param_spec_string ("subtitle",
- "subtitle",
- "subtitle",
- NULL,
- G_PARAM_READWRITE));
-
- /**
- * XfceHeading:title:
- *
- * The title text to display in the heading.
- *
- * Since: 4.4.0
- **/
- g_object_class_install_property (gobject_class,
- PROP_TITLE,
- g_param_spec_string ("title",
- "title",
- "title",
- NULL,
- G_PARAM_READWRITE));
-}
-
-
-
-static void
-xfce_heading_init (XfceHeading *heading)
-{
- /* setup the private data */
- heading->priv = XFCE_HEADING_GET_PRIVATE (heading);
-
- /* setup the widget parameters */
- GTK_WIDGET_UNSET_FLAGS (heading, GTK_NO_WINDOW);
-}
-
-
-
-static void
-xfce_heading_finalize (GObject *object)
-{
- XfceHeading *heading = XFCE_HEADING (object);
-
- /* release the private data */
- if (G_UNLIKELY (heading->priv->icon != NULL))
- g_object_unref (G_OBJECT (heading->priv->icon));
- g_free (heading->priv->icon_name);
- g_free (heading->priv->subtitle);
- g_free (heading->priv->title);
-
- (*G_OBJECT_CLASS (xfce_heading_parent_class)->finalize) (object);
-}
-
-
-
-static void
-xfce_heading_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- XfceHeading *heading = XFCE_HEADING (object);
-
- switch (prop_id)
- {
- case PROP_ICON:
- g_value_set_object (value, xfce_heading_get_icon (heading));
- break;
-
- case PROP_ICON_NAME:
- g_value_set_string (value, xfce_heading_get_icon_name (heading));
- break;
-
- case PROP_SUBTITLE:
- g_value_set_string (value, xfce_heading_get_subtitle (heading));
- break;
-
- case PROP_TITLE:
- g_value_set_string (value, xfce_heading_get_title (heading));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-
-
-static void
-xfce_heading_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- XfceHeading *heading = XFCE_HEADING (object);
-
- switch (prop_id)
- {
- case PROP_ICON:
- xfce_heading_set_icon (heading, g_value_get_object (value));
- break;
-
- case PROP_ICON_NAME:
- xfce_heading_set_icon_name (heading, g_value_get_string (value));
- break;
-
- case PROP_SUBTITLE:
- xfce_heading_set_subtitle (heading, g_value_get_string (value));
- break;
-
- case PROP_TITLE:
- xfce_heading_set_title (heading, g_value_get_string (value));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-
-
-static void
-xfce_heading_realize (GtkWidget *widget)
-{
- GdkWindowAttr attributes;
-
- /* mark the widget as realized */
- GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
-
- /* setup the window attributes */
- attributes.x = widget->allocation.x;
- attributes.y = widget->allocation.y;
- attributes.width = widget->allocation.width;
- attributes.height = widget->allocation.height;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.visual = gtk_widget_get_visual (widget);
- attributes.colormap = gtk_widget_get_colormap (widget);
- attributes.event_mask = gtk_widget_get_events (widget)
- | GDK_EXPOSURE_MASK;
-
- /* allocate the widget window */
- widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes,
- GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
- gdk_window_set_user_data (widget->window, widget);
-
- /* connect the style to the window */
- widget->style = gtk_style_attach (widget->style, widget->window);
-
- /* set background color (using the base color) */
- gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]);
-}
-
-
-
-static void
-xfce_heading_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- XfceHeading *heading = XFCE_HEADING (widget);
- PangoLayout *layout;
- GdkPixbuf *pixbuf;
- gint layout_width;
- gint layout_height;
- gint pixbuf_width = 0;
- gint pixbuf_height = 0;
-
- /* determine the dimensions of the title text */
- layout = xfce_heading_make_layout (heading);
- pango_layout_get_pixel_size (layout, &layout_width, &layout_height);
- g_object_unref (G_OBJECT (layout));
-
- /* determine the dimensions of the pixbuf */
- pixbuf = xfce_heading_make_pixbuf (heading);
- if (G_LIKELY (pixbuf != NULL))
- {
- pixbuf_width = gdk_pixbuf_get_width (pixbuf);
- pixbuf_height = gdk_pixbuf_get_height (pixbuf);
- g_object_unref (G_OBJECT (pixbuf));
- }
-
- /* determine the base dimensions */
- requisition->width = layout_width + pixbuf_width + ((pixbuf_width > 0) ? XFCE_HEADING_SPACING : 0);
- requisition->height = MAX (XFCE_HEADING_ICON_SIZE, MAX (pixbuf_height, layout_height));
-
- /* add border size */
- requisition->width += 2 * XFCE_HEADING_BORDER;
- requisition->height += 2 * XFCE_HEADING_BORDER;
-}
-
-
-
-static void
-xfce_heading_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
-{
- /* check if we're already realized */
- if (GTK_WIDGET_REALIZED (widget))
- {
- /* set background color (using the base color) */
- gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]);
- }
-}
-
-
-
-static gboolean
-xfce_heading_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
-{
- XfceHeading *heading = XFCE_HEADING (widget);
- PangoLayout *layout;
- GdkPixbuf *pixbuf;
- gboolean rtl;
- gint width;
- gint height;
- gint x;
- gint y;
-
- /* check if we should render from right to left */
- rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
-
- /* determine the initial horizontal position */
- x = (rtl ? widget->allocation.width - XFCE_HEADING_BORDER : XFCE_HEADING_BORDER);
-
- /* check if we have a pixbuf to render */
- pixbuf = xfce_heading_make_pixbuf (heading);
- if (G_LIKELY (pixbuf != NULL))
- {
- /* determine the pixbuf dimensions */
- width = gdk_pixbuf_get_width (pixbuf);
- height = gdk_pixbuf_get_height (pixbuf);
-
- /* determine the vertical position */
- y = (widget->allocation.height - height) / 2;
-
- /* render the pixbuf */
- gdk_draw_pixbuf (widget->window, widget->style->black_gc, pixbuf, 0, 0,
- (rtl ? x - width : x), y, width, height,
- GDK_RGB_DITHER_NORMAL, 0, 0);
-
- /* release the pixbuf */
- g_object_unref (G_OBJECT (pixbuf));
-
- /* advance the horizontal position */
- x += (rtl ? -1 : 1) * (width + XFCE_HEADING_SPACING);
- }
-
- /* generate the title layout */
- layout = xfce_heading_make_layout (heading);
- pango_layout_get_pixel_size (layout, &width, &height);
-
- /* determine the vertical position */
- y = (widget->allocation.height - height) / 2;
-
- /* render the title */
- gtk_paint_layout (widget->style, widget->window, GTK_WIDGET_STATE (widget), TRUE, &event->area,
- widget, "heading", (rtl ? x - width : x), y, layout);
-
- /* release the layout */
- g_object_unref (G_OBJECT (layout));
-
- return FALSE;
-}
-
-
-
-static AtkObject*
-xfce_heading_get_accessible (GtkWidget *widget)
-{
- AtkObject *object;
-
- object = (*GTK_WIDGET_CLASS (xfce_heading_parent_class)->get_accessible) (widget);
- atk_object_set_role (object, ATK_ROLE_HEADER);
-
- return object;
-}
-
-
-
-static PangoLayout*
-xfce_heading_make_layout (XfceHeading *heading)
-{
- PangoAttribute *attribute;
- PangoAttrList *attr_list;
- PangoLayout *layout;
- GString *text;
- gint title_length = 0;
-
- /* generate the full text */
- text = g_string_sized_new (128);
- if (G_LIKELY (heading->priv->title != NULL))
- {
- /* add the main title */
- title_length = strlen (heading->priv->title);
- g_string_append (text, heading->priv->title);
- }
- if (heading->priv->subtitle != NULL && *heading->priv->subtitle != '\0')
- {
- /* add an empty line between the title and the subtitle */
- if (G_LIKELY (heading->priv->title != NULL))
- g_string_append (text, "\n");
-
- /* add the subtitle */
- g_string_append (text, heading->priv->subtitle);
- }
-
- /* allocate and setup a new layout from the widget's context */
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (heading), text->str);
-
- /* allocate an attribute list (large bold title) */
- attr_list = pango_attr_list_new ();
- attribute = pango_attr_scale_new (PANGO_SCALE_LARGE); /* large title */
- attribute->start_index = 0;
- attribute->end_index = title_length;
- pango_attr_list_insert (attr_list, attribute);
- attribute = pango_attr_weight_new (PANGO_WEIGHT_BOLD); /* bold title */
- attribute->start_index = 0;
- attribute->end_index = title_length;
- pango_attr_list_insert (attr_list, attribute);
- pango_layout_set_attributes (layout, attr_list);
- pango_attr_list_unref (attr_list);
-
- /* cleanup */
- g_string_free (text, TRUE);
-
- return layout;
-}
-
-
-
-static GdkPixbuf*
-xfce_heading_make_pixbuf (XfceHeading *heading)
-{
- GtkIconTheme *icon_theme;
- GdkPixbuf *pixbuf = NULL;
- GdkScreen *screen;
-
- if (G_UNLIKELY (heading->priv->icon != NULL))
- {
- /* just use the specified icon */
- pixbuf = g_object_ref (G_OBJECT (heading->priv->icon));
- }
- else if (G_LIKELY (heading->priv->icon_name != NULL))
- {
- /* determine the icon theme for the current screen */
- screen = gtk_widget_get_screen (GTK_WIDGET (heading));
- icon_theme = gtk_icon_theme_get_for_screen (screen);
-
- /* try to load the icon from the icon theme */
- pixbuf = gtk_icon_theme_load_icon (icon_theme, heading->priv->icon_name,
- XFCE_HEADING_ICON_SIZE,
- GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
- }
-
- return pixbuf;
-}
-
-
-
-/**
- * xfce_heading_new:
- *
- * Allocates a new #XfceHeading instance.
- *
- * Return value: the newly allocated #XfceHeading.
- *
- * Since: 4.4.0
- **/
-GtkWidget*
-xfce_heading_new (void)
-{
- return g_object_new (XFCE_TYPE_HEADING, NULL);
-}
-
-
-
-/**
- * xfce_heading_get_icon:
- * @heading : a #XfceHeading.
- *
- * Returns the #GdkPixbuf that was set as icon for
- * @heading or %NULL if no icon is set. The returned
- * #GdkPixbuf object is owned by @heading.
- *
- * Return value: the icon for @heading, or %NULL.
- *
- * Since: 4.4.0
- **/
-GdkPixbuf*
-xfce_heading_get_icon (XfceHeading *heading)
-{
- g_return_val_if_fail (XFCE_IS_HEADING (heading), NULL);
- return heading->priv->icon;
-}
-
-
-
-/**
- * xfce_heading_set_icon:
- * @heading : a #XfceHeading.
- * @icon : the new icon or %NULL.
- *
- * If @icon is not %NULL, @heading will display the new @icon
- * aside the title. Else, if @icon is %NULL no icon is displayed
- * unless an icon name was set with xfce_heading_set_icon_name().
- *
- * Since: 4.4.0
- **/
-void
-xfce_heading_set_icon (XfceHeading *heading,
- GdkPixbuf *icon)
-{
- g_return_if_fail (XFCE_IS_HEADING (heading));
- g_return_if_fail (icon == NULL || GDK_IS_PIXBUF (icon));
-
- /* check if we have a new icon */
- if (G_LIKELY (heading->priv->icon != icon))
- {
- /* disconnect from the previous icon */
- if (G_LIKELY (heading->priv->icon != NULL))
- g_object_unref (G_OBJECT (heading->priv->icon));
-
- /* activate the new icon */
- heading->priv->icon = icon;
-
- /* connect to the new icon */
- if (G_LIKELY (icon != NULL))
- g_object_ref (G_OBJECT (icon));
-
- /* schedule a resize */
- gtk_widget_queue_resize (GTK_WIDGET (heading));
-
- /* notify listeners */
- g_object_notify (G_OBJECT (heading), "icon");
- }
-}
-
-
-
-/**
- * xfce_heading_get_icon_name:
- * @heading : a #XfceHeading.
- *
- * Returns the icon name previously set by a call to
- * xfce_heading_set_icon_name() or %NULL if no icon name
- * is set for @heading.
- *
- * Return value: the icon name for @heading, or %NULL.
- *
- * Since: 4.4.0
- **/
-G_CONST_RETURN gchar*
-xfce_heading_get_icon_name (XfceHeading *heading)
-{
- g_return_val_if_fail (XFCE_IS_HEADING (heading), NULL);
- return heading->priv->icon_name;
-}
-
-
-
-/**
- * xfce_heading_set_icon_name:
- * @heading : a #XfceHeading.
- * @icon_name : the new icon name, or %NULL.
- *
- * If @icon_name is not %NULL and the "icon" property is set to
- * %NULL, see xfce_heading_set_icon(), the @heading will display
- * the name icon identified by the @icon_name.
- *
- * Since: 4.4.0
- **/
-void
-xfce_heading_set_icon_name (XfceHeading *heading,
- const gchar *icon_name)
-{
- g_return_if_fail (XFCE_IS_HEADING (heading));
-
- /* release the previous icon name */
- g_free (heading->priv->icon_name);
-
- /* activate the new icon name */
- heading->priv->icon_name = g_strdup (icon_name);
-
- /* schedule a resize */
- gtk_widget_queue_resize (GTK_WIDGET (heading));
-
- /* notify listeners */
- g_object_notify (G_OBJECT (heading), "icon-name");
-}
-
-
-
-/**
- * xfce_heading_get_subtitle:
- * @heading : a #XfceHeading.
- *
- * Returns the sub title displayed below the
- * main title of the @heading, or %NULL if
- * no subtitle is set.
- *
- * Return value: the subtitle of @heading, or %NULL.
- *
- * Since: 4.4.0
- **/
-G_CONST_RETURN gchar*
-xfce_heading_get_subtitle (XfceHeading *heading)
-{
- g_return_val_if_fail (XFCE_IS_HEADING (heading), NULL);
- return heading->priv->subtitle;
-}
-
-
-
-/**
- * xfce_heading_set_subtitle:
- * @heading : a #XfceHeading.
- * @subtitle : the new subtitle for @heading, or %NULL.
- *
- * If @subtitle is not %NULL and not the empty string, it
- * will be displayed by @heading below the main title.
- *
- * Since: 4.4.0
- **/
-void
-xfce_heading_set_subtitle (XfceHeading *heading,
- const gchar *subtitle)
-{
- g_return_if_fail (XFCE_IS_HEADING (heading));
- g_return_if_fail (subtitle == NULL || g_utf8_validate (subtitle, -1, NULL));
-
- /* release the previous subtitle */
- g_free (heading->priv->subtitle);
-
- /* activate the new subtitle */
- heading->priv->subtitle = g_strdup (subtitle);
-
- /* schedule a resize */
- gtk_widget_queue_resize (GTK_WIDGET (heading));
-
- /* notify listeners */
- g_object_notify (G_OBJECT (heading), "subtitle");
-}
-
-
-
-/**
- * xfce_heading_get_title:
- * @heading : a #XfceHeading.
- *
- * Returns the title displayed by the @heading.
- *
- * Return value: the title displayed by the @heading.
- *
- * Since: 4.4.0
- **/
-G_CONST_RETURN gchar*
-xfce_heading_get_title (XfceHeading *heading)
-{
- g_return_val_if_fail (XFCE_IS_HEADING (heading), NULL);
- return heading->priv->title;
-}
-
-
-
-/**
- * xfce_heading_set_title:
- * @heading : a #XfceHeading.
- * @title : the new title for the @heading.
- *
- * Sets the title displayed by the @heading to the
- * specified @title.
- *
- * Since: 4.4.0
- **/
-void
-xfce_heading_set_title (XfceHeading *heading,
- const gchar *title)
-{
- g_return_if_fail (XFCE_IS_HEADING (heading));
- g_return_if_fail (title == NULL || g_utf8_validate (title, -1, NULL));
-
- /* release the previous title */
- g_free (heading->priv->title);
-
- /* activate the new title */
- heading->priv->title = g_strdup (title);
-
- /* schedule a resize */
- gtk_widget_queue_resize (GTK_WIDGET (heading));
-
- /* notify listeners */
- g_object_notify (G_OBJECT (heading), "title");
-}
-
-
diff --git a/thunar-volman/xfce-heading.h b/thunar-volman/xfce-heading.h
deleted file mode 100644
index 0ca1351..0000000
--- a/thunar-volman/xfce-heading.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2006 Benedikt Meurer <benny at xfce.org>.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __XFCE_HEADING_H__
-#define __XFCE_HEADING_H__
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-typedef struct _XfceHeadingPrivate XfceHeadingPrivate;
-typedef struct _XfceHeadingClass XfceHeadingClass;
-typedef struct _XfceHeading XfceHeading;
-
-#define XFCE_TYPE_HEADING (xfce_heading_get_type ())
-#define XFCE_HEADING(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFCE_TYPE_HEADING, XfceHeading))
-#define XFCE_HEADING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XFCE_TYPE_HEADING, XfceHeadingClass))
-#define XFCE_IS_HEADING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_HEADING))
-#define XFCE_IS_HEADING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XFCE_TYPE_HEADING))
-#define XFCE_HEADING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), XFCE_TYPE_HEADING, XfceHeadingClass))
-
-struct _XfceHeadingClass
-{
- /*< private >*/
- GtkWidgetClass __parent__;
-
- /* reserved for future expansion */
- void (*reserved0) (void);
- void (*reserved1) (void);
- void (*reserved2) (void);
- void (*reserved3) (void);
- void (*reserved4) (void);
- void (*reserved5) (void);
-};
-
-struct _XfceHeading
-{
- /*< private >*/
- GtkWidget __parent__;
- XfceHeadingPrivate *priv;
-};
-
-GType xfce_heading_get_type (void) G_GNUC_CONST;
-
-GtkWidget *xfce_heading_new (void) G_GNUC_MALLOC;
-
-GdkPixbuf *xfce_heading_get_icon (XfceHeading *heading);
-void xfce_heading_set_icon (XfceHeading *heading,
- GdkPixbuf *icon);
-
-G_CONST_RETURN gchar *xfce_heading_get_icon_name (XfceHeading *heading);
-void xfce_heading_set_icon_name (XfceHeading *heading,
- const gchar *icon_name);
-
-G_CONST_RETURN gchar *xfce_heading_get_subtitle (XfceHeading *heading);
-void xfce_heading_set_subtitle (XfceHeading *heading,
- const gchar *subtitle);
-
-G_CONST_RETURN gchar *xfce_heading_get_title (XfceHeading *heading);
-void xfce_heading_set_title (XfceHeading *heading,
- const gchar *title);
-
-G_END_DECLS
-
-#endif /* !__XFCE_HEADING_H__ */
diff --git a/thunar-volman/xfce-titled-dialog.c b/thunar-volman/xfce-titled-dialog.c
deleted file mode 100644
index 9a12243..0000000
--- a/thunar-volman/xfce-titled-dialog.c
+++ /dev/null
@@ -1,370 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2006 Benedikt Meurer <benny at xfce.org>.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-
-#include <gdk/gdkkeysyms.h>
-
-#include "xfce-heading.h"
-#include "xfce-titled-dialog.h"
-
-
-
-#define XFCE_TITLED_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFCE_TYPE_TITLED_DIALOG, XfceTitledDialogPrivate))
-
-
-
-/* Property identifiers */
-enum
-{
- PROP_0,
- PROP_SUBTITLE,
-};
-
-
-
-static void xfce_titled_dialog_class_init (XfceTitledDialogClass *klass);
-static void xfce_titled_dialog_init (XfceTitledDialog *titled_dialog);
-static void xfce_titled_dialog_finalize (GObject *object);
-static void xfce_titled_dialog_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void xfce_titled_dialog_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void xfce_titled_dialog_close (GtkDialog *dialog);
-static void xfce_titled_dialog_update_heading (XfceTitledDialog *titled_dialog);
-
-
-
-struct _XfceTitledDialogPrivate
-{
- GtkWidget *heading;
- gchar *subtitle;
-};
-
-
-
-G_DEFINE_TYPE (XfceTitledDialog, xfce_titled_dialog, GTK_TYPE_DIALOG);
-
-
-
-static void
-xfce_titled_dialog_class_init (XfceTitledDialogClass *klass)
-{
- GtkDialogClass *gtkdialog_class;
- GtkBindingSet *binding_set;
- GObjectClass *gobject_class;
-
- /* add our private data to the class */
- g_type_class_add_private (klass, sizeof (XfceTitledDialogPrivate));
-
- gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->finalize = xfce_titled_dialog_finalize;
- gobject_class->get_property = xfce_titled_dialog_get_property;
- gobject_class->set_property = xfce_titled_dialog_set_property;
-
- gtkdialog_class = GTK_DIALOG_CLASS (klass);
- gtkdialog_class->close = xfce_titled_dialog_close;
-
- /**
- * XfceTitledDialog:subtitle:
- *
- * The subtitle displayed below the main dialog title.
- *
- * Since: 4.4.0
- **/
- g_object_class_install_property (gobject_class,
- PROP_SUBTITLE,
- g_param_spec_string ("subtitle",
- "subtitle",
- "subtitle",
- NULL,
- G_PARAM_READWRITE));
-
- /* connect additional key bindings to the GtkDialog::close action signal */
- binding_set = gtk_binding_set_by_class (klass);
- gtk_binding_entry_add_signal (binding_set, GDK_w, GDK_CONTROL_MASK, "close", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_W, GDK_CONTROL_MASK, "close", 0);
-}
-
-
-
-static void
-xfce_titled_dialog_init (XfceTitledDialog *titled_dialog)
-{
- GtkWidget *line;
- GtkWidget *vbox;
-
- /* connect the private data */
- titled_dialog->priv = XFCE_TITLED_DIALOG_GET_PRIVATE (titled_dialog);
-
- /* remove the main dialog box from the window */
- g_object_ref (G_OBJECT (GTK_DIALOG (titled_dialog)->vbox));
- gtk_container_remove (GTK_CONTAINER (titled_dialog), GTK_DIALOG (titled_dialog)->vbox);
-
- /* add a new vbox w/o border to the main window */
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (titled_dialog), vbox);
- gtk_widget_show (vbox);
-
- /* add the heading to the window */
- titled_dialog->priv->heading = xfce_heading_new ();
- gtk_box_pack_start (GTK_BOX (vbox), titled_dialog->priv->heading, FALSE, FALSE, 0);
- gtk_widget_show (titled_dialog->priv->heading);
-
- /* add the separator between header and content */
- line = gtk_hseparator_new ();
- gtk_box_pack_start (GTK_BOX (vbox), line, FALSE, FALSE, 0);
- gtk_widget_show (line);
-
- /* add the main dialog box to the new vbox */
- gtk_box_pack_start (GTK_BOX (vbox), GTK_DIALOG (titled_dialog)->vbox, TRUE, TRUE, 0);
- g_object_unref (G_OBJECT (GTK_DIALOG (titled_dialog)->vbox));
-
- /* make sure to update the heading whenever one of the relevant window properties changes */
- g_signal_connect (G_OBJECT (titled_dialog), "notify::icon", G_CALLBACK (xfce_titled_dialog_update_heading), NULL);
- g_signal_connect (G_OBJECT (titled_dialog), "notify::icon-name", G_CALLBACK (xfce_titled_dialog_update_heading), NULL);
- g_signal_connect (G_OBJECT (titled_dialog), "notify::title", G_CALLBACK (xfce_titled_dialog_update_heading), NULL);
-
- /* initially update the heading properties */
- xfce_titled_dialog_update_heading (titled_dialog);
-}
-
-
-
-
-static void
-xfce_titled_dialog_finalize (GObject *object)
-{
- XfceTitledDialog *titled_dialog = XFCE_TITLED_DIALOG (object);
-
- /* release the subtitle */
- g_free (titled_dialog->priv->subtitle);
-
- (*G_OBJECT_CLASS (xfce_titled_dialog_parent_class)->finalize) (object);
-}
-
-
-
-static void
-xfce_titled_dialog_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- XfceTitledDialog *titled_dialog = XFCE_TITLED_DIALOG (object);
-
- switch (prop_id)
- {
- case PROP_SUBTITLE:
- g_value_set_string (value, xfce_titled_dialog_get_subtitle (titled_dialog));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-
-
-static void
-xfce_titled_dialog_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- XfceTitledDialog *titled_dialog = XFCE_TITLED_DIALOG (object);
-
- switch (prop_id)
- {
- case PROP_SUBTITLE:
- xfce_titled_dialog_set_subtitle (titled_dialog, g_value_get_string (value));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-
-
-static void
-xfce_titled_dialog_close (GtkDialog *dialog)
-{
- GdkEvent *event;
-
- /* verify that the dialog is realized */
- if (G_LIKELY (GTK_WIDGET_REALIZED (dialog)))
- {
- /* send a delete event to the dialog */
- event = gdk_event_new (GDK_DELETE);
- event->any.window = g_object_ref (GTK_WIDGET (dialog)->window);
- event->any.send_event = TRUE;
- gtk_main_do_event (event);
- gdk_event_free (event);
- }
-}
-
-
-
-static void
-xfce_titled_dialog_update_heading (XfceTitledDialog *titled_dialog)
-{
- /* update the heading properties using the window property values */
- xfce_heading_set_icon (XFCE_HEADING (titled_dialog->priv->heading), gtk_window_get_icon (GTK_WINDOW (titled_dialog)));
- xfce_heading_set_icon_name (XFCE_HEADING (titled_dialog->priv->heading), gtk_window_get_icon_name (GTK_WINDOW (titled_dialog)));
- xfce_heading_set_title (XFCE_HEADING (titled_dialog->priv->heading), gtk_window_get_title (GTK_WINDOW (titled_dialog)));
-}
-
-
-
-/**
- * xfce_titled_dialog_new:
- *
- * Allocates a new #XfceTitledDialog instance.
- *
- * Return value: the newly allocated #XfceTitledDialog.
- *
- * Since: 4.4.0
- **/
-GtkWidget*
-xfce_titled_dialog_new (void)
-{
- return g_object_new (XFCE_TYPE_TITLED_DIALOG, NULL);
-}
-
-
-
-/**
- * xfce_titled_dialog_new_with_buttons:
- * @title : title of the dialog, or %NULL.
- * @parent : transient parent window of the dialog, or %NULL.
- * @flags : from #GtkDialogFlags.
- * @first_button_text : stock ID or text to go in first, or %NULL.
- * @... : response ID for the first button, then additional buttons, ending with %NULL.
- *
- * See the documentation of gtk_dialog_new_with_buttons() for details about the
- * parameters and the returned dialog.
- *
- * Return value: the newly allocated #XfceTitledDialog.
- *
- * Since: 4.4.0
- **/
-GtkWidget*
-xfce_titled_dialog_new_with_buttons (const gchar *title,
- GtkWindow *parent,
- GtkDialogFlags flags,
- const gchar *first_button_text,
- ...)
-{
- const gchar *button_text;
- GtkWidget *dialog;
- va_list args;
- gint response_id;
-
- /* allocate the dialog */
- dialog = g_object_new (XFCE_TYPE_TITLED_DIALOG,
- "destroy-with-parent", ((flags & GTK_DIALOG_DESTROY_WITH_PARENT) != 0),
- "has-separator", ((flags & GTK_DIALOG_NO_SEPARATOR) == 0),
- "modal", ((flags & GTK_DIALOG_MODAL) != 0),
- "title", title,
- NULL);
-
- /* set the transient parent (if any) */
- if (G_LIKELY (parent != NULL))
- gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
-
- /* add all additional buttons */
- va_start (args, first_button_text);
- for (button_text = first_button_text; button_text != NULL; )
- {
- response_id = va_arg (args, gint);
- gtk_dialog_add_button (GTK_DIALOG (dialog), button_text, response_id);
- button_text = va_arg (args, const gchar *);
- }
- va_end (args);
-
- return dialog;
-}
-
-
-
-/**
- * xfce_titled_dialog_get_subtitle:
- * @titled_dialog : a #XfceTitledDialog.
- *
- * Returns the subtitle of the @titled_dialog, or %NULL
- * if no subtitle is displayed in the @titled_dialog.
- *
- * Return value: the subtitle of @titled_dialog, or %NULL.
- *
- * Since: 4.4.0
- **/
-G_CONST_RETURN gchar*
-xfce_titled_dialog_get_subtitle (XfceTitledDialog *titled_dialog)
-{
- g_return_val_if_fail (XFCE_IS_TITLED_DIALOG (titled_dialog), NULL);
- return titled_dialog->priv->subtitle;
-}
-
-
-
-/**
- * xfce_titled_dialog_set_subtitle:
- * @titled_dialog : a #XfceTitledDialog.
- * @subtitle : the new subtitle for the @titled_dialog, or %NULL.
- *
- * Sets the subtitle displayed by @titled_dialog to @subtitle; if
- * @subtitle is %NULL no subtitle will be displayed by the @titled_dialog.
- *
- * Since: 4.4.0
- **/
-void
-xfce_titled_dialog_set_subtitle (XfceTitledDialog *titled_dialog,
- const gchar *subtitle)
-{
- g_return_if_fail (XFCE_IS_TITLED_DIALOG (titled_dialog));
- g_return_if_fail (subtitle == NULL || g_utf8_validate (subtitle, -1, NULL));
-
- /* release the previous subtitle */
- g_free (titled_dialog->priv->subtitle);
-
- /* activate the new subtitle */
- titled_dialog->priv->subtitle = g_strdup (subtitle);
-
- /* update the subtitle for the heading */
- xfce_heading_set_subtitle (XFCE_HEADING (titled_dialog->priv->heading), subtitle);
-
- /* notify listeners */
- g_object_notify (G_OBJECT (titled_dialog), "subtitle");
-}
-
-
diff --git a/thunar-volman/xfce-titled-dialog.h b/thunar-volman/xfce-titled-dialog.h
deleted file mode 100644
index 5243a2e..0000000
--- a/thunar-volman/xfce-titled-dialog.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* $Id$ */
-/*-
- * Copyright (c) 2006 Benedikt Meurer <benny at xfce.org>.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __XFCE_TITLED_DIALOG_H__
-#define __XFCE_TITLED_DIALOG_H__
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-typedef struct _XfceTitledDialogPrivate XfceTitledDialogPrivate;
-typedef struct _XfceTitledDialogClass XfceTitledDialogClass;
-typedef struct _XfceTitledDialog XfceTitledDialog;
-
-#define XFCE_TYPE_TITLED_DIALOG (xfce_titled_dialog_get_type ())
-#define XFCE_TITLED_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFCE_TYPE_TITLED_DIALOG, XfceTitledDialog))
-#define XFCE_TITLED_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XFCE_TYPE_TITLED_DIALOG, XfceTitledDialogClass))
-#define XFCE_IS_TITLED_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_TITLED_DIALOG))
-#define XFCE_IS_TITLED_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XFCE_TYPE_TITLED_DIALOG))
-#define XFCE_TITLED_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), XFCE_TYPE_TITLED_DIALOG, XfceTitledDialogClass))
-
-struct _XfceTitledDialogClass
-{
- /*< private >*/
- GtkDialogClass __parent__;
-
- /* reserved for future expansion */
- void (*reserved0) (void);
- void (*reserved1) (void);
- void (*reserved2) (void);
- void (*reserved3) (void);
- void (*reserved4) (void);
- void (*reserved5) (void);
-};
-
-struct _XfceTitledDialog
-{
- /*< private >*/
- GtkDialog __parent__;
- XfceTitledDialogPrivate *priv;
-};
-
-GType xfce_titled_dialog_get_type (void) G_GNUC_CONST;
-
-GtkWidget *xfce_titled_dialog_new (void) G_GNUC_MALLOC;
-GtkWidget *xfce_titled_dialog_new_with_buttons (const gchar *title,
- GtkWindow *parent,
- GtkDialogFlags flags,
- const gchar *first_button_text,
- ...) G_GNUC_MALLOC;
-
-G_CONST_RETURN gchar *xfce_titled_dialog_get_subtitle (XfceTitledDialog *titled_dialog);
-void xfce_titled_dialog_set_subtitle (XfceTitledDialog *titled_dialog,
- const gchar *subtitle);
-
-G_END_DECLS
-
-#endif /* !__XFCE_TITLED_DIALOG_H__ */
More information about the Xfce4-commits
mailing list