Перенаправление ввода с клавиатуры с помощью XGrabKey или XGrabKeyboard

Цель

Я хочу перенаправить ввод с клавиатуры в разные окна в зависимости от клавиши. Не весь ключ будет перенаправлен в одно и то же окно, я не могу использовать XSetInputFocus.


Первая попытка: XGrabKey

Я обнаружил, что могу захватить определенные клавиши, а затем отправить событие в нужное окно. Я использовал XGrabKey вот так

XGrabKey( mDisplay(), 
                    XKeysymToKeycode(mDisplay(),XK_F1) , 
                    AnyModifier ,
                    RootWindow(mDisplay(), mScreenNum),
                    false, //Events aren't sent to the focused window
                    GrabModeAsync, 
                    GrabModeAsync );

Это не работает для клавиш F1–F4, но работает для F5 и F6. Это также не работает для некоторых обычных клавиш, таких как e, r и t. Могут быть и другие. Мне нужно иметь возможность перенаправлять Fkeys, поэтому это решение не сработало для меня.


Вторая попытка: XGrabKeyboard

Я пробовал с XGrabKeyboard, вот так

XGrabKeyboard(mDisplay(), 
                        RootWindow(mDisplay(), mScreenNum),
                        false, 
                        GrabModeAsync, 
                        GrabModeAsync, 
                        CurrentTime);

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

Другая информация

Об этой проблеме уже говорилось здесь, но они не найти решение. Я использую Lubuntu (LXDE), а не GNOME, и у меня все та же проблема.

Событие unmap может дать некоторую информацию:

  • Когда клавиатура не захвачена и я нажимаю правой кнопкой мыши

    отображается контекстное меню, события отмены карты нет.

  • Когда я выхожу из контекстного меню:

    У меня есть 3 события unmap: (я печатаю имя окна рядом с Unmap)

Unmap pcmanfm  
Unmap pcmanfm 
Unmap
  • Когда клавиатура схвачена и я нажимаю правой кнопкой мыши

    У меня есть только 1 событие unmap:

Unmap

Похоже, что контекстное меню отображается до отображения.


Что я прошу

Я хотел бы либо:

  • Используйте XGrabKeyboard без побочных эффектов
  • Используйте XGrabKey с любым ключом
  • Используйте другую функцию, которая позволит мне перенаправить ввод с клавиатуры

Спасибо.


person Heckel    schedule 02.05.2014    source источник


Ответы (1)


Я не нашел решения проблемы с XGrabKeyboard.

Не удалось выполнить XGrabKey для некоторых ключей, потому что они уже были захвачены OpenBox. В Openbox есть несколько встроенных горячих клавиш, использующих XGrabKey. Поскольку я использую AnyModifier, если был сделан какой-либо захват, включающий этот ключ, захват не удастся.

Например, если программа захватывает Ctrl+F1, вы не можете получить F1 с помощью AnyModifier. Вы можете захватить F1 без модификатора, но захват не будет активен, если пользователь, например, нажмет Alt+F1.

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

Другое решение — захватить ключ со всеми модификаторами, кроме того, который уже захвачен. Захвата клавиши без модификатора недостаточно, потому что, например, Num-Lock является модификатором, и вы, вероятно, не хотите, чтобы ваш захват был активным или не зависел от Num-Lock.

person Heckel    schedule 26.07.2014
comment
Но ведь это решение главной цели, верно? - person étale-cohomology; 14.11.2016
comment
Я не очень понимаю ваш вопрос. Да, это решение, которое я использовал для проблемы, которая у меня была. - person Heckel; 14.11.2016