Вопрос: Сделать Scroll Lock для переключения клавиш мыши на домашнюю строку


Это то, что я хочу:

  1. Я нажимаю Scroll Lock на моей клавиатуре.
  2. Загорится светодиод Scroll Lock на моей клавиатуре.
  3. Ключи вокруг правого домашнего ряда теперь управляют указателем мыши (перемещение, щелчок, щелчок правой кнопкой мыши, перетаскивание и т. Д. Подобно клавишам мыши на обычной клавиатуре.)
  4. Остальные ключи ничего не делают, так же, как раньше или что-то еще.
  5. Я снова нажимаю Scroll Lock.
  6. Светодиодный индикатор прокрутки выключается.
  7. Нет клавиш мыши.

Он должен работать над Trisquel,

Я использовал ХКВ прежде чем переназначить некоторые ключи, поэтому я подумал, что, возможно, xkb может это сделать. И похоже, что он может:

  • Существует множество клавишных клавиш, которые можно использовать: Pointer_Left, Pointer_DownRight, Pointer_Button_Dflt, Pointer_Drag_Dflt, и т.д.
  • Существуют клавиши блокировки, такие как ISO_Level5_Lock,
  • Есть некоторые особенности, которые нужно настроить для активации клавиш мыши: https://wiki.archlinux.org/index.php/X_KeyBoard_extension#Mouse_control
  • Кажется, что можно контролировать показатели: http://www.charvolant.org/~doug/xkb/html/node5.html, (Найдите «указатель» на этой странице, он упоминается несколько раз.)

Однако я новичок в Linux и xkb. Мне удалось сделать очень простые перетаскивания ключей с помощью xkb, но, к сожалению, я не могу понять, как собрать все вышеперечисленное вместе, и в каких файлах его поставить. Решения, не связанные с xkb, тоже в порядке, как и частичные решения.


2
2017-12-31 12:58


Источник




Ответы:


Раньше я просто пытался назначить Pointer_Left keyym к некоторому ключу, и Pointer_EnableKeys для прокрутки блокировки. Однако это не переместило указатель мыши влево. Вместо этого он ничего не сделал.

Оказывается, недостаточно просто назначить keyym ключа. Ключ должен быть интерпретированы также. Это делается в файле «compat». В моей системе они находятся в каталоге / usr / share / X11 / xkb / compat.

Я сделал свою собственную раскладку клавиатуры, следуя этому превосходному руководству: http://hack.org/mc/writings/xkb.html, Это означает, что у меня есть файл «teck.xkb» (я называю свой макет «teck»). Этот файл содержит следующую строку:

xkb_compat    { include "complete"  };

Просмотр / usr / share / X11 / xkb / compat / complete показывает, что этот файл содержит файл с именем «mousekeys» в той же папке. Бинго.

Файл mousekeys содержит интерпретации клавиш для управления мышью. Он содержит требуемую интерпретацию Pointer_EnableKeys что упоминается в одна из ссылок в моем вопросе, Однако он не содержит интерпретаций для Pointer_Left (а также Pointer_Right и так далее). Вот почему это не сработало для меня раньше. Вместо этого, много KP_* keyyms интерпретируются. В конце концов, стандартом является наведение клавиш мыши на клавиатуру.

К счастью, в конце файла mousekeys есть некоторый код для настройки индикатора для клавиш мыши. Отлично!

Поэтому я скопировал файл mousekeys в новую папку под названием «compat» рядом с моим файлом teck.xkb и переименовал его в «teck_mousekeys». Я обновил файл teck.xkb соответственно:

xkb_compat    { include "teck_mousekeys+complete"   };

Затем я начал редактировать файл teck_mousekeys. Вместо того, чтобы использовать KP_* keysyms, я использовал те, которые мне нужны (ключи вокруг правой строки). Вот результат:

default partial xkb_compatibility "mousekeys" {

    interpret.repeat= True;



    interpret m {
        action = MovePtr(x=-1,y=+1);
    };

    interpret comma {
        action = MovePtr(x=+0,y=+1);
    };

    interpret period {
        action = MovePtr(x=+1,y=+1);
    };

    interpret j {
        action = MovePtr(x=-1,y=+0);
    };

    interpret l {
        action = MovePtr(x=+1,y=+0);
    };

    interpret u {
        action = MovePtr(x=-1,y=-1);
    };

    interpret i {
        action = MovePtr(x=+0,y=-1);
    };

    interpret o {
        action = MovePtr(x=+1,y=-1);
    };



    interpret k {
        action = PointerButton(button=default);
    };

    interpret semicolon {
        action = PointerButton(button=3);
    };

    interpret space {
        action = PointerButton(button=default,count=2);
    };

    interpret y {
        action = SetPtrDflt(affect=defaultButton,button=3);
    };

    interpret h {
        action = SetPtrDflt(affect=defaultButton,button=2);
    };

    interpret n {
        action = SetPtrDflt(affect=defaultButton,button=1);
    };

    interpret p {
        action = LockPointerButton(button=default,affect=lock);
    };

    interpret apostrophe {
        action = LockPointerButton(button=default,affect=unlock);
    };



    indicator "Scroll Lock" {
        indicatorDrivesKeyboard;
        controls= MouseKeys;
    };

};

(Приведенное выше предполагает макет QWERTY.)

В моей пользовательской раскладке клавиатуры я определяю блокировку прокрутки для переключения клавиш мыши:

key <SCLK> {[Pointer_EnableKeys]};

6
2018-01-18 18:08





Я мало знаю о xkb, но я сделал что-то, основанное на xevdevserver source, программа, которая считывает события evdev Linux с устройства / dev / input / eventX и внедряет их на X-сервер с использованием расширения XTEST. Код можно найти здесь:

https://bitbucket.org/brmtron/mouseemu/

Основным недостатком является то, что вам нужно будет запускать что-то, используя sudo, что может и не быть.


0
2018-01-01 14:13