summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mixgtk/mixgtk.c68
-rw-r--r--mixgtk/mixgtk.h4
-rw-r--r--mixgtk/mixgtk_cmd_dispatcher.c68
-rw-r--r--mixgtk/mixgtk_colorsel.c12
-rw-r--r--mixgtk/mixgtk_colorsel.h4
-rw-r--r--mixgtk/mixgtk_device.c19
-rw-r--r--mixgtk/mixgtk_fontsel.c17
-rw-r--r--mixgtk/mixgtk_gen_handlers.c6
-rw-r--r--mixgtk/mixgtk_input.c7
-rw-r--r--mixgtk/mixgtk_input.h4
-rw-r--r--mixgtk/mixgtk_mixal.c11
-rw-r--r--mixgtk/mixgtk_widgets.c43
-rw-r--r--mixgtk/mixgtk_wm.c15
13 files changed, 182 insertions, 96 deletions
diff --git a/mixgtk/mixgtk.c b/mixgtk/mixgtk.c
index 6089dd2..2f60cb2 100644
--- a/mixgtk/mixgtk.c
+++ b/mixgtk/mixgtk.c
@@ -38,33 +38,11 @@
static const gchar *SPLIT_ARG_ = "-s";
static const gchar *SPLIT_LONG_ARG_ = "--s";
-/* initialise the app */
gboolean
-mixgtk_init (int argc, char *argv[])
+mixgtk_restart (gboolean split)
{
mix_vm_t *vm;
- gboolean split = FALSE;
- gint k;
-
- mix_init_lib ();
-
- if (!mixgtk_config_load ())
- {
- g_error ("Unable to read configuration\n");
- return FALSE;
- }
- for (k = 0; k < argc; ++k)
- if (!strcmp (argv[k], SPLIT_ARG_) || !strcmp (argv[k], SPLIT_LONG_ARG_))
- {
- split = TRUE;
- break;
- }
- if (!split && mixgtk_config_is_split ()) split = TRUE;
- mixgtk_config_set_split (split);
-
- gtk_init (&argc, &argv);
-
if (!mixgtk_widget_factory_init (split))
{
g_error ("Unable to initialise application: missing glade file");
@@ -77,9 +55,6 @@ mixgtk_init (int argc, char *argv[])
return FALSE;
}
- if (split)
- gtk_widget_show (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN));
-
vm = mixgtk_cmd_dispatcher_get_vm ();
if (!mixgtk_mixvm_init (vm, MIXGTK_MIXVM_DIALOG))
@@ -108,19 +83,50 @@ mixgtk_init (int argc, char *argv[])
g_error ("Unable to initialise application (visibility)\n");
return FALSE;
}
-
+
+ mixgtk_input_init ();
+ mixgtk_colorsel_init ();
mixgtk_fontsel_load_defaults (split);
-
+
+ gtk_widget_show (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN));
+ mixgtk_mixvm_update_vm_widgets ();
+
return TRUE;
}
+/* initialise the app */
+gboolean
+mixgtk_init (int argc, char *argv[])
+{
+ gboolean split = FALSE;
+ gint k;
+
+ mix_init_lib ();
+
+ if (!mixgtk_config_load ())
+ {
+ g_error ("Unable to read configuration\n");
+ return FALSE;
+ }
+
+ for (k = 0; k < argc; ++k)
+ if (!strcmp (argv[k], SPLIT_ARG_) || !strcmp (argv[k], SPLIT_LONG_ARG_))
+ {
+ split = TRUE;
+ break;
+ }
+ if (!split && mixgtk_config_is_split ()) split = TRUE;
+ mixgtk_config_set_split (split);
+
+ gtk_init (&argc, &argv);
+
+ return mixgtk_restart (split);
+}
+
/* main loop */
void
mixgtk_main (void)
{
- gtk_widget_show (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN));
- mixgtk_mixvm_update_vm_widgets ();
-
gtk_main ();
}
diff --git a/mixgtk/mixgtk.h b/mixgtk/mixgtk.h
index 403847c..e26302e 100644
--- a/mixgtk/mixgtk.h
+++ b/mixgtk/mixgtk.h
@@ -35,6 +35,10 @@
extern gboolean
mixgtk_init (int argc, char *argv[]);
+/* restart the gui */
+extern gboolean
+mixgtk_restart (gboolean split);
+
/* enter the main mixgtk loop */
extern void
mixgtk_main (void);
diff --git a/mixgtk/mixgtk_cmd_dispatcher.c b/mixgtk/mixgtk_cmd_dispatcher.c
index 024c09d..f034cd3 100644
--- a/mixgtk/mixgtk_cmd_dispatcher.c
+++ b/mixgtk/mixgtk_cmd_dispatcher.c
@@ -58,6 +58,14 @@ typedef struct mixgtk_dispatch_
static struct mixgtk_dispatch_ dis_data_ = {NULL};
+static GtkWidget *ext_dlg_ = NULL;
+static GtkWidget *ed_entry_ = NULL;
+static GtkWidget *asm_entry_ = NULL;
+
+static const gchar *ED_NAME_ = "editor_entry";
+static const gchar *ASM_NAME_ = "mixasm_entry";
+
+
static void
log_command_ (mixgtk_dispatch_data_t *dis, const gchar *cmd)
{
@@ -247,13 +255,6 @@ read_config_ (void)
}
-static GtkWidget *ext_dlg_ = NULL;
-static GtkWidget *ed_entry_ = NULL;
-static GtkWidget *asm_entry_ = NULL;
-
-static const gchar *ED_NAME_ = "editor_entry";
-static const gchar *ASM_NAME_ = "mixasm_entry";
-
void
on_external_programs_activate ()
{
@@ -298,24 +299,27 @@ on_extern_ok_button_clicked ()
gboolean
mixgtk_cmd_dispatcher_init (mixgtk_dialog_id_t top)
{
- if (!dis_data_.prompt)
- {
- dis_data_.prompt =
- mixgtk_widget_factory_get (top, MIXGTK_WIDGET_PROMPT);
- g_return_val_if_fail (dis_data_.prompt != NULL, FALSE);
- dis_data_.log =
- mixgtk_widget_factory_get (top, MIXGTK_WIDGET_LOG);
- g_return_val_if_fail (dis_data_.log != NULL, FALSE);
- }
+ static gboolean restart = FALSE;
+
+ ext_dlg_ = NULL;
+ ed_entry_ = NULL;
+ asm_entry_ = NULL;
+
+ dis_data_.prompt =
+ mixgtk_widget_factory_get (top, MIXGTK_WIDGET_PROMPT);
+ g_return_val_if_fail (dis_data_.prompt != NULL, FALSE);
+ dis_data_.log =
+ mixgtk_widget_factory_get (top, MIXGTK_WIDGET_LOG);
+ g_return_val_if_fail (dis_data_.log != NULL, FALSE);
if (!dis_data_.dispatcher)
{
int r = pipe (dis_data_.fildes);
g_return_val_if_fail (r == 0, FALSE);
- /* connect stdout/stderr to the pipe's write end */
+ /* connect stdout/stderr to the pipe's write end
if (dup2 (dis_data_.fildes[1], STDOUT_FILENO) == -1
|| dup2 (dis_data_.fildes[1], STDERR_FILENO) == -1)
- return FALSE;
+ return FALSE;*/
dis_data_.out = fdopen (dis_data_.fildes[1], "w");
g_return_val_if_fail (dis_data_.out != NULL, FALSE);
r = fcntl (dis_data_.fildes[0], F_GETFL, 0);
@@ -330,24 +334,24 @@ mixgtk_cmd_dispatcher_init (mixgtk_dialog_id_t top)
install_hooks_ ();
}
- if (!dis_data_.status)
- {
- dis_data_.status =
- mixgtk_widget_factory_get (MIXGTK_MAIN, MIXGTK_WIDGET_STATUSBAR);
- g_return_val_if_fail (dis_data_.status != NULL, FALSE);
- dis_data_.context = gtk_statusbar_get_context_id (GTK_STATUSBAR
- (dis_data_.status),
- "cmd_dis_context");
- }
-
+ dis_data_.status =
+ mixgtk_widget_factory_get (MIXGTK_MAIN, MIXGTK_WIDGET_STATUSBAR);
+ g_return_val_if_fail (dis_data_.status != NULL, FALSE);
+ dis_data_.context = gtk_statusbar_get_context_id (GTK_STATUSBAR
+ (dis_data_.status),
+ "cmd_dis_context");
if (!dis_data_.completions) init_completions_ ();
- read_config_ ();
+ if (!restart) read_config_ ();
#ifdef HAVE_LIBHISTORY
- using_history ();
- stifle_history (MAX_HISTORY_);
+ if (!restart)
+ {
+ using_history ();
+ stifle_history (MAX_HISTORY_);
+ }
#endif
-
+
+ restart = TRUE;
return TRUE;
}
diff --git a/mixgtk/mixgtk_colorsel.c b/mixgtk/mixgtk_colorsel.c
index b40f6d2..c257255 100644
--- a/mixgtk/mixgtk_colorsel.c
+++ b/mixgtk/mixgtk_colorsel.c
@@ -49,7 +49,17 @@ typedef struct
static area_id_t areas_[LNO_][ZNO_];
static area_id_t *current_ = NULL;
-static GtkWidget *colorseldlg_ = NULL;
+static GtkWidget *colorseldlg_ = NULL;
+
+
+void
+mixgtk_colorsel_init (void)
+{
+ color_dialog_ = NULL;
+ colorseldlg_ = NULL;
+ current_ = NULL;
+}
+
static void
set_area_color_ (GtkWidget *area, const GdkColor *color)
{
diff --git a/mixgtk/mixgtk_colorsel.h b/mixgtk/mixgtk_colorsel.h
index 99253a7..0b30427 100644
--- a/mixgtk/mixgtk_colorsel.h
+++ b/mixgtk/mixgtk_colorsel.h
@@ -27,9 +27,9 @@
#include <gtk/gtk.h>
-/* gtk callbacks */
+/* init */
extern void
-on_colors_activate (GtkWidget *w, gpointer p);
+mixgtk_colorsel_init (void);
#endif /* MIXGTK_COLORSEL_H */
diff --git a/mixgtk/mixgtk_device.c b/mixgtk/mixgtk_device.c
index 18bc121..ac0092d 100644
--- a/mixgtk/mixgtk_device.c
+++ b/mixgtk/mixgtk_device.c
@@ -36,6 +36,13 @@ static const gchar *DEV_FORMAT_KEY_ = "Device.format";
/* device container */
static GtkNotebook *container_ = NULL;
+/** configuration stuff */
+#define LAST_BIN_DEV_ mix_dev_DISK_7
+static GtkWidget *devdlg_ = NULL;
+static GtkWidget *dtoggle_ = NULL;
+static GtkWidget *wtoggle_ = NULL;
+static GtkWidget *combo_ = NULL;
+
static gint last_pos_ = 0;
/* virtual machine */
static mix_vm_t *vm_ = NULL;
@@ -323,6 +330,11 @@ mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm)
g_return_val_if_fail (vm != NULL, FALSE);
container_ = container;
vm_ = vm;
+ /** configuration stuff */
+ devdlg_ = NULL;
+ dtoggle_ = NULL;
+ wtoggle_ = NULL;
+ combo_ = NULL;
/* remove dummy page from container */
gtk_notebook_remove_page (container_, 0);
@@ -367,13 +379,6 @@ mixgtk_device_set_format (mix_device_type_t dev, gboolean dec)
}
-/** configuration stuff */
-#define LAST_BIN_DEV_ mix_dev_DISK_7
-static GtkWidget *devdlg_ = NULL;
-static GtkWidget *dtoggle_ = NULL;
-static GtkWidget *wtoggle_ = NULL;
-static GtkWidget *combo_ = NULL;
-
static mix_device_type_t
get_device_idx_ (void)
{
diff --git a/mixgtk/mixgtk_fontsel.c b/mixgtk/mixgtk_fontsel.c
index ffb2209..a72c5e7 100644
--- a/mixgtk/mixgtk_fontsel.c
+++ b/mixgtk/mixgtk_fontsel.c
@@ -46,7 +46,15 @@ static mixgtk_widget_id_t widget_ids_[] = {
MIXGTK_WIDGET_DEVICE
};
-static mixgtk_dialog_id_t dialog_ids_[] = {
+static mixgtk_dialog_id_t dialog_ids_no_split_[] = {
+ MIXGTK_MAIN,
+ MIXGTK_MAIN,
+ MIXGTK_MAIN,
+ MIXGTK_MAIN,
+ MIXGTK_MAIN,
+};
+
+static mixgtk_dialog_id_t dialog_ids_split_[] = {
MIXGTK_MIXVM_DIALOG,
MIXGTK_MAIN,
MIXGTK_MAIN,
@@ -54,6 +62,8 @@ static mixgtk_dialog_id_t dialog_ids_[] = {
MIXGTK_DEVICES_DIALOG
};
+static mixgtk_dialog_id_t *dialog_ids_ = NULL;
+
static const gchar *keys_[] = {
"MIX.font", "Prompt.font", "Log.font", "MIXAL.font", "Device.font"
};
@@ -92,9 +102,10 @@ mixgtk_fontsel_load_defaults (gboolean split)
{
int i;
const gchar *font = NULL;
+ fontsel_dialog_ = NULL;
+ if (winfo_) g_hash_table_destroy (winfo_);
winfo_ = g_hash_table_new (NULL, NULL);
- if (!split)
- for (i - 0; i < WIDGET_NO_; ++i) dialog_ids_[i] = MIXGTK_MAIN;
+ dialog_ids_ = split? dialog_ids_split_ : dialog_ids_no_split_;
for (i = 0; i < WIDGET_NO_; ++i)
{
infos_[i].widget =
diff --git a/mixgtk/mixgtk_gen_handlers.c b/mixgtk/mixgtk_gen_handlers.c
index 983c16c..63314f1 100644
--- a/mixgtk/mixgtk_gen_handlers.c
+++ b/mixgtk/mixgtk_gen_handlers.c
@@ -123,12 +123,6 @@ on_file_compile_activate (GtkWidget *w, gpointer data)
}
void
-on_main_window_destroy (GtkWidget *w, gpointer data)
-{
- gtk_main_quit ();
-}
-
-void
on_debug_run_activate (GtkWidget *w, gpointer p)
{
mixgtk_cmd_dispatcher_dispatch (mix_vm_command_to_string (MIX_CMD_RUN));
diff --git a/mixgtk/mixgtk_input.c b/mixgtk/mixgtk_input.c
index 95c697a..6a04a75 100644
--- a/mixgtk/mixgtk_input.c
+++ b/mixgtk/mixgtk_input.c
@@ -42,6 +42,13 @@ static GtkWidget *childs_[SIZE_];
static input_callback_t callback_;
static gpointer data_;
+/* init */
+void
+mixgtk_input_init (void)
+{
+ dialog_ = NULL;
+}
+
static void
init_dialog_ (void)
{
diff --git a/mixgtk/mixgtk_input.h b/mixgtk/mixgtk_input.h
index 61ea2a5..7332ccd 100644
--- a/mixgtk/mixgtk_input.h
+++ b/mixgtk/mixgtk_input.h
@@ -30,6 +30,10 @@
/* callback function type */
typedef void (*input_callback_t)(mix_word_t result, gpointer data);
+/* init */
+extern void
+mixgtk_input_init (void);
+
/* get a word */
extern void
mixgtk_input_word (const gchar *message, mix_word_t def,
diff --git a/mixgtk/mixgtk_mixal.c b/mixgtk/mixgtk_mixal.c
index 73e9fc0..d79e601 100644
--- a/mixgtk/mixgtk_mixal.c
+++ b/mixgtk/mixgtk_mixal.c
@@ -32,7 +32,7 @@
#define MIXAL_TAB_POS_ 2
-static mix_vm_t *vm_;
+static mix_vm_t *vm_ = NULL;
static GtkCList *clist_;
static gulong lineno_;
static GtkStatusbar *status_;
@@ -133,7 +133,6 @@ mixgtk_mixal_init (mix_vm_t *vm, mixgtk_dialog_id_t top)
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);
@@ -142,6 +141,8 @@ mixgtk_mixal_init (mix_vm_t *vm, mixgtk_dialog_id_t top)
g_return_val_if_fail (status_ != NULL, FALSE);
status_context_ = gtk_statusbar_get_context_id (status_, "MIXAL status");
+ symbols_dlg_ = symbols_clist_ = NULL;
+
/* allocate colors */
colormap_ = gtk_widget_get_colormap (GTK_WIDGET (clist_));
for (i = 0; i < 3; ++i)
@@ -160,6 +161,12 @@ mixgtk_mixal_init (mix_vm_t *vm, mixgtk_dialog_id_t top)
FALSE);
}
}
+
+ if (!vm_)
+ vm_ = vm;
+ else
+ mixgtk_mixal_load_file ();
+
return TRUE;
}
diff --git a/mixgtk/mixgtk_widgets.c b/mixgtk/mixgtk_widgets.c
index 243c6b3..95fd6f0 100644
--- a/mixgtk/mixgtk_widgets.c
+++ b/mixgtk/mixgtk_widgets.c
@@ -46,6 +46,7 @@ static const gchar * dnames_[] = {
};
const gchar *SPLIT_MAIN_NAME_ = "split_main_window";
+const gchar *MAIN_NAME_ = "main_window";
#define DLG_NO_ (sizeof (dnames_) / sizeof(dnames_[0]))
@@ -134,20 +135,38 @@ mixgtk_widget_factory_init (gboolean split)
const gchar *glade_file = GLADE_FILE;
const gchar *local_glade_file = LOCAL_GLADE_FILE;
FILE *f;
+
+ about_ = NULL;
+
+ if (!file_)
+ {
+ glade_init ();
+ f = fopen (glade_file, "r");
+ if (!f) {
+ f = fopen (local_glade_file, "r");
+ if (!f) return FALSE;
+ glade_file = local_glade_file;
+ }
+ fclose (f);
+ file_ = g_strdup (glade_file);
+ }
+ else
+ {
+ gint k;
+ for (k = 0; k < DLG_NO_; ++k)
+ {
+ if (xml_[k])
+ {
+ if (k != MIXGTK_MAIN)
+ gtk_widget_destroy (mixgtk_widget_factory_get_dialog (k));
+ xml_[k] = NULL;
+ }
+ }
+ }
- glade_init ();
split_ = split;
-
- f = fopen (glade_file, "r");
- if (!f) {
- f = fopen (local_glade_file, "r");
- if (!f) return FALSE;
- glade_file = local_glade_file;
- }
- fclose (f);
- file_ = g_strdup (glade_file);
-
- if (split_) dnames_[MIXGTK_MAIN] = SPLIT_MAIN_NAME_;
+
+ dnames_[MIXGTK_MAIN] = split_? SPLIT_MAIN_NAME_ : MAIN_NAME_;
init_xml_ (MIXGTK_MAIN);
init_autosave_ ();
diff --git a/mixgtk/mixgtk_wm.c b/mixgtk/mixgtk_wm.c
index 2666180..0804cc3 100644
--- a/mixgtk/mixgtk_wm.c
+++ b/mixgtk/mixgtk_wm.c
@@ -121,10 +121,14 @@ on_view_toggled (GtkCheckMenuItem *item)
mixgtk_wm_hide_window (k);
}
+static gboolean restart_ = FALSE;
+
void
on_split_windows_toggled (GtkCheckMenuItem *item)
{
mixgtk_config_set_split (item->active);
+ restart_ = TRUE;
+ gtk_widget_destroy (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN));
}
void
@@ -137,3 +141,14 @@ on_window_hide (GtkWidget *w)
mixgtk_wm_hide_window (k);
}
+void
+on_main_window_destroy (GtkWidget *w, gpointer data)
+{
+ if (restart_)
+ {
+ restart_ = FALSE;
+ mixgtk_restart (mixgtk_config_is_split ());
+ }
+ else gtk_main_quit ();
+}
+