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.c128
1 files changed, 89 insertions, 39 deletions
diff --git a/mixgtk/mixgtk_device.c b/mixgtk/mixgtk_device.c
index 3c55021..5ba3f9f 100644
--- a/mixgtk/mixgtk_device.c
+++ b/mixgtk/mixgtk_device.c
@@ -1,24 +1,24 @@
/* -*-c-*- ---------------- mixgtk_device.c :
* actual types for mixgtk devices
* ------------------------------------------------------------------
- * $Id: mixgtk_device.c,v 1.19 2002/04/10 23:39:40 jao Exp $
+ * $Id: mixgtk_device.c,v 1.20 2004/06/11 23:35:59 jao Exp $
* ------------------------------------------------------------------
- * Copyright (C) 2001, 2002 Free Software Foundation, Inc.
- *
+ * Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
+ *
*/
@@ -45,6 +45,9 @@ static GtkNotebook *container_ = NULL;
/* devdir dialog */
static GtkWidget *devdir_dlg_ = NULL;
static GtkEntry *devdir_entry_ = NULL;
+/* terminal input dialog */
+static GtkWidget *input_dlg_ = NULL;
+static GtkEntry *input_dlg_entry_ = NULL;
/** configuration stuff */
#define LAST_BIN_DEV_ mix_dev_DISK_7
@@ -98,9 +101,9 @@ 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);
-
+
}
static const gchar *
@@ -121,16 +124,16 @@ 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;
gboolean dec = FALSE;
-
+
GtkCList *list = GTK_CLIST (dev->gtk_device.widget);
-
+
dec = IS_DEC(decs_, dev->gtk_device.device.type);
gtk_clist_freeze (list);
-
+
for (k = 0; k < SIZES_[dev->gtk_device.device.type]; k++)
{
row = dev->last_insert / BIN_DEV_COL_;
@@ -139,14 +142,14 @@ write_bin_ (struct mixgtk_bin_device_t *dev, const mix_word_t *block)
{
int j;
mix_word_t *words = g_new (mix_word_t, 5);
- gtk_clist_append (list, DEFTEXT);
+ 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++;
}
-
+
gtk_clist_thaw (list);
}
@@ -157,14 +160,14 @@ redraw_bin_device_ (struct mixgtk_bin_device_t *dev)
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)
{
row = k / BIN_DEV_COL_;
@@ -173,52 +176,80 @@ redraw_bin_device_ (struct mixgtk_bin_device_t *dev)
words = gtk_clist_get_row_data (list, row);
gtk_clist_set_text (list, row, col, get_word_string_ (words[col], dec));
}
-
+
gtk_clist_thaw (list);
}
-
+
static gboolean
write_ (mix_device_t *dev, const mix_word_t *block)
{
struct mixgtk_device_t *gtkdev = (struct mixgtk_device_t *) dev;
-
+
if (dev->type != mix_dev_CONSOLE && !(DEF_DEV_VTABLE_->write)(dev, block))
return FALSE;
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);
return TRUE;
}
+static gboolean
+read_cons_ (mix_word_t *block)
+{
+ gchar *text;
+ size_t i, j;
-static gboolean
+ if (input_dlg_ == NULL)
+ {
+ input_dlg_ = mixgtk_widget_factory_get_dialog (MIXGTK_INPUT_DIALOG);
+ g_assert (input_dlg_);
+ input_dlg_entry_ = GTK_ENTRY (mixgtk_widget_factory_get_child_by_name
+ (MIXGTK_INPUT_DIALOG, "input_entry"));
+ g_assert (input_dlg_entry_);
+ }
+
+ gtk_widget_show (input_dlg_);
+ gtk_main (); /* wait until dialog closes */
+ text = g_strdup_printf ("%-70s", gtk_entry_get_text (input_dlg_entry_));
+ for (i = 0; i < 70; ++i)
+ for (j = 0; j < 5; ++j)
+ mix_word_set_byte (block + i, j + 1,
+ mix_char_to_byte
+ (mix_ascii_to_char (text[5 * i + j])));
+ g_free (text);
+ return TRUE;
+}
+
+static gboolean
read_ (mix_device_t *dev, mix_word_t *block)
{
struct mixgtk_device_t *gtkdev = (struct mixgtk_device_t *) dev;
+ if (dev->type == mix_dev_CONSOLE && !read_cons_ (block)) return FALSE;
+
if (dev->type != mix_dev_CONSOLE && !(DEF_DEV_VTABLE_->read)(dev, block))
return FALSE;
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);
return TRUE;
}
-static gboolean
+static gboolean
ioc_ (mix_device_t *dev, mix_short_t cmd)
{
return (DEF_DEV_VTABLE_->ioc)(dev, cmd);
}
static gboolean
-busy_ (const mix_device_t *dev)
+busy_ (const mix_device_t *dev)
{
return (DEF_DEV_VTABLE_->busy)(dev);
}
@@ -270,7 +301,7 @@ mixgtk_device_construct_gui_ (struct mixgtk_device_t *dev)
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),
@@ -287,7 +318,7 @@ mixgtk_device_construct_gui_ (struct mixgtk_device_t *dev)
gtk_notebook_insert_page (container_, bindev->scroll, label, dev->pos);
gtk_widget_show (bindev->scroll);
}
-
+
gtk_widget_show (label);
gtk_widget_set_style (dev->widget,
gtk_widget_get_style (GTK_WIDGET (container_)));
@@ -300,7 +331,7 @@ static mix_device_t *
mixgtk_device_new_ (mix_device_type_t type)
{
struct mixgtk_device_t *dev = NULL;
-
+
g_return_val_if_fail (type < mix_dev_INVALID, NULL);
if (MODES_[type] == mix_dev_CHAR)
@@ -367,7 +398,7 @@ gboolean
mixgtk_device_init (GtkNotebook *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;
@@ -376,6 +407,7 @@ mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm)
devdlg_ = NULL;
devdir_dlg_ = NULL;
devdir_entry_ = NULL;
+ input_dlg_ = NULL;
dtoggle_ = NULL;
wtoggle_ = NULL;
combo_ = NULL;
@@ -384,11 +416,11 @@ mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm)
gtk_notebook_remove_page (container_, 0);
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_));
-
+
/* re-create existing devices */
for (k = 0; k < mix_dev_INVALID; ++k)
{
@@ -403,7 +435,7 @@ mixgtk_device_init (GtkNotebook *container, mix_vm_t *vm)
/* set to first page */
gtk_notebook_set_page (container_, 0);
-
+
return TRUE;
}
@@ -411,11 +443,11 @@ void
mixgtk_device_set_format (mix_device_type_t dev, gboolean dec)
{
gboolean changed;
-
+
g_return_if_fail (dev < mix_dev_INVALID);
-
+
changed = (dec && !IS_DEC (decs_, dev)) || (!dec && IS_DEC (decs_, dev));
-
+
if (changed && (MODES_[dev] == mix_dev_BIN))
{
if (dec) SET_DEC (decs_, dev);
@@ -423,7 +455,7 @@ mixgtk_device_set_format (mix_device_type_t dev, gboolean dec)
redraw_bin_device_ ((struct mixgtk_bin_device_t *)
mix_vm_get_device (vm_, dev));
}
-
+
}
@@ -445,7 +477,7 @@ 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
@@ -457,7 +489,7 @@ 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);
@@ -482,7 +514,6 @@ on_devform_activate ()
on_deventry_changed ();
}
-
void
on_decradio_toggled (GtkToggleButton *button)
{
@@ -570,3 +601,22 @@ on_devdir_ok_clicked ()
mixgtk_cmd_dispatcher_dispatch (cmd);
g_free (cmd);
}
+
+void
+on_input_ok_clicked ()
+{
+ gtk_widget_hide (input_dlg_);
+ gtk_main_quit ();
+}
+
+void
+on_input_clear_clicked ()
+{
+ gtk_entry_set_text (input_dlg_entry_, "");
+}
+
+void
+on_input_entry_activate ()
+{
+ on_input_ok_clicked ();
+}