18556N/A@@ -232,6 +232,52 @@ if test "x$enable_packagekit" != "xno";
18556N/A AC_DEFINE(ENABLE_PACKAGEKIT, 1, [define to enable PackageKit mimetype installer])
18556N/A+dnl ==========================================================================
18556N/A+AC_CHECK_LIB(zfs, zfs_iter_root,
18556N/A+ [AC_DEFINE(HAVE_ZFS, 1, [Define to 1 if ZFS is available])
18556N/A+dnl ==========================================================================
18556N/A+AC_CHECK_LIB(scf, scf_handle_bind,
18556N/A+ [AC_DEFINE(HAVE_SCF, 1, [Define to 1 if SCF is available])
18556N/A+dnl ==========================================================================
18556N/A+AC_CHECK_LIB(nvpair, nvpair_value_match,
18556N/A+ [AC_DEFINE(NVPAIR_LIBS, 1, [Define to 1 if nvpair is available])
18556N/A dnl ==========================================================================
18556N/A@@ -32,6 +32,9 @@ libnautilus_private_la_LIBADD = \
18556N/A@@ -201,6 +204,8 @@ libnautilus_private_la_SOURCES = \
18556N/A $(lib_LTLIBRARIES): $(dependency_static_libs)
18556N/A+ <short>Enables the visualization of the ZFS snaphots timeline</short>
18556N/A+ If set to true, the visualization of the ZFS snapshots timeline is enabled
18556N/A@@ -130,6 +130,15 @@ get_builtin_columns (void)
18556N/A /* TODO: Change after string freeze over */
18556N/A+ columns = g_list_append (columns,
18556N/A+ g_object_new (NAUTILUS_TYPE_COLUMN,
18556N/A+ "label", _("Restore information"),
18556N/A+ "description", _("Restore information of the file."),
18556N/A@@ -658,6 +658,7 @@ remove_monitor_link (NautilusDirectory *
18556N/A remove_monitor (NautilusDirectory *directory,
18556N/A@@ -722,6 +723,10 @@ nautilus_directory_set_up_request (Nauti
18556N/A REQUEST_SET_TYPE (request, REQUEST_FILESYSTEM_INFO);
18556N/A+ if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO) {
18556N/A+ REQUEST_SET_TYPE (request, REQUEST_RESTORE_INFO);
18556N/A@@ -4759,6 +4764,18 @@ cancel_link_info_for_file (NautilusDirec
18556N/A+void nautilus_directory_cancel_restore_info (NautilusDirectory *directory)
18556N/A+ if (NAUTILUS_IS_DIRECTORY (directory))
18556N/A+ if (directory->details->restore_cancel)
18556N/A+ g_cancellable_cancel (directory->details->restore_cancel);
18556N/A+ directory->details->restore_cancel = NULL;
18556N/A cancel_loading_attributes (NautilusDirectory *directory,
18556N/A@@ -4801,7 +4818,9 @@ cancel_loading_attributes (NautilusDirec
18556N/A if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) {
18556N/A+ if (REQUEST_WANTS_TYPE (request, REQUEST_RESTORE_INFO)) {
18556N/A+ nautilus_directory_cancel_restore_info (directory);
18556N/A nautilus_directory_async_state_changed (directory);
18556N/A@@ -4843,7 +4862,9 @@ nautilus_directory_cancel_loading_file_a
18556N/A if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) {
18556N/A cancel_mount_for_file (directory, file);
18556N/A+ if (REQUEST_WANTS_TYPE (request, REQUEST_RESTORE_INFO)) {
18556N/A+ nautilus_directory_cancel_restore_info (directory);
18556N/A nautilus_directory_async_state_changed (directory);
18556N/A@@ -58,6 +58,7 @@ typedef enum {
18556N/A@@ -140,6 +141,9 @@ struct NautilusDirectoryDetails
18556N/A guint64 free_space; /* (guint)-1 for unknown */
18556N/A time_t free_space_read; /* The time free_space was updated, or 0 for never */
18556N/A NautilusDirectory *nautilus_directory_get_existing (GFile *location);
18556N/A@@ -130,6 +131,8 @@ nautilus_directory_init (gpointer object
18556N/A directory->details->low_priority_queue = nautilus_file_queue_new ();
18556N/A directory->details->extension_queue = nautilus_file_queue_new ();
18556N/A directory->details->free_space = (guint64)-1;
18556N/A+ directory->details->zfs_snapshots = NULL;
18556N/A+ directory->details->restore_cancel = NULL;
18556N/A nautilus_directory_finalize (GObject *object)
18556N/A directory = NAUTILUS_DIRECTORY (object);
18556N/A g_hash_table_remove (directories, directory->details->location);
18556N/A@@ -197,7 +200,13 @@ nautilus_directory_finalize (GObject *ob
18556N/A if (directory->details->hidden_file_hash) {
18556N/A g_hash_table_destroy (directory->details->hidden_file_hash);
18556N/A+ if (directory->details->zfs_snapshots) {
18556N/A+ ts_free_snapshots (directory->details->zfs_snapshots);
18556N/A+ if (directory->details->restore_cancel)
18556N/A+ g_cancellable_cancel (directory->details->restore_cancel);
18556N/A nautilus_file_queue_destroy (directory->details->high_priority_queue);
18556N/A nautilus_file_queue_destroy (directory->details->low_priority_queue);
18556N/A nautilus_file_queue_destroy (directory->details->extension_queue);
18556N/A@@ -311,11 +320,27 @@ async_data_preference_changed_callback (
18556N/A g_hash_table_foreach (directories, async_state_changed_one, NULL);
18556N/A+static gboolean time_slider_enabled = TRUE;
18556N/A+static void time_slider_pref_changed_callback (gpointer callback_data)
18556N/A+ time_slider_enabled = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER);
18556N/A add_preferences_callbacks (void)
18556N/A nautilus_global_preferences_init ();
18556N/A+ time_slider_enabled = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER);
18556N/A eel_preferences_add_callback (NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES,
18556N/A@@ -332,6 +357,9 @@ add_preferences_callbacks (void)
18556N/A eel_preferences_add_callback (NAUTILUS_PREFERENCES_DATE_FORMAT,
18556N/A async_data_preference_changed_callback,
18556N/A+ eel_preferences_add_callback (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER,
18556N/A+ time_slider_pref_changed_callback,
18556N/A@@ -525,6 +553,7 @@ nautilus_directory_new (GFile *location)
18556N/A uri = g_file_get_uri (location);
18556N/A@@ -536,10 +565,13 @@ nautilus_directory_new (GFile *location)
18556N/A directory = NAUTILUS_DIRECTORY (nautilus_search_directory_new_from_saved_search (uri));
18556N/A directory = NAUTILUS_DIRECTORY (g_object_new (NAUTILUS_TYPE_VFS_DIRECTORY, NULL));
18556N/A+ path = g_file_get_path (location);
18556N/A set_directory_location (directory, location);
18556N/A@@ -558,6 +590,201 @@ nautilus_directory_is_local (NautilusDir
18556N/A g_file_is_native (directory->details->location);
18556N/A+static void snapshot_list_ready_callback (GObject *source_object,
18556N/A+ GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
18556N/A+ QuerySnapshotsAsyncData *data = (QuerySnapshotsAsyncData*) user_data;
18556N/A+ if (!g_cancellable_is_cancelled (data->cancel))
18556N/A+ data->dir->details->zfs_snapshots = g_simple_async_result_get_op_res_gpointer (simple);
18556N/A+ data->callback (data->dir, data->cancel, data->callback_user_data);
18556N/A+nautilus_directory_get_snapshots_async (NautilusDirectory *directory,
18556N/A+ TsReadyCallback ready_callback,
18556N/A+ g_assert (NAUTILUS_IS_DIRECTORY (directory));
18556N/A+ if (directory->details->location == NULL)
18556N/A+ if (directory->details->zfs_snapshots) {
18556N/A+ ts_free_snapshots (directory->details->zfs_snapshots);
18556N/A+ directory->details->zfs_snapshots = NULL;
18556N/A+ if (is_time_slider_enabled ())
18556N/A+ QuerySnapshotsAsyncData *data;
18556N/A+ data = g_new0 (QuerySnapshotsAsyncData,1);
18556N/A+ data->callback = ready_callback;
18556N/A+ data->callback_user_data = callback_user_data;
18556N/A+ ts_get_snapshots_for_dir_async (directory->details->location,
18556N/A+nautilus_directory_has_snapshots (NautilusDirectory *directory)
18556N/A+ g_assert (NAUTILUS_IS_DIRECTORY (directory));
18556N/A+ if (directory->details->zfs_snapshots)
18556N/A+nautilus_directory_get_num_snapshots (NautilusDirectory *directory)
18556N/A+ g_assert (NAUTILUS_IS_DIRECTORY (directory));
18556N/A+ if (directory->details->zfs_snapshots)
18556N/A+ for (tmp = directory->details->zfs_snapshots;tmp;tmp = tmp->next)
18556N/A+nautilus_directory_is_in_snapshot (NautilusDirectory *directory)
18556N/A+ g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE);
18556N/A+ directory_uri = nautilus_directory_get_uri (directory);
18556N/A+ result = ts_is_in_snapshot (directory_uri);
18556N/A+nautilus_directory_get_snapshots (NautilusDirectory *directory)
18556N/A+ g_assert (NAUTILUS_IS_DIRECTORY (directory));
18556N/A+ return directory->details->zfs_snapshots;
18556N/A+void nautilus_directory_remove_snapshot (NautilusDirectory *directory,
18556N/A+ if (directory->details->zfs_snapshots)
18556N/A+ directory->details->zfs_snapshots = g_list_remove (directory->details->zfs_snapshots, snap);
18556N/A+/* return true if snapdir dir path is a dir or subdir of refdir */
18556N/A+nautilus_directory_is_a_snapshot_dir_of (NautilusDirectory *snapdir,
18556N/A+ if (nautilus_directory_is_in_snapshot (snapdir))
18556N/A+ char snapdir_root_real_path [PATH_MAX+1];
18556N/A+ char refdir_real_path [PATH_MAX+1];
18556N/A+ NautilusDirectory *snapdir_root = nautilus_directory_get_snap_root (snapdir);
18556N/A+ GFile *snapdir_root_file = nautilus_directory_get_location (snapdir_root);
18556N/A+ GFile *refdir_file = nautilus_directory_get_location (refdir);
18556N/A+ char* snapdir_root_path = g_file_get_path (snapdir_root_file);
18556N/A+ char* refdir_path = g_file_get_path (refdir_file);
18556N/A+ if (ts_realpath (snapdir_root_path, snapdir_root_real_path) &&
18556N/A+ ts_realpath (refdir_path, refdir_real_path))
18556N/A+ if (g_strrstr (snapdir_root_real_path,refdir_real_path))
18556N/A+ g_object_unref (snapdir_root_file);
18556N/A+ g_object_unref (snapdir_root);
18556N/A+NautilusDirectory *nautilus_directory_get_snap_root (NautilusDirectory *directory)
18556N/A+ char *directory_uri, *snap_root;
18556N/A+ g_assert (NAUTILUS_IS_DIRECTORY (directory));
18556N/A+ directory_uri = nautilus_directory_get_uri (directory);
18556N/A+ if (!nautilus_directory_is_in_snapshot (directory))
18556N/A+ zfs = g_strrstr (directory_uri, ".zfs/snapshot/");
18556N/A+ iter += sizeof (".zfs/snapshot/");
18556N/A+ while (*iter != '/' && *iter != '\0')
18556N/A+ snap_root = g_strdup_printf ("%s%s", directory_uri, iter);
18556N/A+ new_dir = nautilus_directory_get_by_uri (snap_root);
18556N/A nautilus_directory_is_in_trash (NautilusDirectory *directory)
18556N/A /* NautilusDirectory is a class that manages the model for a directory,
18556N/A real or virtual, for Nautilus, mainly the file-manager component. The directory is
18556N/A@@ -219,6 +220,24 @@ gboolean nautilus_directory_ar
18556N/A gboolean nautilus_directory_is_local (NautilusDirectory *directory);
18556N/A gboolean nautilus_directory_is_in_trash (NautilusDirectory *directory);
18556N/A+typedef void (*TsReadyCallback) (NautilusDirectory *directory,
18556N/A+void nautilus_directory_get_snapshots_async (NautilusDirectory *directory,
18556N/A+ TsReadyCallback ready_callback,
18556N/A+gboolean nautilus_directory_has_snapshots (NautilusDirectory *directory);
18556N/A+gboolean nautilus_directory_is_in_snapshot (NautilusDirectory *directory);
18556N/A+int nautilus_directory_get_num_snapshots (NautilusDirectory *directory);
18556N/A+GList * nautilus_directory_get_snapshots (NautilusDirectory *directory);
18556N/A+void nautilus_directory_remove_snapshot (NautilusDirectory *directory,
18556N/A+NautilusDirectory *nautilus_directory_get_snap_root (NautilusDirectory *directory);
18556N/A+gboolean nautilus_directory_is_a_snapshot_dir_of (NautilusDirectory *snapdir,
18556N/A+void nautilus_directory_cancel_restore_info (NautilusDirectory *directory);
18556N/A /* Return false if directory contains anything besides a Nautilus metafile.
18556N/A * Only valid if directory is monitored. Used by the Trash monitor.
18556N/A@@ -239,6 +258,7 @@ GList * nautilus_directory_li
18556N/A gboolean nautilus_directory_is_desktop_directory (NautilusDirectory *directory);
18556N/A gboolean nautilus_directory_is_editable (NautilusDirectory *directory);
18556N/A+gboolean is_time_slider_enabled ();
18556N/A #endif /* NAUTILUS_DIRECTORY_H */
18556N/A@@ -41,6 +41,7 @@ typedef enum {
18556N/A NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL = 1 << 8,
18556N/A NAUTILUS_FILE_ATTRIBUTE_MOUNT = 1 << 9,
18556N/A NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO = 1 << 10,
18556N/A+ NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO = 1 << 12,
18556N/A #endif /* NAUTILUS_FILE_ATTRIBUTES_H */
18556N/A@@ -146,6 +146,15 @@ struct NautilusFileDetails
18556N/A /* Mount for mountpoint or the references GMount for a "mountable" */
18556N/A+ /* time slider file difference information */
18556N/A+ /* snapshot directory for versions */
18556N/A+ GCancellable *has_snapshot_cancel;
18556N/A /* boolean fields: bitfield to save space, since there can be
18556N/A@@ -194,6 +203,13 @@ struct NautilusFileDetails
18556N/A eel_boolean_bit is_thumbnailing : 1;
18556N/A+ eel_boolean_bit restore_info_is_up_to_date : 1;
18556N/A+ eel_boolean_bit restore_info_in_progress : 1;
18556N/A+ eel_boolean_bit has_snap_versions_is_up_to_date : 1;
18556N/A+ eel_boolean_bit has_snap_versions_in_progress : 1;
18556N/A+ eel_boolean_bit has_snap_versions : 1;
18556N/A /* TRUE if the file is open in a spatial window */
18556N/A eel_boolean_bit has_open_window : 1;
18556N/A@@ -141,7 +142,8 @@ static GQuark attribute_name_q,
18556N/A static void nautilus_file_info_iface_init (NautilusFileInfoIface *iface);
18556N/A static char * nautilus_file_get_owner_as_string (NautilusFile *file,
18556N/A@@ -151,6 +153,7 @@ static gboolean update_info_and_name
18556N/A static const char * nautilus_file_peek_display_name (NautilusFile *file);
18556N/A static const char * nautilus_file_peek_display_name_collation_key (NautilusFile *file);
18556N/A+static void invalidate_restore_info (NautilusFile *file);
18556N/A static void file_mount_unmounted (GMount *mount, gpointer data);
18556N/A static void metadata_hash_free (GHashTable *hash);
18556N/A@@ -485,7 +488,14 @@ nautilus_file_clear_info (NautilusFile *
18556N/A eel_ref_str_unref (file->details->filesystem_id);
18556N/A file->details->filesystem_id = NULL;
18556N/A+ g_free (file->details->restore_info);
18556N/A+ file->details->restore_info = NULL;
18556N/A+ invalidate_restore_info (file);
18556N/A+ g_free (file->details->snapshot_directory);
18556N/A+ file->details->snapshot_directory = NULL;
18556N/A+ file->details->has_snap_versions_in_progress = FALSE;
18556N/A+ file->details->has_snap_versions_is_up_to_date = FALSE;
18556N/A+ file->details->has_snap_versions = FALSE;
18556N/A@@ -804,6 +814,10 @@ finalize (GObject *object)
18556N/A g_free (file->details->activation_uri);
18556N/A g_free (file->details->compare_by_emblem_cache);
18556N/A+ g_free (file->details->restore_info);
18556N/A+ if (file->details->snapshot_directory)
18556N/A+ g_free (file->details->snapshot_directory);
18556N/A if (file->details->thumbnail) {
18556N/A g_object_unref (file->details->thumbnail);
18556N/A@@ -4415,6 +4429,74 @@ static const char *CURRENT_WEEK_TIME_FOR
18556N/A+nautilus_date_as_string (time_t time_raw, gboolean use_smallest)
18556N/A+ ttime = localtime (&time_raw);
18556N/A+ if (date_format_pref == NAUTILUS_DATE_FORMAT_LOCALE) {
18556N/A+ return eel_strdup_strftime ("%c", ttime);
18556N/A+ } else if (date_format_pref == NAUTILUS_DATE_FORMAT_ISO) {
18556N/A+ return eel_strdup_strftime ("%Y-%m-%d %H:%M:%S",ttime);
18556N/A+ date = eel_g_date_new_tm (ttime);
18556N/A+ g_date_set_time_t (today, time (NULL));
18556N/A+ /* Overflow results in a large number; fine for our purposes. */
18556N/A+ date_age = (g_date_get_julian (today) -
18556N/A+ /* Format varies depending on how old the date is. This minimizes
18556N/A+ * the length (and thus clutter & complication) of typical dates
18556N/A+ * while providing sufficient detail for recent dates to make
18556N/A+ * them maximally understandable at a glance. Keep all format
18556N/A+ * strings separate rather than combining bits & pieces for
18556N/A+ * internationalization's sake.
18556N/A+ formats = YESTERDAY_TIME_FORMATS;
18556N/A+ formats = CURRENT_WEEK_TIME_FORMATS;
18556N/A+ formats = CURRENT_WEEK_TIME_FORMATS;
18556N/A+ return eel_strdup_strftime (format, ttime);
18556N/A nautilus_file_fit_date_as_string (NautilusFile *file,
18556N/A@@ -6060,7 +6142,9 @@ nautilus_file_get_string_attribute_q (Na
18556N/A if (attribute_q == attribute_free_space_q) {
18556N/A return nautilus_file_get_volume_free_space (file);
18556N/A+ if (attribute_q == attribute_restore_info_q) {
18556N/A+ return nautilus_file_get_restore_info_async (file);
18556N/A if (file->details->pending_extension_attributes) {
18556N/A@@ -7022,6 +7106,616 @@ nautilus_file_get_trash_original_file (N
18556N/A+nautilus_file_is_in_snapshot (NautilusFile *file)
18556N/A+ char *file_uri = nautilus_file_get_uri (file);
18556N/A+ gboolean result = ts_is_in_snapshot (file_uri);
18556N/A+static gboolean nautilus_file_in_snap_exist_in_current (NautilusFile *file, GCancellable *cancel)
18556N/A+ char *file_uri = nautilus_file_get_uri (file);
18556N/A+ char *file_uri_without_snap = NULL;
18556N/A+ if (g_cancellable_is_cancelled (cancel))
18556N/A+ file_uri_without_snap = ts_remove_snapshot_dir (file_uri);
18556N/A+ GFile* root_file = g_file_new_for_uri (file_uri_without_snap);
18556N/A+ char *path = g_file_get_path (root_file);
18556N/A+ result = g_file_test (path, G_FILE_TEST_EXISTS);
18556N/A+ g_free (file_uri_without_snap);
18556N/A+char * nautilus_file_in_snapshot_get_info (NautilusFile *file, GCancellable *cancel)
18556N/A+ GFile *then_gfile = nautilus_file_get_location (file);
18556N/A+ char *then_path = g_file_get_path (then_gfile);
18556N/A+ if (g_cancellable_is_cancelled (cancel))
18556N/A+ return g_strdup ("cancelled");
18556N/A+ char *now_path = ts_remove_snapshot_dir (then_path);
18556N/A+ if (lstat64 (now_path, &now) == 0)
18556N/A+ if (lstat64 (then_path, &then) == 0)
18556N/A+ info = g_strdup (_("different date, same size as latest version"));
18556N/A+ info = g_strdup (_("different date, smaller than latest version"));
18556N/A+ info = g_strdup (_("different date, bigger than latest version"));
18556N/A+ info = g_strdup (_("identical to latest version"));
18556N/A+ info = g_strdup_printf ("FIXME no then %s", then_path);
18556N/A+ info = g_strdup (_("not present in latest version"));
18556N/A+static char * restore_string (char *str, GCancellable *cancel)
18556N/A+ if (g_cancellable_is_cancelled (cancel))
18556N/A+ return g_strdup (_("unknown"));
18556N/A+nautilus_file_get_num_snapshot_version (NautilusFile *file,
18556N/A+ NautilusDirectory *dir = NULL;
18556N/A+ parent = nautilus_file_get_parent (file);
18556N/A+ dir = nautilus_directory_get_for_file (parent);
18556N/A+ char *name = nautilus_file_get_name (file);
18556N/A+ tmp = nautilus_directory_get_snapshots (dir);
18556N/A+ GFile *now_gfile = nautilus_file_get_location (file);
18556N/A+ char *now_path = g_file_get_path (now_gfile);
18556N/A+ if (lstat64 (now_path, &now) != 0)
18556N/A+ /* get list of mtime for all files in snapshots */
18556N/A+ now_time = g_new0 (time_t, 1);
18556N/A+ time = g_list_prepend (time, now_time);
18556N/A+ for (tmp; tmp; tmp = tmp->next)
18556N/A+ g_sprintf (snap_name, "%s/%s",
18556N/A+ ((ZfsDataSet *) tmp->data)->mountpoint,
18556N/A+ if (g_cancellable_is_cancelled (cancel))
18556N/A+ if (lstat64 (snap_name, &then) == 0)
18556N/A+ { /*insert in list only is unique */
18556N/A+ time_t* snap_time = g_new0 (time_t, 1);
18556N/A+ time = g_list_prepend (time, snap_time);
18556N/A+ snapdir = g_strdup (((ZfsDataSet *) tmp->data)->mountpoint);
18556N/A+ for (tmp = time; tmp; tmp = tmp->next)
18556N/A+ return restore_string (g_strdup_printf (_("no other version")), cancel);
18556N/A+ return restore_string (g_strdup_printf ("%d %s", version,
18556N/A+ version > 1 ? _("other versions") : /* SUN_BRANDING */ _("other version")),
18556N/A+static gboolean worker_thread_started = FALSE;
18556N/A+typedef void (*ReadyCallback) (gpointer data,
18556N/A+typedef void (*WorkerFunction) (gpointer data,
18556N/A+nautilus_file_get_restore_info (gpointer data,
18556N/A+ QueryData *qdata = (QueryData*) data;
18556N/A+ NautilusFile *file = NAUTILUS_FILE (qdata->data);
18556N/A+ GFile *f = nautilus_file_get_location (file);
18556N/A+ char *path = g_file_get_uri (f);
18556N/A+ printf ("start restore info for %s", path);
18556N/A+ if (!g_cancellable_is_cancelled (cancellable))
18556N/A+ if (nautilus_file_is_directory (file))
18556N/A+ NautilusDirectory *dir = nautilus_directory_get_for_file (file);
18556N/A+ if (nautilus_directory_is_in_snapshot (dir))
18556N/A+ if (!nautilus_file_in_snap_exist_in_current (file, cancellable))
18556N/A+ result = g_strdup (_("not present in latest version"));
18556N/A+ result = g_strdup (_("present in latest version"));
18556N/A+ int version = nautilus_directory_get_num_snapshots (dir);
18556N/A+ result = g_strdup (_("no version"));
18556N/A+ result = g_strdup_printf ("%d %s",version,
18556N/A+ version > 1 ? _("versions") : /* SUN_BRANDING */ _("version"));
18556N/A+ if (nautilus_file_is_in_snapshot (file))
18556N/A+ result = nautilus_file_in_snapshot_get_info (file, cancellable);
18556N/A+ result = nautilus_file_get_num_snapshot_version (file, cancellable, FALSE);
18556N/A+ qdata->return_data = restore_string (result, cancellable);
18556N/A+static void restore_information_ready_callback (gpointer data,
18556N/A+ QueryData *qdata = (QueryData*) data;
18556N/A+ NautilusFile *file = (NautilusFile*) qdata->data;
18556N/A+ char *return_data = qdata->return_data;
18556N/A+ file->details->restore_info_in_progress = FALSE;
18556N/A+ if (g_cancellable_is_cancelled (cancellable))
18556N/A+ file->details->restore_info = g_strdup (_("unknown"));
18556N/A+ invalidate_restore_info (file);
18556N/A+ file->details->restore_info_is_up_to_date = TRUE;
18556N/A+ file->details->restore_info = return_data;
18556N/A+complete_in_idle_cb (gpointer data)
18556N/A+ QueryData *qdata = (QueryData*)data;
18556N/A+ qdata->ready_callback (data, qdata->cancellable);
18556N/A+worker_queue_finished_callback (GObject *source_object,
18556N/A+ GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
18556N/A+ GCancellable *cancel = (GCancellable*) user_data;
18556N/A+ worker_thread_started = FALSE;
18556N/A+ if (g_cancellable_is_cancelled (cancel))
18556N/A+ g_simple_async_result_get_op_res_gpointer (simple);
18556N/A+worker_queue_func (GSimpleAsyncResult *res,
18556N/A+ GAsyncQueue *queue = (GAsyncQueue*) g_simple_async_result_get_op_res_gpointer (res);
18556N/A+ g_get_current_time (&timeout);
18556N/A+ g_time_val_add (&timeout, 3000000);
18556N/A+ data = g_async_queue_timed_pop (queue, &timeout);
18556N/A+ /* only call the worker fct if not cancel
18556N/A+ * but execute ready function anyway */
18556N/A+ if (!g_cancellable_is_cancelled (data->cancellable))
18556N/A+ data->worker_func (data, data->cancellable);
18556N/A+ source = g_idle_source_new ();
18556N/A+ g_source_set_priority (source, G_PRIORITY_DEFAULT);
18556N/A+ g_source_set_callback (source, complete_in_idle_cb, data, NULL);
18556N/A+ g_source_attach (source, NULL);
18556N/A+ g_get_current_time (&timeout);
18556N/A+ g_time_val_add (&timeout, 3000000);
18556N/A+ data = g_async_queue_timed_pop (queue, &timeout);
18556N/A+char * nautilus_file_get_restore_info_async (NautilusFile *file)
18556N/A+ if (!is_time_slider_enabled ())
18556N/A+ if (!ts_is_restore_column_enabled ())
18556N/A+ if (file->details->restore_info_is_up_to_date)
18556N/A+ /*if ( file->details->restore_info == NULL)
18556N/A+ return g_strdup ("null cached info");*/
18556N/A+ return g_strdup (file->details->restore_info);
18556N/A+ if (file->details->restore_info_in_progress)
18556N/A+ static GAsyncQueue *queue = NULL;
18556N/A+ if (!file->details->directory)
18556N/A+ return g_strdup ("no directory element\n");
18556N/A+ if (!nautilus_directory_has_snapshots (file->details->directory) && !nautilus_file_is_in_snapshot (file))
18556N/A+ return g_strdup ("doesn't have snap nor is in snap\n");
18556N/A+ if (!file->details->directory->details->restore_cancel)
18556N/A+ file->details->directory->details->restore_cancel = g_cancellable_new ();
18556N/A+ if (g_cancellable_is_cancelled (file->details->directory->details->restore_cancel))
18556N/A+ g_free (file->details->restore_info);
18556N/A+ file->details->restore_info = NULL;
18556N/A+ file->details->restore_info_in_progress = TRUE;
18556N/A+ data->cancellable = file->details->directory->details->restore_cancel;
18556N/A+ data->ready_callback = restore_information_ready_callback;
18556N/A+ data->worker_func = nautilus_file_get_restore_info;
18556N/A+ g_async_queue_push (queue, data);
18556N/A+ res = g_simple_async_result_new (G_OBJECT (file),
18556N/A+ worker_queue_finished_callback,
18556N/A+ (gpointer) worker_queue_func);
18556N/A+ g_simple_async_result_set_op_res_gpointer (res, queue, NULL);
18556N/A+ g_simple_async_result_run_in_thread (res,
18556N/A+nautilus_file_has_snapshot_version (NautilusFile *file)
18556N/A+ if (file->details->has_snap_versions_is_up_to_date)
18556N/A+ return (file->details->has_snap_versions);
18556N/A+ FileHasSnapshotCallback callback;
18556N/A+typedef void (*HasSnapReadyCallback) (NautilusDirectory *file,
18556N/A+static void has_snapshot_ready_callback (GObject *source_object,
18556N/A+ GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
18556N/A+ HasSnapshotAsyncData *data = (HasSnapshotAsyncData*) user_data;
18556N/A+ if (g_cancellable_is_cancelled (data->cancel))
18556N/A+ data->file->details->has_snap_versions_in_progress = FALSE;
18556N/A+ data->file->details->has_snap_versions_is_up_to_date = FALSE;
18556N/A+ if (data->file->details->snapshot_directory)
18556N/A+ g_free (data->file->details->snapshot_directory);
18556N/A+ data->file->details->has_snapshot_cancel = NULL;
18556N/A+ data->file->details->has_snap_versions_in_progress = FALSE;
18556N/A+ data->file->details->has_snap_versions_is_up_to_date = TRUE;
18556N/A+ if (data->file->details->snapshot_directory)
18556N/A+ g_free (data->file->details->snapshot_directory);
18556N/A+ data->file->details->snapshot_directory = g_simple_async_result_get_op_res_gpointer (simple);
18556N/A+ if (data->file->details->snapshot_directory)
18556N/A+ data->file->details->has_snap_versions = TRUE;
18556N/A+ data->file->details->has_snap_versions = FALSE;
18556N/A+ data->callback (data->callback_user_data);
18556N/A+nautilus_file_get_snapshot_dir (NautilusFile *file)
18556N/A+ return file->details->snapshot_directory;
18556N/A+void nautilus_file_real_get_snapshot_version (GSimpleAsyncResult *res,
18556N/A+ NautilusFile *file = NAUTILUS_FILE (object);
18556N/A+ char *snap_info = nautilus_file_get_num_snapshot_version (file, cancellable, TRUE);
18556N/A+ if (!snap_info) /* scan for .zfs directory*/
18556N/A+ snap_info = ts_get_not_zfs_snapshot_dir (nautilus_file_get_location (file));
18556N/A+ g_simple_async_result_set_op_res_gpointer (res, snap_info, (GDestroyNotify) NULL);
18556N/A+ g_simple_async_result_set_op_res_gpointer (res, NULL, (GDestroyNotify) NULL);
18556N/A+void nautilus_file_get_snapshot_version (NautilusFile *file,
18556N/A+ FileHasSnapshotCallback callback,
18556N/A+ if (file->details->has_snap_versions_in_progress)
18556N/A+ g_cancellable_cancel(file->details->has_snapshot_cancel);
18556N/A+ file->details->has_snapshot_cancel = NULL;
18556N/A+ file->details->has_snap_versions_in_progress = FALSE;
18556N/A+ file->details->has_snapshot_cancel = cancel;
18556N/A+ file->details->has_snap_versions_in_progress = TRUE;
18556N/A+ file->details->has_snap_versions_is_up_to_date = FALSE;
18556N/A+ data = g_new0 (HasSnapshotAsyncData, 1);
18556N/A+ data->callback_user_data = user_data;
18556N/A+ res = g_simple_async_result_new (G_OBJECT (file),
18556N/A+ (gpointer) nautilus_file_real_get_snapshot_version);
18556N/A+ g_simple_async_result_run_in_thread (res, nautilus_file_real_get_snapshot_version,
18556N/A nautilus_file_mark_gone (NautilusFile *file)
18556N/A@@ -7289,6 +7983,12 @@ invalidate_mount (NautilusFile *file)
18556N/A file->details->mount_is_up_to_date = FALSE;
18556N/A+invalidate_restore_info (NautilusFile *file)
18556N/A+ file->details->restore_info_is_up_to_date = FALSE;
18556N/A nautilus_file_invalidate_extension_info_internal (NautilusFile *file)
18556N/A@@ -7343,6 +8043,9 @@ nautilus_file_invalidate_attributes_inte
18556N/A if (REQUEST_WANTS_TYPE (request, REQUEST_THUMBNAIL)) {
18556N/A+ if (REQUEST_WANTS_TYPE (request, REQUEST_RESTORE_INFO)) {
18556N/A+ invalidate_restore_info (file);
18556N/A if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) {
18556N/A@@ -7425,7 +8128,8 @@ nautilus_file_get_all_attributes (void)
18556N/A NAUTILUS_FILE_ATTRIBUTE_LARGE_TOP_LEFT_TEXT |
18556N/A NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO |
18556N/A NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL |
18556N/A- NAUTILUS_FILE_ATTRIBUTE_MOUNT;
18556N/A+ NAUTILUS_FILE_ATTRIBUTE_MOUNT |
18556N/A+ NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO ;
18556N/A@@ -7916,6 +8620,7 @@ nautilus_file_class_init (NautilusFileCl
18556N/A attribute_link_target_q = g_quark_from_static_string ("link_target");
18556N/A attribute_volume_q = g_quark_from_static_string ("volume");
18556N/A attribute_free_space_q = g_quark_from_static_string ("free_space");
18556N/A+ attribute_restore_info_q = g_quark_from_static_string ("restore_info");
18556N/A G_OBJECT_CLASS (class)->finalize = finalize;
18556N/A G_OBJECT_CLASS (class)->constructor = nautilus_file_constructor;
18556N/A@@ -173,6 +173,7 @@ gboolean nautilus_file_is
18556N/A gboolean nautilus_file_is_launchable (NautilusFile *file);
18556N/A gboolean nautilus_file_is_symbolic_link (NautilusFile *file);
18556N/A+gboolean nautilus_file_is_in_snapshot (NautilusFile *file);
18556N/A gboolean nautilus_file_is_mountpoint (NautilusFile *file);
18556N/A GMount * nautilus_file_get_mount (NautilusFile *file);
18556N/A char * nautilus_file_get_volume_free_space (NautilusFile *file);
18556N/A@@ -228,6 +229,26 @@ char * nautilus_file_ge
18556N/A NautilusFile * nautilus_file_get_trash_original_file (NautilusFile *file);
18556N/A+char * nautilus_file_get_num_snapshot_version (NautilusFile *file,
18556N/A+char * nautilus_file_get_restore_info_async (NautilusFile *file);
18556N/A+HasSnapshotResult nautilus_file_has_snapshot_version (NautilusFile *file);
18556N/A+char * nautilus_file_get_snapshot_dir (NautilusFile *file);
18556N/A+typedef void (*FileHasSnapshotCallback) (gpointer user_data);
18556N/A+void nautilus_file_get_snapshot_version (NautilusFile *file,
18556N/A+ FileHasSnapshotCallback callback,
18556N/A gboolean nautilus_file_can_get_permissions (NautilusFile *file);
18556N/A gboolean nautilus_file_can_set_permissions (NautilusFile *file);
18556N/A@@ -236,6 +236,10 @@ typedef struct
18556N/A * YOU SHOULD EDIT THE SCHEMAS FILE TO CHANGE DEFAULTS.
18556N/A static const PreferenceDefault preference_defaults[] = {
18556N/A+ { NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER,
18556N/A { NAUTILUS_PREFERENCES_EXIT_WITH_LAST_WINDOW,
18556N/A+ * Copyright (C) 2010 Sun Microsystems (Erwann Chenede)
18556N/A+#define ZFS_SNAPSHOT_DIR ".zfs/snapshot/"
18556N/A+#define ZFS_BACKUP_DIR ".time-slider/rsync"
18556N/A+char* ts_realpath (char * dir, char *resolved_name)
18556N/A+ result = realpath(dir, real_dir);
18556N/A+ if (stat64 (real_dir, &dir_stat64) == 0)
18556N/A+ while ((status = getextmntent(fp, &mtab, sizeof (struct extmnttab))) == 0)
18556N/A+ /*split 2nd part contains path without mount point */
18556N/A+ return strcpy (resolved_name, real_path);
18556N/A+ return strcpy (resolved_name, real_dir);
18556N/A+static void ts_set_snapshot_used_space (zfs_handle_t *zhp, ZfsDataSet *snap)
18556N/A+ if (zfs_prop_get(zhp, ZFS_PROP_USED, buf, sizeof (buf), NULL, NULL, 0, B_FALSE) == 0)
18556N/A+ char format_float[5] = "%f%s";
18556N/A+ snap->used_space_str = g_strdup (buf);
18556N/A+ if (sscanf(buf, format,&snap->used_space,unit) == 2)
18556N/A+ if (sscanf(buf, format,&used_space_int,unit) == 2)
18556N/A+ snap->used_space = (float) used_space_int;
18556N/A+ g_free (snap->used_space_str);
18556N/A+ snap->used_space_str = g_strdup ("0 K");
18556N/A+ snap->used_space *= 1024 * 1024;
18556N/A+ g_free (snap->used_space_str);
18556N/A+ snap->used_space_str = g_strdup (_("Unknown"));
18556N/A+ g_free (snap->used_space_str);
18556N/A+ snap->used_space_str = g_strdup (_("Unknown"));
18556N/A+static void ts_set_snapshot_mtime_and_time_diff (zfs_handle_t *zhp, ZfsDataSet *snap)
18556N/A+ if (zfs_prop_get(zhp, ZFS_PROP_CREATION, buf, sizeof (buf), NULL, NULL, 0, B_TRUE) == 0)
18556N/A+ sscanf (buf, "%llu", &snap->mtime);
18556N/A+ snap->mtime_str = nautilus_date_as_string (snap->mtime, FALSE);
18556N/A+void print_snap_list (char *dir, GList *snap_list)
18556N/A+ printf ("list of snapshots for %s :\n", dir);
18556N/A+ for (tmp = snap_list; tmp->next; tmp = tmp->next)
18556N/A+ ZfsDataSet *snap = (ZfsDataSet*) tmp->data;
18556N/A+ printf (" name: %s\n mountpoint: %s\n mtime_str :%s\n space used : %s\n size in kilobytes : %f\n",
18556N/A+ snap->name, snap->mountpoint, snap->mtime_str, snap->used_space_str, snap->used_space);
18556N/A+ zds->name,zds->mountpoint, zfs_type_to_name(zds->type));
18556N/A+ g_string_append_printf(msg,"\tsnapshots :\n");
18556N/A+ for (tmp=zds->snapshots;tmp;tmp = tmp->next)
18556N/A+ ZfsDataSet *tmp_zds= (ZfsDataSet*) tmp->data;
18556N/A+ g_string_append_printf (msg,"\t\tname: %s\n\t\tpath: %s\n",
18556N/A+ g_string_append_printf (msg, "\n");
18556N/A+ printf ("Search DataSet is empty\n");
18556N/A+ g_string_printf (msg, "DDS Dump:\n"
18556N/A+ g_string_append_printf (msg, "Zfs Data set :\n");
18556N/A+ for (tmp=sds->datasets;tmp;tmp=tmp->next)
18556N/A+ GString * zds_dump = dump_zds ((ZfsDataSet *)tmp->data);
18556N/A+ g_string_append_printf (msg,"%s",zds_dump->str);
18556N/A+ g_string_free (zds_dump, TRUE);
18556N/A+ g_string_append_printf (msg, "\n");
18556N/A+ts_new_zfs_dataset (SearchDataSet* sds)
18556N/A+ts_free_zfs_dataset (ZfsDataSet* zds)
18556N/A+ for (tmp = zds->snapshots;tmp;tmp = tmp->next)
18556N/A+ ts_free_zfs_dataset ((ZfsDataSet*)tmp->data);
18556N/A+ts_new_search_dataset (GCancellable *cancel)
18556N/A+ sds = g_new0 (SearchDataSet, 1);
18556N/A+ts_free_search_dataset (SearchDataSet *sds)
18556N/A+ for (tmp = sds->datasets;tmp;tmp = tmp->next)
18556N/A+ ts_free_zfs_dataset ((ZfsDataSet*)tmp->data);
18556N/A+static char* construct_check_snapshot_path (SearchDataSet *sds, char* mountpoint, const char *name, char *searched_path)
18556N/A+ /* get the snapshot name part pool@snap-name we are only interested in snap-name split[1] */
18556N/A+ split = g_strsplit (name,"@",2);
18556N/A+ /* get the path after the mountpoint */
18556N/A+ split2 = g_strsplit (searched_path, mountpoint, 2);
18556N/A+/* printf ("mountpoint : %s \nname : %s \nsearched_path: %s\n", mountpoint, name, searched_path);
18556N/A+ printf ("split %s at @ = [%s] [%s]\n", name, split[0],split[1]);
18556N/A+ printf ("split %s at [%s] = [%s] [%s]\n", searched_path, mountpoint, split2[0],split2[1]);
18556N/A+ printf ("%s/.zfs/snapshot/%s/%s\n\n", mountpoint, split[1], split2[1]);*/
18556N/A+ if (snap_name && remaining_path)
18556N/A+ result = g_strdup_printf ("%s/.zfs/snapshot/%s/%s", mountpoint, snap_name, remaining_path);
18556N/A+ /* don't test for file presence if searched path is the same as the mount point */
18556N/A+ if (sds->searched_path_match_mp)
18556N/A+ if (result && g_file_test (result, G_FILE_TEST_IS_DIR))
18556N/A+ if (!ts_realpath(result, real_dir))
18556N/A+snapshot_callback (zfs_handle_t *zhp, void *data)
18556N/A+ ZfsDataSet *main_zds = (ZfsDataSet*) data;
18556N/A+ /* only add snapshot dir that exist */
18556N/A+ if (zfs_get_type (zhp) == ZFS_TYPE_SNAPSHOT && !g_cancellable_is_cancelled (main_zds->search_dataset->cancel))
18556N/A+ const char* name = zfs_get_name (zhp);
18556N/A+ char *snap_path = construct_check_snapshot_path (main_zds->search_dataset,
18556N/A+ main_zds->search_dataset->searched_path);
18556N/A+ ZfsDataSet *zds = ts_new_zfs_dataset (main_zds->search_dataset);
18556N/A+ zds->type = ZFS_TYPE_SNAPSHOT;
18556N/A+ ts_set_snapshot_mtime_and_time_diff (zhp, zds);
18556N/A+ ts_set_snapshot_used_space (zhp, zds);
18556N/A+ main_zds->snapshots = g_list_append (main_zds->snapshots,zds);
18556N/A+ if ((status = getmntent(f, &mt)) == 0)
18556N/A+is_fs_mounted (const char *fs_name)
18556N/A+ while ((mntp = mygetmntent(mnttab)) != NULL)
18556N/A+ if (mntp->mnt_fstype == (char *)0 || strcmp(mntp->mnt_fstype, "zfs") != 0)
18556N/A+ if (strcmp (mntp->mnt_special, fs_name) == 0)
18556N/A+ return g_strdup (mntp->mnt_mountp);
18556N/A+static char* rsync_get_smf_dir()
18556N/A+ scf_propertygroup_t *pg = NULL;
18556N/A+ scf_iter_t *value_iter = NULL;
18556N/A+ /* connect to the current SMF global repository */
18556N/A+ handle = scf_handle_create(SCF_VERSION);
18556N/A+ sc = scf_scope_create(handle);
18556N/A+ svc = scf_service_create(handle);
18556N/A+ inst = scf_instance_create (handle);
18556N/A+ prop = scf_property_create(handle);
18556N/A+ value = scf_value_create(handle);
18556N/A+ value_iter = scf_iter_create(handle);
18556N/A+ /* if failed to allocate resources, exit */
18556N/A+ if (handle == NULL || sc == NULL || svc == NULL || pg == NULL ||
18556N/A+ prop == NULL || value == NULL || value_iter == NULL) {
18556N/A+ /* scf handles allocation failed. */
18556N/A+ if (scf_handle_bind(handle) == -1) {
18556N/A+ /* get the scope of the localhost in the current repository */
18556N/A+ if (scf_handle_get_scope(handle, SCF_SCOPE_LOCAL, sc) == -1) {
18556N/A+ /* Getting scf scope failed.*/
18556N/A+ /* get the service within the scope */
18556N/A+ /* get the instance within the service */
18556N/A+ if (scf_service_get_instance(svc, "rsync", inst) == -1)
18556N/A+ /* get the property group within the instance */
18556N/A+ if (scf_instance_get_pg(inst, "rsync", pg) == -1) {
18556N/A+ /* Getting property group failed. */
18556N/A+ if (scf_pg_get_property(pg, "target_dir", prop) == -1) {
18556N/A+ if (scf_property_get_value(prop, value) == -1) {
18556N/A+ if (scf_value_get_astring(value, data_store, MAXPATHLEN) == -1) {
18556N/A+static char *rsync_get_dir (zfs_handle_t *zhp)
18556N/A+ if (nvlist_lookup_nvlist(zfs_get_user_props(zhp),
18556N/A+ nvlist_lookup_string(propval, ZPROP_VALUE, &strval);
18556N/A+ if (strcmp (strval, "true") == 0)
18556N/A+void sync_backups_add (zfs_handle_t *zhp, ZfsDataSet *main_zds)
18556N/A+ char *rsync_dir = rsync_get_dir (zhp);
18592N/A+ /* format SMF backup dir , TIMESLIDER, nodename from uname, path, .time-slider/rsync */
18556N/A+ if (!g_file_test (fs_rsync_dir, G_FILE_TEST_IS_DIR))
18556N/A+ if (strstr (dir->d_name, "zfs-auto-snap_"))
18556N/A+ /* extract creation time from dir name */
18556N/A+ comma_split = g_strsplit (dir->d_name, "_", 2);
18556N/A+ /* printf ("comma_split[1] = %s\n", comma_split[1]); */
18556N/A+ freq_split = g_strsplit (comma_split[1], "-", 2);
18556N/A+ /* printf ("freq_split[1] = %s\n", freq_split[1]); */
18556N/A+ if (strptime (freq_split[1], "%Y-%m-%d-%Hh%M", &tms) != NULL)
18556N/A+ zds = ts_new_zfs_dataset (main_zds->search_dataset);
18556N/A+ zds->name = g_strdup (dir->d_name);
18592N/A+ zds->mountpoint = g_strdup_printf ("%s%s/", fs_rsync_dir, dir->d_name);
18556N/A+ zds->mtime_str = nautilus_date_as_string (zds->mtime, FALSE);
18556N/A+ zds->used_space_str = g_strdup (_("Separate Backup"));
18556N/A+ main_zds->snapshots = g_list_append (main_zds->snapshots,zds);
18556N/A+ /* printf ("in sync_backups_add adding %s %s\n", zds->name, zds->mountpoint); */
18556N/A+zfs_callback (zfs_handle_t *zhp, void *data)
18556N/A+ SearchDataSet *sds = (SearchDataSet*) data;
18556N/A+ if (zfs_get_type (zhp) & sds->type & !g_cancellable_is_cancelled (sds->cancel))
18556N/A+ if (sds->prop >= ZFS_PROP_TYPE && sds->prop < ZFS_NUM_PROPS)
18556N/A+ zfs_prop_get(zhp, sds->prop, buf, sizeof (buf), NULL, NULL, 0, TRUE);
18556N/A+ if (strcmp (sds->mountpoint, buf) == 0)
18556N/A+ ZfsDataSet *zds = ts_new_zfs_dataset (sds);
18556N/A+ zds->type = zfs_get_type (zhp);
18556N/A+ zds->name = g_strdup (zfs_get_name(zhp));
18556N/A+ zds->mountpoint = g_strdup (buf);
18556N/A+ zfs_iter_snapshots (zhp, snapshot_callback, zds);
18556N/A+ sds->datasets = g_list_append (sds->datasets, zds);
18556N/A+ else if (strcmp ("legacy", buf) == 0)
18556N/A+ char *mountp = is_fs_mounted (zfs_get_name(zhp));
18556N/A+ if (strcmp (sds->mountpoint, mountp) == 0)
18556N/A+ ZfsDataSet *zds = ts_new_zfs_dataset (sds);
18556N/A+ zds->type = zfs_get_type (zhp);
18556N/A+ zds->name = g_strdup (zfs_get_name(zhp));
18556N/A+ zfs_iter_snapshots (zhp, snapshot_callback, zds);
18556N/A+ sds->datasets = g_list_append (sds->datasets, zds);
18556N/A+ zfs_iter_filesystems (zhp, zfs_callback, sds);
18556N/A+ts_get_data_from_mountpoint (const char* searched_path, const char *mountpoint, GCancellable *cancel)
18556N/A+ static libzfs_handle_t *zfs_handle = NULL;
18556N/A+ sds = ts_new_search_dataset (cancel);
18556N/A+ sds->prop = ZFS_PROP_MOUNTPOINT;
18556N/A+ sds->type = ZFS_TYPE_FILESYSTEM;
18556N/A+ sds->searched_path = g_strdup (searched_path);
18556N/A+ sds->mountpoint = g_strdup (mountpoint);
18556N/A+ if (strcmp (searched_path, mountpoint) == 0)
18556N/A+ sds->searched_path_match_mp = TRUE;
18556N/A+ if ((zfs_handle = libzfs_init()) == NULL) {
18556N/A+ g_warning ("internal error: failed to initialize ZFS library\n");
18556N/A+ zfs_iter_root (zfs_handle, zfs_callback, sds);
18556N/A+snap_sort_by_age (gconstpointer a,
18556N/A+ if (snap1->mtime == snap2->mtime)
18556N/A+ if (snap1->mtime < snap2->mtime)
18556N/A+ if (snap1->mtime > snap2->mtime)
18556N/A+ts_get_zfs_filesystem (char *dir)
18556N/A+ if (!ts_realpath(dir, real_dir))
18556N/A+ if (stat64 (real_dir, &dir_stat64) == 0)
18556N/A+ while ((status = getextmntent(fp, &mtab, sizeof (struct extmnttab))) == 0)
18556N/A+static char * get_zfs_mountpoint (char *dir)
18556N/A+ gboolean found_mount_point = FALSE;
18556N/A+ if (!ts_realpath(dir, real_dir))
18556N/A+ if (stat64 (real_dir, &dir_stat64) == 0)
18556N/A+ while ((status = getextmntent(fp, &mtab, sizeof (struct extmnttab))) == 0)
18556N/A+char *ts_get_snapshot_dir (char *dir)
18556N/A+ char *zfs_dir = get_zfs_mountpoint (dir);
18556N/A+ char *snapshot_dir = g_strdup_printf ("%s/.zfs/snapshot", zfs_dir);
18556N/A+static void ts_get_snapshots_for_dir (GSimpleAsyncResult *res,
18556N/A+ GFile *file = G_FILE (object);
18556N/A+ char *dir = g_file_get_path (file);
18556N/A+ mountpoint = get_zfs_mountpoint (dir);
18556N/A+ g_simple_async_result_set_op_res_gpointer (res, snap_result, (GDestroyNotify) NULL);
18556N/A+ sds = ts_get_data_from_mountpoint (real_dir, mountpoint, cancellable);
18556N/A+ if (g_cancellable_is_cancelled (cancellable))
18556N/A+ /* printf ("ts_get_snapshots_for_dir %s cancelled\n", dir); */
18556N/A+ for (tmp=sds->datasets;tmp;tmp=tmp->next)
18556N/A+ ZfsDataSet *zds = (ZfsDataSet*) tmp->data;
18556N/A+ snap_result = g_list_concat (snap_result, zds->snapshots);
18556N/A+ snap_result = g_list_sort (snap_result, (GCompareFunc)snap_sort_by_age);
18556N/A+ /* print_snap_list (dir, snap_result); */
18556N/A+ g_simple_async_result_set_op_res_gpointer (res, snap_result, (GDestroyNotify) NULL);
18556N/A+GList *ts_get_snapshots_for_dir_async (GFile *file,
18556N/A+ GAsyncReadyCallback result_ready,
18556N/A+ res = g_simple_async_result_new (G_OBJECT (file), result_ready, user_data, (gpointer) ts_get_snapshots_for_dir);
18556N/A+ g_simple_async_result_run_in_thread (res, ts_get_snapshots_for_dir, G_PRIORITY_DEFAULT, cancel);
18556N/A+void ts_free_snapshots (GList *snaps)
18556N/A+ for (tmp=snaps;tmp;tmp=tmp->next)
18556N/A+ ts_free_zfs_dataset ((ZfsDataSet*) tmp->data);
18556N/A+gboolean ts_is_in_remote_backup (char *str)
18556N/A+ if (g_strrstr (str, ZFS_BACKUP_DIR))
18556N/A+gboolean ts_is_in_snapshot (char * str)
18556N/A+ if (g_strrstr (str, ZFS_SNAPSHOT_DIR))
18556N/A+ if (g_strrstr (str, ZFS_BACKUP_DIR))
18556N/A+char* ts_remove_snapshot_dir (char *str)
18556N/A+ zfs = g_strrstr (str, ZFS_SNAPSHOT_DIR);
18556N/A+ iter += sizeof (ZFS_SNAPSHOT_DIR);
18556N/A+ while (*iter != '/' && *iter != '\0')
18556N/A+ snap_root = g_strdup_printf ("%s%s", str, iter);
18556N/A+static gboolean restore_col_enabled = FALSE;
18556N/A+ts_is_restore_column_enabled ()
18556N/A+void ts_is_restore_column_enabled_init ();
18556N/A+visible_columns_changed (gpointer callback_data)
18556N/A+ ts_is_restore_column_enabled_init ();
18556N/A+void ts_is_restore_column_enabled_init ()
18556N/A+ eel_preferences_add_callback (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS,
18556N/A+ visible_columns_changed, NULL);
18556N/A+ visible_columns = eel_preferences_get_string_array (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS);
18556N/A+ if (strcmp (visible_columns [i], "restore_info") == 0)
18556N/A+static GList * get_dir_entries (char *dir_path)
18556N/A+ dir = g_dir_open (dir_path, 0, NULL);
18556N/A+ while ((entry_name = g_dir_read_name (dir)) != NULL)
18556N/A+ dir_entries = g_list_prepend (dir_entries, g_strdup (entry_name));
18556N/A+static void free_dir_entries (GList *entries)
18556N/A+ g_list_foreach (entries, (GFunc)g_free, NULL);
18556N/A+static gboolean are_entries_identical (GList *old, GList *new)
18556N/A+ if (g_list_length (old) != g_list_length (new))
18556N/A+ for (old; old; old = old->next)
18556N/A+ for (new; new; new = new->next)
18556N/A+ if (strcmp (old->data, new->data) == 0)
18556N/A+void monitor_zfs_snap_directory_cancel (ZfsSnapDirMonitor *monitor_data)
18556N/A+ /* printf ("in monitor_zfs_snap_directory_cancel %s\n", monitor_data->path); */
18556N/A+ g_source_remove (monitor_data->timeout_id);
18556N/A+ free_dir_entries (monitor_data->entries);
18556N/A+monitor_snap_dir (ZfsSnapDirMonitor *monitor_data)
18556N/A+ if (!g_file_test (monitor_data->path, G_FILE_TEST_IS_DIR))
18556N/A+ monitor_zfs_snap_directory_cancel (monitor_data);
18556N/A+ new_entries = get_dir_entries (monitor_data->path);
18556N/A+ if (are_entries_identical (monitor_data->entries, new_entries))
18556N/A+ free_dir_entries (new_entries);
18556N/A+ free_dir_entries (monitor_data->entries);
18556N/A+ monitor_data->entries = new_entries;
18556N/A+ monitor_data->change_callback (monitor_data, monitor_data->user_data);
18556N/A+ZfsSnapDirMonitor *monitor_zfs_snap_directory (char *path,
18556N/A+ ZfsDirChangeCallback change_callback,
18556N/A+ ZfsSnapDirMonitor *monitor_data = g_new0 (ZfsSnapDirMonitor, 1);
18556N/A+ /* printf ("start monitoring %s\n", path); */
18556N/A+ monitor_data->path = g_strdup (path);
18556N/A+ monitor_data->entries = get_dir_entries (path);
18556N/A+ monitor_data->change_callback = change_callback;
18556N/A+ monitor_data->user_data = data;
18556N/A+ monitor_data->timeout_id = g_timeout_add_seconds (5, (GSourceFunc)monitor_snap_dir, monitor_data);
18556N/A+ts_get_not_zfs_snapshot_dir (GFile *file)
18556N/A+ GFile *d = g_file_get_parent(file);
18556N/A+ char *full_path = g_file_get_path (file);
18556N/A+ char *stripped_path = g_file_get_path (d);
18556N/A+ if (stat64 (full_path, &dir_stat64) == 0)
18556N/A+ { /* check is fs is zfs if so don't try to check for nfs mounted .zfs dir*/
18556N/A+ g_sprintf (tmp_path, "%s/.zfs/snapshot", stripped_path);
18556N/A+ if (g_file_test (tmp_path, G_FILE_TEST_IS_DIR))
18556N/A+ GList *entries = get_dir_entries (tmp_path);
18556N/A+ char *after_snap_path = full_path + strlen (stripped_path);
18556N/A+ for (entries; entries; entries = entries->next)
18556N/A+ g_sprintf (test_path, "%s/%s/%s", tmp_path,
18556N/A+ if (g_file_test (test_path, G_FILE_TEST_EXISTS))
18556N/A+ stripped_path = g_file_get_path (d);
18556N/A+ gboolean searched_path_match_mp;
18556N/A+ SearchDataSet *search_dataset;
18556N/A+GList *ts_get_snapshots_for_dir_async (GFile *file,
18556N/A+ GAsyncReadyCallback result_ready,
18556N/A+void ts_free_snapshots (GList *snaps);
18556N/A+void ts_free_zfs_dataset (ZfsDataSet* zds);
18556N/A+gboolean ts_is_in_snapshot (char * str);
18556N/A+gboolean ts_is_in_remote_backup (char *str);
18556N/A+char* ts_remove_snapshot_dir (char *str);
18556N/A+char *ts_get_snapshot_dir (char *dir);
18556N/A+char *ts_get_zfs_filesystem (char *dir);
18556N/A+char * ts_get_not_zfs_snapshot_dir (GFile *file);
18556N/A+gboolean ts_is_restore_column_enabled ();
18556N/A+void ts_is_restore_column_enabled_init ();
18556N/A+void print_snap_list (char *dir, GList *snap_list);
18556N/A+char* ts_realpath (char * dir, char *resolved_name);
18556N/A+nautilus_date_as_string (time_t time_raw, gboolean use_smallest);
18556N/A+typedef void (*ZfsDirChangeCallback) (gpointer monitor_data,
18556N/A+ ZfsDirChangeCallback change_callback;
18556N/A+void monitor_zfs_snap_directory_cancel (ZfsSnapDirMonitor *monitor_data);
18556N/A+ZfsSnapDirMonitor *monitor_zfs_snap_directory (char *path,
18556N/A+ ZfsDirChangeCallback change_callback,
18556N/A@@ -137,6 +139,10 @@ nautilus_SOURCES = \
18556N/A nautilus_file_management_properties_SOURCES= \
18556N/A #define FM_ACTION_NEW_LAUNCHER "New Launcher"
18556N/A #define FM_ACTION_NEW_LAUNCHER_DESKTOP "New Launcher Desktop"
18556N/A #define FM_ACTION_RENAME "Rename"
18556N/A+#define FM_ACTION_RESTORE_TO "Restore to"
18556N/A+#define FM_ACTION_HAS_SNAPSHOT "View Snap"
18556N/A+#define FM_ACTION_SNAP_NOW "Snap Now"
18556N/A #define FM_ACTION_DUPLICATE "Duplicate"
18556N/A #define FM_ACTION_CREATE_LINK "Create Link"
18556N/A #define FM_ACTION_SELECT_ALL "Select All"
18556N/A@@ -989,6 +989,77 @@ real_trash (FMDirectoryView *view)
18556N/A+action_snap_now (GtkAction *action,
18556N/A+ FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data);
18556N/A+ GList *selection = fm_directory_view_get_selection_for_file_transfer (view);
18556N/A+ GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data));
18556N/A+ char *path = g_file_get_path (file);
18556N/A+ char *fs = ts_get_zfs_filesystem (path);
18556N/A+ gdk_spawn_command_line_on_screen (gtk_widget_get_screen (GTK_WIDGET (callback_data)),
18556N/A+action_restore_to_desktop_callback (GtkAction *action,
18556N/A+ FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data);
18556N/A+ char *desktop_directory = nautilus_get_desktop_directory_uri();
18556N/A+ GList *selection = fm_directory_view_get_selection_for_file_transfer (view);
18556N/A+ if (desktop_directory == NULL)
18556N/A+ for (node = selection; node != NULL; node = node->next)
18556N/A+ locations = g_list_prepend (locations,
18556N/A+ nautilus_file_get_uri ((NautilusFile *) node->data));
18556N/A+ fm_directory_view_move_copy_items (locations, NULL, desktop_directory,
18556N/A+ nautilus_file_list_free (selection);
18556N/A+action_show_snapshot_versions_callback (GtkAction *action,
18556N/A+ FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data);
18556N/A+ GList *selection = fm_directory_view_get_selection_for_file_transfer (view);
18556N/A+ GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data));
18556N/A+ char *dir = nautilus_file_get_snapshot_dir (NAUTILUS_FILE (selection->data));
18556N/A+ char *file_path = g_file_get_path (file);
18556N/A+ char real_file_path [PATH_MAX + 1];
18556N/A+ if (ts_realpath (file_path, real_file_path))
18556N/A+ gdk_spawn_command_line_on_screen (gtk_widget_get_screen (GTK_WIDGET (callback_data)),
18556N/A action_trash_callback (GtkAction *action,
18592N/A@@ -7300,6 +7371,24 @@ static const GtkActionEntry directory_vi
18556N/A /* label, accelerator */ "RenameSelectAll", "<shift>F2",
18556N/A G_CALLBACK (action_rename_select_all_callback) },
18556N/A+ /* name, stock id */ { "Restore to", NULL,
18556N/A+ /* label, accelerator */ N_("Restore to Desktop"), NULL,
18556N/A+ /* tooltip */ N_("Move each selected item to the Desktop"),
18556N/A+ G_CALLBACK (action_restore_to_desktop_callback) },
18556N/A+ /* name, stock id */ { "View Snap", NULL,
18556N/A+ /* label, accelerator */ N_("View versions"), NULL,
18556N/A+ /* tooltip */ N_("View the versions of this file available in ZFS snapshots"),
18556N/A+ G_CALLBACK (action_show_snapshot_versions_callback) },
18556N/A+ /* name, stock id */ { "Snap Now", NULL,
18556N/A+ /* label, accelerator */ N_("Snapshot now"), NULL,
18556N/A+ /* tooltip */ N_("Take a ZFS snapshot of this directory now"),
18556N/A+ G_CALLBACK (action_snap_now) },
18556N/A /* name, stock id */ { "Trash", NULL,
18556N/A /* label, accelerator */ N_("Mo_ve to Trash"), NULL,
18556N/A /* tooltip */ N_("Move each selected item to the Trash"),
18592N/A@@ -8662,6 +8751,41 @@ has_writable_extra_pane (FMDirectoryView
18556N/A+has_snapshot_ready_callback (gpointer user_data)
18556N/A+ HasSnapshotData *data = (HasSnapshotData*) user_data;
18556N/A+ HasSnapshotResult result = nautilus_file_has_snapshot_version (data->file);
18556N/A+ gtk_action_set_sensitive (data->action, FALSE);
18556N/A+ g_value_init (&name, G_TYPE_STRING);
18556N/A+ g_value_set_static_string (&name, _("No versions"));
18556N/A+ g_object_set_property (G_OBJECT (data->action), "label", &name);
18556N/A+ gtk_action_set_sensitive (data->action, TRUE);
18556N/A+ g_value_init (&name, G_TYPE_STRING);
18556N/A+ g_value_set_static_string (&name, _("Explore versions"));
18556N/A+ g_object_set_property (G_OBJECT (data->action), "label", &name);
18556N/A real_update_menus (FMDirectoryView *view)
18592N/A@@ -9011,6 +9135,74 @@ real_update_menus (FMDirectoryView *view
18556N/A gtk_action_set_sensitive (action, can_copy_files);
18556N/A+ action = gtk_action_group_get_action (view->details->dir_action_group,
18556N/A+ gtk_action_set_visible (action, can_copy_files &&
18556N/A+ nautilus_directory_is_in_snapshot (view->details->model));
18556N/A+ action = gtk_action_group_get_action (view->details->dir_action_group,
18556N/A+ if (selection_count == 1 && nautilus_file_is_directory (NAUTILUS_FILE (selection->data)))
18556N/A+ GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data));
18556N/A+ char *path = g_file_get_path (file);
18556N/A+ char *fs = ts_get_zfs_filesystem (path);
18556N/A+ gtk_action_set_visible (action, TRUE);
18556N/A+ gtk_action_set_visible (action, FALSE);
18556N/A+ action = gtk_action_group_get_action (view->details->dir_action_group,
18556N/A+ int result = nautilus_file_has_snapshot_version (NAUTILUS_FILE (selection->data));
18556N/A+ gtk_action_set_visible (action, FALSE);
18556N/A+ gtk_action_set_visible (action, TRUE);
18556N/A+ gtk_action_set_sensitive (action, TRUE);
18556N/A+ g_value_init (&name,G_TYPE_STRING);
18556N/A+ g_value_set_static_string (&name, _("Explore versions"));
18556N/A+ g_object_set_property (G_OBJECT (action), "label", &name);
18556N/A+ gtk_action_set_visible (action, TRUE);
18556N/A+ gtk_action_set_sensitive (action, FALSE);
18556N/A+ g_value_init (&name,G_TYPE_STRING);
18556N/A+ g_value_set_static_string (&name, _("Scanning for versions"));
18556N/A+ g_object_set_property (G_OBJECT (action), "label", &name);
18556N/A+ HasSnapshotData *data = g_new0 (HasSnapshotData, 1);
18556N/A+ data->file = NAUTILUS_FILE (selection->data);
18556N/A+ data->cancel = g_cancellable_new ();
18556N/A+ nautilus_file_get_snapshot_version (NAUTILUS_FILE (selection->data),
18556N/A+ gtk_action_set_visible (action, FALSE);
18556N/A real_update_paste_menu (view, selection, selection_count);
18556N/A disable_command_line = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_LOCKDOWN_COMMAND_LINE);
18556N/A <menuitem name="Duplicate" action="Duplicate"/>
18556N/A <menuitem name="Create Link" action="Create Link"/>
18556N/A <menuitem name="Rename" action="Rename"/>
18556N/A+ <menuitem name="Restore to" action="Restore to"/>
18556N/A+ <menuitem name="Snapshot now" action="Snap Now"/>
18556N/A+ <menuitem name="Scanning...." action="View Snap"/>
18556N/A <menuitem name="Copy to next pane" action="Copy to next pane"/>
18556N/A <menuitem name="Copy to Home" action="Copy to Home"/>
18556N/A <placeholder name="File Actions">
18556N/A <menuitem name="Create Link" action="Create Link"/>
18556N/A <menuitem name="Rename" action="Rename"/>
18556N/A+ <menuitem name="Restore to" action="Restore to"/>
18556N/A+ <menuitem name="Snapshot now" action="Snap Now"/>
18556N/A+ <menuitem name="Scanning...." action="View Snap"/>
18556N/A <menuitem name="Copy to next pane" action="Copy to next pane"/>
18556N/A <menuitem name="Copy to Home" action="Copy to Home"/>
18556N/A <menuitem name="Copy to Desktop" action="Copy to Desktop"/>
18556N/A <separator name="Location After Clipboard Separator"/>
18556N/A <placeholder name="Dangerous File Actions">
18556N/A+ <menuitem name="Restore" action="Restore"/>
18556N/A <menuitem name="Trash" action="LocationTrash"/>
18556N/A <menuitem name="Delete" action="LocationDelete"/>
18556N/A <menuitem name="Restore From Trash" action="LocationRestoreFromTrash"/>
18556N/A #define NAUTILUS_ACTION_STOP "Stop"
18556N/A #define NAUTILUS_ACTION_RELOAD "Reload"
18556N/A+#define NAUTILUS_ACTION_RESTORE "Restore"
18556N/A #define NAUTILUS_ACTION_BACK "Back"
18556N/A #define NAUTILUS_ACTION_UP "Up"
18556N/A #define NAUTILUS_ACTION_UP_ACCEL "UpAccel"
18556N/A #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_TREE_VIEW_FOLDERS_WIDGET "treeview_folders_checkbutton"
18556N/A #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_MEDIA_AUTOMOUNT_OPEN "media_automount_open_checkbutton"
18556N/A #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_MEDIA_AUTORUN_NEVER "media_autorun_never_checkbutton"
18556N/A+#define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ENABLE_TIME_SLIDER "time_slider_enabled_checkbutton"
18556N/A #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_THUMBNAIL_LIMIT_WIDGET "preview_image_size_combobox"
18556N/A@@ -730,6 +731,9 @@ nautilus_file_management_properties_dial
18556N/A eel_preferences_builder_connect_bool (builder,
18556N/A NAUTILUS_FILE_MANAGEMENT_PROPERTIES_TREE_VIEW_FOLDERS_WIDGET,
18556N/A NAUTILUS_PREFERENCES_TREE_SHOW_ONLY_DIRECTORIES);
18556N/A+ eel_preferences_builder_connect_bool (builder,
18556N/A+ NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ENABLE_TIME_SLIDER,
18556N/A+ NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER);
18556N/A eel_preferences_builder_connect_string_enum_combo_box (builder,
18556N/A NAUTILUS_FILE_MANAGEMENT_PROPERTIES_DEFAULT_VIEW_WIDGET,
18556N/A+ <requires lib="gtk+" version="2.16"/>
18556N/A+ <!-- interface-naming-policy toplevel-contextual -->
18556N/A <object class="GtkListStore" id="model1">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model2">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model3">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model4">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model5">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model6">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model7">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model8">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model9">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model10">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model11">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model12">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model13">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkListStore" id="model14">
18556N/A+ <!-- column-name gchararray -->
18556N/A <object class="GtkDialog" id="file_management_dialog">
18556N/A <property name="border_width">5</property>
18556N/A <property name="title" translatable="yes">File Management Preferences</property>
18556N/A- <property name="type">GTK_WINDOW_TOPLEVEL</property>
18556N/A- <property name="window_position">GTK_WIN_POS_CENTER</property>
18556N/A- <property name="modal">False</property>
18556N/A- <property name="resizable">True</property>
18556N/A- <property name="destroy_with_parent">False</property>
18556N/A- <property name="decorated">True</property>
18556N/A- <property name="skip_taskbar_hint">False</property>
18556N/A- <property name="skip_pager_hint">False</property>
18556N/A- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
18556N/A- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
18556N/A- <property name="focus_on_map">True</property>
18556N/A- <property name="urgency_hint">False</property>
18556N/A+ <property name="window_position">center</property>
18556N/A+ <property name="type_hint">dialog</property>
18556N/A <property name="has_separator">False</property>
18556N/A <object class="GtkVBox" id="dialog-vbox1">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">2</property>
18556N/A- <child internal-child="action_area">
18556N/A- <object class="GtkHButtonBox" id="dialog-action_area1">
18556N/A- <property name="visible">True</property>
18556N/A- <property name="layout_style">GTK_BUTTONBOX_END</property>
18556N/A- <object class="GtkButton" id="helpbutton1">
18556N/A- <property name="visible">True</property>
18556N/A- <property name="can_default">True</property>
18556N/A- <property name="can_focus">True</property>
18556N/A- <property name="label">gtk-help</property>
18556N/A- <property name="use_stock">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <object class="GtkButton" id="closebutton1">
18556N/A- <property name="visible">True</property>
18556N/A- <property name="can_default">True</property>
18556N/A- <property name="can_focus">True</property>
18556N/A- <property name="label">gtk-close</property>
18556N/A- <property name="use_stock">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A- <property name="pack_type">GTK_PACK_END</property>
18556N/A <object class="GtkNotebook" id="notebook1">
18556N/A- <property name="border_width">5</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="can_focus">True</property>
18556N/A- <property name="show_tabs">True</property>
18556N/A- <property name="show_border">True</property>
18556N/A- <property name="tab_pos">GTK_POS_TOP</property>
18556N/A- <property name="scrollable">False</property>
18556N/A- <property name="enable_popup">False</property>
18556N/A+ <property name="border_width">5</property>
18556N/A <object class="GtkVBox" id="vbox1">
18556N/A- <property name="border_width">12</property>
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A+ <property name="border_width">12</property>
18556N/A <property name="spacing">18</property>
18556N/A <object class="GtkVBox" id="vbox2">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label4">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Default View</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment2">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox14">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkHBox" id="hbox34">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="views_label_0">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">View _new folders using:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">default_view_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="default_view_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model1</property>
18556N/A <object class="GtkCellRendererText" id="renderer1"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkHBox" id="hbox11">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="views_label_1">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">_Arrange items:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">sort_order_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="sort_order_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model2</property>
18556N/A <object class="GtkCellRendererText" id="renderer2"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A <object class="GtkCheckButton" id="sort_folders_first_checkbutton">
18556N/A+ <property name="label" translatable="yes">Sort _folders before files</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="can_focus">True</property>
18556N/A- <property name="label" translatable="yes">Sort _folders before files</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <property name="active">False</property>
18556N/A- <property name="inconsistent">False</property>
18556N/A <property name="draw_indicator">True</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">2</property>
18556N/A <object class="GtkCheckButton" id="hidden_files_checkbutton">
18556N/A+ <property name="label" translatable="yes">Show hidden and _backup files</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="can_focus">True</property>
18556N/A- <property name="label" translatable="yes">Show hidden and _backup files</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <property name="active">False</property>
18556N/A- <property name="inconsistent">False</property>
18556N/A <property name="draw_indicator">True</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">3</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkVBox" id="vbox3">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label5">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Icon View Defaults</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment1">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox16">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkHBox" id="hbox35">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="views_label_2">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Default _zoom level:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">icon_view_zoom_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="icon_view_zoom_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model3</property>
18556N/A <object class="GtkCellRendererText" id="renderer3"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkCheckButton" id="compact_layout_checkbutton">
18556N/A+ <property name="label" translatable="yes">_Use compact layout</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="can_focus">True</property>
18556N/A- <property name="label" translatable="yes">_Use compact layout</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <property name="active">False</property>
18556N/A- <property name="inconsistent">False</property>
18556N/A <property name="draw_indicator">True</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">1</property>
18556N/A <object class="GtkCheckButton" id="labels_beside_icons_checkbutton">
18556N/A+ <property name="label" translatable="yes">_Text beside icons</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="can_focus">True</property>
18556N/A- <property name="label" translatable="yes">_Text beside icons</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <property name="active">False</property>
18556N/A- <property name="inconsistent">False</property>
18556N/A <property name="draw_indicator">True</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">2</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A <object class="GtkVBox" id="vbox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Compact View Defaults</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox42">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkHBox" id="hbox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="views_label_4">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">_Default zoom level:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">compact_view_zoom_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="compact_view_zoom_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model4</property>
18556N/A <object class="GtkCellRendererText" id="renderer4"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkCheckButton" id="all_columns_same_width_checkbutton">
18556N/A+ <property name="label" translatable="yes">A_ll columns have the same width</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="can_focus">True</property>
18556N/A- <property name="label" translatable="yes">A_ll columns have the same width</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <property name="active">False</property>
18556N/A- <property name="inconsistent">False</property>
18556N/A <property name="draw_indicator">True</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">2</property>
18556N/A <object class="GtkVBox" id="vbox4">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label6">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>List View Defaults</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment3">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox15">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkHBox" id="hbox36">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="views_label_3">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">D_efault zoom level:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">list_view_zoom_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="list_view_zoom_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model5</property>
18556N/A <object class="GtkCellRendererText" id="renderer5"/>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A <object class="GtkHBox" id="hbox29">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A- <property name="spacing">0</property>
18556N/A <object class="GtkLabel" id="captions_label_1">
18556N/A <property name="visible">True</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="captions_1_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model12</property>
18556N/A <object class="GtkCellRendererText" id="renderer12"/>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">2</property>
18556N/A <object class="GtkHBox" id="hbox30">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A- <property name="spacing">0</property>
18556N/A <object class="GtkLabel" id="captions_label_2">
18556N/A <property name="visible">True</property>
18556N/A- <property name="use_underline">False</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="captions_2_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model13</property>
18556N/A <object class="GtkCellRendererText" id="renderer13"/>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">3</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkVBox" id="vbox31">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label34">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Date</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment9">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkHBox" id="hbox33">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="label36">
18556N/A <property name="visible">True</property>
18556N/A <property name="label" translatable="yes">_Format:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">date_format_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="date_format_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model14</property>
18556N/A <object class="GtkCellRendererText" id="renderer14"/>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="tab_expand">False</property>
18556N/A- <property name="tab_fill">True</property>
18556N/A+ <property name="position">2</property>
18556N/A <object class="GtkLabel" id="label24">
18556N/A <property name="visible">True</property>
18556N/A <property name="label" translatable="yes">Display</property>
18556N/A- <property name="use_underline">False</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A+ <property name="position">2</property>
18556N/A+ <property name="tab_fill">False</property>
18556N/A <object class="GtkVBox" id="vbox29">
18556N/A- <property name="border_width">12</property>
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A+ <property name="border_width">12</property>
18556N/A <property name="spacing">18</property>
18556N/A <object class="GtkVBox" id="vbox30">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label31">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>List Columns</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment21">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="list_columns_vbox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label33">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Choose the order of information to appear in the list view.</property>
18556N/A- <property name="use_underline">False</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A <property name="wrap">True</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A- <property name="tab_expand">False</property>
18556N/A- <property name="tab_fill">True</property>
18556N/A+ <property name="position">3</property>
18556N/A <object class="GtkLabel" id="label30">
18556N/A <property name="visible">True</property>
18556N/A <property name="label" translatable="yes">List Columns</property>
18556N/A- <property name="use_underline">False</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A+ <property name="position">3</property>
18556N/A+ <property name="tab_fill">False</property>
18556N/A <object class="GtkVBox" id="vbox9">
18556N/A- <property name="border_width">12</property>
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A+ <property name="border_width">12</property>
18556N/A <property name="spacing">18</property>
18556N/A <object class="GtkVBox" id="vbox10">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label16">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Text Files</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment10">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox20">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkHBox" id="hbox24">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="preview_label_0">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Show te_xt in icons:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">preview_text_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="preview_text_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model6</property>
18556N/A <object class="GtkCellRendererText" id="renderer6"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkVBox" id="vbox11">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label18">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Other Previewable Files</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment11">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox21">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkHBox" id="hbox20">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="preview_label_1">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Show _thumbnails:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">preview_image_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="preview_image_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model7</property>
18556N/A <object class="GtkCellRendererText" id="renderer7"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkHBox" id="hbox21">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="preview_label_2">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">_Only for files smaller than:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">preview_image_size_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="preview_image_size_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model8</property>
18556N/A <object class="GtkCellRendererText" id="renderer8"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A <object class="GtkVBox" id="vbox12">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label20">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Sound Files</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment12">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox22">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkHBox" id="hbox22">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="preview_label_3">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Preview _sound files:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">preview_sound_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="preview_sound_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model9</property>
18556N/A <object class="GtkCellRendererText" id="renderer9"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">2</property>
18556N/A <object class="GtkVBox" id="vbox13">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label22">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Folders</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment13">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox23">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkHBox" id="hbox23">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">12</property>
18556N/A <object class="GtkLabel" id="preview_label_4">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Count _number of items:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">preview_folder_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkComboBox" id="preview_folder_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="model">model10</property>
18556N/A <object class="GtkCellRendererText" id="renderer10"/>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A+ <object class="GtkCheckButton" id="time_slider_enabled_checkbutton">
18556N/A+ <property name="label" translatable="yes" comments="SUN_BRANDING">Visualize ZFS snapshots timeline</property>
18556N/A+ <property name="visible">True</property>
18556N/A+ <property name="can_focus">True</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A+ <property name="draw_indicator">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">3</property>
18556N/A- <property name="tab_expand">False</property>
18556N/A- <property name="tab_fill">True</property>
18556N/A+ <property name="position">4</property>
18556N/A- <object class="GtkLabel" id="label3">
18556N/A+ <object class="GtkLabel" id="label7">
18556N/A <property name="visible">True</property>
18556N/A <property name="label" translatable="yes">Preview</property>
18556N/A- <property name="use_underline">False</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A+ <property name="position">4</property>
18556N/A+ <property name="tab_fill">False</property>
18556N/A <object class="GtkVBox" id="vbox34">
18556N/A- <property name="border_width">12</property>
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A+ <property name="border_width">12</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkVBox" id="media_handling_vbox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkVBox" id="vbox44">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label42">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Media Handling</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment18">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox52">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label60">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Choose what happens when inserting media or connecting devices to the system</property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A <property name="wrap">True</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="n_rows">5</property>
18556N/A <property name="n_columns">2</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A- <property name="row_spacing">6</property>
18556N/A <property name="column_spacing">6</property>
18556N/A+ <property name="row_spacing">6</property>
18556N/A <object class="GtkLabel" id="label44">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">CD _Audio:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">media_audio_cdda_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="left_attach">0</property>
18556N/A- <property name="right_attach">1</property>
18556N/A- <property name="top_attach">0</property>
18556N/A- <property name="bottom_attach">1</property>
18556N/A- <property name="x_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options"></property>
18556N/A <object class="GtkLabel" id="label50">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">_DVD Video:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">media_video_dvd_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="left_attach">0</property>
18556N/A- <property name="right_attach">1</property>
18556N/A <property name="top_attach">1</property>
18556N/A <property name="bottom_attach">2</property>
18556N/A- <property name="x_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options"></property>
18556N/A <object class="GtkComboBox" id="media_audio_cdda_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="left_attach">1</property>
18556N/A <property name="right_attach">2</property>
18556N/A- <property name="top_attach">0</property>
18556N/A- <property name="bottom_attach">1</property>
18556N/A- <property name="y_options">fill</property>
18556N/A+ <property name="y_options">GTK_FILL</property>
18556N/A <object class="GtkComboBox" id="media_video_dvd_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="left_attach">1</property>
18556N/A <property name="right_attach">2</property>
18556N/A <property name="top_attach">1</property>
18556N/A <property name="bottom_attach">2</property>
18556N/A- <property name="x_options">fill</property>
18556N/A- <property name="y_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options">GTK_FILL</property>
18556N/A <object class="GtkLabel" id="label54">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">_Music Player:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">media_music_player_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="left_attach">0</property>
18556N/A- <property name="right_attach">1</property>
18556N/A <property name="top_attach">2</property>
18556N/A <property name="bottom_attach">3</property>
18556N/A- <property name="x_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options"></property>
18556N/A <object class="GtkComboBox" id="media_music_player_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="left_attach">1</property>
18556N/A <property name="right_attach">2</property>
18556N/A <property name="top_attach">2</property>
18556N/A <property name="bottom_attach">3</property>
18556N/A- <property name="x_options">fill</property>
18556N/A- <property name="y_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options">GTK_FILL</property>
18556N/A <object class="GtkLabel" id="label59">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">_Photos:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">media_dcf_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="left_attach">0</property>
18556N/A- <property name="right_attach">1</property>
18556N/A <property name="top_attach">3</property>
18556N/A <property name="bottom_attach">4</property>
18556N/A- <property name="x_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options"></property>
18556N/A <object class="GtkComboBox" id="media_dcf_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="left_attach">1</property>
18556N/A <property name="right_attach">2</property>
18556N/A <property name="top_attach">3</property>
18556N/A <property name="bottom_attach">4</property>
18556N/A- <property name="x_options">fill</property>
18556N/A- <property name="y_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options">GTK_FILL</property>
18556N/A <object class="GtkLabel" id="label57">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">_Software:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">media_software_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="left_attach">0</property>
18556N/A- <property name="right_attach">1</property>
18556N/A <property name="top_attach">4</property>
18556N/A <property name="bottom_attach">5</property>
18556N/A- <property name="x_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options"></property>
18556N/A <object class="GtkComboBox" id="media_software_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="left_attach">1</property>
18556N/A <property name="right_attach">2</property>
18556N/A <property name="top_attach">4</property>
18556N/A <property name="bottom_attach">5</property>
18556N/A- <property name="x_options">fill</property>
18556N/A- <property name="y_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options">GTK_FILL</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkVBox" id="vbox50">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label61">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes"><b>Other Media</b></property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkAlignment" id="alignment20">
18556N/A <property name="visible">True</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xscale">1</property>
18556N/A- <property name="yscale">1</property>
18556N/A- <property name="top_padding">0</property>
18556N/A- <property name="bottom_padding">0</property>
18556N/A <property name="left_padding">12</property>
18556N/A- <property name="right_padding">0</property>
18556N/A <object class="GtkVBox" id="vbox51">
18556N/A <property name="visible">True</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A <property name="spacing">6</property>
18556N/A <object class="GtkLabel" id="label65">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Less common media formats can be configured here</property>
18556N/A- <property name="use_underline">False</property>
18556N/A <property name="use_markup">True</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A <property name="wrap">True</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="n_rows">2</property>
18556N/A <property name="n_columns">2</property>
18556N/A- <property name="homogeneous">False</property>
18556N/A- <property name="row_spacing">6</property>
18556N/A <property name="column_spacing">6</property>
18556N/A+ <property name="row_spacing">6</property>
18556N/A <object class="GtkComboBox" id="media_other_type_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="left_attach">1</property>
18556N/A <property name="right_attach">2</property>
18556N/A- <property name="top_attach">0</property>
18556N/A- <property name="bottom_attach">1</property>
18556N/A- <property name="y_options">fill</property>
18556N/A+ <property name="y_options">GTK_FILL</property>
18556N/A <object class="GtkLabel" id="label64">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">Acti_on:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">media_other_action_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="left_attach">0</property>
18556N/A- <property name="right_attach">1</property>
18556N/A <property name="top_attach">1</property>
18556N/A <property name="bottom_attach">2</property>
18556N/A- <property name="x_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options"></property>
18556N/A <object class="GtkComboBox" id="media_other_action_combobox">
18556N/A <property name="visible">True</property>
18556N/A- <property name="add_tearoffs">False</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A <property name="left_attach">1</property>
18556N/A <property name="right_attach">2</property>
18556N/A <property name="top_attach">1</property>
18556N/A <property name="bottom_attach">2</property>
18556N/A- <property name="x_options">fill</property>
18556N/A- <property name="y_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options">GTK_FILL</property>
18556N/A <object class="GtkLabel" id="label63">
18556N/A <property name="visible">True</property>
18556N/A+ <property name="xalign">0</property>
18556N/A <property name="label" translatable="yes">_Type:</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A <property name="mnemonic_widget">media_other_type_combobox</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A- <property name="left_attach">0</property>
18556N/A- <property name="right_attach">1</property>
18556N/A- <property name="top_attach">0</property>
18556N/A- <property name="bottom_attach">1</property>
18556N/A- <property name="x_options">fill</property>
18556N/A+ <property name="x_options">GTK_FILL</property>
18556N/A+ <property name="y_options"></property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A <object class="GtkCheckButton" id="media_autorun_never_checkbutton">
18556N/A+ <property name="label" translatable="yes">_Never prompt or start programs on media insertion</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="can_focus">True</property>
18556N/A- <property name="label" translatable="yes">_Never prompt or start programs on media insertion</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <property name="active">False</property>
18556N/A- <property name="inconsistent">False</property>
18556N/A <property name="draw_indicator">True</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">1</property>
18556N/A <object class="GtkCheckButton" id="media_automount_open_checkbutton">
18556N/A+ <property name="label" translatable="yes">B_rowse media when inserted</property>
18556N/A <property name="visible">True</property>
18556N/A <property name="can_focus">True</property>
18556N/A- <property name="label" translatable="yes">B_rowse media when inserted</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A <property name="use_underline">True</property>
18556N/A- <property name="relief">GTK_RELIEF_NORMAL</property>
18556N/A- <property name="focus_on_click">True</property>
18556N/A- <property name="active">False</property>
18556N/A- <property name="inconsistent">False</property>
18556N/A <property name="draw_indicator">True</property>
18556N/A- <property name="padding">0</property>
18556N/A <property name="expand">False</property>
18556N/A <property name="fill">False</property>
18556N/A+ <property name="position">2</property>
18556N/A- <property name="tab_expand">False</property>
18556N/A- <property name="tab_fill">True</property>
18556N/A+ <property name="position">5</property>
18556N/A <object class="GtkLabel" id="label38">
18556N/A <property name="visible">True</property>
18556N/A <property name="label" translatable="yes">Media</property>
18556N/A- <property name="use_underline">False</property>
18556N/A- <property name="use_markup">False</property>
18556N/A- <property name="justify">GTK_JUSTIFY_LEFT</property>
18556N/A- <property name="wrap">False</property>
18556N/A- <property name="selectable">False</property>
18556N/A- <property name="xalign">0.5</property>
18556N/A- <property name="yalign">0.5</property>
18556N/A- <property name="xpad">0</property>
18556N/A- <property name="ypad">0</property>
18556N/A- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
18556N/A- <property name="width_chars">-1</property>
18556N/A- <property name="single_line_mode">False</property>
18556N/A- <property name="angle">0</property>
18556N/A+ <property name="position">5</property>
18556N/A+ <property name="tab_fill">False</property>
18556N/A+ <property name="position">1</property>
18556N/A+ <child internal-child="action_area">
18556N/A+ <object class="GtkHButtonBox" id="dialog-action_area1">
18556N/A+ <property name="visible">True</property>
18556N/A+ <property name="layout_style">end</property>
18556N/A+ <object class="GtkButton" id="helpbutton1">
18556N/A+ <property name="label">gtk-help</property>
18556N/A+ <property name="visible">True</property>
18556N/A+ <property name="can_focus">True</property>
18556N/A+ <property name="can_default">True</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A+ <property name="use_stock">True</property>
18556N/A+ <property name="expand">False</property>
18556N/A+ <property name="fill">False</property>
18556N/A+ <property name="position">0</property>
18556N/A+ <object class="GtkButton" id="closebutton1">
18556N/A+ <property name="label">gtk-close</property>
18556N/A+ <property name="visible">True</property>
18556N/A+ <property name="can_focus">True</property>
18556N/A+ <property name="can_default">True</property>
18556N/A+ <property name="receives_default">False</property>
18556N/A+ <property name="use_stock">True</property>
18556N/A+ <property name="expand">False</property>
18556N/A+ <property name="fill">False</property>
18556N/A+ <property name="position">1</property>
18556N/A- <property name="padding">0</property>
18556N/A- <property name="expand">True</property>
18556N/A- <property name="fill">True</property>
18556N/A+ <property name="expand">False</property>
18556N/A+ <property name="pack_type">end</property>
18556N/A+ <property name="position">0</property>
18556N/A <toolitem name="Up" action="Up"/>
18556N/A <toolitem name="Stop" action="Stop"/>
18556N/A <toolitem name="Reload" action="Reload"/>
18556N/A+ <toolitem name="Restore" action="Restore"/>
18556N/A <toolitem name="Home" action="Home"/>
18556N/A <toolitem name="Computer" action="Go to Computer"/>
18556N/A@@ -120,6 +121,13 @@ static const struct {
18556N/A+restore_pref_changed (NautilusWindow *window)
18556N/A+ g_assert (NAUTILUS_IS_WINDOW (window));
18556N/A+ nautilus_window_reload (window);
18556N/A nautilus_navigation_window_init (NautilusNavigationWindow *window)
18556N/A@@ -144,7 +152,7 @@ nautilus_navigation_window_init (Nautilu
18556N/A gtk_table_attach (GTK_TABLE (NAUTILUS_WINDOW (window)->details->table),
18556N/A window->details->content_paned,
18556N/A /* X direction */ /* Y direction */
18556N/A GTK_EXPAND | GTK_FILL | GTK_SHRINK, GTK_EXPAND | GTK_FILL | GTK_SHRINK,
18556N/A gtk_widget_show (window->details->content_paned);
18556N/A@@ -176,6 +184,15 @@ nautilus_navigation_window_init (Nautilu
18556N/A ui_manager = nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window));
18556N/A toolbar = gtk_ui_manager_get_widget (ui_manager, "/Toolbar");
18556N/A+ nautilus_navigation_window_set_restore_icon (window, RESTORE_SEARCH);
18556N/A+ eel_preferences_add_callback (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER,
18556N/A+ (EelPreferencesCallback) restore_pref_changed,
18556N/A window->details->toolbar = toolbar;
18556N/A gtk_table_attach (GTK_TABLE (NAUTILUS_WINDOW (window)->details->table),
18556N/A@@ -193,6 +210,15 @@ nautilus_navigation_window_init (Nautilu
18556N/A nautilus_navigation_window_allow_back (window, FALSE);
18556N/A nautilus_navigation_window_allow_forward (window, FALSE);
18556N/A+ window->zfs_bar = nautilus_zfs_bar_new ();
18556N/A+ gtk_table_attach (GTK_TABLE (NAUTILUS_WINDOW (window)->details->table),
18556N/A+ /* X direction */ /* Y direction */
18556N/A+ GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0,
18556N/A eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_ALWAYS_USE_LOCATION_ENTRY,
18556N/A always_use_location_entry_changed,
18556N/A@@ -347,6 +373,59 @@ nautilus_navigation_window_restore_focus
18556N/A+void nautilus_navigation_window_set_restore_icon (NautilusNavigationWindow* window,
18556N/A+ NautilusNavigationRestoreIconType type)
18556N/A+ static GdkPixbuf *normal = NULL;
18556N/A+ static GdkPixbuf *search = NULL;
18556N/A+ GtkAction* action = gtk_ui_manager_get_action (nautilus_window_get_ui_manager (NAUTILUS_WINDOW (window)), "
/Toolbar/Restore");
18556N/A+ normal = gdk_pixbuf_new_from_file (path, NULL);
18556N/A+ search = gdk_pixbuf_new_from_file (path, NULL);
18556N/A+ no = gdk_pixbuf_new_from_file (path, NULL);
18556N/A+ image = gtk_image_new_from_pixbuf (pb);
18556N/A+ GSList *tmp = gtk_action_get_proxies (action);
18556N/A+ for (tmp; tmp ; tmp = tmp->next)
18556N/A+ GtkWidget *proxy = (GtkWidget *)tmp->data;
18556N/A+ if (GTK_IS_TOOL_BUTTON (proxy))
18556N/A+ gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), image);
18556N/A side_pane_close_requested_callback (GtkWidget *widget,
18556N/A@@ -1118,6 +1197,7 @@ nautilus_navigation_window_save_geometry
18556N/A real_window_close (NautilusWindow *window)
18556N/A+ nautilus_zfs_bar_cancel_tasks (window);
18556N/A nautilus_navigation_window_save_geometry (NAUTILUS_NAVIGATION_WINDOW (window));
18556N/A@@ -1306,6 +1386,17 @@ nautilus_navigation_window_split_view_of
18556N/A nautilus_navigation_window_update_show_hide_menu_items (window);
18556N/A+nautilus_navigation_window_zfs_bar_showing (NautilusNavigationWindow *window)
18556N/A+ g_return_val_if_fail (NAUTILUS_IS_NAVIGATION_WINDOW (window), FALSE);
18556N/A+ return GTK_WIDGET_VISIBLE (window->zfs_bar);
18556N/A nautilus_navigation_window_split_view_showing (NautilusNavigationWindow *window)
18556N/A@@ -63,11 +63,17 @@ struct _NautilusNavigationWindow {
18556N/A+} NautilusNavigationRestoreIconType;
18556N/A struct _NautilusNavigationWindowClass {
18556N/A NautilusWindowClass parent_spot;
18556N/A@@ -95,6 +101,9 @@ void nautilus_navigation_window_remo
18556N/A void nautilus_navigation_window_hide_status_bar (NautilusNavigationWindow *window);
18556N/A void nautilus_navigation_window_show_status_bar (NautilusNavigationWindow *window);
18556N/A gboolean nautilus_navigation_window_status_bar_showing (NautilusNavigationWindow *window);
18556N/A+gboolean nautilus_navigation_window_zfs_bar_showing (NautilusNavigationWindow *window);
18556N/A+ void nautilus_navigation_window_set_restore_icon (NautilusNavigationWindow* window,
18556N/A+ NautilusNavigationRestoreIconType type);
18556N/A void nautilus_navigation_window_back_or_forward (NautilusNavigationWindow *window,
18556N/A <menuitem name="Stop" action="Stop"/>
18556N/A <menuitem name="Reload" action="Reload"/>
18556N/A+ <menuitem name="Restore" action="Restore"/>
18556N/A <placeholder name="Show Hide Placeholder"/>
18556N/A@@ -618,9 +620,7 @@ nautilus_window_slot_open_location_full
18556N/A (target_window == window && target_slot == slot &&
18556N/A old_location && g_file_equal (old_location, location))) {
18556N/A- g_object_unref (old_location);
18556N/A+ g_object_unref (old_location);
18556N/A@@ -814,6 +814,7 @@ begin_location_change (NautilusWindowSlo
18556N/A@@ -827,11 +828,46 @@ begin_location_change (NautilusWindowSlo
18556N/A+ old_file = nautilus_window_slot_get_location (slot);
18556N/A+ directory = nautilus_directory_get (old_file);
18556N/A+ nautilus_directory_cancel_restore_info (directory);
18556N/A nautilus_window_slot_set_allow_stop (slot, TRUE);
18556N/A nautilus_window_slot_set_status (slot, " ");
18556N/A g_assert (slot->pending_location == NULL);
18556N/A g_assert (slot->pending_selection == NULL);
18556N/A+ directory = nautilus_directory_get (location);
18556N/A+ /* if snap and (ts is enabled and displayed )
18556N/A+ * check if the directory exist
18556N/A+ * if it doesn't move to the next available one */
18556N/A+ if (nautilus_directory_is_in_snapshot (directory) && is_time_slider_enabled ())
18556N/A+ if (GTK_WIDGET_VISIBLE (GTK_WIDGET (NAUTILUS_NAVIGATION_WINDOW (window)->zfs_bar)))
18556N/A+ char *path = g_file_get_path (location);
18556N/A+ if (!g_file_test (path, G_FILE_TEST_IS_DIR))
18556N/A+ nautilus_zfs_bar_remove_and_skip_snap (NAUTILUS_ZFS_BAR (NAUTILUS_NAVIGATION_WINDOW (window)->zfs_bar), path);
18556N/A slot->pending_location = g_object_ref (location);
18556N/A slot->location_change_type = type;
18556N/A@@ -841,7 +877,6 @@ begin_location_change (NautilusWindowSlo
18556N/A slot->pending_scroll_to = g_strdup (scroll_pos);
18556N/A- directory = nautilus_directory_get (location);
18556N/A /* The code to force a reload is here because if we do it
18556N/A * after determining an initial view (in the components), then
18556N/A@@ -1091,8 +1126,17 @@ got_file_info_for_view_selection_callbac
18556N/A /* If fallback, don't use view from metadata */
18556N/A if (slot->location_change_type != NAUTILUS_LOCATION_CHANGE_FALLBACK) {
18556N/A /* Look in metadata for view */
18556N/A- view_id = nautilus_file_get_metadata
18556N/A- (file, NAUTILUS_METADATA_KEY_DEFAULT_VIEW, NULL);
18556N/A+ if (nautilus_file_is_in_snapshot (file))
18556N/A+ NautilusDirectory* root_dir = nautilus_zfs_bar_get_dir (NAUTILUS_ZFS_BAR (NAUTILUS_NAVIGATION_WINDOW (window)->zfs_bar));
18556N/A+ view_id = nautilus_file_get_metadata (nautilus_directory_get_corresponding_file (root_dir),
18556N/A+ NAUTILUS_METADATA_KEY_DEFAULT_VIEW, NULL);
18556N/A+ view_id = nautilus_file_get_metadata
18556N/A+ (file, NAUTILUS_METADATA_KEY_DEFAULT_VIEW, NULL);
18556N/A !nautilus_view_factory_view_supports_uri (view_id,
18556N/A@@ -1617,6 +1661,30 @@ update_for_new_location (NautilusWindowS
18556N/A /* Load menus from nautilus extensions for this location */
18556N/A nautilus_window_load_extension_menus (window);
18556N/A+ /* time slider pref can be just enabled so we need
18556N/A+ directory = nautilus_directory_get (slot->location);
18556N/A+ if (NAUTILUS_IS_NAVIGATION_WINDOW (window))
18556N/A+ if (slot->find_zfs_snapshots_cancellable != NULL)
18556N/A+ g_cancellable_cancel (slot->find_zfs_snapshots_cancellable);
18556N/A+ slot->find_zfs_snapshots_cancellable = NULL;
18556N/A+ slot->find_zfs_snapshots_cancellable = g_cancellable_new ();
18556N/A+ nautilus_zfs_bar_display (NAUTILUS_ZFS_BAR (NAUTILUS_NAVIGATION_WINDOW (window)->zfs_bar),
18556N/A+ slot->find_zfs_snapshots_cancellable);
18556N/A+ nautilus_window_allow_restore (window, FALSE);
18556N/A+ nautilus_directory_unref (directory);
18556N/A nautilus_window_slot_remove_extra_location_widgets (slot);
18556N/A nautilus_window_slot_stop_loading (NautilusWindowSlot *slot)
18556N/A window = NAUTILUS_WINDOW (slot->pane->window);
18556N/A g_assert (NAUTILUS_IS_WINDOW (window));
18556N/A nautilus_view_stop_loading (slot->content_view);
18556N/A+ if (slot->find_zfs_snapshots_cancellable)
18556N/A+ g_cancellable_cancel (slot->find_zfs_snapshots_cancellable);
18556N/A+ directory = nautilus_directory_get (slot->location);
18556N/A+ nautilus_directory_cancel_restore_info (directory);
18556N/A+ nautilus_directory_unref (directory);
18556N/A if (slot->new_content_view != NULL) {
18556N/A window->details->temporarily_ignore_view_signals = TRUE;
18556N/A@@ -2019,6 +2095,8 @@ nautilus_window_manage_views_close_slot
18556N/A nautilus_window_slot_disconnect_content_view (slot, slot->content_view);
18556N/A+ nautilus_window_slot_stop_loading (slot);
18556N/A cancel_viewed_file_changed_callback (slot);
18592N/A@@ -400,6 +402,33 @@ action_reload_callback (GtkAction *actio
18556N/A+action_restore_callback (GtkToggleAction *action,
18556N/A+ GtkWidget *bar = NAUTILUS_NAVIGATION_WINDOW (user_data)->zfs_bar;
18556N/A+ slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW (user_data));
18556N/A+ directory = nautilus_window_slot_get_location (slot);
18556N/A+ n_dir = nautilus_directory_get (directory);
18556N/A+ if (gtk_toggle_action_get_active (action))
18556N/A+ nautilus_zfs_bar_setup (NAUTILUS_ZFS_BAR (bar), n_dir, slot, action);
18556N/A+ nautilus_zfs_bar_hide (NAUTILUS_ZFS_BAR (bar));
18556N/A+ nautilus_window_reload (NAUTILUS_WINDOW (user_data));
18556N/A action_zoom_in_callback (GtkAction *action,
18592N/A@@ -914,6 +943,12 @@ static const GtkActionEntry main_entries
18556N/A static const GtkToggleActionEntry main_toggle_entries[] = {
18556N/A+ /* name, stock id */ { "Restore", "stock_help",
18556N/A+ /* label, accelerator */ N_("R_estore"), "<control>E",
18556N/A+ /* tooltip */ N_("Browse the current location snapshot history"),
18556N/A+ G_CALLBACK (action_restore_callback) },
18556N/A /* name, stock id */ { "Show Hidden Files", NULL,
18556N/A /* label, accelerator */ N_("Show _Hidden Files"), "<control>H",
18556N/A /* tooltip */ N_("Toggle the display of hidden files in the current window"),
18556N/A@@ -650,6 +650,13 @@ nautilus_window_slot_dispose (GObject *o
18556N/A slot->find_mount_cancellable = NULL;
18556N/A+ if (slot->find_zfs_snapshots_cancellable)
18556N/A+ g_cancellable_cancel (slot->find_zfs_snapshots_cancellable);
18556N/A+ g_object_unref (slot->find_zfs_snapshots_cancellable);
18556N/A+ slot->find_zfs_snapshots_cancellable = NULL;
18556N/A@@ -108,6 +108,7 @@ struct NautilusWindowSlot {
18556N/A GCancellable *find_mount_cancellable;
18556N/A+ GCancellable *find_zfs_snapshots_cancellable;
18556N/A@@ -167,7 +167,7 @@ nautilus_window_init (NautilusWindow *wi
18556N/A gtk_window_set_title (GTK_WINDOW (window), _("Nautilus"));
18556N/A- table = gtk_table_new (1, 6, FALSE);
18556N/A+ table = gtk_table_new (1, 7, FALSE);
18556N/A window->details->table = table;
18556N/A gtk_container_add (GTK_CONTAINER (window), table);
18556N/A@@ -184,6 +184,7 @@ nautilus_window_init (NautilusWindow *wi
18556N/A menu = gtk_ui_manager_get_widget (window->details->ui_manager, "/MenuBar");
18556N/A window->details->menubar = menu;
18556N/A gtk_table_attach (GTK_TABLE (table),
18556N/A /* X direction */ /* Y direction */
18556N/A@@ -323,6 +324,17 @@ nautilus_window_allow_up (NautilusWindow
18556N/A set_allow_up, (window, allow));
18556N/A+void nautilus_window_allow_restore (NautilusWindow *window, gboolean enable)
18556N/A+ g_assert (NAUTILUS_IS_WINDOW (window));
18556N/A+ action = gtk_action_group_get_action (window->details->main_action_group,
18556N/A+ gtk_action_set_sensitive (action, enable);
18556N/A update_cursor (NautilusWindow *window)
18556N/A@@ -331,7 +343,7 @@ update_cursor (NautilusWindow *window)
18556N/A slot = window->details->active_pane->active_slot;
18556N/A+ if (slot && slot->allow_stop) {
18556N/A cursor = gdk_cursor_new (GDK_WATCH);
18556N/A gdk_window_set_cursor (GTK_WIDGET (window)->window, cursor);
18556N/A@@ -356,8 +368,14 @@ nautilus_window_sync_allow_stop (Nautilu
18556N/A if (slot != window->details->active_pane->active_slot ||
18556N/A allow_stop != slot->allow_stop) {
18556N/A if (slot == window->details->active_pane->active_slot) {
18556N/A- gtk_action_set_sensitive (action, slot->allow_stop);
18556N/A+ if (!slot->allow_stop && slot->find_zfs_snapshots_cancellable != NULL)
18556N/A+ if (g_cancellable_is_cancelled (slot->find_zfs_snapshots_cancellable))
18556N/A+ gtk_action_set_sensitive (action, slot->allow_stop);
18556N/A+ gtk_action_set_sensitive (action, slot->allow_stop);
18556N/A if (gtk_widget_get_realized (GTK_WIDGET (window))) {
18556N/A@@ -146,7 +146,8 @@ void nautilus_window_launch_
18556N/A void nautilus_window_display_error (NautilusWindow *window,
18556N/A void nautilus_window_reload (NautilusWindow *window);
18556N/A+void nautilus_window_allow_restore (NautilusWindow *window,
18556N/A void nautilus_window_allow_reload (NautilusWindow *window,
18556N/A void nautilus_window_allow_up (NautilusWindow *window,
18556N/A+ * Copyright (C) 2008 Sun Microsystems (Erwann Chenede)
18556N/A+#define NAUTILUS_ZFS_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NAUTILUS_TYPE_ZFS_BAR, NautilusZfsBarPrivate))
18556N/A+ ZfsSnapDirMonitor *zfs_dir_monitor_data;
18556N/A+G_DEFINE_TYPE (NautilusZfsBar, nautilus_zfs_bar, GTK_TYPE_EVENT_BOX)
18556N/A+close_clicked_callback (GtkWidget *widget,
18556N/A+slider_moved_callback (TimeScale *ts,
18556N/A+nautilus_zfs_bar_class_init (NautilusZfsBarClass *klass)
18556N/A+ object_class = G_OBJECT_CLASS (klass);
18556N/A+ g_type_class_add_private (klass, sizeof (NautilusZfsBarPrivate));
18556N/A+set_scale_range (NautilusZfsBar *bar, gboolean set_initial_position)
18556N/A+ i = nautilus_directory_get_num_snapshots (bar->priv->dir);
18556N/A+ bar->priv->num_range_items = i;
18556N/A+ tmp = nautilus_directory_get_snapshots (bar->priv->dir);
18556N/A+ timescale_set_snapshots (TIMESCALE (bar->priv->scale), tmp, -1);
18556N/A+ timescale_set_snapshots (TIMESCALE (bar->priv->scale), tmp, bar->priv->num_range_items);
18556N/A+update_range (NautilusZfsBar *bar)
18556N/A+ if (nautilus_directory_get_snapshots (bar->priv->dir))
18556N/A+ slider_moved_callback (TIMESCALE (bar->priv->scale), bar);
18556N/A+ close_clicked_callback (NULL, bar);
18556N/A+static int match_func (ZfsDataSet *set, char *dir)
18556N/A+ /* remove trailing slash from dir */
18556N/A+ int length = strlen (set->mountpoint);
18556N/A+ if (set->mountpoint[length-1] == '/')
18556N/A+ memcpy (mountp, set->mountpoint, length - 1);
18556N/A+ return strcmp (set->mountpoint, dir);
18556N/A+nautilus_zfs_bar_remove_and_skip_snap (NautilusZfsBar *bar, char *path)
18556N/A+ snap_list = nautilus_directory_get_snapshots (bar->priv->dir);
18556N/A+ match = g_list_find_custom (snap_list, path, (GCompareFunc)match_func);
18556N/A+ snap = (ZfsDataSet*) match->data;
18556N/A+ nautilus_directory_remove_snapshot (bar->priv->dir, snap);
18556N/A+slider_moved_callback (TimeScale *ts,
18556N/A+ int pos = timescale_get_position (ts);
18556N/A+ if (pos < bar->priv->num_range_items)
18556N/A+ tmp = nautilus_directory_get_snapshots (bar->priv->dir);
18556N/A+ snap = g_list_nth_data (tmp, pos);
18556N/A+ snap_file = g_file_new_for_path (snap->mountpoint);
18556N/A+ snap_file = nautilus_directory_get_location (bar->priv->dir);
18556N/A+ pos = bar->priv->num_range_items;
18556N/A+ char *path = g_file_get_path (snap_file);
18556N/A+ if (g_file_test (path, G_FILE_TEST_IS_DIR))
18556N/A+ nautilus_window_slot_go_to (bar->priv->slot,
18556N/A+ g_free (bar->priv->current_path);
18556N/A+ bar->priv->current_path = path;
18556N/A+ { /* the snapshot diappeared try the next one */
18556N/A+ nautilus_directory_remove_snapshot (bar->priv->dir, snap);
18556N/A+ in_snap = ts_is_in_snapshot (path);
18556N/A+ if (!bar->priv->in_snapshot_dir)
18556N/A+ bar->priv->in_snapshot_dir = TRUE;
18556N/A+ g_object_ref (bar->priv->camera_image);
18556N/A+ gtk_button_set_image (GTK_BUTTON (bar->priv->delete_button),
18556N/A+ gtk_widget_set_tooltip_text (bar->priv->delete_button,
18556N/A+ if (bar->priv->in_snapshot_dir)
18556N/A+ bar->priv->in_snapshot_dir = FALSE;
18556N/A+ g_object_ref (bar->priv->delete_image);
18556N/A+ gtk_button_set_image (GTK_BUTTON (bar->priv->delete_button),
18556N/A+ gtk_widget_set_tooltip_text (bar->priv->delete_button,
18556N/A+ _("Take a zfs snapshot of this directory now"));
18556N/A+delete_clicked_callback (GtkWidget *widget,
18556N/A+ int pos = gtk_range_get_value (GTK_RANGE (bar->priv->scale));
18556N/A+ if (bar->priv->in_snapshot_dir)
18556N/A+ tmp = nautilus_directory_get_snapshots (bar->priv->dir);
18556N/A+ snap = g_list_nth_data (tmp, pos);
18556N/A+ snap_file = g_file_new_for_path (snap->mountpoint);
18556N/A+ path = g_file_get_path (snap_file);
18556N/A+ /* printf ("path %s snapshot to delete %s\n", path, snap->name); */
18556N/A+ gdk_spawn_command_line_on_screen (gtk_widget_get_screen (widget),
18556N/A+ path = g_file_get_path (nautilus_directory_get_location (bar->priv->dir));
18556N/A+ char *fs = ts_get_zfs_filesystem (path);
18556N/A+ /* printf ("take a snapshot of zfs fs %s for dir %s\n", fs, path); */
18556N/A+ gdk_spawn_command_line_on_screen (gtk_widget_get_screen (widget),
18556N/A+close_clicked_callback (GtkWidget *widget,
18556N/A+ GFile *snap_file = nautilus_directory_get_location (bar->priv->dir);
18556N/A+ nautilus_window_slot_go_to (bar->priv->slot,
18556N/A+ gtk_widget_hide (GTK_WIDGET (bar));
18556N/A+ gtk_toggle_action_set_active (bar->priv->action, FALSE);
18556N/A+nautilus_zfs_bar_init (NautilusZfsBar *bar)
18556N/A+ GtkWidget *hbox, *toolbar, *close, *delete, *image, *button_vbox;
18556N/A+ bar->priv = NAUTILUS_ZFS_BAR_GET_PRIVATE (bar);
18556N/A+ bar->priv->num_range_items = 0;
18556N/A+ gtk_widget_show (GTK_WIDGET (item));
18556N/A+ gtk_tool_item_set_expand (item, TRUE);
18556N/A+ hbox = gtk_hbox_new (FALSE, 2);
18556N/A+ gtk_widget_show (GTK_WIDGET (hbox));
18556N/A+ gtk_container_add (GTK_CONTAINER (item),hbox);
18556N/A+ gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
18556N/A+ gtk_container_add (GTK_CONTAINER (bar),toolbar);
18556N/A+ gtk_container_set_border_width (GTK_CONTAINER (bar), 0);
18556N/A+ button_vbox = gtk_vbox_new (FALSE, 0);
18556N/A+ gtk_widget_show (button_vbox);
18556N/A+ gtk_button_set_relief (GTK_BUTTON (close), GTK_RELIEF_NONE);
18556N/A+ gtk_widget_set_tooltip_text (close,
18556N/A+ _("Close Time Slider and return to original directory"));
18556N/A+ G_CALLBACK (close_clicked_callback),
18556N/A+ image = gtk_image_new_from_stock (GTK_STOCK_CLOSE,
18556N/A+ gtk_container_add (GTK_CONTAINER (close), image);
18556N/A+ gtk_box_pack_start (GTK_BOX (button_vbox), close, FALSE, FALSE, 0);
18556N/A+ gtk_button_set_relief (GTK_BUTTON (delete), GTK_RELIEF_NONE);
18556N/A+ gtk_widget_set_tooltip_text (delete,
18556N/A+ _("Take a zfs snapshot of this directory now"));
18556N/A+ G_CALLBACK (delete_clicked_callback),
18556N/A+ GtkIconTheme *it = gtk_icon_theme_get_default ();
18556N/A+ GdkPixbuf * pb = gtk_icon_theme_load_icon (it,
18556N/A+ GTK_ICON_LOOKUP_GENERIC_FALLBACK,
18556N/A+ bar->priv->delete_image = gtk_image_new_from_pixbuf (pb);
18556N/A+ bar->priv->camera_image = gtk_image_new_from_file (path);
18556N/A+ gtk_widget_show (bar->priv->delete_image);
18556N/A+ gtk_widget_show (bar->priv->camera_image);
18556N/A+ gtk_container_add (GTK_CONTAINER (delete), bar->priv->camera_image);
18556N/A+ gtk_box_pack_end (GTK_BOX (button_vbox), delete, FALSE, FALSE, 0);
18556N/A+ gtk_box_pack_end (GTK_BOX (hbox), button_vbox, FALSE, FALSE, 0);
18556N/A+ bar->priv->delete_button = delete;
18556N/A+ bar->priv->scale = timescale_new();
18556N/A+ g_signal_connect (bar->priv->scale,
18556N/A+ G_CALLBACK (slider_moved_callback),
18556N/A+ gtk_widget_show (bar->priv->scale);
18556N/A+ gtk_box_pack_start (GTK_BOX (hbox), bar->priv->scale, TRUE, TRUE, 0);
18556N/A+nautilus_zfs_bar_get_dir (NautilusZfsBar* bar)
18556N/A+ g_return_val_if_fail (NAUTILUS_IS_ZFS_BAR (bar), NULL);
18556N/A+static void snapshot_data_ready (NautilusDirectory *dir,
18556N/A+ NautilusWindow *window = (NautilusWindow*)callback_data;
18556N/A+ g_return_if_fail (NAUTILUS_IS_WINDOW (window));
18556N/A+ slot = nautilus_window_get_active_slot (window);
18556N/A+ location = nautilus_window_slot_get_location (slot);
18556N/A+ dir_location = nautilus_directory_get_location (dir);
18556N/A+ if (g_cancellable_is_cancelled (cancellable) && g_file_equal (location, dir_location))
18556N/A+ nautilus_navigation_window_set_spinner_active (NAUTILUS_NAVIGATION_WINDOW (window), FALSE);
18556N/A+ nautilus_navigation_window_set_restore_icon ( NAUTILUS_NAVIGATION_WINDOW (window), RESTORE_NO);
18556N/A+ else if (g_file_equal (location, dir_location))
18556N/A+ char *path = g_file_get_path (dir_location);
18556N/A+ g_cancellable_cancel (cancellable);
18556N/A+ nautilus_window_slot_set_allow_stop (slot, FALSE);
18556N/A+ nautilus_navigation_window_set_restore_icon ( NAUTILUS_NAVIGATION_WINDOW (window),
18556N/A+ nautilus_directory_has_snapshots (dir) ? RESTORE_NORMAL : RESTORE_NO);
18556N/A+ if (nautilus_directory_has_snapshots (dir))
18556N/A+ nautilus_window_allow_restore (window, TRUE);
18556N/A+ nautilus_window_allow_restore (window, FALSE);
18556N/A+ g_object_unref (dir_location);
18556N/A+void nautilus_zfs_bar_cancel_tasks (NautilusWindow *window)
18556N/A+ if (NAUTILUS_IS_WINDOW (window))
18556N/A+ if (NAUTILUS_IS_WINDOW_SLOT (window->details->active_slot))
18556N/A+ NautilusDirectory *directory = NULL;
18556N/A+ g_cancellable_cancel (window->details->active_slot->find_zfs_snapshots_cancellable);
18556N/A+ g_object_unref (window->details->active_slot->find_zfs_snapshots_cancellable);
18556N/A+ window->details->active_slot->find_zfs_snapshots_cancellable = NULL;
18556N/A+ directory = nautilus_directory_get (window->details->active_slot->location);
18556N/A+ nautilus_directory_cancel_restore_info (directory);
18556N/A+ nautilus_directory_unref (directory);
18556N/A+ if (NAUTILUS_IS_NAVIGATION_WINDOW (window))
18556N/A+ NautilusZfsBar *bar = NAUTILUS_ZFS_BAR (NAUTILUS_NAVIGATION_WINDOW (window)->zfs_bar);
18556N/A+ monitor_zfs_snap_directory_cancel (bar->priv->zfs_dir_monitor_data);
18556N/A+ bar->priv->zfs_dir_monitor_data = NULL;
18556N/A+void nautilus_zfs_bar_hide (NautilusZfsBar *bar)
18556N/A+ bar->priv->explicit_user_hide = TRUE;
18556N/A+ close_clicked_callback (NULL, bar);
18556N/A+nautilus_zfs_bar_display (NautilusZfsBar *bar,
18556N/A+ gboolean time_slider_enabled = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER);
18556N/A+ gboolean visible = GTK_WIDGET_VISIBLE (GTK_WIDGET (bar));
18556N/A+ gboolean enable_button = FALSE;
18556N/A+ * if bar was previously displayed and in same tab
18556N/A+ * NOTE : action_restore_callback display bar when enabled
18556N/A+ close_clicked_callback (NULL, bar);
18556N/A+ if (new_dir == bar->priv->dir)
18556N/A+ if (nautilus_directory_is_a_snapshot_dir_of (new_dir, bar->priv->dir) || new_dir == bar->priv->dir)
18556N/A+ NautilusWindowSlot *slot = nautilus_window_get_active_slot (window);
18556N/A+ if (bar->priv->is_setup && slot == bar->priv->slot && time_slider_enabled) /* check if we can redisplay the bar */
18556N/A+ if (nautilus_directory_is_a_snapshot_dir_of (new_dir, bar->priv->dir) && !bar->priv->explicit_user_hide)
18556N/A+ if (bar->priv->explicit_user_hide)
18556N/A+ if (new_dir == bar->priv->dir)
18556N/A+ { /* icon and throbber set is snapshot_data_ready */
18556N/A+ if (enable_button) /* if button enabled set the icon to normal */
18556N/A+ nautilus_navigation_window_set_restore_icon (NAUTILUS_NAVIGATION_WINDOW (window), RESTORE_NORMAL);
18556N/A+ nautilus_window_allow_restore (window, enable_button);
18556N/A+ gtk_widget_show (GTK_WIDGET (bar));
18556N/A+ nautilus_zfs_set_snap (bar, new_dir);
18556N/A+ gtk_widget_hide (GTK_WIDGET (bar));
18556N/A+ gtk_toggle_action_set_active (bar->priv->action, FALSE);
18556N/A+ g_cancellable_cancel (cancellable);
18556N/A+ g_cancellable_reset (cancellable);
18556N/A+ nautilus_navigation_window_set_restore_icon (NAUTILUS_NAVIGATION_WINDOW (window), RESTORE_SEARCH);
18556N/A+ nautilus_window_slot_set_allow_stop (nautilus_window_get_active_slot (window), TRUE);
18556N/A+ nautilus_directory_get_snapshots_async (new_dir,
18556N/A+ GFile *file = nautilus_directory_get_location (new_dir);
18556N/A+ char *path = g_file_get_path (file);
18556N/A+ printf ("nautilus_zfs_bar_display %s\nenable_button : %s, show : %s, do_cancel : %s, do_scan : %s\n\n",
18556N/A+ enable_button ? "true" : "false",
18556N/A+void nautilus_zfs_set_snap (NautilusZfsBar *bar,
18556N/A+ file = nautilus_directory_get_location (dir);
18556N/A+ path = g_file_get_path (file);
18556N/A+ ts_realpath (path, real_path);
18556N/A+ if (ts_is_in_remote_backup (real_path))
18556N/A+ if (ts_is_in_snapshot (real_path))
18556N/A+ snap_list = nautilus_directory_get_snapshots (bar->priv->dir);
18556N/A+ match = g_list_find_custom (snap_list, real_path, (GCompareFunc)match_func);
18556N/A+ timescale_set_position (TIMESCALE (bar->priv->scale), match ? ((ZfsDataSet*)match->data)->mountpoint : NULL);
18556N/A+/* printf ("nautilus_zfs_set_snap current_path %s real_path %s match %s\n", bar->priv->current_path, real_path,
18556N/A+ match ? "found" : "not found");*/
18556N/A+ if (bar->priv->current_path && (strcmp (bar->priv->current_path, real_path) != 0))
18556N/A+static void snapshot_data_ready_from_change (NautilusDirectory *dir,
18556N/A+ NautilusZfsBar *bar = NAUTILUS_ZFS_BAR (callback_data);
18556N/A+ snapshot_data_ready (dir, cancellable, bar->priv->slot->window);
18556N/A+ gtk_widget_set_sensitive (bar->priv->scale, TRUE);
18556N/A+static void zfs_dir_change_callback (ZfsSnapDirMonitor *monitor_data,
18556N/A+ gtk_widget_set_sensitive (bar->priv->scale, FALSE);
18556N/A+ g_cancellable_reset (bar->priv->slot->find_zfs_snapshots_cancellable);
18556N/A+ nautilus_navigation_window_set_restore_icon (NAUTILUS_NAVIGATION_WINDOW (bar->priv->slot->window), RESTORE_SEARCH);
18556N/A+ nautilus_window_slot_set_allow_stop (bar->priv->slot, TRUE);
18556N/A+ nautilus_directory_get_snapshots_async (bar->priv->dir,
18556N/A+ snapshot_data_ready_from_change,
18556N/A+ bar->priv->slot->find_zfs_snapshots_cancellable,
18556N/A+nautilus_zfs_bar_setup (NautilusZfsBar* bar,
18556N/A+ NautilusWindowSlot *active_slot,
18556N/A+ bar->priv->slot = active_slot;
18556N/A+ bar->priv->explicit_user_hide = FALSE;
18556N/A+ file = nautilus_directory_get_location (dir);
18556N/A+ path = g_file_get_path (file);
18556N/A+ zfs_dir = ts_get_snapshot_dir (path);
18556N/A+ bar->priv->zfs_dir_monitor_data = monitor_zfs_snap_directory (zfs_dir, (ZfsDirChangeCallback) zfs_dir_change_callback, bar);
18556N/A+ nautilus_zfs_set_snap (bar, dir);
18556N/A+zfs_bar_show_column (GtkWidget *widget, gpointer user_data)
18556N/A+ gboolean restore_col_visible = FALSE;
18556N/A+ visible_columns = eel_preferences_get_string_array (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS);
18556N/A+ /* convert visible_columns in ptr array without "restore_info" */
18556N/A+ if (strcmp (visible_columns [i], "restore_info") == 0)
18556N/A+ g_ptr_array_add (ret, g_strdup (visible_columns [i]));
18556N/A+ if (!GTK_WIDGET_VISIBLE (widget)) /* hide bar remove pref */
18556N/A+ col_array = (char **)g_ptr_array_free (ret, FALSE);
18556N/A+ eel_preferences_set_string_array (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS, col_array);
18556N/A+ if (GTK_WIDGET_VISIBLE (widget))
18556N/A+ g_ptr_array_add (ret,strdup ("restore_info"));
18556N/A+ col_array = (char **)g_ptr_array_free (ret, FALSE);
18556N/A+ eel_preferences_set_string_array (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS, col_array);
18556N/A+zfs_bar_hidden (GtkWidget *widget, gpointer user_data)
18556N/A+ NautilusZfsBar *bar = NAUTILUS_ZFS_BAR (user_data);
18556N/A+ monitor_zfs_snap_directory_cancel (bar->priv->zfs_dir_monitor_data);
18556N/A+ bar->priv->zfs_dir_monitor_data = NULL;
18556N/A+ nautilus_directory_cancel_restore_info (bar->priv->dir);
18556N/A+ bar = g_object_new (NAUTILUS_TYPE_ZFS_BAR, NULL);
18556N/A+ g_signal_connect_object (bar, "show", G_CALLBACK (zfs_bar_show_column), bar, NULL);
18556N/A+ g_signal_connect_object (bar, "hide", G_CALLBACK (zfs_bar_show_column), bar, NULL);
18556N/A+ g_signal_connect_object (bar, "hide", G_CALLBACK (zfs_bar_hidden), bar, NULL);
18556N/A+ zfs_bar_show_column (GTK_WIDGET (bar), NULL);
18556N/A+ ts_is_restore_column_enabled_init ();
18556N/A+ zfs_bar = NAUTILUS_ZFS_BAR (bar);
18556N/A+#define NAUTILUS_TYPE_ZFS_BAR (nautilus_zfs_bar_get_type ())
18556N/A+#define NAUTILUS_ZFS_BAR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), NAUTILUS_TYPE_ZFS_BAR, NautilusZfsBar))
18556N/A+#define NAUTILUS_ZFS_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), NAUTILUS_TYPE_ZFS_BAR, NautilusZfsBarClass))
18556N/A+#define NAUTILUS_IS_ZFS_BAR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), NAUTILUS_TYPE_ZFS_BAR))
18556N/A+#define NAUTILUS_IS_ZFS_BAR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), NAUTILUS_TYPE_ZFS_BAR))
18556N/A+#define NAUTILUS_ZFS_BAR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NAUTILUS_TYPE_ZFS_BAR, NautilusZfsBarClass))
18556N/A+typedef struct NautilusZfsBarPrivate NautilusZfsBarPrivate;
18556N/A+ GtkEventBoxClass parent_class;
18556N/A+GType nautilus_zfs_bar_get_type (void) G_GNUC_CONST;
18556N/A+GtkWidget *nautilus_zfs_bar_new ();
18556N/A+void nautilus_zfs_bar_setup (NautilusZfsBar* bar,
18556N/A+ NautilusWindowSlot *active_slot,
18556N/A+void nautilus_zfs_bar_display (NautilusZfsBar *bar,
18556N/A+void nautilus_zfs_set_snap (NautilusZfsBar *bar,
18556N/A+void nautilus_zfs_bar_remove_and_skip_snap
18556N/A+ (NautilusZfsBar *bar, char *path);
18556N/A+void nautilus_zfs_bar_hide (NautilusZfsBar *bar);
18556N/A+void nautilus_zfs_bar_cancel_tasks (NautilusWindow *window);
18556N/A+NautilusDirectory * nautilus_zfs_bar_get_dir (NautilusZfsBar* bar);
18556N/A+#endif /* __NAUTILUS_ZFS_BAR_H */
18556N/A+ * Copyright (C) 2010 Sun Microsystems (Erwann Chenede)
18556N/A+static guint signals[LAST_SIGNAL];
18556N/A+G_DEFINE_TYPE (TimeScale, timescale, GTK_TYPE_HBOX)
18556N/A+#define TIMESCALE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_TIMESCALE, TimeScalePrivate))
18556N/A+timescale_expose (GtkWidget *widget,
18556N/A+ GdkEventExpose *event, TimeScale *ts);
18556N/A+query_tooltip (GtkWidget *widget,
18556N/A+key_pressed (GtkWidget *widget, GdkEventKey *event, TimeScale *ts);
18556N/A+button_pressed (GtkWidget *widget, GdkEventButton *event, TimeScale *ts);
18556N/A+static void print_snaps (GList *list)
18556N/A+ Snap *snap = (Snap*) tmp->data;
18556N/A+ printf ("=-= %d =-=\nname: %s\nmountpoint: %s\nmtime: %s\nused_space: %s\n",i,
18556N/A+ snap->name, snap->mountpoint, snap->mtime_str, snap->used_space_str);
18556N/A+static char * get_num_snap_string (GList *snap_list)
18556N/A+ for (tmp; tmp; tmp = tmp->next)
18556N/A+ Snap *snap = ((Snap*) tmp->data);
18556N/A+ size_str = g_format_size_for_display (total);
18556N/A+ num_rev = g_strdup_printf (_("%d %s\n%s"),
18556N/A+ ngettext ("snapshot", "snapshots", i),
18556N/A+static char * get_date (GDate *date)
18556N/A+ return g_strdup_printf ("%d/%d/%d", g_date_get_day (date),
18556N/A+static GList *trim_list_by_date (GList *list, int type)
18556N/A+ g_date_set_time_t (&now, time_now);
18556N/A+ g_date_set_time_t (&range_min, time_now);
18556N/A+ weekday = g_date_get_weekday(&now);
18556N/A+ days_diff = weekday - G_DATE_MONDAY;
18556N/A+ memcpy (&range_max, &range_min, sizeof (GDate));
18556N/A+ g_date_subtract_days (&range_min, days_diff);
18556N/A+ g_date_subtract_days (&range_min, 7);
18556N/A+ weekday = g_date_get_weekday(&range_min);
18556N/A+ days_diff = weekday - G_DATE_MONDAY;
18556N/A+ g_date_subtract_days (&range_min, days_diff);
18556N/A+ memcpy (&range_max, &range_min, sizeof (GDate));
18556N/A+ g_date_add_days (&range_max, 6);
18556N/A+ g_date_set_dmy (&range_min, 1, g_date_get_month (&now),
18556N/A+ g_date_set_time_t (&range_max, time_now);
18556N/A+ g_date_subtract_months (&range_min, 1);
18556N/A+ g_date_set_dmy (&range_min, 1,
18556N/A+ g_date_get_month (&range_min),
18556N/A+ g_date_get_year (&range_min));
18556N/A+ memcpy (&range_max, &range_min, sizeof (GDate));
18556N/A+ g_date_add_days (&range_max, g_date_get_days_in_month (g_date_get_month (&range_min), g_date_get_year (&range_min)) - 1);
18556N/A+ Snap* snap = (Snap*) list->data;
18556N/A+ g_date_set_time_t (&then, snap->mtime);
18556N/A+ if (g_date_get_julian (&now) - g_date_get_julian (&then) == days_diff)
18556N/A+ return_list = g_list_append (return_list, snap);
18556N/A+ if (g_date_compare (&then, &range_min) >= 0 && g_date_compare (&then, &range_max) <= 0)
18556N/A+ return_list = g_list_append (return_list, snap);
18556N/A+ g_list_free (ts->priv->today);
18556N/A+ g_list_free (ts->priv->yesterday);
18556N/A+ g_list_free (ts->priv->this_week);
18556N/A+ g_list_free (ts->priv->last_week);
18556N/A+ g_list_free (ts->priv->this_month);
18556N/A+ g_list_free (ts->priv->last_month);
18556N/A+ GtkListStore* periods = gtk_list_store_new (3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_POINTER);
18556N/A+ gtk_list_store_append (periods, &iter);
18556N/A+ gtk_list_store_set (periods, &iter, 0, ALL, 1, _("All"), 2, ts->priv->all_snaps, -1);
18556N/A+ ts->priv->today = trim_list_by_date (ts->priv->all_snaps, TODAY);
18556N/A+ gtk_list_store_append (periods, &iter);
18556N/A+ gtk_list_store_set (periods, &iter, 0, TODAY, 1, _("Today"), 2, ts->priv->today, -1);
18556N/A+ ts->priv->yesterday = trim_list_by_date (ts->priv->all_snaps, YESTERDAY);
18556N/A+ gtk_list_store_append (periods, &iter);
18556N/A+ gtk_list_store_set (periods, &iter, 0, YESTERDAY, 1, _("Yesterday"), 2, ts->priv->yesterday, -1);
18556N/A+ ts->priv->this_week = trim_list_by_date (ts->priv->all_snaps, THIS_WEEK);
18556N/A+ gtk_list_store_append (periods, &iter);
18556N/A+ gtk_list_store_set (periods, &iter, 0, THIS_WEEK, 1, _("This Week"), 2, ts->priv->this_week, -1);
18556N/A+ ts->priv->last_week = trim_list_by_date (ts->priv->all_snaps, LAST_WEEK);
18556N/A+ gtk_list_store_append (periods, &iter);
18556N/A+ gtk_list_store_set (periods, &iter, 0, LAST_WEEK, 1, _("Last Week"), 2, ts->priv->last_week, -1);
18556N/A+ ts->priv->this_month = trim_list_by_date (ts->priv->all_snaps, THIS_MONTH);
18556N/A+ gtk_list_store_append (periods, &iter);
18556N/A+ gtk_list_store_set (periods, &iter, 0, THIS_MONTH, 1, _("This Month"), 2, ts->priv->this_month, -1);
18556N/A+ ts->priv->last_month = trim_list_by_date (ts->priv->all_snaps, LAST_MONTH);
18556N/A+ gtk_list_store_append (periods, &iter);
18556N/A+ gtk_list_store_set (periods, &iter, 0, LAST_MONTH, 1, _("Last Month"), 2, ts->priv->last_month, -1);
18556N/A+period_changed (GtkComboBox *combo,
18556N/A+ if (!gtk_combo_box_get_active_iter (combo, &iter))
18556N/A+ model = gtk_combo_box_get_model (combo);
18556N/A+ gtk_tree_model_get (model, &iter, 0, &type, 2, &period, -1);
18556N/A+ if (ts->priv->current_period == type)
18556N/A+ ts->priv->current_period = type;
18556N/A+ ts->priv->num_snaps = g_list_length (ts->priv->snaps);
18556N/A+ ts->priv->bar_x_end = g_new (int, g_list_length (ts->priv->snaps));
18556N/A+ g_free (ts->priv->num_rev_string);
18556N/A+ ts->priv->num_rev_string = get_num_snap_string (ts->priv->snaps);
18556N/A+ gtk_label_set_label (GTK_LABEL (ts->priv->info), ts->priv->num_rev_string);
18556N/A+ gtk_widget_set_size_request (ts->priv->darea, ((BAR_SPACE + BAR_W_MAX ) * ts->priv->num_snaps) + PADDING * 2, 60);
18556N/A+ gtk_widget_queue_draw (ts->priv->darea);
18556N/A+ ts->priv = TIMESCALE_GET_PRIVATE (ts);
18556N/A+ ts->priv->num_rev_string = NULL;
18556N/A+ ts->priv->current_period = ALL;
18556N/A+ ts->priv->key_pressed = FALSE;
18556N/A+ gtk_box_set_homogeneous (GTK_BOX (ts), FALSE);
18556N/A+ ts->priv->darea = gtk_drawing_area_new ();
18556N/A+ g_signal_connect(ts->priv->darea, "expose-event",
18556N/A+ G_CALLBACK(timescale_expose), ts);
18556N/A+ g_signal_connect (ts->priv->darea, "query-tooltip",
18556N/A+ G_CALLBACK (query_tooltip), ts);
18556N/A+ g_signal_connect(ts->priv->darea, "key-press-event",
18556N/A+ g_signal_connect(ts->priv->darea, "button_press_event",
18556N/A+ G_CALLBACK(button_pressed), ts);
18556N/A+ GTK_WIDGET_SET_FLAGS (GTK_WIDGET (ts->priv->darea), GTK_CAN_FOCUS);
18556N/A+ gtk_widget_add_events (GTK_WIDGET (ts->priv->darea), GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK);
18556N/A+ g_object_set (G_OBJECT (ts->priv->darea), "has-tooltip", TRUE, NULL);
18556N/A+ gtk_widget_set_size_request (GTK_WIDGET (ts->priv->darea), -1, 60);
18556N/A+ ts->priv->scrolled = gtk_scrolled_window_new (NULL, NULL);
18556N/A+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (ts->priv->scrolled),
18556N/A+ GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
18556N/A+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (ts->priv->scrolled),
18556N/A+ gtk_viewport_set_shadow_type (GTK_VIEWPORT (gtk_bin_get_child (GTK_BIN (ts->priv->scrolled))), GTK_SHADOW_NONE);
18556N/A+ gtk_widget_show (ts->priv->scrolled);
18556N/A+ ts->priv->label_tip = gtk_label_new ("Hello");
18556N/A+ gtk_widget_set_name (ts->priv->label_tip, "gtk-tooltip");
18556N/A+ g_object_ref_sink (ts->priv->label_tip);
18556N/A+ gtk_label_set_justify (GTK_LABEL (ts->priv->label_tip), GTK_JUSTIFY_CENTER);
18556N/A+ /* setup period combo and snap info */
18556N/A+ vbox = gtk_vbox_new (FALSE, 5);
18556N/A+ ts->priv->period = gtk_combo_box_new ();
18556N/A+ renderer = gtk_cell_renderer_text_new ();
18556N/A+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (ts->priv->period),
18556N/A+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (ts->priv->period), renderer,
18556N/A+ g_signal_connect (ts->priv->period, "changed", G_CALLBACK (period_changed), ts);
18556N/A+ ts->priv->info = gtk_label_new ("info\ninfo");
18556N/A+ gtk_label_set_justify (GTK_LABEL (ts->priv->info), GTK_JUSTIFY_CENTER);
18556N/A+ gtk_box_pack_start (GTK_BOX (vbox), ts->priv->period, FALSE, FALSE, 5);
18556N/A+ gtk_box_pack_end (GTK_BOX (vbox), ts->priv->info, FALSE, FALSE, 5);
18556N/A+ gtk_box_pack_start (GTK_BOX (ts), vbox, FALSE, FALSE, 0);
18556N/A+ gtk_box_pack_start (GTK_BOX (ts), ts->priv->scrolled, TRUE, TRUE, 0);
18556N/A+ GTK_WIDGET_SET_FLAGS (GTK_WIDGET (ts), GTK_CAN_FOCUS);
18556N/A+ gtk_widget_show_all (GTK_WIDGET (ts));
18556N/A+get_max_snap_size (GList *snaps)
18556N/A+ if (snap->used_space > max_size)
18556N/A+ last_snap->name = g_strdup (_("Now"));
18556N/A+ last_snap->mountpoint = g_strdup (_("None"));
18556N/A+ last_snap->mtime_str = g_strdup (_("Now"));
18556N/A+ last_snap->mtime_short_str = g_strdup (_("Now"));
18556N/A+ last_snap->used_space_str = g_strdup (_("-"));
18556N/A+ last_snap->type_str = g_strdup (_("Current Directory"));
18556N/A+static char *get_type_str (SnapType type)
18556N/A+ return g_strdup (_("Automatic Snapshot"));
18556N/A+ return g_strdup (_("Manual Snapshot"));
18556N/A+ return g_strdup (_("Automatic Remote Backup"));
18556N/A+ return g_strdup (_("Manual Remote Backup"));
18556N/A+ if (strstr (snap->name, "zfs-auto-snap"))
18556N/A+ if (strstr (snap->name, "zfs-auto-snap"))
18556N/A+ snap = (ZfsDataSet*) tmp_list->data;
18556N/A+ ts_shot->name = g_strdup (snap->name);
18556N/A+ ts_shot->mountpoint = g_strdup (snap->mountpoint);
18556N/A+ ts_shot->mtime_str = g_strdup (snap->mtime_str);
18556N/A+ ts_shot->mtime_short_str = nautilus_date_as_string (snap->mtime, TRUE);
18556N/A+ ts_shot->used_space_str = g_strdup (snap->used_space_str);
18556N/A+ ts_shot->used_space = snap->used_space;
18556N/A+ ts_shot->type = get_type (snap);
18556N/A+ ts_shot->type_str = get_type_str (ts_shot->type);
18556N/A+ new_list = g_list_append (new_list, ts_shot);
18556N/A+ g_free (snap->mtime_short_str);
18556N/A+ g_free (snap->used_space_str);
18556N/A+ free_snap ((Snap*) tmp_list->data);
18556N/A+timescale_set_snapshots (TimeScale* ts, GList *list, int init_position)
18556N/A+ g_free (ts->priv->num_rev_string);
18556N/A+ free_snap_list (ts->priv->all_snaps);
18556N/A+ ts->priv->all_snaps = copy_zfs_list (list);
18556N/A+ ts->priv->all_snaps = g_list_append (ts->priv->all_snaps, get_now_snap(ts));
18556N/A+ ts->priv->snaps = ts->priv->all_snaps;
18556N/A+ ts->priv->num_snaps = g_list_length (ts->priv->snaps);
18556N/A+ ts->priv->bar_x_end = g_new (int, g_list_length (ts->priv->snaps));
18556N/A+ ts->priv->current_pos = ts->priv->num_snaps - 1;
18556N/A+ if (init_position >= 0 && init_position <= ts->priv->num_snaps - 1)
18556N/A+ ts->priv->current_pos = init_position;
18556N/A+ ts->priv->num_rev_string = get_num_snap_string (ts->priv->snaps);
18556N/A+ gtk_label_set_label (GTK_LABEL (ts->priv->info), ts->priv->num_rev_string);
18556N/A+ ts->priv->current_period = ALL;
18556N/A+ gtk_combo_box_set_model (GTK_COMBO_BOX (ts->priv->period), GTK_TREE_MODEL (create_periods (ts)));
18556N/A+ gtk_combo_box_set_active (GTK_COMBO_BOX (ts->priv->period), ALL);
18556N/A+ gtk_widget_set_size_request (ts->priv->darea, ((BAR_SPACE + BAR_W_MAX) * ts->priv->num_snaps) + PADDING * 2, 60);
18556N/A+ ts->priv->scrollbar_set = FALSE;
18556N/A+ return g_object_new (TYPE_TIMESCALE, NULL);
18556N/A+static void draw_type (cairo_t *cr, int x_c, int y_c, int w, SnapType type)
18556N/A+ cairo_line_to (cr,x+w/2,y_c-w/2);
18556N/A+ cairo_rectangle (cr, x, y, w, w/2);*/
18556N/A+ cairo_arc (cr, x_c, y_c, w/2, M_PI, M_PI*2);
18556N/A+ /* cairo_rectangle (cr, x, y, w, w); */
18556N/A+ cairo_line_to (cr,x+w/2,y_c+w/2);
18556N/A+ cairo_line_to (cr,x+w/2,y_c-w/2);
18556N/A+ cairo_arc (cr, x_c, y_c, w/2, 0.0, M_PI*2);
18556N/A+static void draw_rounded_bar (cairo_t *cr, int x, int y, double w, double h, int r)
18556N/A+ if (h == 0 || h < (w / 2) + r)
18556N/A+ cairo_arc (cr, x+(w/2), y+.5, w/2, M_PI, M_PI*2);
18556N/A+ cairo_arc (cr, x+(w/2), y+(w/2), w/2, M_PI, M_PI*2); /* arc from H to C */
18556N/A+ cairo_line_to (cr,x+w,y+h-r); /* Move to D */
18556N/A+ cairo_curve_to(cr, x+w,y+h,x+w,y+h,x+w-r,y+h); /* Curve to E */
18556N/A+ cairo_line_to(cr, x+r,y+h); /* Line to F */
18556N/A+ cairo_curve_to(cr, x,y+h,x,y+h,x,y+h-r); /* Curve to G */
18556N/A+ cairo_line_to(cr, x,y+(w/2)); /* Line to H */
18556N/A+static void draw_rounded_rec (cairo_t *cr, int x, int y, double w, double h, int r)
18556N/A+ cairo_line_to (cr, x + w, y -.5);
18556N/A+ cairo_move_to (cr,x+r,y); /* Move to A */
18556N/A+ cairo_line_to (cr,x+w-r,y); /* Straight line to B */
18556N/A+ cairo_curve_to (cr,x+w,y,x+w,y,x+w,y+r); /* Curve to C, Control points are both at Q */
18556N/A+ cairo_line_to (cr,x+w,y+h-r); /* Move to D */
18556N/A+ cairo_curve_to(cr, x+w,y+h,x+w,y+h,x+w-r,y+h); /* Curve to E */
18556N/A+ cairo_line_to(cr, x+r,y+h); /* Line to F */
18556N/A+ cairo_curve_to(cr, x,y+h,x,y+h,x,y+h-r); /* Curve to G */
18556N/A+ cairo_line_to(cr, x,y+r); /* Line to H */
18556N/A+ cairo_curve_to(cr, x,y,x,y,x+r,y); /* Curve to A */
18556N/A+set_cr_color (GtkWidget *widget, cairo_t* cr, SnapType type, double alpha)
18556N/A+ gdk_cairo_set_source_color (cr, &widget->style->dark[GTK_STATE_SELECTED]);
18556N/A+ gdk_cairo_set_source_color (cr, &widget->style->light[GTK_STATE_SELECTED]);
18556N/A+ gdk_cairo_set_source_color (cr, &widget->style->black);
18556N/A+int get_snap_index_from_coord (TimeScale* ts, gdouble x, gdouble y)
18556N/A+ for (i = 0; i < ts->priv->num_snaps; i++)
18556N/A+ if (x < ts->priv->bar_x_end[i])
18556N/A+timescale_expose (GtkWidget *widget,
18556N/A+ GdkEventExpose *event, TimeScale* ts)
18556N/A+ cairo_t *cr = gdk_cairo_create (widget->window);
18556N/A+ PangoLayout *layout = pango_cairo_create_layout (cr);
18556N/A+ PangoFontDescription *timeline_font = NULL;
18556N/A+ if (gtk_widget_has_focus (widget))
18556N/A+ gtk_paint_focus (widget->style, widget->window, gtk_widget_get_state (widget),
18556N/A+ /* smaller font for timeline */
18556N/A+ timeline_font = pango_font_description_copy_static (widget->style->font_desc);
18556N/A+ pango_font_description_set_size (timeline_font, pango_font_description_get_size (timeline_font) - (PANGO_SCALE*2));
18556N/A+ /* determine space needed for 2 lines of text + padding with
18556N/A+ * current widget->style->font_desc
18556N/A+ * and widget->style->font_desc - 1*/
18556N/A+ context = gtk_widget_get_pango_context (widget);
18556N/A+ metrics = pango_context_get_metrics (context, widget->style->font_desc,
18556N/A+ pango_context_get_language (context));
18556N/A+ ascent = pango_font_metrics_get_ascent (metrics);
18556N/A+ descent = pango_font_metrics_get_descent (metrics);
18556N/A+ pango_font_metrics_unref (metrics);
18556N/A+ line_height = PANGO_PIXELS (ascent + descent);
18556N/A+ metrics = pango_context_get_metrics (context, timeline_font,
18556N/A+ pango_context_get_language (context));
18556N/A+ ascent = pango_font_metrics_get_ascent (metrics);
18556N/A+ descent = pango_font_metrics_get_descent (metrics);
18556N/A+ pango_font_metrics_unref (metrics);
18556N/A+ timeline_line_height = PANGO_PIXELS (ascent + descent);
18556N/A+ num_view_snaps = ts->priv->num_snaps;
18556N/A+ max_size = log ((float)get_max_snap_size (view_snaps));
18556N/A+ bar_max_h_inc = max_size / bar_max_h;
18556N/A+ adj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (ts->priv->scrolled));
18556N/A+ gtk_adjustment_set_value (adj, adj->upper - adj->page_size);
18556N/A+ gtk_adjustment_set_step_increment(adj, BAR_W_MAX + BAR_SPACE);
18556N/A+ gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (ts->priv->scrolled), adj);
18556N/A+ ts->priv->scrollbar_set = TRUE;
18556N/A+ for (i = 0; i < num_view_snaps; i++)
18556N/A+ tmp_snap = g_list_nth_data (view_snaps, i);
18556N/A+ int rounded_radius = ROUNDED_RADIUS;
18556N/A+ if (tmp_snap->used_space != 0)
18556N/A+ height = (int) log (tmp_snap->used_space) / bar_max_h_inc;
18556N/A+ /*printf ("drawing %d height %d size %f log of size %f\n", i,
18556N/A+ tmp_snap->used_space, log (tmp_snap->used_space));*/
18556N/A+ if (height == 0 & tmp_snap->used_space != 0)
18556N/A+ if (tmp_snap->type == REMOTE_AUTOMATIC ||
18556N/A+ tmp_snap->type == REMOTE_MANUAL)
18556N/A+ height = bar_max_h - bar_max_h_inc; /* placeholder until we get rsync size */
18556N/A+ /* printf ("height %d name %s size %s\n", height, tmp_snap->name, tmp_snap->used_space_str); */
18556N/A+ if (i == ts->priv->current_pos)
18556N/A+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1);
18556N/A+ draw_rounded_rec (cr, x-1, y+2, bar_w+2, bar_max_h+8, ROUNDED_RADIUS);
18556N/A+ selected_x = x-1 + ((bar_w+2) / 2);
18556N/A+ char *selected_time_size = g_strdup_printf ("%s - %s",
18556N/A+ gdk_cairo_set_source_color (cr, widget->style->text);
18556N/A+ pango_layout_set_font_description (layout, widget->style->font_desc);
18556N/A+ pango_layout_set_text (layout, selected_time_size, -1);
18556N/A+ pango_layout_set_text (layout, tmp_snap->mtime_str, -1);
18556N/A+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.8);
18556N/A+ ts->priv->bar_x_end[i] = x + bar_w;
18556N/A+ set_cr_color (widget, cr, tmp_snap->type, 1.0);
18556N/A+ if (tmp_snap->type == LOCAL_AUTOMATIC || tmp_snap->type == LOCAL_MANUAL)
18556N/A+ if (tmp_snap->type == LOCAL_AUTOMATIC || tmp_snap->type == REMOTE_AUTOMATIC)
18556N/A+ draw_rounded_bar (cr, x, tmp_y, tmp_w, height, rounded_radius);
18556N/A+ else if (tmp_snap->type == LOCAL_MANUAL || tmp_snap->type == REMOTE_MANUAL)
18556N/A+ draw_rounded_rec (cr, x, tmp_y, tmp_w, height, rounded_radius);
18556N/A+ draw_type (cr, (x + ((bar_w+bar_space)/2)) - .5, y - (bar_max_h/2), bar_w - 4, REMOTE_MANUAL);
18556N/A+ if (tmp_snap->type == REMOTE_MANUAL || tmp_snap->type == REMOTE_AUTOMATIC || tmp_snap->type == NOW)
18556N/A+ /* ensure selected bar is visible on key press when scrollbar is enabled */
18556N/A+ if (ts->priv->current_pos != -1 && ts->priv->key_pressed)
18556N/A+ adj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (ts->priv->scrolled));
18556N/A+ ts->priv->key_pressed = FALSE;
18556N/A+ gtk_adjustment_set_value (adj, selected_x - BAR_W_MAX);
18556N/A+ gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (ts->priv->scrolled), adj);
18556N/A+ if (adj->value + adj->page_size < selected_x)
18556N/A+ gtk_adjustment_set_value (adj, (selected_x + BAR_W_MAX) - adj->page_size);
18556N/A+ gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (ts->priv->scrolled), adj);
18556N/A+ pango_layout_set_font_description (layout, widget->style->font_desc);
18556N/A+ /* try to center the selected text */
18556N/A+ pango_layout_get_pixel_extents (layout,NULL, &logical_rect);
18556N/A+ if (ts->priv->current_pos != -1 && selected_x != -1)
18556N/A+ int right_space = last_bar_x - selected_x;
18556N/A+ /* no space on the left, left align */
18556N/A+ /* no space on the right, right align */
18556N/A+ cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1);
18556N/A+ gdk_cairo_set_source_color (cr, widget->style->text);
18556N/A+ cairo_move_to(cr, selected_x, PADDING);
18556N/A+ pango_cairo_show_layout (cr, layout);
18556N/A+ * draw additional is possible starting with newest first */
18556N/A+ /* Can the oldest time fit ? */
18556N/A+ tmp_snap = g_list_nth_data (view_snaps, 0);
18556N/A+ pango_layout_set_text (layout, tmp_snap->mtime_short_str, -1);
18556N/A+ pango_layout_set_font_description (layout, timeline_font);
18556N/A+ pango_layout_get_pixel_extents (layout,NULL, &logical_rect);
18556N/A+ gdk_cairo_set_source_color (cr, widget->style->text_aa);
18556N/A+ gdk_cairo_set_source_color (cr, widget->style->text_aa);
18556N/A+ pango_cairo_show_layout (cr, layout);
18556N/A+ tmp_snap = g_list_nth_data (view_snaps, num_view_snaps-1);
18556N/A+ pango_layout_set_text (layout, tmp_snap->mtime_short_str, -1);
18556N/A+ pango_layout_get_pixel_extents (layout,NULL, &logical_rect);
18556N/A+ x -= bar_space + bar_w/2 + 0.5;
18556N/A+ pango_cairo_show_layout (cr, layout);
18556N/A+ /* now find the next bar that we can to the timeline and loop */
18556N/A+ int bar = get_snap_index_from_coord (ts, remaining_x_start, 0);
18556N/A+ tmp_snap = g_list_nth_data (view_snaps, bar);
18556N/A+ pango_layout_set_text (layout, tmp_snap->mtime_short_str, -1);
18556N/A+ pango_layout_get_pixel_extents (layout,NULL, &logical_rect);
18556N/A+ /* get middle x coord of current bar */
18556N/A+ x = PADDING + ((bar_w + bar_space) * bar) + bar_w / 2;
18556N/A+ pango_cairo_show_layout (cr, layout);
18556N/A+ remaining_timeline_space = remaining_x_end - remaining_x_start;
18556N/A+ if (remaining_timeline_space <= 0)
18556N/A+ pango_font_description_free(timeline_font);
18556N/A+key_pressed (GtkWidget *widget, GdkEventKey *event, TimeScale* ts)
18556N/A+ if (ts->priv->current_pos >= 1)
18556N/A+ gtk_widget_queue_draw (widget);
18556N/A+ g_signal_emit (ts, signals[VALUE_CHANGED], 0);
18556N/A+ /* printf ("key_pressed back %d\n", ts->priv->current_pos); */
18556N/A+ if (ts->priv->current_pos <= ts->priv->num_snaps - 2)
18556N/A+ gtk_widget_queue_draw (widget);
18556N/A+ g_signal_emit (ts, signals[VALUE_CHANGED], 0);
18556N/A+ /* printf ("key_pressed forward %d\n", ts->priv->current_pos); */
18556N/A+int timescale_get_position (TimeScale* ts)
18556N/A+ /* translate into all_snaps position */
18556N/A+ data = g_list_nth_data (ts->priv->snaps, ts->priv->current_pos);
18556N/A+ return g_list_index (ts->priv->all_snaps, data);
18556N/A+static int match_func (ZfsDataSet *set, char *dir)
18556N/A+ return strcmp (set->mountpoint, dir);
18556N/A+timescale_set_position (TimeScale* ts, char *mountpoint)
18556N/A+ int num_snaps = g_list_length (ts->priv->all_snaps);
18556N/A+ match = g_list_find_custom (ts->priv->all_snaps, mountpoint, (GCompareFunc)match_func);
18556N/A+ pos = g_list_index (ts->priv->all_snaps, match->data);
18556N/A+ if (pos != -1 && ts->priv->current_pos != pos)
18556N/A+ if (ts->priv->current_pos != num_snaps - 1)
18556N/A+ ts->priv->current_pos = num_snaps - 1;
18556N/A+ gtk_widget_queue_draw (GTK_WIDGET (ts));
18556N/A+button_pressed (GtkWidget *widget, GdkEventButton *event, TimeScale* ts)
18556N/A+ gtk_widget_grab_focus (widget);
18556N/A+ new_pos = get_snap_index_from_coord (ts, event->x, event->y);
18556N/A+ if (new_pos != ts->priv->current_pos)
18556N/A+ ts->priv->current_pos = new_pos;
18556N/A+ /* printf ("button_pressed (%g,%g) selected %d\n", event->x, event->y, ts->priv->current_pos); */
18556N/A+ g_signal_emit (ts, signals[VALUE_CHANGED], 0);
18556N/A+ gtk_widget_queue_draw (widget);
18556N/A+query_tooltip (GtkWidget *widget,
18556N/A+ TimeScale* ts = TIMESCALE (data);
18556N/A+ int new_pos = get_snap_index_from_coord (ts, x, y);
18556N/A+ /* printf ("in query_tooltip new_pos %d total %d num_snap %d\n", new_pos, g_list_length (ts->priv->snaps), ts->priv->num_snaps); */
18556N/A+ if (new_pos >= ts->priv->num_snaps)
18556N/A+ tmp_snap = g_list_nth_data (ts->priv->snaps, new_pos);
18556N/A+ tip = g_strdup_printf ("%s\nCreated: %s\nSize: %s\nName: %s", tmp_snap->type_str, tmp_snap->mtime_str, tmp_snap->used_space_str, tmp_snap->name);
18556N/A+ gtk_label_set_text (GTK_LABEL(ts->priv->label_tip), tip);
18556N/A+ gtk_tooltip_set_custom (tooltip, ts->priv->label_tip);
18556N/A+timescale_class_init (TimeScaleClass *class)
18556N/A+ object_class = G_OBJECT_CLASS (class);
18556N/A+ g_type_class_add_private (class, sizeof (TimeScalePrivate));
18556N/A+ widget_class = GTK_WIDGET_CLASS (class);
18556N/A+ g_signal_new ("value-changed",
18556N/A+ G_TYPE_FROM_CLASS (object_class),
18556N/A+ G_STRUCT_OFFSET (TimeScaleClass, value_changed),
18556N/A+ g_cclosure_marshal_VOID__VOID,
18556N/A+#define TYPE_TIMESCALE (timescale_get_type ())
18556N/A+#define TIMESCALE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TIMESCALE, TimeScale))
18556N/A+#define TIMESCALE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TIMESCALE, TimeScaleClass))
18556N/A+#define IS_TIMESCALE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TIMESCALE))
18556N/A+#define IS_TIMESCALE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TIMESCALE))
18556N/A+#define TIMESCALE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_TIMESCALE, TimeScaleClass))
18556N/A+typedef struct _TimeScale TimeScale;
18556N/A+typedef struct _TimeScaleClass TimeScaleClass;
18556N/A+typedef struct TimeScalePrivate TimeScalePrivate;
18556N/A+ void (* value_changed) (TimeScale *timescale);
18556N/A+GType timescale_get_type (void) G_GNUC_CONST;
18556N/A+void timescale_set_snapshots (TimeScale* ts, GList *list, int init_position);
18556N/A+int timescale_get_position (TimeScale* ts);
18556N/A+void timescale_set_position (TimeScale* ts, char *mountpoint);