Держите NumLock всегда включенным

Я уже физически снял колпачок клавиши Num Lock, поэтому случайно не нажимаю ее (я использую очень компактную клавиатуру). Но я понимаю, что в xorg есть ошибка, которая переключает Num Lock на off когда я переключаю раскладку клавиатуры.

Поэтому мне нужно что-то, что либо вообще предотвращает "отключение" Num Lock, либо, альтернативно (возможно, проще?), Отслеживает состояние Num Lock и включает его "вкл", как только он замечает, что он "выключен".

Вот ответ Unix, который, кажется, решает эту проблему, но для LXDE. Что мне нужно сделать, чтобы эта идея работала в Ubuntu 15.04 и Unity?

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

1 ответ

Решение

Самым чистым было бы, конечно, исправить ошибку, но в качестве обходного пути, фоновый скрипт ниже сделает эту работу:

#!/usr/bin/env python3
import subprocess
import time

key = "org.gnome.settings-daemon.peripherals.keyboard numlock-state"
while True:
    time.sleep(1)
    state = subprocess.check_output([
        "/bin/bash", "-c", "gsettings get "+key]).decode("utf-8").strip()
    if state != "'on'":
        subprocess.Popen([
            "/bin/bash", "-c", "gsettings set "+key+" 'on'"])

Как пользоваться

  • Скопируйте приведенный выше скрипт в пустой файл, сохраните его как NM_on.py
  • Протестируйте его в фоновом режиме с помощью команды:

    python3 /path/to/NM_on.py
    
  • Если все работает нормально, добавьте его в Startup Applications: Dash > Startup Applications > Add, добавьте команду:

    /bin/bash -c "sleep 10 && python3 /path/to/NM_on.py"
    

объяснение

Мы можем получить текущий Num Lockуказать более чем одним способом:

  • запустив команду:

    xset q
    

    который даст вывод как:

    Keyboard Control:
      auto repeat:  on    key click percent:  0    LED mask:  00000000
      XKB indicators:
        00: Caps Lock:   off    01: Num Lock:    off    02: Scroll Lock: off
        03: Compose:     off    04: Kana:        off    05: Sleep:       off
        06: Suspend:     off    07: Mute:        off    08: Misc:        off
        09: Mail:        off    10: Charging:    off    11: Shift Lock:  off
        12: Group 2:     off    13: Mouse Keys:  off
      auto repeat delay:  500    repeat rate:  33
    .....
    

    или с помощью команды:

    gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state
    

    который просто возвращает 'on', 'off' или же 'unknown',

    Так как последний очень легкий, мы можем очень хорошо использовать его в фоновом скрипте для проверки раз в секунду и установить значение в 'on'при необходимости с помощью команды:

    gsettings set org.gnome.settings-daemon.peripherals.keyboard numlock-state 'on'
    

и так оно и есть...


редактировать

По какой-то причине я пропустил ваш последний абзац, в котором вы ссылались на другой ответ с аналогичным решением.

Чисто теоретически, у меня всегда есть проблема со скриптами, которые слепо (повторно) применяют настройки, не проверяя текущее состояние. Для этого может быть аргумент, если команда

gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state

чтобы получить текущее значение, было бы более требовательным, что просто запустить

numlockx on

(пере)установить numlockx on,
Если посмотреть на то, когда обе команды должны закончить (что является по крайней мере указанием), то все наоборот; команда

gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state

кажется более "легким".

Запуск фонового скрипта плохая идея?

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

У меня постоянно работает как минимум 4-8 фоновых скриптов. Большинство из них неделями без перезапуска. Никогда не замечал никакого влияния на мою пожилую систему (ы). Имейте в виду, что ваша система в любом случае выполняет множество циклов.

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