Перенаправить ввод с клавиатуры 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 может дать некоторую информацию:

  • когда клавиатура не схватил и я щелкните правой кнопкой мыши

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

  • при выходе из контекстного меню:

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

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

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

Unmap

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


то, что я прошу

Я хочу или:

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

спасибо вы.

1 ответов


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

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

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

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

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