Numpad emulation

keyboard shortcutskeyboard-layoutx11xkb

My new laptop (Dell Inspiron 5578) has no numeric pad.
Many laptops without dedicated numpad keys have numpad accessible through Fn, but not this one. When I run xev and try to use traditional Fn combos (e.g., Fn+J for 1), it sees no event. And the numbers are not even on the labels.

AFAIU, I cannot create any shortcut with the Fn key, because Fn is not passed to the OS.
But I could theoretically use Alt_L+Super_L instead. The question is how to do it properly. I'd prefer to do it on a lower level than keyboard layout in order to work well with all the VMs, even with non-Linux ones.

Environment: Qubes OS. The host part is based on Fedora.

I've tried:

  • Bind an xdotool command via Xfce key shortcut. This produces various weird results: The command (xdotool key KP_1 and variations) usually works OK, but not when invoked by shortcut. When invoked by shortcut, the problem probably is that modifier keys are pressed at the time. I've tried various modifications (--clearmodifiers, keyup for modifiers etc.), none of them works well.
  • Do the same with autokey. I got some freezes of autokey.

Non-solutions:

  • Use external numpad/keyboard: While I have a numpad (sort of) on my external keyboard, I'd like to have one even on the internal one, e.g., when travelling and it is impossible or at least uncomfortable to use the external keyboard.
  • Use number row: In Czech layout, the number row is used primarily for accented letters. The layout I use (extracs variant of CShack) does not have numbers in the “number row” at all.
  • Buy a different laptop: It was hard to find a laptop satisfying my various requirements.

Best Answer

You could try kbindkeys, numlockx and a slightly customized keyboard.

Once you install xbindkeys, you have to run it. It will tell you what to do to create the basic configuration.

Then you use xbindkeys -k to identify the key and modify the configuration file (it's all documented in the default configuration file).

At last, I suggest you run xbindkeys -v -n to see if everything works. If it does, you can run xbindkeys for that session and maybe add it to your startup scripts.

In my case, the Windows key (right) does the binding, and my ~/.xbindkeysrc is:

"numlockx toggle"
    m:0x10 + c:134
    Mod2 + Multi_key

Now you can add the mappings. You will use the fifth and sixth levels (numlock and shift+numlock).

At the top of /usr/share/X11/xkb/symbols/cz, right after:

default  partial alphanumeric_keys

add this snippet:

xkb_symbols "with_numpad" {
    include "cz(basic)"

    key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
    key <AC07>  { [         j,          J,   apostrophe,     NoSymbol , 1, 1] };
    key <AC08>  { [         k,          K,      lstroke,     NoSymbol , 2, 2] };
    key <AC09>  { [         l,          L,      Lstroke,     NoSymbol , 3, 3] };
};

Now, when you press the window key (right), xkeybind will set numlock, which in turn will make J,K,L and so on return 1,2,3.

Last step, set the new keyboard with:

 setxkbmap cz with_numpad