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.c279
1 files changed, 145 insertions, 134 deletions
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
@@ -477,31 +511,6 @@ on_decradio_toggled (GtkToggleButton *button)
}
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 ()
{
static gint32 ON = 0xffff, OFF = 0;
@@ -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);
}