Как получить Ctrl, Shift или Alt с помощью getch () ncurses? - PullRequest
11 голосов
/ 17 марта 2012

Как получить Ctrl , Shift или Alt с getch() курсами?
Я не могу заставить его работать, чтобы получить Ctrl , Shift или Alt с getch() с использованием ncurses? Я что-то упускаю в мужчине?

Ответы [ 6 ]

16 голосов
/ 26 сентября 2015

Удивительно, как иногда правильный ответ понижают в должности, а ответы, которые «авторитетно» сдаются, продвигают ... С небольшим творческим потенциалом, key_name фактически держит правильный ключ для выяснения этого, с одним предупреждением - это SHIFT / ALT/ CTRL нажимаются одновременно с другими клавишами:

  • Во-первых, для "обычных клавиш", таких как печатаемые, вы можете легко обнаружить сдвиг, потому что это прописные буквы.

  • Для специальных ключей, например, KEY_LEFT, вы увидите, что код, сгенерированный при выборе SHIFT, на самом деле KEY_SLEFT.То же самое для KEY_RIGHT.К сожалению, нет такой удачи для KEY_UP / KEY_DOWN, которая, похоже, не смущает SHIFT.Таким образом, вы можете отличить возвращаемый символ от getch () - KEY_S .. подразумевает, что нажат Shift.

  • Для ALT (по крайней мере, что не захвачено X или Aqua Windowmanager, по крайней мере), keyname преобразует ключ в M ... что-то.

  • Для CTRL вы получите «^», предшествующий фактическому имени ключа.Например, ^ R для ключа 18

Теперь вы можете выяснить коды клавиш для своих операторов switch (getch) и т. Д. С помощью простого фрагмента:

ch = getch(); endwin(); printf("KEY NAME : %s - %d\n", keyname(ch),ch);

и это все.Подумайте, прежде чем окончательно сказать «не могу».Может быть, есть способ, который менее очевиден.

6 голосов
/ 23 марта 2012

(Чтобы примерно скопировать мой ответ из Как получить клавиши Shift + X / Alt + X в Curses? )

Короче говоря - вы не можете. Клавиши-модификаторы - это просто модификаторы. Они не существуют сами по себе, они изменяют какую-то другую (печатную) клавишу, которую вы можете нажать.

Тем не менее, если вы чувствуете себя особенно смелым, вы можете попробовать мой libtermkey , который по крайней мере правильно проанализирует такие вещи, как Ctrl - стрелка .

Наконец, если вы чувствуете себя еще смелее, вы можете запустить терминал, который я написал, pangoterm , который имеет универсальные способы кодирования любых произвольно модифицированных ключей Unicode, поэтому он может различать Ctrl - м из Введите , Ctrl - Shift - a из Ctrl - a и т.д ...

Однако, кроме них, ответ остается "Вы не можете".

3 голосов
/ 10 октября 2016

По крайней мере для модификатора управления есть простое решение.Проклятия были получены из исходного кода vi, в котором вы найдете следующее (см. https://github.com/n-t-roff/ex-1.1/blob/master/ex.h строка 77 и https://github.com/n-t-roff/ex-1.1/blob/master/ex_vops.c строка 445):

#ifndef CTRL
#define CTRL(c) ((c) & 037)
#endif

switch(getch()) {
case CTRL('r'):
    /* key ctrl-r (i.e. ^R) pressed */

Зависит от используемых включает CTRL может или не может быть уже определен в вашем коде.

2 голосов
/ 11 октября 2016

Соглашаясь (частично) с @leonerd, ncurses only даст вам эти ключи, поскольку они используются в качестве модификаторов для других ключей (игнорируя ASCII escape символ, который некоторые люди путают с клавишей Alt ).Некоторые конкретные устройства могут указывать эту информацию (например, консоль Linux, как описано в console_ioctl (4) ), но это не проблема, которую ncurses решит для вас.

См.FAQ по ncurses Как использовать модификаторы shift или control? для длинного ответа.

Но коротко: ncurses не сообщает вам, использовался ли данный модификатор (кроме специальныхслучаи, когда было хорошо известно использование shift ), а скорее описания его терминалов предоставляют информацию либо на

  • , умножая фактические функциональные клавиши на комбинации клавиш shift- и control-модификаторы или
  • с использованием имен, основанных на функциональных клавишах xterm в стиле ПК (shift - 2, alt - 3, control - 5 и т. д.), чтобы предоставить информацию.

Есть два подхода, потому что первый использует массив не более чем из 60 функциональных клавиш (достаточно хорошо для комбинаций shift и control), а другой просто использует определяемые пользователем имена).

Все эти модифицированные ключи дают несколько байтов;приложение, использующее keypad() (конечно) в ncurses, получит одно число.В последнем случае коды клавиш определяются во время выполнения.

Это относится в основном к специальным клавишам (функциональные клавиши, клавиши редактирования и клавиши курсора).Для обычных ключей можно предположить, что keyname дает какое-то особое поведение, но, читая описание, этого не происходит:

  • сообщает о управляющих символах ASCII (что вы можете сделатьиспользуя макрос iscntrl), а
  • делает предположения о мета (которые полезны только для xterm терминалов, которые вы, вероятно, будете использовать), а
  • не предлагает помощи длямодификатор shift .

Из терминалов ... все имеют информацию о модификаторе, доступную внутри, но терминалы обычно не имеют возможности передавать эту информацию приложениям.xterm может сделать это, используя ресурс modifyOtherKeys,

   modifyOtherKeys (class ModifyOtherKeys)
           Like modifyCursorKeys, tells xterm to construct an escape
           sequence for other keys (such as "2") when modified by
           Control-, Alt- or Meta-modifiers.  This feature does not apply
           to function keys and well-defined keys such as ESC or the
           control keys.  The default is "0":

           0    disables this feature.

           1    enables this feature for keys except for those with well-
                known behavior, e.g., Tab, Backarrow and some special
                control character cases, e.g., Control-Space to make a
                NUL.

           2    enables this feature for keys including the exceptions
                listed.

, который соответствует последовательности управления, что можно увидеть в Последовательности управления XTerm :

CSI > Ps; Ps m
          Set or reset resource-values used by xterm to decide whether
          to construct escape sequences holding information about the
          modifiers pressed with a given key.  The first parameter iden-
          tifies the resource to set/reset.  The second parameter is the
          value to assign to the resource.  If the second parameter is
          omitted, the resource is reset to its initial value.
            Ps = 0  -> modifyKeyboard.
            Ps = 1  -> modifyCursorKeys.
            Ps = 2  -> modifyFunctionKeys.
            Ps = 4  -> modifyOtherKeys.

но (будучи специфической для xterm функцией), нет причин использовать ее в ncurses: это излишне усложнит getch.

0 голосов
/ 18 мая 2013

Вы можете вызвать key_name( c ), чтобы превратить ключ, сгенерированный из getch(), во что-то, что показывает вам состояние ctrl-модификатора.

Например, этот код показывает «^ R», если вы нажмете Ctrl-R:

while( true )
{
   char c = getch();
   if ( ERR == c )
      break;

   const char *name = key_name( c );

   move( 2, 2 );
   clear();
   printw( "You entered: %s             ", name );
   refresh();

}
0 голосов
/ 17 марта 2012

Вы не можете, ни в одном из основных эмуляторов терминала нет расширения для его достижения.

Если вы предполагаете среду X11, вы можете использовать функции X11 для ее получения, но это другой вопросв целом.

...