1 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/configure.in nautilus-2.24.2/configure.in 2 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/configure.in 2008-10-20 14:09:22.000000000 +0200 3 +++ nautilus-2.24.2/configure.in 2009-01-23 22:36:12.616536282 +0100 4 @@ -327,6 +327,22 @@ if test "x$enable_beagle" != "xno"; then 5 AC_SUBST(BEAGLE_CFLAGS) 6 AC_SUBST(BEAGLE_LIBS) 7 fi 8 +dnl ========================================================================== 9 + 10 +dnl ******************** 11 +dnl * Check for libzfs * 12 +dnl ******************** 13 +ZFS_LIBS= 14 +msg_zfs=no 15 +AC_CHECK_LIB(zfs, zfs_iter_root, 16 + [AC_CHECK_HEADER(libzfs.h, 17 + [AC_DEFINE(HAVE_ZFS, 1, [Define to 1 if ZFS is available]) 18 + ZFS_LIBS="-lzfs" 19 + msg_zfs=yes]) 20 + ]) 21 +AC_SUBST(ZFS_LIBS) 22 + 23 + 24 25 dnl ========================================================================== 26 27 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/icons/Makefile.am nautilus-2.24.2/icons/Makefile.am 28 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/icons/Makefile.am 2008-10-06 19:22:21.000000000 +0200 29 +++ nautilus-2.24.2/icons/Makefile.am 2009-01-23 22:36:10.586685500 +0100 30 @@ -12,6 +12,10 @@ icon_DATA =\ 31 knob.png \ 32 note-indicator.png \ 33 thumbnail_frame.png \ 34 + restore.png \ 35 + restore-search.png \ 36 + restore-no.png \ 37 + camera.png \ 38 $(NULL) 39 40 EXTRA_DIST = $(icon_DATA) 41 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/Makefile.am nautilus-2.24.2/libnautilus-private/Makefile.am 42 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/Makefile.am 2009-01-23 22:38:49.620637861 +0100 43 +++ nautilus-2.24.2/libnautilus-private/Makefile.am 2009-01-23 22:36:11.639751348 +0100 44 @@ -32,6 +32,7 @@ libnautilus_private_la_LIBADD = \ 45 $(TRACKER_LIBS) \ 46 $(top_builddir)/libnautilus-extension/libnautilus-extension.la \ 47 $(CORE_LIBS) \ 48 + $(ZFS_LIBS) \ 49 $(NULL) 50 51 marshal_sources = \ 52 @@ -200,6 +201,8 @@ libnautilus_private_la_SOURCES = \ 53 nautilus-window-info.h \ 54 nautilus-window-slot-info.c \ 55 nautilus-window-slot-info.h \ 56 + nautilus-zfs.c \ 57 + nautilus-zfs.h \ 58 $(NULL) 59 60 BEAGLE_SOURCES = \ 61 diff -x '*.out' -x '*.*~' -x '*.orig' -x '*.rej' -rupN nautilus-2.24.2/libnautilus-private/apps_nautilus_preferences.schemas.in ../nautilus-full-async/libnautilus-private/apps_nautilus_preferences.schemas.in 62 --- nautilus-2.24.2/libnautilus-private/apps_nautilus_preferences.schemas.in 2008-12-02 14:18:12.708779941 +0100 63 +++ ../nautilus-full-async/libnautilus-private/apps_nautilus_preferences.schemas.in 2008-12-02 11:42:32.798412022 +0100 64 @@ -5,6 +5,19 @@ 65 in nautilus-global-preferences.c --> 66 67 <!-- General preferences --> 68 + <schema> 69 + <key>/schemas/apps/nautilus/preferences/enable_time_slider</key> 70 + <applyto>/apps/nautilus/preferences/enable_time_slider</applyto> 71 + <owner>nautilus</owner> 72 + <type>bool</type> 73 + <default>true</default> 74 + <locale name="C"> 75 + <short>Enables the visualization of the ZFS snaphots timeline</short> 76 + <long> 77 + If set to true, the visualization of the ZFS snapshots timeline is enabled 78 + </long> 79 + </locale> 80 + </schema> 81 82 <schema> 83 <key>/schemas/desktop/gnome/file_views/show_hidden_files</key> 84 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-column-utilities.c nautilus-2.24.2/libnautilus-private/nautilus-column-utilities.c 85 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-column-utilities.c 2009-01-23 22:38:49.621050437 +0100 86 +++ nautilus-2.24.2/libnautilus-private/nautilus-column-utilities.c 2009-01-23 22:36:11.726383584 +0100 87 @@ -122,6 +122,13 @@ get_builtin_columns (void) 88 "description", _("The SELinux security context of the file."), 89 NULL)); 90 #endif 91 + columns = g_list_append (columns, 92 + g_object_new (NAUTILUS_TYPE_COLUMN, 93 + "name", "restore_info", 94 + "attribute", "restore_info", 95 + "label", _("Restore information"), 96 + "description", _("Restore information of the file."), 97 + NULL)); 98 99 return columns; 100 } 101 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory-async.c nautilus-2.24.2/libnautilus-private/nautilus-directory-async.c 102 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory-async.c 2009-01-23 22:38:49.600884917 +0100 103 +++ nautilus-2.24.2/libnautilus-private/nautilus-directory-async.c 2009-01-23 22:36:11.646385711 +0100 104 @@ -640,6 +640,10 @@ nautilus_directory_set_up_request (Reque 105 if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO) { 106 request->filesystem_info = TRUE; 107 } 108 + 109 + if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO) { 110 + request->restore_info = TRUE; 111 + } 112 } 113 114 static void 115 @@ -4723,6 +4727,18 @@ cancel_link_info_for_file (NautilusDirec 116 } 117 } 118 119 +void nautilus_directory_cancel_restore_info (NautilusDirectory *directory) 120 +{ 121 + if (NAUTILUS_IS_DIRECTORY (directory)) 122 + { 123 + if (directory->details->restore_cancel) 124 + { 125 + g_cancellable_cancel (directory->details->restore_cancel); 126 + directory->details->restore_cancel = NULL; 127 + } 128 + } 129 +} 130 + 131 132 static void 133 cancel_loading_attributes (NautilusDirectory *directory, 134 @@ -4766,6 +4782,10 @@ cancel_loading_attributes (NautilusDirec 135 if (request.mount) { 136 mount_cancel (directory); 137 } 138 + 139 + if (request.restore_info) { 140 + nautilus_directory_cancel_restore_info (directory); 141 + } 142 143 /* FIXME bugzilla.gnome.org 45064: implement cancelling metadata when we 144 implement invalidating metadata */ 145 @@ -4812,6 +4832,9 @@ nautilus_directory_cancel_loading_file_a 146 if (request.mount) { 147 cancel_mount_for_file (directory, file); 148 } 149 + if (request.restore_info) { 150 + nautilus_directory_cancel_restore_info (directory); 151 + } 152 153 /* FIXME bugzilla.gnome.org 45064: implement cancelling metadata when we 154 implement invalidating metadata */ 155 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory-private.h nautilus-2.24.2/libnautilus-private/nautilus-directory-private.h 156 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory-private.h 2008-10-06 19:22:21.000000000 +0200 157 +++ nautilus-2.24.2/libnautilus-private/nautilus-directory-private.h 2009-01-23 22:36:11.641529607 +0100 158 @@ -114,9 +114,14 @@ struct NautilusDirectoryDetails 159 160 LinkInfoReadState *link_info_read_state; 161 162 + GCancellable *restore_cancel; 163 + 164 GList *file_operations_in_progress; /* list of FileOperation * */ 165 166 GHashTable *hidden_file_hash; 167 + 168 + /* zfs snapshot info */ 169 + GList *zfs_snapshots; 170 }; 171 172 /* A request for information about one or more files. */ 173 @@ -134,6 +139,7 @@ typedef struct { 174 gboolean thumbnail; 175 gboolean mount; 176 gboolean filesystem_info; 177 + gboolean restore_info; 178 } Request; 179 180 NautilusDirectory *nautilus_directory_get_existing (GFile *location); 181 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory.c nautilus-2.24.2/libnautilus-private/nautilus-directory.c 182 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory.c 2009-01-23 22:38:49.601904193 +0100 183 +++ nautilus-2.24.2/libnautilus-private/nautilus-directory.c 2009-01-23 22:36:12.453860140 +0100 184 @@ -38,6 +38,7 @@ 185 #include "nautilus-metafile.h" 186 #include "nautilus-desktop-directory.h" 187 #include "nautilus-vfs-directory.h" 188 +#include "nautilus-zfs.h" 189 #include <eel/eel-glib-extensions.h> 190 #include <eel/eel-gtk-macros.h> 191 #include <eel/eel-string.h> 192 @@ -140,6 +141,8 @@ nautilus_directory_init (gpointer object 193 directory->details->low_priority_queue = nautilus_file_queue_new (); 194 directory->details->extension_queue = nautilus_file_queue_new (); 195 directory->details->idle_queue = nautilus_idle_queue_new (); 196 + directory->details->zfs_snapshots = NULL; 197 + directory->details->restore_cancel = NULL; 198 } 199 200 NautilusDirectory * 201 @@ -215,7 +218,13 @@ nautilus_directory_finalize (GObject *ob 202 if (directory->details->hidden_file_hash) { 203 g_hash_table_destroy (directory->details->hidden_file_hash); 204 } 205 - 206 + 207 + if (directory->details->zfs_snapshots) { 208 + ts_free_snapshots (directory->details->zfs_snapshots); 209 + } 210 + if (directory->details->restore_cancel) 211 + g_cancellable_cancel (directory->details->restore_cancel); 212 + 213 nautilus_file_queue_destroy (directory->details->high_priority_queue); 214 nautilus_file_queue_destroy (directory->details->low_priority_queue); 215 nautilus_file_queue_destroy (directory->details->extension_queue); 216 @@ -330,11 +339,27 @@ async_data_preference_changed_callback ( 217 g_hash_table_foreach (directories, async_state_changed_one, NULL); 218 } 219 220 +static gboolean time_slider_enabled = TRUE; 221 + 222 +gboolean 223 +is_time_slider_enabled () 224 +{ 225 + return time_slider_enabled; 226 +} 227 + 228 +static void time_slider_pref_changed_callback () 229 +{ 230 + time_slider_enabled = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER); 231 +} 232 + 233 + 234 static void 235 add_preferences_callbacks (void) 236 { 237 nautilus_global_preferences_init (); 238 239 + time_slider_enabled = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER); 240 + 241 eel_preferences_add_callback (NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES, 242 filtering_changed_callback, 243 NULL); 244 @@ -351,6 +376,9 @@ add_preferences_callbacks (void) 245 eel_preferences_add_callback (NAUTILUS_PREFERENCES_DATE_FORMAT, 246 async_data_preference_changed_callback, 247 NULL); 248 + eel_preferences_add_callback (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER, 249 + time_slider_pref_changed_callback, 250 + NULL); 251 } 252 253 /** 254 @@ -544,6 +572,7 @@ nautilus_directory_new (GFile *location) 255 { 256 NautilusDirectory *directory; 257 char *uri; 258 + char *path; 259 260 uri = g_file_get_uri (location); 261 262 @@ -555,10 +584,13 @@ nautilus_directory_new (GFile *location) 263 directory = NAUTILUS_DIRECTORY (nautilus_search_directory_new_from_saved_search (uri)); 264 } else { 265 directory = NAUTILUS_DIRECTORY (g_object_new (NAUTILUS_TYPE_VFS_DIRECTORY, NULL)); 266 + path = g_file_get_path (location); 267 + g_free (path); 268 } 269 270 set_directory_location (directory, location); 271 272 + 273 g_free (uri); 274 275 return directory; 276 @@ -577,6 +609,197 @@ nautilus_directory_is_local (NautilusDir 277 g_file_is_native (directory->details->location); 278 } 279 280 +typedef struct { 281 + NautilusDirectory *dir; 282 + GCancellable *cancel; 283 + TsReadyCallback callback; 284 + gpointer callback_user_data; 285 +} QuerySnapshotsAsyncData; 286 + 287 + 288 +static void snapshot_list_ready_callback (GObject *source_object, 289 + GAsyncResult *res, 290 + gpointer user_data) 291 +{ 292 + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 293 + QuerySnapshotsAsyncData *data = (QuerySnapshotsAsyncData*) user_data; 294 + 295 + if (!g_cancellable_is_cancelled (data->cancel)) 296 + { 297 + data->dir->details->zfs_snapshots = g_simple_async_result_get_op_res_gpointer (simple); 298 + } 299 + 300 + data->callback (data->dir, data->cancel, data->callback_user_data); 301 +} 302 + 303 +void 304 +nautilus_directory_get_snapshots_async (NautilusDirectory *directory, 305 + TsReadyCallback ready_callback, 306 + GCancellable *cancel, 307 + gpointer callback_user_data) 308 +{ 309 + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 310 + 311 + if (directory->details->location == NULL) 312 + return; 313 + 314 + if (directory->details->zfs_snapshots) { 315 + ts_free_snapshots (directory->details->zfs_snapshots); 316 + directory->details->zfs_snapshots = NULL; 317 + } 318 + 319 + if (is_time_slider_enabled ()) 320 + { 321 + QuerySnapshotsAsyncData *data; 322 + data = g_new0 (QuerySnapshotsAsyncData,1); 323 + data->dir = directory; 324 + data->cancel = cancel; 325 + data->callback = ready_callback; 326 + data->callback_user_data = callback_user_data; 327 + 328 + ts_get_snapshots_for_dir_async (directory->details->location, 329 + snapshot_list_ready_callback, 330 + cancel, 331 + data); 332 + } 333 +} 334 + 335 +gboolean 336 +nautilus_directory_has_snapshots (NautilusDirectory *directory) 337 +{ 338 + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 339 + 340 + if (directory->details->zfs_snapshots) 341 + return TRUE; 342 + 343 + return FALSE; 344 +} 345 +int 346 +nautilus_directory_get_num_snapshots (NautilusDirectory *directory) 347 +{ 348 + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 349 + 350 + if (directory->details->zfs_snapshots) 351 + { 352 + int i = 0; 353 + GList *tmp; 354 + for (tmp = directory->details->zfs_snapshots;tmp;tmp = tmp->next) 355 + i++; 356 + return i; 357 + } 358 + return 0; 359 +} 360 + 361 +gboolean 362 +nautilus_directory_is_in_snapshot (NautilusDirectory *directory) 363 +{ 364 + char *directory_uri; 365 + gboolean result = FALSE; 366 + 367 + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); 368 + 369 + directory_uri = nautilus_directory_get_uri (directory); 370 + 371 + result = ts_is_in_snapshot (directory_uri); 372 + 373 + g_free (directory_uri); 374 + 375 + return result; 376 +} 377 + 378 +GList * 379 +nautilus_directory_get_snapshots (NautilusDirectory *directory) 380 +{ 381 + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 382 + 383 + return directory->details->zfs_snapshots; 384 +} 385 + 386 +void nautilus_directory_remove_snapshot (NautilusDirectory *directory, 387 + ZfsDataSet *snap) 388 +{ 389 + if (directory->details->zfs_snapshots) 390 + { 391 + directory->details->zfs_snapshots = g_list_remove (directory->details->zfs_snapshots, snap); 392 + ts_free_zfs_dataset (snap); 393 + } 394 +} 395 +/* return true if snapdir dir path is a dir or subdir of refdir */ 396 +gboolean 397 +nautilus_directory_is_a_snapshot_dir_of (NautilusDirectory *snapdir, 398 + NautilusDirectory *refdir) 399 +{ 400 + 401 + gboolean result = FALSE; 402 + 403 + if (nautilus_directory_is_in_snapshot (snapdir)) 404 + { 405 + char snapdir_root_real_path [PATH_MAX+1]; 406 + char refdir_real_path [PATH_MAX+1]; 407 + NautilusDirectory *snapdir_root = nautilus_directory_get_snap_root (snapdir); 408 + GFile *snapdir_root_file = nautilus_directory_get_location (snapdir_root); 409 + GFile *refdir_file = nautilus_directory_get_location (refdir); 410 + char* snapdir_root_path = g_file_get_path (snapdir_root_file); 411 + char* refdir_path = g_file_get_path (refdir_file); 412 + 413 + if (realpath (snapdir_root_path, snapdir_root_real_path) && 414 + realpath (refdir_path, refdir_real_path)) 415 + { 416 + if (g_strrstr (snapdir_root_real_path,refdir_real_path)) 417 + result = TRUE; 418 + } 419 + 420 + g_free (snapdir_root_path); 421 + g_free (refdir_path); 422 + g_object_unref (snapdir_root_file); 423 + g_object_unref (refdir_file); 424 + g_object_unref (snapdir_root); 425 + } 426 + 427 + return result; 428 +} 429 + 430 +NautilusDirectory *nautilus_directory_get_snap_root (NautilusDirectory *directory) 431 +{ 432 + char *directory_uri, *snap_root; 433 + char *zfs, *iter; 434 + int count = 0; 435 + NautilusDirectory *new_dir; 436 + 437 + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 438 + 439 + directory_uri = nautilus_directory_get_uri (directory); 440 + 441 + if (!nautilus_directory_is_in_snapshot (directory)) 442 + return directory; 443 + 444 + /*remove .zfs/snapshot/blah/ */ 445 + zfs = g_strrstr (directory_uri, ".zfs/snapshot/"); 446 + iter = zfs; 447 + 448 + if (iter) 449 + { 450 + iter += sizeof (".zfs/snapshot/"); 451 + while (*iter != '/' && *iter != '\0') 452 + iter++; 453 + 454 + if (*iter == '/') 455 + iter++; 456 + 457 + *zfs = '\0'; 458 + snap_root = g_strdup_printf ("%s%s", directory_uri, iter); 459 + 460 + *zfs = 'a'; 461 + g_free (directory_uri); 462 + new_dir = nautilus_directory_get_by_uri (snap_root); 463 + g_free (snap_root); 464 + return new_dir; 465 + } 466 + return directory; 467 +} 468 + 469 + 470 + 471 gboolean 472 nautilus_directory_is_in_trash (NautilusDirectory *directory) 473 { 474 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory.h nautilus-2.24.2/libnautilus-private/nautilus-directory.h 475 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory.h 2008-10-06 19:22:21.000000000 +0200 476 +++ nautilus-2.24.2/libnautilus-private/nautilus-directory.h 2009-01-23 22:36:11.710303836 +0100 477 @@ -28,6 +28,7 @@ 478 #include <gtk/gtk.h> 479 #include <gio/gio.h> 480 #include <libnautilus-private/nautilus-file-attributes.h> 481 +#include <libnautilus-private/nautilus-zfs.h> 482 483 /* NautilusDirectory is a class that manages the model for a directory, 484 real or virtual, for Nautilus, mainly the file-manager component. The directory is 485 @@ -218,6 +219,24 @@ gboolean nautilus_directory_ar 486 gboolean nautilus_directory_is_local (NautilusDirectory *directory); 487 488 gboolean nautilus_directory_is_in_trash (NautilusDirectory *directory); 489 +typedef void (*TsReadyCallback) (NautilusDirectory *directory, 490 + GCancellable *cancellable, 491 + gpointer callback_data); 492 + 493 +void nautilus_directory_get_snapshots_async (NautilusDirectory *directory, 494 + TsReadyCallback ready_callback, 495 + GCancellable *cancel, 496 + gpointer callback_user_data); 497 +gboolean nautilus_directory_has_snapshots (NautilusDirectory *directory); 498 +gboolean nautilus_directory_is_in_snapshot (NautilusDirectory *directory); 499 +int nautilus_directory_get_num_snapshots (NautilusDirectory *directory); 500 +GList * nautilus_directory_get_snapshots (NautilusDirectory *directory); 501 +void nautilus_directory_remove_snapshot (NautilusDirectory *directory, 502 + ZfsDataSet *snap); 503 +NautilusDirectory *nautilus_directory_get_snap_root (NautilusDirectory *directory); 504 +gboolean nautilus_directory_is_a_snapshot_dir_of (NautilusDirectory *snapdir, 505 + NautilusDirectory *refdir); 506 +void nautilus_directory_cancel_restore_info (NautilusDirectory *directory); 507 508 /* Return false if directory contains anything besides a Nautilus metafile. 509 * Only valid if directory is monitored. Used by the Trash monitor. 510 @@ -238,6 +257,7 @@ GList * nautilus_directory_li 511 gboolean nautilus_directory_is_desktop_directory (NautilusDirectory *directory); 512 513 gboolean nautilus_directory_is_editable (NautilusDirectory *directory); 514 +gboolean is_time_slider_enabled (); 515 516 517 #endif /* NAUTILUS_DIRECTORY_H */ 518 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file-attributes.h nautilus-2.24.2/libnautilus-private/nautilus-file-attributes.h 519 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file-attributes.h 2008-10-06 19:22:21.000000000 +0200 520 +++ nautilus-2.24.2/libnautilus-private/nautilus-file-attributes.h 2009-01-23 22:36:12.450443252 +0100 521 @@ -42,6 +42,7 @@ typedef enum { 522 NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL = 1 << 9, 523 NAUTILUS_FILE_ATTRIBUTE_MOUNT = 1 << 10, 524 NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO = 1 << 11, 525 + NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO = 1 << 12, 526 } NautilusFileAttributes; 527 528 #endif /* NAUTILUS_FILE_ATTRIBUTES_H */ 529 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file-private.h nautilus-2.24.2/libnautilus-private/nautilus-file-private.h 530 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file-private.h 2008-10-06 19:22:21.000000000 +0200 531 +++ nautilus-2.24.2/libnautilus-private/nautilus-file-private.h 2009-01-23 22:36:11.662583045 +0100 532 @@ -146,6 +146,15 @@ struct NautilusFileDetails 533 534 /* Mount for mountpoint or the references GMount for a "mountable" */ 535 GMount *mount; 536 + 537 + /* time slider file difference information */ 538 + 539 + char *restore_info; 540 + 541 + /* snapshot directory for versions */ 542 + 543 + char *snapshot_directory; 544 + GCancellable *has_snapshot_cancel; 545 546 /* boolean fields: bitfield to save space, since there can be 547 many NautilusFile objects. */ 548 @@ -194,6 +203,13 @@ struct NautilusFileDetails 549 550 eel_boolean_bit is_thumbnailing : 1; 551 552 + eel_boolean_bit restore_info_is_up_to_date : 1; 553 + eel_boolean_bit restore_info_in_progress : 1; 554 + 555 + eel_boolean_bit has_snap_versions_is_up_to_date : 1; 556 + eel_boolean_bit has_snap_versions_in_progress : 1; 557 + eel_boolean_bit has_snap_versions : 1; 558 + 559 /* TRUE if the file is open in a spatial window */ 560 eel_boolean_bit has_open_window : 1; 561 562 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file.c nautilus-2.24.2/libnautilus-private/nautilus-file.c 563 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file.c 2009-01-23 22:38:49.604932056 +0100 564 +++ nautilus-2.24.2/libnautilus-private/nautilus-file.c 2009-01-23 22:36:11.724833444 +0100 565 @@ -48,6 +48,7 @@ 566 #include "nautilus-vfs-file.h" 567 #include "nautilus-saved-search-file.h" 568 #include "nautilus-lockdown.h" 569 +#include "nautilus-zfs.h" 570 #include <eel/eel-debug.h> 571 #include <eel/eel-glib-extensions.h> 572 #include <eel/eel-gtk-extensions.h> 573 @@ -146,7 +147,8 @@ static GQuark attribute_name_q, 574 attribute_where_q, 575 attribute_link_target_q, 576 attribute_volume_q, 577 - attribute_free_space_q; 578 + attribute_free_space_q, 579 + attribute_restore_info_q; 580 581 582 static void nautilus_file_instance_init (NautilusFile *file); 583 @@ -159,6 +161,7 @@ static gboolean update_info_and_name 584 GFileInfo *info); 585 static const char * nautilus_file_peek_display_name (NautilusFile *file); 586 static const char * nautilus_file_peek_display_name_collation_key (NautilusFile *file); 587 +static void invalidate_restore_info (NautilusFile *file); 588 589 GType 590 nautilus_file_get_type (void) 591 @@ -364,6 +367,14 @@ nautilus_file_clear_info (NautilusFile * 592 593 eel_ref_str_unref (file->details->filesystem_id); 594 file->details->filesystem_id = NULL; 595 + g_free (file->details->restore_info); 596 + file->details->restore_info = NULL; 597 + invalidate_restore_info (file); 598 + g_free (file->details->snapshot_directory); 599 + file->details->snapshot_directory = NULL; 600 + file->details->has_snap_versions_in_progress = FALSE; 601 + file->details->has_snap_versions_is_up_to_date = FALSE; 602 + file->details->has_snap_versions = FALSE; 603 } 604 605 static NautilusFile * 606 @@ -674,6 +685,9 @@ finalize (GObject *object) 607 g_free (file->details->selinux_context); 608 g_free (file->details->top_left_text); 609 g_free (file->details->custom_icon); 610 + g_free (file->details->restore_info); 611 + if (file->details->snapshot_directory) 612 + g_free (file->details->snapshot_directory); 613 if (file->details->activation_location) { 614 g_object_unref (file->details->activation_location); 615 } 616 @@ -5442,7 +5456,9 @@ nautilus_file_get_string_attribute_q (Na 617 if (attribute_q == attribute_free_space_q) { 618 return nautilus_file_get_volume_free_space (file); 619 } 620 - 621 + if (attribute_q == attribute_restore_info_q) { 622 + return nautilus_file_get_restore_info_async (file); 623 + } 624 extension_attribute = NULL; 625 626 if (file->details->pending_extension_attributes) { 627 @@ -6332,6 +6348,616 @@ nautilus_file_get_trash_original_file (N 628 629 } 630 631 +gboolean 632 +nautilus_file_is_in_snapshot (NautilusFile *file) 633 +{ 634 + char *file_uri = nautilus_file_get_uri (file); 635 + gboolean result = ts_is_in_snapshot (file_uri); 636 + g_free (file_uri); 637 + return result; 638 +} 639 + 640 +static gboolean nautilus_file_in_snap_exist_in_current (NautilusFile *file, GCancellable *cancel) 641 +{ 642 + /* get path without /.zfs/snapshot/blah/ */ 643 + /* test is file exist */ 644 + char *file_uri = nautilus_file_get_uri (file); 645 + char *file_uri_without_snap = NULL; 646 + gboolean result = FALSE; 647 + 648 + if (g_cancellable_is_cancelled (cancel)) 649 + { 650 + g_free (file_uri); 651 + return FALSE; 652 + } 653 + 654 + file_uri_without_snap = ts_remove_snapshot_dir (file_uri); 655 + 656 + if (file_uri_without_snap) 657 + { 658 + GFile* root_file = g_file_new_for_uri (file_uri_without_snap); 659 + char *path = g_file_get_path (root_file); 660 + 661 + if (path) 662 + { 663 + result = g_file_test (path, G_FILE_TEST_EXISTS); 664 + g_free (path); 665 + } 666 + g_object_unref (root_file); 667 + g_free (file_uri_without_snap); 668 + 669 + } 670 + 671 + g_free (file_uri); 672 + 673 + return result; 674 +} 675 + 676 + 677 +char * nautilus_file_in_snapshot_get_info (NautilusFile *file, GCancellable *cancel) 678 +{ 679 + char *info = NULL; 680 + GFile *then_gfile = nautilus_file_get_location (file); 681 + char *then_path = g_file_get_path (then_gfile); 682 + g_object_unref (then_gfile); 683 + 684 + if (g_cancellable_is_cancelled (cancel)) 685 + { 686 + g_free (then_gfile); 687 + g_free (then_path); 688 + return g_strdup ("cancelled"); 689 + } 690 + if (then_path) 691 + { 692 + struct stat64 now; 693 + struct stat64 then; 694 + char *now_path = ts_remove_snapshot_dir (then_path); 695 + 696 + if (lstat64 (now_path, &now) == 0) 697 + { 698 + if (lstat64 (then_path, &then) == 0) 699 + { 700 + 701 + if (now.st_mtime != then.st_mtime) 702 + { 703 + if (now.st_size == then.st_size) 704 + /* SUN_BRANDING */ 705 + info = g_strdup (_("different date, same size as latest version")); 706 + else if (now.st_size > then.st_size) 707 + /* SUN_BRANDING */ 708 + info = g_strdup (_("different date, smaller than latest version")); 709 + else if ( now.st_size < then.st_size) 710 + /* SUN_BRANDING */ 711 + info = g_strdup (_("different date, bigger than latest version")); 712 + } 713 + else 714 + /* SUN_BRANDING */ 715 + info = g_strdup (_("identical to latest version")); 716 + } 717 + else 718 + info = g_strdup_printf ("FIXME no then %s", then_path); 719 + } 720 + else 721 + /* SUN_BRANDING */ 722 + info = g_strdup (_("not present in latest version")); 723 + 724 + g_free (now_path); 725 + g_free (then_path); 726 + } 727 + 728 + return info; 729 +} 730 + 731 +static char * restore_string (char *str, GCancellable *cancel) 732 +{ 733 + if (g_cancellable_is_cancelled (cancel)) 734 + { 735 + g_free (str); 736 + return g_strdup (_("unknown")); 737 + } 738 + else 739 + return str; 740 +} 741 + 742 +gint time_cmp (time_t *a, 743 + time_t *b) 744 +{ 745 + if (*a == *b) 746 + return 0; 747 + if (*a > *b) 748 + return 1; 749 + if (*a < *b) 750 + return -1; 751 + 752 +} 753 + 754 +char * 755 +nautilus_file_get_num_snapshot_version (NautilusFile *file, 756 + GCancellable *cancel, 757 + gboolean stop_at_first) 758 +{ 759 + GList *tmp = NULL; 760 + GList *tmp2 = NULL; 761 + GList *time = NULL; 762 + time_t* now_time = NULL; 763 + char *result = NULL; 764 + int version = 0; 765 + NautilusFile *parent = NULL; 766 + NautilusDirectory *dir = NULL; 767 + char *snapdir = NULL; 768 + 769 + if (NAUTILUS_IS_FILE (file)) 770 + { 771 + parent = nautilus_file_get_parent (file); 772 + if (parent) 773 + { 774 + dir = nautilus_directory_get_for_file (parent); 775 + g_object_unref (parent); 776 + } 777 + } 778 + if (dir) 779 + { 780 + struct stat64 now; 781 + struct stat64 then; 782 + char snap_name[PATH_MAX+1]; 783 + char *name = nautilus_file_get_name (file); 784 + 785 + g_object_ref (dir); 786 + tmp = nautilus_directory_get_snapshots (dir); 787 + 788 + GFile *now_gfile = nautilus_file_get_location (file); 789 + char *now_path = g_file_get_path (now_gfile); 790 + g_object_unref (now_gfile); 791 + 792 + if (now_path) 793 + { 794 + if (lstat64 (now_path, &now) != 0) 795 + { 796 + g_free (now_path); 797 + g_object_unref (dir); 798 + return NULL; 799 + } 800 + } 801 + 802 + g_free (now_path); 803 + 804 + time = NULL; 805 + 806 + /* get list of mtime for all files in snapshots */ 807 + 808 + now_time = g_new0 (time_t, 1); 809 + *now_time = now.st_mtim.tv_sec; 810 + time = g_list_prepend (time, now_time); 811 + 812 + 813 + for (tmp; tmp; tmp = tmp->next) 814 + { 815 + g_sprintf (snap_name, "%s/%s", 816 + ((ZfsDataSet *) tmp->data)->mountpoint, 817 + name); 818 + if (g_cancellable_is_cancelled (cancel)) 819 + goto cancel; 820 + if (lstat64 (snap_name, &then) == 0) 821 + { 822 + if (g_list_find_custom (time, &then.st_mtim.tv_sec, (GCompareFunc) time_cmp) == NULL) 823 + { /*insert in list only is unique */ 824 + time_t* snap_time = g_new0 (time_t, 1); 825 + *snap_time = then.st_mtim.tv_sec; 826 + time = g_list_prepend (time, snap_time); 827 + if (stop_at_first) 828 + { 829 + snapdir = g_strdup (((ZfsDataSet *) tmp->data)->mountpoint); 830 + goto cancel; 831 + } 832 + } 833 + } 834 + 835 + } 836 +cancel: 837 + g_free (name); 838 + g_object_unref (dir); 839 + } 840 + 841 + 842 + for (tmp = time; tmp; tmp = tmp->next) 843 + { 844 + g_free ((time_t*) tmp->data); 845 + version++; 846 + } 847 + 848 + /* remove current version */ 849 + version--; 850 + 851 + g_list_free (time); 852 + 853 + if (version == 0) 854 + { 855 + if (stop_at_first) 856 + return NULL; 857 + else /*SUN_BRANDING*/ 858 + return restore_string (g_strdup_printf (_("no other version")), cancel); 859 + } 860 + 861 + if (stop_at_first) 862 + return snapdir; 863 + else 864 + /* SUN_BRANDING */ 865 + return restore_string (g_strdup_printf ("%d %s", version, 866 + version > 1 ? _ ("other versions") : _ ("other version")), 867 + cancel); 868 +} 869 + 870 +static gboolean worker_thread_started = FALSE; 871 + 872 +typedef void (*ReadyCallback) (gpointer data, 873 + GCancellable *cancellable); 874 +typedef void (*WorkerFunction) (gpointer data, 875 + GCancellable *cancellable); 876 +typedef struct { 877 + gpointer data; 878 + gpointer return_data; 879 + ReadyCallback ready_callback; 880 + WorkerFunction worker_func; 881 + GCancellable *cancellable; 882 +} QueryData; 883 + 884 +static void 885 +nautilus_file_get_restore_info (gpointer data, 886 + GCancellable *cancellable) 887 +{ 888 + QueryData *qdata = (QueryData*) data; 889 + NautilusFile *file = NAUTILUS_FILE (qdata->data); 890 + char *result = NULL; 891 + 892 + /*{ 893 + struct timespec ts; 894 + ts.tv_sec = 1; 895 + ts.tv_nsec = 0; 896 + nanosleep (&ts, NULL); 897 + } 898 + 899 + { 900 + GFile *f = nautilus_file_get_location (file); 901 + char *path = g_file_get_uri (f); 902 + printf ("start restore info for %s", path); 903 + g_free (path); 904 + g_object_unref (f); 905 + }*/ 906 + if (!g_cancellable_is_cancelled (cancellable)) 907 + { 908 + 909 + if (nautilus_file_is_directory (file)) 910 + { 911 + NautilusDirectory *dir = nautilus_directory_get_for_file (file); 912 + g_object_ref (dir); 913 + if (nautilus_directory_is_in_snapshot (dir)) 914 + { 915 + if (!nautilus_file_in_snap_exist_in_current (file, cancellable)) 916 + /* SUN_BRANDING */ 917 + result = g_strdup (_("not present in latest version")); 918 + else 919 + /* SUN_BRANDING */ 920 + result = g_strdup (_("present in latest version")); 921 + } 922 + else 923 + { 924 + int version = nautilus_directory_get_num_snapshots (dir); 925 + 926 + if (version == 0) 927 + /* SUN_BRANDING */ 928 + result = g_strdup (_("no version")); 929 + else 930 + /* SUN_BRANDING */ 931 + result = g_strdup_printf ("%d %s",version, 932 + version > 1 ? _("versions") : _("version")); 933 + } 934 + g_object_unref (dir); 935 + } 936 + else 937 + { 938 + if (nautilus_file_is_in_snapshot (file)) 939 + result = nautilus_file_in_snapshot_get_info (file, cancellable); 940 + else 941 + result = nautilus_file_get_num_snapshot_version (file, cancellable, FALSE); 942 + } 943 + } 944 + 945 +/* { 946 + printf ("is %s\n", result); 947 + }*/ 948 + 949 + 950 + qdata->return_data = restore_string (result, cancellable); 951 +} 952 + 953 + 954 +static void restore_information_ready_callback (gpointer data, 955 + GCancellable *cancellable) 956 +{ 957 + QueryData *qdata = (QueryData*) data; 958 + NautilusFile *file = (NautilusFile*) qdata->data; 959 + char *return_data = qdata->return_data; 960 + 961 + if (!NAUTILUS_IS_FILE (file)) 962 + return; 963 + 964 + file->details->restore_info_in_progress = FALSE; 965 + 966 + if (g_cancellable_is_cancelled (cancellable)) 967 + { 968 + file->details->restore_info = g_strdup (_("unknown")); 969 + invalidate_restore_info (file); 970 + if (return_data) 971 + g_free (return_data); 972 + } 973 + else 974 + { 975 + file->details->restore_info_is_up_to_date = TRUE; 976 + file->details->restore_info = return_data; 977 + } 978 + 979 + nautilus_file_changed (file); 980 + nautilus_file_unref (file); 981 +} 982 + 983 + 984 +static gboolean 985 +complete_in_idle_cb (gpointer data) 986 +{ 987 + QueryData *qdata = (QueryData*)data; 988 + qdata->ready_callback (data, qdata->cancellable); 989 + g_free (qdata); 990 + return FALSE; 991 +} 992 + 993 +static void 994 +worker_queue_finished_callback (GObject *source_object, 995 + GAsyncResult *res, 996 + gpointer user_data) 997 +{ 998 + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 999 + GCancellable *cancel = (GCancellable*) user_data; 1000 + 1001 + worker_thread_started = FALSE; 1002 + 1003 + if (g_cancellable_is_cancelled (cancel)) 1004 + { 1005 + return; 1006 + } 1007 + 1008 + g_simple_async_result_get_op_res_gpointer (simple); 1009 + 1010 +} 1011 + 1012 +static void 1013 +worker_queue_func (GSimpleAsyncResult *res, 1014 + GObject *object, 1015 + GCancellable *cancellable) 1016 +{ 1017 + QueryData *data = NULL; 1018 + 1019 + GTimeVal timeout; 1020 + GAsyncQueue *queue = (GAsyncQueue*) g_simple_async_result_get_op_res_gpointer (res); 1021 + g_async_queue_ref (queue); 1022 + 1023 + g_get_current_time (&timeout); 1024 + g_time_val_add (&timeout, 3000000); 1025 + 1026 + data = g_async_queue_timed_pop (queue, &timeout); 1027 + 1028 + while (data) 1029 + { 1030 + GSource *source; 1031 + 1032 + /* only call the worker fct if not cancel 1033 + * but execute ready function anyway */ 1034 + if (!g_cancellable_is_cancelled (data->cancellable)) 1035 + data->worker_func (data, data->cancellable); 1036 + 1037 + /*call ready callback in main loop/thread */ 1038 + source = g_idle_source_new (); 1039 + g_source_set_priority (source, G_PRIORITY_DEFAULT); 1040 + g_source_set_callback (source, complete_in_idle_cb, data, NULL); 1041 + g_source_attach (source, NULL); 1042 + g_source_unref (source); 1043 + 1044 + /* pop next one */ 1045 + g_get_current_time (&timeout); 1046 + g_time_val_add (&timeout, 3000000); 1047 + data = g_async_queue_timed_pop (queue, &timeout); 1048 + } 1049 + 1050 + g_async_queue_unref (queue); 1051 +} 1052 + 1053 +char * nautilus_file_get_restore_info_async (NautilusFile *file) 1054 +{ 1055 + if (!is_time_slider_enabled ()) 1056 + return NULL; 1057 + 1058 + if (!ts_is_restore_column_enabled ()) 1059 + return NULL; 1060 + 1061 + if (file->details->restore_info_is_up_to_date) 1062 + { 1063 + /*if ( file->details->restore_info == NULL) 1064 + return g_strdup ("null cached info");*/ 1065 + return g_strdup (file->details->restore_info); 1066 + } 1067 + 1068 + if (file->details->restore_info_in_progress) 1069 + return g_strdup ("..."); 1070 + else 1071 + { 1072 + static GAsyncQueue *queue = NULL; 1073 + QueryData *data = NULL; 1074 + 1075 + if (!file->details->directory) 1076 + return g_strdup ("no directory element\n"); 1077 + 1078 + if (!nautilus_directory_has_snapshots (file->details->directory) && !nautilus_file_is_in_snapshot (file)) 1079 + return g_strdup ("doesn't have snap nor is in snap\n"); 1080 + 1081 + if (!file->details->directory->details->restore_cancel) 1082 + { 1083 + file->details->directory->details->restore_cancel = g_cancellable_new (); 1084 + } 1085 + else 1086 + { 1087 + if (g_cancellable_is_cancelled (file->details->directory->details->restore_cancel)) 1088 + return NULL; 1089 + } 1090 + 1091 + g_free (file->details->restore_info); 1092 + file->details->restore_info = NULL; 1093 + file->details->restore_info_in_progress = TRUE; 1094 + 1095 + if (!queue) 1096 + queue = g_async_queue_new (); 1097 + 1098 + data = g_new0 (QueryData, 1); 1099 + data->data = file; 1100 + nautilus_file_ref (file); 1101 + data->cancellable = file->details->directory->details->restore_cancel; 1102 + data->ready_callback = restore_information_ready_callback; 1103 + data->worker_func = nautilus_file_get_restore_info; 1104 + 1105 + g_async_queue_push (queue, data); 1106 + 1107 + if (!worker_thread_started) 1108 + { 1109 + GSimpleAsyncResult *res; 1110 + worker_thread_started = TRUE; 1111 + 1112 + res = g_simple_async_result_new (G_OBJECT (file), 1113 + worker_queue_finished_callback, 1114 + NULL, 1115 + (gpointer) worker_queue_func); 1116 + 1117 + g_simple_async_result_set_op_res_gpointer (res, queue, NULL); 1118 + g_simple_async_result_run_in_thread (res, 1119 + worker_queue_func, 1120 + G_PRIORITY_DEFAULT, 1121 + data->cancellable); 1122 + } 1123 + 1124 + return g_strdup ("..."); 1125 + } 1126 +} 1127 + 1128 +HasSnapshotResult 1129 +nautilus_file_has_snapshot_version (NautilusFile *file) 1130 +{ 1131 + if (file->details->has_snap_versions_is_up_to_date) 1132 + return (file->details->has_snap_versions); 1133 + return UNKNOWN_STATE; 1134 +} 1135 + 1136 +typedef struct { 1137 + NautilusFile *file; 1138 + GCancellable *cancel; 1139 + FileHasSnapshotCallback callback; 1140 + gpointer callback_user_data; 1141 + char *snap_dir; 1142 +} HasSnapshotAsyncData; 1143 + 1144 +typedef void (*HasSnapReadyCallback) (NautilusDirectory *file, 1145 + GCancellable *cancel, 1146 + gpointer callback_data); 1147 + 1148 + 1149 +static void has_snapshot_ready_callback (GObject *source_object, 1150 + GAsyncResult *res, 1151 + gpointer user_data) 1152 +{ 1153 + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1154 + HasSnapshotAsyncData *data = (HasSnapshotAsyncData*) user_data; 1155 + 1156 + if (g_cancellable_is_cancelled (data->cancel)) 1157 + { 1158 + data->file->details->has_snap_versions_in_progress = FALSE; 1159 + data->file->details->has_snap_versions_is_up_to_date = FALSE; 1160 + if (data->file->details->snapshot_directory) 1161 + g_free (data->file->details->snapshot_directory); 1162 + 1163 + data->file->details->has_snapshot_cancel = NULL; 1164 + } 1165 + else 1166 + { 1167 + data->file->details->has_snap_versions_in_progress = FALSE; 1168 + data->file->details->has_snap_versions_is_up_to_date = TRUE; 1169 + if (data->file->details->snapshot_directory) 1170 + g_free (data->file->details->snapshot_directory); 1171 + data->file->details->snapshot_directory = g_simple_async_result_get_op_res_gpointer (simple); 1172 + if (data->file->details->snapshot_directory) 1173 + data->file->details->has_snap_versions = TRUE; 1174 + else 1175 + data->file->details->has_snap_versions = FALSE; 1176 + } 1177 + data->callback (data->callback_user_data); 1178 +} 1179 +char * 1180 +nautilus_file_get_snapshot_dir (NautilusFile *file) 1181 +{ 1182 + return file->details->snapshot_directory; 1183 +} 1184 +void nautilus_file_real_get_snapshot_version (GSimpleAsyncResult *res, 1185 + GObject *object, 1186 + GCancellable *cancellable) 1187 +{ 1188 + NautilusFile *file = NAUTILUS_FILE (object); 1189 + char *snap_info = nautilus_file_get_num_snapshot_version (file, cancellable, TRUE); 1190 + 1191 + if (!snap_info) /* scan for .zfs directory*/ 1192 + snap_info = ts_get_not_zfs_snapshot_dir (nautilus_file_get_location (file)); 1193 +/* 1194 + { 1195 + struct timespec ts; 1196 + ts.tv_sec = 4; 1197 + ts.tv_nsec = 0; 1198 + nanosleep (&ts, NULL); 1199 + } 1200 +*/ 1201 + if (snap_info) 1202 + g_simple_async_result_set_op_res_gpointer (res, snap_info, (GDestroyNotify) NULL); 1203 + else 1204 + g_simple_async_result_set_op_res_gpointer (res, NULL, (GDestroyNotify) NULL); 1205 +} 1206 + 1207 +void nautilus_file_get_snapshot_version (NautilusFile *file, 1208 + FileHasSnapshotCallback callback, 1209 + GCancellable *cancel, 1210 + gpointer user_data) 1211 +{ 1212 + HasSnapshotAsyncData *data; 1213 + GSimpleAsyncResult *res; 1214 + 1215 + if (file->details->has_snap_versions_in_progress) 1216 + { 1217 + g_cancellable_cancel(file->details->has_snapshot_cancel); 1218 + file->details->has_snapshot_cancel = NULL; 1219 + file->details->has_snap_versions_in_progress = FALSE; 1220 + } 1221 + 1222 + file->details->has_snapshot_cancel = cancel; 1223 + file->details->has_snap_versions_in_progress = TRUE; 1224 + file->details->has_snap_versions_is_up_to_date = FALSE; 1225 + 1226 + data = g_new0 (HasSnapshotAsyncData, 1); 1227 + data->file = file; 1228 + data->cancel = cancel; 1229 + data->callback = callback; 1230 + data->callback_user_data = user_data; 1231 + 1232 + res = g_simple_async_result_new (G_OBJECT (file), 1233 + has_snapshot_ready_callback, 1234 + data, 1235 + (gpointer) nautilus_file_real_get_snapshot_version); 1236 + g_simple_async_result_run_in_thread (res, nautilus_file_real_get_snapshot_version, 1237 + G_PRIORITY_DEFAULT, cancel); 1238 +} 1239 + 1240 + 1241 void 1242 nautilus_file_mark_gone (NautilusFile *file) 1243 { 1244 @@ -6593,6 +7219,12 @@ invalidate_thumbnail (NautilusFile *file 1245 file->details->thumbnail_is_up_to_date = FALSE; 1246 } 1247 1248 +static void 1249 +invalidate_restore_info (NautilusFile *file) 1250 +{ 1251 + file->details->restore_info_is_up_to_date = FALSE; 1252 +} 1253 + 1254 void 1255 nautilus_file_invalidate_extension_info_internal (NautilusFile *file) 1256 { 1257 @@ -6647,6 +7279,9 @@ nautilus_file_invalidate_attributes_inte 1258 if (request.thumbnail) { 1259 invalidate_thumbnail (file); 1260 } 1261 + if (request.restore_info) { 1262 + invalidate_restore_info (file); 1263 + } 1264 1265 /* FIXME bugzilla.gnome.org 45075: implement invalidating metadata */ 1266 } 1267 @@ -6727,7 +7362,8 @@ nautilus_file_get_all_attributes (void) 1268 NAUTILUS_FILE_ATTRIBUTE_LARGE_TOP_LEFT_TEXT | 1269 NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO | 1270 NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL | 1271 - NAUTILUS_FILE_ATTRIBUTE_MOUNT; 1272 + NAUTILUS_FILE_ATTRIBUTE_MOUNT | 1273 + NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO ; 1274 } 1275 1276 void 1277 @@ -7201,6 +7837,7 @@ nautilus_file_class_init (NautilusFileCl 1278 attribute_link_target_q = g_quark_from_static_string ("link_target"); 1279 attribute_volume_q = g_quark_from_static_string ("volume"); 1280 attribute_free_space_q = g_quark_from_static_string ("free_space"); 1281 + attribute_restore_info_q = g_quark_from_static_string ("restore_info"); 1282 1283 G_OBJECT_CLASS (class)->finalize = finalize; 1284 G_OBJECT_CLASS (class)->constructor = nautilus_file_constructor; 1285 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file.h nautilus-2.24.2/libnautilus-private/nautilus-file.h 1286 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file.h 2008-10-06 19:22:21.000000000 +0200 1287 +++ nautilus-2.24.2/libnautilus-private/nautilus-file.h 2009-01-23 22:36:11.644493045 +0100 1288 @@ -174,6 +174,7 @@ gboolean nautilus_file_is 1289 const char *mime_type); 1290 gboolean nautilus_file_is_launchable (NautilusFile *file); 1291 gboolean nautilus_file_is_symbolic_link (NautilusFile *file); 1292 +gboolean nautilus_file_is_in_snapshot (NautilusFile *file); 1293 gboolean nautilus_file_is_mountpoint (NautilusFile *file); 1294 GMount * nautilus_file_get_mount (NautilusFile *file); 1295 char * nautilus_file_get_volume_free_space (NautilusFile *file); 1296 @@ -229,6 +230,26 @@ char * nautilus_file_ge 1297 1298 NautilusFile * nautilus_file_get_trash_original_file (NautilusFile *file); 1299 1300 +char * nautilus_file_get_num_snapshot_version (NautilusFile *file, 1301 + GCancellable *cancel, 1302 + gboolean stop_at_first); 1303 +char * nautilus_file_get_restore_info_async (NautilusFile *file); 1304 + 1305 +typedef enum { 1306 + NO, 1307 + YES, 1308 + UNKNOWN_STATE 1309 +} HasSnapshotResult; 1310 + 1311 +HasSnapshotResult nautilus_file_has_snapshot_version (NautilusFile *file); 1312 +char * nautilus_file_get_snapshot_dir (NautilusFile *file); 1313 +typedef void (*FileHasSnapshotCallback) (gpointer user_data); 1314 + 1315 +void nautilus_file_get_snapshot_version (NautilusFile *file, 1316 + FileHasSnapshotCallback callback, 1317 + GCancellable *cancel, 1318 + gpointer user_data); 1319 + 1320 /* Permissions. */ 1321 gboolean nautilus_file_can_get_permissions (NautilusFile *file); 1322 gboolean nautilus_file_can_set_permissions (NautilusFile *file); 1323 diff -x '*.out' -x '*.*~' -x '*.orig' -x '*.rej' -rupN nautilus-2.24.2/libnautilus-private/nautilus-global-preferences.c ../nautilus-full-async/libnautilus-private/nautilus-global-preferences.c 1324 --- nautilus-2.24.2/libnautilus-private/nautilus-global-preferences.c 2008-12-02 14:18:12.722038641 +0100 1325 +++ ../nautilus-full-async/libnautilus-private/nautilus-global-preferences.c 2008-12-02 11:43:13.510836937 +0100 1326 @@ -235,6 +235,10 @@ typedef struct 1327 * YOU SHOULD EDIT THE SCHEMAS FILE TO CHANGE DEFAULTS. 1328 */ 1329 static const PreferenceDefault preference_defaults[] = { 1330 + { NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER, 1331 + PREFERENCE_BOOLEAN, 1332 + GINT_TO_POINTER (TRUE) 1333 + }, 1334 { NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES, 1335 PREFERENCE_BOOLEAN, 1336 GINT_TO_POINTER (FALSE) 1337 diff -x '*.out' -x '*.*~' -x '*.orig' -x '*.rej' -rupN nautilus-2.24.2/libnautilus-private/nautilus-global-preferences.h ../nautilus-compiled/libnautilus-private/nautilus-global-preferences.h 1338 --- nautilus-2.24.2/libnautilus-private/nautilus-global-preferences.h 2009-01-09 22:51:35.144174122 +0100 1339 +++ ../nautilus-compiled/libnautilus-private/nautilus-global-preferences.h 2009-01-09 22:17:26.115872917 +0100 1340 @@ -70,6 +70,7 @@ G_BEGIN_DECLS 1341 #define NAUTILUS_PREFERENCES_SHOW_BACKUP_FILES "/desktop/gnome/file_views/show_backup_files" 1342 #define NAUTILUS_PREFERENCES_SHOW_ADVANCED_PERMISSIONS "preferences/show_advanced_permissions" 1343 #define NAUTILUS_PREFERENCES_DATE_FORMAT "preferences/date_format" 1344 +#define NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER "preferences/enable_time_slider" 1345 1346 typedef enum 1347 { 1348 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-zfs.c nautilus-2.24.2/libnautilus-private/nautilus-zfs.c 1349 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-zfs.c 1970-01-01 01:00:00.000000000 +0100 1350 +++ nautilus-2.24.2/libnautilus-private/nautilus-zfs.c 2009-01-23 22:36:11.647280942 +0100 1351 @@ -0,0 +1,985 @@ 1352 +/* 1353 + * Copyright (C) 2008 Sun Microsystems (Erwann Chenede) 1354 + * 1355 + */ 1356 + 1357 + 1358 +#include <stdio.h> 1359 +#include <strings.h> 1360 +#include <stdlib.h> 1361 +#include <unistd.h> 1362 +#include "nautilus-zfs.h" 1363 +#include <time.h> 1364 +#include <locale.h> 1365 +#include <langinfo.h> 1366 +#include <stdint.h> 1367 +#include <glib.h> 1368 +#include <glib/gi18n.h> 1369 +#include <glib/gstdio.h> 1370 +#include <eel/eel-glib-extensions.h> 1371 +#include <sys/mnttab.h> 1372 +#include <sys/mkdev.h> 1373 +#include "nautilus-global-preferences.h" 1374 +#define ZFS_SNAPSHOT_DIR ".zfs/snapshot/" 1375 + 1376 +static void ts_set_snapshot_used_space (zfs_handle_t *zhp, ZfsDataSet *snap) 1377 +{ 1378 + gchar buf[ZFS_MAXNAMELEN]; 1379 + if (zfs_prop_get(zhp, ZFS_PROP_USED, buf, sizeof (buf), NULL, NULL, 0, B_FALSE) == 0) 1380 + { 1381 + char unit[10]; 1382 + char format_float[5] = "%f%s"; 1383 + char format_int[5] = "%d%s"; 1384 + char *format = format_int; 1385 + int used_space_int = 0; 1386 + gboolean success = FALSE; 1387 + 1388 + snap->used_space_str = g_strdup (buf); 1389 + 1390 + if (strchr (buf, '.')) 1391 + { 1392 + format = format_float; 1393 + if (sscanf(buf, format,&snap->used_space,unit) == 2) 1394 + success = TRUE; 1395 + } 1396 + else 1397 + { 1398 + if (sscanf(buf, format,&used_space_int,unit) == 2) 1399 + { 1400 + success = TRUE; 1401 + snap->used_space = (float) used_space_int; 1402 + } 1403 + } 1404 + if (strcmp (buf, "0") == 0) 1405 + { 1406 + g_free (snap->used_space_str); 1407 + snap->used_space_str = g_strdup ("0 K"); 1408 + success = TRUE; 1409 + } 1410 + 1411 + if (success) 1412 + { 1413 + if (strcmp (unit, "M") == 0) 1414 + snap->used_space *= 1024; 1415 + if (strcmp (unit, "G") == 0) 1416 + snap->used_space *= 1024 * 1024; 1417 + } 1418 + else 1419 + { 1420 + g_free (snap->used_space_str); 1421 + /* SUN_BRANDING */ 1422 + snap->used_space_str = g_strdup (_("Unknown")); 1423 + } 1424 + } 1425 + else 1426 + { 1427 + g_free (snap->used_space_str); 1428 + /* SUN_BRANDING */ 1429 + snap->used_space_str = g_strdup (_("Unknown")); 1430 + } 1431 +} 1432 + 1433 +static void ts_set_snapshot_mtime_and_time_diff (zfs_handle_t *zhp, ZfsDataSet *snap) 1434 +{ 1435 + GDate now; 1436 + GDate then; 1437 + time_t time_now; 1438 + gint days_diff; 1439 + const gchar *format; 1440 + gchar *locale_format = NULL; 1441 + gchar buf[ZFS_MAXNAMELEN]; 1442 + gchar *date_str = NULL; 1443 + 1444 + if (zfs_prop_get(zhp, ZFS_PROP_CREATION, buf, sizeof (buf), NULL, NULL, 0, B_TRUE) == 0) 1445 + { 1446 + struct tm tms; 1447 + 1448 + sscanf (buf, "%llu", &snap->mtime); 1449 + memset(&tms, 0, sizeof(tms)); 1450 + localtime_r (&snap->mtime, &tms); 1451 + 1452 + g_date_set_time_t (&then, snap->mtime); 1453 + 1454 + time_now = time (NULL); 1455 + g_date_set_time_t (&now, time_now); 1456 + 1457 + days_diff = g_date_get_julian (&now) - g_date_get_julian (&then); 1458 + 1459 + /* Translators: %H means "hours" and %M means "minutes" */ 1460 + if (days_diff == 0) 1461 + /* SUN_BRANDING */ 1462 + format = _("Today at %H:%M"); 1463 + else if (days_diff == 1) 1464 + /* SUN_BRANDING */ 1465 + format = _("Yesterday at %H:%M"); 1466 + else 1467 + { 1468 + if (days_diff > 1 && days_diff < 7) 1469 + /* SUN_BRANDING */ 1470 + format = _("%A at %H:%M"); /* Days from last week */ 1471 + else 1472 + { 1473 + /* format = "%x";*/ /* Any other date */ 1474 + format = _("%a %b %e %Y @ %Hh%M"); 1475 + /* SUN_BRANDING */ 1476 + /* date_str = g_strdup_printf (_("%d days ago"), days_diff); */ 1477 + } 1478 + } 1479 + if (format) 1480 + { 1481 + locale_format = g_locale_from_utf8 (format, -1, NULL, NULL, NULL); 1482 + if (locale_format != NULL && 1483 + strftime (buf, sizeof (buf), locale_format, &tms) != 0) 1484 + { 1485 + date_str = g_locale_to_utf8 (buf, -1, NULL, NULL, NULL); 1486 + } 1487 + } 1488 + 1489 + if (date_str == NULL) 1490 + /* SUN_BRANDING */ 1491 + date_str = g_strdup (_("Unknown")); 1492 + 1493 + g_free (locale_format); 1494 + snap->mtime_str = date_str; 1495 + } 1496 + 1497 +} 1498 + 1499 +void print_snap_list (char *dir, GList *snap_list) 1500 +{ 1501 + GList *tmp; 1502 + printf ("list of snapshots for %s :\n", dir); 1503 + for (tmp = snap_list; tmp->next; tmp = tmp->next) 1504 + { 1505 + ZfsDataSet *snap = (ZfsDataSet*) tmp->data; 1506 + printf (" name: %s\n mountpoint: %s\n mtime_str :%s\n space used : %s\n size in kilobytes : %f\n", 1507 + snap->name, snap->mountpoint, snap->mtime_str, snap->used_space_str, snap->used_space); 1508 + 1509 + } 1510 + printf ("\n"); 1511 +} 1512 + 1513 +static GString * 1514 +dump_zds (ZfsDataSet *zds) 1515 +{ 1516 + GString *msg; 1517 + gchar *type; 1518 + 1519 + if (!zds) 1520 + return NULL; 1521 + 1522 + msg = g_string_new (""); 1523 + g_string_printf (msg, 1524 + "\tname: %s\n" 1525 + "\tmountpoint: %s\n" 1526 + "\ttype: %s\n", 1527 + zds->name,zds->mountpoint, zfs_type_to_name(zds->type)); 1528 + if (zds->snapshots) 1529 + { 1530 + GList *tmp; 1531 + g_string_append_printf(msg,"\tsnapshots :\n"); 1532 + for (tmp=zds->snapshots;tmp;tmp = tmp->next) 1533 + { 1534 + ZfsDataSet *tmp_zds= (ZfsDataSet*) tmp->data; 1535 + g_string_append_printf (msg,"\t\tname: %s\n\t\tpath: %s\n", 1536 + tmp_zds->name, 1537 + tmp_zds->mountpoint); 1538 + } 1539 + } 1540 + g_string_append_printf (msg, "\n"); 1541 + return msg; 1542 +} 1543 + 1544 + 1545 +static void 1546 +dump_sds (SearchDataSet *sds) 1547 +{ 1548 + GString *msg; 1549 + gchar *type; 1550 + GList *tmp; 1551 + 1552 + if (!sds) 1553 + { 1554 + printf ("Search DataSet is empty\n"); 1555 + return; 1556 + } 1557 + 1558 + msg = g_string_new (""); 1559 + g_string_printf (msg, "DDS Dump:\n" 1560 + "\tsearched_path: %s\n", 1561 + sds->searched_path); 1562 + 1563 + g_string_append_printf (msg, "Zfs Data set :\n"); 1564 + for (tmp=sds->datasets;tmp;tmp=tmp->next) 1565 + { 1566 + GString * zds_dump = dump_zds ((ZfsDataSet *)tmp->data); 1567 + g_string_append_printf (msg,"%s",zds_dump->str); 1568 + g_string_free (zds_dump, TRUE); 1569 + } 1570 + g_string_append_printf (msg, "\n"); 1571 + printf ("%s", msg->str); 1572 + g_string_free (msg, TRUE); 1573 +} 1574 + 1575 +static ZfsDataSet* 1576 +ts_new_zfs_dataset (SearchDataSet* sds) 1577 +{ 1578 + ZfsDataSet *zds; 1579 + zds = g_new0 (ZfsDataSet, 1); 1580 + zds->search_dataset = sds; 1581 + return zds; 1582 +} 1583 + 1584 +void 1585 +ts_free_zfs_dataset (ZfsDataSet* zds) 1586 +{ 1587 + if (!zds) 1588 + return; 1589 + if (zds->name) 1590 + g_free (zds->name); 1591 + if (zds->mountpoint) 1592 + g_free (zds->mountpoint); 1593 + if (zds->mtime_str) 1594 + g_free (zds->mtime_str); 1595 + if (zds->used_space_str) 1596 + g_free (zds->used_space_str); 1597 + 1598 + if (zds->snapshots) 1599 + { 1600 + GList *tmp; 1601 + for (tmp = zds->snapshots;tmp;tmp = tmp->next) 1602 + ts_free_zfs_dataset ((ZfsDataSet*)tmp->data); 1603 + } 1604 + g_free (zds); 1605 +} 1606 + 1607 +static SearchDataSet * 1608 +ts_new_search_dataset (GCancellable *cancel) 1609 +{ 1610 + SearchDataSet *sds; 1611 + sds = g_new0 (SearchDataSet, 1); 1612 + sds->cancel = cancel; 1613 + return sds; 1614 +} 1615 +static void 1616 +ts_free_search_dataset (SearchDataSet *sds) 1617 +{ 1618 + if (!sds) 1619 + return; 1620 + if (sds->searched_path) 1621 + g_free (sds->searched_path); 1622 + if (sds->mountpoint) 1623 + g_free (sds->mountpoint); 1624 + if (sds->datasets) 1625 + { 1626 + GList *tmp; 1627 + for (tmp = sds->datasets;tmp;tmp = tmp->next) 1628 + ts_free_zfs_dataset ((ZfsDataSet*)tmp->data); 1629 + } 1630 + g_free (sds); 1631 +} 1632 + 1633 +static char* construct_check_snapshot_path (SearchDataSet *sds, char* mountpoint, const char *name, char *searched_path) 1634 +{ 1635 + gchar *result = NULL; 1636 + gchar **split; 1637 + gchar **split2; 1638 + 1639 + gchar *snap_name = NULL; 1640 + gchar *remaining_path = NULL; 1641 + 1642 + /* get the snapshot name part pool@snap-name we are only interested in snap-name split[1] */ 1643 + split = g_strsplit (name,"@",2); 1644 + /* get the path after the mountpoint */ 1645 + split2 = g_strsplit (searched_path, mountpoint, 2); 1646 + 1647 + if (split && split[1]) 1648 + snap_name = split[1]; 1649 + 1650 + if (split2 && split2[1]) 1651 + remaining_path = split2[1]; 1652 + 1653 +/* printf ("mountpoint : %s \nname : %s \nsearched_path: %s\n", mountpoint, name, searched_path); 1654 + printf ("split %s at @ = [%s] [%s]\n", name, split[0],split[1]); 1655 + printf ("split %s at [%s] = [%s] [%s]\n", searched_path, mountpoint, split2[0],split2[1]); 1656 + printf ("%s/.zfs/snapshot/%s/%s\n\n", mountpoint, split[1], split2[1]);*/ 1657 + 1658 + if (snap_name && remaining_path) 1659 + result = g_strdup_printf ("%s/.zfs/snapshot/%s/%s", mountpoint, snap_name, remaining_path); 1660 + 1661 + g_strfreev (split); 1662 + g_strfreev (split2); 1663 + 1664 + /* don't test for file presence if searched path is the same as the mount point */ 1665 + if (sds->searched_path_match_mp) 1666 + return result; 1667 + 1668 + if (result && g_file_test (result, G_FILE_TEST_IS_DIR)) 1669 + { 1670 + char real_dir[PATH_MAX+1]; 1671 + if (!realpath(result, real_dir)) 1672 + { 1673 + g_free (result); 1674 + result = NULL; 1675 + } 1676 + else 1677 + { 1678 + g_free (result); 1679 + result = g_strdup (real_dir); 1680 + } 1681 + return result; 1682 + } 1683 + 1684 + g_free (result); 1685 + return NULL; 1686 +} 1687 + 1688 +static int 1689 +snapshot_callback (zfs_handle_t *zhp, void *data) 1690 +{ 1691 + ZfsDataSet *main_zds = (ZfsDataSet*) data; 1692 + 1693 + /* only add snapshot dir that exist */ 1694 + 1695 + if (zfs_get_type (zhp) == ZFS_TYPE_SNAPSHOT && !g_cancellable_is_cancelled (main_zds->search_dataset->cancel)) 1696 + { 1697 + const char* name = zfs_get_name (zhp); 1698 + char *snap_path = construct_check_snapshot_path (main_zds->search_dataset, 1699 + main_zds->mountpoint, 1700 + name, 1701 + main_zds->search_dataset->searched_path); 1702 + if (snap_path) 1703 + { 1704 + ZfsDataSet *zds = ts_new_zfs_dataset (main_zds->search_dataset); 1705 + zds->name = g_strdup (name); 1706 + zds->type = ZFS_TYPE_SNAPSHOT; 1707 + zds->mountpoint = snap_path; 1708 + ts_set_snapshot_mtime_and_time_diff (zhp, zds); 1709 + ts_set_snapshot_used_space (zhp, zds); 1710 + main_zds->snapshots = g_list_append (main_zds->snapshots,zds); 1711 + } 1712 + } 1713 + zfs_close (zhp); 1714 + return 0; 1715 +} 1716 + 1717 + 1718 +static struct mnttab * 1719 +mygetmntent(FILE *f) 1720 +{ 1721 + static struct mnttab mt; 1722 + int status; 1723 + 1724 + if ((status = getmntent(f, &mt)) == 0) 1725 + return (&mt); 1726 + 1727 + return (NULL); 1728 +} 1729 + 1730 +static char * 1731 +is_fs_mounted (const char *fs_name) 1732 +{ 1733 + FILE *mnttab; 1734 + struct mnttab *mntp; 1735 + 1736 + 1737 + mnttab = fopen (MNTTAB,"r"); 1738 + 1739 + while ((mntp = mygetmntent(mnttab)) != NULL) 1740 + { 1741 + if (mntp->mnt_fstype == (char *)0 || strcmp(mntp->mnt_fstype, "zfs") != 0) 1742 + continue; 1743 + if (strcmp (mntp->mnt_special, fs_name) == 0) 1744 + { 1745 + fclose (mnttab); 1746 + return g_strdup (mntp->mnt_mountp); 1747 + } 1748 + } 1749 + fclose (mnttab); 1750 + return NULL; 1751 +} 1752 + 1753 +static int 1754 +zfs_callback (zfs_handle_t *zhp, void *data) 1755 +{ 1756 + char buf[ZFS_MAXPROPLEN]; 1757 + SearchDataSet *sds = (SearchDataSet*) data; 1758 + 1759 + if (sds->match_found) 1760 + { 1761 + zfs_close (zhp); 1762 + return 0; 1763 + } 1764 + 1765 + if (zfs_get_type (zhp) & sds->type & !g_cancellable_is_cancelled (sds->cancel)) 1766 + { 1767 +/* struct timespec ts; 1768 + ts.tv_sec = 3; 1769 + ts.tv_nsec = 100000000; 1770 + nanosleep (&ts, NULL);*/ 1771 + 1772 + if (sds->prop >= ZFS_PROP_TYPE && sds->prop < ZFS_NUM_PROPS) 1773 + { 1774 + zfs_prop_get(zhp, sds->prop, buf, sizeof (buf), NULL, NULL, 0, TRUE); 1775 + 1776 + if (strcmp (sds->mountpoint, buf) == 0) 1777 + { 1778 + ZfsDataSet *zds = ts_new_zfs_dataset (sds); 1779 + zds->type = zfs_get_type (zhp); 1780 + zds->name = g_strdup (zfs_get_name(zhp)); 1781 + zds->mountpoint = g_strdup (buf); 1782 + zfs_iter_snapshots (zhp, snapshot_callback, zds); 1783 + sds->datasets = g_list_append (sds->datasets, zds); 1784 + sds->match_found = TRUE; 1785 + } 1786 + else if (strcmp ("legacy", buf) == 0) 1787 + { /* parse /etc/mnttab to get the mount point */ 1788 + char *mountp = is_fs_mounted (zfs_get_name(zhp)); 1789 + if (mountp) 1790 + { 1791 + if (strcmp (sds->mountpoint, mountp) == 0) 1792 + { 1793 + ZfsDataSet *zds = ts_new_zfs_dataset (sds); 1794 + zds->type = zfs_get_type (zhp); 1795 + zds->name = g_strdup (zfs_get_name(zhp)); 1796 + zds->mountpoint = mountp; 1797 + zfs_iter_snapshots (zhp, snapshot_callback, zds); 1798 + sds->datasets = g_list_append (sds->datasets, zds); 1799 + sds->match_found = TRUE; 1800 + } 1801 + else 1802 + g_free (mountp); 1803 + } 1804 + } 1805 + } 1806 + if (!sds->match_found) 1807 + zfs_iter_filesystems (zhp, zfs_callback, sds); 1808 + } 1809 + zfs_close (zhp); 1810 + return 0; 1811 +} 1812 + 1813 +static SearchDataSet * 1814 +ts_get_data_from_mountpoint (const char* searched_path, const char *mountpoint, GCancellable *cancel) 1815 +{ 1816 + static libzfs_handle_t *zfs_handle = NULL; 1817 + SearchDataSet *sds; 1818 + 1819 + sds = ts_new_search_dataset (cancel); 1820 + 1821 + sds->prop = ZFS_PROP_MOUNTPOINT; 1822 + sds->type = ZFS_TYPE_FILESYSTEM; 1823 + sds->searched_path = g_strdup (searched_path); 1824 + sds->mountpoint = g_strdup (mountpoint); 1825 + 1826 + if (strcmp (searched_path, mountpoint) == 0) 1827 + sds->searched_path_match_mp = TRUE; 1828 + 1829 + if (!zfs_handle) 1830 + { 1831 + if ((zfs_handle = libzfs_init()) == NULL) { 1832 + g_warning ("internal error: failed to initialize ZFS library\n"); 1833 + ts_free_search_dataset (sds); 1834 + return NULL; 1835 + } 1836 + } 1837 + zfs_iter_root (zfs_handle, zfs_callback, sds); 1838 + 1839 + return sds; 1840 +} 1841 +static gint 1842 +snap_sort_by_age (gconstpointer a, 1843 + gconstpointer b) 1844 +{ 1845 + const ZfsDataSet *snap1 = a; 1846 + const ZfsDataSet *snap2 = b; 1847 + 1848 + if (snap1->mtime == snap2->mtime) 1849 + return 0; 1850 + if (snap1->mtime < snap2->mtime) 1851 + return -1; 1852 + if (snap1->mtime > snap2->mtime) 1853 + return 1; 1854 + 1855 +} 1856 + 1857 +char* 1858 +ts_get_zfs_filesystem (char *dir) 1859 +{ 1860 + char real_dir[PATH_MAX+1]; 1861 + char filesystem[PATH_MAX+1]; 1862 + gboolean found_fs= FALSE; 1863 + struct stat64 dir_stat64; 1864 + 1865 + if (!realpath(dir, real_dir)) 1866 + { 1867 + return NULL; 1868 + } 1869 + if (stat64 (real_dir, &dir_stat64) == 0) 1870 + { /* check is fs is zfs */ 1871 + if (strcmp (dir_stat64.st_fstype, "zfs") == 0) 1872 + { 1873 + FILE *fp; 1874 + struct extmnttab mtab; 1875 + int status; 1876 + 1877 + /* get mount point */ 1878 + 1879 + fp = fopen (MNTTAB,"r"); 1880 + 1881 + resetmnttab(fp); 1882 + while ((status = getextmntent(fp, &mtab, sizeof (struct extmnttab))) == 0) 1883 + { 1884 + dev_t dev = NODEV; 1885 + dev = makedev(mtab.mnt_major, mtab.mnt_minor); 1886 + if (dev == dir_stat64.st_dev) 1887 + { 1888 + strcpy (filesystem, mtab.mnt_special); 1889 + found_fs = TRUE; 1890 + break; 1891 + } 1892 + } 1893 + (void) fclose(fp); 1894 + } 1895 + } 1896 + if (found_fs) 1897 + return g_strdup(filesystem); 1898 + 1899 + return NULL; 1900 +} 1901 + 1902 +static char * get_zfs_mountpoint (char *dir) 1903 +{ 1904 + char real_dir[PATH_MAX+1]; 1905 + char mountpoint[PATH_MAX+1]; 1906 + gboolean found_mount_point = FALSE; 1907 + struct stat64 dir_stat64; 1908 + 1909 + if (!realpath(dir, real_dir)) 1910 + { 1911 + return NULL; 1912 + } 1913 + if (stat64 (real_dir, &dir_stat64) == 0) 1914 + { /* check is fs is zfs */ 1915 + if (strcmp (dir_stat64.st_fstype, "zfs") == 0) 1916 + { 1917 + FILE *fp; 1918 + struct extmnttab mtab; 1919 + int status; 1920 + 1921 + /* get mount point */ 1922 + 1923 + fp = fopen (MNTTAB,"r"); 1924 + 1925 + resetmnttab(fp); 1926 + while ((status = getextmntent(fp, &mtab, sizeof (struct extmnttab))) == 0) 1927 + { 1928 + dev_t dev = NODEV; 1929 + dev = makedev(mtab.mnt_major, mtab.mnt_minor); 1930 + if (dev == dir_stat64.st_dev) 1931 + { 1932 + strcpy (mountpoint, mtab.mnt_mountp); 1933 + found_mount_point = TRUE; 1934 + break; 1935 + } 1936 + } 1937 + (void) fclose(fp); 1938 + } 1939 + } 1940 + if (found_mount_point) 1941 + return g_strdup(mountpoint); 1942 + 1943 + return NULL; 1944 +} 1945 + 1946 + 1947 +char *ts_get_snapshot_dir (char *dir) 1948 +{ 1949 + char *zfs_dir = get_zfs_mountpoint (dir); 1950 + if (zfs_dir) 1951 + { 1952 + char *snapshot_dir = g_strdup_printf ("%s/.zfs/snapshot", zfs_dir); 1953 + g_free (zfs_dir); 1954 + return snapshot_dir; 1955 + } 1956 + else 1957 + return NULL; 1958 +} 1959 + 1960 + 1961 + 1962 +static void ts_get_snapshots_for_dir (GSimpleAsyncResult *res, 1963 + GObject *object, 1964 + GCancellable *cancellable) 1965 +{ 1966 + char *mountpoint = NULL; 1967 + char real_dir[PATH_MAX+1]; 1968 + SearchDataSet *sds; 1969 + GList* snap_result = NULL; 1970 + GFile *file = G_FILE (object); 1971 + char *dir = g_file_get_path (file); 1972 + 1973 + mountpoint = get_zfs_mountpoint (dir); 1974 + 1975 + 1976 + if (!mountpoint) 1977 + { 1978 + g_simple_async_result_set_op_res_gpointer (res, snap_result, (GDestroyNotify) NULL); 1979 + g_free (dir); 1980 + return; 1981 + } 1982 + 1983 + realpath(dir, real_dir); 1984 + 1985 + sds = ts_get_data_from_mountpoint (real_dir, mountpoint, cancellable); 1986 + 1987 + g_free (mountpoint); 1988 + 1989 + if (g_cancellable_is_cancelled (cancellable)) 1990 + { 1991 + /* printf ("ts_get_snapshots_for_dir %s cancelled\n", dir); */ 1992 + if (sds) 1993 + { 1994 + ts_free_search_dataset (sds); 1995 + sds = NULL; 1996 + } 1997 + } 1998 + 1999 + if (sds) 2000 + { 2001 + GList *tmp; 2002 + for (tmp=sds->datasets;tmp;tmp=tmp->next) 2003 + { 2004 + ZfsDataSet *zds = (ZfsDataSet*) tmp->data; 2005 + if (zds->snapshots) 2006 + { 2007 + snap_result = g_list_concat (snap_result, zds->snapshots); 2008 + zds->snapshots = NULL; 2009 + } 2010 + } 2011 + ts_free_search_dataset (sds); 2012 + } 2013 + 2014 + if (snap_result) 2015 + { 2016 + snap_result = g_list_sort (snap_result, (GCompareFunc)snap_sort_by_age); 2017 + /* print_snap_list (dir, snap_result); */ 2018 + } 2019 + 2020 + g_free (dir); 2021 + g_simple_async_result_set_op_res_gpointer (res, snap_result, (GDestroyNotify) NULL); 2022 +} 2023 + 2024 + 2025 +GList *ts_get_snapshots_for_dir_async (GFile *file, 2026 + GAsyncReadyCallback result_ready, 2027 + GCancellable *cancel, 2028 + gpointer user_data) 2029 +{ 2030 + GSimpleAsyncResult *res; 2031 + 2032 + res = g_simple_async_result_new (G_OBJECT (file), result_ready, user_data, (gpointer) ts_get_snapshots_for_dir); 2033 + g_simple_async_result_run_in_thread (res, ts_get_snapshots_for_dir, G_PRIORITY_DEFAULT, cancel); 2034 + return NULL; 2035 +} 2036 + 2037 + 2038 +void ts_free_snapshots (GList *snaps) 2039 +{ 2040 + if (snaps) 2041 + { 2042 + GList *tmp; 2043 + for (tmp=snaps;tmp;tmp=tmp->next) 2044 + ts_free_zfs_dataset ((ZfsDataSet*) tmp->data); 2045 + g_list_free (snaps); 2046 + } 2047 +} 2048 + 2049 +gboolean ts_is_in_snapshot (char * str) 2050 +{ 2051 + if (str != NULL) 2052 + { 2053 + if (g_strrstr (str, ZFS_SNAPSHOT_DIR)) 2054 + return TRUE; 2055 + } 2056 + return FALSE; 2057 +} 2058 + 2059 +char* ts_remove_snapshot_dir (char *str) 2060 +{ 2061 + if (ts_is_in_snapshot (str)) 2062 + { 2063 + char *snap_root; 2064 + char *zfs, *iter, point; 2065 + int count = 0; 2066 + 2067 + /*remove .zfs/snapshot/blah/ */ 2068 + zfs = g_strrstr (str, ZFS_SNAPSHOT_DIR); 2069 + iter = zfs; 2070 + 2071 + if (iter) 2072 + { 2073 + iter += sizeof (ZFS_SNAPSHOT_DIR); 2074 + while (*iter != '/' && *iter != '\0') 2075 + iter++; 2076 + 2077 + if (*iter == '/') 2078 + iter++; 2079 + 2080 + point = *zfs; 2081 + *zfs = '\0'; 2082 + snap_root = g_strdup_printf ("%s%s", str, iter); 2083 + 2084 + *zfs = point; 2085 + return snap_root; 2086 + } 2087 + } 2088 + return NULL; 2089 +} 2090 + 2091 + 2092 +static gboolean restore_col_enabled = FALSE; 2093 + 2094 +gboolean 2095 +ts_is_restore_column_enabled () 2096 +{ 2097 + return restore_col_enabled; 2098 +} 2099 + 2100 +void ts_is_restore_column_enabled_init (); 2101 + 2102 +static void 2103 +visible_columns_changed (gpointer callback_data) 2104 +{ 2105 + ts_is_restore_column_enabled_init (); 2106 +} 2107 + 2108 + 2109 +void ts_is_restore_column_enabled_init () 2110 +{ 2111 + char **visible_columns; 2112 + static gboolean init = FALSE; 2113 + int i = 0; 2114 + 2115 + if (!init) 2116 + { 2117 + eel_preferences_add_callback (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS, 2118 + visible_columns_changed, NULL); 2119 + init = TRUE; 2120 + } 2121 + 2122 + restore_col_enabled = FALSE; 2123 + 2124 + visible_columns = eel_preferences_get_string_array (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS); 2125 + 2126 + while (visible_columns[i]) 2127 + { 2128 + if (strcmp (visible_columns [i], "restore_info") == 0) 2129 + { 2130 + restore_col_enabled = TRUE; 2131 + break; 2132 + } 2133 + i++; 2134 + } 2135 + g_strfreev (visible_columns); 2136 +} 2137 + 2138 + 2139 +static GList * get_dir_entries (char *dir_path) 2140 +{ 2141 + const char *entry_name; 2142 + GDir *dir; 2143 + GList *dir_entries = NULL; 2144 + dir = g_dir_open (dir_path, 0, NULL); 2145 + 2146 + while ((entry_name = g_dir_read_name (dir)) != NULL) 2147 + dir_entries = g_list_prepend (dir_entries, g_strdup (entry_name)); 2148 + 2149 + g_dir_close (dir); 2150 + 2151 + return dir_entries; 2152 +} 2153 + 2154 +static void free_dir_entries (GList *entries) 2155 +{ 2156 + g_list_foreach (entries, (GFunc)g_free, NULL); 2157 + g_list_free (entries); 2158 +} 2159 + 2160 +static gboolean are_entries_identical (GList *old, GList *new) 2161 +{ 2162 + if (g_list_length (old) != g_list_length (new)) 2163 + return FALSE; 2164 + 2165 + for (old; old; old = old->next) 2166 + { 2167 + gboolean found = FALSE; 2168 + for (new; new; new = new->next) 2169 + { 2170 + if (strcmp (old->data, new->data) == 0) 2171 + { 2172 + found = TRUE; 2173 + break; 2174 + } 2175 + } 2176 + if (!found) 2177 + return FALSE; 2178 + } 2179 + return TRUE; 2180 +} 2181 + 2182 +void monitor_zfs_snap_directory_cancel (ZfsSnapDirMonitor *monitor_data) 2183 +{ 2184 + if (monitor_data) 2185 + { 2186 + /* printf ("in monitor_zfs_snap_directory_cancel %s\n", monitor_data->path); */ 2187 + g_source_remove (monitor_data->timeout_id); 2188 + free_dir_entries (monitor_data->entries); 2189 + g_free (monitor_data->path); 2190 + g_free (monitor_data); 2191 + } 2192 +} 2193 + 2194 +static gboolean 2195 +monitor_snap_dir (ZfsSnapDirMonitor *monitor_data) 2196 +{ 2197 + GList *new_entries; 2198 + 2199 + if (!g_file_test (monitor_data->path, G_FILE_TEST_IS_DIR)) 2200 + { 2201 + monitor_zfs_snap_directory_cancel (monitor_data); 2202 + return TRUE; 2203 + } 2204 + 2205 + new_entries = get_dir_entries (monitor_data->path); 2206 + 2207 + if (are_entries_identical (monitor_data->entries, new_entries)) 2208 + { 2209 + free_dir_entries (new_entries); 2210 + } 2211 + else 2212 + { 2213 + free_dir_entries (monitor_data->entries); 2214 + monitor_data->entries = new_entries; 2215 + monitor_data->change_callback (monitor_data, monitor_data->user_data); 2216 + } 2217 + return TRUE; 2218 +} 2219 + 2220 + 2221 +ZfsSnapDirMonitor *monitor_zfs_snap_directory (char *path, 2222 + ZfsDirChangeCallback change_callback, 2223 + gpointer data) 2224 +{ 2225 + ZfsSnapDirMonitor *monitor_data = g_new0 (ZfsSnapDirMonitor, 1); 2226 + 2227 + /* printf ("start monitoring %s\n", path); */ 2228 + 2229 + monitor_data->path = g_strdup (path); 2230 + monitor_data->entries = get_dir_entries (path); 2231 + monitor_data->change_callback = change_callback; 2232 + monitor_data->user_data = data; 2233 + 2234 + monitor_data->timeout_id = g_timeout_add_seconds (5, (GSourceFunc)monitor_snap_dir, monitor_data); 2235 + return monitor_data; 2236 +} 2237 + 2238 +char * 2239 +ts_get_not_zfs_snapshot_dir (GFile *file) 2240 +{ 2241 + char tmp_path[PATH_MAX + 1]; 2242 + gboolean found = FALSE; 2243 + gboolean end_path = FALSE; 2244 + GFile *d = g_file_get_parent(file); 2245 + GFile *tmp; 2246 + char *full_path = g_file_get_path (file); 2247 + char *stripped_path = g_file_get_path (d); 2248 + struct stat64 dir_stat64; 2249 + 2250 + if (!full_path) 2251 + return NULL; 2252 + 2253 + if (stat64 (full_path, &dir_stat64) == 0) 2254 + { /* check is fs is zfs if so don't try to check for nfs mounted .zfs dir*/ 2255 + if (strcmp (dir_stat64.st_fstype, "zfs") == 0) 2256 + end_path = TRUE; 2257 + } 2258 + 2259 + while (!found && !end_path) 2260 + { 2261 + g_sprintf (tmp_path, "%s/.zfs/snapshot", stripped_path); 2262 + if (g_file_test (tmp_path, G_FILE_TEST_IS_DIR)) 2263 + { 2264 + GList *entries = get_dir_entries (tmp_path); 2265 + if (entries != NULL) 2266 + { 2267 + char *after_snap_path = full_path + strlen (stripped_path) + 1; 2268 + 2269 + for (entries; entries; entries = entries->next) 2270 + { 2271 + char test_path[PATH_MAX +1]; 2272 + g_sprintf (test_path, "%s/%s/%s", tmp_path, 2273 + entries->data, 2274 + after_snap_path); 2275 + if (g_file_test (test_path, G_FILE_TEST_EXISTS)) 2276 + { 2277 + found = TRUE; 2278 + break; 2279 + } 2280 + } 2281 + free_dir_entries (entries); 2282 + } 2283 + } 2284 + tmp = d; 2285 + d = g_file_get_parent (tmp); 2286 + g_object_unref (tmp); 2287 + g_free (stripped_path); 2288 + if (d == NULL) 2289 + { 2290 + end_path = TRUE; 2291 + } 2292 + else 2293 + { 2294 + stripped_path = g_file_get_path (d); 2295 + } 2296 + } 2297 + 2298 + g_free (full_path); 2299 + 2300 + if (stripped_path) 2301 + g_free (stripped_path); 2302 + 2303 + if (found) 2304 + return g_strdup (tmp_path); 2305 + else 2306 + return NULL; 2307 + 2308 +} 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-zfs.h nautilus-2.24.2/libnautilus-private/nautilus-zfs.h 2341 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-zfs.h 1970-01-01 01:00:00.000000000 +0100 2342 +++ nautilus-2.24.2/libnautilus-private/nautilus-zfs.h 2009-01-23 22:36:12.513678737 +0100 2343 @@ -0,0 +1,69 @@ 2344 +/* #include <config.h> */ 2345 +#ifndef NAUTILUS_ZFS_H 2346 +#define NAUTILUS_ZFS_H 2347 + 2348 +#include <glib.h> 2349 +#include <libzfs.h> 2350 +#include <gio/gio.h> 2351 + 2352 +typedef struct 2353 +{ 2354 + zfs_type_t type; 2355 + zfs_prop_t prop; 2356 + char *searched_path; 2357 + char *mountpoint; 2358 + GList *datasets; 2359 + GCancellable *cancel; 2360 + gboolean match_found; 2361 + gboolean searched_path_match_mp; 2362 + 2363 +} SearchDataSet; 2364 + 2365 +typedef struct 2366 +{ 2367 + char *name; 2368 + char *mountpoint; 2369 + char *mtime_str; 2370 + time_t mtime; 2371 + float used_space; 2372 + char *used_space_str; 2373 + zfs_type_t type; 2374 + GList *snapshots; 2375 + SearchDataSet *search_dataset; 2376 +} ZfsDataSet; 2377 + 2378 + 2379 +GList *ts_get_snapshots_for_dir_async (GFile *file, 2380 + GAsyncReadyCallback result_ready, 2381 + GCancellable *cancel, 2382 + gpointer user_data); 2383 +void ts_free_snapshots (GList *snaps); 2384 +void ts_free_zfs_dataset (ZfsDataSet* zds); 2385 + 2386 +gboolean ts_is_in_snapshot (char * str); 2387 +char* ts_remove_snapshot_dir (char *str); 2388 +char *ts_get_snapshot_dir (char *dir); 2389 +char *ts_get_zfs_filesystem (char *dir); 2390 +char * ts_get_not_zfs_snapshot_dir (GFile *file); 2391 +gboolean ts_is_restore_column_enabled (); 2392 +void ts_is_restore_column_enabled_init (); 2393 +void print_snap_list (char *dir, GList *snap_list); 2394 + 2395 +typedef void (*ZfsDirChangeCallback) (gpointer monitor_data, 2396 + gpointer user_data); 2397 + 2398 +typedef struct 2399 +{ 2400 + char * path; 2401 + GList *entries; 2402 + guint timeout_id; 2403 + ZfsDirChangeCallback change_callback; 2404 + gpointer user_data; 2405 +} ZfsSnapDirMonitor; 2406 + 2407 +void monitor_zfs_snap_directory_cancel (ZfsSnapDirMonitor *monitor_data); 2408 +ZfsSnapDirMonitor *monitor_zfs_snap_directory (char *path, 2409 + ZfsDirChangeCallback change_callback, 2410 + gpointer data); 2411 +#endif /* NAUTILUS_ZFS_H */ 2412 + 2413 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/Makefile.am nautilus-2.24.2/src/Makefile.am 2414 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/Makefile.am 2008-10-06 19:22:18.000000000 +0200 2415 +++ nautilus-2.24.2/src/Makefile.am 2009-01-23 22:36:10.638397062 +0100 2416 @@ -137,6 +137,10 @@ nautilus_SOURCES = \ 2417 nautilus-x-content-bar.h \ 2418 nautilus-zoom-control.c \ 2419 nautilus-zoom-control.h \ 2420 + nautilus-zfs-bar.c \ 2421 + nautilus-zfs-bar.h \ 2422 + timescale.h \ 2423 + timescale.c \ 2424 $(NULL) 2425 2426 nautilus_file_management_properties_SOURCES= \ 2427 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/file-manager/fm-actions.h nautilus-2.24.2/src/file-manager/fm-actions.h 2428 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/file-manager/fm-actions.h 2008-10-06 19:22:18.000000000 +0200 2429 +++ nautilus-2.24.2/src/file-manager/fm-actions.h 2009-01-23 22:36:10.668828089 +0100 2430 @@ -52,6 +52,9 @@ 2431 #define FM_ACTION_LOCATION_PASTE_FILES_INTO "LocationPasteFilesInto" 2432 #define FM_ACTION_NEW_LAUNCHER "New Launcher" 2433 #define FM_ACTION_RENAME "Rename" 2434 +#define FM_ACTION_RESTORE_TO "Restore to" 2435 +#define FM_ACTION_HAS_SNAPSHOT "View Snap" 2436 +#define FM_ACTION_SNAP_NOW "Snap Now" 2437 #define FM_ACTION_DUPLICATE "Duplicate" 2438 #define FM_ACTION_CREATE_LINK "Create Link" 2439 #define FM_ACTION_SELECT_ALL "Select All" 2440 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/file-manager/fm-directory-view.c nautilus-2.24.2/src/file-manager/fm-directory-view.c 2441 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/file-manager/fm-directory-view.c 2009-01-23 22:38:49.626517597 +0100 2442 +++ nautilus-2.24.2/src/file-manager/fm-directory-view.c 2009-01-23 22:36:10.670123633 +0100 2443 @@ -968,6 +968,77 @@ real_trash (FMDirectoryView *view) 2444 } 2445 2446 static void 2447 +action_snap_now (GtkAction *action, 2448 + gpointer callback_data) 2449 +{ 2450 + FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data); 2451 + GList *selection = fm_directory_view_get_selection_for_file_transfer (view); 2452 + GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data)); 2453 + char *path = g_file_get_path (file); 2454 + char *fs = ts_get_zfs_filesystem (path); 2455 + char *cmd = g_strdup_printf ("/usr/lib/time-slider-snapshot %s %s", path, fs); 2456 + gdk_spawn_command_line_on_screen (gtk_widget_get_screen (GTK_WIDGET (callback_data)), 2457 + cmd, NULL); 2458 + 2459 + g_free (cmd); 2460 + g_free (fs); 2461 + g_free (path); 2462 + g_object_unref (file); 2463 +} 2464 + 2465 +static void 2466 +action_restore_to_desktop_callback (GtkAction *action, 2467 + gpointer callback_data) 2468 +{ 2469 + GList *locations = NULL; 2470 + GList *node; 2471 + FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data); 2472 + char *desktop_directory = nautilus_get_desktop_directory_uri(); 2473 + GList *selection = fm_directory_view_get_selection_for_file_transfer (view); 2474 + 2475 + if (selection == NULL) 2476 + return; 2477 + 2478 + if (desktop_directory == NULL) 2479 + return; 2480 + 2481 + 2482 + for (node = selection; node != NULL; node = node->next) 2483 + { 2484 + locations = g_list_prepend (locations, 2485 + nautilus_file_get_uri ((NautilusFile *) node->data)); 2486 + } 2487 + 2488 + fm_directory_view_move_copy_items (locations, NULL, desktop_directory, 2489 + GDK_ACTION_COPY, 0, 0, view); 2490 + 2491 + nautilus_file_list_free (selection); 2492 +} 2493 + 2494 +static void 2495 +action_show_snapshot_versions_callback (GtkAction *action, 2496 + gpointer callback_data) 2497 +{ 2498 + FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data); 2499 + GList *selection = fm_directory_view_get_selection_for_file_transfer (view); 2500 + GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data)); 2501 + char *dir = nautilus_file_get_snapshot_dir (NAUTILUS_FILE (selection->data)); 2502 + char *file_path = g_file_get_path (file); 2503 + char real_file_path [PATH_MAX + 1]; 2504 + if (realpath (file_path, real_file_path)) 2505 + { 2506 + char *cmd = g_strdup_printf ("/usr/lib/time-slider-version '%s' '%s'", dir, 2507 + real_file_path); 2508 + gdk_spawn_command_line_on_screen (gtk_widget_get_screen (GTK_WIDGET (callback_data)), 2509 + cmd, NULL); 2510 + g_free (cmd); 2511 + } 2512 + 2513 + g_free (file_path); 2514 + g_object_unref (file); 2515 +} 2516 + 2517 +static void 2518 action_trash_callback (GtkAction *action, 2519 gpointer callback_data) 2520 { 2521 @@ -6697,6 +6768,24 @@ static const GtkActionEntry directory_vi 2522 /* label, accelerator */ "RenameSelectAll", "<shift>F2", 2523 /* tooltip */ NULL, 2524 G_CALLBACK (action_rename_select_all_callback) }, 2525 + /* name, stock id */ { "Restore to", NULL, 2526 + /* SUN_BRANDING */ 2527 + /* label, accelerator */ N_("Restore to Desktop"), NULL, 2528 + /* SUN_BRANDING */ 2529 + /* tooltip */ N_("Move each selected item to the Desktop"), 2530 + G_CALLBACK (action_restore_to_desktop_callback) }, 2531 + /* name, stock id */ { "View Snap", NULL, 2532 + /* SUN_BRANDING */ 2533 + /* label, accelerator */ N_("View versions"), NULL, 2534 + /* SUN_BRANDING */ 2535 + /* tooltip */ N_("View the versions of this file available in ZFS snapshots"), 2536 + G_CALLBACK (action_show_snapshot_versions_callback) }, 2537 + /* name, stock id */ { "Snap Now", NULL, 2538 + /* SUN_BRANDING */ 2539 + /* label, accelerator */ N_("Snapshot now"), NULL, 2540 + /* SUN_BRANDING */ 2541 + /* tooltip */ N_("Take a ZFS snapshot of this directory now"), 2542 + G_CALLBACK (action_snap_now) }, 2543 /* name, stock id */ { "Trash", NULL, 2544 /* label, accelerator */ N_("Mo_ve to Trash"), NULL, 2545 /* tooltip */ N_("Move each selected item to the Trash"), 2546 @@ -7723,6 +7812,41 @@ can_delete_all (GList *files) 2547 return TRUE; 2548 } 2549 2550 +typedef struct { 2551 + NautilusFile *file; 2552 + GCancellable *cancel; 2553 + GtkAction *action; 2554 +} HasSnapshotData; 2555 + 2556 +static void 2557 +has_snapshot_ready_callback (gpointer user_data) 2558 +{ 2559 + GValue name = {0,}; 2560 + HasSnapshotData *data = (HasSnapshotData*) user_data; 2561 + HasSnapshotResult result = nautilus_file_has_snapshot_version (data->file); 2562 + 2563 + switch (result) 2564 + { 2565 + case UNKNOWN_STATE: 2566 + case NO: 2567 + gtk_action_set_sensitive (data->action, FALSE); 2568 + g_value_init (&name, G_TYPE_STRING); 2569 + /* SUN_BRANDING */ 2570 + g_value_set_static_string (&name, _("No versions")); 2571 + g_object_set_property (G_OBJECT (data->action), "label", &name); 2572 + break; 2573 + case YES: 2574 + gtk_action_set_sensitive (data->action, TRUE); 2575 + g_value_init (&name, G_TYPE_STRING); 2576 + /* SUN_BRANDING */ 2577 + g_value_set_static_string (&name, _("Explore versions")); 2578 + g_object_set_property (G_OBJECT (data->action), "label", &name); 2579 + break; 2580 + } 2581 + g_free (data); 2582 + } 2583 + 2584 + 2585 static void 2586 real_update_menus (FMDirectoryView *view) 2587 { 2588 @@ -8028,6 +8152,79 @@ real_update_menus (FMDirectoryView *view 2589 FM_ACTION_COPY); 2590 gtk_action_set_sensitive (action, can_copy_files); 2591 2592 + action = gtk_action_group_get_action (view->details->dir_action_group, 2593 + FM_ACTION_RESTORE_TO); 2594 + gtk_action_set_visible (action, can_copy_files && 2595 + nautilus_directory_is_in_snapshot (view->details->model)); 2596 + 2597 + action = gtk_action_group_get_action (view->details->dir_action_group, 2598 + FM_ACTION_SNAP_NOW); 2599 + 2600 + if (selection_count == 1 && nautilus_file_is_directory (NAUTILUS_FILE (selection->data))) 2601 + { 2602 + GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data)); 2603 + char *path = g_file_get_path (file); 2604 + char *fs = ts_get_zfs_filesystem (path); 2605 + if (fs) 2606 + { 2607 + gtk_action_set_visible (action, TRUE); 2608 + g_free (fs); 2609 + } 2610 + g_free (path); 2611 + g_object_unref (file); 2612 + } 2613 + else 2614 + gtk_action_set_visible (action, FALSE); 2615 + 2616 + action = gtk_action_group_get_action (view->details->dir_action_group, 2617 + FM_ACTION_HAS_SNAPSHOT); 2618 + 2619 + if (selection_count == 1) 2620 + { 2621 + GValue name = { 0, }; 2622 + int result = nautilus_file_has_snapshot_version (NAUTILUS_FILE (selection->data)); 2623 + 2624 + switch (result) 2625 + { 2626 + case NO: 2627 + gtk_action_set_visible (action, FALSE); 2628 + break; 2629 + case YES: 2630 + gtk_action_set_visible (action, TRUE); 2631 + gtk_action_set_sensitive (action, TRUE); 2632 + g_value_init (&name,G_TYPE_STRING); 2633 + /* SUN_BRANDING */ 2634 + g_value_set_static_string (&name, _("Explore versions")); 2635 + g_object_set_property (G_OBJECT (action), "label", &name); 2636 + break; 2637 + case UNKNOWN_STATE: 2638 + gtk_action_set_visible (action, TRUE); 2639 + gtk_action_set_sensitive (action, FALSE); 2640 + g_value_init (&name,G_TYPE_STRING); 2641 + /* SUN_BRANDING */ 2642 + g_value_set_static_string (&name, _("Scanning for versions")); 2643 + g_object_set_property (G_OBJECT (action), "label", &name); 2644 + break; 2645 + } 2646 + 2647 + 2648 + if (result == UNKNOWN_STATE) 2649 + { 2650 + HasSnapshotData *data = g_new0 (HasSnapshotData, 1); 2651 + data->action = action; 2652 + data->file = NAUTILUS_FILE (selection->data); 2653 + data->cancel = g_cancellable_new (); 2654 + nautilus_file_get_snapshot_version (NAUTILUS_FILE (selection->data), 2655 + has_snapshot_ready_callback, 2656 + data->cancel, 2657 + data); 2658 + } 2659 + } 2660 + else 2661 + gtk_action_set_visible (action, FALSE); 2662 + 2663 + 2664 + 2665 real_update_paste_menu (view, selection, selection_count); 2666 2667 action = gtk_action_group_get_action (view->details->dir_action_group, 2668 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/file-manager/nautilus-directory-view-ui.xml nautilus-2.24.2/src/file-manager/nautilus-directory-view-ui.xml 2669 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/file-manager/nautilus-directory-view-ui.xml 2008-10-06 19:22:18.000000000 +0200 2670 +++ nautilus-2.24.2/src/file-manager/nautilus-directory-view-ui.xml 2009-01-23 22:36:10.677724357 +0100 2671 @@ -64,6 +64,9 @@ 2672 <menuitem name="Duplicate" action="Duplicate"/> 2673 <menuitem name="Create Link" action="Create Link"/> 2674 <menuitem name="Rename" action="Rename"/> 2675 + <menuitem name="Restore to" action="Restore to"/> 2676 + <menuitem name="Snapshot now" action="Snap Now"/> 2677 + <menuitem name="Scanning...." action="View Snap"/> 2678 </placeholder> 2679 <placeholder name="Dangerous File Items Placeholder"> 2680 <menuitem name="Trash" action="Trash"/> 2681 @@ -147,6 +150,9 @@ 2682 <placeholder name="File Actions"> 2683 <menuitem name="Create Link" action="Create Link"/> 2684 <menuitem name="Rename" action="Rename"/> 2685 + <menuitem name="Restore to" action="Restore to"/> 2686 + <menuitem name="Snapshot now" action="Snap Now"/> 2687 + <menuitem name="Scanning...." action="View Snap"/> 2688 </placeholder> 2689 <separator name="Dangerous separator"/> 2690 <placeholder name="Dangerous File Actions"> 2691 @@ -184,6 +190,7 @@ 2692 </placeholder> 2693 <separator name="Location After Clipboard Separator"/> 2694 <placeholder name="Dangerous File Actions"> 2695 + <menuitem name="Restore" action="Restore"/> 2696 <menuitem name="Trash" action="LocationTrash"/> 2697 <menuitem name="Delete" action="LocationDelete"/> 2698 <menuitem name="Restore From Trash" action="LocationRestoreFromTrash"/> 2699 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/nautilus-actions.h nautilus-2.24.2/src/nautilus-actions.h 2700 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/nautilus-actions.h 2008-10-06 19:22:18.000000000 +0200 2701 +++ nautilus-2.24.2/src/nautilus-actions.h 2009-01-23 22:36:10.788601269 +0100 2702 @@ -28,6 +28,7 @@ 2703 2704 #define NAUTILUS_ACTION_STOP "Stop" 2705 #define NAUTILUS_ACTION_RELOAD "Reload" 2706 +#define NAUTILUS_ACTION_RESTORE "Restore" 2707 #define NAUTILUS_ACTION_BACK "Back" 2708 #define NAUTILUS_ACTION_UP "Up" 2709 #define NAUTILUS_ACTION_UP_ACCEL "UpAccel" 2710 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/nautilus-file-management-properties.c nautilus-2.24.2/src/nautilus-file-management-properties.c 2711 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/nautilus-file-management-properties.c 2008-10-06 19:22:18.000000000 +0200 2712 +++ nautilus-2.24.2/src/nautilus-file-management-properties.c 2009-01-23 22:36:10.640141631 +0100 2713 @@ -73,6 +73,7 @@ 2714 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_TREE_VIEW_FOLDERS_WIDGET "treeview_folders_checkbutton" 2715 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_MEDIA_AUTOMOUNT_OPEN "media_automount_open_checkbutton" 2716 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_MEDIA_AUTORUN_NEVER "media_autorun_never_checkbutton" 2717 +#define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ENABLE_TIME_SLIDER "time_slider_enabled_checkbutton" 2718 2719 /* int enums */ 2720 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_THUMBNAIL_LIMIT_WIDGET "preview_image_size_combobox" 2721 @@ -725,6 +726,9 @@ nautilus_file_management_properties_dial 2722 eel_preferences_glade_connect_bool (xml_dialog, 2723 NAUTILUS_FILE_MANAGEMENT_PROPERTIES_TREE_VIEW_FOLDERS_WIDGET, 2724 NAUTILUS_PREFERENCES_TREE_SHOW_ONLY_DIRECTORIES); 2725 + eel_preferences_glade_connect_bool (xml_dialog, 2726 + NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ENABLE_TIME_SLIDER, 2727 + NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER); 2728 2729 eel_preferences_glade_connect_string_enum_combo_box (xml_dialog, 2730 NAUTILUS_FILE_MANAGEMENT_PROPERTIES_DEFAULT_VIEW_WIDGET, 2731 diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/nautilus-file-management-properties.glade nautilus-2.24.2/src/nautilus-file-management-properties.glade 2732 --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/nautilus-file-management-properties.glade 2008-10-06 19:22:18.000000000 +0200 2733 +++ nautilus-2.24.2/src/nautilus-file-management-properties.glade 2009-01-23 22:36:10.778222728 +0100 2734 @@ -1,2041 +1,1167 @@ 2735 -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> 2736 -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> 2737 - 2738 +<?xml version="1.0" encoding="UTF-8" standalone="no"?> 2739 +<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> 2740 +<!--*- mode: xml -*--> 2741 <glade-interface> 2742 - 2743 -<widget class="GtkDialog" id="file_management_dialog"> 2744 - <property name="border_width">5</property> 2745 - <property name="title" translatable="yes">File Management Preferences</property> 2746 - <property name="type">GTK_WINDOW_TOPLEVEL</property> 2747 - <property name="window_position">GTK_WIN_POS_CENTER</property> 2748 - <property name="modal">False</property> 2749 - <property name="resizable">True</property> 2750 - <property name="destroy_with_parent">False</property> 2751 - <property name="decorated">True</property> 2752 - <property name="skip_taskbar_hint">False</property> 2753 - <property name="skip_pager_hint">False</property> 2754 - <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> 2755 - <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> 2756 - <property name="focus_on_map">True</property> 2757 - <property name="urgency_hint">False</property> 2758 - <property name="has_separator">False</property> 2759 - 2760 - <child internal-child="vbox"> 2761 - <widget class="GtkVBox" id="dialog-vbox1"> 2762 - <property name="visible">True</property> 2763 - <property name="homogeneous">False</property> 2764 - <property name="spacing">2</property> 2765 - 2766 - <child internal-child="action_area"> 2767 - <widget class="GtkHButtonBox" id="dialog-action_area1"> 2768 - <property name="visible">True</property> 2769 - <property name="layout_style">GTK_BUTTONBOX_END</property> 2770 - 2771 - <child> 2772 - <widget class="GtkButton" id="helpbutton1"> 2773 - <property name="visible">True</property> 2774 - <property name="can_default">True</property> 2775 - <property name="can_focus">True</property> 2776 - <property name="label">gtk-help</property> 2777 - <property name="use_stock">True</property> 2778 - <property name="relief">GTK_RELIEF_NORMAL</property> 2779 - <property name="focus_on_click">True</property> 2780 - <property name="response_id">-11</property> 2781 - </widget> 2782 - </child> 2783 - 2784 - <child> 2785 - <widget class="GtkButton" id="closebutton1"> 2786 - <property name="visible">True</property> 2787 - <property name="can_default">True</property> 2788 - <property name="can_focus">True</property> 2789 - <property name="label">gtk-close</property> 2790 - <property name="use_stock">True</property> 2791 - <property name="relief">GTK_RELIEF_NORMAL</property> 2792 - <property name="focus_on_click">True</property> 2793 - <property name="response_id">-7</property> 2794 - </widget> 2795 - </child> 2796 - </widget> 2797 - <packing> 2798 - <property name="padding">0</property> 2799 - <property name="expand">False</property> 2800 - <property name="fill">True</property> 2801 - <property name="pack_type">GTK_PACK_END</property> 2802 - </packing> 2803 - </child> 2804 - 2805 - <child> 2806 - <widget class="GtkNotebook" id="notebook1"> 2807 - <property name="border_width">5</property> 2808 - <property name="visible">True</property> 2809 - <property name="can_focus">True</property> 2810 - <property name="show_tabs">True</property> 2811 - <property name="show_border">True</property> 2812 - <property name="tab_pos">GTK_POS_TOP</property> 2813 - <property name="scrollable">False</property> 2814 - <property name="enable_popup">False</property> 2815 - 2816 - <child> 2817 - <widget class="GtkVBox" id="vbox1"> 2818 - <property name="border_width">12</property> 2819 - <property name="visible">True</property> 2820 - <property name="homogeneous">False</property> 2821 - <property name="spacing">18</property> 2822 - 2823 - <child> 2824 - <widget class="GtkVBox" id="vbox2"> 2825 - <property name="visible">True</property> 2826 - <property name="homogeneous">False</property> 2827 - <property name="spacing">6</property> 2828 - 2829 - <child> 2830 - <widget class="GtkLabel" id="label4"> 2831 - <property name="visible">True</property> 2832 - <property name="label" translatable="yes"><b>Default View</b></property> 2833 - <property name="use_underline">False</property> 2834 - <property name="use_markup">True</property> 2835 - <property name="justify">GTK_JUSTIFY_LEFT</property> 2836 - <property name="wrap">False</property> 2837 - <property name="selectable">False</property> 2838 - <property name="xalign">0</property> 2839 - <property name="yalign">0.5</property> 2840 - <property name="xpad">0</property> 2841 - <property name="ypad">0</property> 2842 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 2843 - <property name="width_chars">-1</property> 2844 - <property name="single_line_mode">False</property> 2845 - <property name="angle">0</property> 2846 - </widget> 2847 - <packing> 2848 - <property name="padding">0</property> 2849 - <property name="expand">False</property> 2850 - <property name="fill">False</property> 2851 - </packing> 2852 - </child> 2853 - 2854 - <child> 2855 - <widget class="GtkAlignment" id="alignment2"> 2856 - <property name="visible">True</property> 2857 - <property name="xalign">0.5</property> 2858 - <property name="yalign">0.5</property> 2859 - <property name="xscale">1</property> 2860 - <property name="yscale">1</property> 2861 - <property name="top_padding">0</property> 2862 - <property name="bottom_padding">0</property> 2863 - <property name="left_padding">12</property> 2864 - <property name="right_padding">0</property> 2865 - 2866 - <child> 2867 - <widget class="GtkVBox" id="vbox14"> 2868 - <property name="visible">True</property> 2869 - <property name="homogeneous">False</property> 2870 - <property name="spacing">6</property> 2871 - 2872 - <child> 2873 - <widget class="GtkHBox" id="hbox34"> 2874 - <property name="visible">True</property> 2875 - <property name="homogeneous">False</property> 2876 - <property name="spacing">12</property> 2877 - 2878 - <child> 2879 - <widget class="GtkLabel" id="views_label_0"> 2880 - <property name="visible">True</property> 2881 - <property name="label" translatable="yes">View _new folders using:</property> 2882 - <property name="use_underline">True</property> 2883 - <property name="use_markup">False</property> 2884 - <property name="justify">GTK_JUSTIFY_LEFT</property> 2885 - <property name="wrap">False</property> 2886 - <property name="selectable">False</property> 2887 - <property name="xalign">0</property> 2888 - <property name="yalign">0.5</property> 2889 - <property name="xpad">0</property> 2890 - <property name="ypad">0</property> 2891 - <property name="mnemonic_widget">default_view_combobox</property> 2892 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 2893 - <property name="width_chars">-1</property> 2894 - <property name="single_line_mode">False</property> 2895 - <property name="angle">0</property> 2896 - </widget> 2897 - <packing> 2898 - <property name="padding">0</property> 2899 - <property name="expand">False</property> 2900 - <property name="fill">False</property> 2901 - </packing> 2902 - </child> 2903 - 2904 - <child> 2905 - <widget class="GtkComboBox" id="default_view_combobox"> 2906 - <property name="visible">True</property> 2907 - <property name="items" translatable="yes">Icon View 2908 + <widget class="GtkDialog" id="file_management_dialog"> 2909 + <property name="border_width">5</property> 2910 + <property name="title" translatable="yes">File Management Preferences</property> 2911 + <property name="window_position">GTK_WIN_POS_CENTER</property> 2912 + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> 2913 + <property name="has_separator">False</property> 2914 + <child internal-child="vbox"> 2915 + <widget class="GtkVBox" id="dialog-vbox1"> 2916 + <property name="visible">True</property> 2917 + <property name="spacing">2</property> 2918 + <child> 2919 + <widget class="GtkNotebook" id="notebook1"> 2920 + <property name="visible">True</property> 2921 + <property name="can_focus">True</property> 2922 + <property name="border_width">5</property> 2923 + <child> 2924 + <widget class="GtkVBox" id="vbox1"> 2925 + <property name="visible">True</property> 2926 + <property name="border_width">12</property> 2927 + <property name="spacing">18</property> 2928 + <child> 2929 + <widget class="GtkVBox" id="vbox2"> 2930 + <property name="visible">True</property> 2931 + <property name="spacing">6</property> 2932 + <child> 2933 + <widget class="GtkLabel" id="label4"> 2934 + <property name="visible">True</property> 2935 + <property name="xalign">0</property> 2936 + <property name="label" translatable="yes"><b>Default View</b></property> 2937 + <property name="use_markup">True</property> 2938 + </widget> 2939 + <packing> 2940 + <property name="expand">False</property> 2941 + <property name="fill">False</property> 2942 + </packing> 2943 + </child> 2944 + <child> 2945 + <widget class="GtkAlignment" id="alignment2"> 2946 + <property name="visible">True</property> 2947 + <property name="left_padding">12</property> 2948 + <child> 2949 + <widget class="GtkVBox" id="vbox14"> 2950 + <property name="visible">True</property> 2951 + <property name="spacing">6</property> 2952 + <child> 2953 + <widget class="GtkHBox" id="hbox34"> 2954 + <property name="visible">True</property> 2955 + <property name="spacing">12</property> 2956 + <child> 2957 + <widget class="GtkLabel" id="views_label_0"> 2958 + <property name="visible">True</property> 2959 + <property name="xalign">0</property> 2960 + <property name="label" translatable="yes">View _new folders using:</property> 2961 + <property name="use_underline">True</property> 2962 + <property name="mnemonic_widget">default_view_combobox</property> 2963 + </widget> 2964 + <packing> 2965 + <property name="expand">False</property> 2966 + <property name="fill">False</property> 2967 + </packing> 2968 + </child> 2969 + <child> 2970 + <widget class="GtkComboBox" id="default_view_combobox"> 2971 + <property name="visible">True</property> 2972 + <property name="items" translatable="yes">Icon View 2973 List View 2974 Compact View</property> 2975 - <property name="add_tearoffs">False</property> 2976 - <property name="focus_on_click">True</property> 2977 - </widget> 2978 - <packing> 2979 - <property name="padding">0</property> 2980 - <property name="expand">True</property> 2981 - <property name="fill">True</property> 2982 - </packing> 2983 - </child> 2984 - </widget> 2985 - <packing> 2986 - <property name="padding">0</property> 2987 - <property name="expand">True</property> 2988 - <property name="fill">True</property> 2989 - </packing> 2990 - </child> 2991 - 2992 - <child> 2993 - <widget class="GtkHBox" id="hbox11"> 2994 - <property name="visible">True</property> 2995 - <property name="homogeneous">False</property> 2996 - <property name="spacing">12</property> 2997 - 2998 - <child> 2999 - <widget class="GtkLabel" id="views_label_1"> 3000 - <property name="visible">True</property> 3001 - <property name="label" translatable="yes">_Arrange items:</property> 3002 - <property name="use_underline">True</property> 3003 - <property name="use_markup">False</property> 3004 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3005 - <property name="wrap">False</property> 3006 - <property name="selectable">False</property> 3007 - <property name="xalign">0</property> 3008 - <property name="yalign">0.5</property> 3009 - <property name="xpad">0</property> 3010 - <property name="ypad">0</property> 3011 - <property name="mnemonic_widget">sort_order_combobox</property> 3012 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3013 - <property name="width_chars">-1</property> 3014 - <property name="single_line_mode">False</property> 3015 - <property name="angle">0</property> 3016 - </widget> 3017 - <packing> 3018 - <property name="padding">0</property> 3019 - <property name="expand">False</property> 3020 - <property name="fill">False</property> 3021 - </packing> 3022 - </child> 3023 - 3024 - <child> 3025 - <widget class="GtkComboBox" id="sort_order_combobox"> 3026 - <property name="visible">True</property> 3027 - <property name="items" translatable="yes">By Name 3028 + </widget> 3029 + <packing> 3030 + <property name="position">1</property> 3031 + </packing> 3032 + </child> 3033 + </widget> 3034 + </child> 3035 + <child> 3036 + <widget class="GtkHBox" id="hbox11"> 3037 + <property name="visible">True</property> 3038 + <property name="spacing">12</property> 3039 + <child> 3040 + <widget class="GtkLabel" id="views_label_1"> 3041 + <property name="visible">True</property> 3042 + <property name="xalign">0</property> 3043 + <property name="label" translatable="yes">_Arrange items:</property> 3044 + <property name="use_underline">True</property> 3045 + <property name="mnemonic_widget">sort_order_combobox</property> 3046 + </widget> 3047 + <packing> 3048 + <property name="expand">False</property> 3049 + <property name="fill">False</property> 3050 + </packing> 3051 + </child> 3052 + <child> 3053 + <widget class="GtkComboBox" id="sort_order_combobox"> 3054 + <property name="visible">True</property> 3055 + <property name="items" translatable="yes">By Name 3056 By Size 3057 By Type 3058 By Modification Date 3059 By Emblems</property> 3060 - <property name="add_tearoffs">False</property> 3061 - <property name="focus_on_click">True</property> 3062 - </widget> 3063 - <packing> 3064 - <property name="padding">0</property> 3065 - <property name="expand">True</property> 3066 - <property name="fill">True</property> 3067 - </packing> 3068 - </child> 3069 - </widget> 3070 - <packing> 3071 - <property name="padding">0</property> 3072 - <property name="expand">True</property> 3073 - <property name="fill">True</property> 3074 - </packing> 3075 - </child> 3076 - 3077 - <child> 3078 - <widget class="GtkCheckButton" id="sort_folders_first_checkbutton"> 3079 - <property name="visible">True</property> 3080 - <property name="can_focus">True</property> 3081 - <property name="label" translatable="yes">Sort _folders before files</property> 3082 - <property name="use_underline">True</property> 3083 - <property name="relief">GTK_RELIEF_NORMAL</property> 3084 - <property name="focus_on_click">True</property> 3085 - <property name="active">False</property> 3086 - <property name="inconsistent">False</property> 3087 - <property name="draw_indicator">True</property> 3088 - </widget> 3089 - <packing> 3090 - <property name="padding">0</property> 3091 - <property name="expand">False</property> 3092 - <property name="fill">False</property> 3093 - </packing> 3094 - </child> 3095 - 3096 - <child> 3097 - <widget class="GtkCheckButton" id="hidden_files_checkbutton"> 3098 - <property name="visible">True</property> 3099 - <property name="can_focus">True</property> 3100 - <property name="label" translatable="yes">Show hidden and _backup files</property> 3101 - <property name="use_underline">True</property> 3102 - <property name="relief">GTK_RELIEF_NORMAL</property> 3103 - <property name="focus_on_click">True</property> 3104 - <property name="active">False</property> 3105 - <property name="inconsistent">False</property> 3106 - <property name="draw_indicator">True</property> 3107 - </widget> 3108 - <packing> 3109 - <property name="padding">0</property> 3110 - <property name="expand">False</property> 3111 - <property name="fill">False</property> 3112 - </packing> 3113 - </child> 3114 - </widget> 3115 - </child> 3116 - </widget> 3117 - <packing> 3118 - <property name="padding">0</property> 3119 - <property name="expand">True</property> 3120 - <property name="fill">True</property> 3121 - </packing> 3122 - </child> 3123 - </widget> 3124 - <packing> 3125 - <property name="padding">0</property> 3126 - <property name="expand">False</property> 3127 - <property name="fill">True</property> 3128 - </packing> 3129 - </child> 3130 - 3131 - <child> 3132 - <widget class="GtkVBox" id="vbox3"> 3133 - <property name="visible">True</property> 3134 - <property name="homogeneous">False</property> 3135 - <property name="spacing">6</property> 3136 - 3137 - <child> 3138 - <widget class="GtkLabel" id="label5"> 3139 - <property name="visible">True</property> 3140 - <property name="label" translatable="yes"><b>Icon View Defaults</b></property> 3141 - <property name="use_underline">False</property> 3142 - <property name="use_markup">True</property> 3143 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3144 - <property name="wrap">False</property> 3145 - <property name="selectable">False</property> 3146 - <property name="xalign">0</property> 3147 - <property name="yalign">0.5</property> 3148 - <property name="xpad">0</property> 3149 - <property name="ypad">0</property> 3150 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3151 - <property name="width_chars">-1</property> 3152 - <property name="single_line_mode">False</property> 3153 - <property name="angle">0</property> 3154 - </widget> 3155 - <packing> 3156 - <property name="padding">0</property> 3157 - <property name="expand">False</property> 3158 - <property name="fill">False</property> 3159 - </packing> 3160 - </child> 3161 - 3162 - <child> 3163 - <widget class="GtkAlignment" id="alignment1"> 3164 - <property name="visible">True</property> 3165 - <property name="xalign">0.5</property> 3166 - <property name="yalign">0.5</property> 3167 - <property name="xscale">1</property> 3168 - <property name="yscale">1</property> 3169 - <property name="top_padding">0</property> 3170 - <property name="bottom_padding">0</property> 3171 - <property name="left_padding">12</property> 3172 - <property name="right_padding">0</property> 3173 - 3174 - <child> 3175 - <widget class="GtkVBox" id="vbox16"> 3176 - <property name="visible">True</property> 3177 - <property name="homogeneous">False</property> 3178 - <property name="spacing">6</property> 3179 - 3180 - <child> 3181 - <widget class="GtkHBox" id="hbox35"> 3182 - <property name="visible">True</property> 3183 - <property name="homogeneous">False</property> 3184 - <property name="spacing">12</property> 3185 - 3186 - <child> 3187 - <widget class="GtkLabel" id="views_label_2"> 3188 - <property name="visible">True</property> 3189 - <property name="label" translatable="yes">Default _zoom level:</property> 3190 - <property name="use_underline">True</property> 3191 - <property name="use_markup">False</property> 3192 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3193 - <property name="wrap">False</property> 3194 - <property name="selectable">False</property> 3195 - <property name="xalign">0</property> 3196 - <property name="yalign">0.5</property> 3197 - <property name="xpad">0</property> 3198 - <property name="ypad">0</property> 3199 - <property name="mnemonic_widget">icon_view_zoom_combobox</property> 3200 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3201 - <property name="width_chars">-1</property> 3202 - <property name="single_line_mode">False</property> 3203 - <property name="angle">0</property> 3204 - </widget> 3205 - <packing> 3206 - <property name="padding">0</property> 3207 - <property name="expand">False</property> 3208 - <property name="fill">False</property> 3209 - </packing> 3210 - </child> 3211 - 3212 - <child> 3213 - <widget class="GtkComboBox" id="icon_view_zoom_combobox"> 3214 - <property name="visible">True</property> 3215 - <property name="items" translatable="yes">33% 3216 + </widget> 3217 + <packing> 3218 + <property name="position">1</property> 3219 + </packing> 3220 + </child> 3221 + </widget> 3222 + <packing> 3223 + <property name="position">1</property> 3224 + </packing> 3225 + </child> 3226 + <child> 3227 + <widget class="GtkCheckButton" id="sort_folders_first_checkbutton"> 3228 + <property name="visible">True</property> 3229 + <property name="can_focus">True</property> 3230 + <property name="label" translatable="yes">Sort _folders before files</property> 3231 + <property name="use_underline">True</property> 3232 + <property name="response_id">0</property> 3233 + <property name="draw_indicator">True</property> 3234 + </widget> 3235 + <packing> 3236 + <property name="expand">False</property> 3237 + <property name="fill">False</property> 3238 + <property name="position">2</property> 3239 + </packing> 3240 + </child> 3241 + <child> 3242 + <widget class="GtkCheckButton" id="hidden_files_checkbutton"> 3243 + <property name="visible">True</property> 3244 + <property name="can_focus">True</property> 3245 + <property name="label" translatable="yes">Show hidden and _backup files</property> 3246 + <property name="use_underline">True</property> 3247 + <property name="response_id">0</property> 3248 + <property name="draw_indicator">True</property> 3249 + </widget> 3250 + <packing> 3251 + <property name="expand">False</property> 3252 + <property name="fill">False</property> 3253 + <property name="position">3</property> 3254 + </packing> 3255 + </child> 3256 + </widget> 3257 + </child> 3258 + </widget> 3259 + <packing> 3260 + <property name="position">1</property> 3261 + </packing> 3262 + </child> 3263 + </widget> 3264 + <packing> 3265 + <property name="expand">False</property> 3266 + </packing> 3267 + </child> 3268 + <child> 3269 + <widget class="GtkVBox" id="vbox3"> 3270 + <property name="visible">True</property> 3271 + <property name="spacing">6</property> 3272 + <child> 3273 + <widget class="GtkLabel" id="label5"> 3274 + <property name="visible">True</property> 3275 + <property name="xalign">0</property> 3276 + <property name="label" translatable="yes"><b>Icon View Defaults</b></property> 3277 + <property name="use_markup">True</property> 3278 + </widget> 3279 + <packing> 3280 + <property name="expand">False</property> 3281 + <property name="fill">False</property> 3282 + </packing> 3283 + </child> 3284 + <child> 3285 + <widget class="GtkAlignment" id="alignment1"> 3286 + <property name="visible">True</property> 3287 + <property name="left_padding">12</property> 3288 + <child> 3289 + <widget class="GtkVBox" id="vbox16"> 3290 + <property name="visible">True</property> 3291 + <property name="spacing">6</property> 3292 + <child> 3293 + <widget class="GtkHBox" id="hbox35"> 3294 + <property name="visible">True</property> 3295 + <property name="spacing">12</property> 3296 + <child> 3297 + <widget class="GtkLabel" id="views_label_2"> 3298 + <property name="visible">True</property> 3299 + <property name="xalign">0</property> 3300 + <property name="label" translatable="yes">Default _zoom level:</property> 3301 + <property name="use_underline">True</property> 3302 + <property name="mnemonic_widget">icon_view_zoom_combobox</property> 3303 + </widget> 3304 + <packing> 3305 + <property name="expand">False</property> 3306 + <property name="fill">False</property> 3307 + </packing> 3308 + </child> 3309 + <child> 3310 + <widget class="GtkComboBox" id="icon_view_zoom_combobox"> 3311 + <property name="visible">True</property> 3312 + <property name="items" translatable="yes">33% 3313 50% 3314 66% 3315 100% 3316 150% 3317 200% 3318 400%</property> 3319 - <property name="add_tearoffs">False</property> 3320 - <property name="focus_on_click">True</property> 3321 - </widget> 3322 - <packing> 3323 - <property name="padding">0</property> 3324 - <property name="expand">True</property> 3325 - <property name="fill">True</property> 3326 - </packing> 3327 - </child> 3328 - </widget> 3329 - <packing> 3330 - <property name="padding">0</property> 3331 - <property name="expand">True</property> 3332 - <property name="fill">True</property> 3333 - </packing> 3334 - </child> 3335 - 3336 - <child> 3337 - <widget class="GtkCheckButton" id="compact_layout_checkbutton"> 3338 - <property name="visible">True</property> 3339 - <property name="can_focus">True</property> 3340 - <property name="label" translatable="yes">_Use compact layout</property> 3341 - <property name="use_underline">True</property> 3342 - <property name="relief">GTK_RELIEF_NORMAL</property> 3343 - <property name="focus_on_click">True</property> 3344 - <property name="active">False</property> 3345 - <property name="inconsistent">False</property> 3346 - <property name="draw_indicator">True</property> 3347 - </widget> 3348 - <packing> 3349 - <property name="padding">0</property> 3350 - <property name="expand">False</property> 3351 - <property name="fill">False</property> 3352 - </packing> 3353 - </child> 3354 - 3355 - <child> 3356 - <widget class="GtkCheckButton" id="labels_beside_icons_checkbutton"> 3357 - <property name="visible">True</property> 3358 - <property name="can_focus">True</property> 3359 - <property name="label" translatable="yes">_Text beside icons</property> 3360 - <property name="use_underline">True</property> 3361 - <property name="relief">GTK_RELIEF_NORMAL</property> 3362 - <property name="focus_on_click">True</property> 3363 - <property name="active">False</property> 3364 - <property name="inconsistent">False</property> 3365 - <property name="draw_indicator">True</property> 3366 - </widget> 3367 - <packing> 3368 - <property name="padding">0</property> 3369 - <property name="expand">False</property> 3370 - <property name="fill">False</property> 3371 - </packing> 3372 - </child> 3373 - </widget> 3374 - </child> 3375 - </widget> 3376 - <packing> 3377 - <property name="padding">0</property> 3378 - <property name="expand">True</property> 3379 - <property name="fill">True</property> 3380 - </packing> 3381 - </child> 3382 - </widget> 3383 - <packing> 3384 - <property name="padding">0</property> 3385 - <property name="expand">False</property> 3386 - <property name="fill">True</property> 3387 - </packing> 3388 - </child> 3389 - 3390 - <child> 3391 - <widget class="GtkVBox" id="vbox"> 3392 - <property name="visible">True</property> 3393 - <property name="homogeneous">False</property> 3394 - <property name="spacing">6</property> 3395 - 3396 - <child> 3397 - <widget class="GtkLabel" id="label"> 3398 - <property name="visible">True</property> 3399 - <property name="label" translatable="yes"><b>Compact View Defaults</b></property> 3400 - <property name="use_underline">False</property> 3401 - <property name="use_markup">True</property> 3402 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3403 - <property name="wrap">False</property> 3404 - <property name="selectable">False</property> 3405 - <property name="xalign">0</property> 3406 - <property name="yalign">0.5</property> 3407 - <property name="xpad">0</property> 3408 - <property name="ypad">0</property> 3409 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3410 - <property name="width_chars">-1</property> 3411 - <property name="single_line_mode">False</property> 3412 - <property name="angle">0</property> 3413 - </widget> 3414 - <packing> 3415 - <property name="padding">0</property> 3416 - <property name="expand">False</property> 3417 - <property name="fill">False</property> 3418 - </packing> 3419 - </child> 3420 - 3421 - <child> 3422 - <widget class="GtkAlignment" id="alignment"> 3423 - <property name="visible">True</property> 3424 - <property name="xalign">0.5</property> 3425 - <property name="yalign">0.5</property> 3426 - <property name="xscale">1</property> 3427 - <property name="yscale">1</property> 3428 - <property name="top_padding">0</property> 3429 - <property name="bottom_padding">0</property> 3430 - <property name="left_padding">12</property> 3431 - <property name="right_padding">0</property> 3432 - 3433 - <child> 3434 - <widget class="GtkVBox" id="vbox"> 3435 - <property name="visible">True</property> 3436 - <property name="homogeneous">False</property> 3437 - <property name="spacing">6</property> 3438 - 3439 - <child> 3440 - <widget class="GtkHBox" id="hbox"> 3441 - <property name="visible">True</property> 3442 - <property name="homogeneous">False</property> 3443 - <property name="spacing">12</property> 3444 - 3445 - <child> 3446 - <widget class="GtkLabel" id="views_label_4"> 3447 - <property name="visible">True</property> 3448 - <property name="label" translatable="yes">_Default zoom level:</property> 3449 - <property name="use_underline">True</property> 3450 - <property name="use_markup">False</property> 3451 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3452 - <property name="wrap">False</property> 3453 - <property name="selectable">False</property> 3454 - <property name="xalign">0</property> 3455 - <property name="yalign">0.5</property> 3456 - <property name="xpad">0</property> 3457 - <property name="ypad">0</property> 3458 - <property name="mnemonic_widget">compact_view_zoom_combobox</property> 3459 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3460 - <property name="width_chars">-1</property> 3461 - <property name="single_line_mode">False</property> 3462 - <property name="angle">0</property> 3463 - </widget> 3464 - <packing> 3465 - <property name="padding">0</property> 3466 - <property name="expand">False</property> 3467 - <property name="fill">False</property> 3468 - </packing> 3469 - </child> 3470 - 3471 - <child> 3472 - <widget class="GtkComboBox" id="compact_view_zoom_combobox"> 3473 - <property name="visible">True</property> 3474 - <property name="items" translatable="yes">33% 3475 + </widget> 3476 + <packing> 3477 + <property name="position">1</property> 3478 + </packing> 3479 + </child> 3480 + </widget> 3481 + </child> 3482 + <child> 3483 + <widget class="GtkCheckButton" id="compact_layout_checkbutton"> 3484 + <property name="visible">True</property> 3485 + <property name="can_focus">True</property> 3486 + <property name="label" translatable="yes">_Use compact layout</property> 3487 + <property name="use_underline">True</property> 3488 + <property name="response_id">0</property> 3489 + <property name="draw_indicator">True</property> 3490 + </widget> 3491 + <packing> 3492 + <property name="expand">False</property> 3493 + <property name="fill">False</property> 3494 + <property name="position">1</property> 3495 + </packing> 3496 + </child> 3497 + <child> 3498 + <widget class="GtkCheckButton" id="labels_beside_icons_checkbutton"> 3499 + <property name="visible">True</property> 3500 + <property name="can_focus">True</property> 3501 + <property name="label" translatable="yes">_Text beside icons</property> 3502 + <property name="use_underline">True</property> 3503 + <property name="response_id">0</property> 3504 + <property name="draw_indicator">True</property> 3505 + </widget> 3506 + <packing> 3507 + <property name="expand">False</property> 3508 + <property name="fill">False</property> 3509 + <property name="position">2</property> 3510 + </packing> 3511 + </child> 3512 + </widget> 3513 + </child> 3514 + </widget> 3515 + <packing> 3516 + <property name="position">1</property> 3517 + </packing> 3518 + </child> 3519 + </widget> 3520 + <packing> 3521 + <property name="expand">False</property> 3522 + <property name="position">1</property> 3523 + </packing> 3524 + </child> 3525 + <child> 3526 + <widget class="GtkVBox" id="vbox"> 3527 + <property name="visible">True</property> 3528 + <property name="spacing">6</property> 3529 + <child> 3530 + <widget class="GtkLabel" id="label"> 3531 + <property name="visible">True</property> 3532 + <property name="xalign">0</property> 3533 + <property name="label" translatable="yes"><b>Compact View Defaults</b></property> 3534 + <property name="use_markup">True</property> 3535 + </widget> 3536 + <packing> 3537 + <property name="expand">False</property> 3538 + <property name="fill">False</property> 3539 + </packing> 3540 + </child> 3541 + <child> 3542 + <widget class="GtkAlignment" id="alignment"> 3543 + <property name="visible">True</property> 3544 + <property name="left_padding">12</property> 3545 + <child> 3546 + <widget class="GtkVBox" id="vbox"> 3547 + <property name="visible">True</property> 3548 + <property name="spacing">6</property> 3549 + <child> 3550 + <widget class="GtkHBox" id="hbox"> 3551 + <property name="visible">True</property> 3552 + <property name="spacing">12</property> 3553 + <child> 3554 + <widget class="GtkLabel" id="views_label_4"> 3555 + <property name="visible">True</property> 3556 + <property name="xalign">0</property> 3557 + <property name="label" translatable="yes">_Default zoom level:</property> 3558 + <property name="use_underline">True</property> 3559 + <property name="mnemonic_widget">compact_view_zoom_combobox</property> 3560 + </widget> 3561 + <packing> 3562 + <property name="expand">False</property> 3563 + <property name="fill">False</property> 3564 + </packing> 3565 + </child> 3566 + <child> 3567 + <widget class="GtkComboBox" id="compact_view_zoom_combobox"> 3568 + <property name="visible">True</property> 3569 + <property name="items" translatable="yes">33% 3570 50% 3571 66% 3572 100% 3573 150% 3574 200% 3575 400%</property> 3576 - <property name="add_tearoffs">False</property> 3577 - <property name="focus_on_click">True</property> 3578 - </widget> 3579 - <packing> 3580 - <property name="padding">0</property> 3581 - <property name="expand">True</property> 3582 - <property name="fill">True</property> 3583 - </packing> 3584 - </child> 3585 - </widget> 3586 - <packing> 3587 - <property name="padding">0</property> 3588 - <property name="expand">True</property> 3589 - <property name="fill">True</property> 3590 - </packing> 3591 - </child> 3592 - 3593 - <child> 3594 - <widget class="GtkCheckButton" id="all_columns_same_width_checkbutton"> 3595 - <property name="visible">True</property> 3596 - <property name="can_focus">True</property> 3597 - <property name="label" translatable="yes">A_ll columns have the same width</property> 3598 - <property name="use_underline">True</property> 3599 - <property name="relief">GTK_RELIEF_NORMAL</property> 3600 - <property name="focus_on_click">True</property> 3601 - <property name="active">False</property> 3602 - <property name="inconsistent">False</property> 3603 - <property name="draw_indicator">True</property> 3604 - </widget> 3605 - <packing> 3606 - <property name="padding">0</property> 3607 - <property name="expand">False</property> 3608 - <property name="fill">False</property> 3609 - </packing> 3610 - </child> 3611 - </widget> 3612 - </child> 3613 - </widget> 3614 - <packing> 3615 - <property name="padding">0</property> 3616 - <property name="expand">True</property> 3617 - <property name="fill">True</property> 3618 - </packing> 3619 - </child> 3620 - </widget> 3621 - <packing> 3622 - <property name="padding">0</property> 3623 - <property name="expand">False</property> 3624 - <property name="fill">True</property> 3625 - </packing> 3626 - </child> 3627 - 3628 - <child> 3629 - <widget class="GtkVBox" id="vbox4"> 3630 - <property name="visible">True</property> 3631 - <property name="homogeneous">False</property> 3632 - <property name="spacing">6</property> 3633 - 3634 - <child> 3635 - <widget class="GtkLabel" id="label6"> 3636 - <property name="visible">True</property> 3637 - <property name="label" translatable="yes"><b>List View Defaults</b></property> 3638 - <property name="use_underline">False</property> 3639 - <property name="use_markup">True</property> 3640 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3641 - <property name="wrap">False</property> 3642 - <property name="selectable">False</property> 3643 - <property name="xalign">0</property> 3644 - <property name="yalign">0.5</property> 3645 - <property name="xpad">0</property> 3646 - <property name="ypad">0</property> 3647 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3648 - <property name="width_chars">-1</property> 3649 - <property name="single_line_mode">False</property> 3650 - <property name="angle">0</property> 3651 - </widget> 3652 - <packing> 3653 - <property name="padding">0</property> 3654 - <property name="expand">False</property> 3655 - <property name="fill">False</property> 3656 - </packing> 3657 - </child> 3658 - 3659 - <child> 3660 - <widget class="GtkAlignment" id="alignment3"> 3661 - <property name="visible">True</property> 3662 - <property name="xalign">0.5</property> 3663 - <property name="yalign">0.5</property> 3664 - <property name="xscale">1</property> 3665 - <property name="yscale">1</property> 3666 - <property name="top_padding">0</property> 3667 - <property name="bottom_padding">0</property> 3668 - <property name="left_padding">12</property> 3669 - <property name="right_padding">0</property> 3670 - 3671 - <child> 3672 - <widget class="GtkVBox" id="vbox15"> 3673 - <property name="visible">True</property> 3674 - <property name="homogeneous">False</property> 3675 - <property name="spacing">6</property> 3676 - 3677 - <child> 3678 - <widget class="GtkHBox" id="hbox36"> 3679 - <property name="visible">True</property> 3680 - <property name="homogeneous">False</property> 3681 - <property name="spacing">12</property> 3682 - 3683 - <child> 3684 - <widget class="GtkLabel" id="views_label_3"> 3685 - <property name="visible">True</property> 3686 - <property name="label" translatable="yes">D_efault zoom level:</property> 3687 - <property name="use_underline">True</property> 3688 - <property name="use_markup">False</property> 3689 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3690 - <property name="wrap">False</property> 3691 - <property name="selectable">False</property> 3692 - <property name="xalign">0</property> 3693 - <property name="yalign">0.5</property> 3694 - <property name="xpad">0</property> 3695 - <property name="ypad">0</property> 3696 - <property name="mnemonic_widget">list_view_zoom_combobox</property> 3697 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3698 - <property name="width_chars">-1</property> 3699 - <property name="single_line_mode">False</property> 3700 - <property name="angle">0</property> 3701 - </widget> 3702 - <packing> 3703 - <property name="padding">0</property> 3704 - <property name="expand">False</property> 3705 - <property name="fill">False</property> 3706 - </packing> 3707 - </child> 3708 - 3709 - <child> 3710 - <widget class="GtkComboBox" id="list_view_zoom_combobox"> 3711 - <property name="visible">True</property> 3712 - <property name="items" translatable="yes">33% 3713 + </widget> 3714 + <packing> 3715 + <property name="position">1</property> 3716 + </packing> 3717 + </child> 3718 + </widget> 3719 + </child> 3720 + <child> 3721 + <widget class="GtkCheckButton" id="all_columns_same_width_checkbutton"> 3722 + <property name="visible">True</property> 3723 + <property name="can_focus">True</property> 3724 + <property name="label" translatable="yes">A_ll columns have the same width</property> 3725 + <property name="use_underline">True</property> 3726 + <property name="response_id">0</property> 3727 + <property name="draw_indicator">True</property> 3728 + </widget> 3729 + <packing> 3730 + <property name="expand">False</property> 3731 + <property name="fill">False</property> 3732 + <property name="position">1</property> 3733 + </packing> 3734 + </child> 3735 + </widget> 3736 + </child> 3737 + </widget> 3738 + <packing> 3739 + <property name="position">1</property> 3740 + </packing> 3741 + </child> 3742 + </widget> 3743 + <packing> 3744 + <property name="expand">False</property> 3745 + <property name="position">2</property> 3746 + </packing> 3747 + </child> 3748 + <child> 3749 + <widget class="GtkVBox" id="vbox4"> 3750 + <property name="visible">True</property> 3751 + <property name="spacing">6</property> 3752 + <child> 3753 + <widget class="GtkLabel" id="label6"> 3754 + <property name="visible">True</property> 3755 + <property name="xalign">0</property> 3756 + <property name="label" translatable="yes"><b>List View Defaults</b></property> 3757 + <property name="use_markup">True</property> 3758 + </widget> 3759 + <packing> 3760 + <property name="expand">False</property> 3761 + <property name="fill">False</property> 3762 + </packing> 3763 + </child> 3764 + <child> 3765 + <widget class="GtkAlignment" id="alignment3"> 3766 + <property name="visible">True</property> 3767 + <property name="left_padding">12</property> 3768 + <child> 3769 + <widget class="GtkVBox" id="vbox15"> 3770 + <property name="visible">True</property> 3771 + <property name="spacing">6</property> 3772 + <child> 3773 + <widget class="GtkHBox" id="hbox36"> 3774 + <property name="visible">True</property> 3775 + <property name="spacing">12</property> 3776 + <child> 3777 + <widget class="GtkLabel" id="views_label_3"> 3778 + <property name="visible">True</property> 3779 + <property name="xalign">0</property> 3780 + <property name="label" translatable="yes">D_efault zoom level:</property> 3781 + <property name="use_underline">True</property> 3782 + <property name="mnemonic_widget">list_view_zoom_combobox</property> 3783 + </widget> 3784 + <packing> 3785 + <property name="expand">False</property> 3786 + <property name="fill">False</property> 3787 + </packing> 3788 + </child> 3789 + <child> 3790 + <widget class="GtkComboBox" id="list_view_zoom_combobox"> 3791 + <property name="visible">True</property> 3792 + <property name="items" translatable="yes">33% 3793 50% 3794 66% 3795 100% 3796 150% 3797 200% 3798 400%</property> 3799 - <property name="add_tearoffs">False</property> 3800 - <property name="focus_on_click">True</property> 3801 - </widget> 3802 - <packing> 3803 - <property name="padding">0</property> 3804 - <property name="expand">True</property> 3805 - <property name="fill">True</property> 3806 - </packing> 3807 - </child> 3808 - </widget> 3809 - <packing> 3810 - <property name="padding">0</property> 3811 - <property name="expand">True</property> 3812 - <property name="fill">True</property> 3813 - </packing> 3814 - </child> 3815 - </widget> 3816 - </child> 3817 - </widget> 3818 - <packing> 3819 - <property name="padding">0</property> 3820 - <property name="expand">True</property> 3821 - <property name="fill">True</property> 3822 - </packing> 3823 - </child> 3824 - </widget> 3825 - <packing> 3826 - <property name="padding">0</property> 3827 - <property name="expand">False</property> 3828 - <property name="fill">True</property> 3829 - </packing> 3830 - </child> 3831 - 3832 - <child> 3833 - <widget class="GtkVBox" id="vbox24"> 3834 - <property name="visible">True</property> 3835 - <property name="homogeneous">False</property> 3836 - <property name="spacing">6</property> 3837 - 3838 - <child> 3839 - <widget class="GtkLabel" id="label25"> 3840 - <property name="visible">True</property> 3841 - <property name="label" translatable="yes"><b>Tree View Defaults</b></property> 3842 - <property name="use_underline">False</property> 3843 - <property name="use_markup">True</property> 3844 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3845 - <property name="wrap">False</property> 3846 - <property name="selectable">False</property> 3847 - <property name="xalign">0</property> 3848 - <property name="yalign">0.5</property> 3849 - <property name="xpad">0</property> 3850 - <property name="ypad">0</property> 3851 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3852 - <property name="width_chars">-1</property> 3853 - <property name="single_line_mode">False</property> 3854 - <property name="angle">0</property> 3855 - </widget> 3856 - <packing> 3857 - <property name="padding">0</property> 3858 - <property name="expand">False</property> 3859 - <property name="fill">False</property> 3860 - </packing> 3861 - </child> 3862 - 3863 - <child> 3864 - <widget class="GtkAlignment" id="alignment4"> 3865 - <property name="visible">True</property> 3866 - <property name="xalign">0.5</property> 3867 - <property name="yalign">0.5</property> 3868 - <property name="xscale">1</property> 3869 - <property name="yscale">1</property> 3870 - <property name="top_padding">0</property> 3871 - <property name="bottom_padding">0</property> 3872 - <property name="left_padding">12</property> 3873 - <property name="right_padding">0</property> 3874 - 3875 - <child> 3876 - <widget class="GtkVBox" id="vbox25"> 3877 - <property name="visible">True</property> 3878 - <property name="homogeneous">False</property> 3879 - <property name="spacing">6</property> 3880 - 3881 - <child> 3882 - <widget class="GtkCheckButton" id="treeview_folders_checkbutton"> 3883 - <property name="visible">True</property> 3884 - <property name="can_focus">True</property> 3885 - <property name="label" translatable="yes">Show _only folders</property> 3886 - <property name="use_underline">True</property> 3887 - <property name="relief">GTK_RELIEF_NORMAL</property> 3888 - <property name="focus_on_click">True</property> 3889 - <property name="active">False</property> 3890 - <property name="inconsistent">False</property> 3891 - <property name="draw_indicator">True</property> 3892 - </widget> 3893 - <packing> 3894 - <property name="padding">0</property> 3895 - <property name="expand">False</property> 3896 - <property name="fill">False</property> 3897 - </packing> 3898 - </child> 3899 - </widget> 3900 - </child> 3901 - </widget> 3902 - <packing> 3903 - <property name="padding">0</property> 3904 - <property name="expand">True</property> 3905 - <property name="fill">True</property> 3906 - </packing> 3907 - </child> 3908 - </widget> 3909 - <packing> 3910 - <property name="padding">0</property> 3911 - <property name="expand">False</property> 3912 - <property name="fill">True</property> 3913 - </packing> 3914 - </child> 3915 - </widget> 3916 - <packing> 3917 - <property name="tab_expand">False</property> 3918 - <property name="tab_fill">True</property> 3919 - </packing> 3920 - </child> 3921 - 3922 - <child> 3923 - <widget class="GtkLabel" id="label1"> 3924 - <property name="visible">True</property> 3925 - <property name="label" translatable="yes">Views</property> 3926 - <property name="use_underline">False</property> 3927 - <property name="use_markup">False</property> 3928 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3929 - <property name="wrap">False</property> 3930 - <property name="selectable">False</property> 3931 - <property name="xalign">0.5</property> 3932 - <property name="yalign">0.5</property> 3933 - <property name="xpad">0</property> 3934 - <property name="ypad">0</property> 3935 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3936 - <property name="width_chars">-1</property> 3937 - <property name="single_line_mode">False</property> 3938 - <property name="angle">0</property> 3939 - </widget> 3940 - <packing> 3941 - <property name="type">tab</property> 3942 - </packing> 3943 - </child> 3944 - 3945 - <child> 3946 - <widget class="GtkVBox" id="vbox5"> 3947 - <property name="border_width">12</property> 3948 - <property name="visible">True</property> 3949 - <property name="homogeneous">False</property> 3950 - <property name="spacing">18</property> 3951 - 3952 - <child> 3953 - <widget class="GtkVBox" id="vbox6"> 3954 - <property name="visible">True</property> 3955 - <property name="homogeneous">False</property> 3956 - <property name="spacing">6</property> 3957 - 3958 - <child> 3959 - <widget class="GtkLabel" id="label10"> 3960 - <property name="visible">True</property> 3961 - <property name="label" translatable="yes"><b>Behavior</b></property> 3962 - <property name="use_underline">False</property> 3963 - <property name="use_markup">True</property> 3964 - <property name="justify">GTK_JUSTIFY_LEFT</property> 3965 - <property name="wrap">False</property> 3966 - <property name="selectable">False</property> 3967 - <property name="xalign">0</property> 3968 - <property name="yalign">0.5</property> 3969 - <property name="xpad">0</property> 3970 - <property name="ypad">0</property> 3971 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3972 - <property name="width_chars">-1</property> 3973 - <property name="single_line_mode">False</property> 3974 - <property name="angle">0</property> 3975 - </widget> 3976 - <packing> 3977 - <property name="padding">0</property> 3978 - <property name="expand">False</property> 3979 - <property name="fill">False</property> 3980 - </packing> 3981 - </child> 3982 - 3983 - <child> 3984 - <widget class="GtkAlignment" id="alignment5"> 3985 - <property name="visible">True</property> 3986 - <property name="xalign">0.5</property> 3987 - <property name="yalign">0.5</property> 3988 - <property name="xscale">1</property> 3989 - <property name="yscale">1</property> 3990 - <property name="top_padding">0</property> 3991 - <property name="bottom_padding">0</property> 3992 - <property name="left_padding">12</property> 3993 - <property name="right_padding">0</property> 3994 - 3995 - <child> 3996 - <widget class="GtkVBox" id="vbox17"> 3997 - <property name="visible">True</property> 3998 - <property name="homogeneous">False</property> 3999 - <property name="spacing">0</property> 4000 - 4001 - <child> 4002 - <widget class="GtkRadioButton" id="single_click_radiobutton"> 4003 - <property name="visible">True</property> 4004 - <property name="can_focus">True</property> 4005 - <property name="label" translatable="yes">_Single click to open items</property> 4006 - <property name="use_underline">True</property> 4007 - <property name="relief">GTK_RELIEF_NORMAL</property> 4008 - <property name="focus_on_click">True</property> 4009 - <property name="active">False</property> 4010 - <property name="inconsistent">False</property> 4011 - <property name="draw_indicator">True</property> 4012 - </widget> 4013 - <packing> 4014 - <property name="padding">0</property> 4015 - <property name="expand">False</property> 4016 - <property name="fill">False</property> 4017 - </packing> 4018 - </child> 4019 - 4020 - <child> 4021 - <widget class="GtkRadioButton" id="double_click_radiobutton"> 4022 - <property name="visible">True</property> 4023 - <property name="can_focus">True</property> 4024 - <property name="label" translatable="yes">_Double click to open items</property> 4025 - <property name="use_underline">True</property> 4026 - <property name="relief">GTK_RELIEF_NORMAL</property> 4027 - <property name="focus_on_click">True</property> 4028 - <property name="active">False</property> 4029 - <property name="inconsistent">False</property> 4030 - <property name="draw_indicator">True</property> 4031 - <property name="group">single_click_radiobutton</property> 4032 - </widget> 4033 - <packing> 4034 - <property name="padding">6</property> 4035 - <property name="expand">False</property> 4036 - <property name="fill">False</property> 4037 - </packing> 4038 - </child> 4039 - 4040 - <child> 4041 - <widget class="GtkLabel" id="label"> 4042 - <property name="height_request">6</property> 4043 - <property name="visible">True</property> 4044 - <property name="label" translatable="yes"></property> 4045 - <property name="use_underline">False</property> 4046 - <property name="use_markup">False</property> 4047 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4048 - <property name="wrap">False</property> 4049 - <property name="selectable">False</property> 4050 - <property name="xalign">0.5</property> 4051 - <property name="yalign">0.5</property> 4052 - <property name="xpad">0</property> 4053 - <property name="ypad">0</property> 4054 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4055 - <property name="width_chars">-1</property> 4056 - <property name="single_line_mode">False</property> 4057 - <property name="angle">0</property> 4058 - </widget> 4059 - <packing> 4060 - <property name="padding">0</property> 4061 - <property name="expand">True</property> 4062 - <property name="fill">True</property> 4063 - </packing> 4064 - </child> 4065 - 4066 - <child> 4067 - <widget class="GtkCheckButton" id="always_use_browser_checkbutton"> 4068 - <property name="visible">True</property> 4069 - <property name="can_focus">True</property> 4070 - <property name="label" translatable="yes">Always open in _browser windows</property> 4071 - <property name="use_underline">True</property> 4072 - <property name="relief">GTK_RELIEF_NORMAL</property> 4073 - <property name="focus_on_click">True</property> 4074 - <property name="active">False</property> 4075 - <property name="inconsistent">False</property> 4076 - <property name="draw_indicator">True</property> 4077 - </widget> 4078 - <packing> 4079 - <property name="padding">0</property> 4080 - <property name="expand">False</property> 4081 - <property name="fill">False</property> 4082 - </packing> 4083 - </child> 4084 - </widget> 4085 - </child> 4086 - </widget> 4087 - <packing> 4088 - <property name="padding">0</property> 4089 - <property name="expand">True</property> 4090 - <property name="fill">True</property> 4091 - </packing> 4092 - </child> 4093 - </widget> 4094 - <packing> 4095 - <property name="padding">0</property> 4096 - <property name="expand">False</property> 4097 - <property name="fill">True</property> 4098 - </packing> 4099 - </child> 4100 - 4101 - <child> 4102 - <widget class="GtkVBox" id="vbox7"> 4103 - <property name="visible">True</property> 4104 - <property name="homogeneous">False</property> 4105 - <property name="spacing">6</property> 4106 - 4107 - <child> 4108 - <widget class="GtkLabel" id="label12"> 4109 - <property name="visible">True</property> 4110 - <property name="label" translatable="yes"><b>Executable Text Files</b></property> 4111 - <property name="use_underline">False</property> 4112 - <property name="use_markup">True</property> 4113 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4114 - <property name="wrap">False</property> 4115 - <property name="selectable">False</property> 4116 - <property name="xalign">0</property> 4117 - <property name="yalign">0.5</property> 4118 - <property name="xpad">0</property> 4119 - <property name="ypad">0</property> 4120 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4121 - <property name="width_chars">-1</property> 4122 - <property name="single_line_mode">False</property> 4123 - <property name="angle">0</property> 4124 - </widget> 4125 - <packing> 4126 - <property name="padding">0</property> 4127 - <property name="expand">False</property> 4128 - <property name="fill">False</property> 4129 - </packing> 4130 - </child> 4131 - 4132 - <child> 4133 - <widget class="GtkAlignment" id="alignment6"> 4134 - <property name="visible">True</property> 4135 - <property name="xalign">0.5</property> 4136 - <property name="yalign">0.5</property> 4137 - <property name="xscale">1</property> 4138 - <property name="yscale">1</property> 4139 - <property name="top_padding">0</property> 4140 - <property name="bottom_padding">0</property> 4141 - <property name="left_padding">12</property> 4142 - <property name="right_padding">0</property> 4143 - 4144 - <child> 4145 - <widget class="GtkVBox" id="vbox18"> 4146 - <property name="visible">True</property> 4147 - <property name="homogeneous">False</property> 4148 - <property name="spacing">6</property> 4149 - 4150 - <child> 4151 - <widget class="GtkRadioButton" id="scripts_execute_radiobutton"> 4152 - <property name="visible">True</property> 4153 - <property name="can_focus">True</property> 4154 - <property name="label" translatable="yes">_Run executable text files when they are opened</property> 4155 - <property name="use_underline">True</property> 4156 - <property name="relief">GTK_RELIEF_NORMAL</property> 4157 - <property name="focus_on_click">True</property> 4158 - <property name="active">False</property> 4159 - <property name="inconsistent">False</property> 4160 - <property name="draw_indicator">True</property> 4161 - </widget> 4162 - <packing> 4163 - <property name="padding">0</property> 4164 - <property name="expand">False</property> 4165 - <property name="fill">False</property> 4166 - </packing> 4167 - </child> 4168 - 4169 - <child> 4170 - <widget class="GtkRadioButton" id="scripts_view_radiobutton"> 4171 - <property name="visible">True</property> 4172 - <property name="can_focus">True</property> 4173 - <property name="label" translatable="yes">_View executable text files when they are opened</property> 4174 - <property name="use_underline">True</property> 4175 - <property name="relief">GTK_RELIEF_NORMAL</property> 4176 - <property name="focus_on_click">True</property> 4177 - <property name="active">False</property> 4178 - <property name="inconsistent">False</property> 4179 - <property name="draw_indicator">True</property> 4180 - <property name="group">scripts_execute_radiobutton</property> 4181 - </widget> 4182 - <packing> 4183 - <property name="padding">0</property> 4184 - <property name="expand">False</property> 4185 - <property name="fill">False</property> 4186 - </packing> 4187 - </child> 4188 - 4189 - <child> 4190 - <widget class="GtkRadioButton" id="scripts_confirm_radiobutton"> 4191 - <property name="visible">True</property> 4192 - <property name="can_focus">True</property> 4193 - <property name="label" translatable="yes">_Ask each time</property> 4194 - <property name="use_underline">True</property> 4195 - <property name="relief">GTK_RELIEF_NORMAL</property> 4196 - <property name="focus_on_click">True</property> 4197 - <property name="active">False</property> 4198 - <property name="inconsistent">False</property> 4199 - <property name="draw_indicator">True</property> 4200 - <property name="group">scripts_execute_radiobutton</property> 4201 - </widget> 4202 - <packing> 4203 - <property name="padding">0</property> 4204 - <property name="expand">False</property> 4205 - <property name="fill">False</property> 4206 - </packing> 4207 - </child> 4208 - </widget> 4209 - </child> 4210 - </widget> 4211 - <packing> 4212 - <property name="padding">0</property> 4213 - <property name="expand">True</property> 4214 - <property name="fill">True</property> 4215 - </packing> 4216 - </child> 4217 - </widget> 4218 - <packing> 4219 - <property name="padding">0</property> 4220 - <property name="expand">False</property> 4221 - <property name="fill">True</property> 4222 - </packing> 4223 - </child> 4224 - 4225 - <child> 4226 - <widget class="GtkVBox" id="vbox8"> 4227 - <property name="visible">True</property> 4228 - <property name="homogeneous">False</property> 4229 - <property name="spacing">6</property> 4230 - 4231 - <child> 4232 - <widget class="GtkLabel" id="label14"> 4233 - <property name="visible">True</property> 4234 - <property name="label" translatable="yes"><b>Trash</b></property> 4235 - <property name="use_underline">False</property> 4236 - <property name="use_markup">True</property> 4237 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4238 - <property name="wrap">False</property> 4239 - <property name="selectable">False</property> 4240 - <property name="xalign">0</property> 4241 - <property name="yalign">0.5</property> 4242 - <property name="xpad">0</property> 4243 - <property name="ypad">0</property> 4244 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4245 - <property name="width_chars">-1</property> 4246 - <property name="single_line_mode">False</property> 4247 - <property name="angle">0</property> 4248 - </widget> 4249 - <packing> 4250 - <property name="padding">0</property> 4251 - <property name="expand">False</property> 4252 - <property name="fill">False</property> 4253 - </packing> 4254 - </child> 4255 - 4256 - <child> 4257 - <widget class="GtkAlignment" id="alignment7"> 4258 - <property name="visible">True</property> 4259 - <property name="xalign">0.5</property> 4260 - <property name="yalign">0.5</property> 4261 - <property name="xscale">1</property> 4262 - <property name="yscale">1</property> 4263 - <property name="top_padding">0</property> 4264 - <property name="bottom_padding">0</property> 4265 - <property name="left_padding">12</property> 4266 - <property name="right_padding">0</property> 4267 - 4268 - <child> 4269 - <widget class="GtkVBox" id="vbox19"> 4270 - <property name="visible">True</property> 4271 - <property name="homogeneous">False</property> 4272 - <property name="spacing">6</property> 4273 - 4274 - <child> 4275 - <widget class="GtkCheckButton" id="trash_confirm_checkbutton"> 4276 - <property name="visible">True</property> 4277 - <property name="can_focus">True</property> 4278 - <property name="label" translatable="yes">Ask before _emptying the Trash or deleting files</property> 4279 - <property name="use_underline">True</property> 4280 - <property name="relief">GTK_RELIEF_NORMAL</property> 4281 - <property name="focus_on_click">True</property> 4282 - <property name="active">False</property> 4283 - <property name="inconsistent">False</property> 4284 - <property name="draw_indicator">True</property> 4285 - </widget> 4286 - <packing> 4287 - <property name="padding">0</property> 4288 - <property name="expand">False</property> 4289 - <property name="fill">False</property> 4290 - </packing> 4291 - </child> 4292 - 4293 - <child> 4294 - <widget class="GtkCheckButton" id="trash_delete_checkbutton"> 4295 - <property name="visible">True</property> 4296 - <property name="can_focus">True</property> 4297 - <property name="label" translatable="yes">I_nclude a Delete command that bypasses Trash</property> 4298 - <property name="use_underline">True</property> 4299 - <property name="relief">GTK_RELIEF_NORMAL</property> 4300 - <property name="focus_on_click">True</property> 4301 - <property name="active">False</property> 4302 - <property name="inconsistent">False</property> 4303 - <property name="draw_indicator">True</property> 4304 - </widget> 4305 - <packing> 4306 - <property name="padding">0</property> 4307 - <property name="expand">False</property> 4308 - <property name="fill">False</property> 4309 - </packing> 4310 - </child> 4311 - </widget> 4312 - </child> 4313 - </widget> 4314 - <packing> 4315 - <property name="padding">0</property> 4316 - <property name="expand">True</property> 4317 - <property name="fill">True</property> 4318 - </packing> 4319 - </child> 4320 - </widget> 4321 - <packing> 4322 - <property name="padding">0</property> 4323 - <property name="expand">False</property> 4324 - <property name="fill">True</property> 4325 - </packing> 4326 - </child> 4327 - </widget> 4328 - <packing> 4329 - <property name="tab_expand">False</property> 4330 - <property name="tab_fill">True</property> 4331 - </packing> 4332 - </child> 4333 - 4334 - <child> 4335 - <widget class="GtkLabel" id="label2"> 4336 - <property name="visible">True</property> 4337 - <property name="label" translatable="yes">Behavior</property> 4338 - <property name="use_underline">False</property> 4339 - <property name="use_markup">False</property> 4340 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4341 - <property name="wrap">False</property> 4342 - <property name="selectable">False</property> 4343 - <property name="xalign">0.5</property> 4344 - <property name="yalign">0.5</property> 4345 - <property name="xpad">0</property> 4346 - <property name="ypad">0</property> 4347 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4348 - <property name="width_chars">-1</property> 4349 - <property name="single_line_mode">False</property> 4350 - <property name="angle">0</property> 4351 - </widget> 4352 - <packing> 4353 - <property name="type">tab</property> 4354 - </packing> 4355 - </child> 4356 - 4357 - <child> 4358 - <widget class="GtkVBox" id="vbox26"> 4359 - <property name="border_width">12</property> 4360 - <property name="visible">True</property> 4361 - <property name="homogeneous">False</property> 4362 - <property name="spacing">18</property> 4363 - 4364 - <child> 4365 - <widget class="GtkVBox" id="vbox27"> 4366 - <property name="visible">True</property> 4367 - <property name="homogeneous">False</property> 4368 - <property name="spacing">6</property> 4369 - 4370 - <child> 4371 - <widget class="GtkLabel" id="label28"> 4372 - <property name="visible">True</property> 4373 - <property name="label" translatable="yes"><b>Icon Captions</b></property> 4374 - <property name="use_underline">False</property> 4375 - <property name="use_markup">True</property> 4376 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4377 - <property name="wrap">False</property> 4378 - <property name="selectable">False</property> 4379 - <property name="xalign">0</property> 4380 - <property name="yalign">0.5</property> 4381 - <property name="xpad">0</property> 4382 - <property name="ypad">0</property> 4383 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4384 - <property name="width_chars">-1</property> 4385 - <property name="single_line_mode">False</property> 4386 - <property name="angle">0</property> 4387 - </widget> 4388 - <packing> 4389 - <property name="padding">0</property> 4390 - <property name="expand">False</property> 4391 - <property name="fill">False</property> 4392 - </packing> 4393 - </child> 4394 - 4395 - <child> 4396 - <widget class="GtkAlignment" id="alignment8"> 4397 - <property name="visible">True</property> 4398 - <property name="xalign">0.5</property> 4399 - <property name="yalign">0.5</property> 4400 - <property name="xscale">1</property> 4401 - <property name="yscale">1</property> 4402 - <property name="top_padding">0</property> 4403 - <property name="bottom_padding">0</property> 4404 - <property name="left_padding">12</property> 4405 - <property name="right_padding">0</property> 4406 - 4407 - <child> 4408 - <widget class="GtkVBox" id="vbox28"> 4409 - <property name="visible">True</property> 4410 - <property name="homogeneous">False</property> 4411 - <property name="spacing">6</property> 4412 - 4413 - <child> 4414 - <widget class="GtkLabel" id="label29"> 4415 - <property name="visible">True</property> 4416 - <property name="label" translatable="yes">Choose the order of information to appear beneath icon names. More information will appear when zooming in closer.</property> 4417 - <property name="use_underline">False</property> 4418 - <property name="use_markup">False</property> 4419 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4420 - <property name="wrap">True</property> 4421 - <property name="selectable">False</property> 4422 - <property name="xalign">0</property> 4423 - <property name="yalign">0.5</property> 4424 - <property name="xpad">0</property> 4425 - <property name="ypad">0</property> 4426 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4427 - <property name="width_chars">-1</property> 4428 - <property name="single_line_mode">False</property> 4429 - <property name="angle">0</property> 4430 - </widget> 4431 - <packing> 4432 - <property name="padding">0</property> 4433 - <property name="expand">False</property> 4434 - <property name="fill">False</property> 4435 - </packing> 4436 - </child> 4437 - 4438 - <child> 4439 - <widget class="GtkHBox" id="hbox28"> 4440 - <property name="visible">True</property> 4441 - <property name="homogeneous">False</property> 4442 - <property name="spacing">0</property> 4443 - 4444 - <child> 4445 - <widget class="GtkLabel" id="captions_label_0"> 4446 - <property name="visible">True</property> 4447 - <property name="label"></property> 4448 - <property name="use_underline">False</property> 4449 - <property name="use_markup">False</property> 4450 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4451 - <property name="wrap">False</property> 4452 - <property name="selectable">False</property> 4453 - <property name="xalign">0.5</property> 4454 - <property name="yalign">0.5</property> 4455 - <property name="xpad">0</property> 4456 - <property name="ypad">0</property> 4457 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4458 - <property name="width_chars">-1</property> 4459 - <property name="single_line_mode">False</property> 4460 - <property name="angle">0</property> 4461 - </widget> 4462 - <packing> 4463 - <property name="padding">0</property> 4464 - <property name="expand">False</property> 4465 - <property name="fill">False</property> 4466 - </packing> 4467 - </child> 4468 - 4469 - <child> 4470 - <widget class="GtkComboBox" id="captions_0_combobox"> 4471 - <property name="visible">True</property> 4472 - <property name="items" translatable="yes"></property> 4473 - <property name="add_tearoffs">False</property> 4474 - <property name="focus_on_click">True</property> 4475 - </widget> 4476 - <packing> 4477 - <property name="padding">0</property> 4478 - <property name="expand">False</property> 4479 - <property name="fill">True</property> 4480 - </packing> 4481 - </child> 4482 - </widget> 4483 - <packing> 4484 - <property name="padding">0</property> 4485 - <property name="expand">True</property> 4486 - <property name="fill">True</property> 4487 - </packing> 4488 - </child> 4489 - 4490 - <child> 4491 - <widget class="GtkHBox" id="hbox29"> 4492 - <property name="visible">True</property> 4493 - <property name="homogeneous">False</property> 4494 - <property name="spacing">0</property> 4495 - 4496 - <child> 4497 - <widget class="GtkLabel" id="captions_label_1"> 4498 - <property name="visible">True</property> 4499 - <property name="label"></property> 4500 - <property name="use_underline">True</property> 4501 - <property name="use_markup">False</property> 4502 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4503 - <property name="wrap">False</property> 4504 - <property name="selectable">False</property> 4505 - <property name="xalign">0.5</property> 4506 - <property name="yalign">0.5</property> 4507 - <property name="xpad">0</property> 4508 - <property name="ypad">0</property> 4509 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4510 - <property name="width_chars">-1</property> 4511 - <property name="single_line_mode">False</property> 4512 - <property name="angle">0</property> 4513 - </widget> 4514 - <packing> 4515 - <property name="padding">0</property> 4516 - <property name="expand">False</property> 4517 - <property name="fill">False</property> 4518 - </packing> 4519 - </child> 4520 - 4521 - <child> 4522 - <widget class="GtkComboBox" id="captions_1_combobox"> 4523 - <property name="visible">True</property> 4524 - <property name="items" translatable="yes"></property> 4525 - <property name="add_tearoffs">False</property> 4526 - <property name="focus_on_click">True</property> 4527 - </widget> 4528 - <packing> 4529 - <property name="padding">0</property> 4530 - <property name="expand">False</property> 4531 - <property name="fill">True</property> 4532 - </packing> 4533 - </child> 4534 - </widget> 4535 - <packing> 4536 - <property name="padding">0</property> 4537 - <property name="expand">False</property> 4538 - <property name="fill">False</property> 4539 - </packing> 4540 - </child> 4541 - 4542 - <child> 4543 - <widget class="GtkHBox" id="hbox30"> 4544 - <property name="visible">True</property> 4545 - <property name="homogeneous">False</property> 4546 - <property name="spacing">0</property> 4547 - 4548 - <child> 4549 - <widget class="GtkLabel" id="captions_label_2"> 4550 - <property name="visible">True</property> 4551 - <property name="label"></property> 4552 - <property name="use_underline">False</property> 4553 - <property name="use_markup">False</property> 4554 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4555 - <property name="wrap">False</property> 4556 - <property name="selectable">False</property> 4557 - <property name="xalign">0.5</property> 4558 - <property name="yalign">0.5</property> 4559 - <property name="xpad">0</property> 4560 - <property name="ypad">0</property> 4561 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4562 - <property name="width_chars">-1</property> 4563 - <property name="single_line_mode">False</property> 4564 - <property name="angle">0</property> 4565 - </widget> 4566 - <packing> 4567 - <property name="padding">0</property> 4568 - <property name="expand">False</property> 4569 - <property name="fill">False</property> 4570 - </packing> 4571 - </child> 4572 - 4573 - <child> 4574 - <widget class="GtkComboBox" id="captions_2_combobox"> 4575 - <property name="visible">True</property> 4576 - <property name="items" translatable="yes"></property> 4577 - <property name="add_tearoffs">False</property> 4578 - <property name="focus_on_click">True</property> 4579 - </widget> 4580 - <packing> 4581 - <property name="padding">0</property> 4582 - <property name="expand">False</property> 4583 - <property name="fill">True</property> 4584 - </packing> 4585 - </child> 4586 - </widget> 4587 - <packing> 4588 - <property name="padding">0</property> 4589 - <property name="expand">True</property> 4590 - <property name="fill">True</property> 4591 - </packing> 4592 - </child> 4593 - </widget> 4594 - </child> 4595 - </widget> 4596 - <packing> 4597 - <property name="padding">0</property> 4598 - <property name="expand">True</property> 4599 - <property name="fill">True</property> 4600 - </packing> 4601 - </child> 4602 - </widget> 4603 - <packing> 4604 - <property name="padding">0</property> 4605 - <property name="expand">False</property> 4606 - <property name="fill">True</property> 4607 - </packing> 4608 - </child> 4609 - 4610 - <child> 4611 - <widget class="GtkVBox" id="vbox31"> 4612 - <property name="visible">True</property> 4613 - <property name="homogeneous">False</property> 4614 - <property name="spacing">6</property> 4615 - 4616 - <child> 4617 - <widget class="GtkLabel" id="label34"> 4618 - <property name="visible">True</property> 4619 - <property name="label" translatable="yes"><b>Date</b></property> 4620 - <property name="use_underline">False</property> 4621 - <property name="use_markup">True</property> 4622 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4623 - <property name="wrap">False</property> 4624 - <property name="selectable">False</property> 4625 - <property name="xalign">0</property> 4626 - <property name="yalign">0.5</property> 4627 - <property name="xpad">0</property> 4628 - <property name="ypad">0</property> 4629 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4630 - <property name="width_chars">-1</property> 4631 - <property name="single_line_mode">False</property> 4632 - <property name="angle">0</property> 4633 - </widget> 4634 - <packing> 4635 - <property name="padding">0</property> 4636 - <property name="expand">False</property> 4637 - <property name="fill">False</property> 4638 - </packing> 4639 - </child> 4640 - 4641 - <child> 4642 - <widget class="GtkAlignment" id="alignment9"> 4643 - <property name="visible">True</property> 4644 - <property name="xalign">0.5</property> 4645 - <property name="yalign">0.5</property> 4646 - <property name="xscale">1</property> 4647 - <property name="yscale">1</property> 4648 - <property name="top_padding">0</property> 4649 - <property name="bottom_padding">0</property> 4650 - <property name="left_padding">12</property> 4651 - <property name="right_padding">0</property> 4652 - 4653 - <child> 4654 - <widget class="GtkHBox" id="hbox33"> 4655 - <property name="visible">True</property> 4656 - <property name="homogeneous">False</property> 4657 - <property name="spacing">12</property> 4658 - 4659 - <child> 4660 - <widget class="GtkLabel" id="label36"> 4661 - <property name="visible">True</property> 4662 - <property name="label" translatable="yes">_Format:</property> 4663 - <property name="use_underline">True</property> 4664 - <property name="use_markup">False</property> 4665 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4666 - <property name="wrap">False</property> 4667 - <property name="selectable">False</property> 4668 - <property name="xalign">0.5</property> 4669 - <property name="yalign">0.5</property> 4670 - <property name="xpad">0</property> 4671 - <property name="ypad">0</property> 4672 - <property name="mnemonic_widget">date_format_combobox</property> 4673 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4674 - <property name="width_chars">-1</property> 4675 - <property name="single_line_mode">False</property> 4676 - <property name="angle">0</property> 4677 - </widget> 4678 - <packing> 4679 - <property name="padding">0</property> 4680 - <property name="expand">False</property> 4681 - <property name="fill">False</property> 4682 - </packing> 4683 - </child> 4684 - 4685 - <child> 4686 - <widget class="GtkComboBox" id="date_format_combobox"> 4687 - <property name="visible">True</property> 4688 - <property name="items" translatable="yes"></property> 4689 - <property name="add_tearoffs">False</property> 4690 - <property name="focus_on_click">True</property> 4691 - </widget> 4692 - <packing> 4693 - <property name="padding">0</property> 4694 - <property name="expand">False</property> 4695 - <property name="fill">False</property> 4696 - </packing> 4697 - </child> 4698 - </widget> 4699 - </child> 4700 - </widget> 4701 - <packing> 4702 - <property name="padding">0</property> 4703 - <property name="expand">True</property> 4704 - <property name="fill">True</property> 4705 - </packing> 4706 - </child> 4707 - </widget> 4708 - <packing> 4709 - <property name="padding">0</property> 4710 - <property name="expand">False</property> 4711 - <property name="fill">True</property> 4712 - </packing> 4713 - </child> 4714 - </widget> 4715 - <packing> 4716 - <property name="tab_expand">False</property> 4717 - <property name="tab_fill">True</property> 4718 - </packing> 4719 - </child> 4720 - 4721 - <child> 4722 - <widget class="GtkLabel" id="label24"> 4723 - <property name="visible">True</property> 4724 - <property name="label" translatable="yes">Display</property> 4725 - <property name="use_underline">False</property> 4726 - <property name="use_markup">False</property> 4727 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4728 - <property name="wrap">False</property> 4729 - <property name="selectable">False</property> 4730 - <property name="xalign">0.5</property> 4731 - <property name="yalign">0.5</property> 4732 - <property name="xpad">0</property> 4733 - <property name="ypad">0</property> 4734 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4735 - <property name="width_chars">-1</property> 4736 - <property name="single_line_mode">False</property> 4737 - <property name="angle">0</property> 4738 - </widget> 4739 - <packing> 4740 - <property name="type">tab</property> 4741 - </packing> 4742 - </child> 4743 - 4744 - <child> 4745 - <widget class="GtkVBox" id="vbox29"> 4746 - <property name="border_width">12</property> 4747 - <property name="visible">True</property> 4748 - <property name="homogeneous">False</property> 4749 - <property name="spacing">18</property> 4750 - 4751 - <child> 4752 - <widget class="GtkVBox" id="vbox30"> 4753 - <property name="visible">True</property> 4754 - <property name="homogeneous">False</property> 4755 - <property name="spacing">6</property> 4756 - 4757 - <child> 4758 - <widget class="GtkLabel" id="label31"> 4759 - <property name="visible">True</property> 4760 - <property name="label" translatable="yes"><b>List Columns</b></property> 4761 - <property name="use_underline">False</property> 4762 - <property name="use_markup">True</property> 4763 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4764 - <property name="wrap">False</property> 4765 - <property name="selectable">False</property> 4766 - <property name="xalign">0</property> 4767 - <property name="yalign">0.5</property> 4768 - <property name="xpad">0</property> 4769 - <property name="ypad">0</property> 4770 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4771 - <property name="width_chars">-1</property> 4772 - <property name="single_line_mode">False</property> 4773 - <property name="angle">0</property> 4774 - </widget> 4775 - <packing> 4776 - <property name="padding">0</property> 4777 - <property name="expand">False</property> 4778 - <property name="fill">False</property> 4779 - </packing> 4780 - </child> 4781 - 4782 - <child> 4783 - <widget class="GtkAlignment" id="alignment21"> 4784 - <property name="visible">True</property> 4785 - <property name="xalign">0.5</property> 4786 - <property name="yalign">0.5</property> 4787 - <property name="xscale">1</property> 4788 - <property name="yscale">1</property> 4789 - <property name="top_padding">0</property> 4790 - <property name="bottom_padding">0</property> 4791 - <property name="left_padding">12</property> 4792 - <property name="right_padding">0</property> 4793 - 4794 - <child> 4795 - <widget class="GtkVBox" id="list_columns_vbox"> 4796 - <property name="visible">True</property> 4797 - <property name="homogeneous">False</property> 4798 - <property name="spacing">6</property> 4799 - 4800 - <child> 4801 - <widget class="GtkLabel" id="label33"> 4802 - <property name="visible">True</property> 4803 - <property name="label" translatable="yes">Choose the order of information to appear in the list view.</property> 4804 - <property name="use_underline">False</property> 4805 - <property name="use_markup">False</property> 4806 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4807 - <property name="wrap">True</property> 4808 - <property name="selectable">False</property> 4809 - <property name="xalign">0</property> 4810 - <property name="yalign">0.5</property> 4811 - <property name="xpad">0</property> 4812 - <property name="ypad">0</property> 4813 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4814 - <property name="width_chars">-1</property> 4815 - <property name="single_line_mode">False</property> 4816 - <property name="angle">0</property> 4817 - </widget> 4818 - <packing> 4819 - <property name="padding">0</property> 4820 - <property name="expand">False</property> 4821 - <property name="fill">False</property> 4822 - </packing> 4823 - </child> 4824 - 4825 - <child> 4826 - <placeholder/> 4827 - </child> 4828 - </widget> 4829 - </child> 4830 - </widget> 4831 - <packing> 4832 - <property name="padding">0</property> 4833 - <property name="expand">True</property> 4834 - <property name="fill">True</property> 4835 - </packing> 4836 - </child> 4837 - </widget> 4838 - <packing> 4839 - <property name="padding">0</property> 4840 - <property name="expand">True</property> 4841 - <property name="fill">True</property> 4842 - </packing> 4843 - </child> 4844 - </widget> 4845 - <packing> 4846 - <property name="tab_expand">False</property> 4847 - <property name="tab_fill">True</property> 4848 - </packing> 4849 - </child> 4850 - 4851 - <child> 4852 - <widget class="GtkLabel" id="label30"> 4853 - <property name="visible">True</property> 4854 - <property name="label" translatable="yes">List Columns</property> 4855 - <property name="use_underline">False</property> 4856 - <property name="use_markup">False</property> 4857 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4858 - <property name="wrap">False</property> 4859 - <property name="selectable">False</property> 4860 - <property name="xalign">0.5</property> 4861 - <property name="yalign">0.5</property> 4862 - <property name="xpad">0</property> 4863 - <property name="ypad">0</property> 4864 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4865 - <property name="width_chars">-1</property> 4866 - <property name="single_line_mode">False</property> 4867 - <property name="angle">0</property> 4868 - </widget> 4869 - <packing> 4870 - <property name="type">tab</property> 4871 - </packing> 4872 - </child> 4873 - 4874 - <child> 4875 - <widget class="GtkVBox" id="vbox9"> 4876 - <property name="border_width">12</property> 4877 - <property name="visible">True</property> 4878 - <property name="homogeneous">False</property> 4879 - <property name="spacing">18</property> 4880 - 4881 - <child> 4882 - <widget class="GtkVBox" id="vbox10"> 4883 - <property name="visible">True</property> 4884 - <property name="homogeneous">False</property> 4885 - <property name="spacing">6</property> 4886 - 4887 - <child> 4888 - <widget class="GtkLabel" id="label16"> 4889 - <property name="visible">True</property> 4890 - <property name="label" translatable="yes"><b>Text Files</b></property> 4891 - <property name="use_underline">False</property> 4892 - <property name="use_markup">True</property> 4893 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4894 - <property name="wrap">False</property> 4895 - <property name="selectable">False</property> 4896 - <property name="xalign">0</property> 4897 - <property name="yalign">0.5</property> 4898 - <property name="xpad">0</property> 4899 - <property name="ypad">0</property> 4900 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4901 - <property name="width_chars">-1</property> 4902 - <property name="single_line_mode">False</property> 4903 - <property name="angle">0</property> 4904 - </widget> 4905 - <packing> 4906 - <property name="padding">0</property> 4907 - <property name="expand">False</property> 4908 - <property name="fill">False</property> 4909 - </packing> 4910 - </child> 4911 - 4912 - <child> 4913 - <widget class="GtkAlignment" id="alignment10"> 4914 - <property name="visible">True</property> 4915 - <property name="xalign">0.5</property> 4916 - <property name="yalign">0.5</property> 4917 - <property name="xscale">1</property> 4918 - <property name="yscale">1</property> 4919 - <property name="top_padding">0</property> 4920 - <property name="bottom_padding">0</property> 4921 - <property name="left_padding">12</property> 4922 - <property name="right_padding">0</property> 4923 - 4924 - <child> 4925 - <widget class="GtkVBox" id="vbox20"> 4926 - <property name="visible">True</property> 4927 - <property name="homogeneous">False</property> 4928 - <property name="spacing">6</property> 4929 - 4930 - <child> 4931 - <widget class="GtkHBox" id="hbox24"> 4932 - <property name="visible">True</property> 4933 - <property name="homogeneous">False</property> 4934 - <property name="spacing">12</property> 4935 - 4936 - <child> 4937 - <widget class="GtkLabel" id="preview_label_0"> 4938 - <property name="visible">True</property> 4939 - <property name="label" translatable="yes">Show te_xt in icons:</property> 4940 - <property name="use_underline">True</property> 4941 - <property name="use_markup">False</property> 4942 - <property name="justify">GTK_JUSTIFY_LEFT</property> 4943 - <property name="wrap">False</property> 4944 - <property name="selectable">False</property> 4945 - <property name="xalign">0</property> 4946 - <property name="yalign">0.5</property> 4947 - <property name="xpad">0</property> 4948 - <property name="ypad">0</property> 4949 - <property name="mnemonic_widget">preview_text_combobox</property> 4950 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 4951 - <property name="width_chars">-1</property> 4952 - <property name="single_line_mode">False</property> 4953 - <property name="angle">0</property> 4954 - </widget> 4955 - <packing> 4956 - <property name="padding">0</property> 4957 - <property name="expand">False</property> 4958 - <property name="fill">False</property> 4959 - </packing> 4960 - </child> 4961 - 4962 - <child> 4963 - <widget class="GtkComboBox" id="preview_text_combobox"> 4964 - <property name="visible">True</property> 4965 - <property name="items" translatable="yes">Always 4966 + </widget> 4967 + <packing> 4968 + <property name="position">1</property> 4969 + </packing> 4970 + </child> 4971 + </widget> 4972 + </child> 4973 + </widget> 4974 + </child> 4975 + </widget> 4976 + <packing> 4977 + <property name="position">1</property> 4978 + </packing> 4979 + </child> 4980 + </widget> 4981 + <packing> 4982 + <property name="expand">False</property> 4983 + <property name="position">3</property> 4984 + </packing> 4985 + </child> 4986 + <child> 4987 + <widget class="GtkVBox" id="vbox24"> 4988 + <property name="visible">True</property> 4989 + <property name="spacing">6</property> 4990 + <child> 4991 + <widget class="GtkLabel" id="label25"> 4992 + <property name="visible">True</property> 4993 + <property name="xalign">0</property> 4994 + <property name="label" translatable="yes"><b>Tree View Defaults</b></property> 4995 + <property name="use_markup">True</property> 4996 + </widget> 4997 + <packing> 4998 + <property name="expand">False</property> 4999 + <property name="fill">False</property> 5000 + </packing> 5001 + </child> 5002 + <child> 5003 + <widget class="GtkAlignment" id="alignment4"> 5004 + <property name="visible">True</property> 5005 + <property name="left_padding">12</property> 5006 + <child> 5007 + <widget class="GtkVBox" id="vbox25"> 5008 + <property name="visible">True</property> 5009 + <property name="spacing">6</property> 5010 + <child> 5011 + <widget class="GtkCheckButton" id="treeview_folders_checkbutton"> 5012 + <property name="visible">True</property> 5013 + <property name="can_focus">True</property> 5014 + <property name="label" translatable="yes">Show _only folders</property> 5015 + <property name="use_underline">True</property> 5016 + <property name="response_id">0</property> 5017 + <property name="draw_indicator">True</property> 5018 + </widget> 5019 + <packing> 5020 + <property name="expand">False</property> 5021 + <property name="fill">False</property> 5022 + </packing> 5023 + </child> 5024 + </widget> 5025 + </child> 5026 + </widget> 5027 + <packing> 5028 + <property name="position">1</property> 5029 + </packing> 5030 + </child> 5031 + </widget> 5032 + <packing> 5033 + <property name="expand">False</property> 5034 + <property name="position">4</property> 5035 + </packing> 5036 + </child> 5037 + </widget> 5038 + </child> 5039 + <child> 5040 + <widget class="GtkLabel" id="label1"> 5041 + <property name="visible">True</property> 5042 + <property name="label" translatable="yes">Views</property> 5043 + </widget> 5044 + <packing> 5045 + <property name="type">tab</property> 5046 + <property name="tab_fill">False</property> 5047 + </packing> 5048 + </child> 5049 + <child> 5050 + <widget class="GtkVBox" id="vbox5"> 5051 + <property name="visible">True</property> 5052 + <property name="border_width">12</property> 5053 + <property name="spacing">18</property> 5054 + <child> 5055 + <widget class="GtkVBox" id="vbox6"> 5056 + <property name="visible">True</property> 5057 + <property name="spacing">6</property> 5058 + <child> 5059 + <widget class="GtkLabel" id="label10"> 5060 + <property name="visible">True</property> 5061 + <property name="xalign">0</property> 5062 + <property name="label" translatable="yes"><b>Behavior</b></property> 5063 + <property name="use_markup">True</property> 5064 + </widget> 5065 + <packing> 5066 + <property name="expand">False</property> 5067 + <property name="fill">False</property> 5068 + </packing> 5069 + </child> 5070 + <child> 5071 + <widget class="GtkAlignment" id="alignment5"> 5072 + <property name="visible">True</property> 5073 + <property name="left_padding">12</property> 5074 + <child> 5075 + <widget class="GtkVBox" id="vbox17"> 5076 + <property name="visible">True</property> 5077 + <child> 5078 + <widget class="GtkRadioButton" id="single_click_radiobutton"> 5079 + <property name="visible">True</property> 5080 + <property name="can_focus">True</property> 5081 + <property name="label" translatable="yes">_Single click to open items</property> 5082 + <property name="use_underline">True</property> 5083 + <property name="response_id">0</property> 5084 + <property name="draw_indicator">True</property> 5085 + </widget> 5086 + <packing> 5087 + <property name="expand">False</property> 5088 + <property name="fill">False</property> 5089 + </packing> 5090 + </child> 5091 + <child> 5092 + <widget class="GtkRadioButton" id="double_click_radiobutton"> 5093 + <property name="visible">True</property> 5094 + <property name="can_focus">True</property> 5095 + <property name="label" translatable="yes">_Double click to open items</property> 5096 + <property name="use_underline">True</property> 5097 + <property name="response_id">0</property> 5098 + <property name="draw_indicator">True</property> 5099 + <property name="group">single_click_radiobutton</property> 5100 + </widget> 5101 + <packing> 5102 + <property name="expand">False</property> 5103 + <property name="fill">False</property> 5104 + <property name="padding">6</property> 5105 + <property name="position">1</property> 5106 + </packing> 5107 + </child> 5108 + <child> 5109 + <widget class="GtkLabel" id="label2"> 5110 + <property name="height_request">6</property> 5111 + <property name="visible">True</property> 5112 + </widget> 5113 + <packing> 5114 + <property name="position">2</property> 5115 + </packing> 5116 + </child> 5117 + <child> 5118 + <widget class="GtkCheckButton" id="always_use_browser_checkbutton"> 5119 + <property name="visible">True</property> 5120 + <property name="can_focus">True</property> 5121 + <property name="label" translatable="yes">Always open in _browser windows</property> 5122 + <property name="use_underline">True</property> 5123 + <property name="response_id">0</property> 5124 + <property name="draw_indicator">True</property> 5125 + </widget> 5126 + <packing> 5127 + <property name="expand">False</property> 5128 + <property name="fill">False</property> 5129 + <property name="position">3</property> 5130 + </packing> 5131 + </child> 5132 + </widget> 5133 + </child> 5134 + </widget> 5135 + <packing> 5136 + <property name="position">1</property> 5137 + </packing> 5138 + </child> 5139 + </widget> 5140 + <packing> 5141 + <property name="expand">False</property> 5142 + </packing> 5143 + </child> 5144 + <child> 5145 + <widget class="GtkVBox" id="vbox7"> 5146 + <property name="visible">True</property> 5147 + <property name="spacing">6</property> 5148 + <child> 5149 + <widget class="GtkLabel" id="label12"> 5150 + <property name="visible">True</property> 5151 + <property name="xalign">0</property> 5152 + <property name="label" translatable="yes"><b>Executable Text Files</b></property> 5153 + <property name="use_markup">True</property> 5154 + </widget> 5155 + <packing> 5156 + <property name="expand">False</property> 5157 + <property name="fill">False</property> 5158 + </packing> 5159 + </child> 5160 + <child> 5161 + <widget class="GtkAlignment" id="alignment6"> 5162 + <property name="visible">True</property> 5163 + <property name="left_padding">12</property> 5164 + <child> 5165 + <widget class="GtkVBox" id="vbox18"> 5166 + <property name="visible">True</property> 5167 + <property name="spacing">6</property> 5168 + <child> 5169 + <widget class="GtkRadioButton" id="scripts_execute_radiobutton"> 5170 + <property name="visible">True</property> 5171 + <property name="can_focus">True</property> 5172 + <property name="label" translatable="yes">_Run executable text files when they are opened</property> 5173 + <property name="use_underline">True</property> 5174 + <property name="response_id">0</property> 5175 + <property name="draw_indicator">True</property> 5176 + </widget> 5177 + <packing> 5178 + <property name="expand">False</property> 5179 + <property name="fill">False</property> 5180 + </packing> 5181 + </child> 5182 + <child> 5183 + <widget class="GtkRadioButton" id="scripts_view_radiobutton"> 5184 + <property name="visible">True</property> 5185 + <property name="can_focus">True</property> 5186 + <property name="label" translatable="yes">_View executable text files when they are opened</property> 5187 + <property name="use_underline">True</property> 5188 + <property name="response_id">0</property> 5189 + <property name="draw_indicator">True</property> 5190 + <property name="group">scripts_execute_radiobutton</property> 5191 + </widget> 5192 + <packing> 5193 + <property name="expand">False</property> 5194 + <property name="fill">False</property> 5195 + <property name="position">1</property> 5196 + </packing> 5197 + </child> 5198 + <child> 5199 + <widget class="GtkRadioButton" id="scripts_confirm_radiobutton"> 5200 + <property name="visible">True</property> 5201 + <property name="can_focus">True</property> 5202 + <property name="label" translatable="yes">_Ask each time</property> 5203 + <property name="use_underline">True</property> 5204 + <property name="response_id">0</property> 5205 + <property name="draw_indicator">True</property> 5206 + <property name="group">scripts_execute_radiobutton</property> 5207 + </widget> 5208 + <packing> 5209 + <property name="expand">False</property> 5210 + <property name="fill">False</property> 5211 + <property name="position">2</property> 5212 + </packing> 5213 + </child> 5214 + </widget> 5215 + </child> 5216 + </widget> 5217 + <packing> 5218 + <property name="position">1</property> 5219 + </packing> 5220 + </child> 5221 + </widget> 5222 + <packing> 5223 + <property name="expand">False</property> 5224 + <property name="position">1</property> 5225 + </packing> 5226 + </child> 5227 + <child> 5228 + <widget class="GtkVBox" id="vbox8"> 5229 + <property name="visible">True</property> 5230 + <property name="spacing">6</property> 5231 + <child> 5232 + <widget class="GtkLabel" id="label14"> 5233 + <property name="visible">True</property> 5234 + <property name="xalign">0</property> 5235 + <property name="label" translatable="yes"><b>Trash</b></property> 5236 + <property name="use_markup">True</property> 5237 + </widget> 5238 + <packing> 5239 + <property name="expand">False</property> 5240 + <property name="fill">False</property> 5241 + </packing> 5242 + </child> 5243 + <child> 5244 + <widget class="GtkAlignment" id="alignment7"> 5245 + <property name="visible">True</property> 5246 + <property name="left_padding">12</property> 5247 + <child> 5248 + <widget class="GtkVBox" id="vbox19"> 5249 + <property name="visible">True</property> 5250 + <property name="spacing">6</property> 5251 + <child> 5252 + <widget class="GtkCheckButton" id="trash_confirm_checkbutton"> 5253 + <property name="visible">True</property> 5254 + <property name="can_focus">True</property> 5255 + <property name="label" translatable="yes">Ask before _emptying the Trash or deleting files</property> 5256 + <property name="use_underline">True</property> 5257 + <property name="response_id">0</property> 5258 + <property name="draw_indicator">True</property> 5259 + </widget> 5260 + <packing> 5261 + <property name="expand">False</property> 5262 + <property name="fill">False</property> 5263 + </packing> 5264 + </child> 5265 + <child> 5266 + <widget class="GtkCheckButton" id="trash_delete_checkbutton"> 5267 + <property name="visible">True</property> 5268 + <property name="can_focus">True</property> 5269 + <property name="label" translatable="yes">I_nclude a Delete command that bypasses Trash</property> 5270 + <property name="use_underline">True</property> 5271 + <property name="response_id">0</property> 5272 + <property name="draw_indicator">True</property> 5273 + </widget> 5274 + <packing> 5275 + <property name="expand">False</property> 5276 + <property name="fill">False</property> 5277 + <property name="position">1</property> 5278 + </packing> 5279 + </child> 5280 + </widget> 5281 + </child> 5282 + </widget> 5283 + <packing> 5284 + <property name="position">1</property> 5285 + </packing> 5286 + </child> 5287 + </widget> 5288 + <packing> 5289 + <property name="expand">False</property> 5290 + <property name="position">2</property> 5291 + </packing> 5292 + </child> 5293 + </widget> 5294 + <packing> 5295 + <property name="position">1</property> 5296 + </packing> 5297 + </child> 5298 + <child> 5299 + <widget class="GtkLabel" id="label3"> 5300 + <property name="visible">True</property> 5301 + <property name="label" translatable="yes">Behavior</property> 5302 + </widget> 5303 + <packing> 5304 + <property name="type">tab</property> 5305 + <property name="position">1</property> 5306 + <property name="tab_fill">False</property> 5307 + </packing> 5308 + </child> 5309 + <child> 5310 + <widget class="GtkVBox" id="vbox26"> 5311 + <property name="visible">True</property> 5312 + <property name="border_width">12</property> 5313 + <property name="spacing">18</property> 5314 + <child> 5315 + <widget class="GtkVBox" id="vbox27"> 5316 + <property name="visible">True</property> 5317 + <property name="spacing">6</property> 5318 + <child> 5319 + <widget class="GtkLabel" id="label28"> 5320 + <property name="visible">True</property> 5321 + <property name="xalign">0</property> 5322 + <property name="label" translatable="yes"><b>Icon Captions</b></property> 5323 + <property name="use_markup">True</property> 5324 + </widget> 5325 + <packing> 5326 + <property name="expand">False</property> 5327 + <property name="fill">False</property> 5328 + </packing> 5329 + </child> 5330 + <child> 5331 + <widget class="GtkAlignment" id="alignment8"> 5332 + <property name="visible">True</property> 5333 + <property name="left_padding">12</property> 5334 + <child> 5335 + <widget class="GtkVBox" id="vbox28"> 5336 + <property name="visible">True</property> 5337 + <property name="spacing">6</property> 5338 + <child> 5339 + <widget class="GtkLabel" id="label29"> 5340 + <property name="visible">True</property> 5341 + <property name="xalign">0</property> 5342 + <property name="label" translatable="yes">Choose the order of information to appear beneath icon names. More information will appear when zooming in closer.</property> 5343 + <property name="wrap">True</property> 5344 + </widget> 5345 + <packing> 5346 + <property name="expand">False</property> 5347 + <property name="fill">False</property> 5348 + </packing> 5349 + </child> 5350 + <child> 5351 + <widget class="GtkHBox" id="hbox28"> 5352 + <property name="visible">True</property> 5353 + <child> 5354 + <widget class="GtkLabel" id="captions_label_0"> 5355 + <property name="visible">True</property> 5356 + </widget> 5357 + <packing> 5358 + <property name="expand">False</property> 5359 + <property name="fill">False</property> 5360 + </packing> 5361 + </child> 5362 + <child> 5363 + <widget class="GtkComboBox" id="captions_0_combobox"> 5364 + <property name="visible">True</property> 5365 + <property name="items" translatable="yes"></property> 5366 + </widget> 5367 + <packing> 5368 + <property name="expand">False</property> 5369 + <property name="position">1</property> 5370 + </packing> 5371 + </child> 5372 + </widget> 5373 + <packing> 5374 + <property name="position">1</property> 5375 + </packing> 5376 + </child> 5377 + <child> 5378 + <widget class="GtkHBox" id="hbox29"> 5379 + <property name="visible">True</property> 5380 + <child> 5381 + <widget class="GtkLabel" id="captions_label_1"> 5382 + <property name="visible">True</property> 5383 + <property name="use_underline">True</property> 5384 + </widget> 5385 + <packing> 5386 + <property name="expand">False</property> 5387 + <property name="fill">False</property> 5388 + </packing> 5389 + </child> 5390 + <child> 5391 + <widget class="GtkComboBox" id="captions_1_combobox"> 5392 + <property name="visible">True</property> 5393 + <property name="items" translatable="yes"></property> 5394 + </widget> 5395 + <packing> 5396 + <property name="expand">False</property> 5397 + <property name="position">1</property> 5398 + </packing> 5399 + </child> 5400 + </widget> 5401 + <packing> 5402 + <property name="expand">False</property> 5403 + <property name="fill">False</property> 5404 + <property name="position">2</property> 5405 + </packing> 5406 + </child> 5407 + <child> 5408 + <widget class="GtkHBox" id="hbox30"> 5409 + <property name="visible">True</property> 5410 + <child> 5411 + <widget class="GtkLabel" id="captions_label_2"> 5412 + <property name="visible">True</property> 5413 + </widget> 5414 + <packing> 5415 + <property name="expand">False</property> 5416 + <property name="fill">False</property> 5417 + </packing> 5418 + </child> 5419 + <child> 5420 + <widget class="GtkComboBox" id="captions_2_combobox"> 5421 + <property name="visible">True</property> 5422 + <property name="items" translatable="yes"></property> 5423 + </widget> 5424 + <packing> 5425 + <property name="expand">False</property> 5426 + <property name="position">1</property> 5427 + </packing> 5428 + </child> 5429 + </widget> 5430 + <packing> 5431 + <property name="position">3</property> 5432 + </packing> 5433 + </child> 5434 + </widget> 5435 + </child> 5436 + </widget> 5437 + <packing> 5438 + <property name="position">1</property> 5439 + </packing> 5440 + </child> 5441 + </widget> 5442 + <packing> 5443 + <property name="expand">False</property> 5444 + </packing> 5445 + </child> 5446 + <child> 5447 + <widget class="GtkVBox" id="vbox31"> 5448 + <property name="visible">True</property> 5449 + <property name="spacing">6</property> 5450 + <child> 5451 + <widget class="GtkLabel" id="label34"> 5452 + <property name="visible">True</property> 5453 + <property name="xalign">0</property> 5454 + <property name="label" translatable="yes"><b>Date</b></property> 5455 + <property name="use_markup">True</property> 5456 + </widget> 5457 + <packing> 5458 + <property name="expand">False</property> 5459 + <property name="fill">False</property> 5460 + </packing> 5461 + </child> 5462 + <child> 5463 + <widget class="GtkAlignment" id="alignment9"> 5464 + <property name="visible">True</property> 5465 + <property name="left_padding">12</property> 5466 + <child> 5467 + <widget class="GtkHBox" id="hbox33"> 5468 + <property name="visible">True</property> 5469 + <property name="spacing">12</property> 5470 + <child> 5471 + <widget class="GtkLabel" id="label36"> 5472 + <property name="visible">True</property> 5473 + <property name="label" translatable="yes">_Format:</property> 5474 + <property name="use_underline">True</property> 5475 + <property name="mnemonic_widget">date_format_combobox</property> 5476 + </widget> 5477 + <packing> 5478 + <property name="expand">False</property> 5479 + <property name="fill">False</property> 5480 + </packing> 5481 + </child> 5482 + <child> 5483 + <widget class="GtkComboBox" id="date_format_combobox"> 5484 + <property name="visible">True</property> 5485 + <property name="items" translatable="yes"></property> 5486 + </widget> 5487 + <packing> 5488 + <property name="expand">False</property> 5489 + <property name="fill">False</property> 5490 + <property name="position">1</property> 5491 + </packing> 5492 + </child> 5493 + </widget> 5494 + </child> 5495 + </widget> 5496 + <packing> 5497 + <property name="position">1</property> 5498 + </packing> 5499 + </child> 5500 + </widget> 5501 + <packing> 5502 + <property name="expand">False</property> 5503 + <property name="position">1</property> 5504 + </packing> 5505 + </child> 5506 + </widget> 5507 + <packing> 5508 + <property name="position">2</property> 5509 + </packing> 5510 + </child> 5511 + <child> 5512 + <widget class="GtkLabel" id="label24"> 5513 + <property name="visible">True</property> 5514 + <property name="label" translatable="yes">Display</property> 5515 + </widget> 5516 + <packing> 5517 + <property name="type">tab</property> 5518 + <property name="position">2</property> 5519 + <property name="tab_fill">False</property> 5520 + </packing> 5521 + </child> 5522 + <child> 5523 + <widget class="GtkVBox" id="vbox29"> 5524 + <property name="visible">True</property> 5525 + <property name="border_width">12</property> 5526 + <property name="spacing">18</property> 5527 + <child> 5528 + <widget class="GtkVBox" id="vbox30"> 5529 + <property name="visible">True</property> 5530 + <property name="spacing">6</property> 5531 + <child> 5532 + <widget class="GtkLabel" id="label31"> 5533 + <property name="visible">True</property> 5534 + <property name="xalign">0</property> 5535 + <property name="label" translatable="yes"><b>List Columns</b></property> 5536 + <property name="use_markup">True</property> 5537 + </widget> 5538 + <packing> 5539 + <property name="expand">False</property> 5540 + <property name="fill">False</property> 5541 + </packing> 5542 + </child> 5543 + <child> 5544 + <widget class="GtkAlignment" id="alignment21"> 5545 + <property name="visible">True</property> 5546 + <property name="left_padding">12</property> 5547 + <child> 5548 + <widget class="GtkVBox" id="list_columns_vbox"> 5549 + <property name="visible">True</property> 5550 + <property name="spacing">6</property> 5551 + <child> 5552 + <widget class="GtkLabel" id="label33"> 5553 + <property name="visible">True</property> 5554 + <property name="xalign">0</property> 5555 + <property name="label" translatable="yes">Choose the order of information to appear in the list view.</property> 5556 + <property name="wrap">True</property> 5557 + </widget> 5558 + <packing> 5559 + <property name="expand">False</property> 5560 + <property name="fill">False</property> 5561 + </packing> 5562 + </child> 5563 + <child> 5564 + <placeholder/> 5565 + </child> 5566 + </widget> 5567 + </child> 5568 + </widget> 5569 + <packing> 5570 + <property name="position">1</property> 5571 + </packing> 5572 + </child> 5573 + </widget> 5574 + </child> 5575 + </widget> 5576 + <packing> 5577 + <property name="position">3</property> 5578 + </packing> 5579 + </child> 5580 + <child> 5581 + <widget class="GtkLabel" id="label30"> 5582 + <property name="visible">True</property> 5583 + <property name="label" translatable="yes">List Columns</property> 5584 + </widget> 5585 + <packing> 5586 + <property name="type">tab</property> 5587 + <property name="position">3</property> 5588 + <property name="tab_fill">False</property> 5589 + </packing> 5590 + </child> 5591 + <child> 5592 + <widget class="GtkVBox" id="vbox9"> 5593 + <property name="visible">True</property> 5594 + <property name="border_width">12</property> 5595 + <property name="spacing">18</property> 5596 + <child> 5597 + <widget class="GtkVBox" id="vbox10"> 5598 + <property name="visible">True</property> 5599 + <property name="spacing">6</property> 5600 + <child> 5601 + <widget class="GtkLabel" id="label16"> 5602 + <property name="visible">True</property> 5603 + <property name="xalign">0</property> 5604 + <property name="label" translatable="yes"><b>Text Files</b></property> 5605 + <property name="use_markup">True</property> 5606 + </widget> 5607 + <packing> 5608 + <property name="expand">False</property> 5609 + <property name="fill">False</property> 5610 + </packing> 5611 + </child> 5612 + <child> 5613 + <widget class="GtkAlignment" id="alignment10"> 5614 + <property name="visible">True</property> 5615 + <property name="left_padding">12</property> 5616 + <child> 5617 + <widget class="GtkVBox" id="vbox20"> 5618 + <property name="visible">True</property> 5619 + <property name="spacing">6</property> 5620 + <child> 5621 + <widget class="GtkHBox" id="hbox24"> 5622 + <property name="visible">True</property> 5623 + <property name="spacing">12</property> 5624 + <child> 5625 + <widget class="GtkLabel" id="preview_label_0"> 5626 + <property name="visible">True</property> 5627 + <property name="xalign">0</property> 5628 + <property name="label" translatable="yes">Show te_xt in icons:</property> 5629 + <property name="use_underline">True</property> 5630 + <property name="mnemonic_widget">preview_text_combobox</property> 5631 + </widget> 5632 + <packing> 5633 + <property name="expand">False</property> 5634 + <property name="fill">False</property> 5635 + </packing> 5636 + </child> 5637 + <child> 5638 + <widget class="GtkComboBox" id="preview_text_combobox"> 5639 + <property name="visible">True</property> 5640 + <property name="items" translatable="yes">Always 5641 Local Files Only 5642 Never</property> 5643 - <property name="add_tearoffs">False</property> 5644 - <property name="focus_on_click">True</property> 5645 - </widget> 5646 - <packing> 5647 - <property name="padding">0</property> 5648 - <property name="expand">True</property> 5649 - <property name="fill">True</property> 5650 - </packing> 5651 - </child> 5652 - </widget> 5653 - <packing> 5654 - <property name="padding">0</property> 5655 - <property name="expand">True</property> 5656 - <property name="fill">True</property> 5657 - </packing> 5658 - </child> 5659 - </widget> 5660 - </child> 5661 - </widget> 5662 - <packing> 5663 - <property name="padding">0</property> 5664 - <property name="expand">True</property> 5665 - <property name="fill">True</property> 5666 - </packing> 5667 - </child> 5668 - </widget> 5669 - <packing> 5670 - <property name="padding">0</property> 5671 - <property name="expand">False</property> 5672 - <property name="fill">True</property> 5673 - </packing> 5674 - </child> 5675 - 5676 - <child> 5677 - <widget class="GtkVBox" id="vbox11"> 5678 - <property name="visible">True</property> 5679 - <property name="homogeneous">False</property> 5680 - <property name="spacing">6</property> 5681 - 5682 - <child> 5683 - <widget class="GtkLabel" id="label18"> 5684 - <property name="visible">True</property> 5685 - <property name="label" translatable="yes"><b>Other Previewable Files</b></property> 5686 - <property name="use_underline">False</property> 5687 - <property name="use_markup">True</property> 5688 - <property name="justify">GTK_JUSTIFY_LEFT</property> 5689 - <property name="wrap">False</property> 5690 - <property name="selectable">False</property> 5691 - <property name="xalign">0</property> 5692 - <property name="yalign">0.5</property> 5693 - <property name="xpad">0</property> 5694 - <property name="ypad">0</property> 5695 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 5696 - <property name="width_chars">-1</property> 5697 - <property name="single_line_mode">False</property> 5698 - <property name="angle">0</property> 5699 - </widget> 5700 - <packing> 5701 - <property name="padding">0</property> 5702 - <property name="expand">False</property> 5703 - <property name="fill">False</property> 5704 - </packing> 5705 - </child> 5706 - 5707 - <child> 5708 - <widget class="GtkAlignment" id="alignment11"> 5709 - <property name="visible">True</property> 5710 - <property name="xalign">0.5</property> 5711 - <property name="yalign">0.5</property> 5712 - <property name="xscale">1</property> 5713 - <property name="yscale">1</property> 5714 - <property name="top_padding">0</property> 5715 - <property name="bottom_padding">0</property> 5716 - <property name="left_padding">12</property> 5717 - <property name="right_padding">0</property> 5718 - 5719 - <child> 5720 - <widget class="GtkVBox" id="vbox21"> 5721 - <property name="visible">True</property> 5722 - <property name="homogeneous">False</property> 5723 - <property name="spacing">6</property> 5724 - 5725 - <child> 5726 - <widget class="GtkHBox" id="hbox20"> 5727 - <property name="visible">True</property> 5728 - <property name="homogeneous">False</property> 5729 - <property name="spacing">12</property> 5730 - 5731 - <child> 5732 - <widget class="GtkLabel" id="preview_label_1"> 5733 - <property name="visible">True</property> 5734 - <property name="label" translatable="yes">Show _thumbnails:</property> 5735 - <property name="use_underline">True</property> 5736 - <property name="use_markup">False</property> 5737 - <property name="justify">GTK_JUSTIFY_LEFT</property> 5738 - <property name="wrap">False</property> 5739 - <property name="selectable">False</property> 5740 - <property name="xalign">0</property> 5741 - <property name="yalign">0.5</property> 5742 - <property name="xpad">0</property> 5743 - <property name="ypad">0</property> 5744 - <property name="mnemonic_widget">preview_image_combobox</property> 5745 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 5746 - <property name="width_chars">-1</property> 5747 - <property name="single_line_mode">False</property> 5748 - <property name="angle">0</property> 5749 - </widget> 5750 - <packing> 5751 - <property name="padding">0</property> 5752 - <property name="expand">False</property> 5753 - <property name="fill">False</property> 5754 - </packing> 5755 - </child> 5756 - 5757 - <child> 5758 - <widget class="GtkComboBox" id="preview_image_combobox"> 5759 - <property name="visible">True</property> 5760 - <property name="items" translatable="yes">Always 5761 + </widget> 5762 + <packing> 5763 + <property name="position">1</property> 5764 + </packing> 5765 + </child> 5766 + </widget> 5767 + </child> 5768 + </widget> 5769 + </child> 5770 + </widget> 5771 + <packing> 5772 + <property name="position">1</property> 5773 + </packing> 5774 + </child> 5775 + </widget> 5776 + <packing> 5777 + <property name="expand">False</property> 5778 + </packing> 5779 + </child> 5780 + <child> 5781 + <widget class="GtkVBox" id="vbox11"> 5782 + <property name="visible">True</property> 5783 + <property name="spacing">6</property> 5784 + <child> 5785 + <widget class="GtkLabel" id="label18"> 5786 + <property name="visible">True</property> 5787 + <property name="xalign">0</property> 5788 + <property name="label" translatable="yes"><b>Other Previewable Files</b></property> 5789 + <property name="use_markup">True</property> 5790 + </widget> 5791 + <packing> 5792 + <property name="expand">False</property> 5793 + <property name="fill">False</property> 5794 + </packing> 5795 + </child> 5796 + <child> 5797 + <widget class="GtkAlignment" id="alignment11"> 5798 + <property name="visible">True</property> 5799 + <property name="left_padding">12</property> 5800 + <child> 5801 + <widget class="GtkVBox" id="vbox21"> 5802 + <property name="visible">True</property> 5803 + <property name="spacing">6</property> 5804 + <child> 5805 + <widget class="GtkHBox" id="hbox20"> 5806 + <property name="visible">True</property> 5807 + <property name="spacing">12</property> 5808 + <child> 5809 + <widget class="GtkLabel" id="preview_label_1"> 5810 + <property name="visible">True</property> 5811 + <property name="xalign">0</property> 5812 + <property name="label" translatable="yes">Show _thumbnails:</property> 5813 + <property name="use_underline">True</property> 5814 + <property name="mnemonic_widget">preview_image_combobox</property> 5815 + </widget> 5816 + <packing> 5817 + <property name="expand">False</property> 5818 + <property name="fill">False</property> 5819 + </packing> 5820 + </child> 5821 + <child> 5822 + <widget class="GtkComboBox" id="preview_image_combobox"> 5823 + <property name="visible">True</property> 5824 + <property name="items" translatable="yes">Always 5825 Local Files Only 5826 Never</property> 5827 - <property name="add_tearoffs">False</property> 5828 - <property name="focus_on_click">True</property> 5829 - </widget> 5830 - <packing> 5831 - <property name="padding">0</property> 5832 - <property name="expand">True</property> 5833 - <property name="fill">True</property> 5834 - </packing> 5835 - </child> 5836 - </widget> 5837 - <packing> 5838 - <property name="padding">0</property> 5839 - <property name="expand">True</property> 5840 - <property name="fill">True</property> 5841 - </packing> 5842 - </child> 5843 - 5844 - <child> 5845 - <widget class="GtkHBox" id="hbox21"> 5846 - <property name="visible">True</property> 5847 - <property name="homogeneous">False</property> 5848 - <property name="spacing">12</property> 5849 - 5850 - <child> 5851 - <widget class="GtkLabel" id="preview_label_2"> 5852 - <property name="visible">True</property> 5853 - <property name="label" translatable="yes">_Only for files smaller than:</property> 5854 - <property name="use_underline">True</property> 5855 - <property name="use_markup">False</property> 5856 - <property name="justify">GTK_JUSTIFY_LEFT</property> 5857 - <property name="wrap">False</property> 5858 - <property name="selectable">False</property> 5859 - <property name="xalign">0</property> 5860 - <property name="yalign">0.5</property> 5861 - <property name="xpad">0</property> 5862 - <property name="ypad">0</property> 5863 - <property name="mnemonic_widget">preview_image_size_combobox</property> 5864 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 5865 - <property name="width_chars">-1</property> 5866 - <property name="single_line_mode">False</property> 5867 - <property name="angle">0</property> 5868 - </widget> 5869 - <packing> 5870 - <property name="padding">0</property> 5871 - <property name="expand">False</property> 5872 - <property name="fill">False</property> 5873 - </packing> 5874 - </child> 5875 - 5876 - <child> 5877 - <widget class="GtkComboBox" id="preview_image_size_combobox"> 5878 - <property name="visible">True</property> 5879 - <property name="items" translatable="yes">100 KB 5880 + </widget> 5881 + <packing> 5882 + <property name="position">1</property> 5883 + </packing> 5884 + </child> 5885 + </widget> 5886 + </child> 5887 + <child> 5888 + <widget class="GtkHBox" id="hbox21"> 5889 + <property name="visible">True</property> 5890 + <property name="spacing">12</property> 5891 + <child> 5892 + <widget class="GtkLabel" id="preview_label_2"> 5893 + <property name="visible">True</property> 5894 + <property name="xalign">0</property> 5895 + <property name="label" translatable="yes">_Only for files smaller than:</property> 5896 + <property name="use_underline">True</property> 5897 + <property name="mnemonic_widget">preview_image_size_combobox</property> 5898 + </widget> 5899 + <packing> 5900 + <property name="expand">False</property> 5901 + <property name="fill">False</property> 5902 + </packing> 5903 + </child> 5904 + <child> 5905 + <widget class="GtkComboBox" id="preview_image_size_combobox"> 5906 + <property name="visible">True</property> 5907 + <property name="items" translatable="yes">100 KB 5908 500 KB 5909 1 MB 5910 3 MB 5911 @@ -2043,928 +1169,599 @@ Never</property> 5912 10 MB 5913 100 MB 5914 1 GB</property> 5915 - <property name="add_tearoffs">False</property> 5916 - <property name="focus_on_click">True</property> 5917 - </widget> 5918 - <packing> 5919 - <property name="padding">0</property> 5920 - <property name="expand">True</property> 5921 - <property name="fill">True</property> 5922 - </packing> 5923 - </child> 5924 - </widget> 5925 - <packing> 5926 - <property name="padding">0</property> 5927 - <property name="expand">True</property> 5928 - <property name="fill">True</property> 5929 - </packing> 5930 - </child> 5931 - </widget> 5932 - </child> 5933 - </widget> 5934 - <packing> 5935 - <property name="padding">0</property> 5936 - <property name="expand">True</property> 5937 - <property name="fill">True</property> 5938 - </packing> 5939 - </child> 5940 - </widget> 5941 - <packing> 5942 - <property name="padding">0</property> 5943 - <property name="expand">False</property> 5944 - <property name="fill">True</property> 5945 - </packing> 5946 - </child> 5947 - 5948 - <child> 5949 - <widget class="GtkVBox" id="vbox12"> 5950 - <property name="visible">True</property> 5951 - <property name="homogeneous">False</property> 5952 - <property name="spacing">6</property> 5953 - 5954 - <child> 5955 - <widget class="GtkLabel" id="label20"> 5956 - <property name="visible">True</property> 5957 - <property name="label" translatable="yes"><b>Sound Files</b></property> 5958 - <property name="use_underline">False</property> 5959 - <property name="use_markup">True</property> 5960 - <property name="justify">GTK_JUSTIFY_LEFT</property> 5961 - <property name="wrap">False</property> 5962 - <property name="selectable">False</property> 5963 - <property name="xalign">0</property> 5964 - <property name="yalign">0.5</property> 5965 - <property name="xpad">0</property> 5966 - <property name="ypad">0</property> 5967 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 5968 - <property name="width_chars">-1</property> 5969 - <property name="single_line_mode">False</property> 5970 - <property name="angle">0</property> 5971 - </widget> 5972 - <packing> 5973 - <property name="padding">0</property> 5974 - <property name="expand">False</property> 5975 - <property name="fill">False</property> 5976 - </packing> 5977 - </child> 5978 - 5979 - <child> 5980 - <widget class="GtkAlignment" id="alignment12"> 5981 - <property name="visible">True</property> 5982 - <property name="xalign">0.5</property> 5983 - <property name="yalign">0.5</property> 5984 - <property name="xscale">1</property> 5985 - <property name="yscale">1</property> 5986 - <property name="top_padding">0</property> 5987 - <property name="bottom_padding">0</property> 5988 - <property name="left_padding">12</property> 5989 - <property name="right_padding">0</property> 5990 - 5991 - <child> 5992 - <widget class="GtkVBox" id="vbox22"> 5993 - <property name="visible">True</property> 5994 - <property name="homogeneous">False</property> 5995 - <property name="spacing">6</property> 5996 - 5997 - <child> 5998 - <widget class="GtkHBox" id="hbox22"> 5999 - <property name="visible">True</property> 6000 - <property name="homogeneous">False</property> 6001 - <property name="spacing">12</property> 6002 - 6003 - <child> 6004 - <widget class="GtkLabel" id="preview_label_3"> 6005 - <property name="visible">True</property> 6006 - <property name="label" translatable="yes">Preview _sound files:</property> 6007 - <property name="use_underline">True</property> 6008 - <property name="use_markup">False</property> 6009 - <property name="justify">GTK_JUSTIFY_LEFT</property> 6010 - <property name="wrap">False</property> 6011 - <property name="selectable">False</property> 6012 - <property name="xalign">0</property> 6013 - <property name="yalign">0.5</property> 6014 - <property name="xpad">0</property> 6015 - <property name="ypad">0</property> 6016 - <property name="mnemonic_widget">preview_sound_combobox</property> 6017 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 6018 - <property name="width_chars">-1</property> 6019 - <property name="single_line_mode">False</property> 6020 - <property name="angle">0</property> 6021 - </widget> 6022 - <packing> 6023 - <property name="padding">0</property> 6024 - <property name="expand">False</property> 6025 - <property name="fill">False</property> 6026 - </packing> 6027 - </child> 6028 - 6029 - <child> 6030 - <widget class="GtkComboBox" id="preview_sound_combobox"> 6031 - <property name="visible">True</property> 6032 - <property name="items" translatable="yes">Always 6033 + </widget> 6034 + <packing> 6035 + <property name="position">1</property> 6036 + </packing> 6037 + </child> 6038 + </widget> 6039 + <packing> 6040 + <property name="position">1</property> 6041 + </packing> 6042 + </child> 6043 + </widget> 6044 + </child> 6045 + </widget> 6046 + <packing> 6047 + <property name="position">1</property> 6048 + </packing> 6049 + </child> 6050 + </widget> 6051 + <packing> 6052 + <property name="expand">False</property> 6053 + <property name="position">1</property> 6054 + </packing> 6055 + </child> 6056 + <child> 6057 + <widget class="GtkVBox" id="vbox12"> 6058 + <property name="visible">True</property> 6059 + <property name="spacing">6</property> 6060 + <child> 6061 + <widget class="GtkLabel" id="label20"> 6062 + <property name="visible">True</property> 6063 + <property name="xalign">0</property> 6064 + <property name="label" translatable="yes"><b>Sound Files</b></property> 6065 + <property name="use_markup">True</property> 6066 + </widget> 6067 + <packing> 6068 + <property name="expand">False</property> 6069 + <property name="fill">False</property> 6070 + </packing> 6071 + </child> 6072 + <child> 6073 + <widget class="GtkAlignment" id="alignment12"> 6074 + <property name="visible">True</property> 6075 + <property name="left_padding">12</property> 6076 + <child> 6077 + <widget class="GtkVBox" id="vbox22"> 6078 + <property name="visible">True</property> 6079 + <property name="spacing">6</property> 6080 + <child> 6081 + <widget class="GtkHBox" id="hbox22"> 6082 + <property name="visible">True</property> 6083 + <property name="spacing">12</property> 6084 + <child> 6085 + <widget class="GtkLabel" id="preview_label_3"> 6086 + <property name="visible">True</property> 6087 + <property name="xalign">0</property> 6088 + <property name="label" translatable="yes">Preview _sound files:</property> 6089 + <property name="use_underline">True</property> 6090 + <property name="mnemonic_widget">preview_sound_combobox</property> 6091 + </widget> 6092 + <packing> 6093 + <property name="expand">False</property> 6094 + <property name="fill">False</property> 6095 + </packing> 6096 + </child> 6097 + <child> 6098 + <widget class="GtkComboBox" id="preview_sound_combobox"> 6099 + <property name="visible">True</property> 6100 + <property name="items" translatable="yes">Always 6101 Local Files Only 6102 Never</property> 6103 - <property name="add_tearoffs">False</property> 6104 - <property name="focus_on_click">True</property> 6105 - </widget> 6106 - <packing> 6107 - <property name="padding">0</property> 6108 - <property name="expand">True</property> 6109 - <property name="fill">True</property> 6110 - </packing> 6111 - </child> 6112 - </widget> 6113 - <packing> 6114 - <property name="padding">0</property> 6115 - <property name="expand">True</property> 6116 - <property name="fill">True</property> 6117 - </packing> 6118 - </child> 6119 - </widget> 6120 - </child> 6121 - </widget> 6122 - <packing> 6123 - <property name="padding">0</property> 6124 - <property name="expand">True</property> 6125 - <property name="fill">True</property> 6126 - </packing> 6127 - </child> 6128 - </widget> 6129 - <packing> 6130 - <property name="padding">0</property> 6131 - <property name="expand">False</property> 6132 - <property name="fill">True</property> 6133 - </packing> 6134 - </child> 6135 - 6136 - <child> 6137 - <widget class="GtkVBox" id="vbox13"> 6138 - <property name="visible">True</property> 6139 - <property name="homogeneous">False</property> 6140 - <property name="spacing">6</property> 6141 - 6142 - <child> 6143 - <widget class="GtkLabel" id="label22"> 6144 - <property name="visible">True</property> 6145 - <property name="label" translatable="yes"><b>Folders</b></property> 6146 - <property name="use_underline">False</property> 6147 - <property name="use_markup">True</property> 6148 - <property name="justify">GTK_JUSTIFY_LEFT</property> 6149 - <property name="wrap">False</property> 6150 - <property name="selectable">False</property> 6151 - <property name="xalign">0</property> 6152 - <property name="yalign">0.5</property> 6153 - <property name="xpad">0</property> 6154 - <property name="ypad">0</property> 6155 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 6156 - <property name="width_chars">-1</property> 6157 - <property name="single_line_mode">False</property> 6158 - <property name="angle">0</property> 6159 - </widget> 6160 - <packing> 6161 - <property name="padding">0</property> 6162 - <property name="expand">False</property> 6163 - <property name="fill">False</property> 6164 - </packing> 6165 - </child> 6166 - 6167 - <child> 6168 - <widget class="GtkAlignment" id="alignment13"> 6169 - <property name="visible">True</property> 6170 - <property name="xalign">0.5</property> 6171 - <property name="yalign">0.5</property> 6172 - <property name="xscale">1</property> 6173 - <property name="yscale">1</property> 6174 - <property name="top_padding">0</property> 6175 - <property name="bottom_padding">0</property> 6176 - <property name="left_padding">12</property> 6177 - <property name="right_padding">0</property> 6178 - 6179 - <child> 6180 - <widget class="GtkVBox" id="vbox23"> 6181 - <property name="visible">True</property> 6182 - <property name="homogeneous">False</property> 6183 - <property name="spacing">6</property> 6184 - 6185 - <child> 6186 - <widget class="GtkHBox" id="hbox23"> 6187 - <property name="visible">True</property> 6188 - <property name="homogeneous">False</property> 6189 - <property name="spacing">12</property> 6190 - 6191 - <child> 6192 - <widget class="GtkLabel" id="preview_label_4"> 6193 - <property nam