From 83cc41c0600232d2d9385f84533d80d2adb20106 Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Wed, 27 Jun 2001 22:50:00 +0000 Subject: hot split swap --- mixgtk/mixgtk.c | 8 ++++---- mixgtk/mixgtk.glade | 20 ++++++++++---------- mixgtk/mixgtk.h | 2 +- mixgtk/mixgtk_fontsel.c | 5 ++++- mixgtk/mixgtk_fontsel.h | 2 +- mixgtk/mixgtk_mixal.c | 8 ++++---- mixgtk/mixgtk_mixvm.c | 2 ++ mixgtk/mixgtk_widgets.c | 5 +++-- mixgtk/mixgtk_widgets.h | 2 +- mixgtk/mixgtk_wm.c | 41 ++++++++++++++++++++++++++--------------- 10 files changed, 56 insertions(+), 39 deletions(-) (limited to 'mixgtk') diff --git a/mixgtk/mixgtk.c b/mixgtk/mixgtk.c index 2f60cb2..b94f819 100644 --- a/mixgtk/mixgtk.c +++ b/mixgtk/mixgtk.c @@ -39,11 +39,11 @@ static const gchar *SPLIT_ARG_ = "-s"; static const gchar *SPLIT_LONG_ARG_ = "--s"; gboolean -mixgtk_restart (gboolean split) +mixgtk_restart (void) { mix_vm_t *vm; - if (!mixgtk_widget_factory_init (split)) + if (!mixgtk_widget_factory_init ()) { g_error ("Unable to initialise application: missing glade file"); return FALSE; @@ -86,7 +86,7 @@ mixgtk_restart (gboolean split) mixgtk_input_init (); mixgtk_colorsel_init (); - mixgtk_fontsel_load_defaults (split); + mixgtk_fontsel_load_defaults (); gtk_widget_show (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN)); mixgtk_mixvm_update_vm_widgets (); @@ -120,7 +120,7 @@ mixgtk_init (int argc, char *argv[]) gtk_init (&argc, &argv); - return mixgtk_restart (split); + return mixgtk_restart (); } /* main loop */ diff --git a/mixgtk/mixgtk.glade b/mixgtk/mixgtk.glade index 3d6c39b..f2c8773 100644 --- a/mixgtk/mixgtk.glade +++ b/mixgtk/mixgtk.glade @@ -361,7 +361,7 @@ False - False + True @@ -394,7 +394,7 @@ False - False + True @@ -1507,8 +1507,8 @@ Sun, 24 Jun 2001 12:24:52 GMT - True - False + False + True @@ -1520,8 +1520,8 @@ Sun, 24 Jun 2001 12:25:14 GMT - True - False + False + True @@ -1533,8 +1533,8 @@ Sun, 24 Jun 2001 12:25:38 GMT - True - False + False + True @@ -1759,7 +1759,7 @@ True - False + True @@ -1792,7 +1792,7 @@ False - False + True diff --git a/mixgtk/mixgtk.h b/mixgtk/mixgtk.h index e26302e..ed9973f 100644 --- a/mixgtk/mixgtk.h +++ b/mixgtk/mixgtk.h @@ -37,7 +37,7 @@ mixgtk_init (int argc, char *argv[]); /* restart the gui */ extern gboolean -mixgtk_restart (gboolean split); +mixgtk_restart (void); /* enter the main mixgtk loop */ extern void diff --git a/mixgtk/mixgtk_fontsel.c b/mixgtk/mixgtk_fontsel.c index a72c5e7..7a9b33e 100644 --- a/mixgtk/mixgtk_fontsel.c +++ b/mixgtk/mixgtk_fontsel.c @@ -98,11 +98,14 @@ change_font_ (mixgtk_widget_id_t widget) } void -mixgtk_fontsel_load_defaults (gboolean split) +mixgtk_fontsel_load_defaults (void) { int i; const gchar *font = NULL; + gboolean split = mixgtk_config_is_split (); + fontsel_dialog_ = NULL; + if (winfo_) g_hash_table_destroy (winfo_); winfo_ = g_hash_table_new (NULL, NULL); dialog_ids_ = split? dialog_ids_split_ : dialog_ids_no_split_; diff --git a/mixgtk/mixgtk_fontsel.h b/mixgtk/mixgtk_fontsel.h index 705b369..af09c15 100644 --- a/mixgtk/mixgtk_fontsel.h +++ b/mixgtk/mixgtk_fontsel.h @@ -30,7 +30,7 @@ /* load default (configured) fonts */ extern void -mixgtk_fontsel_load_defaults (gboolean split); +mixgtk_fontsel_load_defaults (void); /* set a widget's font */ extern void diff --git a/mixgtk/mixgtk_mixal.c b/mixgtk/mixgtk_mixal.c index d79e601..eb8c60d 100644 --- a/mixgtk/mixgtk_mixal.c +++ b/mixgtk/mixgtk_mixal.c @@ -130,9 +130,11 @@ init_color_ (GdkColor *c, const gchar *name) gboolean mixgtk_mixal_init (mix_vm_t *vm, mixgtk_dialog_id_t top) { + static gboolean restart = FALSE; int i,j; g_return_val_if_fail (vm != NULL, FALSE); + vm_ = vm; clist_ = GTK_CLIST (mixgtk_widget_factory_get (top, MIXGTK_WIDGET_MIXAL)); g_return_val_if_fail (clist_ != NULL, FALSE); @@ -162,10 +164,8 @@ mixgtk_mixal_init (mix_vm_t *vm, mixgtk_dialog_id_t top) } } - if (!vm_) - vm_ = vm; - else - mixgtk_mixal_load_file (); + if (restart) mixgtk_mixal_load_file (); + else restart = TRUE; return TRUE; } diff --git a/mixgtk/mixgtk_mixvm.c b/mixgtk/mixgtk_mixvm.c index 2b13f18..f929be1 100644 --- a/mixgtk/mixgtk_mixvm.c +++ b/mixgtk/mixgtk_mixvm.c @@ -172,6 +172,8 @@ mixgtk_mixvm_init (mix_vm_t *vm, mixgtk_dialog_id_t top) gtk_signal_connect (GTK_OBJECT (adj), "value_changed", GTK_SIGNAL_FUNC (on_mem_adj_change_), NULL); + goto_ = NULL; + return TRUE; } diff --git a/mixgtk/mixgtk_widgets.c b/mixgtk/mixgtk_widgets.c index 95fd6f0..be4d4ae 100644 --- a/mixgtk/mixgtk_widgets.c +++ b/mixgtk/mixgtk_widgets.c @@ -130,12 +130,13 @@ init_about_ (void) /* create a new factory from an xml glade file */ gboolean -mixgtk_widget_factory_init (gboolean split) +mixgtk_widget_factory_init (void) { const gchar *glade_file = GLADE_FILE; const gchar *local_glade_file = LOCAL_GLADE_FILE; FILE *f; - + gboolean split = mixgtk_config_is_split (); + about_ = NULL; if (!file_) diff --git a/mixgtk/mixgtk_widgets.h b/mixgtk/mixgtk_widgets.h index 6e2f633..1fafc71 100644 --- a/mixgtk/mixgtk_widgets.h +++ b/mixgtk/mixgtk_widgets.h @@ -78,7 +78,7 @@ typedef enum { /* create a new factory from an xml glade file */ extern gboolean -mixgtk_widget_factory_init (gboolean split); +mixgtk_widget_factory_init (void); /* get a dialog */ extern GtkWidget * diff --git a/mixgtk/mixgtk_wm.c b/mixgtk/mixgtk_wm.c index 0804cc3..ce6a6c5 100644 --- a/mixgtk/mixgtk_wm.c +++ b/mixgtk/mixgtk_wm.c @@ -50,14 +50,17 @@ static GtkCheckMenuItem *split_menu_ = NULL; static const gchar *VIEW_YES_ = "Yes"; static const gchar *VIEW_NO_ = "No"; +/* flag marking that we are inside a restart process */ +static gboolean restart_ = FALSE; + gboolean mixgtk_wm_init (void) { + static gboolean restart = FALSE; split_ = mixgtk_config_is_split (); if (split_) { gint i; - const gchar *view; split_menu_ = GTK_CHECK_MENU_ITEM (mixgtk_widget_factory_get_child_by_name (MIXGTK_MAIN, SPLIT_MENU_NAME_)); @@ -72,12 +75,16 @@ mixgtk_wm_init (void) (mixgtk_widget_factory_get_child_by_name (MIXGTK_MAIN, infos_[i].menu_name)); g_return_val_if_fail (infos_[i].menu, FALSE); - view = mixgtk_config_get (infos_[i].config_key); - infos_[i].visible = !view || !strcmp (VIEW_YES_, view); + if (!restart) + { + const gchar *view = mixgtk_config_get (infos_[i].config_key); + infos_[i].visible = !view || !strcmp (VIEW_YES_, view); + } if (infos_[i].visible) gtk_widget_show (infos_[i].widget); gtk_check_menu_item_set_active (infos_[i].menu, infos_[i].visible); } } + restart = TRUE; return TRUE; } @@ -98,7 +105,7 @@ void mixgtk_wm_hide_window (mixgtk_window_id_t w) { g_return_if_fail (w < INF_NO_); - if (infos_[w].visible) + if (infos_[w].visible && !restart_) { infos_[w].visible = FALSE; gtk_check_menu_item_set_active (infos_[w].menu, FALSE); @@ -111,18 +118,22 @@ mixgtk_wm_hide_window (mixgtk_window_id_t w) void on_view_toggled (GtkCheckMenuItem *item) { - gint k; - for (k = 0; k < INF_NO_; ++k) - if (item == infos_[k].menu) break; - g_return_if_fail (k < INF_NO_); - if (item->active) - mixgtk_wm_show_window (k); - else - mixgtk_wm_hide_window (k); + if (!restart_) + { + gint k; + for (k = 0; k < INF_NO_; ++k) + if (item == infos_[k].menu) break; + g_return_if_fail (k < INF_NO_); + if (item->active) + mixgtk_wm_show_window (k); + else + mixgtk_wm_hide_window (k); + mixgtk_config_update (infos_[k].config_key, + (item->active)? VIEW_YES_ : VIEW_NO_); + infos_[k].visible = item->active; + } } -static gboolean restart_ = FALSE; - void on_split_windows_toggled (GtkCheckMenuItem *item) { @@ -146,8 +157,8 @@ on_main_window_destroy (GtkWidget *w, gpointer data) { if (restart_) { + mixgtk_restart (); restart_ = FALSE; - mixgtk_restart (mixgtk_config_is_split ()); } else gtk_main_quit (); } -- cgit v1.2.3