refactor: setup OK acts transactional now; apply staged theme before save, roll back on fail

This commit is contained in:
2026-03-17 11:01:40 -06:00
parent 0cfb63f301
commit b7e4548d2a
3 changed files with 21 additions and 3 deletions

View File

@@ -2193,14 +2193,22 @@ static void
setup_ok_cb (GtkWidget *but, GtkWidget *win) setup_ok_cb (GtkWidget *but, GtkWidget *win)
{ {
PreferencesPersistenceResult save_result; PreferencesPersistenceResult save_result;
struct zoitechatprefs old_prefs;
char buffer[192]; char buffer[192];
theme_preferences_stage_commit (); memcpy (&old_prefs, &prefs, sizeof (prefs));
theme_preferences_stage_apply ();
setup_apply (&setup_prefs); setup_apply (&setup_prefs);
save_result = preferences_persistence_save_all (); save_result = preferences_persistence_save_all ();
gtk_widget_destroy (win);
if (save_result.success) if (save_result.success)
{
theme_preferences_stage_commit ();
gtk_widget_destroy (win);
return; return;
}
memcpy (&prefs, &old_prefs, sizeof (prefs));
theme_preferences_stage_discard ();
if (save_result.partial_failure) if (save_result.partial_failure)
{ {

View File

@@ -188,12 +188,21 @@ theme_preferences_stage_begin (void)
} }
void void
theme_preferences_stage_commit (void) theme_preferences_stage_apply (void)
{ {
if (!theme_preferences_stage.active) if (!theme_preferences_stage.active)
return; return;
theme_preferences_stage_sync_runtime_to_staged (); theme_preferences_stage_sync_runtime_to_staged ();
}
void
theme_preferences_stage_commit (void)
{
if (!theme_preferences_stage.active)
return;
theme_preferences_stage_apply ();
memset (&theme_preferences_stage, 0, sizeof (theme_preferences_stage)); memset (&theme_preferences_stage, 0, sizeof (theme_preferences_stage));
} }

View File

@@ -14,6 +14,7 @@ GtkWidget *theme_preferences_create_color_page (GtkWindow *parent,
gboolean *color_change_flag); gboolean *color_change_flag);
void theme_preferences_apply_to_session (session_gui *gui, InputStyle *input_style); void theme_preferences_apply_to_session (session_gui *gui, InputStyle *input_style);
void theme_preferences_stage_begin (void); void theme_preferences_stage_begin (void);
void theme_preferences_stage_apply (void);
void theme_preferences_stage_commit (void); void theme_preferences_stage_commit (void);
void theme_preferences_stage_discard (void); void theme_preferences_stage_discard (void);