summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mixgtk/mixgtk_mixal.c65
1 files changed, 48 insertions, 17 deletions
diff --git a/mixgtk/mixgtk_mixal.c b/mixgtk/mixgtk_mixal.c
index 2cfb428..21c83e9 100644
--- a/mixgtk/mixgtk_mixal.c
+++ b/mixgtk/mixgtk_mixal.c
@@ -1,7 +1,7 @@
/* -*-c-*- -------------- mixgtk_mixal.c :
* Implementation of the functions declared in mixgtk_mixal.h
* ------------------------------------------------------------------
- * Last change: Time-stamp: "01/04/01 15:23:18 jose"
+ * Last change: Time-stamp: "2001-04-21 23:19:05 jao"
* ------------------------------------------------------------------
* Copyright (C) 2001 Free Software Foundation, Inc.
*
@@ -31,41 +31,67 @@
static mix_vm_t *vm_;
static GtkCList *clist_;
-static GdkColor sel_color_;
-static GdkColor break_color_;
-static GdkColor plain_color_;
static gulong lineno_;
+static GdkColor colors_[3][2];
+static GdkColormap *colormap_ = NULL;
+static const char* default_colors_[3][2] = {
+ {"red", "black"},
+ {"lightgrey", "black"},
+ {"white", "black"}
+};
-#define SEL_COLOR_ "lightgrey"
-#define BREAK_COLOR_ "red"
-#define PLAIN_COLOR_ "white"
static gboolean
init_color_ (GdkColor *c, const gchar *name)
{
- static GdkColormap *cmap = NULL;
- if (!cmap) cmap = gtk_widget_get_colormap (GTK_WIDGET (clist_));
+ if (!colormap_)
+ colormap_ = gtk_widget_get_colormap (GTK_WIDGET (clist_));
return (gdk_color_parse (name, c) &&
- gdk_colormap_alloc_color (cmap, c, FALSE, TRUE));
+ gdk_colormap_alloc_color (colormap_, c, FALSE, TRUE));
}
/* initialise the mixal widgets */
gboolean
mixgtk_mixal_init (mix_vm_t *vm)
{
+ int i,j;
+
g_return_val_if_fail (vm != NULL, FALSE);
vm_ = vm;
clist_ = GTK_CLIST (mixgtk_widget_factory_get (MIXGTK_WIDGET_MIXAL));
g_return_val_if_fail (clist_ != NULL, FALSE);
/* allocate colors */
- g_return_val_if_fail (init_color_ (&sel_color_, SEL_COLOR_), FALSE);
- g_return_val_if_fail (init_color_ (&break_color_, BREAK_COLOR_), FALSE);
- g_return_val_if_fail (init_color_ (&plain_color_, PLAIN_COLOR_), FALSE);
-
+ for (i = 0; i < 3; ++i)
+ for (j = 0; j < 2; ++j)
+ g_return_val_if_fail (init_color_ (&colors_[i][j], default_colors_[i][j]),
+ FALSE);
return TRUE;
}
+/* set the plain, location pointer and break colors */
+void
+mixgtk_mixal_set_color (mixal_line_t line, mixal_line_zone_t zone,
+ guint16 color[3])
+{
+ g_return_if_fail (color != NULL);
+ g_return_if_fail (line > MIXAL_LINE_PLAIN);
+ g_return_if_fail (zone > MIXAL_LINE_FG);
+ colors_[line][zone].red = color[0];
+ colors_[line][zone].green = color[1];
+ colors_[line][zone].blue = color[2];
+ gdk_colormap_alloc_color (colormap_, &colors_[line][zone], FALSE, TRUE);
+ mixgtk_mixal_update_bp_all ();
+}
+
+const GdkColor *
+mixgtk_mixal_get_color (mixal_line_t line, mixal_line_zone_t zone)
+{
+ g_return_val_if_fail (line > MIXAL_LINE_PLAIN, FALSE);
+ g_return_val_if_fail (zone > MIXAL_LINE_FG, FALSE);
+ return &colors_[line][zone];
+}
+
/* load the corresponding mixal file */
void
mixgtk_mixal_load_file (void)
@@ -125,7 +151,11 @@ reset_bg_ (gint row)
gint addr = GPOINTER_TO_INT (gtk_clist_get_row_data (clist_, row));
gboolean isset = mix_vm_has_breakpoint_at_address (vm_, addr);
gtk_clist_set_background (clist_, row,
- isset ? &break_color_ : &plain_color_);
+ isset ? &colors_[MIXAL_LINE_BREAK][MIXAL_LINE_BG]:
+ &colors_[MIXAL_LINE_PLAIN][MIXAL_LINE_BG]);
+ gtk_clist_set_foreground (clist_, row,
+ isset ? &colors_[MIXAL_LINE_BREAK][MIXAL_LINE_FG]:
+ &colors_[MIXAL_LINE_PLAIN][MIXAL_LINE_FG]);
}
static void
@@ -133,7 +163,8 @@ select_row_ (gint row)
{
static gint last = -1;
- gtk_clist_set_background (clist_, row, &sel_color_);
+ gtk_clist_set_background (clist_, row, &colors_[MIXAL_LINE_LOC][MIXAL_LINE_BG]);
+ gtk_clist_set_foreground (clist_, row, &colors_[MIXAL_LINE_LOC][MIXAL_LINE_FG]);
if (gtk_clist_row_is_visible (clist_, row) != GTK_VISIBILITY_FULL)
gtk_clist_moveto (clist_, row, 0, 0.25, 0);
if (last != -1 && last != row) reset_bg_ (last);
@@ -202,7 +233,7 @@ on_mixal_select_row (GtkWidget *w, gint row, gint col, GdkEventButton *e,
gtk_clist_unselect_row (clist_, row, col);
addr = GPOINTER_TO_INT (gtk_clist_get_row_data (clist_, row));
pc = mix_vm_get_prog_count (vm_);
- if (addr < MIX_VM_CELL_NO && addr != pc)
+ if (addr < MIX_VM_CELL_NO)
{
isset = mix_vm_has_breakpoint_at_address (vm_, addr);
if (isset)