Tree of tag thunar-4.20.2 (commit 11a519f) from https://gitlab.xfce.org/xfce/thunar. Upstream history is not included here to keep the repository small.
1551 lines
65 KiB
C
1551 lines
65 KiB
C
/* vi:set et ai sw=2 sts=2 ts=2: */
|
|
/*-
|
|
* Copyright (c) 2005-2007 Benedikt Meurer <benny@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/thunar-application.h"
|
|
#include "thunar/thunar-compact-view.h"
|
|
#include "thunar/thunar-details-view.h"
|
|
#include "thunar/thunar-dialogs.h"
|
|
#include "thunar/thunar-enum-types.h"
|
|
#include "thunar/thunar-gdk-extensions.h"
|
|
#include "thunar/thunar-gtk-extensions.h"
|
|
#include "thunar/thunar-icon-view.h"
|
|
#include "thunar/thunar-pango-extensions.h"
|
|
#include "thunar/thunar-preferences-dialog.h"
|
|
#include "thunar/thunar-preferences.h"
|
|
#include "thunar/thunar-private.h"
|
|
#include "thunar/thunar-renamer-dialog.h"
|
|
#include "thunar/thunar-shortcuts-view.h"
|
|
#include "thunar/thunar-statusbar.h"
|
|
#include "thunar/thunar-util.h"
|
|
#include "thunar/thunar-window.h"
|
|
|
|
#include <libxfce4kbd-private/xfce-shortcuts-editor-dialog.h>
|
|
#include <libxfce4kbd-private/xfce-shortcuts-editor.h>
|
|
#include <libxfce4ui/libxfce4ui.h>
|
|
|
|
|
|
|
|
static void
|
|
thunar_preferences_dialog_finalize (GObject *object);
|
|
static void
|
|
thunar_preferences_dialog_response (GtkDialog *dialog,
|
|
gint response);
|
|
static void
|
|
thunar_preferences_dialog_configure (ThunarPreferencesDialog *dialog);
|
|
|
|
|
|
|
|
struct _ThunarPreferencesDialogClass
|
|
{
|
|
XfceTitledDialogClass __parent__;
|
|
};
|
|
|
|
struct _ThunarPreferencesDialog
|
|
{
|
|
XfceTitledDialog __parent__;
|
|
ThunarPreferences *preferences;
|
|
};
|
|
|
|
|
|
|
|
G_DEFINE_TYPE (ThunarPreferencesDialog, thunar_preferences_dialog, XFCE_TYPE_TITLED_DIALOG)
|
|
|
|
|
|
|
|
static gboolean
|
|
transform_icon_size_to_index (GBinding *binding,
|
|
const GValue *src_value,
|
|
GValue *dst_value,
|
|
gpointer user_data)
|
|
{
|
|
GEnumClass *klass;
|
|
guint n;
|
|
|
|
klass = g_type_class_ref (THUNAR_TYPE_ICON_SIZE);
|
|
for (n = 0; n < klass->n_values; ++n)
|
|
{
|
|
if (klass->values[n].value == g_value_get_enum (src_value))
|
|
{
|
|
g_value_set_int (dst_value, n);
|
|
break;
|
|
}
|
|
}
|
|
g_type_class_unref (klass);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
transform_index_to_icon_size (GBinding *binding,
|
|
const GValue *src_value,
|
|
GValue *dst_value,
|
|
gpointer user_data)
|
|
{
|
|
GEnumClass *klass;
|
|
|
|
klass = g_type_class_ref (THUNAR_TYPE_ICON_SIZE);
|
|
g_value_set_enum (dst_value, klass->values[g_value_get_int (src_value)].value);
|
|
g_type_class_unref (klass);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
transform_view_string_to_index (GBinding *binding,
|
|
const GValue *src_value,
|
|
GValue *dst_value,
|
|
gpointer user_data)
|
|
{
|
|
GType type;
|
|
|
|
type = g_type_from_name (g_value_get_string (src_value));
|
|
if (type == THUNAR_TYPE_ICON_VIEW)
|
|
g_value_set_int (dst_value, 0);
|
|
else if (type == THUNAR_TYPE_DETAILS_VIEW)
|
|
g_value_set_int (dst_value, 1);
|
|
else if (type == THUNAR_TYPE_COMPACT_VIEW)
|
|
g_value_set_int (dst_value, 2);
|
|
else
|
|
g_value_set_int (dst_value, 3);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
transform_view_index_to_string (GBinding *binding,
|
|
const GValue *src_value,
|
|
GValue *dst_value,
|
|
gpointer user_data)
|
|
{
|
|
switch (g_value_get_int (src_value))
|
|
{
|
|
case 0:
|
|
g_value_set_static_string (dst_value, g_type_name (THUNAR_TYPE_ICON_VIEW));
|
|
break;
|
|
|
|
case 1:
|
|
g_value_set_static_string (dst_value, g_type_name (THUNAR_TYPE_DETAILS_VIEW));
|
|
break;
|
|
|
|
case 2:
|
|
g_value_set_static_string (dst_value, g_type_name (THUNAR_TYPE_COMPACT_VIEW));
|
|
break;
|
|
|
|
default:
|
|
g_value_set_static_string (dst_value, g_type_name (G_TYPE_NONE));
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
transform_string_to_uint64 (GBinding *binding,
|
|
const GValue *src_value,
|
|
GValue *dst_value,
|
|
gpointer user_data)
|
|
{
|
|
const gchar *string = g_value_get_string (src_value);
|
|
g_value_set_uint64 (dst_value, g_ascii_strtoull (string, NULL, 10));
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
transform_uint64_to_string (GBinding *binding,
|
|
const GValue *src_value,
|
|
GValue *dst_value,
|
|
gpointer user_data)
|
|
{
|
|
gchar *string = g_strdup_printf ("%ld", g_value_get_uint64 (src_value));
|
|
g_value_set_string (dst_value, string);
|
|
g_free (string);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
thunar_preferences_dialog_class_init (ThunarPreferencesDialogClass *klass)
|
|
{
|
|
GtkDialogClass *gtkdialog_class;
|
|
GObjectClass *gobject_class;
|
|
|
|
gobject_class = G_OBJECT_CLASS (klass);
|
|
gobject_class->finalize = thunar_preferences_dialog_finalize;
|
|
|
|
gtkdialog_class = GTK_DIALOG_CLASS (klass);
|
|
gtkdialog_class->response = thunar_preferences_dialog_response;
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
on_date_format_changed (GtkWidget *combo,
|
|
GtkWidget *customFormat)
|
|
{
|
|
GtkComboBox *combobox = GTK_COMBO_BOX (combo);
|
|
|
|
_thunar_return_if_fail (GTK_IS_COMBO_BOX (combobox));
|
|
_thunar_return_if_fail (GTK_IS_WIDGET (customFormat));
|
|
|
|
if (gtk_combo_box_get_active (combobox) == THUNAR_DATE_STYLE_CUSTOM || gtk_combo_box_get_active (combobox) == THUNAR_DATE_STYLE_CUSTOM_SIMPLE)
|
|
gtk_widget_set_visible (customFormat, TRUE);
|
|
else
|
|
gtk_widget_set_visible (customFormat, FALSE);
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
on_execute_shell_scripts_changed (GtkWidget *combo,
|
|
GtkWidget *image)
|
|
{
|
|
GtkComboBox *combobox = GTK_COMBO_BOX (combo);
|
|
|
|
_thunar_return_if_fail (GTK_IS_COMBO_BOX (combobox));
|
|
_thunar_return_if_fail (GTK_IS_WIDGET (image));
|
|
|
|
gtk_widget_set_visible (image, gtk_combo_box_get_active (combobox) != THUNAR_EXECUTE_SHELL_SCRIPT_NEVER);
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
thunar_preferences_dialog_init (ThunarPreferencesDialog *dialog)
|
|
{
|
|
ThunarDateStyle date_style;
|
|
GtkAdjustment *adjustment;
|
|
GtkWidget *notebook;
|
|
GtkWidget *button;
|
|
GtkWidget *combo;
|
|
GtkWidget *entry;
|
|
GtkWidget *image;
|
|
GtkWidget *frame;
|
|
GtkWidget *label;
|
|
GtkWidget *range;
|
|
GtkWidget *grid;
|
|
GtkWidget *hbox;
|
|
GtkWidget *ibox;
|
|
GtkWidget *vbox;
|
|
GtkWidget *infobar;
|
|
GEnumClass *type;
|
|
gchar *date;
|
|
gint row = 0;
|
|
|
|
/* grab a reference on the preferences */
|
|
dialog->preferences = thunar_preferences_get ();
|
|
|
|
/* configure the dialog properties */
|
|
gtk_window_set_icon_name (GTK_WINDOW (dialog), "org.xfce.thunar");
|
|
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
|
|
gtk_window_set_title (GTK_WINDOW (dialog), _("Thunar Preferences"));
|
|
|
|
#if !LIBXFCE4UI_CHECK_VERSION(4, 19, 3)
|
|
xfce_titled_dialog_create_action_area (XFCE_TITLED_DIALOG (dialog));
|
|
#endif
|
|
|
|
/* add the "Close" button */
|
|
button = gtk_button_new_with_mnemonic (_("_Close"));
|
|
image = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_BUTTON);
|
|
gtk_button_set_image (GTK_BUTTON (button), image);
|
|
xfce_titled_dialog_add_action_widget (XFCE_TITLED_DIALOG (dialog), button, GTK_RESPONSE_CLOSE);
|
|
|
|
gtk_widget_show (button);
|
|
|
|
/* add the "Help" button */
|
|
button = gtk_button_new_with_mnemonic (_("_Help"));
|
|
image = gtk_image_new_from_icon_name ("help-browser", GTK_ICON_SIZE_BUTTON);
|
|
gtk_button_set_image (GTK_BUTTON (button), image);
|
|
xfce_titled_dialog_add_action_widget (XFCE_TITLED_DIALOG (dialog), button, GTK_RESPONSE_HELP);
|
|
gtk_widget_show (button);
|
|
|
|
notebook = gtk_notebook_new ();
|
|
gtk_container_set_border_width (GTK_CONTAINER (notebook), 6);
|
|
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), notebook, TRUE, TRUE, 0);
|
|
gtk_widget_show (notebook);
|
|
|
|
|
|
/*
|
|
Display
|
|
*/
|
|
label = gtk_label_new (_("Display"));
|
|
vbox = g_object_new (GTK_TYPE_BOX, "orientation", GTK_ORIENTATION_VERTICAL, "border-width", 12, "spacing", 18, 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 (_("Window Settings"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
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);
|
|
|
|
row = 0;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Use custom window decorations (only applied to new windows)"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-use-csd",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button,
|
|
_("Use custom, client-side window decorations instead of global, server-side ones. - Only applied to new Thunar windows"));
|
|
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Use current folder icon as window icon"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-change-window-icon",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to use the current folder icon as window icon"));
|
|
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
label = gtk_label_new (_("View Settings"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("View _new folders using:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Icon View"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("List View"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Compact View"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Last Active View"));
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences), "default-view",
|
|
G_OBJECT (combo), "active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_view_string_to_index,
|
|
transform_view_index_to_string,
|
|
NULL, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("_Remember view settings for each folder"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-directory-specific-settings",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button,
|
|
_("Select this option to remember view type, zoom level, sort column, and sort order individually for each folder"));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
if (!thunar_g_vfs_metadata_is_supported ())
|
|
{
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
|
|
gtk_widget_set_sensitive (button, FALSE);
|
|
gtk_widget_set_tooltip_text (button, _("gvfs metadata support is required"));
|
|
}
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Sort _folders before files"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-folders-first",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to list folders before files when you sort a folder."));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Show file size in binary format"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-file-size-binary",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to show file size in binary format instead of decimal."));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
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 (_("Thumbnails"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Show thumbnails:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Never"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Local Files Only"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Always"));
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences),
|
|
"misc-thumbnail-mode",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_enum_value_to_index,
|
|
transform_index_to_enum_value,
|
|
(gpointer) thunar_thumbnail_mode_get_type, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Only show thumbnails for files smaller than:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "524288", _("512KiB"));
|
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "1048576", _("1MiB"));
|
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "10485760", _("10MiB"));
|
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "104857600", _("100MiB"));
|
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "1073741824", _("1GiB"));
|
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "10737418240", _("10GiB"));
|
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "0", _("Unlimited"));
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences),
|
|
"misc-thumbnail-max-file-size",
|
|
G_OBJECT (combo),
|
|
"active-id",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_uint64_to_string,
|
|
transform_string_to_uint64,
|
|
NULL, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Draw frames around thumbnails"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-thumbnail-draw-frames",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to draw black frames around thumbnails."));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
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 (_("Icon View"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("_Text beside icons"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-text-beside-icons",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to place the icon captions for items "
|
|
"beside the icon rather than below the icon."));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
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 (_("Date"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("_Format:"));
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
for (date_style = THUNAR_DATE_STYLE_SIMPLE; date_style <= THUNAR_DATE_STYLE_DDMMYYYY; ++date_style)
|
|
{
|
|
date = thunar_util_humanize_file_time (time (NULL), date_style, NULL);
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), date);
|
|
g_free (date);
|
|
}
|
|
|
|
/* TRANSLATORS: custom date format */
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Custom"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Today / Custom"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-date-style",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
entry = gtk_entry_new ();
|
|
/* TRANSLATORS: Please do not translate the first column (specifiers), 'strftime' and of course '\n' */
|
|
gtk_widget_set_tooltip_text (entry, _("Custom date format to apply.\n\n"
|
|
"The most common specifiers are:\n"
|
|
"%d day of month\n"
|
|
"%m month\n"
|
|
"%Y year including century\n"
|
|
"%H hour\n"
|
|
"%M minute\n"
|
|
"%S second\n\n"
|
|
"For a complete list, search 'Glib.DateTime.format'."));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-date-custom-style",
|
|
G_OBJECT (entry),
|
|
"text",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK (on_date_format_changed), entry);
|
|
gtk_grid_attach (GTK_GRID (grid), entry, 1, row, 1, 1);
|
|
if (gtk_combo_box_get_active (GTK_COMBO_BOX (combo)) == THUNAR_DATE_STYLE_CUSTOM || gtk_combo_box_get_active (GTK_COMBO_BOX (combo)) == THUNAR_DATE_STYLE_CUSTOM_SIMPLE)
|
|
gtk_widget_set_visible (entry, TRUE);
|
|
|
|
/*
|
|
Side Pane
|
|
*/
|
|
label = gtk_label_new (_("Side Pane"));
|
|
vbox = g_object_new (GTK_TYPE_BOX, "orientation", GTK_ORIENTATION_VERTICAL, "border-width", 12, "spacing", 18, 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 (_("Shortcuts Pane"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("_Icon Size:"));
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("16px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("24px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("32px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("48px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("64px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("96px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("128px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("160px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("192px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("256px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("512px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("1024px"));
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences),
|
|
"shortcuts-icon-size",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_icon_size_to_index,
|
|
transform_index_to_icon_size,
|
|
NULL, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Show Icon _Emblems"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"shortcuts-icon-emblems",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to display icon emblems in the shortcuts pane for all folders "
|
|
"for which emblems have been defined in the folders properties dialog."));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 2, 1);
|
|
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 (_("Tree Pane"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Icon _Size:"));
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("16px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("24px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("32px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("48px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("64px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("96px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("128px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("160px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("192px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("256px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("512px"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("1024px"));
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences),
|
|
"tree-icon-size",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_icon_size_to_index,
|
|
transform_index_to_icon_size,
|
|
NULL, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Show Icon E_mblems"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"tree-icon-emblems",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to display icon emblems in the tree pane for all folders "
|
|
"for which emblems have been defined in the folders properties dialog."));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 2, 1);
|
|
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 (_("Icon Style"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Use symbolic folder icons"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-symbolic-icons-in-sidepane",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to use symbolic folder icons instead of regular ones."));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 2, 1);
|
|
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 (_("Image Preview"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Image Preview Mode:"));
|
|
gtk_widget_set_tooltip_text (label, _(
|
|
"- Standalone: Image Preview uses a separate pane\n"
|
|
"- Embedded: Image Preview is embedded in the left sidepane\n"
|
|
));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
type = g_type_class_ref (THUNAR_TYPE_IMAGE_PREVIEW_MODE);
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(g_enum_get_value (type, THUNAR_IMAGE_PREVIEW_MODE_STANDALONE)->value_nick));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(g_enum_get_value (type, THUNAR_IMAGE_PREVIEW_MODE_EMBEDDED)->value_nick));
|
|
g_type_class_unref (type);
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences),
|
|
"misc-image-preview-mode",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_enum_value_to_index,
|
|
transform_index_to_enum_value,
|
|
(gpointer) thunar_verify_file_get_type, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
|
|
/*
|
|
Behavior
|
|
*/
|
|
label = gtk_label_new (_("Behavior"));
|
|
vbox = g_object_new (GTK_TYPE_BOX, "orientation", GTK_ORIENTATION_VERTICAL, "border-width", 12, "spacing", 18, 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 (_("Navigation"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
button = gtk_radio_button_new_with_mnemonic (NULL, _("_Single click to activate items"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-single-click",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (g_object_notify), "active");
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
ibox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
|
gtk_widget_set_hexpand (ibox, TRUE);
|
|
gtk_widget_set_margin_start (ibox, 12);
|
|
gtk_widget_set_margin_bottom (ibox, 6);
|
|
g_object_bind_property (G_OBJECT (button), "active",
|
|
G_OBJECT (ibox), "sensitive",
|
|
G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_hexpand (ibox, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), ibox, 0, row, 1, 1);
|
|
gtk_widget_show (ibox);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Specify the d_elay before an item gets selected\n"
|
|
"when the mouse pointer is paused over it:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_label_set_yalign (GTK_LABEL (label), 0.0f);
|
|
gtk_box_pack_start (GTK_BOX (ibox), label, FALSE, FALSE, 0);
|
|
gtk_widget_show (label);
|
|
|
|
range = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0.0, 2000.0, 100.0);
|
|
gtk_scale_set_draw_value (GTK_SCALE (range), FALSE);
|
|
gtk_widget_set_margin_top (range, 6);
|
|
gtk_scale_add_mark (GTK_SCALE (range), 0.0, GTK_POS_BOTTOM, NULL);
|
|
gtk_scale_add_mark (GTK_SCALE (range), 1000.0, GTK_POS_BOTTOM, NULL);
|
|
gtk_scale_add_mark (GTK_SCALE (range), 2000.0, GTK_POS_BOTTOM, NULL);
|
|
gtk_widget_set_tooltip_text (range, _("When single-click activation is enabled, pausing the mouse pointer over an item "
|
|
"will automatically select that item after the chosen delay. You can disable this "
|
|
"behavior by moving the slider to the left-most position. This behavior may be "
|
|
"useful when single clicks activate items, and you want only to select the item "
|
|
"without activating it."));
|
|
gtk_box_pack_start (GTK_BOX (ibox), range, FALSE, FALSE, 0);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), range);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), range);
|
|
gtk_widget_show (range);
|
|
|
|
/* connect the range's adjustment to the preferences */
|
|
adjustment = gtk_range_get_adjustment (GTK_RANGE (range));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-single-click-timeout",
|
|
G_OBJECT (adjustment),
|
|
"value",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
|
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
|
gtk_box_pack_start (GTK_BOX (ibox), hbox, FALSE, FALSE, 0);
|
|
gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
|
|
gtk_widget_show (hbox);
|
|
|
|
label = gtk_label_new (_("Disabled"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_small_italic ());
|
|
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new (_("Medium"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_small_italic ());
|
|
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new (_("Long"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 1.0f);
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_small_italic ());
|
|
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
|
|
gtk_widget_show (label);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (button), _("_Double click to activate items"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-single-click",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_INVERT_BOOLEAN | G_BINDING_SYNC_CREATE);
|
|
g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (g_object_notify), "active");
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
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 (_("Tabs and Windows"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Open folders in new tabs on middle click"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-middle-click-in-tab",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to open a new tab on middle click instead of a new window"));
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Open new thunar instances as tabs"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-open-new-window-as-tab",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to open new thunar instances as tabs in an existing thunar window"));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Show full directory paths in tab titles"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-full-path-in-tab-title",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to show the full directory path in the tab title instead of only the directory name"));
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Restore tabs on startup"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"last-restore-tabs",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to restore your tabs as they were last time you used Thunar"));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
if (thunar_g_vfs_is_uri_scheme_supported ("trash"))
|
|
{
|
|
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 (_("Context Menu"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("Show action to permanently delete files and folders"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-show-delete-action",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_tooltip_text (button, _("Select this option to show the 'Delete' action in the context menu"));
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
}
|
|
|
|
/*
|
|
Advanced
|
|
*/
|
|
|
|
label = gtk_label_new (_("Advanced"));
|
|
vbox = g_object_new (GTK_TYPE_BOX, "orientation", GTK_ORIENTATION_VERTICAL, "border-width", 12, "spacing", 18, 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 (_("File Transfer"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Transfer files in parallel:"));
|
|
gtk_widget_set_tooltip_text (label, _(
|
|
"Indicates the behavior during multiple copies:\n"
|
|
"- Always: all copies are done simultaneously\n"
|
|
"- Local Files Only: simultaneous copies for local (not remote, not attached) files\n"
|
|
"- Local Files Only (Same Devices): if all files are local but on different devices (disks, mount points), copies will be sequential\n"
|
|
"- Local Files Only (Idle Devices): if all files are local but on busy devices (disks, mount points), copies will be sequential\n"
|
|
"- Never: all copies are done sequentially"
|
|
));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Always"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Local Files Only"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Local Files Only (Same Devices)"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Local Files Only (Idle Devices)"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Never"));
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences),
|
|
"misc-parallel-copy-mode",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_enum_value_to_index,
|
|
transform_index_to_enum_value,
|
|
(gpointer) thunar_parallel_copy_mode_get_type, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Use intermediate file on copy:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
gtk_widget_set_tooltip_text (label, _("Use intermediate file '*.partial~' to copy files. "
|
|
"This will prevent fragmented files. "
|
|
"The new file will only be shown after the copy was successfully finished."));
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
type = g_type_class_ref (THUNAR_TYPE_USE_PARTIAL_MODE);
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(g_enum_get_value (type, THUNAR_USE_PARTIAL_MODE_DISABLED)->value_nick));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(g_enum_get_value (type, THUNAR_USE_PARTIAL_MODE_REMOTE_ONLY)->value_nick));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(g_enum_get_value (type, THUNAR_USE_PARTIAL_MODE_ALWAYS)->value_nick));
|
|
g_type_class_unref (type);
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences),
|
|
"misc-transfer-use-partial",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_enum_value_to_index,
|
|
transform_index_to_enum_value,
|
|
(gpointer) thunar_use_partial_get_type, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Verify file contents on copy:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
gtk_widget_set_tooltip_text (label, _("Compare contents of original file and copy in order to detect corruption. "
|
|
"While this will attempt to compare the actual contents that are on the "
|
|
"destination media, Thunar may be unable to bypass filesystem caches, so "
|
|
"this comparison may not detect all instances of corruption. "
|
|
"Enabling this option will increase copy time."));
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
type = g_type_class_ref (THUNAR_TYPE_VERIFY_FILE_MODE);
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(g_enum_get_value (type, THUNAR_VERIFY_FILE_MODE_DISABLED)->value_nick));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(g_enum_get_value (type, THUNAR_VERIFY_FILE_MODE_REMOTE_ONLY)->value_nick));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(g_enum_get_value (type, THUNAR_VERIFY_FILE_MODE_ALWAYS)->value_nick));
|
|
g_type_class_unref (type);
|
|
g_object_bind_property_full (G_OBJECT (dialog->preferences),
|
|
"misc-transfer-verify-file",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
|
|
transform_enum_value_to_index,
|
|
transform_index_to_enum_value,
|
|
(gpointer) thunar_verify_file_get_type, NULL);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
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 (_("Search"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Include subfolders:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Always"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Local Files Only"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Never"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-recursive-search",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 1, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
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 (_("Folder Permissions"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("When changing the permissions of a folder, you\n"
|
|
"can also apply the changes to the contents of the\n"
|
|
"folder. Select the default behavior below:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_label_set_yalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Ask every time"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Apply to Folder and Contents"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Apply to Folder Only"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-recursive-permissions",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), combo, 0, row, 1, 1);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
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 (_("Security"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
|
|
gtk_widget_show (grid);
|
|
|
|
label = gtk_label_new_with_mnemonic (_("Execute shell scripts:"));
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
|
gtk_grid_attach (GTK_GRID (grid), hbox, 1, row, 1, 1);
|
|
gtk_widget_show (hbox);
|
|
|
|
combo = gtk_combo_box_text_new ();
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Never"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Always"));
|
|
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _("Ask every time"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-exec-shell-scripts-by-default",
|
|
G_OBJECT (combo),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_hexpand (combo, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, TRUE, 0);
|
|
thunar_gtk_label_set_a11y_relation (GTK_LABEL (label), combo);
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
|
|
gtk_widget_show (combo);
|
|
|
|
image = gtk_image_new_from_icon_name ("dialog-warning", GTK_ICON_SIZE_MENU);
|
|
gtk_widget_set_tooltip_text (image, _("Allowing untrusted programs to run presents a security risk to your system."));
|
|
gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
|
|
gtk_widget_show (image);
|
|
|
|
g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK (on_execute_shell_scripts_changed), image);
|
|
|
|
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 (_("Volume Management"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
/* new grid */
|
|
row = 0;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
|
gtk_widget_set_margin_top (GTK_WIDGET (grid), 6);
|
|
gtk_widget_set_margin_start (GTK_WIDGET (grid), 12);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
|
|
/* add check button to enable/disable auto mounting */
|
|
button = gtk_check_button_new_with_mnemonic (_("Enable _Volume Management"));
|
|
g_object_bind_property (G_OBJECT (dialog->preferences),
|
|
"misc-volume-management",
|
|
G_OBJECT (button),
|
|
"active",
|
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
|
gtk_widget_set_hexpand (button, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), button, 0, row, 1, 1);
|
|
gtk_widget_show (button);
|
|
|
|
/* next row */
|
|
row++;
|
|
|
|
label = gtk_label_new (NULL);
|
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0f);
|
|
g_object_bind_property (G_OBJECT (button), "active",
|
|
G_OBJECT (label), "sensitive",
|
|
G_BINDING_SYNC_CREATE);
|
|
g_signal_connect_swapped (G_OBJECT (label), "activate-link", G_CALLBACK (thunar_preferences_dialog_configure), dialog);
|
|
gtk_label_set_markup (GTK_LABEL (label), _("<a href=\"volman-config:\">Configure</a> the management of removable drives,\n"
|
|
"devices and media."));
|
|
gtk_widget_set_hexpand (label, TRUE);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, row, 1, 1);
|
|
gtk_widget_show (label);
|
|
|
|
/* check the most important gvfs-backends, and inform if they are missing */
|
|
if (!thunar_g_vfs_is_uri_scheme_supported ("trash") || !thunar_g_vfs_is_uri_scheme_supported ("computer") || /* support for removable media */
|
|
!thunar_g_vfs_is_uri_scheme_supported ("sftp"))
|
|
{
|
|
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 (_("Missing dependencies"));
|
|
gtk_label_set_attributes (GTK_LABEL (label), thunar_pango_attr_list_bold ());
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
|
gtk_widget_show (label);
|
|
|
|
infobar = gtk_info_bar_new ();
|
|
gtk_container_set_border_width (GTK_CONTAINER (infobar), 12);
|
|
label = gtk_label_new (NULL);
|
|
gtk_label_set_markup (GTK_LABEL (label), _("It looks like <a href=\"https://wiki.gnome.org/Projects/gvfs\">gvfs</a> is not available.\n"
|
|
"Important features including trash support,\n"
|
|
"removable media and remote location browsing\n"
|
|
"will not work. <a href=\"https://docs.xfce.org/xfce/thunar/unix-filesystem#gnome_virtual_file_system\">[Read more]</a>"));
|
|
vbox = gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar));
|
|
gtk_container_add (GTK_CONTAINER (vbox), label);
|
|
gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_WARNING);
|
|
gtk_widget_show (label);
|
|
gtk_widget_show (infobar);
|
|
gtk_container_add (GTK_CONTAINER (frame), infobar);
|
|
}
|
|
|
|
/*
|
|
Shortcuts
|
|
*/
|
|
label = gtk_label_new (_("Shortcuts"));
|
|
vbox = g_object_new (GTK_TYPE_BOX, "orientation", GTK_ORIENTATION_VERTICAL, "border-width", 12, "spacing", 18, 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_IN, NULL);
|
|
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
|
|
gtk_widget_show (frame);
|
|
|
|
grid = xfce_shortcuts_editor_new (13,
|
|
_("Window"), thunar_window_get_action_entries (), (size_t) THUNAR_WINDOW_N_ACTIONS,
|
|
_("View"), thunar_standard_view_get_action_entries (), (size_t) THUNAR_STANDARD_VIEW_N_ACTIONS,
|
|
_("Launcher"), thunar_action_manager_get_action_entries (), (size_t) THUNAR_ACTION_MANAGER_N_ACTIONS,
|
|
_("Status Bar"), thunar_statusbar_get_action_entries (), (size_t) THUNAR_STATUS_BAR_N_ACTIONS);
|
|
gtk_container_add (GTK_CONTAINER (frame), grid);
|
|
gtk_widget_show (grid);
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
thunar_preferences_dialog_finalize (GObject *object)
|
|
{
|
|
ThunarPreferencesDialog *dialog = THUNAR_PREFERENCES_DIALOG (object);
|
|
|
|
/* release our reference on the preferences */
|
|
g_object_unref (G_OBJECT (dialog->preferences));
|
|
|
|
(*G_OBJECT_CLASS (thunar_preferences_dialog_parent_class)->finalize) (object);
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
thunar_preferences_dialog_response (GtkDialog *dialog,
|
|
gint response)
|
|
{
|
|
if (G_UNLIKELY (response == GTK_RESPONSE_HELP))
|
|
{
|
|
/* open the preferences section of the user manual */
|
|
xfce_dialog_show_help (GTK_WINDOW (dialog), "thunar",
|
|
"preferences", NULL);
|
|
}
|
|
else
|
|
{
|
|
/* close the preferences dialog */
|
|
gtk_widget_destroy (GTK_WIDGET (dialog));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
thunar_preferences_dialog_configure (ThunarPreferencesDialog *dialog)
|
|
{
|
|
GError *err = NULL;
|
|
gchar *argv[3];
|
|
GdkScreen *screen;
|
|
char *display = NULL;
|
|
|
|
_thunar_return_if_fail (THUNAR_IS_PREFERENCES_DIALOG (dialog));
|
|
|
|
/* prepare the argument vector */
|
|
argv[0] = (gchar *) "thunar-volman";
|
|
argv[1] = (gchar *) "--configure";
|
|
argv[2] = NULL;
|
|
|
|
screen = gtk_widget_get_screen (GTK_WIDGET (dialog));
|
|
|
|
if (screen != NULL)
|
|
display = g_strdup (gdk_display_get_name (gdk_screen_get_display (screen)));
|
|
|
|
/* invoke the configuration interface of thunar-volman */
|
|
if (!g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, thunar_setup_display_cb, display, NULL, &err))
|
|
{
|
|
/* tell the user that we failed to come up with the thunar-volman configuration dialog */
|
|
thunar_dialogs_show_error (dialog, err, _("Failed to display the volume management settings"));
|
|
g_error_free (err);
|
|
}
|
|
|
|
g_free (display);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* thunar_preferences_dialog_new:
|
|
* @parent : a #GtkWindow or %NULL.
|
|
*
|
|
* Allocates a new #ThunarPreferencesDialog widget.
|
|
*
|
|
* Return value: the newly allocated #ThunarPreferencesDialog.
|
|
**/
|
|
GtkWidget *
|
|
thunar_preferences_dialog_new (GtkWindow *parent)
|
|
{
|
|
GtkWidget *dialog;
|
|
gint root_x, root_y;
|
|
gint window_width, window_height;
|
|
gint dialog_width, dialog_height;
|
|
GdkMonitor *monitor;
|
|
GdkRectangle geometry;
|
|
GdkScreen *screen;
|
|
|
|
dialog = g_object_new (THUNAR_TYPE_PREFERENCES_DIALOG, NULL);
|
|
|
|
/* fake gtk_window_set_transient_for() for centering the window on
|
|
* the parent window. See bug #3586. */
|
|
if (G_LIKELY (parent != NULL))
|
|
{
|
|
screen = gtk_window_get_screen (parent);
|
|
gtk_window_set_screen (GTK_WINDOW (dialog), screen);
|
|
gtk_widget_realize (dialog);
|
|
|
|
/* get the size and position on the windows */
|
|
gtk_window_get_position (parent, &root_x, &root_y);
|
|
gtk_window_get_size (parent, &window_width, &window_height);
|
|
gtk_window_get_size (GTK_WINDOW (dialog), &dialog_width, &dialog_height);
|
|
|
|
/* get the monitor geometry of the monitor with the parent window */
|
|
monitor = gdk_display_get_monitor_at_point (gdk_display_get_default (), root_x, root_y);
|
|
gdk_monitor_get_geometry (monitor, &geometry);
|
|
|
|
/* center the dialog on the window and clamp on the monitor */
|
|
root_x += (window_width - dialog_width) / 2;
|
|
root_x = CLAMP (root_x, geometry.x, geometry.x + geometry.width - dialog_width);
|
|
root_y += (window_height - dialog_height) / 2;
|
|
root_y = CLAMP (root_y, geometry.y, geometry.y + geometry.height - dialog_height);
|
|
|
|
/* move the dialog */
|
|
gtk_window_move (GTK_WINDOW (dialog), root_x, root_y);
|
|
}
|
|
|
|
return dialog;
|
|
}
|