The cleanest would be of course to fix the bug, but as a workaround, the background script below will do the job:
#!/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'"])
How to use
- Copy the script above into an empty file, save it as
NM_on.py
Test-run it in the background with the command:
python3 /path/to/NM_on.py
If all works fine, add it to Startup Applications: Dash > Startup Applications > Add, add the command:
/bin/bash -c "sleep 10 && python3 /path/to/NM_on.py"
Explanation
We can get the current Num Lock
state in more than one way:
running the command:
xset q
which will give an output like:
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
.....
or with the command:
gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state
which simply returns 'on'
, 'off'
or 'unknown'
.
Since the latter is extremely light weight, we can very well use it in a background script to check once per second, and set the value to 'on'
, if necessary, with the command:
gsettings set org.gnome.settings-daemon.peripherals.keyboard numlock-state 'on'
and so it does...
Edit
For some reason, I missed your last paragraph, in which you referred to another answer with a similar solution.
Purely theoretically, I always have a problem with scripts that blindly (re-) apply settings, without checking the current state. There could be an argument to do so, if the command
gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state
to get the current value, would be more demanding that simply run
numlockx on
to (re-)set numlockx on
.
Looking at the time both commands need to finish (which is at least an indication) it is however the other way around; the command
gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state
seems to be more "light-weight".
Running a background script a bad idea?
Of course, if you have no reason to run a background script, then don't. At the same time, if a background script is well- written, thoroughly tested, procedures are smartly optimized, and if it does not add any noticeable effect on the processor occupation, it would be silly not to use as a workaround if it adds important functionality or saves you time.
I constantly have at least 4-8 background scripts running. Most of them for weeks without a restart. Never noticed any effect, on my elderly system(s). Keep in mind your system is running numerous loops anyway.
Best Answer
This seems to be a little bug - actually appearing in Ubuntu 15.10.
It happens when you start typing too early after booting the computer
(especially when typing the root password ... after being asked to do so).
It also happens when you open an application with root privileges too early.
It does not happen when you wait a few minutes or after the screen turns off when inactive.
As a workaround : either wait some time before starting to type or press the Num key twice.
I decided to file a bug report on Launchpad.
Please may everybody reading this and having observed the same behaviour
confirm this bug to increase its importance and get it fixed quickly! Thank you.
To do this, click the link above, log into your launchpad account and click on:
This bug affects X people. Does this bug affect you?
- Select "Yes".