2

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

  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#Mouse_control
  • Кажется, можно контролировать показатели: http://www.charvolant.org/~doug/xkb/html/node5.html . (Ищите "индикатор" на этой странице; упоминается несколько раз.)

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

2 ответа2

6

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

Оказывается, что простого назначения ключа для ключа недостаточно. 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_LeftPointer_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]};
0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .