From d6c479e6fc395506d86e4e3d5b48f2b709cc243f Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Mon, 7 May 2001 23:03:12 +0000 Subject: use of virtual device destructor to delete devices after program reload --- mixgtk/mixgtk_device.c | 99 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 70 insertions(+), 29 deletions(-) (limited to 'mixgtk') diff --git a/mixgtk/mixgtk_device.c b/mixgtk/mixgtk_device.c index 2a31afe..ea84c18 100644 --- a/mixgtk/mixgtk_device.c +++ b/mixgtk/mixgtk_device.c @@ -1,7 +1,7 @@ /* -*-c-*- ---------------- mixgtk_device.c : * actual types for mixgtk devices * ------------------------------------------------------------------ - * Last change: Time-stamp: <2001-05-06 23:34:51 jao> + * Last change: Time-stamp: <2001-05-08 00:58:34 jao> * ------------------------------------------------------------------ * Copyright (C) 2001 Free Software Foundation, Inc. * @@ -27,8 +27,11 @@ #include "mixgtk.h" #include "mixgtk_device.h" +#define BIN_DEV_COL_ 5 + /* device container */ static GtkNotebook *container_ = NULL; +static gint last_pos_ = 0; /* virtual machine */ static mix_vm_t *vm_ = NULL; @@ -36,8 +39,9 @@ static mix_vm_t *vm_ = NULL; struct mixgtk_device_t { mix_device_t device; - GtkText *widget; + GtkWidget *widget; gint pos; + guint last_insert; }; /* callbacks for output devices */ @@ -58,23 +62,27 @@ write_char_ (struct mixgtk_device_t *dev, const mix_word_t *block) BUFFER[5 * k] = '\n'; BUFFER[5 * k + 1] = '\0'; - gtk_text_insert (dev->widget, NULL, NULL, NULL, BUFFER, -1); + gtk_text_insert (GTK_TEXT (dev->widget), NULL, NULL, NULL, BUFFER, -1); } static void write_bin_ (struct mixgtk_device_t *dev, const mix_word_t *block) { - enum {BUFF_SIZE = 17, STEP = 10}; + enum {BUFF_SIZE = 17}; static gchar BUFFER[BUFF_SIZE] = { 0 }; - guint k; + static gchar *DEFTEXT[BIN_DEV_COL_] = { "0", "0", "0", "0", "0" }; + + guint k, col, row; for (k = 0; k < SIZES_[dev->device.type]; k++) { mix_word_print_to_buffer (block[k], BUFFER); - gtk_text_insert (dev->widget, NULL, NULL, NULL, BUFFER, -1); - gtk_text_insert (dev->widget, NULL, NULL, NULL, - ((k+1)%STEP != 0) ? " " : "\n", -1); + row = dev->last_insert / BIN_DEV_COL_; + col = dev->last_insert % BIN_DEV_COL_; + if (col == 0) gtk_clist_append (GTK_CLIST (dev->widget), DEFTEXT); + gtk_clist_set_text (GTK_CLIST (dev->widget), row, col, BUFFER); + dev->last_insert++; } } @@ -123,35 +131,68 @@ busy_ (const mix_device_t *dev) return (DEF_DEV_VTABLE_->busy)(dev); } -static mix_device_vtable_t MIXGTK_VTABLE_ = {write_, read_, ioc_, busy_}; +static void +destroy_ (mix_device_t *dev) +{ + struct mixgtk_device_t *gtkdev = (struct mixgtk_device_t *)dev; + gtk_notebook_remove_page (GTK_NOTEBOOK (container_), gtkdev->pos); + gtk_widget_destroy (gtkdev->widget); + (DEF_DEV_VTABLE_->destroy) (dev); + --last_pos_; +} +static mix_device_vtable_t MIXGTK_VTABLE_ = { + write_, read_, ioc_, busy_, destroy_ +}; /* create the gui part of the device */ static void mixgtk_device_construct_gui_ (struct mixgtk_device_t *dev) { - static gint last_pos = 0; GtkWidget *label = gtk_label_new (DEF_NAMES_[dev->device.type]); - GtkWidget *box = gtk_hbox_new (0, 0); - GtkWidget *scroll = NULL; g_assert (label); - g_assert (box); - - dev->widget = (GtkText *)gtk_text_new (NULL, NULL); - g_assert (dev->widget); - gtk_text_set_editable (dev->widget, FALSE); - - scroll = gtk_vscrollbar_new (dev->widget->vadj); - gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (dev->widget), - TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (box), scroll, FALSE, FALSE, 0); - dev->pos = last_pos++; - gtk_notebook_insert_page (container_, box, label, dev->pos); - gtk_widget_show (box); + + dev->pos = last_pos_++; + if (MODES_[dev->device.type] == mix_dev_CHAR) + { + GtkWidget *box = gtk_hbox_new (0, 0); + GtkWidget *scroll = NULL; + GtkAdjustment *vadj = NULL; + dev->widget = gtk_text_new (NULL, NULL); + g_assert (box); + g_assert (dev->widget); + gtk_text_set_editable (GTK_TEXT (dev->widget), FALSE); + vadj = GTK_TEXT (dev->widget)->vadj; + scroll = gtk_vscrollbar_new (vadj); + gtk_box_pack_start (GTK_BOX (box), dev->widget, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (box), scroll, FALSE, FALSE, 0); + gtk_notebook_insert_page (container_, box, label, dev->pos); + gtk_widget_show (box); + gtk_widget_show (scroll); + } + else + { + gint k; + GtkWidget *scroll = gtk_scrolled_window_new (NULL, NULL); + g_assert (scroll); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + dev->widget = gtk_clist_new (BIN_DEV_COL_); + g_assert (dev->widget); + for (k =0; k < BIN_DEV_COL_; ++k) + { + gtk_clist_set_column_width (GTK_CLIST (dev->widget), k, 100); + gtk_clist_set_column_auto_resize (GTK_CLIST (dev->widget), k, TRUE); + } + gtk_container_add (GTK_CONTAINER (scroll), dev->widget); + gtk_notebook_insert_page (container_, scroll, label, dev->pos); + gtk_widget_show (scroll); + } + gtk_widget_show (label); - gtk_widget_show (scroll); - gtk_widget_show (GTK_WIDGET (dev->widget)); + gtk_widget_show (dev->widget); gtk_widget_draw (GTK_WIDGET (container_), NULL); } @@ -170,7 +211,7 @@ mixgtk_device_new_ (mix_device_type_t type) construct_device_with_name_ (&dev->device, type, name); g_free (name); dev->device.vtable = &MIXGTK_VTABLE_; - + dev->last_insert = 0; mixgtk_device_construct_gui_ (dev); return (mix_device_t *)dev; @@ -181,7 +222,7 @@ gboolean mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm) { static mix_device_type_t def_types[] = { - mix_dev_CONSOLE, mix_dev_INVALID + /* mix_dev_CONSOLE,*/ mix_dev_INVALID }; gint k = 0; -- cgit v1.2.3