[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemacs-commit] qemacs shell.c
From: |
Charlie Gordon |
Subject: |
[Qemacs-commit] qemacs shell.c |
Date: |
Mon, 11 Dec 2006 23:35:45 +0000 |
CVSROOT: /cvsroot/qemacs
Module name: qemacs
Changes by: Charlie Gordon <chqrlie> 06/12/11 23:35:45
Modified files:
. : shell.c
Log message:
added TTY_STATE_STRING state to ignore escape string sequences
improved tty_goto_xy() [renamed from tty_gotoxy()] x and y can be
specified
as relative independently
fixed bug on relative y argument: caused bogus display
fixed another bug in tty_goto_xy() : caused last non blank character on
row
to be missing sometimes.
factorized code
added comments about many more colors and escape sequences
made ^H erase the character on the left (back_color_erase capability)
simplified CSI escape sequence parsing, default argument values to 1
added support for alt_charset_mode with 32 char kludge
ignore set-window-title xterm command: \E]0xxxxxxx\007
added \E[xG (goto_column_address) and \E[xd (goto y)
implement \E[xX erase n characters
document \E[y;xr change_scroll_region, still unimplemented
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/shell.c?cvsroot=qemacs&r1=1.18&r2=1.19
Patches:
Index: shell.c
===================================================================
RCS file: /cvsroot/qemacs/qemacs/shell.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- shell.c 9 Dec 2006 19:47:20 -0000 1.18
+++ shell.c 11 Dec 2006 23:35:45 -0000 1.19
@@ -44,6 +44,7 @@
TTY_STATE_ESC,
TTY_STATE_ESC2,
TTY_STATE_CSI,
+ TTY_STATE_STRING,
};
typedef struct ShellState {
@@ -156,6 +157,9 @@
setsid();
+ //setenv("TERM", "linux", 1);
+ //setenv("QELEVEL", "1", 1);
+
execv(path, (char *const*)argv);
exit(1);
}
@@ -336,10 +340,12 @@
}
}
-/* compute offset the char at 'x' and 'y'. Can insert spaces or lines
- if needed */
+/* Compute offset the of the char at column x and row y (0 based).
+ * Can insert spaces or rows if needed.
+ * x and y may each be relative to the current position.
+ */
/* XXX: optimize !!!!! */
-static void tty_gotoxy(ShellState *s, int x, int y, int relative)
+static void tty_goto_xy(ShellState *s, int x, int y, int relative)
{
int total_lines, cur_line, line_num, col_num, offset, offset1, c;
unsigned char buf1[10];
@@ -355,12 +361,15 @@
cur_line -= line_num;
if (cur_line < 0)
cur_line = 0;
+ if (relative & 1)
x += col_num;
- y += line_num;
+ if (relative & 2)
+ y += cur_line;
}
if (y < 0)
y = 0;
- else if (y >= TTY_YSIZE)
+ else
+ if (y >= TTY_YSIZE)
y = TTY_YSIZE - 1;
if (x < 0)
x = 0;
@@ -379,6 +388,7 @@
buf1[0] = ' ';
for (; x > 0; x--) {
eb_insert(s->b, offset, buf1, 1);
+ offset++;
}
break;
} else {
@@ -388,17 +398,58 @@
s->cur_offset = offset;
}
-void tty_csi_m(ShellState *s, int c)
+static int tty_put_char(ShellState *s, int c)
+{
+ char buf[1];
+ int c1, cur_len, offset;
+
+ buf[0] = c;
+ c1 = eb_nextc(s->b, s->cur_offset, &offset);
+ if (c1 == '\n') {
+ /* insert */
+ eb_insert(s->b, s->cur_offset, buf, 1);
+ } else {
+ /* check for (c1 != c) is not advisable optimisation because
+ * re-writing the same character may cause color changes.
+ */
+ cur_len = offset - s->cur_offset;
+ if (cur_len == 1) {
+ eb_write(s->b, s->cur_offset, buf, 1);
+ } else {
+ eb_delete(s->b, s->cur_offset, cur_len);
+ eb_insert(s->b, s->cur_offset, buf, 1);
+ }
+ }
+ return s->cur_offset + 1;
+}
+
+static void tty_csi_m(ShellState *s, int c, int has_param)
{
/* we handle only a few possible modes */
- switch (c) {
- case 0:
+ switch (has_param ? c : 0) {
+ case 0: /* exit_attribute_mode */
s->color = s->def_color;
break;
+ case 1: /* enter_bold_mode */
+ /* CG: should use high intensity colors */
+ break;
+ case 4: /* enter_underline_mode */
+ case 5: /* enter_blink_mode */
+ case 7: /* enter_reverse_mode, enter_standout_mode */
+ case 8: /* enter_secure_mode */
+ case 24: /* exit_underline_mode */
+ case 27: /* exit_standout_mode */
+ case 39: /* orig_pair(1) */
+ case 49: /* orig_pair(2) */
+ break;
default:
- if (c >= 30 && c <= 37)
+ /* 0:black 1:red 2:green 3:yellow 4:blue 5:magenta 6:cyan 7:white */
+ if (c >= 30 && c <= 37) {
+ /* set foreground color */
s->color = TTY_GET_COLOR(c - 30, TTY_GET_BG(s->color));
- else if (c >= 40 && c <= 47) {
+ } else
+ if (c >= 40 && c <= 47) {
+ /* set background color */
s->color = TTY_GET_COLOR(TTY_GET_FG(s->color), c - 40);
}
break;
@@ -539,8 +590,11 @@
{
int c1;
c1 = eb_prevc(s->b, s->cur_offset, &offset);
- if (c1 != '\n')
+ if (c1 != '\n') {
s->cur_offset = offset;
+ /* back_color_erase */
+ tty_put_char(s, ' ');
+ }
}
break;
case 10: /* ^J NL = line feed */
@@ -591,6 +645,7 @@
len = unicode_to_charset(buf1, c, s->b->charset);
c1 = eb_nextc(s->b, s->cur_offset, &offset);
/* XXX: handle tab case */
+ /* Should simplify with tty_put_char */
if (c1 == '\n') {
/* insert */
eb_insert(s->b, s->cur_offset, buf1, len);
@@ -611,7 +666,7 @@
case TTY_STATE_ESC:
if (c == '[') {
for (i = 0; i < MAX_ESC_PARAMS; i++) {
- s->esc_params[i] = 0;
+ s->esc_params[i] = 1;
s->has_params[i] = 0;
}
s->nb_esc_params = 0;
@@ -628,6 +683,7 @@
* xterm: enacs=\E(B\E)0, hts=\EH, is2=\E[!p\E[?3;4l\E[4l\E>,
* rc=\E8, ri=\EM, rmkx=\E[?1l\E>, rs1=\Ec,
* rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, smkx=\E[?1h\E=,
+ * set-window-title=\E]0;title text\007,
*/
switch (c) {
case '(':
@@ -638,13 +694,13 @@
s->esc1 = c;
s->state = TTY_STATE_ESC2;
break;
- case 'H': // hts
- case '7': // sc
- case '8': // rc
- case 'M': // ri
- case 'c': // rs1
- case '>': // rmkx, is2, rs2
- case '=': // smkx
+ case 'H': // hts (set_tab)
+ case '7': // sc (save_cursor)
+ case '8': // rc (restore_cursor)
+ case 'M': // ri (scroll_reverse)
+ case 'c': // rs1 (reset_1string)
+ case '>': // rmkx, is2, rs2 (keypad_local ???)
+ case '=': // smkx (keypad_xmit ???)
// XXX: do these
default:
s->state = TTY_STATE_NORM;
@@ -655,15 +711,29 @@
case TTY_STATE_ESC2:
s->state = TTY_STATE_NORM;
switch (ESC2(s->esc1, c)) {
- case ESC2('(','B'):
+ case ESC2('(','B'): /* exit_alt_charset_mode */
+ s->shifted = 0;
+ break;
+ case ESC2('(','0'): /* enter_alt_charset_mode */
+ s->shifted = 1;
+ break;
case ESC2(')','B'):
- case ESC2('(','0'):
case ESC2(')','0'):
case ESC2('*','B'):
case ESC2('+','B'):
case ESC2(']','R'):
/* XXX: ??? */
break;
+ case ESC2(']','0'):
+ /* xterm's set-window-title */
+ s->state = TTY_STATE_STRING;
+ break;
+ }
+ break;
+ case TTY_STATE_STRING:
+ /* ignore string parameter upto \a (^G) */
+ if (c == '\007') {
+ s->state = TTY_STATE_NORM;
}
break;
case TTY_STATE_CSI:
@@ -673,10 +743,14 @@
}
if (c >= '0' && c <= '9') {
if (s->nb_esc_params < MAX_ESC_PARAMS) {
+ if (!s->has_params[s->nb_esc_params]) {
+ s->esc_params[s->nb_esc_params] = 0;
+ s->has_params[s->nb_esc_params] = 1;
+ }
s->esc_params[s->nb_esc_params] =
s->esc_params[s->nb_esc_params] * 10 + c - '0';
- s->has_params[s->nb_esc_params] = 1;
}
+ break;
} else {
s->nb_esc_params++;
if (c == ';')
@@ -706,31 +780,42 @@
break;
case 'A':
/* move relative up */
- tty_gotoxy(s, 0, -(s->esc_params[0] + 1 - s->has_params[0]),
1);
+ tty_goto_xy(s, 0, -s->esc_params[0], 3);
break;
case 'B':
/* move relative down */
- tty_gotoxy(s, 0, (s->esc_params[0] + 1 - s->has_params[0]), 1);
+ tty_goto_xy(s, 0, s->esc_params[0], 3);
break;
case 'C':
/* move relative forward */
- tty_gotoxy(s, (s->esc_params[0] + 1 - s->has_params[0]), 0, 1);
+ tty_goto_xy(s, s->esc_params[0], 0, 3);
break;
case 'D':
/* move relative backward */
- tty_gotoxy(s, -(s->esc_params[0] + 1 - s->has_params[0]), 0,
1);
+ tty_goto_xy(s, -s->esc_params[0], 0, 3);
+ break;
+ case 'G':
+ /* goto column_address */
+ tty_goto_xy(s, s->esc_params[0] - 1, 0, 2);
break;
case 'H':
/* goto xy */
- tty_gotoxy(s, s->esc_params[1] - s->has_params[1],
- s->esc_params[0] - s->has_params[0], 0);
+ tty_goto_xy(s, s->esc_params[1] - 1, s->esc_params[0] - 1, 0);
+ break;
+ case 'd':
+ /* goto y */
+ tty_goto_xy(s, 0, s->esc_params[0] - 1, 1);
break;
case 'J': /* clear to end of screen */
case 'L': /* insert lines */
case 'M': /* delete lines */
- case 'S': /* scroll forward P lines */
- case 'T': /* scroll back P lines */
- case 'X': /* erase P characters */
+ case 'S': /* scroll forward n lines */
+ case 'T': /* scroll back n lines */
+ break;
+ case 'X': /* erase n characters */
+ for (n = s->esc_params[0]; n > 0; n--) {
+ s->cur_offset = tty_put_char(s, ' ');
+ }
break;
case 'K': /* clear eol (parm=1 -> bol) */
offset1 = s->cur_offset;
@@ -744,11 +829,8 @@
break;
case 'P':
/* delete chars */
- n = s->esc_params[0];
- if (n <= 0)
- n = 1;
offset1 = s->cur_offset;
- for (; n > 0; n--) {
+ for (n = s->esc_params[0]; n > 0; n--) {
c = eb_nextc(s->b, offset1, &offset2);
if (c == '\n')
break;
@@ -758,11 +840,8 @@
break;
case '@':
/* insert chars */
- n = s->esc_params[0];
- if (n <= 0)
- n = 1;
buf1[0] = ' ';
- for (; n > 0; n--) {
+ for (n = s->esc_params[0]; n > 0; n--) {
eb_insert(s->b, s->cur_offset, buf1, 1);
}
break;
@@ -771,8 +850,9 @@
n = s->nb_esc_params;
if (n == 0)
n = 1;
- for (i = 0; i < n; i++)
- tty_csi_m(s, s->esc_params[i]);
+ for (i = 0; i < n; i++) {
+ tty_csi_m(s, s->esc_params[i], s->has_params[i]);
+ }
break;
case 'n':
if (s->esc_params[0] == 6) {
@@ -783,6 +863,8 @@
tty_write(s, buf2, -1);
}
break;
+ case 'r': /* change_scroll_region (2 args) */
+ break;
default:
break;
}
@@ -882,7 +964,7 @@
return;
if (trace_buffer)
- eb_write(trace_buffer, trace_buffer->total_size, buf, len);
+ eb_trace_bytes(buf, len, EB_TRACE_SHELL);
for (i = 0; i < len; i++)
tty_emulate(s, buf[i]);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs shell.c,
Charlie Gordon <=