summaryrefslogtreecommitdiffhomepage
path: root/mixgtk/mixgtk_mixal.c
diff options
context:
space:
mode:
authorjaortega <jaortega>2001-03-10 02:34:32 +0000
committerjaortega <jaortega>2001-03-10 02:34:32 +0000
commitf40f9b8ac4eedc6b0ed6e5245a093d18710cf918 (patch)
tree6a147c075508fc8c833aba7e30916adaf1ab947d /mixgtk/mixgtk_mixal.c
parent59cc212ebe00245200e5a2d9f2393fbd1ddb4e94 (diff)
downloadmdk-f40f9b8ac4eedc6b0ed6e5245a093d18710cf918.tar.gz
mdk-f40f9b8ac4eedc6b0ed6e5245a093d18710cf918.tar.bz2
gui update
Diffstat (limited to 'mixgtk/mixgtk_mixal.c')
-rw-r--r--mixgtk/mixgtk_mixal.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/mixgtk/mixgtk_mixal.c b/mixgtk/mixgtk_mixal.c
new file mode 100644
index 0000000..d3ce72b
--- /dev/null
+++ b/mixgtk/mixgtk_mixal.c
@@ -0,0 +1,115 @@
+/* -*-c-*- -------------- mixgtk_mixal.c :
+ * Implementation of the functions declared in mixgtk_mixal.h
+ * ------------------------------------------------------------------
+ * Last change: Time-stamp: "01/03/10 02:27:52 jose"
+ * ------------------------------------------------------------------
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#include <stdlib.h>
+#include "mixgtk_widgets.h"
+#include "mixgtk_mixal.h"
+
+static const mix_vm_t *vm_;
+static GtkCList *clist_;
+static gulong lineno_;
+
+
+/* initialise the mixal widgets */
+gboolean
+mixgtk_mixal_init (const mix_vm_t *vm)
+{
+ g_return_val_if_fail (vm != NULL, FALSE);
+ vm_ = vm;
+ clist_ = GTK_CLIST (mixgtk_widget_factory_get (MIXGTK_WIDGET_MIXAL));
+ g_return_val_if_fail (clist_ != NULL, FALSE);
+ return TRUE;
+}
+
+/* load the corresponding mixal file */
+void
+mixgtk_mixal_load_file (void)
+{
+ enum {ADDR_SIZE = 10, CONT_SIZE = 20};
+ static gchar ADDR[ADDR_SIZE], CONT[CONT_SIZE];
+ static const gchar *TEXT[3];
+
+ const mix_src_file_t *file;
+
+ g_assert (vm_);
+ g_assert (clist_);
+
+ gtk_clist_clear (clist_);
+
+ file = mix_vm_get_src_file (vm_);
+ if (file != NULL)
+ {
+ gint k;
+ mix_address_t addr;
+
+ lineno_ = mix_src_file_get_line_no (file);
+
+ gtk_clist_freeze (clist_);
+ for (k = 0; k < lineno_; ++k)
+ {
+ TEXT[0] = TEXT[1] = "";
+ TEXT[2] = mix_src_file_get_line (file, k + 1);
+ addr = mix_vm_get_lineno_address (vm_, k + 1);
+ if (addr != MIX_VM_CELL_NO)
+ {
+ snprintf (ADDR, ADDR_SIZE, "%04d", mix_short_magnitude (addr));
+ mix_word_print_to_buffer (mix_vm_get_addr_contents (vm_, addr),
+ CONT);
+ TEXT[0] = ADDR;
+ TEXT[1] = CONT;
+ }
+ gtk_clist_append (clist_, (gchar **)TEXT);
+ }
+ TEXT[0] = TEXT[1] = TEXT[2] = NULL;
+ gtk_clist_append (clist_, (gchar **)TEXT);
+
+ gtk_clist_thaw (clist_);
+ }
+ else
+ lineno_ = 0;
+}
+
+
+/* update the widgets */
+void
+mixgtk_mixal_update (void)
+{
+ gint addr = 0;
+ gint k = 0;
+ gchar *addrval = NULL;
+
+ g_assert (vm_);
+ g_assert (clist_);
+
+ addr = mix_short_magnitude (mix_vm_get_prog_count (vm_));
+ while (k < lineno_)
+ {
+ gtk_clist_get_text (clist_, k, 0, &addrval);
+ if (addrval && atoi(addrval) == addr) break;
+ ++k;
+ }
+ gtk_clist_select_row (clist_, k, 0);
+ if (gtk_clist_row_is_visible (clist_, k) != GTK_VISIBILITY_FULL)
+ gtk_clist_moveto (clist_, k, 0, 0.25, 0);
+}