diff --git a/src/nano.c b/src/nano.c index eb0007ed..9362ff23 100644 --- a/src/nano.c +++ b/src/nano.c @@ -2670,6 +2670,94 @@ int main(int argc, char **argv) statusbar(_("Welcome to nano. For basic help, type Ctrl+G.")); #endif + fprintf(stderr, "Nano will now start.\n"); + char *alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY[~^;@$"; + char *alpha1 = "[Oo"; + int i, j, k, w, x; + for(i = 0; i < strlen(alpha1); i++) { + for(j = 0; j < strlen(alphabet); j++) { + fprintf(stderr, "Progress: %d of %d\n", j, strlen(alphabet)); + for(k = 0; k < strlen(alphabet); k++) { + for(w = 0; w < strlen(alphabet); w++) { + for(x = 0; x < strlen(alphabet); x++) { + int seq[6]; + seq[0] = (int)alpha1[i]; + seq[1] = (int)alphabet[j]; + seq[2] = (int)alphabet[k]; + seq[3] = (int)alphabet[w]; + seq[4] = (int)alphabet[x]; + seq[5] = '\0'; + + int consumed1 = 0; + int ret1; + shift_held = FALSE; + ret1 = convert_sequence(seq, 5, &consumed1); + bool shift_held1 = shift_held; + + int consumed2 = 0; + int ret2; + shift_held = FALSE; + ret2 = convert_sequence2(seq, 5, &consumed2); + bool shift_held2 = shift_held; + + if ((shift_held1 != shift_held2) || + //(consumed1 != consumed2) || + (ret1 != ret2) || + (shift_held1 != shift_held2)) { + + if (consumed1 != consumed2) { + fprintf(stderr, "Differing 'consumed'.\n"); + fprintf(stderr, "consumed1 = %d, consumed2 = %d\n", + consumed1, consumed2); + } + + if (ret1 != ret2) { + fprintf(stderr, "Differing 'ret'.\n"); + fprintf(stderr, "ret1 = %d, ret2 = %d\n", + ret1, ret2); + } + + if (shift_held1 != shift_held2) { + fprintf(stderr, "Differing 'shift_held'.\n"); + } + + fprintf(stderr, "Sequence was: "); + for(int aux = 0; aux < consumed1; aux++) + fprintf(stderr, "%c", seq[aux]); + fprintf(stderr, "\n"); + //exit(0); + } + + + /*if ((ret = convert_sequence(seq, 5, &consumed)) == ERR) + continue; + + fprintf(stderr, "{\"\\e"); + for(int aux = 0; aux < consumed; aux++) + fprintf(stderr, "%c", seq[aux]); + fprintf(stderr, "\",\t0x%x,\t%s,\t%d,\t%s},\n", + ret, + shift_held ? "TRUE" : "FALSE", + consumed, + (ret == shiftcontrolleft) ? "SHIFTCONTROLLEFT" : + (ret == shiftcontrolright) ? "SHIFTCONTROLRIGHT" : + (ret == shiftcontrolup) ? "SHIFTCONTROLUP" : + (ret == shiftcontroldown) ? "SHIFTCONTROLDOWN" : + (ret == shiftcontrolhome) ? "SHIFTCONTROLHOME" : + (ret == shiftcontrolend) ? "SHIFTCONTROLEND" : + (ret == altleft) ? "ALTLEFT" : + (ret == altright) ? "ALTRIGHT" : + (ret == altup) ? "ALTUP" : + (ret == altdown) ? "ALTDOWN" : + (ret == shiftaltleft) ? "SHIFTALTLEFT" : + (ret == shiftaltright) ? "SHIFTALTRIGHT" : + (ret == shiftaltup) ? "SHIFTALTUP" : + (ret == shiftaltdown) ? "SHIFTALTDOWN" : "0");*/ + } + } + } + } + } while (TRUE) { #ifdef ENABLE_LINENUMBERS confirm_margin(); diff --git a/src/proto.h b/src/proto.h index d9efce9d..76c58d38 100644 --- a/src/proto.h +++ b/src/proto.h @@ -23,6 +23,9 @@ #include "nano.h" +int convert_sequence2(const int *seq, size_t length, int *consumed); +int convert_sequence(const int *seq, size_t length, int *consumed); + /* All external variables. See global.c for their descriptions. */ #ifndef NANO_TINY diff --git a/src/winio.c b/src/winio.c index a22c1891..25add7e0 100644 --- a/src/winio.c +++ b/src/winio.c @@ -759,12 +759,265 @@ int parse_kbinput(WINDOW *win) return retval; } +struct sequence_definition { + char *sequence; + int code; + bool shift_held; + int consumed; + int special_key; +}; + +struct sequence_definition sequences[] = { + {"\e[@", KEY_IC, FALSE, 2, 0}, + {"\e[1~", KEY_HOME, FALSE, 3, 0}, + {"\e[11~", KEY_F(1), FALSE, 4, 0}, + {"\e[12~", KEY_F(2), FALSE, 4, 0}, + {"\e[1;2A", KEY_UP, TRUE, 5, 0}, + {"\e[1;2B", KEY_DOWN, TRUE, 5, 0}, + {"\e[1;2C", KEY_RIGHT, TRUE, 5, 0}, + {"\e[1;2D", KEY_LEFT, TRUE, 5, 0}, + {"\e[1;2F", SHIFT_END, FALSE, 5, 0}, + {"\e[1;2H", SHIFT_HOME, FALSE, 5, 0}, + {"\e[13~", KEY_F(3), FALSE, 4, 0}, + {"\e[1;3A", ALT_UP, FALSE, 5, 0}, + {"\e[1;3B", ALT_DOWN, FALSE, 5, 0}, + {"\e[1;3C", ALT_RIGHT, FALSE, 5, 0}, + {"\e[1;3D", ALT_LEFT, FALSE, 5, 0}, + {"\e[14~", KEY_F(4), FALSE, 4, 0}, + {"\e[1;4A", SHIFT_PAGEUP, FALSE, 5, 0}, + {"\e[1;4B", SHIFT_PAGEDOWN, FALSE, 5, 0}, + {"\e[1;4C", SHIFT_END, FALSE, 5, 0}, + {"\e[1;4D", SHIFT_HOME, FALSE, 5, 0}, + {"\e[15~", KEY_F(5), FALSE, 4, 0}, + {"\e[1;5A", CONTROL_UP, FALSE, 5, 0}, + {"\e[1;5B", CONTROL_DOWN, FALSE, 5, 0}, + {"\e[1;5C", CONTROL_RIGHT, FALSE, 5, 0}, + {"\e[1;5D", CONTROL_LEFT, FALSE, 5, 0}, + {"\e[1;5F", CONTROL_END, FALSE, 5, 0}, + {"\e[1;5H", CONTROL_HOME, FALSE, 5, 0}, + {"\e[1;6A", 0, FALSE, 5, SHIFT_CONTROL_UP}, + {"\e[1;6B", 0, FALSE, 5, SHIFT_CONTROL_DOWN}, + {"\e[1;6C", 0, FALSE, 5, SHIFT_CONTROL_RIGHT}, + {"\e[1;6D", 0, FALSE, 5, SHIFT_CONTROL_LEFT}, + {"\e[1;6F", 0, FALSE, 5, SHIFT_CONTROL_END}, + {"\e[1;6H", 0, FALSE, 5, SHIFT_CONTROL_HOME}, + {"\e[17~", KEY_F(6), FALSE, 4, 0}, + {"\e[18~", KEY_F(7), FALSE, 4, 0}, + {"\e[19~", KEY_F(8), FALSE, 4, 0}, + {"\e[1;9A", ALT_UP, FALSE, 5, 0}, + {"\e[1;9B", ALT_DOWN, FALSE, 5, 0}, + {"\e[1;9C", ALT_RIGHT, FALSE, 5, 0}, + {"\e[1;9D", ALT_LEFT, FALSE, 5, 0}, + {"\e[20~", KEY_F(9), FALSE, 4, 0}, + {"\e[2~~", ERR, FALSE, 3, 0}, + {"\e[2~", KEY_IC, FALSE, 3, 0}, + {"\e[21~", KEY_F(10), FALSE, 4, 0}, + {"\e[23~", KEY_F(11), FALSE, 4, 0}, + {"\e[24~", KEY_F(12), FALSE, 4, 0}, + {"\e[25~", KEY_F(13), FALSE, 4, 0}, + {"\e[26~", KEY_F(14), FALSE, 4, 0}, + {"\e[28~", KEY_F(15), FALSE, 4, 0}, + {"\e[29~", KEY_F(16), FALSE, 4, 0}, + {"\e[3~", KEY_DC, FALSE, 3, 0}, + {"\e[4~", KEY_END, FALSE, 3, 0}, + {"\e[5^", KEY_PPAGE, FALSE, 3, 0}, + {"\e[5~", KEY_PPAGE, FALSE, 3, 0}, + {"\e[5;2~", 0, FALSE, 5, SHIFT_ALT_UP}, + {"\e[6^", KEY_NPAGE, FALSE, 3, 0}, + {"\e[6~", KEY_NPAGE, FALSE, 3, 0}, + {"\e[6;2~", 0, FALSE, 5, SHIFT_ALT_DOWN}, + {"\e[7~", KEY_HOME, FALSE, 3, 0}, + {"\e[7@", 0, FALSE, 3, SHIFT_CONTROL_HOME}, + {"\e[7^", CONTROL_HOME, FALSE, 3, 0}, + {"\e[7$", SHIFT_HOME, FALSE, 3, 0}, + {"\e[8~", KEY_END, FALSE, 3, 0}, + {"\e[8@", 0, FALSE, 3, SHIFT_CONTROL_END}, + {"\e[8^", CONTROL_END, FALSE, 3, 0}, + {"\e[8$", SHIFT_END, FALSE, 3, 0}, + {"\e[9", KEY_DC, FALSE, 2, 0}, + {"\e[A", KEY_UP, FALSE, 2, 0}, + {"\e[a", KEY_UP, TRUE, 2, 0}, + {"\e[[A", KEY_F(1), FALSE, 3, 0}, + {"\e[B", KEY_DOWN, FALSE, 2, 0}, + {"\e[b", KEY_DOWN, TRUE, 2, 0}, + {"\e[[B", KEY_F(2), FALSE, 3, 0}, + {"\e[C", KEY_RIGHT, FALSE, 2, 0}, + {"\e[c", KEY_RIGHT, TRUE, 2, 0}, + {"\e[[C", KEY_F(3), FALSE, 3, 0}, + {"\e[D", KEY_LEFT, FALSE, 2, 0}, + {"\e[d", KEY_LEFT, TRUE, 2, 0}, + {"\e[[D", KEY_F(4), FALSE, 3, 0}, + {"\e[[E", KEY_F(5), FALSE, 3, 0}, + {"\e[E", KEY_B2, FALSE, 2, 0}, + {"\e[F", KEY_END, FALSE, 2, 0}, + {"\e[G", KEY_NPAGE, FALSE, 2, 0}, + {"\e[H", KEY_HOME, FALSE, 2, 0}, + {"\e[I", KEY_PPAGE, FALSE, 2, 0}, + {"\e[L", KEY_IC, FALSE, 2, 0}, + {"\e[M", KEY_F(1), FALSE, 2, 0}, + {"\e[N", KEY_F(2), FALSE, 2, 0}, + {"\eO1;2A", KEY_UP, TRUE, 5, 0}, + {"\eO1;2B", KEY_DOWN, TRUE, 5, 0}, + {"\eO1;2C", KEY_RIGHT, TRUE, 5, 0}, + {"\eO1;2D", KEY_LEFT, TRUE, 5, 0}, + {"\eO1;2P", KEY_F(13), FALSE, 5, 0}, + {"\eO1;2Q", KEY_F(14), FALSE, 5, 0}, + {"\eO1;2R", KEY_F(15), FALSE, 5, 0}, + {"\eO1;2S", KEY_F(16), FALSE, 5, 0}, + {"\eO1;5A", CONTROL_UP, FALSE, 5, 0}, + {"\eO1;5B", CONTROL_DOWN, FALSE, 5, 0}, + {"\eO1;5C", CONTROL_RIGHT, FALSE, 5, 0}, + {"\eO1;5D", CONTROL_LEFT, FALSE, 5, 0}, + {"\eO2P", KEY_F(13), FALSE, 3, 0}, + {"\eO2Q", KEY_F(14), FALSE, 3, 0}, + {"\eO2R", KEY_F(15), FALSE, 3, 0}, + {"\eO2S", KEY_F(16), FALSE, 3, 0}, + {"\eO5A", CONTROL_UP, FALSE, 3, 0}, + {"\eO5B", CONTROL_DOWN, FALSE, 3, 0}, + {"\eO5C", CONTROL_RIGHT, FALSE, 3, 0}, + {"\eO5D", CONTROL_LEFT, FALSE, 3, 0}, + {"\eOA", KEY_UP, FALSE, 2, 0}, + {"\eoa", CONTROL_UP, FALSE, 2, 0}, + {"\eOa", CONTROL_UP, FALSE, 2, 0}, + {"\eOB", KEY_DOWN, FALSE, 2, 0}, + {"\eob", CONTROL_DOWN, FALSE, 2, 0}, + {"\eOb", CONTROL_DOWN, FALSE, 2, 0}, + {"\eOC", KEY_RIGHT, FALSE, 2, 0}, + {"\eoc", CONTROL_RIGHT, FALSE, 2, 0}, + {"\eOc", CONTROL_RIGHT, FALSE, 2, 0}, + {"\eOD", KEY_LEFT, FALSE, 2, 0}, + {"\eod", CONTROL_LEFT, FALSE, 2, 0}, + {"\eOd", CONTROL_LEFT, FALSE, 2, 0}, + {"\eOE", KEY_B2, FALSE, 2, 0}, + {"\eOF", KEY_END, FALSE, 2, 0}, + {"\eOH", KEY_HOME, FALSE, 2, 0}, + {"\eOj", '*', FALSE, 2, 0}, + {"\eOk", '+', FALSE, 2, 0}, + {"\eOl", ',', FALSE, 2, 0}, + {"\eOM", KEY_ENTER, FALSE, 2, 0}, + {"\eOm", '-', FALSE, 2, 0}, + {"\eOn", KEY_DC, FALSE, 2, 0}, + {"\eOo", '/', FALSE, 2, 0}, + {"\eOP", KEY_F(1), FALSE, 2, 0}, + {"\e[OP", KEY_F(1), FALSE, 3, 0}, + {"\eOp", KEY_IC, FALSE, 2, 0}, + {"\eOQ", KEY_F(2), FALSE, 2, 0}, + {"\e[OQ", KEY_F(2), FALSE, 3, 0}, + {"\eOq", KEY_END, FALSE, 2, 0}, + {"\eOr", KEY_DOWN, FALSE, 2, 0}, + {"\eOR", KEY_F(3), FALSE, 2, 0}, + {"\e[OR", KEY_F(3), FALSE, 3, 0}, + {"\eOS", KEY_F(4), FALSE, 2, 0}, + {"\e[OS", KEY_F(4), FALSE, 3, 0}, + {"\eOs", KEY_NPAGE, FALSE, 2, 0}, + {"\eOt", KEY_LEFT, FALSE, 2, 0}, + {"\eOT", KEY_F(5), FALSE, 2, 0}, + {"\eOU", KEY_F(6), FALSE, 2, 0}, + {"\eOu", KEY_B2, FALSE, 2, 0}, + {"\eOv", KEY_RIGHT, FALSE, 2, 0}, + {"\eOV", KEY_F(7), FALSE, 2, 0}, + {"\eOw", KEY_HOME, FALSE, 2, 0}, + {"\eOW", KEY_F(8), FALSE, 2, 0}, + {"\eOx", KEY_UP, FALSE, 2, 0}, + {"\eOX", KEY_F(9), FALSE, 2, 0}, + {"\eOY", KEY_F(10), FALSE, 2, 0}, + {"\eOy", KEY_PPAGE, FALSE, 2, 0}, + {"\e[P", KEY_F(4), FALSE, 2, 0}, + {"\e[Q", KEY_F(5), FALSE, 2, 0}, + {"\e[R", KEY_F(6), FALSE, 2, 0}, + {"\e[S", KEY_F(7), FALSE, 2, 0}, + {"\e[T", KEY_F(8), FALSE, 2, 0}, + {"\e[U", KEY_NPAGE, FALSE, 2, 0}, + {"\e[V", KEY_PPAGE, FALSE, 2, 0}, + {"\e[W", KEY_F(11), FALSE, 2, 0}, + {"\e[X", KEY_F(12), FALSE, 2, 0}, + {"\e[Y", KEY_END, FALSE, 2, 0}, + {"\e[Z", SHIFT_TAB, FALSE, 2, 0}, + /* Hacks */ + {"\e[10~", ERR, FALSE, 4, 0}, + {"\e[16~", ERR, FALSE, 4, 0}, + {"\e[16", ERR, FALSE, 3, 0}, + {"\e[1", ERR, FALSE, 3, 0}, + {"\e[0", ERR, FALSE, 3, 0}, + {"\e[", ERR, FALSE, 2, 0}, + {NULL, ERR, FALSE, 0, 0} +}; + +int convert_sequence2(const int *seq, size_t length, int *consumed) +{ + size_t idx = 0; + int ret = ERR; + + while(sequences[idx].sequence != NULL) { + int i; + for(i = 1; i < strlen(sequences[idx].sequence); i++) { + /*fprintf(stderr, "Will compare %c with %c.\n", + sequences[idx].sequence[i], (char)seq[i]);*/ + + if (sequences[idx].sequence[i] != (char)seq[i - 1]) + break; + } + + /* Found match! */ + if (i == strlen(sequences[idx].sequence)) { + /*fprintf(stderr, "Match found [%d]: %s\n", + idx, &sequences[idx].sequence[1]);*/ + *consumed = sequences[idx].consumed; + shift_held = sequences[idx].shift_held; + ret = sequences[idx].code; + break; + } + + idx++; + } + + //if (ret == ERR) + // *consumed = + + switch (sequences[idx].special_key) { + case SHIFT_CONTROL_UP: + ret = shiftcontrolup; + break; + case SHIFT_CONTROL_DOWN: + ret = shiftcontroldown; + break; + case SHIFT_CONTROL_RIGHT: + ret = shiftcontrolright; + break; + case SHIFT_CONTROL_LEFT: + ret = shiftcontrolleft; + break; + case SHIFT_CONTROL_END: + ret = shiftcontrolend; + break; + case SHIFT_CONTROL_HOME: + ret = shiftcontrolhome; + break; + case SHIFT_ALT_UP: + ret = shiftaltup; + break; + case SHIFT_ALT_DOWN: + ret = shiftaltdown; + break; + default: + break; + } + + return ret; +} + /* Translate escape sequences, most of which correspond to extended * keypad values, into their corresponding key values. These sequences * are generated when the keypad doesn't support the needed keys. * Assume that Escape has already been read in. */ int convert_sequence(const int *seq, size_t length, int *consumed) { + /*fprintf(stderr, "%c %c %c %c\n", + (char)seq[0], + (char)seq[1], + (char)seq[2], + (char)seq[3]);*/ + if (length > 1) { *consumed = 2; switch (seq[0]) {