Figuring out what exactly happens in get_key_code() when user uses various function keys is not trivial. While working on some fixes, I added a debugging code which records a log in /tmp/mc_key.log; I would like to save future developers from doing this again.
This patch adds my debugging code, disabled via "#if 0". Signed-off-by: Denys Vlasenko <vda.li...@googlemail.com> --- lib/tty/key.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 55 insertions(+), 0 deletions(-) diff --git a/lib/tty/key.c b/lib/tty/key.c index d2142fa..33732db 100644 --- a/lib/tty/key.c +++ b/lib/tty/key.c @@ -1811,6 +1811,34 @@ is_idle (void) } /* --------------------------------------------------------------------------------------------- */ +#if 0 +# define key_debug 1 +static void keylog (const char *fmt, ...) +{ + static int logfd = -1; + + if (logfd < 0) { + logfd = open ("/tmp/mc_key.log", O_CREAT | O_WRONLY | O_APPEND, 0666); + if (logfd < 0) + return; + } + + va_list ap; + va_start (ap, fmt); + char *p = NULL; + vasprintf (&p, fmt, ap); + va_end (ap); + + if (p) + { + write (logfd, p, strlen(p)); + free (p); + } +} +#else +# define key_debug 0 +# define keylog(...) ((void)0) +#endif int get_key_code (int no_delay) @@ -1820,6 +1848,8 @@ get_key_code (int no_delay) static struct timeval esctime = { -1, -1 }; static int lastnodelay = -1; + keylog ("entered %s(no_delay:%d)\n", __func__, no_delay); + if (no_delay != lastnodelay) { this = NULL; @@ -1832,15 +1862,18 @@ get_key_code (int no_delay) int m; m = parse_extended_mouse_coordinates (); + keylog (" pending_keys!=NULL. m=%d\n", m); if (m == 1) { pending_keys = seq_append = NULL; this = NULL; + keylog ("return MCKEY_EXTENDED_MOUSE\n"); return MCKEY_EXTENDED_MOUSE; } if (m == -1) { int d = *pending_keys++; + keylog (" d=*pending_keys++=%d\n", d); check_pend: if (*pending_keys == 0) { @@ -1850,11 +1883,16 @@ get_key_code (int no_delay) else if (d == ESC_CHAR) { d = ALT (*pending_keys++); + keylog (" d=ALT(*pending_keys++)=ALT(%d)=%d\n", pending_keys[-1], d); goto check_pend; } if ((d > 127 && d < 256) && use_8th_bit_as_meta) + { d = ALT (d & 0x7f); + keylog (" d=ALT(d & 0x7f)=ALT(%d)=%d\n", d & 0x7f, d); + } this = NULL; + keylog ("return correct_key_code(%d)\n", d); return correct_key_code (d); } /* else if (m == 0), just let it continue */ @@ -1865,6 +1903,7 @@ get_key_code (int no_delay) tty_nodelay (TRUE); c = tty_lowlevel_getch (); + keylog (" c=tty_lowlevel_getch()=%d\n", c); #if (defined(USE_NCURSES) || defined(USE_NCURSESW)) && defined(KEY_RESIZE) if (c == KEY_RESIZE) goto nodelay_try_again; @@ -1941,15 +1980,18 @@ get_key_code (int no_delay) pending_keys = seq_append = NULL; code = this->code; this = NULL; + keylog ("2 return correct_key_code(%d)\n", code); return correct_key_code (code); } /* No match yet, but it may be a prefix for a valid seq */ if (!push_char (c)) { + keylog (" push_char(%d) failure (no more space)\n", c); pending_keys = seq_buffer; goto pend_send; } + keylog (" push_char(%d) ok\n", c); parent = this; this = this->child; if (parent->action == MCKEY_ESCAPE && old_esc_mode) @@ -1967,10 +2009,12 @@ get_key_code (int no_delay) } esctime.tv_sec = -1; c = xgetch_second (); + keylog (" c=xgetch_second()=%d\n", c); if (c == -1) { pending_keys = seq_append = NULL; this = NULL; + keylog ("return ESC_CHAR\n"); return ESC_CHAR; } continue; @@ -1978,6 +2022,7 @@ get_key_code (int no_delay) if (no_delay) goto nodelay_try_again; c = tty_lowlevel_getch (); + keylog (" 2 c=tty_lowlevel_getch()=%d\n", c); continue; } @@ -2000,17 +2045,27 @@ get_key_code (int no_delay) pending_keys = seq_append = NULL; this = NULL; + keylog ("3 return correct_key_code(%d)\n", c); return correct_key_code (c); } /* Unknown sequence. Maybe a prefix of a longer one. Save it. */ + keylog (" push_char(%d)\n", c); push_char (c); + if (key_debug) + { + int i = 0; + do + keylog (" seq_buffer[%d]:%d\n", i, seq_buffer[i]); + while (seq_buffer[i++]); + } pending_keys = seq_buffer; goto pend_send; } /* while (this != NULL) */ this = NULL; + keylog ("4 return correct_key_code(%d)\n", c); return correct_key_code (c); } -- 1.7.7.6 _______________________________________________ mc-devel mailing list https://mail.gnome.org/mailman/listinfo/mc-devel