summaryrefslogtreecommitdiffhomepage
path: root/mixgtk/mixgtk_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'mixgtk/mixgtk_device.c')
-rw-r--r--mixgtk/mixgtk_device.c235
1 files changed, 102 insertions, 133 deletions
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