Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.3
thunar
thunar-bugfixes.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File thunar-bugfixes.patch of Package thunar
diff -ur old/Thunar-1.6.10/thunar/thunar-file.c new/Thunar-1.6.10/thunar/thunar-file.c --- old/Thunar-1.6.10/thunar/thunar-file.c 2015-05-22 15:25:36.000000000 +0200 +++ new/Thunar-1.6.10/thunar/thunar-file.c 2017-02-23 06:44:06.968364077 +0100 @@ -121,6 +121,7 @@ G_LOCK_DEFINE_STATIC (file_cache_mutex); G_LOCK_DEFINE_STATIC (file_content_type_mutex); +G_LOCK_DEFINE_STATIC (file_rename_mutex); @@ -220,6 +221,22 @@ G_IMPLEMENT_INTERFACE (THUNARX_TYPE_FILE_INFO, thunar_file_info_init)) +static GWeakRef* +weak_ref_new (GObject *obj) +{ + GWeakRef *ref; + ref = g_slice_new (GWeakRef); + g_weak_ref_init (ref, obj); + return ref; +} + +static void +weak_ref_free (GWeakRef *ref) +{ + g_weak_ref_clear (ref); + g_slice_free (GWeakRef, ref); +} + #ifdef G_ENABLE_DEBUG #ifdef HAVE_ATEXIT @@ -235,7 +252,7 @@ gchar *uri; uri = g_file_get_uri (key); - g_print ("--> %s (%u)\n", uri, G_OBJECT (value)->ref_count); + g_print ("--> %s\n", uri); if (G_OBJECT (key)->ref_count > 2) g_print (" GFile (%u)\n", G_OBJECT (key)->ref_count - 2); g_free (uri); @@ -277,7 +294,7 @@ gchar *name; name = g_file_get_parse_name (G_FILE (gfile)); - g_print (" %s (%u)\n", name, G_OBJECT (value)->ref_count); + g_print (" %s\n", name); g_free (name); } @@ -728,7 +745,9 @@ g_object_unref (previous_file); /* insert the new entry */ - g_hash_table_insert (file_cache, g_object_ref (file->gfile), file); + g_hash_table_insert (file_cache, + g_object_ref (file->gfile), + weak_ref_new (G_OBJECT (file))); G_UNLOCK (file_cache_mutex); } @@ -780,7 +799,9 @@ /* the event occurred for the monitored ThunarFile */ if (event_type == G_FILE_MONITOR_EVENT_MOVED) { + G_LOCK (file_rename_mutex); thunar_file_monitor_moved (file, other_path); + G_UNLOCK (file_rename_mutex); return; } @@ -795,13 +816,18 @@ if (event_type == G_FILE_MONITOR_EVENT_MOVED) { /* reload the target file if cached */ + if (other_path == NULL) + return; + + G_LOCK (file_rename_mutex); + other_file = thunar_file_cache_lookup (other_path); if (other_file) thunar_file_reload (other_file); else other_file = thunar_file_get (other_path, NULL); - if (!other_file) + if (other_file == NULL) return; /* notify the thumbnail cache that we can now also move the thumbnail */ @@ -811,13 +837,14 @@ thunar_file_reload_parent (other_file); g_object_unref (other_file); + + G_UNLOCK (file_rename_mutex); } return; } } - static void thunar_file_watch_destroyed (gpointer data) { @@ -1113,11 +1140,9 @@ /* insert the file into the cache */ G_LOCK (file_cache_mutex); -#ifdef G_ENABLE_DEBUG - /* check if there is no instance created in the meantime */ - _thunar_assert (g_hash_table_lookup (file_cache, file->gfile) == NULL); -#endif - g_hash_table_insert (file_cache, g_object_ref (file->gfile), file); + g_hash_table_insert (file_cache, + g_object_ref (file->gfile), + weak_ref_new (G_OBJECT (file))); G_UNLOCK (file_cache_mutex); /* pass the loaded file and possible errors to the return function */ @@ -1239,7 +1264,9 @@ G_LOCK (file_cache_mutex); /* insert the file into the cache */ - g_hash_table_insert (file_cache, g_object_ref (file->gfile), file); + g_hash_table_insert (file_cache, + g_object_ref (file->gfile), + weak_ref_new (G_OBJECT (file))); /* done inserting in the cache */ G_UNLOCK (file_cache_mutex); @@ -1316,7 +1343,9 @@ G_LOCK (file_cache_mutex); /* insert the file into the cache */ - g_hash_table_insert (file_cache, g_object_ref (file->gfile), file); + g_hash_table_insert (file_cache, + g_object_ref (file->gfile), + weak_ref_new (G_OBJECT (file))); /* done inserting in the cache */ G_UNLOCK (file_cache_mutex); @@ -1926,6 +1955,7 @@ } else { + G_LOCK (file_rename_mutex); /* try to rename the file */ renamed_file = g_file_set_display_name (file->gfile, name, cancellable, error); @@ -1942,11 +1972,12 @@ /* emit the file changed signal */ thunar_file_changed (file); } - + G_UNLOCK (file_rename_mutex); return TRUE; } else { + G_UNLOCK (file_rename_mutex); return FALSE; } } @@ -3918,7 +3949,7 @@ gboolean thunar_file_reload (ThunarFile *file) { - _thunar_return_if_fail (THUNAR_IS_FILE (file)); + _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE); /* clear file pxmap cache */ thunar_icon_factory_clear_pixmap_cache (file); @@ -3957,6 +3988,28 @@ /** + * thunar_file_reload_idle_unref: + * @file : a #ThunarFile instance. + * + * Schedules a reload of the @file by calling thunar_file_reload + * when idle. When scheduled function returns @file object will be + * unreferenced. + * + **/ +void +thunar_file_reload_idle_unref (ThunarFile *file) +{ + _thunar_return_if_fail (THUNAR_IS_FILE (file)); + + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + (GSourceFunc) thunar_file_reload, + file, + (GDestroyNotify) g_object_unref); +} + + + +/** * thunar_file_destroy: * @file : a #ThunarFile instance. * @@ -4085,6 +4138,7 @@ ThunarFile * thunar_file_cache_lookup (const GFile *file) { + GWeakRef *ref; ThunarFile *cached_file; _thunar_return_val_if_fail (G_IS_FILE (file), NULL); @@ -4097,18 +4151,15 @@ file_cache = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, (GDestroyNotify) g_object_unref, - NULL); + (GDestroyNotify) weak_ref_free); } - cached_file = g_hash_table_lookup (file_cache, file); + ref = g_hash_table_lookup (file_cache, file); - if (cached_file != NULL) - { - /* take a reference to avoid too-early releases outside the - * file_cache_mutex, resuling in destroyed files being used - * in running code */ - g_object_ref (cached_file); - } + if (ref == NULL) + cached_file = NULL; + else + cached_file = g_weak_ref_get (ref); G_UNLOCK (file_cache_mutex); diff -ur old/Thunar-1.6.10/thunar/thunar-file.h new/Thunar-1.6.10/thunar/thunar-file.h --- old/Thunar-1.6.10/thunar/thunar-file.h 2015-05-22 15:25:36.000000000 +0200 +++ new/Thunar-1.6.10/thunar/thunar-file.h 2017-02-23 06:46:15.929328754 +0100 @@ -241,6 +241,7 @@ gboolean thunar_file_reload (ThunarFile *file); void thunar_file_reload_idle (ThunarFile *file); +void thunar_file_reload_idle_unref (ThunarFile *file); void thunar_file_reload_parent (ThunarFile *file); void thunar_file_destroy (ThunarFile *file); diff -ur old/Thunar-1.6.10/thunar/thunar-folder.c new/Thunar-1.6.10/thunar/thunar-folder.c --- old/Thunar-1.6.10/thunar/thunar-folder.c 2015-05-22 15:25:36.000000000 +0200 +++ new/Thunar-1.6.10/thunar/thunar-folder.c 2017-02-23 06:46:15.929328754 +0100 @@ -276,6 +276,9 @@ { ThunarFolder *folder = THUNAR_FOLDER (object); + if (folder->corresponding_file) + thunar_file_unwatch (folder->corresponding_file); + /* disconnect from the ThunarFileMonitor instance */ g_signal_handlers_disconnect_matched (folder->file_monitor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, folder); g_object_unref (folder->file_monitor); @@ -356,7 +359,11 @@ switch (prop_id) { case PROP_CORRESPONDING_FILE: + if (folder->corresponding_file) + thunar_file_unwatch (folder->corresponding_file); folder->corresponding_file = g_value_dup_object (value); + if (folder->corresponding_file) + thunar_file_watch (folder->corresponding_file); break; case PROP_LOADING: @@ -773,27 +780,30 @@ { /* destroy the old file and update the new one */ thunar_file_destroy (lp->data); - file = thunar_file_get(other_file, NULL); - if (file != NULL && THUNAR_IS_FILE (file)) + if (other_file != NULL) { - thunar_file_reload (file); - - /* if source and target folders are different, also tell - the target folder to reload for the changes */ - if (thunar_file_has_parent (file)) + file = thunar_file_get(other_file, NULL); + if (file != NULL && THUNAR_IS_FILE (file)) { - other_parent = thunar_file_get_parent (file, NULL); - if (other_parent && - !g_file_equal (thunar_file_get_file(folder->corresponding_file), - thunar_file_get_file(other_parent))) + thunar_file_reload (file); + + /* if source and target folders are different, also tell + the target folder to reload for the changes */ + if (thunar_file_has_parent (file)) { - thunar_file_reload (other_parent); - g_object_unref (other_parent); + other_parent = thunar_file_get_parent (file, NULL); + if (other_parent && + !g_file_equal (thunar_file_get_file(folder->corresponding_file), + thunar_file_get_file(other_parent))) + { + thunar_file_reload (other_parent); + g_object_unref (other_parent); + } } - } - /* drop reference on the other file */ - g_object_unref (file); + /* drop reference on the other file */ + g_object_unref (file); + } } /* reload the folder of the source file */ diff -ur old/Thunar-1.6.10/thunar/thunar-job.c new/Thunar-1.6.10/thunar/thunar-job.c --- old/Thunar-1.6.10/thunar/thunar-job.c 2015-05-22 15:25:36.000000000 +0200 +++ new/Thunar-1.6.10/thunar/thunar-job.c 2017-02-23 06:49:04.278653070 +0100 @@ -578,8 +578,7 @@ file = thunar_file_cache_lookup (lp->data); if (file != NULL) { - thunar_file_reload_idle (file); - g_object_unref (file); + thunar_file_reload_idle_unref (file); } } diff -ur old/Thunar-1.6.10/thunar/thunar-standard-view.c new/Thunar-1.6.10/thunar/thunar-standard-view.c --- old/Thunar-1.6.10/thunar/thunar-standard-view.c 2015-05-22 15:25:36.000000000 +0200 +++ new/Thunar-1.6.10/thunar/thunar-standard-view.c 2017-02-23 06:49:04.278653070 +0100 @@ -2167,7 +2167,7 @@ GFile *path; GFile *tmp; - _thunar_return_if_fail (THUNAR_IS_FILE (directory)); + _thunar_return_val_if_fail (THUNAR_IS_FILE (directory), NULL); /* determine the path of the directory */ path = g_object_ref (thunar_file_get_file (directory)); diff -ur old/Thunar-1.6.10/thunar/thunar-window.c new/Thunar-1.6.10/thunar/thunar-window.c --- old/Thunar-1.6.10/thunar/thunar-window.c 2015-05-22 15:25:36.000000000 +0200 +++ new/Thunar-1.6.10/thunar/thunar-window.c 2017-02-23 06:49:04.278653070 +0100 @@ -2759,7 +2759,6 @@ { ThunarFile *file = NULL; ThunarFile *current_directory = NULL; - ThunarHistory *history = NULL; GtkWidget *old_view; GList *selected_files = NULL; @@ -2779,9 +2778,6 @@ /* remember the file selection */ selected_files = thunar_g_file_list_copy (thunar_component_get_selected_files (THUNAR_COMPONENT (old_view))); - /* get a copy of the history */ - history = thunar_standard_view_copy_history (THUNAR_STANDARD_VIEW (old_view)); - /* update the UI (else GtkUIManager will crash on merging) */ gtk_ui_manager_ensure_update (window->ui_manager); } @@ -2822,10 +2818,6 @@ if (gtk_widget_get_visible (GTK_WIDGET (window))) g_object_set (G_OBJECT (window->preferences), "last-view", g_type_name (window->view_type), NULL); - /* use the copy of the old history if available */ - if (history != NULL) - thunar_standard_view_set_history (THUNAR_STANDARD_VIEW (window->view), history); - /* release the file references */ if (G_UNLIKELY (file != NULL)) g_object_unref (G_OBJECT (file));
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor