diff --git a/moo/mooterm/mooterm-private.h b/moo/mooterm/mooterm-private.h
index 0d2f5aeb..193c0163 100644
--- a/moo/mooterm/mooterm-private.h
+++ b/moo/mooterm/mooterm-private.h
@@ -59,6 +59,7 @@ enum {
CURSOR = 2
};
+
typedef enum {
CURSOR_BLOCK,
CURSOR_UNDERLINE
@@ -87,7 +88,17 @@ struct _MooTermPrivate {
guint cursor_row;
guint cursor_col;
- GArray *saved_cursor;
+
+ struct {
+ guint cursor_row, cursor_col;
+ MooTermTextAttr attr;
+ int GL, GR;
+ gboolean autowrap;
+ gboolean decom;
+ guint top_margin, bottom_margin;
+ /* TODO: Selective erase attribute ??? */
+ int single_shift;
+ } saved_cursor;
TermSelection *selection;
@@ -222,6 +233,9 @@ void moo_term_set_mode (MooTerm *term,
gboolean set);
void moo_term_set_ca_mode (MooTerm *term,
gboolean set);
+void moo_term_decsc (MooTerm *term);
+void moo_term_decrc (MooTerm *term);
+
/* these two are in mootermdraw.c */
void moo_term_invert_colors (MooTerm *term,
gboolean invert);
diff --git a/moo/mooterm/mooterm-vtctls.h b/moo/mooterm/mooterm-vtctls.h
index 3d228b6e..52c1d6c4 100644
--- a/moo/mooterm/mooterm-vtctls.h
+++ b/moo/mooterm/mooterm-vtctls.h
@@ -75,8 +75,8 @@ G_STMT_START { \
#define VT_IL(n) moo_term_buffer_insert_line (parser->term->priv->buffer, n)
#define VT_CUP(r,c) moo_term_buffer_cup (parser->term->priv->buffer, (r)-1, (c)-1)
#define VT_DECSTBM(t,b) moo_term_buffer_set_scrolling_region (parser->term->priv->buffer, (t)-1, (b)-1);
-#define VT_DECSC moo_term_buffer_decsc (parser->term->priv->buffer)
-#define VT_DECRC moo_term_buffer_decrc (parser->term->priv->buffer)
+#define VT_DECSC moo_term_decsc (parser->term)
+#define VT_DECRC moo_term_decrc (parser->term)
#define VT_DECSET moo_term_set_dec_modes (parser->term, \
(int*) parser->numbers->data, \
parser->numbers->len, \
diff --git a/moo/mooterm/mooterm.c b/moo/mooterm/mooterm.c
index a3362751..5e6e265d 100644
--- a/moo/mooterm/mooterm.c
+++ b/moo/mooterm/mooterm.c
@@ -62,6 +62,8 @@ static void im_preedit_end (MooTerm *term);
static void child_died (MooTerm *term);
+static void clear_saved_cursor (MooTerm *term);
+
enum {
SET_SCROLL_ADJUSTMENTS,
@@ -180,7 +182,7 @@ static void moo_term_init (MooTerm *term)
term->priv->alternate_buffer = moo_term_buffer_new (80, 24);
term->priv->buffer = term->priv->primary_buffer;
- term->priv->saved_cursor = g_array_new (FALSE, FALSE, sizeof(guint));
+ clear_saved_cursor (term);
term->priv->width = 80;
term->priv->height = 24;
@@ -261,8 +263,6 @@ static void moo_term_finalize (GObject *object)
term_selection_free (term->priv->selection);
term_font_info_free (term->priv->font_info);
- g_array_free (term->priv->saved_cursor, TRUE);
-
g_object_unref (term->priv->back_pixmap);
if (term->priv->changed_content)
@@ -1079,30 +1079,54 @@ void moo_term_set_mode (MooTerm *term,
}
-static void save_cursor (MooTerm *term)
+static void clear_saved_cursor (MooTerm *term)
{
- g_array_append_val (term->priv->saved_cursor,
- term->priv->cursor_row);
- g_array_append_val (term->priv->saved_cursor,
- term->priv->cursor_col);
+ term->priv->saved_cursor.cursor_row = 0;
+ term->priv->saved_cursor.cursor_col = 0;
+ term->priv->saved_cursor.attr.mask = 0;
+ term->priv->saved_cursor.GL = 0;
+ term->priv->saved_cursor.GR = 4;
+ term->priv->saved_cursor.autowrap = DEFAULT_MODE_DECAWM;
+ term->priv->saved_cursor.decom = DEFAULT_MODE_DECOM;
+ term->priv->saved_cursor.top_margin = 0,
+ term->priv->saved_cursor.bottom_margin = 999;
+ term->priv->saved_cursor.single_shift = -1;
}
-static void restore_cursor (MooTerm *term)
+
+void moo_term_decsc (MooTerm *term)
{
- guint row = 0;
- guint col = 0;
+ MooTermBuffer *buf = term->priv->buffer;
- if (term->priv->saved_cursor->len)
- {
- row = g_array_index (term->priv->saved_cursor, guint,
- term->priv->saved_cursor->len - 2);
- col = g_array_index (term->priv->saved_cursor, guint,
- term->priv->saved_cursor->len - 1);
- g_array_set_size (term->priv->saved_cursor,
- term->priv->saved_cursor->len - 2);
- }
+ term->priv->saved_cursor.cursor_row = term->priv->cursor_row;
+ term->priv->saved_cursor.cursor_col = term->priv->cursor_col;
+ term->priv->saved_cursor.attr = buf->priv->current_attr;
+ term->priv->saved_cursor.GL = buf->priv->GL[0];
+ term->priv->saved_cursor.GR = buf->priv->GL[1];
+ term->priv->saved_cursor.autowrap = term_get_mode (MODE_DECAWM);
+ term->priv->saved_cursor.decom = term_get_mode (MODE_DECOM);
+ term->priv->saved_cursor.top_margin = buf->priv->top_margin;
+ term->priv->saved_cursor.bottom_margin = buf->priv->bottom_margin;
+ term->priv->saved_cursor.single_shift = buf->priv->single_shift;
+}
- moo_term_buffer_cursor_move_to (term->priv->buffer, row, col);
+
+void moo_term_decrc (MooTerm *term)
+{
+ MooTermBuffer *buf = term->priv->buffer;
+
+ moo_term_buffer_cursor_move_to (term->priv->buffer,
+ term->priv->saved_cursor.cursor_row,
+ term->priv->saved_cursor.cursor_col);
+ buf->priv->current_attr = term->priv->saved_cursor.attr;
+ buf->priv->GL[0] = term->priv->saved_cursor.GL;
+ buf->priv->GL[1] = term->priv->saved_cursor.GR;
+ moo_term_set_mode (term, MODE_DECAWM, term->priv->saved_cursor.autowrap);
+ moo_term_set_mode (term, MODE_DECOM, term->priv->saved_cursor.decom);
+ moo_term_buffer_set_scrolling_region (buf,
+ term->priv->saved_cursor.top_margin,
+ term->priv->saved_cursor.bottom_margin);
+ buf->priv->single_shift = term->priv->saved_cursor.single_shift;
}
@@ -1111,7 +1135,7 @@ void moo_term_set_ca_mode (MooTerm *term,
{
if (set)
{
- save_cursor (term);
+ moo_term_decsc (term);
moo_term_set_alternate_buffer (term, TRUE);
moo_term_buffer_erase_in_display (term->priv->buffer, 2);
moo_term_buffer_set_ca_mode (term->priv->buffer, TRUE);
@@ -1120,7 +1144,7 @@ void moo_term_set_ca_mode (MooTerm *term,
{
moo_term_set_alternate_buffer (term, FALSE);
moo_term_buffer_set_ca_mode (term->priv->buffer, FALSE);
- restore_cursor (term);
+ moo_term_decrc (term);
}
}
@@ -1218,6 +1242,7 @@ void moo_term_reset (MooTerm *term)
moo_term_buffer_reset (term->priv->alternate_buffer);
set_default_modes (term->priv->modes);
set_default_modes (term->priv->saved_modes);
+ clear_saved_cursor (term);
moo_term_buffer_thaw_changed_notify (term->priv->primary_buffer);
moo_term_buffer_thaw_cursor_notify (term->priv->primary_buffer);
diff --git a/moo/mooterm/mootermbuffer-graph.h b/moo/mooterm/mootermbuffer-graph.h
index 86757655..af780436 100644
--- a/moo/mooterm/mootermbuffer-graph.h
+++ b/moo/mooterm/mootermbuffer-graph.h
@@ -120,6 +120,8 @@ static gunichar ASCII_DRAWING_SET[MAX_GRAPH + 1] = {
static gunichar DRAWING_SET[MAX_GRAPH + 1];
+static gunichar *graph_sets[5];
+
static void init_drawing_sets (void)
{
guint i;
@@ -134,6 +136,9 @@ static void init_drawing_sets (void)
if (!ASCII_DRAWING_SET[i] && '\040' <= i && i <= '\176')
ASCII_DRAWING_SET[i] = i;
}
+
+ graph_sets[0] = graph_sets[2] = DRAWING_SET;
+ graph_sets[1] = graph_sets[3] = graph_sets[4] = NULL;
}
diff --git a/moo/mooterm/mootermbuffer-private.h b/moo/mooterm/mootermbuffer-private.h
index 65a01aeb..8a81b993 100644
--- a/moo/mooterm/mootermbuffer-private.h
+++ b/moo/mooterm/mootermbuffer-private.h
@@ -26,6 +26,15 @@
G_BEGIN_DECLS
+typedef enum {
+ CHARSET_DRAWING = 0,
+ CHARSET_ACRSSS = 1,
+ CHARSET_ACRSPS = 2,
+ CHARSET_UK = 3,
+ CHARSET_ASCII = 4
+} CharsetType;
+
+
struct _MooTermBufferPrivate {
gboolean constructed;
@@ -35,9 +44,8 @@ struct _MooTermBufferPrivate {
MooTermTextAttr current_attr;
int single_shift;
- gunichar *graph_sets[4];
- gunichar *current_graph_set;
- gboolean use_ascii_graphics;
+ CharsetType GL[4];
+ CharsetType current_graph_set;
/* these are real position and
dimensions of the screen */
@@ -54,18 +62,6 @@ struct _MooTermBufferPrivate {
guint cursor_row;
guint cursor_col;
- /* TODO: is it per-terminal or per-buffer? */
- struct {
- guint cursor_row, cursor_col;
- MooTermTextAttr attr;
- gunichar *GL, *GR;
- gboolean autowrap;
- gboolean decom;
- guint top_margin, bottom_margin;
- /* TODO: Selective erase attribute ??? */
- int single_shift;
- } saved;
-
GList *tab_stops;
GdkRegion *changed;
@@ -319,10 +315,6 @@ void moo_term_buffer_cup (MooTermBuffer *buf,
guint row,
guint col);
-void moo_term_buffer_clear_saved (MooTermBuffer *buf);
-void moo_term_buffer_decsc (MooTermBuffer *buf);
-void moo_term_buffer_decrc (MooTermBuffer *buf);
-
void moo_term_buffer_decaln (MooTermBuffer *buf);
diff --git a/moo/mooterm/mootermbuffer.c b/moo/mooterm/mootermbuffer.c
index a2a49a8c..9fcc90ad 100644
--- a/moo/mooterm/mootermbuffer.c
+++ b/moo/mooterm/mootermbuffer.c
@@ -149,7 +149,6 @@ static void moo_term_buffer_init (MooTermBuffer *buf)
buf->priv->changed_all = FALSE;
set_defaults (buf);
- moo_term_buffer_clear_saved (buf);
}
@@ -520,20 +519,23 @@ static void buf_print_unichar_real (MooTermBuffer *buf,
{
if (buf->priv->single_shift >= 0)
{
- if (buf->priv->graph_sets[buf->priv->single_shift])
+ g_assert (buf->priv->single_shift < 4);
+
+ if (graph_sets[buf->priv->GL[buf->priv->single_shift]])
{
- if (buf->priv->graph_sets[buf->priv->single_shift][c])
- c = buf->priv->graph_sets[buf->priv->single_shift][c];
+ if (graph_sets[buf->priv->GL[buf->priv->single_shift]][c])
+ c = graph_sets[buf->priv->GL[buf->priv->single_shift]][c];
else
g_warning ("%s: using regular character while in "
"graphics mode", G_STRLOC);
}
+
buf->priv->single_shift = -1;
}
- else if (buf->priv->current_graph_set)
+ else if (graph_sets[buf->priv->current_graph_set])
{
- if (buf->priv->current_graph_set[c])
- c = buf->priv->current_graph_set[c];
+ if (graph_sets[buf->priv->current_graph_set][c])
+ c = graph_sets[buf->priv->current_graph_set][c];
else
g_warning ("%s: using regular character while in "
"graphics mode", G_STRLOC);
@@ -729,42 +731,36 @@ void moo_term_buffer_set_tab_stop (MooTermBuffer *buf)
void moo_term_buffer_select_charset (MooTermBuffer *buf,
guint set_num,
- guint charset)
+ CharsetType charset)
{
g_return_if_fail (set_num < 4 && charset < 5);
switch (charset)
{
- case 0:
- if (buf->priv->use_ascii_graphics)
- buf->priv->graph_sets[set_num] = ASCII_DRAWING_SET;
- else
- buf->priv->graph_sets[set_num] = DRAWING_SET;
+ case CHARSET_DRAWING:
+ buf->priv->GL[set_num] = CHARSET_DRAWING;
break;
- case 2:
+ case CHARSET_ACRSPS:
g_warning ("%s: choosing graphics instead of"
"Alternate Character ROM Special Set", G_STRLOC);
- if (buf->priv->use_ascii_graphics)
- buf->priv->graph_sets[set_num] = ASCII_DRAWING_SET;
- else
- buf->priv->graph_sets[set_num] = DRAWING_SET;
+ buf->priv->GL[set_num] = CHARSET_DRAWING;
break;
- case 1:
+ case CHARSET_ACRSSS:
g_warning ("%s: choosing regular charset instead of"
"Alternate Character ROM Standard Set", G_STRLOC);
- buf->priv->graph_sets[set_num] = NULL;
+ buf->priv->GL[set_num] = CHARSET_ASCII;
break;
- case 3:
+ case CHARSET_UK:
g_warning ("%s: choosing regular charset instead of"
"United Kingdom", G_STRLOC);
- buf->priv->graph_sets[set_num] = NULL;
+ buf->priv->GL[set_num] = CHARSET_ASCII;
break;
- case 4:
- buf->priv->graph_sets[set_num] = NULL;
+ case CHARSET_ASCII:
+ buf->priv->GL[set_num] = CHARSET_ASCII;
break;
}
}
@@ -774,7 +770,7 @@ void moo_term_buffer_shift (MooTermBuffer *buf,
guint set)
{
g_return_if_fail (set < 4);
- buf->priv->current_graph_set = buf->priv->graph_sets[set];
+ buf->priv->current_graph_set = buf->priv->GL[set];
}
@@ -1414,57 +1410,6 @@ void moo_term_buffer_insert_line (MooTermBuffer *buf,
}
-void moo_term_buffer_decsc (MooTermBuffer *buf)
-{
- g_message ("DECSC");
- buf->priv->saved.cursor_row = buf->priv->cursor_row;
- buf->priv->saved.cursor_col = buf->priv->cursor_col;
- buf->priv->saved.attr = buf->priv->current_attr;
- buf->priv->saved.GL = buf->priv->graph_sets[0];
- buf->priv->saved.GR = buf->priv->graph_sets[1];
- buf->priv->saved.autowrap = buf_get_mode (MODE_DECAWM);
- buf->priv->saved.decom = buf_get_mode (MODE_DECOM);
- buf->priv->saved.top_margin = buf->priv->top_margin;
- buf->priv->saved.bottom_margin = buf->priv->bottom_margin;
- buf->priv->saved.single_shift = buf->priv->single_shift;
-}
-
-
-void moo_term_buffer_decrc (MooTermBuffer *buf)
-{
- g_message ("DECRC");
- buf->priv->cursor_row = buf->priv->saved.cursor_row;
- buf->priv->cursor_col = buf->priv->saved.cursor_col;
- buf->priv->current_attr = buf->priv->saved.attr;
- buf->priv->graph_sets[0] = buf->priv->saved.GL;
- buf->priv->graph_sets[1] = buf->priv->saved.GR;
- moo_term_buffer_set_mode (buf, MODE_DECAWM, buf->priv->saved.autowrap);
- moo_term_buffer_set_mode (buf, MODE_DECOM, buf->priv->saved.decom);
- moo_term_buffer_set_scrolling_region (buf, buf->priv->top_margin,
- buf->priv->bottom_margin);
- buf->priv->single_shift = buf->priv->saved.single_shift;
-}
-
-
-void moo_term_buffer_clear_saved (MooTermBuffer *buf)
-{
- buf->priv->saved.cursor_row = 0;
- buf->priv->saved.cursor_col = 0;
- buf->priv->saved.attr.mask = 0;
- buf->priv->saved.autowrap = DEFAULT_MODE_DECAWM;
- buf->priv->saved.decom = DEFAULT_MODE_DECOM;
- buf->priv->saved.top_margin = 0;
- buf->priv->saved.bottom_margin = buf_screen_height (buf) - 1;
- buf->priv->saved.single_shift = -1;
- buf->priv->saved.GL = NULL;
-
- if (buf->priv->use_ascii_graphics)
- buf->priv->saved.GR = ASCII_DRAWING_SET;
- else
- buf->priv->saved.GR = DRAWING_SET;
-}
-
-
void moo_term_buffer_set_mode (MooTermBuffer *buf,
guint mode,
gboolean set)
@@ -1475,10 +1420,19 @@ void moo_term_buffer_set_mode (MooTermBuffer *buf,
moo_term_buffer_set_ca_mode (buf, set);
break;
+ /* xterm does this */
+ case MODE_DECANM:
+ if (set)
+ {
+ buf->priv->GL[0] = buf->priv->GL[1] = CHARSET_ASCII;
+ buf->priv->GL[2] = buf->priv->GL[3] = CHARSET_ASCII;
+ }
+ buf->priv->modes[mode] = set;
+ break;
+
/* these do not require anything special, just record the value */
case MODE_IRM:
case MODE_LNM:
- case MODE_DECANM:
case MODE_DECOM:
case MODE_DECAWM:
case MODE_REVERSE_WRAPAROUND: /* TODO*/
@@ -1524,11 +1478,9 @@ static void set_defaults (MooTermBuffer *buf)
set_default_modes (buf->priv->modes);
buf->priv->current_attr.mask = 0;
buf->priv->single_shift = -1;
- buf->priv->graph_sets[0] = buf->priv->graph_sets[1] =
- buf->priv->graph_sets[2] = buf->priv->graph_sets[3] = NULL;
- buf->priv->current_graph_set = NULL;
-
- moo_term_buffer_clear_saved (buf);
+ buf->priv->GL[0] = buf->priv->GL[2] = buf->priv->GL[3] = CHARSET_ASCII;
+ buf->priv->GL[1] = CHARSET_DRAWING;
+ buf->priv->current_graph_set = CHARSET_ASCII;
}
@@ -1566,9 +1518,9 @@ void moo_term_buffer_soft_reset (MooTermBuffer *buf)
buf->priv->current_attr.mask = 0;
buf->priv->single_shift = -1;
- buf->priv->graph_sets[0] = buf->priv->graph_sets[1] =
- buf->priv->graph_sets[2] = buf->priv->graph_sets[3] = NULL;
- buf->priv->current_graph_set = NULL;
+ buf->priv->GL[0] = buf->priv->GL[2] = buf->priv->GL[3] = CHARSET_ASCII;
+ buf->priv->GL[1] = CHARSET_DRAWING;
+ buf->priv->current_graph_set = CHARSET_ASCII;
buf_changed_set_all (buf);
moo_term_buffer_changed (buf);
diff --git a/mooterm.kdevelop b/mooterm.kdevelop
index 4bdb5c2c..b9a6dac4 100644
--- a/mooterm.kdevelop
+++ b/mooterm.kdevelop
@@ -24,7 +24,7 @@
.
false
-
+
C
@@ -39,7 +39,7 @@
tests/mterm
executable
/
-
+
false
true
@@ -141,18 +141,18 @@
true
1
false
-
+
0
libtool
- --g-fatal-warnings --debug bash
-
-
-
-
+ --g-fatal-warnings bash
+
+
+
+
true
false
true
@@ -217,16 +217,16 @@
-
+
A new empty GAP source file
-
+
A new empty C++ file.
-
+
A new empty header file for C/C++.
-
+
A new empty C file.
@@ -253,7 +253,7 @@
-
+
set
m_,_
theValue