From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Mon, 22 Oct 2012 16:49:42 +0200
Subject: [PATCH 2/5] keyboard input: add commented-out debugging logging mechanism.
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.linux@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
|
b
|
is_idle (void) |
1811 | 1811 | } |
1812 | 1812 | |
1813 | 1813 | /* --------------------------------------------------------------------------------------------- */ |
| 1814 | #if 0 |
| 1815 | # define key_debug 1 |
| 1816 | static void keylog (const char *fmt, ...) |
| 1817 | { |
| 1818 | static int logfd = -1; |
| 1819 | |
| 1820 | if (logfd < 0) { |
| 1821 | logfd = open ("/tmp/mc_key.log", O_CREAT | O_WRONLY | O_APPEND, 0666); |
| 1822 | if (logfd < 0) |
| 1823 | return; |
| 1824 | } |
| 1825 | |
| 1826 | va_list ap; |
| 1827 | va_start (ap, fmt); |
| 1828 | char *p = NULL; |
| 1829 | vasprintf (&p, fmt, ap); |
| 1830 | va_end (ap); |
| 1831 | |
| 1832 | if (p) |
| 1833 | { |
| 1834 | write (logfd, p, strlen(p)); |
| 1835 | free (p); |
| 1836 | } |
| 1837 | } |
| 1838 | #else |
| 1839 | # define key_debug 0 |
| 1840 | # define keylog(...) ((void)0) |
| 1841 | #endif |
1814 | 1842 | |
1815 | 1843 | int |
1816 | 1844 | get_key_code (int no_delay) |
… |
… |
get_key_code (int no_delay) |
1820 | 1848 | static struct timeval esctime = { -1, -1 }; |
1821 | 1849 | static int lastnodelay = -1; |
1822 | 1850 | |
| 1851 | keylog ("entered %s(no_delay:%d)\n", __func__, no_delay); |
| 1852 | |
1823 | 1853 | if (no_delay != lastnodelay) |
1824 | 1854 | { |
1825 | 1855 | this = NULL; |
… |
… |
get_key_code (int no_delay) |
1832 | 1862 | int m; |
1833 | 1863 | |
1834 | 1864 | m = parse_extended_mouse_coordinates (); |
| 1865 | keylog (" pending_keys!=NULL. m=%d\n", m); |
1835 | 1866 | if (m == 1) |
1836 | 1867 | { |
1837 | 1868 | pending_keys = seq_append = NULL; |
1838 | 1869 | this = NULL; |
| 1870 | keylog ("return MCKEY_EXTENDED_MOUSE\n"); |
1839 | 1871 | return MCKEY_EXTENDED_MOUSE; |
1840 | 1872 | } |
1841 | 1873 | if (m == -1) |
1842 | 1874 | { |
1843 | 1875 | int d = *pending_keys++; |
| 1876 | keylog (" d=*pending_keys++=%d\n", d); |
1844 | 1877 | check_pend: |
1845 | 1878 | if (*pending_keys == 0) |
1846 | 1879 | { |
… |
… |
get_key_code (int no_delay) |
1850 | 1883 | else if (d == ESC_CHAR) |
1851 | 1884 | { |
1852 | 1885 | d = ALT (*pending_keys++); |
| 1886 | keylog (" d=ALT(*pending_keys++)=ALT(%d)=%d\n", pending_keys[-1], d); |
1853 | 1887 | goto check_pend; |
1854 | 1888 | } |
1855 | 1889 | if ((d > 127 && d < 256) && use_8th_bit_as_meta) |
| 1890 | { |
1856 | 1891 | d = ALT (d & 0x7f); |
| 1892 | keylog (" d=ALT(d & 0x7f)=ALT(%d)=%d\n", d & 0x7f, d); |
| 1893 | } |
1857 | 1894 | this = NULL; |
| 1895 | keylog ("return correct_key_code(%d)\n", d); |
1858 | 1896 | return correct_key_code (d); |
1859 | 1897 | } |
1860 | 1898 | /* else if (m == 0), just let it continue */ |
… |
… |
get_key_code (int no_delay) |
1865 | 1903 | tty_nodelay (TRUE); |
1866 | 1904 | |
1867 | 1905 | c = tty_lowlevel_getch (); |
| 1906 | keylog (" c=tty_lowlevel_getch()=%d\n", c); |
1868 | 1907 | #if (defined(USE_NCURSES) || defined(USE_NCURSESW)) && defined(KEY_RESIZE) |
1869 | 1908 | if (c == KEY_RESIZE) |
1870 | 1909 | goto nodelay_try_again; |
… |
… |
get_key_code (int no_delay) |
1941 | 1980 | pending_keys = seq_append = NULL; |
1942 | 1981 | code = this->code; |
1943 | 1982 | this = NULL; |
| 1983 | keylog ("2 return correct_key_code(%d)\n", code); |
1944 | 1984 | return correct_key_code (code); |
1945 | 1985 | } |
1946 | 1986 | /* No match yet, but it may be a prefix for a valid seq */ |
1947 | 1987 | |
1948 | 1988 | if (!push_char (c)) |
1949 | 1989 | { |
| 1990 | keylog (" push_char(%d) failure (no more space)\n", c); |
1950 | 1991 | pending_keys = seq_buffer; |
1951 | 1992 | goto pend_send; |
1952 | 1993 | } |
| 1994 | keylog (" push_char(%d) ok\n", c); |
1953 | 1995 | parent = this; |
1954 | 1996 | this = this->child; |
1955 | 1997 | if (parent->action == MCKEY_ESCAPE && old_esc_mode) |
… |
… |
get_key_code (int no_delay) |
1967 | 2009 | } |
1968 | 2010 | esctime.tv_sec = -1; |
1969 | 2011 | c = xgetch_second (); |
| 2012 | keylog (" c=xgetch_second()=%d\n", c); |
1970 | 2013 | if (c == -1) |
1971 | 2014 | { |
1972 | 2015 | pending_keys = seq_append = NULL; |
1973 | 2016 | this = NULL; |
| 2017 | keylog ("return ESC_CHAR\n"); |
1974 | 2018 | return ESC_CHAR; |
1975 | 2019 | } |
1976 | 2020 | continue; |
… |
… |
get_key_code (int no_delay) |
1978 | 2022 | if (no_delay) |
1979 | 2023 | goto nodelay_try_again; |
1980 | 2024 | c = tty_lowlevel_getch (); |
| 2025 | keylog (" 2 c=tty_lowlevel_getch()=%d\n", c); |
1981 | 2026 | continue; |
1982 | 2027 | } |
1983 | 2028 | |
… |
… |
get_key_code (int no_delay) |
2000 | 2045 | |
2001 | 2046 | pending_keys = seq_append = NULL; |
2002 | 2047 | this = NULL; |
| 2048 | keylog ("3 return correct_key_code(%d)\n", c); |
2003 | 2049 | return correct_key_code (c); |
2004 | 2050 | } |
2005 | 2051 | |
2006 | 2052 | /* Unknown sequence. Maybe a prefix of a longer one. Save it. */ |
| 2053 | keylog (" push_char(%d)\n", c); |
2007 | 2054 | push_char (c); |
| 2055 | if (key_debug) |
| 2056 | { |
| 2057 | int i = 0; |
| 2058 | do |
| 2059 | keylog (" seq_buffer[%d]:%d\n", i, seq_buffer[i]); |
| 2060 | while (seq_buffer[i++]); |
| 2061 | } |
2008 | 2062 | pending_keys = seq_buffer; |
2009 | 2063 | goto pend_send; |
2010 | 2064 | |
2011 | 2065 | } /* while (this != NULL) */ |
2012 | 2066 | |
2013 | 2067 | this = NULL; |
| 2068 | keylog ("4 return correct_key_code(%d)\n", c); |
2014 | 2069 | return correct_key_code (c); |
2015 | 2070 | } |
2016 | 2071 | |