<<< Date Index >>>     <<< Thread Index >>>

Re: [Mutt] #3350: inconsistent handling of key bindings/codes



On Sat, 3 Apr 2010, Michael Elkins wrote:

On Sat, Apr 03, 2010 at 09:36:44PM -0400, Thomas Dickey wrote:
On Sun, 4 Apr 2010, Mutt wrote:
The problem is that the ncurses library doesn't have a keycode for
ctrl+<UP> or ctrl+<DOWN>.  Instead you get a multibyte escape sequence.

That's an extension (mutt could in principle ask ncurses for the binding
of kUP5 and kDN5).  Use "infocmp -x" to see some of the possibilities.

Can you explain in a little more detail how this is supposed to work?
It was not clear to me which of the following would be true:

1) there is some way to make getch() return a KEY_ constant for
ctrl-<UP>

2) mutt would have to query the termcap entry for kUP5 and internally
convert a user's specification of "\c<up>" to the kUP5 sequence.

Briefly:

several of the terminfo entries in ncurses have "extended" capabilities defined. These are names not in the predefined table of booleans, numbers, strings. When a terminfo entry is compiled, ncurses determines from the syntax which type to use.

A convention is used for xterm and related entries (including rxvt) which uses a mixed-case name with a numeric suffix (based on xterm's modifier codes). It's been in use for several years, and "should" be available on multiple platforms.

An application can use these by a tigetstr to check existence, e.g.,

        char *s;

        s = tigetstr("kDC6");
        if (s != 0 && (long)(s) != -1) {
                /* use the value */
        }

ncurses decides that any of these strings that begin with "k" are (by convention...) key names, and if

        use_extended_names(TRUE);

was called, adds them to the table that getch uses to decode keys. ncurses generates a keycode for these extended strings, and will return that number.

An application can make its own list of these keycodes by using key_defined() for the by-convention names kDN6, kUP5, etc. The keyname() function also can be used, on the value from getch(), to get the name of the key.

--
Thomas E. Dickey
http://invisible-island.net
ftp://invisible-island.net