1 17265 erwannc diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/configure.in nautilus-2.24.2/configure.in 2 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/configure.in 2008-10-20 14:09:22.000000000 +0200 3 17265 erwannc +++ nautilus-2.24.2/configure.in 2009-01-23 22:36:12.616536282 +0100 4 15264 erwannc @@ -327,6 +327,22 @@ if test "x$enable_beagle" != "xno"; then 5 15264 erwannc AC_SUBST(BEAGLE_CFLAGS) 6 15264 erwannc AC_SUBST(BEAGLE_LIBS) 7 15264 erwannc fi 8 15264 erwannc +dnl ========================================================================== 9 15264 erwannc + 10 15264 erwannc +dnl ******************** 11 15264 erwannc +dnl * Check for libzfs * 12 15264 erwannc +dnl ******************** 13 15264 erwannc +ZFS_LIBS= 14 15264 erwannc +msg_zfs=no 15 15264 erwannc +AC_CHECK_LIB(zfs, zfs_iter_root, 16 15264 erwannc + [AC_CHECK_HEADER(libzfs.h, 17 15264 erwannc + [AC_DEFINE(HAVE_ZFS, 1, [Define to 1 if ZFS is available]) 18 15264 erwannc + ZFS_LIBS="-lzfs" 19 15264 erwannc + msg_zfs=yes]) 20 15264 erwannc + ]) 21 15264 erwannc +AC_SUBST(ZFS_LIBS) 22 15264 erwannc + 23 15264 erwannc + 24 15264 erwannc 25 15264 erwannc dnl ========================================================================== 26 15264 erwannc 27 17265 erwannc diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/icons/Makefile.am nautilus-2.24.2/icons/Makefile.am 28 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/icons/Makefile.am 2008-10-06 19:22:21.000000000 +0200 29 17265 erwannc +++ nautilus-2.24.2/icons/Makefile.am 2009-01-23 22:36:10.586685500 +0100 30 17150 erwannc @@ -12,6 +12,10 @@ icon_DATA =\ 31 15526 erwannc knob.png \ 32 15526 erwannc note-indicator.png \ 33 15526 erwannc thumbnail_frame.png \ 34 15526 erwannc + restore.png \ 35 16819 erwannc + restore-search.png \ 36 16819 erwannc + restore-no.png \ 37 17150 erwannc + camera.png \ 38 15526 erwannc $(NULL) 39 15526 erwannc 40 15526 erwannc EXTRA_DIST = $(icon_DATA) 41 17265 erwannc 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 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/Makefile.am 2009-01-23 22:38:49.620637861 +0100 43 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/Makefile.am 2009-01-23 22:36:11.639751348 +0100 44 15264 erwannc @@ -32,6 +32,7 @@ libnautilus_private_la_LIBADD = \ 45 15264 erwannc $(TRACKER_LIBS) \ 46 15264 erwannc $(top_builddir)/libnautilus-extension/libnautilus-extension.la \ 47 15264 erwannc $(CORE_LIBS) \ 48 15264 erwannc + $(ZFS_LIBS) \ 49 15264 erwannc $(NULL) 50 15264 erwannc 51 15264 erwannc marshal_sources = \ 52 15264 erwannc @@ -200,6 +201,8 @@ libnautilus_private_la_SOURCES = \ 53 15264 erwannc nautilus-window-info.h \ 54 15264 erwannc nautilus-window-slot-info.c \ 55 15264 erwannc nautilus-window-slot-info.h \ 56 15264 erwannc + nautilus-zfs.c \ 57 15264 erwannc + nautilus-zfs.h \ 58 15264 erwannc $(NULL) 59 15264 erwannc 60 15264 erwannc BEAGLE_SOURCES = \ 61 16819 erwannc 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 16819 erwannc --- nautilus-2.24.2/libnautilus-private/apps_nautilus_preferences.schemas.in 2008-12-02 14:18:12.708779941 +0100 63 16819 erwannc +++ ../nautilus-full-async/libnautilus-private/apps_nautilus_preferences.schemas.in 2008-12-02 11:42:32.798412022 +0100 64 16342 erwannc @@ -5,6 +5,19 @@ 65 16342 erwannc in nautilus-global-preferences.c --> 66 16342 erwannc 67 16342 erwannc <!-- General preferences --> 68 16342 erwannc + <schema> 69 16342 erwannc + <key>/schemas/apps/nautilus/preferences/enable_time_slider</key> 70 16342 erwannc + <applyto>/apps/nautilus/preferences/enable_time_slider</applyto> 71 16342 erwannc + <owner>nautilus</owner> 72 16342 erwannc + <type>bool</type> 73 16342 erwannc + <default>true</default> 74 16342 erwannc + <locale name="C"> 75 16342 erwannc + <short>Enables the visualization of the ZFS snaphots timeline</short> 76 16342 erwannc + <long> 77 16342 erwannc + If set to true, the visualization of the ZFS snapshots timeline is enabled 78 16342 erwannc + </long> 79 16342 erwannc + </locale> 80 16342 erwannc + </schema> 81 16342 erwannc 82 16342 erwannc <schema> 83 16342 erwannc <key>/schemas/desktop/gnome/file_views/show_hidden_files</key> 84 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-column-utilities.c 2009-01-23 22:36:11.726383584 +0100 87 15715 erwannc @@ -122,6 +122,13 @@ get_builtin_columns (void) 88 15715 erwannc "description", _("The SELinux security context of the file."), 89 15715 erwannc NULL)); 90 15715 erwannc #endif 91 15715 erwannc + columns = g_list_append (columns, 92 15715 erwannc + g_object_new (NAUTILUS_TYPE_COLUMN, 93 15715 erwannc + "name", "restore_info", 94 15715 erwannc + "attribute", "restore_info", 95 15715 erwannc + "label", _("Restore information"), 96 15715 erwannc + "description", _("Restore information of the file."), 97 15715 erwannc + NULL)); 98 15715 erwannc 99 15715 erwannc return columns; 100 15715 erwannc } 101 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-directory-async.c 2009-01-23 22:36:11.646385711 +0100 104 16819 erwannc @@ -640,6 +640,10 @@ nautilus_directory_set_up_request (Reque 105 16819 erwannc if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO) { 106 16819 erwannc request->filesystem_info = TRUE; 107 16819 erwannc } 108 16819 erwannc + 109 16819 erwannc + if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO) { 110 16819 erwannc + request->restore_info = TRUE; 111 16819 erwannc + } 112 16819 erwannc } 113 16819 erwannc 114 16819 erwannc static void 115 16819 erwannc @@ -4723,6 +4727,18 @@ cancel_link_info_for_file (NautilusDirec 116 16819 erwannc } 117 16819 erwannc } 118 16819 erwannc 119 16819 erwannc +void nautilus_directory_cancel_restore_info (NautilusDirectory *directory) 120 16819 erwannc +{ 121 16819 erwannc + if (NAUTILUS_IS_DIRECTORY (directory)) 122 16819 erwannc + { 123 16819 erwannc + if (directory->details->restore_cancel) 124 16819 erwannc + { 125 16819 erwannc + g_cancellable_cancel (directory->details->restore_cancel); 126 16819 erwannc + directory->details->restore_cancel = NULL; 127 16819 erwannc + } 128 16819 erwannc + } 129 16819 erwannc +} 130 16819 erwannc + 131 16819 erwannc 132 16819 erwannc static void 133 16819 erwannc cancel_loading_attributes (NautilusDirectory *directory, 134 16819 erwannc @@ -4766,6 +4782,10 @@ cancel_loading_attributes (NautilusDirec 135 16819 erwannc if (request.mount) { 136 16819 erwannc mount_cancel (directory); 137 16819 erwannc } 138 16819 erwannc + 139 16819 erwannc + if (request.restore_info) { 140 16819 erwannc + nautilus_directory_cancel_restore_info (directory); 141 16819 erwannc + } 142 16819 erwannc 143 16819 erwannc /* FIXME bugzilla.gnome.org 45064: implement cancelling metadata when we 144 16819 erwannc implement invalidating metadata */ 145 16819 erwannc @@ -4812,6 +4832,9 @@ nautilus_directory_cancel_loading_file_a 146 16819 erwannc if (request.mount) { 147 16819 erwannc cancel_mount_for_file (directory, file); 148 16819 erwannc } 149 16819 erwannc + if (request.restore_info) { 150 16819 erwannc + nautilus_directory_cancel_restore_info (directory); 151 16819 erwannc + } 152 16819 erwannc 153 16819 erwannc /* FIXME bugzilla.gnome.org 45064: implement cancelling metadata when we 154 16819 erwannc implement invalidating metadata */ 155 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-directory-private.h 2009-01-23 22:36:11.641529607 +0100 158 16819 erwannc @@ -114,9 +114,14 @@ struct NautilusDirectoryDetails 159 16819 erwannc 160 16819 erwannc LinkInfoReadState *link_info_read_state; 161 16819 erwannc 162 16819 erwannc + GCancellable *restore_cancel; 163 16819 erwannc + 164 15264 erwannc GList *file_operations_in_progress; /* list of FileOperation * */ 165 15264 erwannc 166 15264 erwannc GHashTable *hidden_file_hash; 167 15264 erwannc + 168 15264 erwannc + /* zfs snapshot info */ 169 15264 erwannc + GList *zfs_snapshots; 170 15264 erwannc }; 171 15264 erwannc 172 15264 erwannc /* A request for information about one or more files. */ 173 16819 erwannc @@ -134,6 +139,7 @@ typedef struct { 174 16819 erwannc gboolean thumbnail; 175 16819 erwannc gboolean mount; 176 16819 erwannc gboolean filesystem_info; 177 16819 erwannc + gboolean restore_info; 178 16819 erwannc } Request; 179 16819 erwannc 180 16819 erwannc NautilusDirectory *nautilus_directory_get_existing (GFile *location); 181 17265 erwannc 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 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory.c 2009-01-23 22:38:49.601904193 +0100 183 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-directory.c 2009-01-23 22:36:12.453860140 +0100 184 15264 erwannc @@ -38,6 +38,7 @@ 185 15264 erwannc #include "nautilus-metafile.h" 186 15264 erwannc #include "nautilus-desktop-directory.h" 187 15264 erwannc #include "nautilus-vfs-directory.h" 188 15264 erwannc +#include "nautilus-zfs.h" 189 15264 erwannc #include <eel/eel-glib-extensions.h> 190 15264 erwannc #include <eel/eel-gtk-macros.h> 191 15264 erwannc #include <eel/eel-string.h> 192 16819 erwannc @@ -140,6 +141,8 @@ nautilus_directory_init (gpointer object 193 15264 erwannc directory->details->low_priority_queue = nautilus_file_queue_new (); 194 15264 erwannc directory->details->extension_queue = nautilus_file_queue_new (); 195 15264 erwannc directory->details->idle_queue = nautilus_idle_queue_new (); 196 15264 erwannc + directory->details->zfs_snapshots = NULL; 197 16819 erwannc + directory->details->restore_cancel = NULL; 198 15264 erwannc } 199 15264 erwannc 200 15264 erwannc NautilusDirectory * 201 16819 erwannc @@ -215,7 +218,13 @@ nautilus_directory_finalize (GObject *ob 202 15264 erwannc if (directory->details->hidden_file_hash) { 203 15264 erwannc g_hash_table_destroy (directory->details->hidden_file_hash); 204 15264 erwannc } 205 16819 erwannc - 206 15264 erwannc + 207 15264 erwannc + if (directory->details->zfs_snapshots) { 208 15264 erwannc + ts_free_snapshots (directory->details->zfs_snapshots); 209 15264 erwannc + } 210 16819 erwannc + if (directory->details->restore_cancel) 211 16819 erwannc + g_cancellable_cancel (directory->details->restore_cancel); 212 16819 erwannc + 213 15264 erwannc nautilus_file_queue_destroy (directory->details->high_priority_queue); 214 15264 erwannc nautilus_file_queue_destroy (directory->details->low_priority_queue); 215 16819 erwannc nautilus_file_queue_destroy (directory->details->extension_queue); 216 16819 erwannc @@ -330,11 +339,27 @@ async_data_preference_changed_callback ( 217 16342 erwannc g_hash_table_foreach (directories, async_state_changed_one, NULL); 218 16342 erwannc } 219 16342 erwannc 220 16342 erwannc +static gboolean time_slider_enabled = TRUE; 221 16342 erwannc + 222 16819 erwannc +gboolean 223 16342 erwannc +is_time_slider_enabled () 224 16342 erwannc +{ 225 16342 erwannc + return time_slider_enabled; 226 16342 erwannc +} 227 16342 erwannc + 228 16342 erwannc +static void time_slider_pref_changed_callback () 229 16342 erwannc +{ 230 16342 erwannc + time_slider_enabled = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER); 231 16342 erwannc +} 232 16342 erwannc + 233 16342 erwannc + 234 16342 erwannc static void 235 16342 erwannc add_preferences_callbacks (void) 236 15264 erwannc { 237 16342 erwannc nautilus_global_preferences_init (); 238 16342 erwannc 239 16342 erwannc + time_slider_enabled = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER); 240 16342 erwannc + 241 16342 erwannc eel_preferences_add_callback (NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES, 242 16342 erwannc filtering_changed_callback, 243 16342 erwannc NULL); 244 16819 erwannc @@ -351,6 +376,9 @@ add_preferences_callbacks (void) 245 16342 erwannc eel_preferences_add_callback (NAUTILUS_PREFERENCES_DATE_FORMAT, 246 16342 erwannc async_data_preference_changed_callback, 247 16342 erwannc NULL); 248 16342 erwannc + eel_preferences_add_callback (NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER, 249 16342 erwannc + time_slider_pref_changed_callback, 250 16342 erwannc + NULL); 251 16342 erwannc } 252 16342 erwannc 253 16342 erwannc /** 254 16819 erwannc @@ -544,6 +572,7 @@ nautilus_directory_new (GFile *location) 255 16342 erwannc { 256 15264 erwannc NautilusDirectory *directory; 257 15264 erwannc char *uri; 258 15264 erwannc + char *path; 259 15264 erwannc 260 15264 erwannc uri = g_file_get_uri (location); 261 15264 erwannc 262 16819 erwannc @@ -555,10 +584,13 @@ nautilus_directory_new (GFile *location) 263 15264 erwannc directory = NAUTILUS_DIRECTORY (nautilus_search_directory_new_from_saved_search (uri)); 264 15264 erwannc } else { 265 15264 erwannc directory = NAUTILUS_DIRECTORY (g_object_new (NAUTILUS_TYPE_VFS_DIRECTORY, NULL)); 266 15264 erwannc + path = g_file_get_path (location); 267 15264 erwannc + g_free (path); 268 15264 erwannc } 269 15264 erwannc 270 15264 erwannc set_directory_location (directory, location); 271 15264 erwannc 272 15264 erwannc + 273 15264 erwannc g_free (uri); 274 15264 erwannc 275 15264 erwannc return directory; 276 17150 erwannc @@ -577,6 +609,197 @@ nautilus_directory_is_local (NautilusDir 277 16819 erwannc g_file_is_native (directory->details->location); 278 15264 erwannc } 279 15264 erwannc 280 16819 erwannc +typedef struct { 281 16819 erwannc + NautilusDirectory *dir; 282 16819 erwannc + GCancellable *cancel; 283 16819 erwannc + TsReadyCallback callback; 284 16819 erwannc + gpointer callback_user_data; 285 16819 erwannc +} QuerySnapshotsAsyncData; 286 16819 erwannc + 287 16819 erwannc + 288 16819 erwannc +static void snapshot_list_ready_callback (GObject *source_object, 289 16819 erwannc + GAsyncResult *res, 290 16819 erwannc + gpointer user_data) 291 15264 erwannc +{ 292 16819 erwannc + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 293 16819 erwannc + QuerySnapshotsAsyncData *data = (QuerySnapshotsAsyncData*) user_data; 294 15280 erwannc + 295 16819 erwannc + if (!g_cancellable_is_cancelled (data->cancel)) 296 16819 erwannc + { 297 16819 erwannc + data->dir->details->zfs_snapshots = g_simple_async_result_get_op_res_gpointer (simple); 298 16819 erwannc + } 299 16819 erwannc + 300 16819 erwannc + data->callback (data->dir, data->cancel, data->callback_user_data); 301 16819 erwannc +} 302 16819 erwannc + 303 16819 erwannc +void 304 16819 erwannc +nautilus_directory_get_snapshots_async (NautilusDirectory *directory, 305 16819 erwannc + TsReadyCallback ready_callback, 306 16819 erwannc + GCancellable *cancel, 307 16819 erwannc + gpointer callback_user_data) 308 16819 erwannc +{ 309 15264 erwannc + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 310 15264 erwannc + 311 16819 erwannc + if (directory->details->location == NULL) 312 16819 erwannc + return; 313 15264 erwannc + 314 15264 erwannc + if (directory->details->zfs_snapshots) { 315 15264 erwannc + ts_free_snapshots (directory->details->zfs_snapshots); 316 16342 erwannc + directory->details->zfs_snapshots = NULL; 317 15264 erwannc + } 318 16819 erwannc + 319 16819 erwannc + if (is_time_slider_enabled ()) 320 16819 erwannc + { 321 16819 erwannc + QuerySnapshotsAsyncData *data; 322 16819 erwannc + data = g_new0 (QuerySnapshotsAsyncData,1); 323 16819 erwannc + data->dir = directory; 324 16819 erwannc + data->cancel = cancel; 325 16819 erwannc + data->callback = ready_callback; 326 16819 erwannc + data->callback_user_data = callback_user_data; 327 15280 erwannc + 328 16819 erwannc + ts_get_snapshots_for_dir_async (directory->details->location, 329 16819 erwannc + snapshot_list_ready_callback, 330 16819 erwannc + cancel, 331 16819 erwannc + data); 332 16819 erwannc + } 333 16819 erwannc +} 334 16819 erwannc + 335 16819 erwannc +gboolean 336 16819 erwannc +nautilus_directory_has_snapshots (NautilusDirectory *directory) 337 16819 erwannc +{ 338 16819 erwannc + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 339 16819 erwannc + 340 15264 erwannc + if (directory->details->zfs_snapshots) 341 15264 erwannc + return TRUE; 342 15264 erwannc + 343 15264 erwannc + return FALSE; 344 15264 erwannc +} 345 15264 erwannc +int 346 15264 erwannc +nautilus_directory_get_num_snapshots (NautilusDirectory *directory) 347 15264 erwannc +{ 348 15264 erwannc + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 349 15264 erwannc + 350 15264 erwannc + if (directory->details->zfs_snapshots) 351 15264 erwannc + { 352 15264 erwannc + int i = 0; 353 15264 erwannc + GList *tmp; 354 15350 erwannc + for (tmp = directory->details->zfs_snapshots;tmp;tmp = tmp->next) 355 15264 erwannc + i++; 356 15264 erwannc + return i; 357 15264 erwannc + } 358 15264 erwannc + return 0; 359 15264 erwannc +} 360 15264 erwannc + 361 15264 erwannc +gboolean 362 15264 erwannc +nautilus_directory_is_in_snapshot (NautilusDirectory *directory) 363 15264 erwannc +{ 364 15264 erwannc + char *directory_uri; 365 15715 erwannc + gboolean result = FALSE; 366 15264 erwannc + 367 15264 erwannc + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); 368 15264 erwannc + 369 15264 erwannc + directory_uri = nautilus_directory_get_uri (directory); 370 15264 erwannc + 371 15715 erwannc + result = ts_is_in_snapshot (directory_uri); 372 15264 erwannc + 373 15264 erwannc + g_free (directory_uri); 374 15264 erwannc + 375 15715 erwannc + return result; 376 15264 erwannc +} 377 15264 erwannc + 378 15264 erwannc +GList * 379 15264 erwannc +nautilus_directory_get_snapshots (NautilusDirectory *directory) 380 15264 erwannc +{ 381 15264 erwannc + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 382 15264 erwannc + 383 15264 erwannc + return directory->details->zfs_snapshots; 384 15264 erwannc +} 385 15264 erwannc + 386 17150 erwannc +void nautilus_directory_remove_snapshot (NautilusDirectory *directory, 387 17150 erwannc + ZfsDataSet *snap) 388 17150 erwannc +{ 389 17150 erwannc + if (directory->details->zfs_snapshots) 390 17150 erwannc + { 391 17150 erwannc + directory->details->zfs_snapshots = g_list_remove (directory->details->zfs_snapshots, snap); 392 17150 erwannc + ts_free_zfs_dataset (snap); 393 17150 erwannc + } 394 17150 erwannc +} 395 15264 erwannc +/* return true if snapdir dir path is a dir or subdir of refdir */ 396 15264 erwannc +gboolean 397 15264 erwannc +nautilus_directory_is_a_snapshot_dir_of (NautilusDirectory *snapdir, 398 15264 erwannc + NautilusDirectory *refdir) 399 15264 erwannc +{ 400 15264 erwannc + 401 15264 erwannc + gboolean result = FALSE; 402 15264 erwannc + 403 15264 erwannc + if (nautilus_directory_is_in_snapshot (snapdir)) 404 15264 erwannc + { 405 15264 erwannc + char snapdir_root_real_path [PATH_MAX+1]; 406 15264 erwannc + char refdir_real_path [PATH_MAX+1]; 407 15264 erwannc + NautilusDirectory *snapdir_root = nautilus_directory_get_snap_root (snapdir); 408 15264 erwannc + GFile *snapdir_root_file = nautilus_directory_get_location (snapdir_root); 409 15264 erwannc + GFile *refdir_file = nautilus_directory_get_location (refdir); 410 15264 erwannc + char* snapdir_root_path = g_file_get_path (snapdir_root_file); 411 15264 erwannc + char* refdir_path = g_file_get_path (refdir_file); 412 15264 erwannc + 413 15264 erwannc + if (realpath (snapdir_root_path, snapdir_root_real_path) && 414 15264 erwannc + realpath (refdir_path, refdir_real_path)) 415 15264 erwannc + { 416 15264 erwannc + if (g_strrstr (snapdir_root_real_path,refdir_real_path)) 417 15264 erwannc + result = TRUE; 418 15264 erwannc + } 419 15264 erwannc + 420 15264 erwannc + g_free (snapdir_root_path); 421 15264 erwannc + g_free (refdir_path); 422 15264 erwannc + g_object_unref (snapdir_root_file); 423 15264 erwannc + g_object_unref (refdir_file); 424 15264 erwannc + g_object_unref (snapdir_root); 425 15264 erwannc + } 426 15264 erwannc + 427 15264 erwannc + return result; 428 15264 erwannc +} 429 15264 erwannc + 430 15264 erwannc +NautilusDirectory *nautilus_directory_get_snap_root (NautilusDirectory *directory) 431 15264 erwannc +{ 432 15264 erwannc + char *directory_uri, *snap_root; 433 15264 erwannc + char *zfs, *iter; 434 15264 erwannc + int count = 0; 435 15280 erwannc + NautilusDirectory *new_dir; 436 15264 erwannc + 437 15264 erwannc + g_assert (NAUTILUS_IS_DIRECTORY (directory)); 438 15264 erwannc + 439 15264 erwannc + directory_uri = nautilus_directory_get_uri (directory); 440 15264 erwannc + 441 15264 erwannc + if (!nautilus_directory_is_in_snapshot (directory)) 442 15264 erwannc + return directory; 443 15264 erwannc + 444 15264 erwannc + /*remove .zfs/snapshot/blah/ */ 445 15264 erwannc + zfs = g_strrstr (directory_uri, ".zfs/snapshot/"); 446 15264 erwannc + iter = zfs; 447 15264 erwannc + 448 15264 erwannc + if (iter) 449 15264 erwannc + { 450 15264 erwannc + iter += sizeof (".zfs/snapshot/"); 451 15264 erwannc + while (*iter != '/' && *iter != '\0') 452 15264 erwannc + iter++; 453 15264 erwannc + 454 15264 erwannc + if (*iter == '/') 455 15264 erwannc + iter++; 456 15264 erwannc + 457 15264 erwannc + *zfs = '\0'; 458 15264 erwannc + snap_root = g_strdup_printf ("%s%s", directory_uri, iter); 459 15264 erwannc + 460 15264 erwannc + *zfs = 'a'; 461 15264 erwannc + g_free (directory_uri); 462 15280 erwannc + new_dir = nautilus_directory_get_by_uri (snap_root); 463 15280 erwannc + g_free (snap_root); 464 15280 erwannc + return new_dir; 465 15264 erwannc + } 466 15715 erwannc + return directory; 467 15264 erwannc +} 468 15264 erwannc + 469 15264 erwannc + 470 15264 erwannc + 471 16819 erwannc gboolean 472 15264 erwannc nautilus_directory_is_in_trash (NautilusDirectory *directory) 473 15264 erwannc { 474 17265 erwannc 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 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-directory.h 2008-10-06 19:22:21.000000000 +0200 476 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-directory.h 2009-01-23 22:36:11.710303836 +0100 477 16819 erwannc @@ -28,6 +28,7 @@ 478 16819 erwannc #include <gtk/gtk.h> 479 16819 erwannc #include <gio/gio.h> 480 16819 erwannc #include <libnautilus-private/nautilus-file-attributes.h> 481 16819 erwannc +#include <libnautilus-private/nautilus-zfs.h> 482 16819 erwannc 483 16819 erwannc /* NautilusDirectory is a class that manages the model for a directory, 484 16819 erwannc real or virtual, for Nautilus, mainly the file-manager component. The directory is 485 17150 erwannc @@ -218,6 +219,24 @@ gboolean nautilus_directory_ar 486 15264 erwannc gboolean nautilus_directory_is_local (NautilusDirectory *directory); 487 15264 erwannc 488 15264 erwannc gboolean nautilus_directory_is_in_trash (NautilusDirectory *directory); 489 16819 erwannc +typedef void (*TsReadyCallback) (NautilusDirectory *directory, 490 16819 erwannc + GCancellable *cancellable, 491 16819 erwannc + gpointer callback_data); 492 16819 erwannc + 493 16819 erwannc +void nautilus_directory_get_snapshots_async (NautilusDirectory *directory, 494 16819 erwannc + TsReadyCallback ready_callback, 495 16819 erwannc + GCancellable *cancel, 496 16819 erwannc + gpointer callback_user_data); 497 15264 erwannc +gboolean nautilus_directory_has_snapshots (NautilusDirectory *directory); 498 15264 erwannc +gboolean nautilus_directory_is_in_snapshot (NautilusDirectory *directory); 499 15264 erwannc +int nautilus_directory_get_num_snapshots (NautilusDirectory *directory); 500 15264 erwannc +GList * nautilus_directory_get_snapshots (NautilusDirectory *directory); 501 17150 erwannc +void nautilus_directory_remove_snapshot (NautilusDirectory *directory, 502 17150 erwannc + ZfsDataSet *snap); 503 15264 erwannc +NautilusDirectory *nautilus_directory_get_snap_root (NautilusDirectory *directory); 504 15264 erwannc +gboolean nautilus_directory_is_a_snapshot_dir_of (NautilusDirectory *snapdir, 505 15264 erwannc + NautilusDirectory *refdir); 506 16819 erwannc +void nautilus_directory_cancel_restore_info (NautilusDirectory *directory); 507 16819 erwannc 508 15264 erwannc /* Return false if directory contains anything besides a Nautilus metafile. 509 15264 erwannc * Only valid if directory is monitored. Used by the Trash monitor. 510 17150 erwannc @@ -238,6 +257,7 @@ GList * nautilus_directory_li 511 16819 erwannc gboolean nautilus_directory_is_desktop_directory (NautilusDirectory *directory); 512 16819 erwannc 513 16819 erwannc gboolean nautilus_directory_is_editable (NautilusDirectory *directory); 514 16819 erwannc +gboolean is_time_slider_enabled (); 515 16819 erwannc 516 16819 erwannc 517 16819 erwannc #endif /* NAUTILUS_DIRECTORY_H */ 518 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-file-attributes.h 2009-01-23 22:36:12.450443252 +0100 521 16819 erwannc @@ -42,6 +42,7 @@ typedef enum { 522 16819 erwannc NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL = 1 << 9, 523 16819 erwannc NAUTILUS_FILE_ATTRIBUTE_MOUNT = 1 << 10, 524 16819 erwannc NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO = 1 << 11, 525 16819 erwannc + NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO = 1 << 12, 526 16819 erwannc } NautilusFileAttributes; 527 16819 erwannc 528 16819 erwannc #endif /* NAUTILUS_FILE_ATTRIBUTES_H */ 529 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-file-private.h 2009-01-23 22:36:11.662583045 +0100 532 17265 erwannc @@ -146,6 +146,15 @@ struct NautilusFileDetails 533 16819 erwannc 534 16819 erwannc /* Mount for mountpoint or the references GMount for a "mountable" */ 535 16819 erwannc GMount *mount; 536 16819 erwannc + 537 16819 erwannc + /* time slider file difference information */ 538 16819 erwannc + 539 16819 erwannc + char *restore_info; 540 17265 erwannc + 541 17265 erwannc + /* snapshot directory for versions */ 542 17265 erwannc + 543 17265 erwannc + char *snapshot_directory; 544 17265 erwannc + GCancellable *has_snapshot_cancel; 545 16819 erwannc 546 16819 erwannc /* boolean fields: bitfield to save space, since there can be 547 16819 erwannc many NautilusFile objects. */ 548 17265 erwannc @@ -194,6 +203,13 @@ struct NautilusFileDetails 549 16819 erwannc 550 16819 erwannc eel_boolean_bit is_thumbnailing : 1; 551 16819 erwannc 552 16819 erwannc + eel_boolean_bit restore_info_is_up_to_date : 1; 553 16819 erwannc + eel_boolean_bit restore_info_in_progress : 1; 554 16819 erwannc + 555 17265 erwannc + eel_boolean_bit has_snap_versions_is_up_to_date : 1; 556 17265 erwannc + eel_boolean_bit has_snap_versions_in_progress : 1; 557 17265 erwannc + eel_boolean_bit has_snap_versions : 1; 558 17265 erwannc + 559 16819 erwannc /* TRUE if the file is open in a spatial window */ 560 16819 erwannc eel_boolean_bit has_open_window : 1; 561 16819 erwannc 562 17265 erwannc 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 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file.c 2009-01-23 22:38:49.604932056 +0100 564 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-file.c 2009-01-23 22:36:11.724833444 +0100 565 15715 erwannc @@ -48,6 +48,7 @@ 566 15715 erwannc #include "nautilus-vfs-file.h" 567 15715 erwannc #include "nautilus-saved-search-file.h" 568 15715 erwannc #include "nautilus-lockdown.h" 569 15715 erwannc +#include "nautilus-zfs.h" 570 15715 erwannc #include <eel/eel-debug.h> 571 15715 erwannc #include <eel/eel-glib-extensions.h> 572 15715 erwannc #include <eel/eel-gtk-extensions.h> 573 15715 erwannc @@ -146,7 +147,8 @@ static GQuark attribute_name_q, 574 15715 erwannc attribute_where_q, 575 15715 erwannc attribute_link_target_q, 576 15715 erwannc attribute_volume_q, 577 15715 erwannc - attribute_free_space_q; 578 15715 erwannc + attribute_free_space_q, 579 15715 erwannc + attribute_restore_info_q; 580 15715 erwannc 581 15715 erwannc 582 15715 erwannc static void nautilus_file_instance_init (NautilusFile *file); 583 16819 erwannc @@ -159,6 +161,7 @@ static gboolean update_info_and_name 584 16819 erwannc GFileInfo *info); 585 16819 erwannc static const char * nautilus_file_peek_display_name (NautilusFile *file); 586 16819 erwannc static const char * nautilus_file_peek_display_name_collation_key (NautilusFile *file); 587 16819 erwannc +static void invalidate_restore_info (NautilusFile *file); 588 16819 erwannc 589 16819 erwannc GType 590 16819 erwannc nautilus_file_get_type (void) 591 17265 erwannc @@ -364,6 +367,14 @@ nautilus_file_clear_info (NautilusFile * 592 16819 erwannc 593 16819 erwannc eel_ref_str_unref (file->details->filesystem_id); 594 16819 erwannc file->details->filesystem_id = NULL; 595 16819 erwannc + g_free (file->details->restore_info); 596 16819 erwannc + file->details->restore_info = NULL; 597 16819 erwannc + invalidate_restore_info (file); 598 17265 erwannc + g_free (file->details->snapshot_directory); 599 17265 erwannc + file->details->snapshot_directory = NULL; 600 17265 erwannc + file->details->has_snap_versions_in_progress = FALSE; 601 17265 erwannc + file->details->has_snap_versions_is_up_to_date = FALSE; 602 17265 erwannc + file->details->has_snap_versions = FALSE; 603 16819 erwannc } 604 16819 erwannc 605 16819 erwannc static NautilusFile * 606 17265 erwannc @@ -674,6 +685,9 @@ finalize (GObject *object) 607 16819 erwannc g_free (file->details->selinux_context); 608 16819 erwannc g_free (file->details->top_left_text); 609 16819 erwannc g_free (file->details->custom_icon); 610 16819 erwannc + g_free (file->details->restore_info); 611 17265 erwannc + if (file->details->snapshot_directory) 612 17265 erwannc + g_free (file->details->snapshot_directory); 613 16819 erwannc if (file->details->activation_location) { 614 16819 erwannc g_object_unref (file->details->activation_location); 615 16819 erwannc } 616 17265 erwannc @@ -5442,7 +5456,9 @@ nautilus_file_get_string_attribute_q (Na 617 15715 erwannc if (attribute_q == attribute_free_space_q) { 618 15715 erwannc return nautilus_file_get_volume_free_space (file); 619 15715 erwannc } 620 15715 erwannc - 621 15715 erwannc + if (attribute_q == attribute_restore_info_q) { 622 16819 erwannc + return nautilus_file_get_restore_info_async (file); 623 15715 erwannc + } 624 15715 erwannc extension_attribute = NULL; 625 15715 erwannc 626 15715 erwannc if (file->details->pending_extension_attributes) { 627 17265 erwannc @@ -6332,6 +6348,616 @@ nautilus_file_get_trash_original_file (N 628 15715 erwannc 629 15715 erwannc } 630 15715 erwannc 631 15715 erwannc +gboolean 632 15715 erwannc +nautilus_file_is_in_snapshot (NautilusFile *file) 633 15715 erwannc +{ 634 15715 erwannc + char *file_uri = nautilus_file_get_uri (file); 635 15715 erwannc + gboolean result = ts_is_in_snapshot (file_uri); 636 15715 erwannc + g_free (file_uri); 637 15715 erwannc + return result; 638 15715 erwannc +} 639 15715 erwannc + 640 16819 erwannc +static gboolean nautilus_file_in_snap_exist_in_current (NautilusFile *file, GCancellable *cancel) 641 15715 erwannc +{ 642 15715 erwannc + /* get path without /.zfs/snapshot/blah/ */ 643 15715 erwannc + /* test is file exist */ 644 15715 erwannc + char *file_uri = nautilus_file_get_uri (file); 645 15715 erwannc + char *file_uri_without_snap = NULL; 646 15715 erwannc + gboolean result = FALSE; 647 15715 erwannc + 648 16819 erwannc + if (g_cancellable_is_cancelled (cancel)) 649 16819 erwannc + { 650 16819 erwannc + g_free (file_uri); 651 16819 erwannc + return FALSE; 652 16819 erwannc + } 653 16819 erwannc + 654 15715 erwannc + file_uri_without_snap = ts_remove_snapshot_dir (file_uri); 655 15715 erwannc + 656 15715 erwannc + if (file_uri_without_snap) 657 15715 erwannc + { 658 15715 erwannc + GFile* root_file = g_file_new_for_uri (file_uri_without_snap); 659 15715 erwannc + char *path = g_file_get_path (root_file); 660 16819 erwannc + 661 15715 erwannc + if (path) 662 15715 erwannc + { 663 15715 erwannc + result = g_file_test (path, G_FILE_TEST_EXISTS); 664 15715 erwannc + g_free (path); 665 15715 erwannc + } 666 15715 erwannc + g_object_unref (root_file); 667 15715 erwannc + g_free (file_uri_without_snap); 668 15715 erwannc + 669 15715 erwannc + } 670 15715 erwannc + 671 15715 erwannc + g_free (file_uri); 672 15715 erwannc + 673 15715 erwannc + return result; 674 15715 erwannc +} 675 15715 erwannc + 676 15715 erwannc + 677 16819 erwannc +char * nautilus_file_in_snapshot_get_info (NautilusFile *file, GCancellable *cancel) 678 15715 erwannc +{ 679 15715 erwannc + char *info = NULL; 680 15715 erwannc + GFile *then_gfile = nautilus_file_get_location (file); 681 15715 erwannc + char *then_path = g_file_get_path (then_gfile); 682 15715 erwannc + g_object_unref (then_gfile); 683 15715 erwannc + 684 16819 erwannc + if (g_cancellable_is_cancelled (cancel)) 685 16819 erwannc + { 686 16819 erwannc + g_free (then_gfile); 687 16819 erwannc + g_free (then_path); 688 16819 erwannc + return g_strdup ("cancelled"); 689 16819 erwannc + } 690 15715 erwannc + if (then_path) 691 15715 erwannc + { 692 15715 erwannc + struct stat64 now; 693 15715 erwannc + struct stat64 then; 694 15715 erwannc + char *now_path = ts_remove_snapshot_dir (then_path); 695 15715 erwannc + 696 15715 erwannc + if (lstat64 (now_path, &now) == 0) 697 15715 erwannc + { 698 15715 erwannc + if (lstat64 (then_path, &then) == 0) 699 15715 erwannc + { 700 15715 erwannc + 701 15715 erwannc + if (now.st_mtime != then.st_mtime) 702 15715 erwannc + { 703 15715 erwannc + if (now.st_size == then.st_size) 704 15715 erwannc + /* SUN_BRANDING */ 705 15715 erwannc + info = g_strdup (_("different date, same size as latest version")); 706 15715 erwannc + else if (now.st_size > then.st_size) 707 15715 erwannc + /* SUN_BRANDING */ 708 15715 erwannc + info = g_strdup (_("different date, smaller than latest version")); 709 15715 erwannc + else if ( now.st_size < then.st_size) 710 15715 erwannc + /* SUN_BRANDING */ 711 15715 erwannc + info = g_strdup (_("different date, bigger than latest version")); 712 15715 erwannc + } 713 15715 erwannc + else 714 15715 erwannc + /* SUN_BRANDING */ 715 15715 erwannc + info = g_strdup (_("identical to latest version")); 716 15715 erwannc + } 717 16819 erwannc + else 718 16819 erwannc + info = g_strdup_printf ("FIXME no then %s", then_path); 719 15715 erwannc + } 720 15715 erwannc + else 721 15715 erwannc + /* SUN_BRANDING */ 722 15715 erwannc + info = g_strdup (_("not present in latest version")); 723 15715 erwannc + 724 15715 erwannc + g_free (now_path); 725 15715 erwannc + g_free (then_path); 726 15715 erwannc + } 727 15715 erwannc + 728 15715 erwannc + return info; 729 15715 erwannc +} 730 15715 erwannc + 731 16819 erwannc +static char * restore_string (char *str, GCancellable *cancel) 732 15715 erwannc +{ 733 16819 erwannc + if (g_cancellable_is_cancelled (cancel)) 734 15715 erwannc + { 735 16819 erwannc + g_free (str); 736 16819 erwannc + return g_strdup (_("unknown")); 737 15715 erwannc + } 738 15715 erwannc + else 739 16819 erwannc + return str; 740 15715 erwannc +} 741 15715 erwannc + 742 16819 erwannc +gint time_cmp (time_t *a, 743 16819 erwannc + time_t *b) 744 16819 erwannc +{ 745 16819 erwannc + if (*a == *b) 746 16819 erwannc + return 0; 747 16819 erwannc + if (*a > *b) 748 16819 erwannc + return 1; 749 16819 erwannc + if (*a < *b) 750 16819 erwannc + return -1; 751 16819 erwannc + 752 16819 erwannc +} 753 16819 erwannc + 754 15715 erwannc +char * 755 17265 erwannc +nautilus_file_get_num_snapshot_version (NautilusFile *file, 756 17265 erwannc + GCancellable *cancel, 757 17265 erwannc + gboolean stop_at_first) 758 15715 erwannc +{ 759 16819 erwannc + GList *tmp = NULL; 760 16819 erwannc + GList *tmp2 = NULL; 761 16819 erwannc + GList *time = NULL; 762 16819 erwannc + time_t* now_time = NULL; 763 15715 erwannc + char *result = NULL; 764 15715 erwannc + int version = 0; 765 16819 erwannc + NautilusFile *parent = NULL; 766 16819 erwannc + NautilusDirectory *dir = NULL; 767 17265 erwannc + char *snapdir = NULL; 768 17265 erwannc + 769 16819 erwannc + if (NAUTILUS_IS_FILE (file)) 770 16819 erwannc + { 771 16819 erwannc + parent = nautilus_file_get_parent (file); 772 16819 erwannc + if (parent) 773 16819 erwannc + { 774 16819 erwannc + dir = nautilus_directory_get_for_file (parent); 775 16819 erwannc + g_object_unref (parent); 776 16819 erwannc + } 777 16819 erwannc + } 778 15715 erwannc + if (dir) 779 15715 erwannc + { 780 15715 erwannc + struct stat64 now; 781 15715 erwannc + struct stat64 then; 782 15715 erwannc + char snap_name[PATH_MAX+1]; 783 15715 erwannc + char *name = nautilus_file_get_name (file); 784 16819 erwannc + 785 16819 erwannc + g_object_ref (dir); 786 15715 erwannc + tmp = nautilus_directory_get_snapshots (dir); 787 15715 erwannc + 788 15715 erwannc + GFile *now_gfile = nautilus_file_get_location (file); 789 15715 erwannc + char *now_path = g_file_get_path (now_gfile); 790 15715 erwannc + g_object_unref (now_gfile); 791 15715 erwannc + 792 15715 erwannc + if (now_path) 793 15715 erwannc + { 794 15715 erwannc + if (lstat64 (now_path, &now) != 0) 795 15715 erwannc + { 796 15715 erwannc + g_free (now_path); 797 15715 erwannc + g_object_unref (dir); 798 15715 erwannc + return NULL; 799 15715 erwannc + } 800 15715 erwannc + } 801 16819 erwannc + 802 15715 erwannc + g_free (now_path); 803 15721 erwannc + 804 15721 erwannc + time = NULL; 805 15721 erwannc + 806 16819 erwannc + /* get list of mtime for all files in snapshots */ 807 16819 erwannc + 808 16819 erwannc + now_time = g_new0 (time_t, 1); 809 16819 erwannc + *now_time = now.st_mtim.tv_sec; 810 16819 erwannc + time = g_list_prepend (time, now_time); 811 16819 erwannc + 812 16819 erwannc + 813 15715 erwannc + for (tmp; tmp; tmp = tmp->next) 814 15715 erwannc + { 815 15715 erwannc + g_sprintf (snap_name, "%s/%s", 816 16819 erwannc + ((ZfsDataSet *) tmp->data)->mountpoint, 817 15715 erwannc + name); 818 16819 erwannc + if (g_cancellable_is_cancelled (cancel)) 819 16819 erwannc + goto cancel; 820 15715 erwannc + if (lstat64 (snap_name, &then) == 0) 821 15715 erwannc + { 822 16819 erwannc + if (g_list_find_custom (time, &then.st_mtim.tv_sec, (GCompareFunc) time_cmp) == NULL) 823 16819 erwannc + { /*insert in list only is unique */ 824 15721 erwannc + time_t* snap_time = g_new0 (time_t, 1); 825 15721 erwannc + *snap_time = then.st_mtim.tv_sec; 826 16819 erwannc + time = g_list_prepend (time, snap_time); 827 17265 erwannc + if (stop_at_first) 828 17265 erwannc + { 829 17265 erwannc + snapdir = g_strdup (((ZfsDataSet *) tmp->data)->mountpoint); 830 17265 erwannc + goto cancel; 831 17265 erwannc + } 832 15721 erwannc + } 833 15715 erwannc + } 834 15715 erwannc + 835 15715 erwannc + } 836 16819 erwannc +cancel: 837 15715 erwannc + g_free (name); 838 16819 erwannc + g_object_unref (dir); 839 15715 erwannc + } 840 15715 erwannc + 841 15721 erwannc + 842 15721 erwannc + for (tmp = time; tmp; tmp = tmp->next) 843 15721 erwannc + { 844 15721 erwannc + g_free ((time_t*) tmp->data); 845 15721 erwannc + version++; 846 15721 erwannc + } 847 15721 erwannc + 848 16819 erwannc + /* remove current version */ 849 16819 erwannc + version--; 850 16819 erwannc + 851 15721 erwannc + g_list_free (time); 852 15721 erwannc + 853 15715 erwannc + if (version == 0) 854 17265 erwannc + { 855 17265 erwannc + if (stop_at_first) 856 17265 erwannc + return NULL; 857 17265 erwannc + else /*SUN_BRANDING*/ 858 17265 erwannc + return restore_string (g_strdup_printf (_("no other version")), cancel); 859 17265 erwannc + } 860 17265 erwannc + 861 17265 erwannc + if (stop_at_first) 862 17265 erwannc + return snapdir; 863 17265 erwannc + else 864 15715 erwannc + /* SUN_BRANDING */ 865 17265 erwannc + return restore_string (g_strdup_printf ("%d %s", version, 866 17265 erwannc + version > 1 ? _ ("other versions") : _ ("other version")), 867 17265 erwannc + cancel); 868 15715 erwannc +} 869 15715 erwannc + 870 16819 erwannc +static gboolean worker_thread_started = FALSE; 871 16819 erwannc + 872 16819 erwannc +typedef void (*ReadyCallback) (gpointer data, 873 16819 erwannc + GCancellable *cancellable); 874 16819 erwannc +typedef void (*WorkerFunction) (gpointer data, 875 16819 erwannc + GCancellable *cancellable); 876 16819 erwannc +typedef struct { 877 16819 erwannc + gpointer data; 878 16819 erwannc + gpointer return_data; 879 16819 erwannc + ReadyCallback ready_callback; 880 16819 erwannc + WorkerFunction worker_func; 881 16819 erwannc + GCancellable *cancellable; 882 16819 erwannc +} QueryData; 883 16819 erwannc + 884 16819 erwannc +static void 885 16819 erwannc +nautilus_file_get_restore_info (gpointer data, 886 16819 erwannc + GCancellable *cancellable) 887 16819 erwannc +{ 888 16819 erwannc + QueryData *qdata = (QueryData*) data; 889 16819 erwannc + NautilusFile *file = NAUTILUS_FILE (qdata->data); 890 16819 erwannc + char *result = NULL; 891 16819 erwannc + 892 16819 erwannc + /*{ 893 16819 erwannc + struct timespec ts; 894 17265 erwannc + ts.tv_sec = 1; 895 17265 erwannc + ts.tv_nsec = 0; 896 16819 erwannc + nanosleep (&ts, NULL); 897 17265 erwannc + } 898 16819 erwannc + 899 17265 erwannc + { 900 17265 erwannc + GFile *f = nautilus_file_get_location (file); 901 17265 erwannc + char *path = g_file_get_uri (f); 902 17265 erwannc + printf ("start restore info for %s", path); 903 17265 erwannc + g_free (path); 904 17265 erwannc + g_object_unref (f); 905 17265 erwannc + }*/ 906 16819 erwannc + if (!g_cancellable_is_cancelled (cancellable)) 907 16819 erwannc + { 908 16819 erwannc + 909 16819 erwannc + if (nautilus_file_is_directory (file)) 910 16819 erwannc + { 911 16819 erwannc + NautilusDirectory *dir = nautilus_directory_get_for_file (file); 912 16819 erwannc + g_object_ref (dir); 913 16819 erwannc + if (nautilus_directory_is_in_snapshot (dir)) 914 16819 erwannc + { 915 16819 erwannc + if (!nautilus_file_in_snap_exist_in_current (file, cancellable)) 916 16819 erwannc + /* SUN_BRANDING */ 917 16819 erwannc + result = g_strdup (_("not present in latest version")); 918 16819 erwannc + else 919 16819 erwannc + /* SUN_BRANDING */ 920 16819 erwannc + result = g_strdup (_("present in latest version")); 921 16819 erwannc + } 922 16819 erwannc + else 923 16819 erwannc + { 924 16819 erwannc + int version = nautilus_directory_get_num_snapshots (dir); 925 16819 erwannc + 926 16819 erwannc + if (version == 0) 927 16819 erwannc + /* SUN_BRANDING */ 928 16819 erwannc + result = g_strdup (_("no version")); 929 16819 erwannc + else 930 16819 erwannc + /* SUN_BRANDING */ 931 16819 erwannc + result = g_strdup_printf ("%d %s",version, 932 16819 erwannc + version > 1 ? _("versions") : _("version")); 933 16819 erwannc + } 934 16819 erwannc + g_object_unref (dir); 935 16819 erwannc + } 936 16819 erwannc + else 937 16819 erwannc + { 938 16819 erwannc + if (nautilus_file_is_in_snapshot (file)) 939 16819 erwannc + result = nautilus_file_in_snapshot_get_info (file, cancellable); 940 16819 erwannc + else 941 17265 erwannc + result = nautilus_file_get_num_snapshot_version (file, cancellable, FALSE); 942 16819 erwannc + } 943 16819 erwannc + } 944 16819 erwannc + 945 17150 erwannc +/* { 946 17265 erwannc + printf ("is %s\n", result); 947 17265 erwannc + }*/ 948 17150 erwannc + 949 17265 erwannc + 950 16819 erwannc + qdata->return_data = restore_string (result, cancellable); 951 16819 erwannc +} 952 16819 erwannc + 953 16819 erwannc + 954 16819 erwannc +static void restore_information_ready_callback (gpointer data, 955 16819 erwannc + GCancellable *cancellable) 956 16819 erwannc +{ 957 16819 erwannc + QueryData *qdata = (QueryData*) data; 958 16819 erwannc + NautilusFile *file = (NautilusFile*) qdata->data; 959 16819 erwannc + char *return_data = qdata->return_data; 960 16819 erwannc + 961 16819 erwannc + if (!NAUTILUS_IS_FILE (file)) 962 16819 erwannc + return; 963 16819 erwannc + 964 16819 erwannc + file->details->restore_info_in_progress = FALSE; 965 16819 erwannc + 966 16819 erwannc + if (g_cancellable_is_cancelled (cancellable)) 967 16819 erwannc + { 968 16819 erwannc + file->details->restore_info = g_strdup (_("unknown")); 969 16819 erwannc + invalidate_restore_info (file); 970 16819 erwannc + if (return_data) 971 16819 erwannc + g_free (return_data); 972 16819 erwannc + } 973 16819 erwannc + else 974 16819 erwannc + { 975 16819 erwannc + file->details->restore_info_is_up_to_date = TRUE; 976 16819 erwannc + file->details->restore_info = return_data; 977 16819 erwannc + } 978 16819 erwannc + 979 16819 erwannc + nautilus_file_changed (file); 980 16819 erwannc + nautilus_file_unref (file); 981 16819 erwannc +} 982 16819 erwannc + 983 16819 erwannc + 984 16819 erwannc +static gboolean 985 16819 erwannc +complete_in_idle_cb (gpointer data) 986 16819 erwannc +{ 987 16819 erwannc + QueryData *qdata = (QueryData*)data; 988 16819 erwannc + qdata->ready_callback (data, qdata->cancellable); 989 16819 erwannc + g_free (qdata); 990 16819 erwannc + return FALSE; 991 16819 erwannc +} 992 16819 erwannc + 993 16819 erwannc +static void 994 16819 erwannc +worker_queue_finished_callback (GObject *source_object, 995 16819 erwannc + GAsyncResult *res, 996 16819 erwannc + gpointer user_data) 997 16819 erwannc +{ 998 16819 erwannc + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 999 16819 erwannc + GCancellable *cancel = (GCancellable*) user_data; 1000 16819 erwannc + 1001 16819 erwannc + worker_thread_started = FALSE; 1002 16819 erwannc + 1003 16819 erwannc + if (g_cancellable_is_cancelled (cancel)) 1004 16819 erwannc + { 1005 16819 erwannc + return; 1006 16819 erwannc + } 1007 16819 erwannc + 1008 16819 erwannc + g_simple_async_result_get_op_res_gpointer (simple); 1009 16819 erwannc + 1010 16819 erwannc +} 1011 16819 erwannc + 1012 16819 erwannc +static void 1013 16819 erwannc +worker_queue_func (GSimpleAsyncResult *res, 1014 16819 erwannc + GObject *object, 1015 16819 erwannc + GCancellable *cancellable) 1016 16819 erwannc +{ 1017 16819 erwannc + QueryData *data = NULL; 1018 16819 erwannc + 1019 16819 erwannc + GTimeVal timeout; 1020 16819 erwannc + GAsyncQueue *queue = (GAsyncQueue*) g_simple_async_result_get_op_res_gpointer (res); 1021 16819 erwannc + g_async_queue_ref (queue); 1022 16819 erwannc + 1023 16819 erwannc + g_get_current_time (&timeout); 1024 16819 erwannc + g_time_val_add (&timeout, 3000000); 1025 16819 erwannc + 1026 16819 erwannc + data = g_async_queue_timed_pop (queue, &timeout); 1027 16819 erwannc + 1028 16819 erwannc + while (data) 1029 16819 erwannc + { 1030 16819 erwannc + GSource *source; 1031 16819 erwannc + 1032 16819 erwannc + /* only call the worker fct if not cancel 1033 16819 erwannc + * but execute ready function anyway */ 1034 16819 erwannc + if (!g_cancellable_is_cancelled (data->cancellable)) 1035 16819 erwannc + data->worker_func (data, data->cancellable); 1036 16819 erwannc + 1037 16819 erwannc + /*call ready callback in main loop/thread */ 1038 16819 erwannc + source = g_idle_source_new (); 1039 16819 erwannc + g_source_set_priority (source, G_PRIORITY_DEFAULT); 1040 16819 erwannc + g_source_set_callback (source, complete_in_idle_cb, data, NULL); 1041 16819 erwannc + g_source_attach (source, NULL); 1042 16819 erwannc + g_source_unref (source); 1043 16819 erwannc + 1044 16819 erwannc + /* pop next one */ 1045 16819 erwannc + g_get_current_time (&timeout); 1046 16819 erwannc + g_time_val_add (&timeout, 3000000); 1047 16819 erwannc + data = g_async_queue_timed_pop (queue, &timeout); 1048 16819 erwannc + } 1049 16819 erwannc + 1050 16819 erwannc + g_async_queue_unref (queue); 1051 16819 erwannc +} 1052 16819 erwannc + 1053 16819 erwannc +char * nautilus_file_get_restore_info_async (NautilusFile *file) 1054 16819 erwannc +{ 1055 16819 erwannc + if (!is_time_slider_enabled ()) 1056 16819 erwannc + return NULL; 1057 16819 erwannc + 1058 16819 erwannc + if (!ts_is_restore_column_enabled ()) 1059 16819 erwannc + return NULL; 1060 16819 erwannc + 1061 16819 erwannc + if (file->details->restore_info_is_up_to_date) 1062 16819 erwannc + { 1063 16819 erwannc + /*if ( file->details->restore_info == NULL) 1064 16819 erwannc + return g_strdup ("null cached info");*/ 1065 16819 erwannc + return g_strdup (file->details->restore_info); 1066 16819 erwannc + } 1067 16819 erwannc + 1068 16819 erwannc + if (file->details->restore_info_in_progress) 1069 16819 erwannc + return g_strdup ("..."); 1070 16819 erwannc + else 1071 16819 erwannc + { 1072 16819 erwannc + static GAsyncQueue *queue = NULL; 1073 16819 erwannc + QueryData *data = NULL; 1074 16819 erwannc + 1075 16819 erwannc + if (!file->details->directory) 1076 16819 erwannc + return g_strdup ("no directory element\n"); 1077 16819 erwannc + 1078 16819 erwannc + if (!nautilus_directory_has_snapshots (file->details->directory) && !nautilus_file_is_in_snapshot (file)) 1079 16819 erwannc + return g_strdup ("doesn't have snap nor is in snap\n"); 1080 16819 erwannc + 1081 16819 erwannc + if (!file->details->directory->details->restore_cancel) 1082 16819 erwannc + { 1083 16819 erwannc + file->details->directory->details->restore_cancel = g_cancellable_new (); 1084 16819 erwannc + } 1085 16819 erwannc + else 1086 16819 erwannc + { 1087 16819 erwannc + if (g_cancellable_is_cancelled (file->details->directory->details->restore_cancel)) 1088 16819 erwannc + return NULL; 1089 16819 erwannc + } 1090 16819 erwannc + 1091 16819 erwannc + g_free (file->details->restore_info); 1092 16819 erwannc + file->details->restore_info = NULL; 1093 16819 erwannc + file->details->restore_info_in_progress = TRUE; 1094 16819 erwannc + 1095 16819 erwannc + if (!queue) 1096 16819 erwannc + queue = g_async_queue_new (); 1097 16819 erwannc + 1098 16819 erwannc + data = g_new0 (QueryData, 1); 1099 16819 erwannc + data->data = file; 1100 16819 erwannc + nautilus_file_ref (file); 1101 16819 erwannc + data->cancellable = file->details->directory->details->restore_cancel; 1102 16819 erwannc + data->ready_callback = restore_information_ready_callback; 1103 16819 erwannc + data->worker_func = nautilus_file_get_restore_info; 1104 16819 erwannc + 1105 16819 erwannc + g_async_queue_push (queue, data); 1106 16819 erwannc + 1107 16819 erwannc + if (!worker_thread_started) 1108 16819 erwannc + { 1109 16819 erwannc + GSimpleAsyncResult *res; 1110 16819 erwannc + worker_thread_started = TRUE; 1111 16819 erwannc + 1112 16819 erwannc + res = g_simple_async_result_new (G_OBJECT (file), 1113 16819 erwannc + worker_queue_finished_callback, 1114 16819 erwannc + NULL, 1115 16819 erwannc + (gpointer) worker_queue_func); 1116 16819 erwannc + 1117 16819 erwannc + g_simple_async_result_set_op_res_gpointer (res, queue, NULL); 1118 16819 erwannc + g_simple_async_result_run_in_thread (res, 1119 16819 erwannc + worker_queue_func, 1120 16819 erwannc + G_PRIORITY_DEFAULT, 1121 16819 erwannc + data->cancellable); 1122 16819 erwannc + } 1123 16819 erwannc + 1124 16819 erwannc + return g_strdup ("..."); 1125 16819 erwannc + } 1126 16819 erwannc +} 1127 16819 erwannc + 1128 17265 erwannc +HasSnapshotResult 1129 17265 erwannc +nautilus_file_has_snapshot_version (NautilusFile *file) 1130 17265 erwannc +{ 1131 17265 erwannc + if (file->details->has_snap_versions_is_up_to_date) 1132 17265 erwannc + return (file->details->has_snap_versions); 1133 17265 erwannc + return UNKNOWN_STATE; 1134 17265 erwannc +} 1135 16819 erwannc + 1136 17265 erwannc +typedef struct { 1137 17265 erwannc + NautilusFile *file; 1138 17265 erwannc + GCancellable *cancel; 1139 17265 erwannc + FileHasSnapshotCallback callback; 1140 17265 erwannc + gpointer callback_user_data; 1141 17265 erwannc + char *snap_dir; 1142 17265 erwannc +} HasSnapshotAsyncData; 1143 16819 erwannc + 1144 17265 erwannc +typedef void (*HasSnapReadyCallback) (NautilusDirectory *file, 1145 17265 erwannc + GCancellable *cancel, 1146 17265 erwannc + gpointer callback_data); 1147 17265 erwannc + 1148 17265 erwannc + 1149 17265 erwannc +static void has_snapshot_ready_callback (GObject *source_object, 1150 17265 erwannc + GAsyncResult *res, 1151 17265 erwannc + gpointer user_data) 1152 15715 erwannc +{ 1153 17265 erwannc + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1154 17265 erwannc + HasSnapshotAsyncData *data = (HasSnapshotAsyncData*) user_data; 1155 17265 erwannc + 1156 17265 erwannc + if (g_cancellable_is_cancelled (data->cancel)) 1157 17265 erwannc + { 1158 17265 erwannc + data->file->details->has_snap_versions_in_progress = FALSE; 1159 17265 erwannc + data->file->details->has_snap_versions_is_up_to_date = FALSE; 1160 17265 erwannc + if (data->file->details->snapshot_directory) 1161 17265 erwannc + g_free (data->file->details->snapshot_directory); 1162 17265 erwannc + 1163 17265 erwannc + data->file->details->has_snapshot_cancel = NULL; 1164 17265 erwannc + } 1165 17265 erwannc + else 1166 17265 erwannc + { 1167 17265 erwannc + data->file->details->has_snap_versions_in_progress = FALSE; 1168 17265 erwannc + data->file->details->has_snap_versions_is_up_to_date = TRUE; 1169 17265 erwannc + if (data->file->details->snapshot_directory) 1170 17265 erwannc + g_free (data->file->details->snapshot_directory); 1171 17265 erwannc + data->file->details->snapshot_directory = g_simple_async_result_get_op_res_gpointer (simple); 1172 17265 erwannc + if (data->file->details->snapshot_directory) 1173 17265 erwannc + data->file->details->has_snap_versions = TRUE; 1174 17265 erwannc + else 1175 17265 erwannc + data->file->details->has_snap_versions = FALSE; 1176 17265 erwannc + } 1177 17265 erwannc + data->callback (data->callback_user_data); 1178 15715 erwannc +} 1179 17265 erwannc +char * 1180 17265 erwannc +nautilus_file_get_snapshot_dir (NautilusFile *file) 1181 17265 erwannc +{ 1182 17265 erwannc + return file->details->snapshot_directory; 1183 17265 erwannc +} 1184 17265 erwannc +void nautilus_file_real_get_snapshot_version (GSimpleAsyncResult *res, 1185 17265 erwannc + GObject *object, 1186 17265 erwannc + GCancellable *cancellable) 1187 17265 erwannc +{ 1188 17265 erwannc + NautilusFile *file = NAUTILUS_FILE (object); 1189 17265 erwannc + char *snap_info = nautilus_file_get_num_snapshot_version (file, cancellable, TRUE); 1190 15715 erwannc + 1191 17265 erwannc + if (!snap_info) /* scan for .zfs directory*/ 1192 17265 erwannc + snap_info = ts_get_not_zfs_snapshot_dir (nautilus_file_get_location (file)); 1193 17265 erwannc +/* 1194 17265 erwannc + { 1195 17265 erwannc + struct timespec ts; 1196 17265 erwannc + ts.tv_sec = 4; 1197 17265 erwannc + ts.tv_nsec = 0; 1198 17265 erwannc + nanosleep (&ts, NULL); 1199 17265 erwannc + } 1200 17265 erwannc +*/ 1201 17265 erwannc + if (snap_info) 1202 17265 erwannc + g_simple_async_result_set_op_res_gpointer (res, snap_info, (GDestroyNotify) NULL); 1203 17265 erwannc + else 1204 17265 erwannc + g_simple_async_result_set_op_res_gpointer (res, NULL, (GDestroyNotify) NULL); 1205 17265 erwannc +} 1206 15715 erwannc + 1207 17265 erwannc +void nautilus_file_get_snapshot_version (NautilusFile *file, 1208 17265 erwannc + FileHasSnapshotCallback callback, 1209 17265 erwannc + GCancellable *cancel, 1210 17265 erwannc + gpointer user_data) 1211 17265 erwannc +{ 1212 17265 erwannc + HasSnapshotAsyncData *data; 1213 17265 erwannc + GSimpleAsyncResult *res; 1214 17265 erwannc + 1215 17265 erwannc + if (file->details->has_snap_versions_in_progress) 1216 17265 erwannc + { 1217 17265 erwannc + g_cancellable_cancel(file->details->has_snapshot_cancel); 1218 17265 erwannc + file->details->has_snapshot_cancel = NULL; 1219 17265 erwannc + file->details->has_snap_versions_in_progress = FALSE; 1220 17265 erwannc + } 1221 17265 erwannc + 1222 17265 erwannc + file->details->has_snapshot_cancel = cancel; 1223 17265 erwannc + file->details->has_snap_versions_in_progress = TRUE; 1224 17265 erwannc + file->details->has_snap_versions_is_up_to_date = FALSE; 1225 17265 erwannc + 1226 17265 erwannc + data = g_new0 (HasSnapshotAsyncData, 1); 1227 17265 erwannc + data->file = file; 1228 17265 erwannc + data->cancel = cancel; 1229 17265 erwannc + data->callback = callback; 1230 17265 erwannc + data->callback_user_data = user_data; 1231 17265 erwannc + 1232 17265 erwannc + res = g_simple_async_result_new (G_OBJECT (file), 1233 17265 erwannc + has_snapshot_ready_callback, 1234 17265 erwannc + data, 1235 17265 erwannc + (gpointer) nautilus_file_real_get_snapshot_version); 1236 17265 erwannc + g_simple_async_result_run_in_thread (res, nautilus_file_real_get_snapshot_version, 1237 17265 erwannc + G_PRIORITY_DEFAULT, cancel); 1238 17265 erwannc +} 1239 17265 erwannc + 1240 17265 erwannc + 1241 15715 erwannc void 1242 15715 erwannc nautilus_file_mark_gone (NautilusFile *file) 1243 15715 erwannc { 1244 17265 erwannc @@ -6593,6 +7219,12 @@ invalidate_thumbnail (NautilusFile *file 1245 16819 erwannc file->details->thumbnail_is_up_to_date = FALSE; 1246 16819 erwannc } 1247 16819 erwannc 1248 16819 erwannc +static void 1249 16819 erwannc +invalidate_restore_info (NautilusFile *file) 1250 16819 erwannc +{ 1251 16819 erwannc + file->details->restore_info_is_up_to_date = FALSE; 1252 16819 erwannc +} 1253 16819 erwannc + 1254 16819 erwannc void 1255 16819 erwannc nautilus_file_invalidate_extension_info_internal (NautilusFile *file) 1256 16819 erwannc { 1257 17265 erwannc @@ -6647,6 +7279,9 @@ nautilus_file_invalidate_attributes_inte 1258 16819 erwannc if (request.thumbnail) { 1259 16819 erwannc invalidate_thumbnail (file); 1260 16819 erwannc } 1261 16819 erwannc + if (request.restore_info) { 1262 16819 erwannc + invalidate_restore_info (file); 1263 16819 erwannc + } 1264 16819 erwannc 1265 16819 erwannc /* FIXME bugzilla.gnome.org 45075: implement invalidating metadata */ 1266 16819 erwannc } 1267 17265 erwannc @@ -6727,7 +7362,8 @@ nautilus_file_get_all_attributes (void) 1268 16819 erwannc NAUTILUS_FILE_ATTRIBUTE_LARGE_TOP_LEFT_TEXT | 1269 16819 erwannc NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO | 1270 16819 erwannc NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL | 1271 16819 erwannc - NAUTILUS_FILE_ATTRIBUTE_MOUNT; 1272 16819 erwannc + NAUTILUS_FILE_ATTRIBUTE_MOUNT | 1273 16819 erwannc + NAUTILUS_FILE_ATTRIBUTE_RESTORE_INFO ; 1274 16819 erwannc } 1275 16819 erwannc 1276 16819 erwannc void 1277 17265 erwannc @@ -7201,6 +7837,7 @@ nautilus_file_class_init (NautilusFileCl 1278 15715 erwannc attribute_link_target_q = g_quark_from_static_string ("link_target"); 1279 15715 erwannc attribute_volume_q = g_quark_from_static_string ("volume"); 1280 15715 erwannc attribute_free_space_q = g_quark_from_static_string ("free_space"); 1281 15715 erwannc + attribute_restore_info_q = g_quark_from_static_string ("restore_info"); 1282 15715 erwannc 1283 15715 erwannc G_OBJECT_CLASS (class)->finalize = finalize; 1284 15715 erwannc G_OBJECT_CLASS (class)->constructor = nautilus_file_constructor; 1285 17265 erwannc 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 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-file.h 2008-10-06 19:22:21.000000000 +0200 1287 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-file.h 2009-01-23 22:36:11.644493045 +0100 1288 15715 erwannc @@ -174,6 +174,7 @@ gboolean nautilus_file_is 1289 15715 erwannc const char *mime_type); 1290 15715 erwannc gboolean nautilus_file_is_launchable (NautilusFile *file); 1291 15715 erwannc gboolean nautilus_file_is_symbolic_link (NautilusFile *file); 1292 15715 erwannc +gboolean nautilus_file_is_in_snapshot (NautilusFile *file); 1293 15715 erwannc gboolean nautilus_file_is_mountpoint (NautilusFile *file); 1294 15715 erwannc GMount * nautilus_file_get_mount (NautilusFile *file); 1295 15715 erwannc char * nautilus_file_get_volume_free_space (NautilusFile *file); 1296 17265 erwannc @@ -229,6 +230,26 @@ char * nautilus_file_ge 1297 15715 erwannc 1298 15715 erwannc NautilusFile * nautilus_file_get_trash_original_file (NautilusFile *file); 1299 15715 erwannc 1300 16819 erwannc +char * nautilus_file_get_num_snapshot_version (NautilusFile *file, 1301 17265 erwannc + GCancellable *cancel, 1302 17265 erwannc + gboolean stop_at_first); 1303 16819 erwannc +char * nautilus_file_get_restore_info_async (NautilusFile *file); 1304 15715 erwannc + 1305 17265 erwannc +typedef enum { 1306 17265 erwannc + NO, 1307 17265 erwannc + YES, 1308 17265 erwannc + UNKNOWN_STATE 1309 17265 erwannc +} HasSnapshotResult; 1310 17265 erwannc + 1311 17265 erwannc +HasSnapshotResult nautilus_file_has_snapshot_version (NautilusFile *file); 1312 17265 erwannc +char * nautilus_file_get_snapshot_dir (NautilusFile *file); 1313 17265 erwannc +typedef void (*FileHasSnapshotCallback) (gpointer user_data); 1314 17265 erwannc + 1315 17265 erwannc +void nautilus_file_get_snapshot_version (NautilusFile *file, 1316 17265 erwannc + FileHasSnapshotCallback callback, 1317 17265 erwannc + GCancellable *cancel, 1318 17265 erwannc + gpointer user_data); 1319 17265 erwannc + 1320 15715 erwannc /* Permissions. */ 1321 15715 erwannc gboolean nautilus_file_can_get_permissions (NautilusFile *file); 1322 15715 erwannc gboolean nautilus_file_can_set_permissions (NautilusFile *file); 1323 16819 erwannc 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 16819 erwannc --- nautilus-2.24.2/libnautilus-private/nautilus-global-preferences.c 2008-12-02 14:18:12.722038641 +0100 1325 16819 erwannc +++ ../nautilus-full-async/libnautilus-private/nautilus-global-preferences.c 2008-12-02 11:43:13.510836937 +0100 1326 16342 erwannc @@ -235,6 +235,10 @@ typedef struct 1327 16342 erwannc * YOU SHOULD EDIT THE SCHEMAS FILE TO CHANGE DEFAULTS. 1328 16342 erwannc */ 1329 16342 erwannc static const PreferenceDefault preference_defaults[] = { 1330 16342 erwannc + { NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER, 1331 16342 erwannc + PREFERENCE_BOOLEAN, 1332 16342 erwannc + GINT_TO_POINTER (TRUE) 1333 16342 erwannc + }, 1334 16342 erwannc { NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES, 1335 16342 erwannc PREFERENCE_BOOLEAN, 1336 16342 erwannc GINT_TO_POINTER (FALSE) 1337 17150 erwannc 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 17150 erwannc --- nautilus-2.24.2/libnautilus-private/nautilus-global-preferences.h 2009-01-09 22:51:35.144174122 +0100 1339 17150 erwannc +++ ../nautilus-compiled/libnautilus-private/nautilus-global-preferences.h 2009-01-09 22:17:26.115872917 +0100 1340 16342 erwannc @@ -70,6 +70,7 @@ G_BEGIN_DECLS 1341 16342 erwannc #define NAUTILUS_PREFERENCES_SHOW_BACKUP_FILES "/desktop/gnome/file_views/show_backup_files" 1342 16342 erwannc #define NAUTILUS_PREFERENCES_SHOW_ADVANCED_PERMISSIONS "preferences/show_advanced_permissions" 1343 16342 erwannc #define NAUTILUS_PREFERENCES_DATE_FORMAT "preferences/date_format" 1344 16342 erwannc +#define NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER "preferences/enable_time_slider" 1345 16342 erwannc 1346 16342 erwannc typedef enum 1347 16342 erwannc { 1348 17265 erwannc 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 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-zfs.c 1970-01-01 01:00:00.000000000 +0100 1350 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-zfs.c 2009-01-23 22:36:11.647280942 +0100 1351 17265 erwannc @@ -0,0 +1,985 @@ 1352 15280 erwannc +/* 1353 15280 erwannc + * Copyright (C) 2008 Sun Microsystems (Erwann Chenede) 1354 15280 erwannc + * 1355 15280 erwannc + */ 1356 15280 erwannc + 1357 15280 erwannc + 1358 15264 erwannc +#include <stdio.h> 1359 15264 erwannc +#include <strings.h> 1360 15264 erwannc +#include <stdlib.h> 1361 15264 erwannc +#include <unistd.h> 1362 15264 erwannc +#include "nautilus-zfs.h" 1363 15264 erwannc +#include <time.h> 1364 15264 erwannc +#include <locale.h> 1365 15264 erwannc +#include <langinfo.h> 1366 15264 erwannc +#include <stdint.h> 1367 15264 erwannc +#include <glib.h> 1368 15715 erwannc +#include <glib/gi18n.h> 1369 15264 erwannc +#include <glib/gstdio.h> 1370 15264 erwannc +#include <eel/eel-glib-extensions.h> 1371 15611 erwannc +#include <sys/mnttab.h> 1372 17150 erwannc +#include <sys/mkdev.h> 1373 16819 erwannc +#include "nautilus-global-preferences.h" 1374 15715 erwannc +#define ZFS_SNAPSHOT_DIR ".zfs/snapshot/" 1375 15715 erwannc + 1376 15264 erwannc +static void ts_set_snapshot_used_space (zfs_handle_t *zhp, ZfsDataSet *snap) 1377 15264 erwannc +{ 1378 15264 erwannc + gchar buf[ZFS_MAXNAMELEN]; 1379 15264 erwannc + if (zfs_prop_get(zhp, ZFS_PROP_USED, buf, sizeof (buf), NULL, NULL, 0, B_FALSE) == 0) 1380 15264 erwannc + { 1381 15264 erwannc + char unit[10]; 1382 15264 erwannc + char format_float[5] = "%f%s"; 1383 15264 erwannc + char format_int[5] = "%d%s"; 1384 15264 erwannc + char *format = format_int; 1385 15264 erwannc + int used_space_int = 0; 1386 15264 erwannc + gboolean success = FALSE; 1387 15264 erwannc + 1388 15264 erwannc + snap->used_space_str = g_strdup (buf); 1389 15264 erwannc + 1390 15264 erwannc + if (strchr (buf, '.')) 1391 15264 erwannc + { 1392 15264 erwannc + format = format_float; 1393 15264 erwannc + if (sscanf(buf, format,&snap->used_space,unit) == 2) 1394 15280 erwannc + success = TRUE; 1395 15264 erwannc + } 1396 15264 erwannc + else 1397 15264 erwannc + { 1398 15264 erwannc + if (sscanf(buf, format,&used_space_int,unit) == 2) 1399 15264 erwannc + { 1400 15264 erwannc + success = TRUE; 1401 15264 erwannc + snap->used_space = (float) used_space_int; 1402 15264 erwannc + } 1403 15264 erwannc + } 1404 15264 erwannc + if (strcmp (buf, "0") == 0) 1405 15264 erwannc + { 1406 15280 erwannc + g_free (snap->used_space_str); 1407 15264 erwannc + snap->used_space_str = g_strdup ("0 K"); 1408 15264 erwannc + success = TRUE; 1409 15264 erwannc + } 1410 15264 erwannc + 1411 15264 erwannc + if (success) 1412 15264 erwannc + { 1413 15264 erwannc + if (strcmp (unit, "M") == 0) 1414 15264 erwannc + snap->used_space *= 1024; 1415 15264 erwannc + if (strcmp (unit, "G") == 0) 1416 15264 erwannc + snap->used_space *= 1024 * 1024; 1417 15264 erwannc + } 1418 15264 erwannc + else 1419 15721 erwannc + { 1420 15721 erwannc + g_free (snap->used_space_str); 1421 15721 erwannc + /* SUN_BRANDING */ 1422 15721 erwannc + snap->used_space_str = g_strdup (_("Unknown")); 1423 15721 erwannc + } 1424 15264 erwannc + } 1425 15264 erwannc + else 1426 15721 erwannc + { 1427 15721 erwannc + g_free (snap->used_space_str); 1428 15721 erwannc + /* SUN_BRANDING */ 1429 15721 erwannc + snap->used_space_str = g_strdup (_("Unknown")); 1430 15721 erwannc + } 1431 15264 erwannc +} 1432 15264 erwannc + 1433 15264 erwannc +static void ts_set_snapshot_mtime_and_time_diff (zfs_handle_t *zhp, ZfsDataSet *snap) 1434 15264 erwannc +{ 1435 15264 erwannc + GDate now; 1436 15264 erwannc + GDate then; 1437 15264 erwannc + time_t time_now; 1438 15264 erwannc + gint days_diff; 1439 15264 erwannc + const gchar *format; 1440 15264 erwannc + gchar *locale_format = NULL; 1441 15264 erwannc + gchar buf[ZFS_MAXNAMELEN]; 1442 15264 erwannc + gchar *date_str = NULL; 1443 15264 erwannc + 1444 15715 erwannc + if (zfs_prop_get(zhp, ZFS_PROP_CREATION, buf, sizeof (buf), NULL, NULL, 0, B_TRUE) == 0) 1445 15264 erwannc + { 1446 15264 erwannc + struct tm tms; 1447 15264 erwannc + 1448 15715 erwannc + sscanf (buf, "%llu", &snap->mtime); 1449 15264 erwannc + memset(&tms, 0, sizeof(tms)); 1450 15715 erwannc + localtime_r (&snap->mtime, &tms); 1451 15264 erwannc + 1452 15264 erwannc + g_date_set_time_t (&then, snap->mtime); 1453 15264 erwannc + 1454 15264 erwannc + time_now = time (NULL); 1455 15264 erwannc + g_date_set_time_t (&now, time_now); 1456 15264 erwannc + 1457 15264 erwannc + days_diff = g_date_get_julian (&now) - g_date_get_julian (&then); 1458 15264 erwannc + 1459 15264 erwannc + /* Translators: %H means "hours" and %M means "minutes" */ 1460 15264 erwannc + if (days_diff == 0) 1461 15715 erwannc + /* SUN_BRANDING */ 1462 15715 erwannc + format = _("Today at %H:%M"); 1463 15264 erwannc + else if (days_diff == 1) 1464 15715 erwannc + /* SUN_BRANDING */ 1465 15715 erwannc + format = _("Yesterday at %H:%M"); 1466 15264 erwannc + else 1467 15264 erwannc + { 1468 15264 erwannc + if (days_diff > 1 && days_diff < 7) 1469 15715 erwannc + /* SUN_BRANDING */ 1470 15715 erwannc + format = _("%A at %H:%M"); /* Days from last week */ 1471 15264 erwannc + else 1472 15264 erwannc + { 1473 15264 erwannc + /* format = "%x";*/ /* Any other date */ 1474 17150 erwannc + format = _("%a %b %e %Y @ %Hh%M"); 1475 15715 erwannc + /* SUN_BRANDING */ 1476 17150 erwannc + /* date_str = g_strdup_printf (_("%d days ago"), days_diff); */ 1477 15264 erwannc + } 1478 15264 erwannc + } 1479 15264 erwannc + if (format) 1480 15264 erwannc + { 1481 15264 erwannc + locale_format = g_locale_from_utf8 (format, -1, NULL, NULL, NULL); 1482 15264 erwannc + if (locale_format != NULL && 1483 15264 erwannc + strftime (buf, sizeof (buf), locale_format, &tms) != 0) 1484 15264 erwannc + { 1485 15264 erwannc + date_str = g_locale_to_utf8 (buf, -1, NULL, NULL, NULL); 1486 15264 erwannc + } 1487 15264 erwannc + } 1488 15264 erwannc + 1489 15264 erwannc + if (date_str == NULL) 1490 15715 erwannc + /* SUN_BRANDING */ 1491 15715 erwannc + date_str = g_strdup (_("Unknown")); 1492 15264 erwannc + 1493 15264 erwannc + g_free (locale_format); 1494 17150 erwannc + snap->mtime_str = date_str; 1495 15264 erwannc + } 1496 15264 erwannc + 1497 15264 erwannc +} 1498 15264 erwannc + 1499 16819 erwannc +void print_snap_list (char *dir, GList *snap_list) 1500 15264 erwannc +{ 1501 15264 erwannc + GList *tmp; 1502 15264 erwannc + printf ("list of snapshots for %s :\n", dir); 1503 15264 erwannc + for (tmp = snap_list; tmp->next; tmp = tmp->next) 1504 15264 erwannc + { 1505 15264 erwannc + ZfsDataSet *snap = (ZfsDataSet*) tmp->data; 1506 15264 erwannc + printf (" name: %s\n mountpoint: %s\n mtime_str :%s\n space used : %s\n size in kilobytes : %f\n", 1507 15264 erwannc + snap->name, snap->mountpoint, snap->mtime_str, snap->used_space_str, snap->used_space); 1508 15264 erwannc + 1509 15264 erwannc + } 1510 15264 erwannc + printf ("\n"); 1511 15264 erwannc +} 1512 15264 erwannc + 1513 15264 erwannc +static GString * 1514 15264 erwannc +dump_zds (ZfsDataSet *zds) 1515 15264 erwannc +{ 1516 15264 erwannc + GString *msg; 1517 15264 erwannc + gchar *type; 1518 15264 erwannc + 1519 15264 erwannc + if (!zds) 1520 15264 erwannc + return NULL; 1521 15264 erwannc + 1522 15264 erwannc + msg = g_string_new (""); 1523 15264 erwannc + g_string_printf (msg, 1524 15264 erwannc + "\tname: %s\n" 1525 15264 erwannc + "\tmountpoint: %s\n" 1526 15264 erwannc + "\ttype: %s\n", 1527 15264 erwannc + zds->name,zds->mountpoint, zfs_type_to_name(zds->type)); 1528 15264 erwannc + if (zds->snapshots) 1529 15264 erwannc + { 1530 15264 erwannc + GList *tmp; 1531 15264 erwannc + g_string_append_printf(msg,"\tsnapshots :\n"); 1532 15264 erwannc + for (tmp=zds->snapshots;tmp;tmp = tmp->next) 1533 15264 erwannc + { 1534 15264 erwannc + ZfsDataSet *tmp_zds= (ZfsDataSet*) tmp->data; 1535 15264 erwannc + g_string_append_printf (msg,"\t\tname: %s\n\t\tpath: %s\n", 1536 15264 erwannc + tmp_zds->name, 1537 15264 erwannc + tmp_zds->mountpoint); 1538 15264 erwannc + } 1539 15264 erwannc + } 1540 15264 erwannc + g_string_append_printf (msg, "\n"); 1541 15264 erwannc + return msg; 1542 15264 erwannc +} 1543 15264 erwannc + 1544 15264 erwannc + 1545 15264 erwannc +static void 1546 15264 erwannc +dump_sds (SearchDataSet *sds) 1547 15264 erwannc +{ 1548 15264 erwannc + GString *msg; 1549 15264 erwannc + gchar *type; 1550 15264 erwannc + GList *tmp; 1551 15264 erwannc + 1552 15264 erwannc + if (!sds) 1553 15264 erwannc + { 1554 15264 erwannc + printf ("Search DataSet is empty\n"); 1555 15264 erwannc + return; 1556 15264 erwannc + } 1557 15264 erwannc + 1558 15264 erwannc + msg = g_string_new (""); 1559 15264 erwannc + g_string_printf (msg, "DDS Dump:\n" 1560 15264 erwannc + "\tsearched_path: %s\n", 1561 15264 erwannc + sds->searched_path); 1562 15264 erwannc + 1563 15264 erwannc + g_string_append_printf (msg, "Zfs Data set :\n"); 1564 15264 erwannc + for (tmp=sds->datasets;tmp;tmp=tmp->next) 1565 15264 erwannc + { 1566 15264 erwannc + GString * zds_dump = dump_zds ((ZfsDataSet *)tmp->data); 1567 15264 erwannc + g_string_append_printf (msg,"%s",zds_dump->str); 1568 15264 erwannc + g_string_free (zds_dump, TRUE); 1569 15264 erwannc + } 1570 15264 erwannc + g_string_append_printf (msg, "\n"); 1571 15264 erwannc + printf ("%s", msg->str); 1572 15264 erwannc + g_string_free (msg, TRUE); 1573 15264 erwannc +} 1574 15264 erwannc + 1575 15264 erwannc +static ZfsDataSet* 1576 15264 erwannc +ts_new_zfs_dataset (SearchDataSet* sds) 1577 15264 erwannc +{ 1578 15264 erwannc + ZfsDataSet *zds; 1579 15264 erwannc + zds = g_new0 (ZfsDataSet, 1); 1580 15264 erwannc + zds->search_dataset = sds; 1581 15264 erwannc + return zds; 1582 15264 erwannc +} 1583 15264 erwannc + 1584 17150 erwannc +void 1585 15264 erwannc +ts_free_zfs_dataset (ZfsDataSet* zds) 1586 15264 erwannc +{ 1587 15264 erwannc + if (!zds) 1588 15264 erwannc + return; 1589 15264 erwannc + if (zds->name) 1590 15264 erwannc + g_free (zds->name); 1591 15264 erwannc + if (zds->mountpoint) 1592 15264 erwannc + g_free (zds->mountpoint); 1593 15264 erwannc + if (zds->mtime_str) 1594 15264 erwannc + g_free (zds->mtime_str); 1595 15264 erwannc + if (zds->used_space_str) 1596 15264 erwannc + g_free (zds->used_space_str); 1597 15264 erwannc + 1598 15264 erwannc + if (zds->snapshots) 1599 15264 erwannc + { 1600 15264 erwannc + GList *tmp; 1601 15264 erwannc + for (tmp = zds->snapshots;tmp;tmp = tmp->next) 1602 15264 erwannc + ts_free_zfs_dataset ((ZfsDataSet*)tmp->data); 1603 15264 erwannc + } 1604 15264 erwannc + g_free (zds); 1605 15264 erwannc +} 1606 15264 erwannc + 1607 15264 erwannc +static SearchDataSet * 1608 16819 erwannc +ts_new_search_dataset (GCancellable *cancel) 1609 15264 erwannc +{ 1610 15264 erwannc + SearchDataSet *sds; 1611 15264 erwannc + sds = g_new0 (SearchDataSet, 1); 1612 16819 erwannc + sds->cancel = cancel; 1613 15264 erwannc + return sds; 1614 15264 erwannc +} 1615 15264 erwannc +static void 1616 15264 erwannc +ts_free_search_dataset (SearchDataSet *sds) 1617 15264 erwannc +{ 1618 15264 erwannc + if (!sds) 1619 15264 erwannc + return; 1620 15264 erwannc + if (sds->searched_path) 1621 17150 erwannc + g_free (sds->searched_path); 1622 17150 erwannc + if (sds->mountpoint) 1623 17150 erwannc + g_free (sds->mountpoint); 1624 15264 erwannc + if (sds->datasets) 1625 15264 erwannc + { 1626 15264 erwannc + GList *tmp; 1627 15264 erwannc + for (tmp = sds->datasets;tmp;tmp = tmp->next) 1628 15264 erwannc + ts_free_zfs_dataset ((ZfsDataSet*)tmp->data); 1629 15264 erwannc + } 1630 15264 erwannc + g_free (sds); 1631 15264 erwannc +} 1632 15264 erwannc + 1633 17150 erwannc +static char* construct_check_snapshot_path (SearchDataSet *sds, char* mountpoint, const char *name, char *searched_path) 1634 15264 erwannc +{ 1635 15611 erwannc + gchar *result = NULL; 1636 17150 erwannc + gchar **split; 1637 17150 erwannc + gchar **split2; 1638 15611 erwannc + 1639 15611 erwannc + gchar *snap_name = NULL; 1640 15611 erwannc + gchar *remaining_path = NULL; 1641 17150 erwannc + 1642 17150 erwannc + /* get the snapshot name part pool@snap-name we are only interested in snap-name split[1] */ 1643 17150 erwannc + split = g_strsplit (name,"@",2); 1644 17150 erwannc + /* get the path after the mountpoint */ 1645 17150 erwannc + split2 = g_strsplit (searched_path, mountpoint, 2); 1646 15611 erwannc + 1647 15611 erwannc + if (split && split[1]) 1648 15611 erwannc + snap_name = split[1]; 1649 15611 erwannc + 1650 15611 erwannc + if (split2 && split2[1]) 1651 15611 erwannc + remaining_path = split2[1]; 1652 15264 erwannc + 1653 15611 erwannc +/* printf ("mountpoint : %s \nname : %s \nsearched_path: %s\n", mountpoint, name, searched_path); 1654 15264 erwannc + printf ("split %s at @ = [%s] [%s]\n", name, split[0],split[1]); 1655 15611 erwannc + printf ("split %s at [%s] = [%s] [%s]\n", searched_path, mountpoint, split2[0],split2[1]); 1656 15611 erwannc + printf ("%s/.zfs/snapshot/%s/%s\n\n", mountpoint, split[1], split2[1]);*/ 1657 15264 erwannc + 1658 15611 erwannc + if (snap_name && remaining_path) 1659 15611 erwannc + result = g_strdup_printf ("%s/.zfs/snapshot/%s/%s", mountpoint, snap_name, remaining_path); 1660 17150 erwannc + 1661 15264 erwannc + g_strfreev (split); 1662 15264 erwannc + g_strfreev (split2); 1663 17150 erwannc + 1664 17150 erwannc + /* don't test for file presence if searched path is the same as the mount point */ 1665 17150 erwannc + if (sds->searched_path_match_mp) 1666 17150 erwannc + return result; 1667 17150 erwannc + 1668 15611 erwannc + if (result && g_file_test (result, G_FILE_TEST_IS_DIR)) 1669 17150 erwannc + { 1670 17150 erwannc + char real_dir[PATH_MAX+1]; 1671 17150 erwannc + if (!realpath(result, real_dir)) 1672 17150 erwannc + { 1673 17150 erwannc + g_free (result); 1674 17150 erwannc + result = NULL; 1675 17150 erwannc + } 1676 17150 erwannc + else 1677 17150 erwannc + { 1678 17150 erwannc + g_free (result); 1679 17150 erwannc + result = g_strdup (real_dir); 1680 17150 erwannc + } 1681 17150 erwannc + return result; 1682 17150 erwannc + } 1683 15264 erwannc + 1684 15264 erwannc + g_free (result); 1685 15264 erwannc + return NULL; 1686 15264 erwannc +} 1687 15264 erwannc + 1688 15264 erwannc +static int 1689 15264 erwannc +snapshot_callback (zfs_handle_t *zhp, void *data) 1690 15264 erwannc +{ 1691 15264 erwannc + ZfsDataSet *main_zds = (ZfsDataSet*) data; 1692 15264 erwannc + 1693 15264 erwannc + /* only add snapshot dir that exist */ 1694 15264 erwannc + 1695 16819 erwannc + if (zfs_get_type (zhp) == ZFS_TYPE_SNAPSHOT && !g_cancellable_is_cancelled (main_zds->search_dataset->cancel)) 1696 15264 erwannc + { 1697 15264 erwannc + const char* name = zfs_get_name (zhp); 1698 17150 erwannc + char *snap_path = construct_check_snapshot_path (main_zds->search_dataset, 1699 17150 erwannc + main_zds->mountpoint, 1700 15264 erwannc + name, 1701 15264 erwannc + main_zds->search_dataset->searched_path); 1702 15264 erwannc + if (snap_path) 1703 15264 erwannc + { 1704 15264 erwannc + ZfsDataSet *zds = ts_new_zfs_dataset (main_zds->search_dataset); 1705 15264 erwannc + zds->name = g_strdup (name); 1706 15264 erwannc + zds->type = ZFS_TYPE_SNAPSHOT; 1707 15264 erwannc + zds->mountpoint = snap_path; 1708 15264 erwannc + ts_set_snapshot_mtime_and_time_diff (zhp, zds); 1709 15264 erwannc + ts_set_snapshot_used_space (zhp, zds); 1710 15264 erwannc + main_zds->snapshots = g_list_append (main_zds->snapshots,zds); 1711 15264 erwannc + } 1712 15264 erwannc + } 1713 15264 erwannc + zfs_close (zhp); 1714 15264 erwannc + return 0; 1715 15264 erwannc +} 1716 15264 erwannc + 1717 15611 erwannc + 1718 15611 erwannc +static struct mnttab * 1719 15611 erwannc +mygetmntent(FILE *f) 1720 15611 erwannc +{ 1721 15611 erwannc + static struct mnttab mt; 1722 15611 erwannc + int status; 1723 15611 erwannc + 1724 15611 erwannc + if ((status = getmntent(f, &mt)) == 0) 1725 15611 erwannc + return (&mt); 1726 15611 erwannc + 1727 15611 erwannc + return (NULL); 1728 15611 erwannc +} 1729 15611 erwannc + 1730 15611 erwannc +static char * 1731 15611 erwannc +is_fs_mounted (const char *fs_name) 1732 15611 erwannc +{ 1733 15611 erwannc + FILE *mnttab; 1734 15611 erwannc + struct mnttab *mntp; 1735 15611 erwannc + 1736 15611 erwannc + 1737 15611 erwannc + mnttab = fopen (MNTTAB,"r"); 1738 15611 erwannc + 1739 15611 erwannc + while ((mntp = mygetmntent(mnttab)) != NULL) 1740 15611 erwannc + { 1741 15611 erwannc + if (mntp->mnt_fstype == (char *)0 || strcmp(mntp->mnt_fstype, "zfs") != 0) 1742 15611 erwannc + continue; 1743 15611 erwannc + if (strcmp (mntp->mnt_special, fs_name) == 0) 1744 15611 erwannc + { 1745 15611 erwannc + fclose (mnttab); 1746 15611 erwannc + return g_strdup (mntp->mnt_mountp); 1747 15611 erwannc + } 1748 15611 erwannc + } 1749 15611 erwannc + fclose (mnttab); 1750 15611 erwannc + return NULL; 1751 15611 erwannc +} 1752 15611 erwannc + 1753 15264 erwannc +static int 1754 15264 erwannc +zfs_callback (zfs_handle_t *zhp, void *data) 1755 15264 erwannc +{ 1756 15264 erwannc + char buf[ZFS_MAXPROPLEN]; 1757 15264 erwannc + SearchDataSet *sds = (SearchDataSet*) data; 1758 15264 erwannc + 1759 17150 erwannc + if (sds->match_found) 1760 17150 erwannc + { 1761 17150 erwannc + zfs_close (zhp); 1762 17150 erwannc + return 0; 1763 17150 erwannc + } 1764 17150 erwannc + 1765 16819 erwannc + if (zfs_get_type (zhp) & sds->type & !g_cancellable_is_cancelled (sds->cancel)) 1766 15264 erwannc + { 1767 16819 erwannc +/* struct timespec ts; 1768 16819 erwannc + ts.tv_sec = 3; 1769 16819 erwannc + ts.tv_nsec = 100000000; 1770 16819 erwannc + nanosleep (&ts, NULL);*/ 1771 16819 erwannc + 1772 15264 erwannc + if (sds->prop >= ZFS_PROP_TYPE && sds->prop < ZFS_NUM_PROPS) 1773 15264 erwannc + { 1774 15264 erwannc + zfs_prop_get(zhp, sds->prop, buf, sizeof (buf), NULL, NULL, 0, TRUE); 1775 17150 erwannc + 1776 17150 erwannc + if (strcmp (sds->mountpoint, buf) == 0) 1777 15264 erwannc + { 1778 15264 erwannc + ZfsDataSet *zds = ts_new_zfs_dataset (sds); 1779 15264 erwannc + zds->type = zfs_get_type (zhp); 1780 15264 erwannc + zds->name = g_strdup (zfs_get_name(zhp)); 1781 15264 erwannc + zds->mountpoint = g_strdup (buf); 1782 15264 erwannc + zfs_iter_snapshots (zhp, snapshot_callback, zds); 1783 15264 erwannc + sds->datasets = g_list_append (sds->datasets, zds); 1784 17150 erwannc + sds->match_found = TRUE; 1785 15264 erwannc + } 1786 15611 erwannc + else if (strcmp ("legacy", buf) == 0) 1787 15611 erwannc + { /* parse /etc/mnttab to get the mount point */ 1788 15611 erwannc + char *mountp = is_fs_mounted (zfs_get_name(zhp)); 1789 15611 erwannc + if (mountp) 1790 15611 erwannc + { 1791 17150 erwannc + if (strcmp (sds->mountpoint, mountp) == 0) 1792 15611 erwannc + { 1793 15611 erwannc + ZfsDataSet *zds = ts_new_zfs_dataset (sds); 1794 15611 erwannc + zds->type = zfs_get_type (zhp); 1795 15611 erwannc + zds->name = g_strdup (zfs_get_name(zhp)); 1796 15611 erwannc + zds->mountpoint = mountp; 1797 15611 erwannc + zfs_iter_snapshots (zhp, snapshot_callback, zds); 1798 15611 erwannc + sds->datasets = g_list_append (sds->datasets, zds); 1799 17150 erwannc + sds->match_found = TRUE; 1800 15611 erwannc + } 1801 15611 erwannc + else 1802 15611 erwannc + g_free (mountp); 1803 15611 erwannc + } 1804 15611 erwannc + } 1805 15264 erwannc + } 1806 17150 erwannc + if (!sds->match_found) 1807 17150 erwannc + zfs_iter_filesystems (zhp, zfs_callback, sds); 1808 15264 erwannc + } 1809 15264 erwannc + zfs_close (zhp); 1810 15264 erwannc + return 0; 1811 15264 erwannc +} 1812 15264 erwannc + 1813 15264 erwannc +static SearchDataSet * 1814 17150 erwannc +ts_get_data_from_mountpoint (const char* searched_path, const char *mountpoint, GCancellable *cancel) 1815 15264 erwannc +{ 1816 15264 erwannc + static libzfs_handle_t *zfs_handle = NULL; 1817 15264 erwannc + SearchDataSet *sds; 1818 15264 erwannc + 1819 16819 erwannc + sds = ts_new_search_dataset (cancel); 1820 15264 erwannc + 1821 15264 erwannc + sds->prop = ZFS_PROP_MOUNTPOINT; 1822 15264 erwannc + sds->type = ZFS_TYPE_FILESYSTEM; 1823 17150 erwannc + sds->searched_path = g_strdup (searched_path); 1824 17150 erwannc + sds->mountpoint = g_strdup (mountpoint); 1825 15264 erwannc + 1826 17150 erwannc + if (strcmp (searched_path, mountpoint) == 0) 1827 17150 erwannc + sds->searched_path_match_mp = TRUE; 1828 17150 erwannc + 1829 15264 erwannc + if (!zfs_handle) 1830 15264 erwannc + { 1831 15264 erwannc + if ((zfs_handle = libzfs_init()) == NULL) { 1832 17150 erwannc + g_warning ("internal error: failed to initialize ZFS library\n"); 1833 15264 erwannc + ts_free_search_dataset (sds); 1834 15264 erwannc + return NULL; 1835 15264 erwannc + } 1836 15264 erwannc + } 1837 15264 erwannc + zfs_iter_root (zfs_handle, zfs_callback, sds); 1838 15264 erwannc + 1839 15264 erwannc + return sds; 1840 15264 erwannc +} 1841 15264 erwannc +static gint 1842 15264 erwannc +snap_sort_by_age (gconstpointer a, 1843 15264 erwannc + gconstpointer b) 1844 15264 erwannc +{ 1845 15264 erwannc + const ZfsDataSet *snap1 = a; 1846 15264 erwannc + const ZfsDataSet *snap2 = b; 1847 15264 erwannc + 1848 15264 erwannc + if (snap1->mtime == snap2->mtime) 1849 15264 erwannc + return 0; 1850 15264 erwannc + if (snap1->mtime < snap2->mtime) 1851 15264 erwannc + return -1; 1852 15264 erwannc + if (snap1->mtime > snap2->mtime) 1853 15264 erwannc + return 1; 1854 15264 erwannc + 1855 15264 erwannc +} 1856 15264 erwannc + 1857 17150 erwannc +char* 1858 17150 erwannc +ts_get_zfs_filesystem (char *dir) 1859 17150 erwannc +{ 1860 17150 erwannc + char real_dir[PATH_MAX+1]; 1861 17150 erwannc + char filesystem[PATH_MAX+1]; 1862 17150 erwannc + gboolean found_fs= FALSE; 1863 17150 erwannc + struct stat64 dir_stat64; 1864 17150 erwannc + 1865 17150 erwannc + if (!realpath(dir, real_dir)) 1866 17150 erwannc + { 1867 17150 erwannc + return NULL; 1868 17150 erwannc + } 1869 17150 erwannc + if (stat64 (real_dir, &dir_stat64) == 0) 1870 17150 erwannc + { /* check is fs is zfs */ 1871 17150 erwannc + if (strcmp (dir_stat64.st_fstype, "zfs") == 0) 1872 17150 erwannc + { 1873 17150 erwannc + FILE *fp; 1874 17150 erwannc + struct extmnttab mtab; 1875 17150 erwannc + int status; 1876 17150 erwannc + 1877 17150 erwannc + /* get mount point */ 1878 17150 erwannc + 1879 17150 erwannc + fp = fopen (MNTTAB,"r"); 1880 17150 erwannc + 1881 17150 erwannc + resetmnttab(fp); 1882 17150 erwannc + while ((status = getextmntent(fp, &mtab, sizeof (struct extmnttab))) == 0) 1883 17150 erwannc + { 1884 17150 erwannc + dev_t dev = NODEV; 1885 17150 erwannc + dev = makedev(mtab.mnt_major, mtab.mnt_minor); 1886 17150 erwannc + if (dev == dir_stat64.st_dev) 1887 17150 erwannc + { 1888 17150 erwannc + strcpy (filesystem, mtab.mnt_special); 1889 17150 erwannc + found_fs = TRUE; 1890 17150 erwannc + break; 1891 17150 erwannc + } 1892 17150 erwannc + } 1893 17150 erwannc + (void) fclose(fp); 1894 17150 erwannc + } 1895 17150 erwannc + } 1896 17150 erwannc + if (found_fs) 1897 17150 erwannc + return g_strdup(filesystem); 1898 17150 erwannc + 1899 17150 erwannc + return NULL; 1900 17150 erwannc +} 1901 17150 erwannc + 1902 17150 erwannc +static char * get_zfs_mountpoint (char *dir) 1903 17150 erwannc +{ 1904 17150 erwannc + char real_dir[PATH_MAX+1]; 1905 17150 erwannc + char mountpoint[PATH_MAX+1]; 1906 17150 erwannc + gboolean found_mount_point = FALSE; 1907 17150 erwannc + struct stat64 dir_stat64; 1908 17150 erwannc + 1909 17150 erwannc + if (!realpath(dir, real_dir)) 1910 17150 erwannc + { 1911 17150 erwannc + return NULL; 1912 17150 erwannc + } 1913 17150 erwannc + if (stat64 (real_dir, &dir_stat64) == 0) 1914 17150 erwannc + { /* check is fs is zfs */ 1915 17150 erwannc + if (strcmp (dir_stat64.st_fstype, "zfs") == 0) 1916 17150 erwannc + { 1917 17150 erwannc + FILE *fp; 1918 17150 erwannc + struct extmnttab mtab; 1919 17150 erwannc + int status; 1920 17150 erwannc + 1921 17150 erwannc + /* get mount point */ 1922 17150 erwannc + 1923 17150 erwannc + fp = fopen (MNTTAB,"r"); 1924 17150 erwannc + 1925 17150 erwannc + resetmnttab(fp); 1926 17150 erwannc + while ((status = getextmntent(fp, &mtab, sizeof (struct extmnttab))) == 0) 1927 17150 erwannc + { 1928 17150 erwannc + dev_t dev = NODEV; 1929 17150 erwannc + dev = makedev(mtab.mnt_major, mtab.mnt_minor); 1930 17150 erwannc + if (dev == dir_stat64.st_dev) 1931 17150 erwannc + { 1932 17150 erwannc + strcpy (mountpoint, mtab.mnt_mountp); 1933 17150 erwannc + found_mount_point = TRUE; 1934 17150 erwannc + break; 1935 17150 erwannc + } 1936 17150 erwannc + } 1937 17150 erwannc + (void) fclose(fp); 1938 17150 erwannc + } 1939 17150 erwannc + } 1940 17150 erwannc + if (found_mount_point) 1941 17150 erwannc + return g_strdup(mountpoint); 1942 17150 erwannc + 1943 17150 erwannc + return NULL; 1944 17150 erwannc +} 1945 17150 erwannc + 1946 17150 erwannc + 1947 17150 erwannc +char *ts_get_snapshot_dir (char *dir) 1948 17150 erwannc +{ 1949 17150 erwannc + char *zfs_dir = get_zfs_mountpoint (dir); 1950 17150 erwannc + if (zfs_dir) 1951 17150 erwannc + { 1952 17150 erwannc + char *snapshot_dir = g_strdup_printf ("%s/.zfs/snapshot", zfs_dir); 1953 17150 erwannc + g_free (zfs_dir); 1954 17150 erwannc + return snapshot_dir; 1955 17150 erwannc + } 1956 17150 erwannc + else 1957 17150 erwannc + return NULL; 1958 17150 erwannc +} 1959 17150 erwannc + 1960 17150 erwannc + 1961 17150 erwannc + 1962 16819 erwannc +static void ts_get_snapshots_for_dir (GSimpleAsyncResult *res, 1963 16819 erwannc + GObject *object, 1964 16819 erwannc + GCancellable *cancellable) 1965 15264 erwannc +{ 1966 17150 erwannc + char *mountpoint = NULL; 1967 17150 erwannc + char real_dir[PATH_MAX+1]; 1968 15264 erwannc + SearchDataSet *sds; 1969 15264 erwannc + GList* snap_result = NULL; 1970 16819 erwannc + GFile *file = G_FILE (object); 1971 16819 erwannc + char *dir = g_file_get_path (file); 1972 15264 erwannc + 1973 17150 erwannc + mountpoint = get_zfs_mountpoint (dir); 1974 17150 erwannc + 1975 17150 erwannc + 1976 17150 erwannc + if (!mountpoint) 1977 16819 erwannc + { 1978 16819 erwannc + g_simple_async_result_set_op_res_gpointer (res, snap_result, (GDestroyNotify) NULL); 1979 16819 erwannc + g_free (dir); 1980 16819 erwannc + return; 1981 16819 erwannc + } 1982 15264 erwannc + 1983 17150 erwannc + realpath(dir, real_dir); 1984 15264 erwannc + 1985 17150 erwannc + sds = ts_get_data_from_mountpoint (real_dir, mountpoint, cancellable); 1986 17150 erwannc + 1987 17150 erwannc + g_free (mountpoint); 1988 17150 erwannc + 1989 16819 erwannc + if (g_cancellable_is_cancelled (cancellable)) 1990 16819 erwannc + { 1991 16819 erwannc + /* printf ("ts_get_snapshots_for_dir %s cancelled\n", dir); */ 1992 16819 erwannc + if (sds) 1993 16819 erwannc + { 1994 16819 erwannc + ts_free_search_dataset (sds); 1995 16819 erwannc + sds = NULL; 1996 16819 erwannc + } 1997 16819 erwannc + } 1998 16819 erwannc + 1999 15264 erwannc + if (sds) 2000 15264 erwannc + { 2001 15264 erwannc + GList *tmp; 2002 15264 erwannc + for (tmp=sds->datasets;tmp;tmp=tmp->next) 2003 15264 erwannc + { 2004 15264 erwannc + ZfsDataSet *zds = (ZfsDataSet*) tmp->data; 2005 15264 erwannc + if (zds->snapshots) 2006 15264 erwannc + { 2007 15264 erwannc + snap_result = g_list_concat (snap_result, zds->snapshots); 2008 15264 erwannc + zds->snapshots = NULL; 2009 15264 erwannc + } 2010 15264 erwannc + } 2011 15264 erwannc + ts_free_search_dataset (sds); 2012 15264 erwannc + } 2013 15280 erwannc + 2014 15264 erwannc + if (snap_result) 2015 15264 erwannc + { 2016 15611 erwannc + snap_result = g_list_sort (snap_result, (GCompareFunc)snap_sort_by_age); 2017 15264 erwannc + /* print_snap_list (dir, snap_result); */ 2018 15264 erwannc + } 2019 15264 erwannc + 2020 16819 erwannc + g_free (dir); 2021 16819 erwannc + g_simple_async_result_set_op_res_gpointer (res, snap_result, (GDestroyNotify) NULL); 2022 15264 erwannc +} 2023 15264 erwannc + 2024 16819 erwannc + 2025 16819 erwannc +GList *ts_get_snapshots_for_dir_async (GFile *file, 2026 16819 erwannc + GAsyncReadyCallback result_ready, 2027 16819 erwannc + GCancellable *cancel, 2028 16819 erwannc + gpointer user_data) 2029 16819 erwannc +{ 2030 16819 erwannc + GSimpleAsyncResult *res; 2031 16819 erwannc + 2032 16819 erwannc + res = g_simple_async_result_new (G_OBJECT (file), result_ready, user_data, (gpointer) ts_get_snapshots_for_dir); 2033 16819 erwannc + g_simple_async_result_run_in_thread (res, ts_get_snapshots_for_dir, G_PRIORITY_DEFAULT, cancel); 2034 16819 erwannc + return NULL; 2035 16819 erwannc +} 2036 16819 erwannc + 2037 16819 erwannc + 2038 15264 erwannc +void ts_free_snapshots (GList *snaps) 2039 15264 erwannc +{ 2040 15264 erwannc + if (snaps) 2041 15264 erwannc + { 2042 15264 erwannc + GList *tmp; 2043 15264 erwannc + for (tmp=snaps;tmp;tmp=tmp->next) 2044 15264 erwannc + ts_free_zfs_dataset ((ZfsDataSet*) tmp->data); 2045 15264 erwannc + g_list_free (snaps); 2046 15264 erwannc + } 2047 15264 erwannc +} 2048 15264 erwannc + 2049 15715 erwannc +gboolean ts_is_in_snapshot (char * str) 2050 15715 erwannc +{ 2051 15715 erwannc + if (str != NULL) 2052 15715 erwannc + { 2053 15715 erwannc + if (g_strrstr (str, ZFS_SNAPSHOT_DIR)) 2054 15715 erwannc + return TRUE; 2055 15715 erwannc + } 2056 15715 erwannc + return FALSE; 2057 15715 erwannc +} 2058 15715 erwannc + 2059 15715 erwannc +char* ts_remove_snapshot_dir (char *str) 2060 15715 erwannc +{ 2061 15715 erwannc + if (ts_is_in_snapshot (str)) 2062 15715 erwannc + { 2063 15715 erwannc + char *snap_root; 2064 15715 erwannc + char *zfs, *iter, point; 2065 15715 erwannc + int count = 0; 2066 15715 erwannc + 2067 15715 erwannc + /*remove .zfs/snapshot/blah/ */ 2068 15715 erwannc + zfs = g_strrstr (str, ZFS_SNAPSHOT_DIR); 2069 15715 erwannc + iter = zfs; 2070 15715 erwannc + 2071 15715 erwannc + if (iter) 2072 15715 erwannc + { 2073 15715 erwannc + iter += sizeof (ZFS_SNAPSHOT_DIR); 2074 15715 erwannc + while (*iter != '/' && *iter != '\0') 2075 15715 erwannc + iter++; 2076 15715 erwannc + 2077 15715 erwannc + if (*iter == '/') 2078 15715 erwannc + iter++; 2079 15715 erwannc + 2080 15715 erwannc + point = *zfs; 2081 15715 erwannc + *zfs = '\0'; 2082 15715 erwannc + snap_root = g_strdup_printf ("%s%s", str, iter); 2083 15715 erwannc + 2084 15715 erwannc + *zfs = point; 2085 15715 erwannc + return snap_root; 2086 15715 erwannc + } 2087 15715 erwannc + } 2088 15715 erwannc + return NULL; 2089 15715 erwannc +} 2090 15715 erwannc + 2091 15715 erwannc + 2092 16819 erwannc +static gboolean restore_col_enabled = FALSE; 2093 15715 erwannc + 2094 16819 erwannc +gboolean 2095 16819 erwannc +ts_is_restore_column_enabled () 2096 16819 erwannc +{ 2097 16819 erwannc + return restore_col_enabled; 2098 16819 erwannc +} 2099 16819 erwannc + 2100 16819 erwannc +void ts_is_restore_column_enabled_init (); 2101 16819 erwannc + 2102 16819 erwannc +static void 2103 16819 erwannc +visible_columns_changed (gpointer callback_data) 2104 16819 erwannc +{ 2105 16819 erwannc + ts_is_restore_column_enabled_init (); 2106 16819 erwannc +} 2107 16819 erwannc + 2108 16819 erwannc + 2109 16819 erwannc +void ts_is_restore_column_enabled_init () 2110 16819 erwannc +{ 2111 16819 erwannc + char **visible_columns; 2112 16819 erwannc + static gboolean init = FALSE; 2113 16819 erwannc + int i = 0; 2114 16819 erwannc + 2115 16819 erwannc + if (!init) 2116 16819 erwannc + { 2117 16819 erwannc + eel_preferences_add_callback (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS, 2118 16819 erwannc + visible_columns_changed, NULL); 2119 16819 erwannc + init = TRUE; 2120 16819 erwannc + } 2121 16819 erwannc + 2122 16819 erwannc + restore_col_enabled = FALSE; 2123 16819 erwannc + 2124 16819 erwannc + visible_columns = eel_preferences_get_string_array (NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS); 2125 16819 erwannc + 2126 16819 erwannc + while (visible_columns[i]) 2127 16819 erwannc + { 2128 16819 erwannc + if (strcmp (visible_columns [i], "restore_info") == 0) 2129 16819 erwannc + { 2130 16819 erwannc + restore_col_enabled = TRUE; 2131 16819 erwannc + break; 2132 16819 erwannc + } 2133 16819 erwannc + i++; 2134 16819 erwannc + } 2135 16819 erwannc + g_strfreev (visible_columns); 2136 16819 erwannc +} 2137 17150 erwannc + 2138 17150 erwannc + 2139 17150 erwannc +static GList * get_dir_entries (char *dir_path) 2140 17150 erwannc +{ 2141 17150 erwannc + const char *entry_name; 2142 17150 erwannc + GDir *dir; 2143 17150 erwannc + GList *dir_entries = NULL; 2144 17150 erwannc + dir = g_dir_open (dir_path, 0, NULL); 2145 17150 erwannc + 2146 17150 erwannc + while ((entry_name = g_dir_read_name (dir)) != NULL) 2147 17150 erwannc + dir_entries = g_list_prepend (dir_entries, g_strdup (entry_name)); 2148 17150 erwannc + 2149 17150 erwannc + g_dir_close (dir); 2150 17150 erwannc + 2151 17150 erwannc + return dir_entries; 2152 17150 erwannc +} 2153 17150 erwannc + 2154 17150 erwannc +static void free_dir_entries (GList *entries) 2155 17150 erwannc +{ 2156 17150 erwannc + g_list_foreach (entries, (GFunc)g_free, NULL); 2157 17150 erwannc + g_list_free (entries); 2158 17150 erwannc +} 2159 17150 erwannc + 2160 17150 erwannc +static gboolean are_entries_identical (GList *old, GList *new) 2161 17150 erwannc +{ 2162 17150 erwannc + if (g_list_length (old) != g_list_length (new)) 2163 17150 erwannc + return FALSE; 2164 17150 erwannc + 2165 17150 erwannc + for (old; old; old = old->next) 2166 17150 erwannc + { 2167 17150 erwannc + gboolean found = FALSE; 2168 17150 erwannc + for (new; new; new = new->next) 2169 17150 erwannc + { 2170 17150 erwannc + if (strcmp (old->data, new->data) == 0) 2171 17150 erwannc + { 2172 17150 erwannc + found = TRUE; 2173 17150 erwannc + break; 2174 17150 erwannc + } 2175 17150 erwannc + } 2176 17150 erwannc + if (!found) 2177 17150 erwannc + return FALSE; 2178 17150 erwannc + } 2179 17150 erwannc + return TRUE; 2180 17150 erwannc +} 2181 17150 erwannc + 2182 17150 erwannc +void monitor_zfs_snap_directory_cancel (ZfsSnapDirMonitor *monitor_data) 2183 17150 erwannc +{ 2184 17150 erwannc + if (monitor_data) 2185 17150 erwannc + { 2186 17150 erwannc + /* printf ("in monitor_zfs_snap_directory_cancel %s\n", monitor_data->path); */ 2187 17150 erwannc + g_source_remove (monitor_data->timeout_id); 2188 17150 erwannc + free_dir_entries (monitor_data->entries); 2189 17150 erwannc + g_free (monitor_data->path); 2190 17150 erwannc + g_free (monitor_data); 2191 17150 erwannc + } 2192 17150 erwannc +} 2193 17150 erwannc + 2194 17150 erwannc +static gboolean 2195 17150 erwannc +monitor_snap_dir (ZfsSnapDirMonitor *monitor_data) 2196 17150 erwannc +{ 2197 17150 erwannc + GList *new_entries; 2198 17150 erwannc + 2199 17150 erwannc + if (!g_file_test (monitor_data->path, G_FILE_TEST_IS_DIR)) 2200 17150 erwannc + { 2201 17150 erwannc + monitor_zfs_snap_directory_cancel (monitor_data); 2202 17150 erwannc + return TRUE; 2203 17150 erwannc + } 2204 17150 erwannc + 2205 17150 erwannc + new_entries = get_dir_entries (monitor_data->path); 2206 17150 erwannc + 2207 17150 erwannc + if (are_entries_identical (monitor_data->entries, new_entries)) 2208 17150 erwannc + { 2209 17150 erwannc + free_dir_entries (new_entries); 2210 17150 erwannc + } 2211 17150 erwannc + else 2212 17150 erwannc + { 2213 17150 erwannc + free_dir_entries (monitor_data->entries); 2214 17150 erwannc + monitor_data->entries = new_entries; 2215 17150 erwannc + monitor_data->change_callback (monitor_data, monitor_data->user_data); 2216 17150 erwannc + } 2217 17150 erwannc + return TRUE; 2218 17150 erwannc +} 2219 17150 erwannc + 2220 17150 erwannc + 2221 17150 erwannc +ZfsSnapDirMonitor *monitor_zfs_snap_directory (char *path, 2222 17150 erwannc + ZfsDirChangeCallback change_callback, 2223 17150 erwannc + gpointer data) 2224 17150 erwannc +{ 2225 17150 erwannc + ZfsSnapDirMonitor *monitor_data = g_new0 (ZfsSnapDirMonitor, 1); 2226 17150 erwannc + 2227 17150 erwannc + /* printf ("start monitoring %s\n", path); */ 2228 17150 erwannc + 2229 17150 erwannc + monitor_data->path = g_strdup (path); 2230 17150 erwannc + monitor_data->entries = get_dir_entries (path); 2231 17150 erwannc + monitor_data->change_callback = change_callback; 2232 17150 erwannc + monitor_data->user_data = data; 2233 17150 erwannc + 2234 17150 erwannc + monitor_data->timeout_id = g_timeout_add_seconds (5, (GSourceFunc)monitor_snap_dir, monitor_data); 2235 17150 erwannc + return monitor_data; 2236 17150 erwannc +} 2237 17150 erwannc + 2238 17265 erwannc +char * 2239 17265 erwannc +ts_get_not_zfs_snapshot_dir (GFile *file) 2240 17265 erwannc +{ 2241 17265 erwannc + char tmp_path[PATH_MAX + 1]; 2242 17265 erwannc + gboolean found = FALSE; 2243 17265 erwannc + gboolean end_path = FALSE; 2244 17265 erwannc + GFile *d = g_file_get_parent(file); 2245 17265 erwannc + GFile *tmp; 2246 17265 erwannc + char *full_path = g_file_get_path (file); 2247 17265 erwannc + char *stripped_path = g_file_get_path (d); 2248 17265 erwannc + struct stat64 dir_stat64; 2249 17265 erwannc + 2250 17265 erwannc + if (!full_path) 2251 17265 erwannc + return NULL; 2252 17265 erwannc + 2253 17265 erwannc + if (stat64 (full_path, &dir_stat64) == 0) 2254 17265 erwannc + { /* check is fs is zfs if so don't try to check for nfs mounted .zfs dir*/ 2255 17265 erwannc + if (strcmp (dir_stat64.st_fstype, "zfs") == 0) 2256 17265 erwannc + end_path = TRUE; 2257 17265 erwannc + } 2258 17265 erwannc + 2259 17265 erwannc + while (!found && !end_path) 2260 17265 erwannc + { 2261 17265 erwannc + g_sprintf (tmp_path, "%s/.zfs/snapshot", stripped_path); 2262 17265 erwannc + if (g_file_test (tmp_path, G_FILE_TEST_IS_DIR)) 2263 17265 erwannc + { 2264 17265 erwannc + GList *entries = get_dir_entries (tmp_path); 2265 17265 erwannc + if (entries != NULL) 2266 17265 erwannc + { 2267 17265 erwannc + char *after_snap_path = full_path + strlen (stripped_path) + 1; 2268 17265 erwannc + 2269 17265 erwannc + for (entries; entries; entries = entries->next) 2270 17265 erwannc + { 2271 17265 erwannc + char test_path[PATH_MAX +1]; 2272 17265 erwannc + g_sprintf (test_path, "%s/%s/%s", tmp_path, 2273 17265 erwannc + entries->data, 2274 17265 erwannc + after_snap_path); 2275 17265 erwannc + if (g_file_test (test_path, G_FILE_TEST_EXISTS)) 2276 17265 erwannc + { 2277 17265 erwannc + found = TRUE; 2278 17265 erwannc + break; 2279 17265 erwannc + } 2280 17265 erwannc + } 2281 17265 erwannc + free_dir_entries (entries); 2282 17265 erwannc + } 2283 17265 erwannc + } 2284 17265 erwannc + tmp = d; 2285 17265 erwannc + d = g_file_get_parent (tmp); 2286 17265 erwannc + g_object_unref (tmp); 2287 17265 erwannc + g_free (stripped_path); 2288 17265 erwannc + if (d == NULL) 2289 17265 erwannc + { 2290 17265 erwannc + end_path = TRUE; 2291 17265 erwannc + } 2292 17265 erwannc + else 2293 17265 erwannc + { 2294 17265 erwannc + stripped_path = g_file_get_path (d); 2295 17265 erwannc + } 2296 17265 erwannc + } 2297 17265 erwannc + 2298 17265 erwannc + g_free (full_path); 2299 17265 erwannc + 2300 17265 erwannc + if (stripped_path) 2301 17265 erwannc + g_free (stripped_path); 2302 17265 erwannc + 2303 17265 erwannc + if (found) 2304 17265 erwannc + return g_strdup (tmp_path); 2305 17265 erwannc + else 2306 17265 erwannc + return NULL; 2307 17265 erwannc + 2308 17265 erwannc +} 2309 17265 erwannc + 2310 17265 erwannc + 2311 17265 erwannc + 2312 17265 erwannc + 2313 17265 erwannc + 2314 17265 erwannc + 2315 17265 erwannc + 2316 17265 erwannc + 2317 17265 erwannc + 2318 17265 erwannc + 2319 17265 erwannc + 2320 17265 erwannc + 2321 17265 erwannc + 2322 17265 erwannc + 2323 17265 erwannc + 2324 17265 erwannc + 2325 17265 erwannc + 2326 17265 erwannc + 2327 17265 erwannc + 2328 17265 erwannc + 2329 17265 erwannc + 2330 17265 erwannc + 2331 17265 erwannc + 2332 17265 erwannc + 2333 17265 erwannc + 2334 17265 erwannc + 2335 17265 erwannc + 2336 17265 erwannc + 2337 17265 erwannc + 2338 17265 erwannc + 2339 17265 erwannc + 2340 17265 erwannc 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 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/libnautilus-private/nautilus-zfs.h 1970-01-01 01:00:00.000000000 +0100 2342 17265 erwannc +++ nautilus-2.24.2/libnautilus-private/nautilus-zfs.h 2009-01-23 22:36:12.513678737 +0100 2343 17265 erwannc @@ -0,0 +1,69 @@ 2344 15280 erwannc +/* #include <config.h> */ 2345 16819 erwannc +#ifndef NAUTILUS_ZFS_H 2346 16819 erwannc +#define NAUTILUS_ZFS_H 2347 16819 erwannc + 2348 15264 erwannc +#include <glib.h> 2349 15264 erwannc +#include <libzfs.h> 2350 16819 erwannc +#include <gio/gio.h> 2351 15264 erwannc + 2352 15264 erwannc +typedef struct 2353 15264 erwannc +{ 2354 16819 erwannc + zfs_type_t type; 2355 16819 erwannc + zfs_prop_t prop; 2356 17150 erwannc + char *searched_path; 2357 17150 erwannc + char *mountpoint; 2358 17150 erwannc + GList *datasets; 2359 16819 erwannc + GCancellable *cancel; 2360 17150 erwannc + gboolean match_found; 2361 17150 erwannc + gboolean searched_path_match_mp; 2362 15264 erwannc + 2363 15264 erwannc +} SearchDataSet; 2364 15264 erwannc + 2365 15264 erwannc +typedef struct 2366 15264 erwannc +{ 2367 16819 erwannc + char *name; 2368 16819 erwannc + char *mountpoint; 2369 16819 erwannc + char *mtime_str; 2370 16819 erwannc + time_t mtime; 2371 16819 erwannc + float used_space; 2372 16819 erwannc + char *used_space_str; 2373 16819 erwannc + zfs_type_t type; 2374 16819 erwannc + GList *snapshots; 2375 16819 erwannc + SearchDataSet *search_dataset; 2376 15264 erwannc +} ZfsDataSet; 2377 15264 erwannc + 2378 16819 erwannc + 2379 17150 erwannc +GList *ts_get_snapshots_for_dir_async (GFile *file, 2380 17150 erwannc + GAsyncReadyCallback result_ready, 2381 17150 erwannc + GCancellable *cancel, 2382 17150 erwannc + gpointer user_data); 2383 17150 erwannc +void ts_free_snapshots (GList *snaps); 2384 17150 erwannc +void ts_free_zfs_dataset (ZfsDataSet* zds); 2385 15264 erwannc + 2386 17150 erwannc +gboolean ts_is_in_snapshot (char * str); 2387 17150 erwannc +char* ts_remove_snapshot_dir (char *str); 2388 17150 erwannc +char *ts_get_snapshot_dir (char *dir); 2389 17150 erwannc +char *ts_get_zfs_filesystem (char *dir); 2390 17265 erwannc +char * ts_get_not_zfs_snapshot_dir (GFile *file); 2391 17150 erwannc +gboolean ts_is_restore_column_enabled (); 2392 17150 erwannc +void ts_is_restore_column_enabled_init (); 2393 17150 erwannc +void print_snap_list (char *dir, GList *snap_list); 2394 15715 erwannc + 2395 17150 erwannc +typedef void (*ZfsDirChangeCallback) (gpointer monitor_data, 2396 17150 erwannc + gpointer user_data); 2397 17150 erwannc + 2398 17150 erwannc +typedef struct 2399 17150 erwannc +{ 2400 17150 erwannc + char * path; 2401 17150 erwannc + GList *entries; 2402 17150 erwannc + guint timeout_id; 2403 17150 erwannc + ZfsDirChangeCallback change_callback; 2404 17150 erwannc + gpointer user_data; 2405 17150 erwannc +} ZfsSnapDirMonitor; 2406 17150 erwannc + 2407 17150 erwannc +void monitor_zfs_snap_directory_cancel (ZfsSnapDirMonitor *monitor_data); 2408 17150 erwannc +ZfsSnapDirMonitor *monitor_zfs_snap_directory (char *path, 2409 17150 erwannc + ZfsDirChangeCallback change_callback, 2410 17150 erwannc + gpointer data); 2411 16819 erwannc +#endif /* NAUTILUS_ZFS_H */ 2412 16819 erwannc + 2413 17265 erwannc diff -Nrup SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/Makefile.am nautilus-2.24.2/src/Makefile.am 2414 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/Makefile.am 2008-10-06 19:22:18.000000000 +0200 2415 17265 erwannc +++ nautilus-2.24.2/src/Makefile.am 2009-01-23 22:36:10.638397062 +0100 2416 15264 erwannc @@ -137,6 +137,10 @@ nautilus_SOURCES = \ 2417 15264 erwannc nautilus-x-content-bar.h \ 2418 15264 erwannc nautilus-zoom-control.c \ 2419 15264 erwannc nautilus-zoom-control.h \ 2420 15264 erwannc + nautilus-zfs-bar.c \ 2421 15264 erwannc + nautilus-zfs-bar.h \ 2422 15264 erwannc + timescale.h \ 2423 15264 erwannc + timescale.c \ 2424 15264 erwannc $(NULL) 2425 15264 erwannc 2426 15264 erwannc nautilus_file_management_properties_SOURCES= \ 2427 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/src/file-manager/fm-actions.h 2009-01-23 22:36:10.668828089 +0100 2430 17265 erwannc @@ -52,6 +52,9 @@ 2431 15264 erwannc #define FM_ACTION_LOCATION_PASTE_FILES_INTO "LocationPasteFilesInto" 2432 15264 erwannc #define FM_ACTION_NEW_LAUNCHER "New Launcher" 2433 15264 erwannc #define FM_ACTION_RENAME "Rename" 2434 15264 erwannc +#define FM_ACTION_RESTORE_TO "Restore to" 2435 17265 erwannc +#define FM_ACTION_HAS_SNAPSHOT "View Snap" 2436 17150 erwannc +#define FM_ACTION_SNAP_NOW "Snap Now" 2437 15264 erwannc #define FM_ACTION_DUPLICATE "Duplicate" 2438 15264 erwannc #define FM_ACTION_CREATE_LINK "Create Link" 2439 15264 erwannc #define FM_ACTION_SELECT_ALL "Select All" 2440 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/src/file-manager/fm-directory-view.c 2009-01-23 22:36:10.670123633 +0100 2443 17265 erwannc @@ -968,6 +968,77 @@ real_trash (FMDirectoryView *view) 2444 15611 erwannc } 2445 15611 erwannc 2446 15611 erwannc static void 2447 17150 erwannc +action_snap_now (GtkAction *action, 2448 17150 erwannc + gpointer callback_data) 2449 17150 erwannc +{ 2450 17150 erwannc + FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data); 2451 17150 erwannc + GList *selection = fm_directory_view_get_selection_for_file_transfer (view); 2452 17150 erwannc + GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data)); 2453 17150 erwannc + char *path = g_file_get_path (file); 2454 17150 erwannc + char *fs = ts_get_zfs_filesystem (path); 2455 17150 erwannc + char *cmd = g_strdup_printf ("/usr/lib/time-slider-snapshot %s %s", path, fs); 2456 17150 erwannc + gdk_spawn_command_line_on_screen (gtk_widget_get_screen (GTK_WIDGET (callback_data)), 2457 17150 erwannc + cmd, NULL); 2458 17150 erwannc + 2459 17150 erwannc + g_free (cmd); 2460 17150 erwannc + g_free (fs); 2461 17150 erwannc + g_free (path); 2462 17150 erwannc + g_object_unref (file); 2463 17150 erwannc +} 2464 17150 erwannc + 2465 17150 erwannc +static void 2466 15611 erwannc +action_restore_to_desktop_callback (GtkAction *action, 2467 15611 erwannc + gpointer callback_data) 2468 15611 erwannc +{ 2469 15611 erwannc + GList *locations = NULL; 2470 15611 erwannc + GList *node; 2471 15611 erwannc + FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data); 2472 15611 erwannc + char *desktop_directory = nautilus_get_desktop_directory_uri(); 2473 15611 erwannc + GList *selection = fm_directory_view_get_selection_for_file_transfer (view); 2474 15611 erwannc + 2475 15611 erwannc + if (selection == NULL) 2476 15611 erwannc + return; 2477 15611 erwannc + 2478 15611 erwannc + if (desktop_directory == NULL) 2479 15611 erwannc + return; 2480 15611 erwannc + 2481 15611 erwannc + 2482 15611 erwannc + for (node = selection; node != NULL; node = node->next) 2483 15611 erwannc + { 2484 15611 erwannc + locations = g_list_prepend (locations, 2485 15611 erwannc + nautilus_file_get_uri ((NautilusFile *) node->data)); 2486 15611 erwannc + } 2487 15611 erwannc + 2488 15611 erwannc + fm_directory_view_move_copy_items (locations, NULL, desktop_directory, 2489 15611 erwannc + GDK_ACTION_COPY, 0, 0, view); 2490 15611 erwannc + 2491 15611 erwannc + nautilus_file_list_free (selection); 2492 15611 erwannc +} 2493 15611 erwannc + 2494 15611 erwannc +static void 2495 17265 erwannc +action_show_snapshot_versions_callback (GtkAction *action, 2496 17265 erwannc + gpointer callback_data) 2497 17265 erwannc +{ 2498 17265 erwannc + FMDirectoryView *view = FM_DIRECTORY_VIEW (callback_data); 2499 17265 erwannc + GList *selection = fm_directory_view_get_selection_for_file_transfer (view); 2500 17265 erwannc + GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data)); 2501 17265 erwannc + char *dir = nautilus_file_get_snapshot_dir (NAUTILUS_FILE (selection->data)); 2502 17265 erwannc + char *file_path = g_file_get_path (file); 2503 17265 erwannc + char real_file_path [PATH_MAX + 1]; 2504 17265 erwannc + if (realpath (file_path, real_file_path)) 2505 17265 erwannc + { 2506 17265 erwannc + char *cmd = g_strdup_printf ("/usr/lib/time-slider-version '%s' '%s'", dir, 2507 17265 erwannc + real_file_path); 2508 17265 erwannc + gdk_spawn_command_line_on_screen (gtk_widget_get_screen (GTK_WIDGET (callback_data)), 2509 17265 erwannc + cmd, NULL); 2510 17265 erwannc + g_free (cmd); 2511 17265 erwannc + } 2512 17265 erwannc + 2513 17265 erwannc + g_free (file_path); 2514 17265 erwannc + g_object_unref (file); 2515 17265 erwannc +} 2516 17265 erwannc + 2517 17265 erwannc +static void 2518 15611 erwannc action_trash_callback (GtkAction *action, 2519 15611 erwannc gpointer callback_data) 2520 15611 erwannc { 2521 17265 erwannc @@ -6697,6 +6768,24 @@ static const GtkActionEntry directory_vi 2522 15611 erwannc /* label, accelerator */ "RenameSelectAll", "<shift>F2", 2523 15611 erwannc /* tooltip */ NULL, 2524 15611 erwannc G_CALLBACK (action_rename_select_all_callback) }, 2525 15611 erwannc + /* name, stock id */ { "Restore to", NULL, 2526 15715 erwannc + /* SUN_BRANDING */ 2527 15611 erwannc + /* label, accelerator */ N_("Restore to Desktop"), NULL, 2528 15715 erwannc + /* SUN_BRANDING */ 2529 15611 erwannc + /* tooltip */ N_("Move each selected item to the Desktop"), 2530 15611 erwannc + G_CALLBACK (action_restore_to_desktop_callback) }, 2531 17265 erwannc + /* name, stock id */ { "View Snap", NULL, 2532 17265 erwannc + /* SUN_BRANDING */ 2533 17265 erwannc + /* label, accelerator */ N_("View versions"), NULL, 2534 17265 erwannc + /* SUN_BRANDING */ 2535 17265 erwannc + /* tooltip */ N_("View the versions of this file available in ZFS snapshots"), 2536 17265 erwannc + G_CALLBACK (action_show_snapshot_versions_callback) }, 2537 17150 erwannc + /* name, stock id */ { "Snap Now", NULL, 2538 17150 erwannc + /* SUN_BRANDING */ 2539 17150 erwannc + /* label, accelerator */ N_("Snapshot now"), NULL, 2540 17150 erwannc + /* SUN_BRANDING */ 2541 17150 erwannc + /* tooltip */ N_("Take a ZFS snapshot of this directory now"), 2542 17150 erwannc + G_CALLBACK (action_snap_now) }, 2543 15611 erwannc /* name, stock id */ { "Trash", NULL, 2544 15611 erwannc /* label, accelerator */ N_("Mo_ve to Trash"), NULL, 2545 15611 erwannc /* tooltip */ N_("Move each selected item to the Trash"), 2546 17265 erwannc @@ -7723,6 +7812,41 @@ can_delete_all (GList *files) 2547 17265 erwannc return TRUE; 2548 17265 erwannc } 2549 17265 erwannc 2550 17265 erwannc +typedef struct { 2551 17265 erwannc + NautilusFile *file; 2552 17265 erwannc + GCancellable *cancel; 2553 17265 erwannc + GtkAction *action; 2554 17265 erwannc +} HasSnapshotData; 2555 17265 erwannc + 2556 17265 erwannc +static void 2557 17265 erwannc +has_snapshot_ready_callback (gpointer user_data) 2558 17265 erwannc +{ 2559 17265 erwannc + GValue name = {0,}; 2560 17265 erwannc + HasSnapshotData *data = (HasSnapshotData*) user_data; 2561 17265 erwannc + HasSnapshotResult result = nautilus_file_has_snapshot_version (data->file); 2562 17265 erwannc + 2563 17265 erwannc + switch (result) 2564 17265 erwannc + { 2565 17265 erwannc + case UNKNOWN_STATE: 2566 17265 erwannc + case NO: 2567 17265 erwannc + gtk_action_set_sensitive (data->action, FALSE); 2568 17265 erwannc + g_value_init (&name, G_TYPE_STRING); 2569 17265 erwannc + /* SUN_BRANDING */ 2570 17265 erwannc + g_value_set_static_string (&name, _("No versions")); 2571 17265 erwannc + g_object_set_property (G_OBJECT (data->action), "label", &name); 2572 17265 erwannc + break; 2573 17265 erwannc + case YES: 2574 17265 erwannc + gtk_action_set_sensitive (data->action, TRUE); 2575 17265 erwannc + g_value_init (&name, G_TYPE_STRING); 2576 17265 erwannc + /* SUN_BRANDING */ 2577 17265 erwannc + g_value_set_static_string (&name, _("Explore versions")); 2578 17265 erwannc + g_object_set_property (G_OBJECT (data->action), "label", &name); 2579 17265 erwannc + break; 2580 17265 erwannc + } 2581 17265 erwannc + g_free (data); 2582 17265 erwannc + } 2583 17265 erwannc + 2584 17265 erwannc + 2585 17265 erwannc static void 2586 17265 erwannc real_update_menus (FMDirectoryView *view) 2587 17265 erwannc { 2588 17265 erwannc @@ -8028,6 +8152,79 @@ real_update_menus (FMDirectoryView *view 2589 15611 erwannc FM_ACTION_COPY); 2590 15611 erwannc gtk_action_set_sensitive (action, can_copy_files); 2591 15611 erwannc 2592 15611 erwannc + action = gtk_action_group_get_action (view->details->dir_action_group, 2593 15611 erwannc + FM_ACTION_RESTORE_TO); 2594 15611 erwannc + gtk_action_set_visible (action, can_copy_files && 2595 15611 erwannc + nautilus_directory_is_in_snapshot (view->details->model)); 2596 17150 erwannc + 2597 17150 erwannc + action = gtk_action_group_get_action (view->details->dir_action_group, 2598 17150 erwannc + FM_ACTION_SNAP_NOW); 2599 15611 erwannc + 2600 17150 erwannc + if (selection_count == 1 && nautilus_file_is_directory (NAUTILUS_FILE (selection->data))) 2601 17150 erwannc + { 2602 17150 erwannc + GFile *file = nautilus_file_get_location (NAUTILUS_FILE (selection->data)); 2603 17150 erwannc + char *path = g_file_get_path (file); 2604 17150 erwannc + char *fs = ts_get_zfs_filesystem (path); 2605 17150 erwannc + if (fs) 2606 17150 erwannc + { 2607 17150 erwannc + gtk_action_set_visible (action, TRUE); 2608 17150 erwannc + g_free (fs); 2609 17150 erwannc + } 2610 17150 erwannc + g_free (path); 2611 17150 erwannc + g_object_unref (file); 2612 17150 erwannc + } 2613 17150 erwannc + else 2614 17150 erwannc + gtk_action_set_visible (action, FALSE); 2615 17150 erwannc + 2616 17265 erwannc + action = gtk_action_group_get_action (view->details->dir_action_group, 2617 17265 erwannc + FM_ACTION_HAS_SNAPSHOT); 2618 17150 erwannc + 2619 17265 erwannc + if (selection_count == 1) 2620 17265 erwannc + { 2621 17265 erwannc + GValue name = { 0, }; 2622 17265 erwannc + int result = nautilus_file_has_snapshot_version (NAUTILUS_FILE (selection->data)); 2623 17265 erwannc + 2624 17265 erwannc + switch (result) 2625 17265 erwannc + { 2626 17265 erwannc + case NO: 2627 17265 erwannc + gtk_action_set_visible (action, FALSE); 2628 17265 erwannc + break; 2629 17265 erwannc + case YES: 2630 17265 erwannc + gtk_action_set_visible (action, TRUE); 2631 17265 erwannc + gtk_action_set_sensitive (action, TRUE); 2632 17265 erwannc + g_value_init (&name,G_TYPE_STRING); 2633 17265 erwannc + /* SUN_BRANDING */ 2634 17265 erwannc + g_value_set_static_string (&name, _("Explore versions")); 2635 17265 erwannc + g_object_set_property (G_OBJECT (action), "label", &name); 2636 17265 erwannc + break; 2637 17265 erwannc + case UNKNOWN_STATE: 2638 17265 erwannc + gtk_action_set_visible (action, TRUE); 2639 17265 erwannc + gtk_action_set_sensitive (action, FALSE); 2640 17265 erwannc + g_value_init (&name,G_TYPE_STRING); 2641 17265 erwannc + /* SUN_BRANDING */ 2642 17265 erwannc + g_value_set_static_string (&name, _("Scanning for versions")); 2643 17265 erwannc + g_object_set_property (G_OBJECT (action), "label", &name); 2644 17265 erwannc + break; 2645 17265 erwannc + } 2646 17265 erwannc + 2647 17265 erwannc + 2648 17265 erwannc + if (result == UNKNOWN_STATE) 2649 17265 erwannc + { 2650 17265 erwannc + HasSnapshotData *data = g_new0 (HasSnapshotData, 1); 2651 17265 erwannc + data->action = action; 2652 17265 erwannc + data->file = NAUTILUS_FILE (selection->data); 2653 17265 erwannc + data->cancel = g_cancellable_new (); 2654 17265 erwannc + nautilus_file_get_snapshot_version (NAUTILUS_FILE (selection->data), 2655 17265 erwannc + has_snapshot_ready_callback, 2656 17265 erwannc + data->cancel, 2657 17265 erwannc + data); 2658 17265 erwannc + } 2659 17265 erwannc + } 2660 17265 erwannc + else 2661 17265 erwannc + gtk_action_set_visible (action, FALSE); 2662 17265 erwannc + 2663 17265 erwannc + 2664 17265 erwannc + 2665 15611 erwannc real_update_paste_menu (view, selection, selection_count); 2666 15611 erwannc 2667 15611 erwannc action = gtk_action_group_get_action (view->details->dir_action_group, 2668 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/src/file-manager/nautilus-directory-view-ui.xml 2009-01-23 22:36:10.677724357 +0100 2671 17265 erwannc @@ -64,6 +64,9 @@ 2672 15264 erwannc <menuitem name="Duplicate" action="Duplicate"/> 2673 15264 erwannc <menuitem name="Create Link" action="Create Link"/> 2674 15264 erwannc <menuitem name="Rename" action="Rename"/> 2675 15264 erwannc + <menuitem name="Restore to" action="Restore to"/> 2676 17150 erwannc + <menuitem name="Snapshot now" action="Snap Now"/> 2677 17265 erwannc + <menuitem name="Scanning...." action="View Snap"/> 2678 15264 erwannc </placeholder> 2679 15264 erwannc <placeholder name="Dangerous File Items Placeholder"> 2680 15264 erwannc <menuitem name="Trash" action="Trash"/> 2681 17265 erwannc @@ -147,6 +150,9 @@ 2682 15264 erwannc <placeholder name="File Actions"> 2683 15264 erwannc <menuitem name="Create Link" action="Create Link"/> 2684 15264 erwannc <menuitem name="Rename" action="Rename"/> 2685 15264 erwannc + <menuitem name="Restore to" action="Restore to"/> 2686 17150 erwannc + <menuitem name="Snapshot now" action="Snap Now"/> 2687 17265 erwannc + <menuitem name="Scanning...." action="View Snap"/> 2688 15264 erwannc </placeholder> 2689 15264 erwannc <separator name="Dangerous separator"/> 2690 15264 erwannc <placeholder name="Dangerous File Actions"> 2691 17265 erwannc @@ -184,6 +190,7 @@ 2692 15264 erwannc </placeholder> 2693 15264 erwannc <separator name="Location After Clipboard Separator"/> 2694 15264 erwannc <placeholder name="Dangerous File Actions"> 2695 15264 erwannc + <menuitem name="Restore" action="Restore"/> 2696 15264 erwannc <menuitem name="Trash" action="LocationTrash"/> 2697 15264 erwannc <menuitem name="Delete" action="LocationDelete"/> 2698 15264 erwannc <menuitem name="Restore From Trash" action="LocationRestoreFromTrash"/> 2699 17265 erwannc 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 17265 erwannc --- SUNWgnome-file-mgr-2.24.2/nautilus-2.24.2/src/nautilus-actions.h 2008-10-06 19:22:18.000000000 +0200 2701 17265 erwannc +++ nautilus-2.24.2/src/nautilus-actions.h 2009-01-23 22:36:10.788601269 +0100 2702 15264 erwannc @@ -28,6 +28,7 @@ 2703 15264 erwannc 2704 15264 erwannc #define NAUTILUS_ACTION_STOP "Stop" 2705 15264 erwannc #define NAUTILUS_ACTION_RELOAD "Reload" 2706 15264 erwannc +#define NAUTILUS_ACTION_RESTORE "Restore" 2707 15264 erwannc #define NAUTILUS_ACTION_BACK "Back" 2708 15264 erwannc #define NAUTILUS_ACTION_UP "Up" 2709 15264 erwannc #define NAUTILUS_ACTION_UP_ACCEL "UpAccel" 2710 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/src/nautilus-file-management-properties.c 2009-01-23 22:36:10.640141631 +0100 2713 16342 erwannc @@ -73,6 +73,7 @@ 2714 16342 erwannc #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_TREE_VIEW_FOLDERS_WIDGET "treeview_folders_checkbutton" 2715 16342 erwannc #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_MEDIA_AUTOMOUNT_OPEN "media_automount_open_checkbutton" 2716 16342 erwannc #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_MEDIA_AUTORUN_NEVER "media_autorun_never_checkbutton" 2717 16342 erwannc +#define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ENABLE_TIME_SLIDER "time_slider_enabled_checkbutton" 2718 16342 erwannc 2719 16342 erwannc /* int enums */ 2720 16342 erwannc #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_THUMBNAIL_LIMIT_WIDGET "preview_image_size_combobox" 2721 16342 erwannc @@ -725,6 +726,9 @@ nautilus_file_management_properties_dial 2722 16342 erwannc eel_preferences_glade_connect_bool (xml_dialog, 2723 16342 erwannc NAUTILUS_FILE_MANAGEMENT_PROPERTIES_TREE_VIEW_FOLDERS_WIDGET, 2724 16342 erwannc NAUTILUS_PREFERENCES_TREE_SHOW_ONLY_DIRECTORIES); 2725 16342 erwannc + eel_preferences_glade_connect_bool (xml_dialog, 2726 16342 erwannc + NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ENABLE_TIME_SLIDER, 2727 16342 erwannc + NAUTILUS_PREFERENCES_ENABLE_TIME_SLIDER); 2728 16342 erwannc 2729 16342 erwannc eel_preferences_glade_connect_string_enum_combo_box (xml_dialog, 2730 16342 erwannc NAUTILUS_FILE_MANAGEMENT_PROPERTIES_DEFAULT_VIEW_WIDGET, 2731 17265 erwannc 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 17265 erwannc --- 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 17265 erwannc +++ nautilus-2.24.2/src/nautilus-file-management-properties.glade 2009-01-23 22:36:10.778222728 +0100 2734 16342 erwannc @@ -1,2041 +1,1167 @@ 2735 16342 erwannc -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> 2736 16342 erwannc -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> 2737 16342 erwannc - 2738 16342 erwannc +<?xml version="1.0" encoding="UTF-8" standalone="no"?> 2739 16342 erwannc +<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> 2740 16342 erwannc +<!--*- mode: xml -*--> 2741 16342 erwannc <glade-interface> 2742 16342 erwannc - 2743 16342 erwannc -<widget class="GtkDialog" id="file_management_dialog"> 2744 16342 erwannc - <property name="border_width">5</property> 2745 16342 erwannc - <property name="title" translatable="yes">File Management Preferences</property> 2746 16342 erwannc - <property name="type">GTK_WINDOW_TOPLEVEL</property> 2747 16342 erwannc - <property name="window_position">GTK_WIN_POS_CENTER</property> 2748 16342 erwannc - <property name="modal">False</property> 2749 16342 erwannc - <property name="resizable">True</property> 2750 16342 erwannc - <property name="destroy_with_parent">False</property> 2751 16342 erwannc - <property name="decorated">True</property> 2752 16342 erwannc - <property name="skip_taskbar_hint">False</property> 2753 16342 erwannc - <property name="skip_pager_hint">False</property> 2754 16342 erwannc - <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> 2755 16342 erwannc - <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> 2756 16342 erwannc - <property name="focus_on_map">True</property> 2757 16342 erwannc - <property name="urgency_hint">False</property> 2758 16342 erwannc - <property name="has_separator">False</property> 2759 16342 erwannc - 2760 16342 erwannc - <child internal-child="vbox"> 2761 16342 erwannc - <widget class="GtkVBox" id="dialog-vbox1"> 2762 16342 erwannc - <property name="visible">True</property> 2763 16342 erwannc - <property name="homogeneous">False</property> 2764 16342 erwannc - <property name="spacing">2</property> 2765 16342 erwannc - 2766 16342 erwannc - <child internal-child="action_area"> 2767 16342 erwannc - <widget class="GtkHButtonBox" id="dialog-action_area1"> 2768 16342 erwannc - <property name="visible">True</property> 2769 16342 erwannc - <property name="layout_style">GTK_BUTTONBOX_END</property> 2770 16342 erwannc - 2771 16342 erwannc - <child> 2772 16342 erwannc - <widget class="GtkButton" id="helpbutton1"> 2773 16342 erwannc - <property name="visible">True</property> 2774 16342 erwannc - <property name="can_default">True</property> 2775 16342 erwannc - <property name="can_focus">True</property> 2776 16342 erwannc - <property name="label">gtk-help</property> 2777 16342 erwannc - <property name="use_stock">True</property> 2778 16342 erwannc - <property name="relief">GTK_RELIEF_NORMAL</property> 2779 16342 erwannc - <property name="focus_on_click">True</property> 2780 16342 erwannc - <property name="response_id">-11</property> 2781 16342 erwannc - </widget> 2782 16342 erwannc - </child> 2783 16342 erwannc - 2784 16342 erwannc - <child> 2785 16342 erwannc - <widget class="GtkButton" id="closebutton1"> 2786 16342 erwannc - <property name="visible">True</property> 2787 16342 erwannc - <property name="can_default">True</property> 2788 16342 erwannc - <property name="can_focus">True</property> 2789 16342 erwannc - <property name="label">gtk-close</property> 2790 16342 erwannc - <property name="use_stock">True</property> 2791 16342 erwannc - <property name="relief">GTK_RELIEF_NORMAL</property> 2792 16342 erwannc - <property name="focus_on_click">True</property> 2793 16342 erwannc - <property name="response_id">-7</property> 2794 16342 erwannc - </widget> 2795 16342 erwannc - </child> 2796 16342 erwannc - </widget> 2797 16342 erwannc - <packing> 2798 16342 erwannc - <property name="padding">0</property> 2799 16342 erwannc - <property name="expand">False</property> 2800 16342 erwannc - <property name="fill">True</property> 2801 16342 erwannc - <property name="pack_type">GTK_PACK_END</property> 2802 16342 erwannc - </packing> 2803 16342 erwannc - </child> 2804 16342 erwannc - 2805 16342 erwannc - <child> 2806 16342 erwannc - <widget class="GtkNotebook" id="notebook1"> 2807 16342 erwannc - <property name="border_width">5</property> 2808 16342 erwannc - <property name="visible">True</property> 2809 16342 erwannc - <property name="can_focus">True</property> 2810 16342 erwannc - <property name="show_tabs">True</property> 2811 16342 erwannc - <property name="show_border">True</property> 2812 16342 erwannc - <property name="tab_pos">GTK_POS_TOP</property> 2813 16342 erwannc - <property name="scrollable">False</property> 2814 16342 erwannc - <property name="enable_popup">False</property> 2815 16342 erwannc - 2816 16342 erwannc - <child> 2817 16342 erwannc - <widget class="GtkVBox" id="vbox1"> 2818 16342 erwannc - <property name="border_width">12</property> 2819 16342 erwannc - <property name="visible">True</property> 2820 16342 erwannc - <property name="homogeneous">False</property> 2821 16342 erwannc - <property name="spacing">18</property> 2822 16342 erwannc - 2823 16342 erwannc - <child> 2824 16342 erwannc - <widget class="GtkVBox" id="vbox2"> 2825 16342 erwannc - <property name="visible">True</property> 2826 16342 erwannc - <property name="homogeneous">False</property> 2827 16342 erwannc - <property name="spacing">6</property> 2828 16342 erwannc - 2829 16342 erwannc - <child> 2830 16342 erwannc - <widget class="GtkLabel" id="label4"> 2831 16342 erwannc - <property name="visible">True</property> 2832 16342 erwannc - <property name="label" translatable="yes"><b>Default View</b></property> 2833 16342 erwannc - <property name="use_underline">False</property> 2834 16342 erwannc - <property name="use_markup">True</property> 2835 16342 erwannc - <property name="justify">GTK_JUSTIFY_LEFT</property> 2836 16342 erwannc - <property name="wrap">False</property> 2837 16342 erwannc - <property name="selectable">False</property> 2838 16342 erwannc - <property name="xalign">0</property> 2839 16342 erwannc - <property name="yalign">0.5</property> 2840 16342 erwannc - <property name="xpad">0</property> 2841 16342 erwannc - <property name="ypad">0</property> 2842 16342 erwannc - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 2843 16342 erwannc - <property name="width_chars">-1</property> 2844 16342 erwannc - <property name="single_line_mode">False</property> 2845 16342 erwannc - <property name="angle">0</property> 2846 16342 erwannc - </widget> 2847 16342 erwannc - <packing> 2848 16342 erwannc - <property name="padding">0</property> 2849 16342 erwannc - <property name="expand">False</property> 2850 16342 erwannc - <property name="fill">False</property> 2851 16342 erwannc - </packing> 2852 16342 erwannc - </child> 2853 16342 erwannc - 2854 16342 erwannc - <child> 2855 16342 erwannc - <widget class="GtkAlignment" id="alignment2"> 2856 16342 erwannc - <property name="visible">True</property> 2857 16342 erwannc - <property name="xalign">0.5</property> 2858 16342 erwannc - <property name="yalign">0.5</property> 2859 16342 erwannc - <property name="xscale">1</property> 2860 16342 erwannc - <property name="yscale">1</property> 2861 16342 erwannc - <property name="top_padding">0</property> 2862 16342 erwannc - <property name="bottom_padding">0</property> 2863 16342 erwannc - <property name="left_padding">12</property> 2864 16342 erwannc - <property name="right_padding">0</property> 2865 16342 erwannc - 2866 16342 erwannc - <child> 2867 16342 erwannc - <widget class="GtkVBox" id="vbox14"> 2868 16342 erwannc - <property name="visible">True</property> 2869 16342 erwannc - <property name="homogeneous">False</property> 2870 16342 erwannc - <property name="spacing">6</property> 2871 16342 erwannc - 2872 16342 erwannc - <child> 2873 16342 erwannc - <widget class="GtkHBox" id="hbox34"> 2874 16342 erwannc - <property name="visible">True</property> 2875 16342 erwannc - <property name="homogeneous">False</property> 2876 16342 erwannc - <property name="spacing">12</property> 2877 16342 erwannc - 2878 16342 erwannc - <child> 2879 16342 erwannc - <widget class="GtkLabel" id="views_label_0"> 2880 16342 erwannc - <property name="visible">True</property> 2881 16342 erwannc - <property name="label" translatable="yes">View _new folders using:</property> 2882 16342 erwannc - <property name="use_underline">True</property> 2883 16342 erwannc - <property name="use_markup">False</property> 2884 16342 erwannc - <property name="justify">GTK_JUSTIFY_LEFT</property> 2885 16342 erwannc - <property name="wrap">False</property> 2886 16342 erwannc - <property name="selectable">False</property> 2887 16342 erwannc - <property name="xalign">0</property> 2888 16342 erwannc - <property name="yalign">0.5</property> 2889 16342 erwannc - <property name="xpad">0</property> 2890 16342 erwannc - <property name="ypad">0</property> 2891 16342 erwannc - <property name="mnemonic_widget">default_view_combobox</property> 2892 16342 erwannc - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 2893 16342 erwannc - <property name="width_chars">-1</property> 2894 16342 erwannc - <property name="single_line_mode">False</property> 2895 16342 erwannc - <property name="angle">0</property> 2896 16342 erwannc - </widget> 2897 16342 erwannc - <packing> 2898 16342 erwannc - <property name="padding">0</property> 2899 16342 erwannc - <property name="expand">False</property> 2900 16342 erwannc - <property name="fill">False</property> 2901 16342 erwannc - </packing> 2902 16342 erwannc - </child> 2903 16342 erwannc - 2904 16342 erwannc - <child> 2905 16342 erwannc - <widget class="GtkComboBox" id="default_view_combobox"> 2906 16342 erwannc - <property name="visible">True</property> 2907 16342 erwannc - <property name="items" translatable="yes">Icon View 2908 16342 erwannc + <widget class="GtkDialog" id="file_management_dialog"> 2909 16342 erwannc + <property name="border_width">5</property> 2910 16342 erwannc + <property name="title" translatable="yes">File Management Preferences</property> 2911 16342 erwannc + <property name="window_position">GTK_WIN_POS_CENTER</property> 2912 16342 erwannc + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> 2913 16342 erwannc + <property name="has_separator">False</property> 2914 16342 erwannc + <child internal-child="vbox"> 2915 16342 erwannc + <widget class="GtkVBox" id="dialog-vbox1"> 2916 16342 erwannc + <property name="visible">True</property> 2917 16342 erwannc + <property name="spacing">2</property> 2918 16342 erwannc + <child> 2919 16342 erwannc + <widget class="GtkNotebook" id="notebook1"> 2920 16342 erwannc + <property name="visible">True</property> 2921 16342 erwannc + <property name="can_focus">True</property> 2922 16342 erwannc + <property name="border_width">5</property> 2923 16342 erwannc + <child> 2924 16342 erwannc + <widget class="GtkVBox" id="vbox1"> 2925 16342 erwannc + <property name="visible">True</property> 2926 16342 erwannc + <property name="border_width">12</property> 2927 16342 erwannc + <property name="spacing">18</property> 2928 16342 erwannc + <child> 2929 16342 erwannc + <widget class="GtkVBox" id="vbox2"> 2930 16342 erwannc + <property name="visible">True</property> 2931 16342 erwannc + <property name="spacing">6</property> 2932 16342 erwannc + <child> 2933 16342 erwannc + <widget class="GtkLabel" id="label4"> 2934 16342 erwannc + <property name="visible">True</property> 2935 16342 erwannc + <property name="xalign">0</property> 2936 16342 erwannc + <property name="label" translatable="yes"><b>Default View</b></property> 2937 16342 erwannc + <property name="use_markup">True</property> 2938 16342 erwannc + </widget> 2939 16342 erwannc + <packing> 2940 16342 erwannc + <property name="expand">False</property> 2941 16342 erwannc + <property name="fill">False</property> 2942 16342 erwannc + </packing> 2943 16342 erwannc + </child> 2944 16342 erwannc + <child> 2945 16342 erwannc + <widget class="GtkAlignment" id="alignment2"> 2946 16342 erwannc + <property name="visible">True</property> 2947 16342 erwannc + <property name="left_padding">12</property> 2948 16342 erwannc + <child> 2949 16342 erwannc + <widget class="GtkVBox" id="vbox14"> 2950 16342 erwannc + <property name="visible">True</property> 2951 16342 erwannc + <property name="spacing">6</property> 2952 16342 erwannc + <child> 2953 16342 erwannc + <widget class="GtkHBox" id="hbox34"> 2954 16342 erwannc + <property name="visible">True</property> 2955 16342 erwannc + <property name="spacing">12</property> 2956 16342 erwannc + <child> 2957 16342 erwannc + <widget class="GtkLabel" id="views_label_0"> 2958 16342 erwannc + <property name="visible">True</property> 2959 16342 erwannc + <property name="xalign">0</property> 2960 16342 erwannc + <property name="label" translatable="yes">View _new folders using:</property> 2961 16342 erwannc + <property name="use_underline">True</property> 2962 16342 erwannc + <property name="mnemonic_widget">default_view_combobox</property> 2963 16342 erwannc + </widget> 2964 16342 erwannc + <packing> 2965 16342 erwannc + <property name="expand">False</property> 2966 16342 erwannc + <property name="fill">False</property> 2967 16342 erwannc + </packing> 2968 16342 erwannc + </child> 2969 16342 erwannc + <child> 2970 16342 erwannc + <widget class="GtkComboBox" id="default_view_combobox"> 2971 16342 erwannc + <property name="visible">True</property> 2972 16342 erwannc + <property name="items" translatable="yes">Icon View 2973 16342 erwannc List View 2974 16342 erwannc Compact View</property> 2975 16342 erwannc - <property name="add_tearoffs">False</property> 2976 16342 erwannc - <property name="focus_on_click">True</property> 2977 16342 erwannc - </widget> 2978 16342 erwannc - <packing> 2979 16342 erwannc - <property name="padding">0</property> 2980 16342 erwannc - <property name="expand">True</property> 2981 16342 erwannc - <property name="fill">True</property> 2982 16342 erwannc - </packing> 2983 16342 erwannc - </child> 2984 16342 erwannc - </widget> 2985 16342 erwannc - <packing> 2986 16342 erwannc - <property name="padding">0</property> 2987 16342 erwannc - <property name="expand">True</property> 2988 16342 erwannc - <property name="fill">True</property> 2989 16342 erwannc - </packing> 2990 16342 erwannc - </child> 2991 16342 erwannc - 2992 16342 erwannc - <child> 2993 16342 erwannc - <widget class="GtkHBox" id="hbox11"> 2994 16342 erwannc - <property name="visible">True</property> 2995 16342 erwannc - <property name="homogeneous">False</property> 2996 16342 erwannc - <property name="spacing">12</property> 2997 16342 erwannc - 2998 16342 erwannc - <child> 2999 16342 erwannc - <widget class="GtkLabel" id="views_label_1"> 3000 16342 erwannc - <property name="visible">True</property> 3001 16342 erwannc - <property name="label" translatable="yes">_Arrange items:</property> 3002 16342 erwannc - <property name="use_underline">True</property> 3003 16342 erwannc - <property name="use_markup">False</property> 3004 16342 erwannc - <property name="justify">GTK_JUSTIFY_LEFT</property> 3005 16342 erwannc - <property name="wrap">False</property> 3006 16342 erwannc - <property name="selectable">False</property> 3007 16342 erwannc - <property name="xalign">0</property> 3008 16342 erwannc - <property name="yalign">0.5</property> 3009 16342 erwannc - <property name="xpad">0</property> 3010 16342 erwannc - <property name="ypad">0</property> 3011 16342 erwannc - <property name="mnemonic_widget">sort_order_combobox</property> 3012 16342 erwannc - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3013 16342 erwannc - <property name="width_chars">-1</property> 3014 16342 erwannc - <property name="single_line_mode">False</property> 3015 16342 erwannc - <property name="angle">0</property> 3016 16342 erwannc - </widget> 3017 16342 erwannc - <packing> 3018 16342 erwannc - <property name="padding">0</property> 3019 16342 erwannc - <property name="expand">False</property> 3020 16342 erwannc - <property name="fill">False</property> 3021 16342 erwannc - </packing> 3022 16342 erwannc - </child> 3023 16342 erwannc - 3024 16342 erwannc - <child> 3025 16342 erwannc - <widget class="GtkComboBox" id="sort_order_combobox"> 3026 16342 erwannc - <property name="visible">True</property> 3027 16342 erwannc - <property name="items" translatable="yes">By Name 3028 16342 erwannc + </widget> 3029 16342 erwannc + <packing> 3030 16342 erwannc + <property name="position">1</property> 3031 16342 erwannc + </packing> 3032 16342 erwannc + </child> 3033 16342 erwannc + </widget> 3034 16342 erwannc + </child> 3035 16342 erwannc + <child> 3036 16342 erwannc + <widget class="GtkHBox" id="hbox11"> 3037 16342 erwannc + <property name="visible">True</property> 3038 16342 erwannc + <property name="spacing">12</property> 3039 16342 erwannc + <child> 3040 16342 erwannc + <widget class="GtkLabel" id="views_label_1"> 3041 16342 erwannc + <property name="visible">True</property> 3042 16342 erwannc + <property name="xalign">0</property> 3043 16342 erwannc + <property name="label" translatable="yes">_Arrange items:</property> 3044 16342 erwannc + <property name="use_underline">True</property> 3045 16342 erwannc + <property name="mnemonic_widget">sort_order_combobox</property> 3046 16342 erwannc + </widget> 3047 16342 erwannc + <packing> 3048 16342 erwannc + <property name="expand">False</property> 3049 16342 erwannc + <property name="fill">False</property> 3050 16342 erwannc + </packing> 3051 16342 erwannc + </child> 3052 16342 erwannc + <child> 3053 16342 erwannc + <widget class="GtkComboBox" id="sort_order_combobox"> 3054 16342 erwannc + <property name="visible">True</property> 3055 16342 erwannc + <property name="items" translatable="yes">By Name 3056 16342 erwannc By Size 3057 16342 erwannc By Type 3058 16342 erwannc By Modification Date 3059 16342 erwannc By Emblems</property> 3060 16342 erwannc - <property name="add_tearoffs">False</property> 3061 16342 erwannc - <property name="focus_on_click">True</property> 3062 16342 erwannc - </widget> 3063 16342 erwannc - <packing> 3064 16342 erwannc - <property name="padding">0</property> 3065 16342 erwannc - <property name="expand">True</property> 3066 16342 erwannc - <property name="fill">True</property> 3067 16342 erwannc - </packing> 3068 16342 erwannc - </child> 3069 16342 erwannc - </widget> 3070 16342 erwannc - <packing> 3071 16342 erwannc - <property name="padding">0</property> 3072 16342 erwannc - <property name="expand">True</property> 3073 16342 erwannc - <property name="fill">True</property> 3074 16342 erwannc - </packing> 3075 16342 erwannc - </child> 3076 16342 erwannc - 3077 16342 erwannc - <child> 3078 16342 erwannc - <widget class="GtkCheckButton" id="sort_folders_first_checkbutton"> 3079 16342 erwannc - <property name="visible">True</property> 3080 16342 erwannc - <property name="can_focus">True</property> 3081 16342 erwannc - <property name="label" translatable="yes">Sort _folders before files</property> 3082 16342 erwannc - <property name="use_underline">True</property> 3083 16342 erwannc - <property name="relief">GTK_RELIEF_NORMAL</property> 3084 16342 erwannc - <property name="focus_on_click">True</property> 3085 16342 erwannc - <property name="active">False</property> 3086 16342 erwannc - <property name="inconsistent">False</property> 3087 16342 erwannc - <property name="draw_indicator">True</property> 3088 16342 erwannc - </widget> 3089 16342 erwannc - <packing> 3090 16342 erwannc - <property name="padding">0</property> 3091 16342 erwannc - <property name="expand">False</property> 3092 16342 erwannc - <property name="fill">False</property> 3093 16342 erwannc - </packing> 3094 16342 erwannc - </child> 3095 16342 erwannc - 3096 16342 erwannc - <child> 3097 16342 erwannc - <widget class="GtkCheckButton" id="hidden_files_checkbutton"> 3098 16342 erwannc - <property name="visible">True</property> 3099 16342 erwannc - <property name="can_focus">True</property> 3100 16342 erwannc - <property name="label" translatable="yes">Show hidden and _backup files</property> 3101 16342 erwannc - <property name="use_underline">True</property> 3102 16342 erwannc - <property name="relief">GTK_RELIEF_NORMAL</property> 3103 16342 erwannc - <property name="focus_on_click">True</property> 3104 16342 erwannc - <property name="active">False</property> 3105 16342 erwannc - <property name="inconsistent">False</property> 3106 16342 erwannc - <property name="draw_indicator">True</property> 3107 16342 erwannc - </widget> 3108 16342 erwannc - <packing> 3109 16342 erwannc - <property name="padding">0</property> 3110 16342 erwannc - <property name="expand">False</property> 3111 16342 erwannc - <property name="fill">False</property> 3112 16342 erwannc - </packing> 3113 16342 erwannc - </child> 3114 16342 erwannc - </widget> 3115 16342 erwannc - </child> 3116 16342 erwannc - </widget> 3117 16342 erwannc - <packing> 3118 16342 erwannc - <property name="padding">0</property> 3119 16342 erwannc - <property name="expand">True</property> 3120 16342 erwannc - <property name="fill">True</property> 3121 16342 erwannc - </packing> 3122 16342 erwannc - </child> 3123 16342 erwannc - </widget> 3124 16342 erwannc - <packing> 3125 16342 erwannc - <property name="padding">0</property> 3126 16342 erwannc - <property name="expand">False</property> 3127 16342 erwannc - <property name="fill">True</property> 3128 16342 erwannc - </packing> 3129 16342 erwannc - </child> 3130 16342 erwannc - 3131 16342 erwannc - <child> 3132 16342 erwannc - <widget class="GtkVBox" id="vbox3"> 3133 16342 erwannc - <property name="visible">True</property> 3134 16342 erwannc - <property name="homogeneous">False</property> 3135 16342 erwannc - <property name="spacing">6</property> 3136 16342 erwannc - 3137 16342 erwannc - <child> 3138 16342 erwannc - <widget class="GtkLabel" id="label5"> 3139 16342 erwannc - <property name="visible">True</property> 3140 16342 erwannc - <property name="label" translatable="yes"><b>Icon View Defaults</b></property> 3141 16342 erwannc - <property name="use_underline">False</property> 3142 16342 erwannc - <property name="use_markup">True</property> 3143 16342 erwannc - <property name="justify">GTK_JUSTIFY_LEFT</property> 3144 16342 erwannc - <property name="wrap">False</property> 3145 16342 erwannc - <property name="selectable">False</property> 3146 16342 erwannc - <property name="xalign">0</property> 3147 16342 erwannc - <property name="yalign">0.5</property> 3148 16342 erwannc - <property name="xpad">0</property> 3149 16342 erwannc - <property name="ypad">0</property> 3150 16342 erwannc - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3151 16342 erwannc - <property name="width_chars">-1</property> 3152 16342 erwannc - <property name="single_line_mode">False</property> 3153 16342 erwannc - <property name="angle">0</property> 3154 16342 erwannc - </widget> 3155 16342 erwannc - <packing> 3156 16342 erwannc - <property name="padding">0</property> 3157 16342 erwannc - <property name="expand">False</property> 3158 16342 erwannc - <property name="fill">False</property> 3159 16342 erwannc - </packing> 3160 16342 erwannc - </child> 3161 16342 erwannc - 3162 16342 erwannc - <child> 3163 16342 erwannc - <widget class="GtkAlignment" id="alignment1"> 3164 16342 erwannc - <property name="visible">True</property> 3165 16342 erwannc - <property name="xalign">0.5</property> 3166 16342 erwannc - <property name="yalign">0.5</property> 3167 16342 erwannc - <property name="xscale">1</property> 3168 16342 erwannc - <property name="yscale">1</property> 3169 16342 erwannc - <property name="top_padding">0</property> 3170 16342 erwannc - <property name="bottom_padding">0</property> 3171 16342 erwannc - <property name="left_padding">12</property> 3172 16342 erwannc - <property name="right_padding">0</property> 3173 16342 erwannc - 3174 16342 erwannc - <child> 3175 16342 erwannc - <widget class="GtkVBox" id="vbox16"> 3176 16342 erwannc - <property name="visible">True</property> 3177 16342 erwannc - <property name="homogeneous">False</property> 3178 16342 erwannc - <property name="spacing">6</property> 3179 16342 erwannc - 3180 16342 erwannc - <child> 3181 16342 erwannc - <widget class="GtkHBox" id="hbox35"> 3182 16342 erwannc - <property name="visible">True</property> 3183 16342 erwannc - <property name="homogeneous">False</property> 3184 16342 erwannc - <property name="spacing">12</property> 3185 16342 erwannc - 3186 16342 erwannc - <child> 3187 16342 erwannc - <widget class="GtkLabel" id="views_label_2"> 3188 16342 erwannc - <property name="visible">True</property> 3189 16342 erwannc - <property name="label" translatable="yes">Default _zoom level:</property> 3190 16342 erwannc - <property name="use_underline">True</property> 3191 16342 erwannc - <property name="use_markup">False</property> 3192 16342 erwannc - <property name="justify">GTK_JUSTIFY_LEFT</property> 3193 16342 erwannc - <property name="wrap">False</property> 3194 16342 erwannc - <property name="selectable">False</property> 3195 16342 erwannc - <property name="xalign">0</property> 3196 16342 erwannc - <property name="yalign">0.5</property> 3197 16342 erwannc - <property name="xpad">0</property> 3198 16342 erwannc - <property name="ypad">0</property> 3199 16342 erwannc - <property name="mnemonic_widget">icon_view_zoom_combobox</property> 3200 16342 erwannc - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3201 16342 erwannc - <property name="width_chars">-1</property> 3202 16342 erwannc - <property name="single_line_mode">False</property> 3203 16342 erwannc - <property name="angle">0</property> 3204 16342 erwannc - </widget> 3205 16342 erwannc - <packing> 3206 16342 erwannc - <property name="padding">0</property> 3207 16342 erwannc - <property name="expand">False</property> 3208 16342 erwannc - <property name="fill">False</property> 3209 16342 erwannc - </packing> 3210 16342 erwannc - </child> 3211 16342 erwannc - 3212 16342 erwannc - <child> 3213 16342 erwannc - <widget class="GtkComboBox" id="icon_view_zoom_combobox"> 3214 16342 erwannc - <property name="visible">True</property> 3215 16342 erwannc - <property name="items" translatable="yes">33% 3216 16342 erwannc + </widget> 3217 16342 erwannc + <packing> 3218 16342 erwannc + <property name="position">1</property> 3219 16342 erwannc + </packing> 3220 16342 erwannc + </child> 3221 16342 erwannc + </widget> 3222 16342 erwannc + <packing> 3223 16342 erwannc + <property name="position">1</property> 3224 16342 erwannc + </packing> 3225 16342 erwannc + </child> 3226 16342 erwannc + <child> 3227 16342 erwannc + <widget class="GtkCheckButton" id="sort_folders_first_checkbutton"> 3228 16342 erwannc + <property name="visible">True</property> 3229 16342 erwannc + <property name="can_focus">True</property> 3230 16342 erwannc + <property name="label" translatable="yes">Sort _folders before files</property> 3231 16342 erwannc + <property name="use_underline">True</property> 3232 16342 erwannc + <property name="response_id">0</property> 3233 16342 erwannc + <property name="draw_indicator">True</property> 3234 16342 erwannc + </widget> 3235 16342 erwannc + <packing> 3236 16342 erwannc + <property name="expand">False</property> 3237 16342 erwannc + <property name="fill">False</property> 3238 16342 erwannc + <property name="position">2</property> 3239 16342 erwannc + </packing> 3240 16342 erwannc + </child> 3241 16342 erwannc + <child> 3242 16342 erwannc + <widget class="GtkCheckButton" id="hidden_files_checkbutton"> 3243 16342 erwannc + <property name="visible">True</property> 3244 16342 erwannc + <property name="can_focus">True</property> 3245 16342 erwannc + <property name="label" translatable="yes">Show hidden and _backup files</property> 3246 16342 erwannc + <property name="use_underline">True</property> 3247 16342 erwannc + <property name="response_id">0</property> 3248 16342 erwannc + <property name="draw_indicator">True</property> 3249 16342 erwannc + </widget> 3250 16342 erwannc + <packing> 3251 16342 erwannc + <property name="expand">False</property> 3252 16342 erwannc + <property name="fill">False</property> 3253 16342 erwannc + <property name="position">3</property> 3254 16342 erwannc + </packing> 3255 16342 erwannc + </child> 3256 16342 erwannc + </widget> 3257 16342 erwannc + </child> 3258 16342 erwannc + </widget> 3259 16342 erwannc + <packing> 3260 16342 erwannc + <property name="position">1</property> 3261 16342 erwannc + </packing> 3262 16342 erwannc + </child> 3263 16342 erwannc + </widget> 3264 16342 erwannc + <packing> 3265 16342 erwannc + <property name="expand">False</property> 3266 16342 erwannc + </packing> 3267 16342 erwannc + </child> 3268 16342 erwannc + <child> 3269 16342 erwannc + <widget class="GtkVBox" id="vbox3"> 3270 16342 erwannc + <property name="visible">True</property> 3271 16342 erwannc + <property name="spacing">6</property> 3272 16342 erwannc + <child> 3273 16342 erwannc + <widget class="GtkLabel" id="label5"> 3274 16342 erwannc + <property name="visible">True</property> 3275 16342 erwannc + <property name="xalign">0</property> 3276 16342 erwannc + <property name="label" translatable="yes"><b>Icon View Defaults</b></property> 3277 16342 erwannc + <property name="use_markup">True</property> 3278 16342 erwannc + </widget> 3279 16342 erwannc + <packing> 3280 16342 erwannc + <property name="expand">False</property> 3281 16342 erwannc + <property name="fill">False</property> 3282 16342 erwannc + </packing> 3283 16342 erwannc + </child> 3284 16342 erwannc + <child> 3285 16342 erwannc + <widget class="GtkAlignment" id="alignment1"> 3286 16342 erwannc + <property name="visible">True</property> 3287 16342 erwannc + <property name="left_padding">12</property> 3288 16342 erwannc + <child> 3289 16342 erwannc + <widget class="GtkVBox" id="vbox16"> 3290 16342 erwannc + <property name="visible">True</property> 3291 16342 erwannc + <property name="spacing">6</property> 3292 16342 erwannc + <child> 3293 16342 erwannc + <widget class="GtkHBox" id="hbox35"> 3294 16342 erwannc + <property name="visible">True</property> 3295 16342 erwannc + <property name="spacing">12</property> 3296 16342 erwannc + <child> 3297 16342 erwannc + <widget class="GtkLabel" id="views_label_2"> 3298 16342 erwannc + <property name="visible">True</property> 3299 16342 erwannc + <property name="xalign">0</property> 3300 16342 erwannc + <property name="label" translatable="yes">Default _zoom level:</property> 3301 16342 erwannc + <property name="use_underline">True</property> 3302 16342 erwannc + <property name="mnemonic_widget">icon_view_zoom_combobox</property> 3303 16342 erwannc + </widget> 3304 16342 erwannc + <packing> 3305 16342 erwannc + <property name="expand">False</property> 3306 16342 erwannc + <property name="fill">False</property> 3307 16342 erwannc + </packing> 3308 16342 erwannc + </child> 3309 16342 erwannc + <child> 3310 16342 erwannc + <widget class="GtkComboBox" id="icon_view_zoom_combobox"> 3311 16342 erwannc + <property name="visible">True</property> 3312 16342 erwannc + <property name="items" translatable="yes">33% 3313 16342 erwannc 50% 3314 16342 erwannc 66% 3315 16342 erwannc 100% 3316 16342 erwannc 150% 3317 16342 erwannc 200% 3318 16342 erwannc 400%</property> 3319 16342 erwannc - <property name="add_tearoffs">False</property> 3320 16342 erwannc - <property name="focus_on_click">True</property> 3321 16342 erwannc - </widget> 3322 16342 erwannc - <packing> 3323 16342 erwannc - <property name="padding">0</property> 3324 16342 erwannc - <property name="expand">True</property> 3325 16342 erwannc - <property name="fill">True</property> 3326 16342 erwannc - </packing> 3327 16342 erwannc - </child> 3328 16342 erwannc - </widget> 3329 16342 erwannc - <packing> 3330 16342 erwannc - <property name="padding">0</property> 3331 16342 erwannc - <property name="expand">True</property> 3332 16342 erwannc - <property name="fill">True</property> 3333 16342 erwannc - </packing> 3334 16342 erwannc - </child> 3335 16342 erwannc - 3336 16342 erwannc - <child> 3337 16342 erwannc - <widget class="GtkCheckButton" id="compact_layout_checkbutton"> 3338 16342 erwannc - <property name="visible">True</property> 3339 16342 erwannc - <property name="can_focus">True</property> 3340 16342 erwannc - <property name="label" translatable="yes">_Use compact layout</property> 3341 16342 erwannc - <property name="use_underline">True</property> 3342 16342 erwannc - <property name="relief">GTK_RELIEF_NORMAL</property> 3343 16342 erwannc - <property name="focus_on_click">True</property> 3344 16342 erwannc - <property name="active">False</property> 3345 16342 erwannc - <property name="inconsistent">False</property> 3346 16342 erwannc - <property name="draw_indicator">True</property> 3347 16342 erwannc - </widget> 3348 16342 erwannc - <packing> 3349 16342 erwannc - <property name="padding">0</property> 3350 16342 erwannc - <property name="expand">False</property> 3351 16342 erwannc - <property name="fill">False</property> 3352 16342 erwannc - </packing> 3353 16342 erwannc - </child> 3354 16342 erwannc - 3355 16342 erwannc - <child> 3356 16342 erwannc - <widget class="GtkCheckButton" id="labels_beside_icons_checkbutton"> 3357 16342 erwannc - <property name="visible">True</property> 3358 16342 erwannc - <property name="can_focus">True</property> 3359 16342 erwannc - <property name="label" translatable="yes">_Text beside icons</property> 3360 16342 erwannc - <property name="use_underline">True</property> 3361 16342 erwannc - <property name="relief">GTK_RELIEF_NORMAL</property> 3362 16342 erwannc - <property name="focus_on_click">True</property> 3363 16342 erwannc - <property name="active">False</property> 3364 16342 erwannc - <property name="inconsistent">False</property> 3365 16342 erwannc - <property name="draw_indicator">True</property> 3366 16342 erwannc - </widget> 3367 16342 erwannc - <packing> 3368 16342 erwannc - <property name="padding">0</property> 3369 16342 erwannc - <property name="expand">False</property> 3370 16342 erwannc - <property name="fill">False</property> 3371 16342 erwannc - </packing> 3372 16342 erwannc - </child> 3373 16342 erwannc - </widget> 3374 16342 erwannc - </child> 3375 16342 erwannc - </widget> 3376 16342 erwannc - <packing> 3377 16342 erwannc - <property name="padding">0</property> 3378 16342 erwannc - <property name="expand">True</property> 3379 16342 erwannc - <property name="fill">True</property> 3380 16342 erwannc - </packing> 3381 16342 erwannc - </child> 3382 16342 erwannc - </widget> 3383 16342 erwannc - <packing> 3384 16342 erwannc - <property name="padding">0</property> 3385 16342 erwannc - <property name="expand">False</property> 3386 16342 erwannc - <property name="fill">True</property> 3387 16342 erwannc - </packing> 3388 16342 erwannc - </child> 3389 16342 erwannc - 3390 16342 erwannc - <child> 3391 16342 erwannc - <widget class="GtkVBox" id="vbox"> 3392 16342 erwannc - <property name="visible">True</property> 3393 16342 erwannc - <property name="homogeneous">False</property> 3394 16342 erwannc - <property name="spacing">6</property> 3395 16342 erwannc - 3396 16342 erwannc - <child> 3397 16342 erwannc - <widget class="GtkLabel" id="label"> 3398 16342 erwannc - <property name="visible">True</property> 3399 16342 erwannc - <property name="label" translatable="yes"><b>Compact View Defaults</b></property> 3400 16342 erwannc - <property name="use_underline">False</property> 3401 16342 erwannc - <property name="use_markup">True</property> 3402 16342 erwannc - <property name="justify">GTK_JUSTIFY_LEFT</property> 3403 16342 erwannc - <property name="wrap">False</property> 3404 16342 erwannc - <property name="selectable">False</property> 3405 16342 erwannc - <property name="xalign">0</property> 3406 16342 erwannc - <property name="yalign">0.5</property> 3407 16342 erwannc - <property name="xpad">0</property> 3408 16342 erwannc - <property name="ypad">0</property> 3409 16342 erwannc - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3410 16342 erwannc - <property name="width_chars">-1</property> 3411 16342 erwannc - <property name="single_line_mode">False</property> 3412 16342 erwannc - <property name="angle">0</property> 3413 16342 erwannc - </widget> 3414 16342 erwannc - <packing> 3415 16342 erwannc - <property name="padding">0</property> 3416 16342 erwannc - <property name="expand">False</property> 3417 16342 erwannc - <property name="fill">False</property> 3418 16342 erwannc - </packing> 3419 16342 erwannc - </child> 3420 16342 erwannc - 3421 16342 erwannc - <child> 3422 16342 erwannc - <widget class="GtkAlignment" id="alignment"> 3423 16342 erwannc - <property name="visible">True</property> 3424 16342 erwannc - <property name="xalign">0.5</property> 3425 16342 erwannc - <property name="yalign">0.5</property> 3426 16342 erwannc - <property name="xscale">1</property> 3427 16342 erwannc - <property name="yscale">1</property> 3428 16342 erwannc - <property name="top_padding">0</property> 3429 16342 erwannc - <property name="bottom_padding">0</property> 3430 16342 erwannc - <property name="left_padding">12</property> 3431 16342 erwannc - <property name="right_padding">0</property> 3432 16342 erwannc - 3433 16342 erwannc - <child> 3434 16342 erwannc - <widget class="GtkVBox" id="vbox"> 3435 16342 erwannc - <property name="visible">True</property> 3436 16342 erwannc - <property name="homogeneous">False</property> 3437 16342 erwannc - <property name="spacing">6</property> 3438 16342 erwannc - 3439 16342 erwannc - <child> 3440 16342 erwannc - <widget class="GtkHBox" id="hbox"> 3441 16342 erwannc - <property name="visible">True</property> 3442 16342 erwannc - <property name="homogeneous">False</property> 3443 16342 erwannc - <property name="spacing">12</property> 3444 16342 erwannc - 3445 16342 erwannc - <child> 3446 16342 erwannc - <widget class="GtkLabel" id="views_label_4"> 3447 16342 erwannc - <property name="visible">True</property> 3448 16342 erwannc - <property name="label" translatable="yes">_Default zoom level:</property> 3449 16342 erwannc - <property name="use_underline">True</property> 3450 16342 erwannc - <property name="use_markup">False</property> 3451 16342 erwannc - <property name="justify">GTK_JUSTIFY_LEFT</property> 3452 16342 erwannc - <property name="wrap">False</property> 3453 16342 erwannc - <property name="selectable">False</property> 3454 16342 erwannc - <property name="xalign">0</property> 3455 16342 erwannc - <property name="yalign">0.5</property> 3456 16342 erwannc - <property name="xpad">0</property> 3457 16342 erwannc - <property name="ypad">0</property> 3458 16342 erwannc - <property name="mnemonic_widget">compact_view_zoom_combobox</property> 3459 16342 erwannc - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 3460 16342 erwannc - <property name="width_chars">-1</property> 3461 16342 erwannc - <property name="single_line_mode">False</property> 3462 16342 erwannc - <property name="angle">0</property> 3463 16342 erwannc - </widget> 3464 16342 erwannc - <packing> 3465 16342 erwannc - <property name="padding">0</property> 3466 16342