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