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

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

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

Надо работать на Трискеле.

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

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

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

2 ответа

Решение

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

Оказывается, просто назначить keyym для ключа недостаточно. KeySym должен быть также интерпретирован. Это делается в "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 содержит интерпретации для keysyms для управления мышью. Содержит требуемую интерпретацию Pointer_EnableKeys это упомянуто в одной из ссылок в моем вопросе. Тем не менее, он не содержит интерпретаций для Pointer_Left (а также Pointer_Right и так далее). Вот почему это не сработало для меня раньше. Вместо этого много KP_* Ключевые слова интерпретируются. В конце концов, стандарт заключается в том, чтобы поставить клавиши мыши на клавиатуре.

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

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

xkb_compat    { include "teck_mousekeys+complete"   };

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

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]};

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

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

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

Другие вопросы по тегам