Найчистішим було б, звичайно, виправити помилку, але, як вирішення, фоновий сценарій нижче виконає роботу:
#!/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
Якщо все працює добре, додайте його до програм запуску: тире> програми запуску> Додати, додайте команду:
/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 фонових сценаріїв. Більшість з них тижнями без перезавантаження. Ніколи не помічав жодного впливу на моїх літніх системах. Майте на увазі, що ваша система все одно працює з численними циклами.