Updating branch refs/heads/jannis/port-to-udev to 798c739d69d83ecb1143245783702ca710dceb84 (commit) from 2dd3ea8f0a84f99009a32a2399f1639fbfae12d7 (commit)
commit 798c739d69d83ecb1143245783702ca710dceb84 Author: Jannis Pohlmann <jan...@xfce.org> Date: Wed Jul 21 13:41:29 2010 +0200 Initial work on porting thunar-volman-settings to the new code. The storage devices tab already works again. .gitignore | 1 - Makefile.am | 30 +-- configure.in.in | 2 + thunar-volman-settings.in | 7 - .../Makefile.am | 64 ++-- thunar-volman-settings/main.c | 88 ++++ .../thunar-volman-settings.desktop.in.in | 0 thunar-volman-settings/tvm-command-entry.c | 418 ++++++++++++++++++++ thunar-volman-settings/tvm-command-entry.h | 62 +++ thunar-volman-settings/tvm-preferences-dialog.c | 325 +++++++++++++++ thunar-volman-settings/tvm-preferences-dialog.h | 46 +++ thunar-volman/Makefile.am | 2 - 12 files changed, 975 insertions(+), 70 deletions(-) diff --git a/.gitignore b/.gitignore index 53a839c..e35c136 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,5 @@ mkinstalldirs POTFILES stamp-it stamp-h1 -thunar-volman-settings thunar-volman-settings.desktop texput.log diff --git a/Makefile.am b/Makefile.am index 47b4284..14481ac 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,7 +3,8 @@ SUBDIRS = \ icons \ po \ - thunar-volman + thunar-volman \ + thunar-volman-settings distclean-local: rm -rf *.spec *.cache *~ @@ -12,38 +13,15 @@ rpm: dist rpmbuild -ta $(PACKAGE)-$(VERSION).tar.gz @rm -f $(PACKAGE)-$(VERSION).tar.gz -libexec_SCRIPTS = \ - thunar-volman-settings - -thunar-volman-settings: thunar-volman-settings.in Makefile - rm -f thunar-volman-settings.gen thunar-volman-settings - sed -e "s,\...@bindir\@,$(bindir),g" \ - < $(srcdir)/thunar-volman-settings.in \ - > thunar-volman-settings.gen - mv thunar-volman-settings.gen thunar-volman-settings - -desktopdir = $(datadir)/applications -desktop_in_in_files = thunar-volman-settings.desktop.in.in -desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in) -%.desktop.in: %.desktop.in.in - sed -e "s,\...@libexecdir\@,$(libexecdir),g" < $< > $@ -desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) -...@intltool_desktop_rule@ - EXTRA_DIST = \ THANKS \ intltool-extract.in \ intltool-merge.in \ - intltool-update.in \ - thunar-volman-settings.in \ - $(desktop_in_in_files) + intltool-update.in DISTCLEANFILES = \ intltool-extract \ intltool-merge \ - intltool-update \ - thunar-volman-settings \ - $(desktop_in_files) \ - $(desktop_DATA) + intltool-update # vi:set ts=8 sw=8 noet ai nocindent syntax=automake: diff --git a/configure.in.in b/configure.in.in index 1a40559..89ba231 100644 --- a/configure.in.in +++ b/configure.in.in @@ -81,6 +81,7 @@ dnl *********************************** dnl *** Check for required packages *** dnl *********************************** XDT_CHECK_PACKAGE([DBUS], [dbus-glib-1], [0.34]) +XDT_CHECK_PACKAGE([EXO], [exo-1], [0.5.0]) 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]) @@ -120,6 +121,7 @@ icons/48x48/Makefile icons/scalable/Makefile po/Makefile.in thunar-volman/Makefile +thunar-volman-settings/Makefile ]) dnl *************************** diff --git a/thunar-volman-settings.in b/thunar-volman-settings.in deleted file mode 100644 index c78d09e..0000000 --- a/thunar-volman-settings.in +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2007 Benedikt Meurer <be...@xfce.org> -# - -# launch the thunar-volman preferences -exec @bindir@/thunar-volman -c diff --git a/thunar-volman/Makefile.am b/thunar-volman-settings/Makefile.am similarity index 58% copy from thunar-volman/Makefile.am copy to thunar-volman-settings/Makefile.am index 7e73183..296e0e7 100644 --- a/thunar-volman/Makefile.am +++ b/thunar-volman-settings/Makefile.am @@ -21,59 +21,55 @@ INCLUDES = \ -I$(top_builddir) \ -I$(top_srcdir) \ -DBINDIR=\"$(bindir)\" \ - -DEXO_API_SUBJECT_TO_CHANGE \ - -DEXO_DISABLE_DEPRECATED \ - -DG_LOG_DOMAIN=\"thunar-volman\" \ + -DG_LOG_DOMAIN=\"thunar-volman-settings\" \ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \ + -DDATADIR=\"$(datadir)\" \ $(PLATFORM_CPPFLAGS) bin_PROGRAMS = \ - thunar-volman + thunar-volman-settings -thunar_volman_SOURCES = \ +thunar_volman_settings_SOURCES = \ main.c \ - tvm-block-device.c \ - tvm-block-device.h \ - tvm-context.c \ - tvm-context.h \ - tvm-device.c \ - tvm-device.h \ - tvm-gio-extensions.c \ - tvm-gio-extensions.h \ - tvm-input-device.c \ - tvm-input-device.h \ - tvm-pango-extensions.c \ - tvm-pango-extensions.h \ - tvm-prompt.c \ - tvm-prompt.h \ - tvm-run.c \ - tvm-run.h \ - tvm-usb-device.c \ - tvm-usb-device.h + tvm-command-entry.c \ + tvm-command-entry.h \ + tvm-preferences-dialog.c \ + tvm-preferences-dialog.h \ + ../thunar-volman/tvm-pango-extensions.c \ + ../thunar-volman/tvm-pango-extensions.h -thunar_volman_CFLAGS = \ - $(DBUS_CFLAGS) \ +thunar_volman_settings_CFLAGS = \ + $(EXO_CFLAGS) \ $(GLIB_CFLAGS) \ - $(GIO_CFLAGS) \ - $(GTHREAD_CFLAGS) \ $(GTK_CFLAGS) \ - $(GUDEV_CFLAGS) \ $(LIBXFCE4UI_CFLAGS) \ $(LIBXFCE4UTIL_CFLAGS) \ $(XFCONF_CFLAGS) \ $(PLATFORM_CFLAGS) -thunar_volman_LDFLAGS = \ +thunar_volman_settings_LDFLAGS = \ -no-undefined \ $(PLATFORM_LDFLAGS) -thunar_volman_LDADD = \ - $(DBUS_LIBS) \ +thunar_volman_settings_LDADD = \ + $(EXO_LIBS) \ $(GLIB_LIBS) \ - $(GIO_LIBS) \ - $(GTHREAD_LIBS) \ $(GTK_LIBS) \ - $(GUDEV_LIBS) \ $(LIBXFCE4UI_LIBS) \ $(LIBXFCE4UTIL_LIBS) \ $(XFCONF_LIBS) + +desktopdir = $(datadir)/applications +desktop_in_in_files = thunar-volman-settings.desktop.in.in +desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in) +%.desktop.in: %.desktop.in.in + sed -e "s,\...@libexecdir\@,$(libexecdir),g" < $< > $@ +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +...@intltool_desktop_rule@ + +EXTRA_DIST = \ + $(desktop_in_in_files) + +DISTCLEANFILES = \ + $(desktop_in_files) \ + $(desktop_DATA) diff --git a/thunar-volman-settings/main.c b/thunar-volman-settings/main.c new file mode 100644 index 0000000..f58aba7 --- /dev/null +++ b/thunar-volman-settings/main.c @@ -0,0 +1,88 @@ +/* vi:set et ai sw=2 sts=2 ts=2: */ +/*- + * Copyright (c) 2010 Jannis Pohlmann <jan...@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 + +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif + +#include <glib.h> +#include <glib/gstdio.h> + +#include <gtk/gtk.h> + +#include <libxfce4util/libxfce4util.h> + +#include <xfconf/xfconf.h> + +#include <thunar-volman-settings/tvm-preferences-dialog.h> + + +int +main (int argc, + char **argv) +{ + GtkWidget *dialog; + GError *error = NULL; + + /* setup translation domain */ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + + /* setup application name */ + g_set_application_name (_("Thunar Volume Manager Settings")); + +#ifdef G_ENABLE_DEBUG + /* 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 threading system */ + if (!g_thread_supported ()) + g_thread_init (NULL); + + /* initialize GTK+ */ + if (!gtk_init_with_args (&argc, &argv, NULL, NULL, GETTEXT_PACKAGE, &error)) + { + g_fprintf (stderr, "%s: %s.\n", g_get_prgname (), error->message); + g_error_free (error); + return EXIT_FAILURE; + } + + /* initialize xfconf */ + if (!xfconf_init (&error)) + { + g_fprintf (stderr, "%s: %s.\n", g_get_prgname (), error->message); + g_error_free (error); + return EXIT_FAILURE; + } + + /* display the dialog */ + dialog = tvm_preferences_dialog_new (); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + /* free xfconf resources */ + xfconf_shutdown (); + + return EXIT_SUCCESS; +} diff --git a/thunar-volman-settings.desktop.in.in b/thunar-volman-settings/thunar-volman-settings.desktop.in.in similarity index 100% copy from thunar-volman-settings.desktop.in.in copy to thunar-volman-settings/thunar-volman-settings.desktop.in.in diff --git a/thunar-volman-settings/tvm-command-entry.c b/thunar-volman-settings/tvm-command-entry.c new file mode 100644 index 0000000..8ab3589 --- /dev/null +++ b/thunar-volman-settings/tvm-command-entry.c @@ -0,0 +1,418 @@ +/* vi:set et ai sw=2 sts=2 ts=2: */ +/*- + * Copyright (c) 2005-2007 Benedikt Meurer <be...@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 + +#ifdef HAVE_MEMORY_H +#include <memory.h> +#endif +#ifdef HAVE_STRING_H +#include <string.h> +#endif + +#include <glib.h> + +#include <gtk/gtk.h> + +#include <exo/exo.h> + +#include <thunar-volman-settings/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-settings/tvm-command-entry.h b/thunar-volman-settings/tvm-command-entry.h new file mode 100644 index 0000000..7d1be68 --- /dev/null +++ b/thunar-volman-settings/tvm-command-entry.h @@ -0,0 +1,62 @@ +/* vi:set et ai sw=2 sts=2 ts=2: */ +/*- + * Copyright (c) 2005-2007 Benedikt Meurer <be...@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_COMMAND_ENTRY_H__ +#define __TVM_COMMAND_ENTRY_H__ + +#include <gtk/gtk.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-settings/tvm-preferences-dialog.c b/thunar-volman-settings/tvm-preferences-dialog.c new file mode 100644 index 0000000..89acc75 --- /dev/null +++ b/thunar-volman-settings/tvm-preferences-dialog.c @@ -0,0 +1,325 @@ +/* vi:set et ai sw=2 sts=2 ts=2: */ +/*- + * Copyright (c) 2005-2007 Benedikt Meurer <be...@xfce.org> + * Copyright (c) 2010 Jannis Pohlmann <jan...@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 <glib-object.h> + +#include <libxfce4ui/libxfce4ui.h> + +#include <xfconf/xfconf.h> + +#include <thunar-volman/tvm-pango-extensions.h> + +#include <thunar-volman-settings/tvm-command-entry.h> +#include <thunar-volman-settings/tvm-preferences-dialog.h> + + + +/* property identifiers */ +enum +{ + PROP_0, +}; + + + +static void tvm_preferences_dialog_help_clicked (GtkWidget *button, + TvmPreferencesDialog *dialog); + + + +struct _TvmPreferencesDialogClass +{ + XfceTitledDialogClass __parent__; +}; + +struct _TvmPreferencesDialog +{ + XfceTitledDialog __parent__; +}; + +struct _TvmPreferencesDialogPrivate +{ +}; + + + +G_DEFINE_TYPE (TvmPreferencesDialog, tvm_preferences_dialog, XFCE_TYPE_TITLED_DIALOG) + + + +static void +tvm_preferences_dialog_class_init (TvmPreferencesDialogClass *klass) +{ + /* Determine the parent type class */ + tvm_preferences_dialog_parent_class = g_type_class_peek_parent (klass); +} + + + +static void +tvm_preferences_dialog_init (TvmPreferencesDialog *dialog) +{ + XfconfChannel *channel; + GtkSizeGroup *size_group; + GtkWidget *button; + GtkWidget *entry; + GtkWidget *frame; + GtkWidget *label; + GtkWidget *image; + GtkWidget *notebook; + GtkWidget *table; + GtkWidget *vbox; + + channel = xfconf_channel_get ("thunar-volman"); + + /* 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")); + xfconf_g_property_bind (channel, "/automount-drives/enabled", G_TYPE_BOOLEAN, + 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")); + xfconf_g_property_bind (channel, "/automount-media/enabled", G_TYPE_BOOLEAN, + 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")); + xfconf_g_property_bind (channel, "/autobrowse/enabled", G_TYPE_BOOLEAN, + 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")); + xfconf_g_property_bind (channel, "/autorun/enabled", G_TYPE_BOOLEAN, 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")); + xfconf_g_property_bind (channel, "/autoopen/enabled", G_TYPE_BOOLEAN, 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")); + xfconf_g_property_bind (channel, "/autoburn/enabled", G_TYPE_BOOLEAN, 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:")); + xfconf_g_property_bind (channel, "/autoburn/enabled", G_TYPE_BOOLEAN, entry, "sensitive"); + xfconf_g_property_bind (channel, "/autoburn/data-cd-command", G_TYPE_STRING, 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:")); + xfconf_g_property_bind (channel, "/autoburn/enabled", G_TYPE_BOOLEAN, entry, "sensitive"); + xfconf_g_property_bind (channel, "/autoburn/audio-cd-command", G_TYPE_STRING, 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)); +} + + + +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 (GTK_IS_BUTTON (button)); + g_return_if_fail (TVM_IS_PREFERENCES_DIALOG (dialog)); + + /* 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, + _("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); +} + + + +GtkWidget * +tvm_preferences_dialog_new (void) +{ + return g_object_new (TVM_TYPE_PREFERENCES_DIALOG, NULL); +} diff --git a/thunar-volman-settings/tvm-preferences-dialog.h b/thunar-volman-settings/tvm-preferences-dialog.h new file mode 100644 index 0000000..e0ca571 --- /dev/null +++ b/thunar-volman-settings/tvm-preferences-dialog.h @@ -0,0 +1,46 @@ +/* vi:set et ai sw=2 sts=2 ts=2: */ +/*- + * Copyright (c) 2010 Jannis Pohlmann <jan...@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_PREFERENCES_DIALOG_H__ +#define __TVM_PREFERENCES_DIALOG_H__ + +#include <glib-object.h> + +G_BEGIN_DECLS + +#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)) + +typedef struct _TvmPreferencesDialogPrivate TvmPreferencesDialogPrivate; +typedef struct _TvmPreferencesDialogClass TvmPreferencesDialogClass; +typedef struct _TvmPreferencesDialog TvmPreferencesDialog; + +GType tvm_preferences_dialog_get_type (void) G_GNUC_CONST; + +GtkWidget *tvm_preferences_dialog_new (void) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; + + +G_END_DECLS + +#endif /* !__TVM_PREFERENCES_DIALOG_H__ */ diff --git a/thunar-volman/Makefile.am b/thunar-volman/Makefile.am index 7e73183..e64b656 100644 --- a/thunar-volman/Makefile.am +++ b/thunar-volman/Makefile.am @@ -21,8 +21,6 @@ INCLUDES = \ -I$(top_builddir) \ -I$(top_srcdir) \ -DBINDIR=\"$(bindir)\" \ - -DEXO_API_SUBJECT_TO_CHANGE \ - -DEXO_DISABLE_DEPRECATED \ -DG_LOG_DOMAIN=\"thunar-volman\" \ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \ $(PLATFORM_CPPFLAGS) _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits