From 2c92c7e85faa068d4037c361df91ebed79e87916 Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Thu, 24 Jun 2004 01:40:46 +0000 Subject: almost complete (barring bugs) reimplementation of all gmixvm functionality in non-split mode for gtk 2.0. --- mixgtk/mixgtk_device.c | 279 +++++++++++++++++++++++++------------------------ 1 file changed, 145 insertions(+), 134 deletions(-) (limited to 'mixgtk/mixgtk_device.c') diff --git a/mixgtk/mixgtk_device.c b/mixgtk/mixgtk_device.c index 69faa02..e701728 100644 --- a/mixgtk/mixgtk_device.c +++ b/mixgtk/mixgtk_device.c @@ -1,7 +1,7 @@ /* -*-c-*- ---------------- mixgtk_device.c : * actual types for mixgtk devices * ------------------------------------------------------------------ - * $Id: mixgtk_device.c,v 1.21 2004/06/23 10:50:10 jao Exp $ + * $Id: mixgtk_device.c,v 1.22 2004/06/24 01:40:47 jao Exp $ * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. * @@ -32,6 +32,7 @@ #include "mixgtk.h" #include "mixgtk_gen_handlers.h" #include "mixgtk_widgets.h" +#include "mixgtk_fontsel.h" #include "mixgtk_config.h" #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_device.h" @@ -41,7 +42,8 @@ static const gchar *DEV_FORMAT_KEY_ = "Device.format"; /* device container */ -static GtkNotebook *container_ = NULL; +static GtkContainer *container_ = NULL; +static GtkNotebook *dev_nb_ = NULL; /* devdir dialog */ static GtkWidget *devdir_dlg_ = NULL; static GtkEntry *devdir_entry_ = NULL; @@ -136,12 +138,15 @@ write_bin_ (struct mixgtk_bin_device_t *dev, const mix_word_t *block) dec = IS_DEC(decs_, dev->gtk_device.device.type); - for (k = 0, len = SIZES_[dev->gtk_device.device.type]; k < len; k += 5) + for (k = 0, len = SIZES_[dev->gtk_device.device.type]; + k < len; k += BIN_DEV_COL_) { gtk_list_store_append (store, &iter); - for (col = 0; col < 5; ++col) + for (col = 0; col < BIN_DEV_COL_; ++col) gtk_list_store_set (store, &iter, - col, get_word_string_ (block[k + col], dec), -1); + col, get_word_string_ (block[k + col], dec), + col + BIN_DEV_COL_, (guint)block[k + col], + -1); dev->last_insert++; } } @@ -157,8 +162,8 @@ write_ (mix_device_t *dev, const mix_word_t *block) if (MODES_[dev->type] == mix_dev_CHAR) write_char_ (gtkdev, block); else write_bin_ ((struct mixgtk_bin_device_t *)gtkdev, block); - gtk_notebook_set_current_page (container_, - gtk_notebook_page_num (container_, + gtk_notebook_set_current_page (dev_nb_, + gtk_notebook_page_num (dev_nb_, gtkdev->scroll)); return TRUE; @@ -179,8 +184,9 @@ read_cons_ (mix_word_t *block) g_assert (input_dlg_entry_); } - gtk_widget_show (input_dlg_); - gtk_main (); /* wait until dialog closes */ + gtk_entry_set_text (input_dlg_entry_, ""); + gtk_dialog_run (GTK_DIALOG (input_dlg_)); + gtk_widget_hide (input_dlg_); text = g_strdup_printf ("%-70s", gtk_entry_get_text (input_dlg_entry_)); for (i = 0; i < 70; ++i) for (j = 0; j < 5; ++j) @@ -204,8 +210,8 @@ read_ (mix_device_t *dev, mix_word_t *block) if (MODES_[dev->type] == mix_dev_CHAR) write_char_ (gtkdev, block); else write_bin_ ((struct mixgtk_bin_device_t *)gtkdev, block); - gtk_notebook_set_current_page (container_, - gtk_notebook_page_num (container_, + gtk_notebook_set_current_page (dev_nb_, + gtk_notebook_page_num (dev_nb_, gtkdev->scroll)); return TRUE; } @@ -232,8 +238,8 @@ destroy_ (mix_device_t *dev) g_object_unref ((gpointer)bdev->store); } (DEF_DEV_VTABLE_->destroy) (dev); - gtk_notebook_remove_page (container_, - gtk_notebook_page_num (container_, + gtk_notebook_remove_page (dev_nb_, + gtk_notebook_page_num (dev_nb_, gtkdev->scroll)); } @@ -263,15 +269,17 @@ mixgtk_device_construct_gui_ (struct mixgtk_device_t *dev) { gint k; struct mixgtk_bin_device_t *bindev = (struct mixgtk_bin_device_t *)dev; - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); + GType *types = g_new (GType, BIN_DEV_COL_ * 2); + + for (k = 0; k < BIN_DEV_COL_; ++k) + { + types[k] = G_TYPE_STRING; + types[k + BIN_DEV_COL_] = G_TYPE_UINT; + } + + bindev->store = gtk_list_store_newv (BIN_DEV_COL_ * 2, types); - bindev->store = gtk_list_store_new (5, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING); dev->widget = gtk_tree_view_new_with_model (GTK_TREE_MODEL (bindev->store)); @@ -284,18 +292,54 @@ mixgtk_device_construct_gui_ (struct mixgtk_device_t *dev) gtk_tree_view_column_new_with_attributes ("", renderer, "text", k, NULL)); } + + g_free (types); } g_assert (dev->widget); gtk_container_add (GTK_CONTAINER (dev->scroll), dev->widget); - gtk_notebook_append_page (container_, dev->scroll, label); + gtk_notebook_append_page (dev_nb_, dev->scroll, label); gtk_widget_set_style (dev->widget, - gtk_widget_get_style (GTK_WIDGET (container_))); + gtk_widget_get_style (GTK_WIDGET (dev_nb_))); gtk_widget_show (label); gtk_widget_show (dev->scroll); gtk_widget_show (dev->widget); } +static void +redraw_bin_device_ (struct mixgtk_bin_device_t *dev) +{ + if (dev != NULL) + { + GtkTreeModel *store = GTK_TREE_MODEL (dev->store); + GtkTreeIter iter; + gboolean valid; + + g_assert (store); + + valid = + gtk_tree_model_get_iter_first (store, &iter); + + while (valid) + { + gint k; + guint word; + + for (k = 0; k < BIN_DEV_COL_; ++k) + { + gtk_tree_model_get (store, &iter, k + BIN_DEV_COL_, &word, -1); + gtk_list_store_set (GTK_LIST_STORE (store), &iter, + k, get_word_string_ ((mix_word_t)word, + dev->dec), + -1); + } + valid = gtk_tree_model_iter_next (store, &iter); + } + gtk_widget_queue_draw (((struct mixgtk_device_t *)dev)->widget); + } +} + + /* create a new mixgtk device */ static mix_device_t * mixgtk_device_new_ (mix_device_type_t type) @@ -323,42 +367,12 @@ mixgtk_device_new_ (mix_device_type_t type) return (mix_device_t *)dev; } -static mix_device_t * -mixgtk_device_copy_ (const struct mixgtk_device_t *from) -{ - struct mixgtk_device_t *result = - (struct mixgtk_device_t *)mixgtk_device_new_ (from->device.type); - g_return_val_if_fail (result != NULL, NULL); - if (MODES_[from->device.type] == mix_dev_CHAR) - { - gchar *text = gtk_editable_get_chars (GTK_EDITABLE (from->widget), - 0, -1); - gtk_text_buffer_insert_at_cursor - (gtk_text_view_get_buffer (GTK_TEXT_VIEW (result->widget)), text, -1); - g_free (text); - } - else - { - struct mixgtk_bin_device_t *to = (struct mixgtk_bin_device_t *) result; - struct mixgtk_bin_device_t *fr = (struct mixgtk_bin_device_t *) from; - to->last_insert = fr->last_insert; - to->dec = fr->dec; - gtk_tree_view_set_model (GTK_TREE_VIEW (result->widget), - GTK_TREE_MODEL (fr->store)); - to->store = fr->store; - } - return (mix_device_t *)result; -} - /* init default devices */ gboolean -mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm) +mixgtk_device_init (GtkContainer *container, mix_vm_t *vm) { - gint k = 0; - g_return_val_if_fail (container != NULL, FALSE); g_return_val_if_fail (vm != NULL, FALSE); - container_ = container; vm_ = vm; devdlg_ = NULL; devdir_dlg_ = NULL; @@ -368,27 +382,31 @@ mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm) wtoggle_ = NULL; combo_ = NULL; - /* remove dummy page from container */ - gtk_notebook_remove_page (container_, 0); - - mix_vm_set_device_factory (vm, mixgtk_device_new_); + if (dev_nb_ == NULL) + { + mix_vm_set_device_factory (vm, mixgtk_device_new_); - /* read format configuration */ - if (mixgtk_config_get (DEV_FORMAT_KEY_)) - decs_ = atoi (mixgtk_config_get (DEV_FORMAT_KEY_)); + /* read format configuration */ + if (mixgtk_config_get (DEV_FORMAT_KEY_)) + decs_ = atoi (mixgtk_config_get (DEV_FORMAT_KEY_)); - /* re-create existing devices */ - for (k = 0; k < mix_dev_INVALID; ++k) + dev_nb_ = GTK_NOTEBOOK (gtk_notebook_new ()); + gtk_notebook_set_tab_pos (dev_nb_, GTK_POS_RIGHT); + gtk_notebook_set_scrollable (dev_nb_, TRUE); + gtk_container_add (container, GTK_WIDGET (dev_nb_)); + } + else if (container_) { - mix_device_t *dev = mix_vm_get_device (vm, k); - if (dev != NULL) - { - mix_device_t *newdev = - mixgtk_device_copy_ ((struct mixgtk_device_t *)dev); - mix_vm_connect_device (vm, newdev); - } + gtk_widget_reparent (GTK_WIDGET (dev_nb_), GTK_WIDGET (container)); } + container_ = container; + + gtk_widget_show (GTK_WIDGET (dev_nb_)); + gtk_widget_show (GTK_WIDGET (container_)); + + mixgtk_fontsel_set_font (MIX_FONT_DEVICES, GTK_WIDGET (dev_nb_)); + return TRUE; } @@ -403,34 +421,32 @@ mixgtk_device_set_format (mix_device_type_t dev, gboolean dec) if (changed && (MODES_[dev] == mix_dev_BIN)) { - if (dec) SET_DEC (decs_, dev); - else CLEAR_DEC (decs_, dev); -/* redraw_bin_device_ ((struct mixgtk_bin_device_t *) */ -/* mix_vm_get_device (vm_, dev)); */ + struct mixgtk_bin_device_t *gdev = + (struct mixgtk_bin_device_t *) mix_vm_get_device (vm_, dev); + + if (gdev != NULL) + { + if (dec) SET_DEC (decs_, dev); else CLEAR_DEC (decs_, dev); + gdev->dec = !(gdev->dec); + redraw_bin_device_ (gdev); + } } - } static mix_device_type_t get_device_idx_ (void) { -/* const gchar *name = gtk_entry_get_text */ -/* (GTK_ENTRY (GTK_COMBO (combo_)->entry)); */ -/* /\* inefficient, but the list is short *\/ */ -/* int k; */ -/* for (k = 0; k <= LAST_BIN_DEV_; ++k) */ -/* if (!strcmp (name, DEF_NAMES_[k])) return k; */ -/* g_assert_not_reached (); */ - return 0; + int k; + const gchar *name = gtk_entry_get_text (GTK_ENTRY (GTK_BIN (combo_)->child)); + for (k = 0; k <= LAST_BIN_DEV_; ++k) + if (!strcmp (name, DEF_NAMES_[k])) break; + return k; } static void init_devform_ (void) { - GList *names = NULL; - int k; - devdlg_ = mixgtk_widget_factory_get_dialog (MIXGTK_DEVFORM_DIALOG); g_assert (devdlg_); dtoggle_ = mixgtk_widget_factory_get_child_by_name @@ -442,29 +458,47 @@ init_devform_ (void) combo_ = mixgtk_widget_factory_get_child_by_name (MIXGTK_DEVFORM_DIALOG, "dev_combo"); g_assert (combo_); - - for (k = 0; k <= LAST_BIN_DEV_; ++k) - names = g_list_append (names, (gchar *)DEF_NAMES_[k]); -/* gtk_combo_set_popdown_strings (GTK_COMBO (combo_), names); */ + gtk_editable_set_editable (GTK_EDITABLE (GTK_BIN (combo_)->child), FALSE); } void -on_deventry_changed () +on_dev_combo_changed () { mix_device_type_t dev = get_device_idx_ (); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dtoggle_), - IS_DEC (new_decs_, dev)); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wtoggle_), - !IS_DEC (new_decs_, dev)); + if (dev <= LAST_BIN_DEV_) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dtoggle_), + IS_DEC (new_decs_, dev)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wtoggle_), + !IS_DEC (new_decs_, dev)); + } } void on_devform_activate () { + gint result = GTK_RESPONSE_APPLY; + if (!devdlg_) init_devform_ (); new_decs_ = decs_; - gtk_widget_show (devdlg_); - on_deventry_changed (); + + while (result == GTK_RESPONSE_APPLY) + { + //on_dev_combo_changed (); + result = gtk_dialog_run (GTK_DIALOG (devdlg_)); + if (result != GTK_RESPONSE_CANCEL) + { + int k; + gchar value[20]; + for (k = 0; k <= LAST_BIN_DEV_; ++k) + mixgtk_device_set_format (k, IS_DEC (new_decs_, k)); + decs_ = new_decs_; + g_snprintf (value, 20, "%d", decs_); + mixgtk_config_update (DEV_FORMAT_KEY_, value); + } + } + + gtk_widget_hide (devdlg_); } void @@ -476,31 +510,6 @@ on_decradio_toggled (GtkToggleButton *button) CLEAR_DEC (new_decs_, get_device_idx_ ()); } -void -on_devapp_button_clicked () -{ - int k; - gchar value[20]; - for (k = 0; k <= LAST_BIN_DEV_; ++k) - mixgtk_device_set_format (k, IS_DEC (new_decs_, k)); - decs_ = new_decs_; - g_snprintf (value, 20, "%d", decs_); - mixgtk_config_update (DEV_FORMAT_KEY_, value); -} - -void -on_devok_button_clicked () -{ - on_devapp_button_clicked (); - gtk_widget_hide (devdlg_); -} - -void -on_devcancel_button_clicked () -{ - gtk_widget_hide (devdlg_); -} - void on_devset_button_clicked () { @@ -572,20 +581,22 @@ on_devdir_ok_clicked () } void -on_input_ok_clicked () +on_devices_font_activate () { - gtk_widget_hide (input_dlg_); - gtk_main_quit (); -} + gint no = gtk_notebook_get_n_pages (dev_nb_); + GtkWidget **w = g_new (GtkWidget *, 2 * no + 1); + gint k; -void -on_input_clear_clicked () -{ - gtk_entry_set_text (input_dlg_entry_, ""); -} + w[2 * no] = GTK_WIDGET (dev_nb_); + for (k = 0; k < no; ++k) + { + w[k] = gtk_notebook_get_nth_page (dev_nb_, k); + w[k + no] = gtk_bin_get_child (GTK_BIN (w[k])); + g_assert (w[k]); + g_assert (w[k + no]); + } -void -on_input_entry_activate () -{ - on_input_ok_clicked (); + mixgtk_fontsel_query_font (MIX_FONT_DEVICES, w, 2 * no + 1); + + g_free (w); } -- cgit v1.2.3