No contexto da pergunta, shift+up
e shift+down
referem-se a shift-cursor-up
e shift-cursor-down
(em vez de, por exemplo, shift-page-up
e shift-page-down
), porque a pergunta foi feita sobre a seleção de vários < em> linhas .
Esta é, na verdade, mais de uma pergunta:
- primeiro, como fazer com que as ncurses reconheçam
shift+up
, etc. e
- se a biblioteca de menus ncurses faz isso e
- como obter um menu fazendo isso, se não.
Primeiro, ncurses fornece definições predefinidas (por X / Open Curses) para um conjunto portátil (mais / menos) de chaves especiais. Referindo-se a terminfo (5) , você pode notar:
key_sf kind kF scroll-forward key
key_sleft kLFT #4 shifted left-arrow
key
key_sr kri kR scroll-backward key
key_sright kRIT %i shifted right-arrow
key
mas não há nada marcado como "tecla de seta para cima deslocada". Somente com alguma retrospectiva, pode-se relacionar kind
e kri
a kLFT
e kRIT
. Antes de adicionar suporte para chaves especiais modificadas para o xterm em 1999, havia pouca arte prévia:
Patch #94 - 1999/3/27 - XFree86 3.9Pf
add parameters to function keys to indicate if shift, control or alt are set. The codes are based on a description of a DEC VT510 with a PC keyboard, from Jeffrey Altman .
Mais tarde, esse esquema foi alterado para reduzir a confusão de aplicativos. Outros desenvolvedores que copiaram o recurso do xterm não o seguiram alterando seus programas:
Patch #167 - 2002/8/24 - XFree86 4.2.0
add modifyCursorKeys
resource to control how the shift- and similar modifiers are used to make a cursor escape sequence. The default makes a modified escape sequence always start with CSI and puts the modifier as the second parameter, to avoid confusing applications that would interpret the first parameter as a repeat count. The original behavior can be obtained by setting the resource to 0 (newsgroup discussion with Stephen J Turnbull, Jeffrey Altman).
Enquanto isso, nas ncurses, parecia útil incorporá-las a descrições de terminal (porque ncurses usa o banco de dados terminal, digamos, tabelas como as que o tmux usa). Eles dependem de um recurso para recursos definidos pelo usuário introduzidos por ncurses 5.0 . No banco de dados do terminal, o recurso é mencionado para o xterm em 2004 :
# 2004-07-17
# * add xterm-pc-fkeys -TD
que (além de consolidar trabalhos anteriores desde 2001 ) tentou lidar com as variações codificações de modificadores que podem ser usadas com diferentes combinações de recursos xterm - bem como as semelhanças que diferem em graus variados do esquema de codificação xterm.
A convenção usada para os recursos definidos pelo usuário começou com a adição de kDN
e kUP
à lista (seu shift+down
e shift+up
) e um número correspondente aos códigos modificadores xterm. Muito mais tarde, ficou claro que kind
e kri
poderiam ter o mesmo significado. Mas, como resultado, você pode encontrar descrições de terminal com kDN
e kUP
(que somente ncurses lê - outros aplicativos e bibliotecas que lêem o banco de dados de terminal negligenciando isso diretamente por cerca de 16 anos).
Os recursos estendidos estão resumidos no banco de dados do terminal .
Agora (começando a segunda parte), o ncurses fornece uma biblioteca de menus. Isso é (com algumas extensões, como suporte a caracteres multibyte), uma reimplementação da biblioteca de menus SVr4. Consulte a página de manual para menu_driver(3x)
para isso, bem como os programas em ncurses-examples que demonstram a biblioteca. A resposta curta é que a biblioteca de menus não predefine o comportamento sobre o qual você está perguntando, mas que um aplicativo pode usar a biblioteca para fazer o que é solicitado. Comece olhando para ver como usar esse detalhe:
REQ_TOGGLE_ITEM
Select/deselect an item.
O problema maior é aquele gerado usando recursos definidos pelo usuário neste aplicativo. A maioria dos aplicativos que usam as bibliotecas de formulários e de menus baseiam-se em fazer declarações de caso com os símbolos predefinidos para chaves especiais. Para shift+up
e shift+down
você não teria isso (a menos que a coincidência de kind
e kri
fosse anotada e aplicada). Para recursos definidos pelo usuário, não há códigos de chave predefinidos (como KEY_DOWN
in curses.h
). Você tem valores definidos em tempo de execução determinados pela função key_defined
. Então, ao invés de uma simples declaração de caso ( é não KEY_SDOWN
em curses.h
), alguma indireção é necessária.