From a197db54f62be56f4dfe44bfc1d943052973b5fd 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_device.c | 235 +++++++++++++++++++++---------------------------- 1 file changed, 102 insertions(+), 133 deletions(-) (limited to 'mixgtk/mixgtk_device.c') diff --git a/mixgtk/mixgtk_device.c b/mixgtk/mixgtk_device.c index 5ba3f9f..69faa02 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.20 2004/06/11 23:35:59 jao Exp $ + * $Id: mixgtk_device.c,v 1.21 2004/06/23 10:50:10 jao Exp $ * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. * @@ -56,7 +56,6 @@ 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; /* dec settings */ @@ -73,14 +72,14 @@ struct mixgtk_device_t { mix_device_t device; GtkWidget *widget; - gint pos; + GtkWidget *scroll; }; struct mixgtk_bin_device_t { struct mixgtk_device_t gtk_device; guint last_insert; - GtkWidget *scroll; + GtkListStore *store; gboolean dec; }; @@ -102,7 +101,8 @@ write_char_ (struct mixgtk_device_t *dev, const mix_word_t *block) BUFFER[5 * k] = '\n'; BUFFER[5 * k + 1] = '\0'; - gtk_text_insert (GTK_TEXT (dev->widget), NULL, NULL, NULL, BUFFER, -1); + gtk_text_buffer_insert_at_cursor + (gtk_text_view_get_buffer (GTK_TEXT_VIEW (dev->widget)), BUFFER, -1); } @@ -123,64 +123,29 @@ get_word_string_ (mix_word_t w, gboolean dec) static void write_bin_ (struct mixgtk_bin_device_t *dev, const mix_word_t *block) { - static gchar *DEFTEXT[BIN_DEV_COL_] = { "0", "0", "0", "0", "0" }; - - guint k, col, row; + guint k, col; gboolean dec = FALSE; + size_t len; - GtkCList *list = GTK_CLIST (dev->gtk_device.widget); - - dec = IS_DEC(decs_, dev->gtk_device.device.type); - - gtk_clist_freeze (list); + GtkTreeView *view = GTK_TREE_VIEW (dev->gtk_device.widget); + GtkListStore *store = dev->store; + GtkTreeIter iter; - for (k = 0; k < SIZES_[dev->gtk_device.device.type]; k++) - { - row = dev->last_insert / BIN_DEV_COL_; - col = dev->last_insert % BIN_DEV_COL_; - if (col == 0) - { - int j; - mix_word_t *words = g_new (mix_word_t, 5); - gtk_clist_append (list, DEFTEXT); - for (j = 0; j < 5; ++j) words[j] = block[k + j]; - gtk_clist_set_row_data_full (list, row, (gpointer)words, g_free); - } - gtk_clist_set_text (list, row, col, get_word_string_ (block[k], dec)); - dev->last_insert++; - } + g_assert (view); + g_assert (store); - gtk_clist_thaw (list); -} - -static void -redraw_bin_device_ (struct mixgtk_bin_device_t *dev) -{ - gint k, col, row; - gboolean dec = FALSE; - mix_word_t *words = NULL; - GtkCList *list; - - if (!dev) return; - - list = GTK_CLIST (dev->gtk_device.widget); dec = IS_DEC(decs_, dev->gtk_device.device.type); - gtk_clist_freeze (list); - - for (k = 0; k < dev->last_insert; ++k) + for (k = 0, len = SIZES_[dev->gtk_device.device.type]; k < len; k += 5) { - row = k / BIN_DEV_COL_; - col = k % BIN_DEV_COL_; - if (col == 0) - words = gtk_clist_get_row_data (list, row); - gtk_clist_set_text (list, row, col, get_word_string_ (words[col], dec)); + gtk_list_store_append (store, &iter); + for (col = 0; col < 5; ++col) + gtk_list_store_set (store, &iter, + col, get_word_string_ (block[k + col], dec), -1); + dev->last_insert++; } - - gtk_clist_thaw (list); } - static gboolean write_ (mix_device_t *dev, const mix_word_t *block) { @@ -192,7 +157,9 @@ 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_page (container_, gtkdev->pos); + gtk_notebook_set_current_page (container_, + gtk_notebook_page_num (container_, + gtkdev->scroll)); return TRUE; } @@ -237,8 +204,9 @@ 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_page (container_, gtkdev->pos); - + gtk_notebook_set_current_page (container_, + gtk_notebook_page_num (container_, + gtkdev->scroll)); return TRUE; } @@ -258,12 +226,15 @@ static void destroy_ (mix_device_t *dev) { struct mixgtk_device_t *gtkdev = (struct mixgtk_device_t *)dev; - if (MODES_[dev->type] == mix_dev_BIN) - gtk_widget_destroy (((struct mixgtk_bin_device_t *)dev)->scroll); - gtk_widget_destroy (gtkdev->widget); + if (MODES_[dev->type] == mix_dev_BIN) { + struct mixgtk_bin_device_t * bdev = (struct mixgtk_bin_device_t *)dev; + gtk_list_store_clear (bdev->store); + g_object_unref ((gpointer)bdev->store); + } (DEF_DEV_VTABLE_->destroy) (dev); - gtk_notebook_remove_page (GTK_NOTEBOOK (container_), gtkdev->pos); - --last_pos_; + gtk_notebook_remove_page (container_, + gtk_notebook_page_num (container_, + gtkdev->scroll)); } static mix_device_vtable_t MIXGTK_VTABLE_ = { @@ -278,52 +249,51 @@ mixgtk_device_construct_gui_ (struct mixgtk_device_t *dev) g_assert (label); - dev->pos = last_pos_++; + dev->scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dev->scroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + 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); + dev->widget = gtk_text_view_new (); + gtk_text_view_set_editable (GTK_TEXT_VIEW (dev->widget), FALSE); } else { gint k; - struct mixgtk_bin_device_t *bindev = - (struct mixgtk_bin_device_t *)dev; - - bindev->scroll = gtk_scrolled_window_new (NULL, NULL); - g_assert (bindev->scroll); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (bindev->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) + struct mixgtk_bin_device_t *bindev = (struct mixgtk_bin_device_t *)dev; + + GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); + + 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)); + + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (dev->widget), FALSE); + + for (k = 0; k < BIN_DEV_COL_; ++k) { - gtk_clist_set_column_width (GTK_CLIST (dev->widget), k, 120); - gtk_clist_set_column_auto_resize (GTK_CLIST (dev->widget), k, TRUE); + gtk_tree_view_append_column + (GTK_TREE_VIEW (dev->widget), + gtk_tree_view_column_new_with_attributes ("", renderer, + "text", k, NULL)); } - gtk_container_add (GTK_CONTAINER (bindev->scroll), dev->widget); - gtk_notebook_insert_page (container_, bindev->scroll, label, dev->pos); - gtk_widget_show (bindev->scroll); } - gtk_widget_show (label); + g_assert (dev->widget); + gtk_container_add (GTK_CONTAINER (dev->scroll), dev->widget); + gtk_notebook_append_page (container_, dev->scroll, label); gtk_widget_set_style (dev->widget, gtk_widget_get_style (GTK_WIDGET (container_))); + gtk_widget_show (label); + gtk_widget_show (dev->scroll); gtk_widget_show (dev->widget); - gtk_widget_draw (GTK_WIDGET (container_), NULL); } /* create a new mixgtk device */ @@ -363,32 +333,19 @@ mixgtk_device_copy_ (const struct mixgtk_device_t *from) { gchar *text = gtk_editable_get_chars (GTK_EDITABLE (from->widget), 0, -1); - gtk_text_insert (GTK_TEXT (result->widget), NULL, NULL, NULL, text, -1); + gtk_text_buffer_insert_at_cursor + (gtk_text_view_get_buffer (GTK_TEXT_VIEW (result->widget)), text, -1); g_free (text); } else { - static gchar *VALS[BIN_DEV_COL_] = {""}; 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; - if (to->last_insert > 0) - { - gint k, j, rows = to->last_insert / BIN_DEV_COL_; - GtkCList *tl = GTK_CLIST (result->widget); - GtkCList *fl = GTK_CLIST (from->widget); - for (k = 0; k < rows; ++k) - { - mix_word_t *words = g_new (mix_word_t, BIN_DEV_COL_); - mix_word_t *oldwords = - (mix_word_t *) gtk_clist_get_row_data (fl, k); - for (j = 0; j < BIN_DEV_COL_; ++j) words[j] = oldwords[j]; - gtk_clist_append (tl, VALS); - gtk_clist_set_row_data_full (tl, k, words, g_free); - } - redraw_bin_device_ (to); - } + gtk_tree_view_set_model (GTK_TREE_VIEW (result->widget), + GTK_TREE_MODEL (fr->store)); + to->store = fr->store; } return (mix_device_t *)result; } @@ -403,7 +360,6 @@ mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm) g_return_val_if_fail (vm != NULL, FALSE); container_ = container; vm_ = vm; - last_pos_ = 0; devdlg_ = NULL; devdir_dlg_ = NULL; devdir_entry_ = NULL; @@ -433,9 +389,6 @@ mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm) } } - /* set to first page */ - gtk_notebook_set_page (container_, 0); - return TRUE; } @@ -452,8 +405,8 @@ mixgtk_device_set_format (mix_device_type_t dev, gboolean dec) { 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)); +/* redraw_bin_device_ ((struct mixgtk_bin_device_t *) */ +/* mix_vm_get_device (vm_, dev)); */ } } @@ -462,13 +415,13 @@ mixgtk_device_set_format (mix_device_type_t dev, gboolean dec) 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 (); +/* 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; } @@ -492,7 +445,7 @@ init_devform_ (void) 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_combo_set_popdown_strings (GTK_COMBO (combo_), names); */ } void @@ -573,16 +526,32 @@ on_devdir_activate () gtk_widget_show (devdir_dlg_); } -static void -devdir_callback (const gchar *file) -{ - gtk_entry_set_text (devdir_entry_, file); -} - void on_devdir_browse_clicked () { - mixgtk_get_file (devdir_callback, _("Devices dir"), mix_device_get_dir ()); + GtkWidget *dialog; + const gchar *current = gtk_entry_get_text (devdir_entry_); + + dialog = + gtk_file_chooser_dialog_new (_("Devices folder"), + GTK_WINDOW (devdir_dlg_), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + if (current != NULL) + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), current); + + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + char *filename + = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + gtk_entry_set_text (devdir_entry_, filename); + g_free (filename); + } + + gtk_widget_destroy (dialog); } void -- cgit v1.2.3