st/theme: Remove entry from files_by_stylesheet after emitting signal
Sincee06109c23c
we keep old theme nodes valid during the emission of the "custom-stylesheets-changed" signal. It turns out that we might still look up the file of a stylesheet using the files_by_stylesheet hashtable during the emission of that signal, causing a crash because the assertion in _st_theme_resolve_url() fails. So fix that and remove the stylesheet entry from the files_by_stylesheet hashtable after emitting the "custom-stylesheets-changed" signal. And to be consistent, also remove the entry from the stylesheets_by_file hashtable after emitting the signal. Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2757 (cherry picked from commit0f947d4ff9
)
This commit is contained in:
parent
28407c95b3
commit
2327fc9287
@ -285,11 +285,15 @@ st_theme_unload_stylesheet (StTheme *theme,
|
||||
return;
|
||||
|
||||
theme->custom_stylesheets = g_slist_remove (theme->custom_stylesheets, stylesheet);
|
||||
g_hash_table_remove (theme->stylesheets_by_file, file);
|
||||
g_hash_table_remove (theme->files_by_stylesheet, stylesheet);
|
||||
|
||||
g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
|
||||
|
||||
/* We need to remove the entry from the hashtable after emitting the signal
|
||||
* since we might still access the files_by_stylesheet hashtable in
|
||||
* _st_theme_resolve_url() during the signal emission.
|
||||
*/
|
||||
g_hash_table_remove (theme->stylesheets_by_file, file);
|
||||
g_hash_table_remove (theme->files_by_stylesheet, stylesheet);
|
||||
cr_stylesheet_unref (stylesheet);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user