From 3cddb9545a4f634b46565717ef0a59a6f4a166ce Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Wed, 23 Jun 2004 10:50:10 +0000 Subject: First, incomplete port to gtk 2.0. Basic functionality in place. --- mixgtk/mixgtk_mixvm.c | 345 +++++++++++++++++++++++++++++--------------------- 1 file changed, 203 insertions(+), 142 deletions(-) (limited to 'mixgtk/mixgtk_mixvm.c') diff --git a/mixgtk/mixgtk_mixvm.c b/mixgtk/mixgtk_mixvm.c index d7f48c8..57fbb90 100644 --- a/mixgtk/mixgtk_mixvm.c +++ b/mixgtk/mixgtk_mixvm.c @@ -1,24 +1,24 @@ /* -*-c-*- -------------- mixgtk_mixvm.c : * Implementation of the functions declared in mixgtk_mixvm.h * ------------------------------------------------------------------ - * $Id: mixgtk_mixvm.c,v 1.10 2002/04/10 23:39:40 jao Exp $ + * $Id: mixgtk_mixvm.c,v 1.11 2004/06/23 10:50:10 jao Exp $ * ------------------------------------------------------------------ - * Copyright (C) 2001, 2002 Free Software Foundation, Inc. - * + * Copyright (C) 2001, 2002, 2004 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 @@ -28,7 +28,9 @@ #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_input.h" -/* register widgets */ + +/* Local variables */ + #define REGISTER_NO_ (MIXGTK_WIDGET_rI6 - MIXGTK_WIDGET_rA + 1) static GtkEntry *reg_entries_[REGISTER_NO_]; @@ -38,7 +40,8 @@ static GtkWidget *goto_ = NULL; static GtkEntry *goto_entry_ = NULL; static GtkToggleButton *over_button_; static GtkToggleButton *cmp_buttons_[3]; -static GtkCList *memory_; +static GtkTreeView *memory_; +static GtkListStore *mem_store_; static GtkLabel *laptime_; static GtkLabel *progtime_; static GtkLabel *uptime_; @@ -46,76 +49,26 @@ static mix_vm_t *vm_; #define GOTO_ENTRY_NAME_ "goto_entry" -static void -init_goto_ (void) -{ - goto_ = mixgtk_widget_factory_get_dialog (MIXGTK_GOTO_DIALOG); - g_assert (goto_ != NULL); - goto_entry_ = GTK_ENTRY (mixgtk_widget_factory_get_child_by_name ( - MIXGTK_GOTO_DIALOG, GOTO_ENTRY_NAME_)); - g_assert (goto_entry_ != NULL); -} - -static void -update_register_ (mixgtk_widget_id_t reg) -{ - static gchar BUFFER[20]; - mix_word_t tipval = MIX_WORD_ZERO; - switch (reg) - { - case MIXGTK_WIDGET_rA: - tipval = mix_vm_get_rA (vm_); - mix_word_print_to_buffer (tipval, BUFFER); - break; - case MIXGTK_WIDGET_rX: - tipval = mix_vm_get_rX (vm_); - mix_word_print_to_buffer (tipval, BUFFER); - break; - case MIXGTK_WIDGET_rJ: - tipval = mix_short_to_word_fast (mix_vm_get_rJ (vm_)); - mix_short_print_to_buffer (mix_vm_get_rJ (vm_), BUFFER); - break; - case MIXGTK_WIDGET_rI1: - case MIXGTK_WIDGET_rI2: - case MIXGTK_WIDGET_rI3: - case MIXGTK_WIDGET_rI4: - case MIXGTK_WIDGET_rI5: - case MIXGTK_WIDGET_rI6: - { - gint k = reg - MIXGTK_WIDGET_rI1 + 1; - tipval = mix_short_to_word_fast (mix_vm_get_rI (vm_, k)); - mix_short_print_to_buffer (mix_vm_get_rI (vm_, k), BUFFER); - } - break; - default: - g_assert_not_reached (); - } - gtk_entry_set_text (reg_entries_[reg - MIXGTK_WIDGET_rA], BUFFER); - g_snprintf (BUFFER, 20, "%s%ld", mix_word_is_negative (tipval)? "-" : "", - mix_word_magnitude (tipval)); - gtk_tooltips_set_tip (tips_, - GTK_WIDGET (reg_entries_[reg - MIXGTK_WIDGET_rA]), - BUFFER, NULL); - -} - - -static void -on_mem_adj_change_ (GtkAdjustment *adj) -{ - mixgtk_mixvm_update_cells (); -} + +/* Static function prototypes */ +static void init_goto_ (void); +static void update_register_ (mixgtk_widget_id_t reg); +static gboolean init_mem_ (mixgtk_dialog_id_t top); + +enum { + MEM_ADDRESS_COL, + MEM_CONTENTS_COL, + MEM_COL_NO +}; + /* initialise the mixvm widgets */ gboolean mixgtk_mixvm_init (mix_vm_t *vm, mixgtk_dialog_id_t top) { int k; - gchar *text[] = {"", ""}; - GtkWidget *scrol; - GtkAdjustment *adj; - + g_return_val_if_fail (vm != NULL, FALSE); vm_ = vm; @@ -152,31 +105,10 @@ mixgtk_mixvm_init (mix_vm_t *vm, mixgtk_dialog_id_t top) g_return_val_if_fail (cmp_buttons_[k] != NULL, FALSE); } - memory_ = GTK_CLIST (mixgtk_widget_factory_get (top, MIXGTK_WIDGET_CELLS)); - g_return_val_if_fail (memory_ != NULL, FALSE); - gtk_clist_set_column_justification (memory_, 0, GTK_JUSTIFY_CENTER); - gtk_clist_set_column_justification (memory_, 1, GTK_JUSTIFY_CENTER); - gtk_clist_freeze (memory_); - for (k = 0; k< MIX_VM_CELL_NO; ++k) - { - gchar buffer[20]; - g_snprintf (buffer, 20, "%04d", k); - text[0] = buffer; - gtk_clist_append (memory_, text); - } - gtk_clist_thaw (memory_); - - scrol = mixgtk_widget_factory_get (top, MIXGTK_WIDGET_CELLS_SCROLL); - g_return_val_if_fail (scrol != NULL, FALSE); - adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrol)); - gtk_signal_connect (GTK_OBJECT (adj), "value_changed", - GTK_SIGNAL_FUNC (on_mem_adj_change_), NULL); - goto_ = NULL; - - return TRUE; -} + return init_mem_ (top); +} /* update register widgets */ void @@ -201,9 +133,9 @@ void mixgtk_mixvm_update_cmp (void) { gint toggle; - + g_assert (cmp_buttons_); - + toggle = mix_vm_get_cmpflag (vm_); gtk_toggle_button_set_active (cmp_buttons_[toggle], TRUE); } @@ -214,33 +146,27 @@ void mixgtk_mixvm_update_cells (void) { static gchar BUFFER[20]; + GtkTreeIter iter; + gboolean valid = + gtk_tree_model_get_iter_first (GTK_TREE_MODEL (mem_store_), &iter); gint k = 0; - - g_assert (memory_); - - gtk_clist_freeze (memory_); - - while (gtk_clist_row_is_visible (memory_, k) == GTK_VISIBILITY_NONE) ++k; - while (gtk_clist_row_is_visible (memory_, k) != GTK_VISIBILITY_NONE) + + while (valid) { - mix_word_print_to_buffer (mix_vm_get_addr_contents (vm_, k), BUFFER); - gtk_clist_set_text (memory_, k, 1, BUFFER); - ++k; + mix_word_print_to_buffer (mix_vm_get_addr_contents (vm_, k++), BUFFER); + gtk_list_store_set (mem_store_, &iter, MEM_CONTENTS_COL, BUFFER, -1); + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (mem_store_), &iter); } - - gtk_clist_thaw (memory_); } void mixgtk_mixvm_update_cells_to_address (gint address) { - g_assert (memory_); + GtkTreePath *path = gtk_tree_path_new_from_indices (address, -1); + if (address >= MIX_VM_CELL_NO) return; - - gtk_clist_freeze (memory_); - gtk_clist_moveto (memory_, address, 0, 0, 0); - gtk_clist_thaw (memory_); - mixgtk_mixvm_update_cells (); + gtk_tree_view_scroll_to_cell (memory_, path, NULL, TRUE, 0, 0); + gtk_tree_path_free (path); } /* update the loc pointer */ @@ -250,9 +176,9 @@ mixgtk_mixvm_update_loc (void) enum {SIZE = 10 }; static gchar BUFFER[SIZE]; mix_short_t locval; - + g_assert (loc_entry_); - + locval = mix_vm_get_prog_count (vm_); g_snprintf (BUFFER, SIZE, "%04d", mix_short_magnitude (locval)); gtk_entry_set_text (loc_entry_, BUFFER); @@ -265,7 +191,7 @@ mixgtk_mixvm_update_times (void) enum {SIZE = 20 }; static gchar BUFFER[SIZE]; gint uptime, progtime, laptime; - + g_assert (uptime_ && progtime_ && laptime_); mixgtk_cmd_dispatcher_get_times (&uptime, &progtime, &laptime); g_snprintf (BUFFER, SIZE, "%d", uptime); @@ -289,7 +215,7 @@ mixgtk_mixvm_update_vm_widgets (void) mixgtk_mixvm_update_times (); } - + /* update cmp flag */ void on_cmp_e_toggled (GtkWidget *widget, gpointer data) @@ -318,15 +244,13 @@ on_overflow_toggled (GtkWidget *widget, gpointer data) mix_vm_set_overflow (vm_, GTK_TOGGLE_BUTTON (widget)->active); } - void -on_loc_arrow_clicked (GtkWidget *widget, gpointer data) +on_loc_arrow_clicked (GtkWidget *widget, gpointer data) { gint address = mix_short_magnitude (mix_vm_get_prog_count (vm_)); mixgtk_mixvm_update_cells_to_address (address); } - static void register_AX_ (mix_word_t w, gpointer reg) { @@ -359,7 +283,7 @@ on_register_click (GtkWidget *w, GdkEvent *e, gpointer data) enum {SIZE = 20}; static gchar BUFFER[SIZE]; gint k; - + if (w == GTK_WIDGET (reg_entries_[0])) mixgtk_input_word (_("Register A"), mix_vm_get_rA (vm_), register_AX_, GINT_TO_POINTER (0)); @@ -379,7 +303,7 @@ on_register_click (GtkWidget *w, GdkEvent *e, gpointer data) break; } } - return FALSE; + return TRUE; } static void @@ -391,39 +315,176 @@ mem_cell_ (mix_word_t w, gpointer a) } void -on_memory_cells_select_row (GtkCList *w, gint row, gint col, - GdkEvent *e, gpointer data) +on_goto_cancel_clicked (GtkWidget *w, gpointer data) { - enum {SIZE = 30}; - static gchar BUFFER[SIZE]; - g_snprintf (BUFFER, SIZE, _("Memory cell no. %d"), row); - mixgtk_input_word (BUFFER, - mix_vm_get_addr_contents (vm_, mix_short_new (row)), - mem_cell_, GINT_TO_POINTER (row)); + gtk_widget_hide (goto_); } void -on_memory_cells_click_column (GtkCList *w, gint row, gpointer data) +on_goto_ok_clicked (GtkWidget *w, gpointer data) +{ + const gchar *txt = gtk_entry_get_text (goto_entry_); + mix_short_t addr = mix_short_new (atoi (txt)); + if (addr < MIX_VM_CELL_NO) + { + gtk_widget_hide (goto_); + mixgtk_mixvm_update_cells_to_address (addr); + } +} + + + +/* static functions */ +static void +init_goto_ (void) +{ + goto_ = mixgtk_widget_factory_get_dialog (MIXGTK_GOTO_DIALOG); + g_assert (goto_ != NULL); + goto_entry_ = + GTK_ENTRY (mixgtk_widget_factory_get_child_by_name (MIXGTK_GOTO_DIALOG, + GOTO_ENTRY_NAME_)); + g_assert (goto_entry_ != NULL); +} + +static void +update_register_ (mixgtk_widget_id_t reg) +{ + static gchar BUFFER[20]; + mix_word_t tipval = MIX_WORD_ZERO; + switch (reg) + { + case MIXGTK_WIDGET_rA: + tipval = mix_vm_get_rA (vm_); + mix_word_print_to_buffer (tipval, BUFFER); + break; + case MIXGTK_WIDGET_rX: + tipval = mix_vm_get_rX (vm_); + mix_word_print_to_buffer (tipval, BUFFER); + break; + case MIXGTK_WIDGET_rJ: + tipval = mix_short_to_word_fast (mix_vm_get_rJ (vm_)); + mix_short_print_to_buffer (mix_vm_get_rJ (vm_), BUFFER); + break; + case MIXGTK_WIDGET_rI1: + case MIXGTK_WIDGET_rI2: + case MIXGTK_WIDGET_rI3: + case MIXGTK_WIDGET_rI4: + case MIXGTK_WIDGET_rI5: + case MIXGTK_WIDGET_rI6: + { + gint k = reg - MIXGTK_WIDGET_rI1 + 1; + tipval = mix_short_to_word_fast (mix_vm_get_rI (vm_, k)); + mix_short_print_to_buffer (mix_vm_get_rI (vm_, k), BUFFER); + } + break; + default: + g_assert_not_reached (); + } + gtk_entry_set_text (reg_entries_[reg - MIXGTK_WIDGET_rA], BUFFER); + g_snprintf (BUFFER, 20, "%s%ld", mix_word_is_negative (tipval)? "-" : "", + mix_word_magnitude (tipval)); + gtk_tooltips_set_tip (tips_, + GTK_WIDGET (reg_entries_[reg - MIXGTK_WIDGET_rA]), + BUFFER, NULL); + +} + + +static void +cells_clicked_ (GtkTreeViewColumn* col, gpointer data) { if (!goto_) init_goto_ (); gtk_widget_show (goto_); } -void -on_goto_cancel_clicked (GtkWidget *w, gpointer data) +static gboolean +cont_clicked_ (GtkWidget *w, GdkEvent *event, gpointer data) { - gtk_widget_hide (goto_); + enum {SIZE = 30}; + static gchar BUFFER[SIZE]; + + if (event->type == GDK_BUTTON_PRESS) + { + GtkTreeIter iter; + GtkTreeModel *model; + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (memory_)); + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + { + gint addr; + + gtk_tree_model_get (model, &iter, MEM_ADDRESS_COL, &addr, -1); + g_snprintf (BUFFER, SIZE, _("Memory cell no. %d"), addr); + mixgtk_input_word + (BUFFER, + mix_vm_get_addr_contents (vm_, mix_short_new (addr)), + mem_cell_, GINT_TO_POINTER (addr)); + } + } + + return FALSE; } -void -on_goto_ok_clicked (GtkWidget *w, gpointer data) + +static gboolean +init_mem_ (mixgtk_dialog_id_t top) { - gchar *txt = gtk_entry_get_text (goto_entry_); - mix_short_t addr = mix_short_new (atoi (txt)); - if (addr < MIX_VM_CELL_NO) + gint k; + GtkTreeIter iter; + GtkCellRenderer *renderer; + GtkTreeViewColumn *col; + + /* model */ + + mem_store_ = gtk_list_store_new (MEM_COL_NO, G_TYPE_INT, G_TYPE_STRING); + + g_assert (mem_store_); + + for (k = 0; k< MIX_VM_CELL_NO; ++k) { - gtk_widget_hide (goto_); - mixgtk_mixvm_update_cells_to_address (addr); + gtk_list_store_append (mem_store_, &iter); + gtk_list_store_set (mem_store_, &iter, + MEM_ADDRESS_COL, k, + MEM_CONTENTS_COL, "+ 00 00 00 00 00", + -1); } + + + /* view */ + + renderer = gtk_cell_renderer_text_new (); + memory_ = GTK_TREE_VIEW (mixgtk_widget_factory_get (top, + MIXGTK_WIDGET_CELLS)); + + g_assert (memory_); + g_assert (renderer); + + gtk_tree_view_set_model (memory_, GTK_TREE_MODEL (mem_store_)); + gtk_tree_view_set_headers_clickable (memory_, TRUE); + g_object_unref (G_OBJECT (mem_store_)); + + col = gtk_tree_view_column_new_with_attributes ("Address", renderer, + "text", 0, NULL); + gtk_tree_view_column_set_clickable (col, TRUE); + g_signal_connect (G_OBJECT (col), "clicked", + G_CALLBACK (cells_clicked_), NULL); + + gtk_tree_view_append_column (memory_, col); + + + col = gtk_tree_view_column_new_with_attributes ("Contents", renderer, + "text", 1, NULL); + gtk_tree_view_column_set_clickable (col, TRUE); + g_signal_connect (G_OBJECT (col), "clicked", + G_CALLBACK (cont_clicked_), NULL); + + gtk_tree_view_append_column (memory_, col); + + g_signal_connect (G_OBJECT (memory_), "event-after", + G_CALLBACK (cont_clicked_), NULL); + + return TRUE; } -- cgit v1.2.3