qemacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemacs-devel] Changes to qemacs/shell.c


From: Charlie Gordon
Subject: [Qemacs-devel] Changes to qemacs/shell.c
Date: Mon, 09 May 2005 05:10:48 -0400

Index: qemacs/shell.c
diff -u qemacs/shell.c:1.12 qemacs/shell.c:1.13
--- qemacs/shell.c:1.12 Mon May  9 06:21:49 2005
+++ qemacs/shell.c      Mon May  9 09:10:38 2005
@@ -58,6 +58,7 @@
     int state;
     int esc1;
     int shifted;
+    int grab_keys;
     EditBuffer *b;
     EditBuffer *b_color; /* color buffer, one byte per char */
     int is_shell; /* only used to display final message */
@@ -430,16 +431,107 @@
         e->offset = s->cur_offset;
 }
 
+void shell_key(void *opaque, int key)
+{
+    ShellState *s = opaque;
+    char buf[10];
+    const char *p;
+    int len;
+
+    if (key == KEY_CTRL('o')) {
+        qe_ungrab_keys();
+        unget_key(key);
+        return;
+    }
+    p = buf;
+    len = -1;
+    switch (key) {
+    case KEY_UP:        p = s->kcuu1; break;
+    case KEY_DOWN:      p = s->kcud1; break;
+    case KEY_RIGHT:     p = s->kcuf1; break;
+    case KEY_LEFT:      p = s->kcub1; break;
+    //case KEY_CTRL_UP:
+    //case KEY_CTRL_DOWN:
+    //case KEY_CTRL_RIGHT:
+    //case KEY_CTRL_LEFT:
+    //case KEY_CTRL_END:
+    //case KEY_CTRL_HOME:
+    //case KEY_CTRL_PAGEUP:
+    //case KEY_CTRL_PAGEDOWN:
+    case KEY_SHIFT_TAB: p = s->kcbt; break;
+    case KEY_HOME:      p = s->khome; break;
+    case KEY_INSERT:    p = s->kich1; break;
+    case KEY_DELETE:    p = s->kdch1; break;
+    case KEY_END:       p = s->kend; break;
+    case KEY_PAGEUP:    p = s->kpp; break;
+    case KEY_PAGEDOWN:  p = s->knp; break;
+    case KEY_F1:        p = s->kf1; break;
+    case KEY_F2:        p = s->kf2; break;
+    case KEY_F3:        p = s->kf3; break;
+    case KEY_F4:        p = s->kf4; break;
+    case KEY_F5:        p = s->kf5; break;
+    case KEY_F6:        p = s->kf6; break;
+    case KEY_F7:        p = s->kf7; break;
+    case KEY_F8:        p = s->kf8; break;
+    case KEY_F9:        p = s->kf9; break;
+    case KEY_F10:       p = s->kf10; break;
+    case KEY_F11:       p = s->kf11; break;
+    case KEY_F12:       p = s->kf12; break;
+    case KEY_F13:       p = s->kf13; break;
+    case KEY_F14:       p = s->kf14; break;
+    case KEY_F15:       p = s->kf15; break;
+    case KEY_F16:       p = s->kf16; break;
+    case KEY_F17:       p = s->kf17; break;
+    case KEY_F18:       p = s->kf18; break;
+    case KEY_F19:       p = s->kf19; break;
+    case KEY_F20:       p = s->kf20; break;
+    default:
+        if (key < 256) {
+            buf[0] = key;
+            len = 1;
+        } else
+        if (key >= KEY_META(0) && key <= KEY_META(255)) {
+            buf[0] = '\033';
+            buf[1] = key;
+            len = 2;
+        } else {
+            p = NULL;
+        }
+    } 
+    if (p)
+        tty_write(s, p, len);
+}
+
 static void tty_emulate(ShellState *s, int c)
 {
     int i, offset, offset1, offset2, n;
     unsigned char buf1[10];
     
 #define ESC2(c1,c2)  (((c1)<<8)|((unsigned char)c2))
+    /* some bytes are state independent */
+    switch (c) {
+    case 0x18:
+    case 0x1A:
+        s->state = TTY_STATE_NORM;
+        return;
+    case 0x1B:
+        s->state = TTY_STATE_ESC;
+        return;
+#if 0
+    case 0x9B:
+        goto csi_entry;
+#endif
+    }
+
     switch (s->state) {
     case TTY_STATE_NORM:
-        switch(c) {
-        case 8:
+        switch (c) {
+            /* BEL            Bell (Ctrl-G) */
+            /* FF             Form Feed or New Page (NP) (Ctrl-L) same as LF */
+            /* TAB            Horizontal Tab (HT) (Ctrl-I) */
+            /* VT             Vertical Tab (Ctrl-K) same as LF */
+
+        case 8:         /* ^H  BS = backspace */
             {
                 int c1;
                 c1 = eb_prevc(s->b, s->cur_offset, &offset);
@@ -447,10 +539,11 @@
                     s->cur_offset = offset;
             }
             break;
-        case 10:
+        case 10:        /* ^J  NL = line feed */
             /* go to next line */
+            /* CG: should check if column should be kept */
             offset = s->cur_offset;
-            for(;;) {
+            for (;;) {
                 if (offset == s->b->total_size) {
                     /* add a new line */
                     buf1[0] = '\n';
@@ -464,24 +557,21 @@
             }
             s->cur_offset = offset;
             break;
-        case 13:
+        case 13:        /* ^M  CR = carriage return */
             /* move to bol */
-            for(;;) {
+            for (;;) {
                 c = eb_prevc(s->b, s->cur_offset, &offset1);
                 if (c == '\n')
                     break;
                 s->cur_offset = offset1;
             }
             break;
-        case 14:
+        case 14:        /* ^N  SO = shift out */
             s->shifted = 1;
             break;
-        case 15:
+        case 15:        /* ^O  SI = shift in */
             s->shifted = 0;
             break;
-        case 27:
-            s->state = TTY_STATE_ESC;
-            break;
         default:
             if (c >= 32 || c == 9) {
                 int c1, cur_len, len;
@@ -589,7 +679,16 @@
                 /* 1047, 1048 -> cup mode:
                  * should grab all keys while active!
                  */
+                if (s->esc_params[0] == 1047) {
+                    s->grab_keys = 1;
+                    qe_grab_keys(shell_key, s);
+                }
+                break;
             case ESC2('?','l'): /* reset terminal mode */
+                if (s->esc_params[0] == 1047) {
+                    qe_ungrab_keys();
+                    s->grab_keys = 0;
+                }
                 break;
             case 'A':
                 /* move relative up */
@@ -601,11 +700,11 @@
                 break;
             case 'C':
                 /* move relative forward */
-                tty_gotoxy(s, -(s->esc_params[0] + 1 - s->has_params[0]), 0, 
1);
+                tty_gotoxy(s, (s->esc_params[0] + 1 - s->has_params[0]), 0, 1);
                 break;
             case 'D':
                 /* move relative backward */
-                tty_gotoxy(s, (s->esc_params[0] + 1 - s->has_params[0]), 0, 1);
+                tty_gotoxy(s, -(s->esc_params[0] + 1 - s->has_params[0]), 0, 
1);
                 break;
             case 'H':
                 /* goto xy */
@@ -722,7 +821,8 @@
     }
 }
 
-static int shell_get_colorized_line(EditState *e, unsigned int *buf, int 
buf_size,
+static int shell_get_colorized_line(EditState *e,
+                                    unsigned int *buf, int buf_size,
                                     int offset, int line_num)
 {
     EditBuffer *b = e->b;
@@ -817,7 +917,9 @@
     }
 
     /* remove shell input mode */
-    for(e = qs->first_window; e != NULL; e = e->next_window) {
+    s->grab_keys = 0;
+    qe_ungrab_keys();
+    for (e = qs->first_window; e != NULL; e = e->next_window) {
         if (e->b == b)
             e->interactive = 0;
     }
@@ -1042,6 +1144,11 @@
 void do_shell_toggle_input(EditState *e)
 {
     e->interactive = !e->interactive;
+    if (e->interactive) {
+        ShellState *s = e->b->priv_data;
+        if (s->grab_keys)
+            qe_grab_keys(shell_key, s);
+    }
 #if 0
     if (e->interactive) {
         ShellState *s = e->b->priv_data;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]