pynput
pynput copied to clipboard
Extra `ALT` keypresses in uinput keyboard controller
Description
I am seeing extra ALT keypresses in uinput keyboard controller.
I set uinput to run as a user using information from this post: https://github.com/moses-palmer/pynput/issues/568
Platform and pynput version
Some system details first.
OS 24.04.1 LTS (Noble Numbat) Python 3.12.6
Package Version
----------- -------
evdev 1.7.1
pip 25.0
pynput 1.7.7
python-xlib 0.33
six 1.16.0
Keyboard ANSI 105 keys US layout
setxkbmap -query
WARNING: Running setxkbmap against an Xwayland server
rules: evdev
model: pc105
layout: us
more /etc/default/keyboard
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"
Steps to reproduce the issue
I have a test program uinput_test.py (see the end). It should type the message
#This is uinput keyboard controller test
and some additional space and 'a' chars.
I am seeing output like this:
#T^[hy^[b^[o^[a^[r^[d ^[c^[o^[n^[t^[r^[o^[l^[l^[e^[r ^[t^[e^[s^[t ^[aA^[a
I have logged the keys using showkey like this:
sudo showkey | tee log_of_showkeys.txt
I have translated the keys using dumpkeys:
Here is the output of my translation:
keycode 42 press; keycode 42 = Shift
keycode 20 press; keycode 20 = +t
keycode 42 release; keycode 42 = Shift
keycode 20 release; keycode 20 = +t
keycode 100 press; keycode 100 = Alt
keycode 35 press; keycode 35 = +h
keycode 100 release; keycode 100 = Alt
keycode 35 release; keycode 35 = +h
keycode 100 press; keycode 100 = Alt
keycode 23 press; keycode 23 = +i
keycode 100 release; keycode 100 = Alt
keycode 23 release; keycode 23 = +i
keycode 100 press; keycode 100 = Alt
keycode 31 press; keycode 31 = +s
keycode 100 release; keycode 100 = Alt
keycode 31 release; keycode 31 = +s
keycode 42 press; keycode 42 = Shift
keycode 57 press; keycode 57 = space
keycode 42 release; keycode 42 = Shift
keycode 57 release; keycode 57 = space
keycode 100 press; keycode 100 = Alt
keycode 23 press; keycode 23 = +i
keycode 100 release; keycode 100 = Alt
keycode 23 release; keycode 23 = +i
keycode 100 press; keycode 100 = Alt
keycode 31 press; keycode 31 = +s
keycode 100 release; keycode 100 = Alt
keycode 31 release; keycode 31 = +s
keycode 42 press; keycode 42 = Shift
keycode 57 press; keycode 57 = space
keycode 42 release; keycode 42 = Shift
keycode 57 release; keycode 57 = space
keycode 100 press; keycode 100 = Alt
keycode 22 press; keycode 22 = +u
keycode 100 release; keycode 100 = Alt
keycode 22 release; keycode 22 = +u
keycode 100 press; keycode 100 = Alt
keycode 23 press; keycode 23 = +i
keycode 100 release; keycode 100 = Alt
keycode 23 release; keycode 23 = +i
keycode 100 press; keycode 100 = Alt
keycode 49 press; keycode 49 = +n
keycode 100 release; keycode 100 = Alt
keycode 49 release; keycode 49 = +n
keycode 100 press; keycode 100 = Alt
keycode 25 press; keycode 25 = +p
keycode 100 release; keycode 100 = Alt
keycode 25 release; keycode 25 = +p
keycode 100 press; keycode 100 = Alt
keycode 22 press; keycode 22 = +u
keycode 100 release; keycode 100 = Alt
keycode 22 release; keycode 22 = +u
keycode 100 press; keycode 100 = Alt
keycode 20 press; keycode 20 = +t
keycode 100 release; keycode 100 = Alt
keycode 20 release; keycode 20 = +t
keycode 42 press; keycode 42 = Shift
keycode 57 press; keycode 57 = space
keycode 42 release; keycode 42 = Shift
keycode 57 release; keycode 57 = space
keycode 100 press; keycode 100 = Alt
keycode 37 press; keycode 37 = +k
keycode 100 release; keycode 100 = Alt
keycode 37 release; keycode 37 = +k
keycode 100 press; keycode 100 = Alt
keycode 18 press; keycode 18 = +e
keycode 100 release; keycode 100 = Alt
keycode 18 release; keycode 18 = +e
keycode 100 press; keycode 100 = Alt
keycode 21 press; keycode 21 = +y
keycode 100 release; keycode 100 = Alt
keycode 21 release; keycode 21 = +y
keycode 100 press; keycode 100 = Alt
keycode 48 press; keycode 48 = +b
keycode 100 release; keycode 100 = Alt
keycode 48 release; keycode 48 = +b
keycode 100 press; keycode 100 = Alt
keycode 24 press; keycode 24 = +o
keycode 100 release; keycode 100 = Alt
keycode 24 release; keycode 24 = +o
keycode 100 press; keycode 100 = Alt
keycode 30 press; keycode 30 = +a
keycode 100 release; keycode 100 = Alt
keycode 30 release; keycode 30 = +a
keycode 100 press; keycode 100 = Alt
keycode 19 press; keycode 19 = +r
keycode 100 release; keycode 100 = Alt
keycode 19 release; keycode 19 = +r
keycode 100 press; keycode 100 = Alt
keycode 32 press; keycode 32 = +d
keycode 100 release; keycode 100 = Alt
keycode 32 release; keycode 32 = +d
keycode 42 press; keycode 42 = Shift
keycode 57 press; keycode 57 = space
keycode 42 release; keycode 42 = Shift
keycode 57 release; keycode 57 = space
keycode 100 press; keycode 100 = Alt
keycode 46 press; keycode 46 = +c
keycode 100 release; keycode 100 = Alt
keycode 46 release; keycode 46 = +c
keycode 100 press; keycode 100 = Alt
keycode 24 press; keycode 24 = +o
keycode 100 release; keycode 100 = Alt
keycode 24 release; keycode 24 = +o
keycode 100 press; keycode 100 = Alt
keycode 49 press; keycode 49 = +n
keycode 100 release; keycode 100 = Alt
keycode 49 release; keycode 49 = +n
keycode 100 press; keycode 100 = Alt
keycode 20 press; keycode 20 = +t
keycode 100 release; keycode 100 = Alt
keycode 20 release; keycode 20 = +t
keycode 100 press; keycode 100 = Alt
keycode 19 press; keycode 19 = +r
keycode 100 release; keycode 100 = Alt
keycode 19 release; keycode 19 = +r
keycode 100 press; keycode 100 = Alt
keycode 24 press; keycode 24 = +o
keycode 100 release; keycode 100 = Alt
keycode 24 release; keycode 24 = +o
keycode 100 press; keycode 100 = Alt
keycode 38 press; keycode 38 = +l
keycode 100 release; keycode 100 = Alt
keycode 38 release; keycode 38 = +l
keycode 100 press; keycode 100 = Alt
keycode 38 press; keycode 38 = +l
keycode 100 release; keycode 100 = Alt
keycode 38 release; keycode 38 = +l
keycode 100 press; keycode 100 = Alt
keycode 18 press; keycode 18 = +e
keycode 100 release; keycode 100 = Alt
keycode 18 release; keycode 18 = +e
keycode 100 press; keycode 100 = Alt
keycode 19 press; keycode 19 = +r
keycode 100 release; keycode 100 = Alt
keycode 19 release; keycode 19 = +r
keycode 42 press; keycode 42 = Shift
keycode 57 press; keycode 57 = space
keycode 42 release; keycode 42 = Shift
keycode 57 release; keycode 57 = space
keycode 100 press; keycode 100 = Alt
keycode 20 press; keycode 20 = +t
keycode 100 release; keycode 100 = Alt
keycode 20 release; keycode 20 = +t
keycode 100 press; keycode 100 = Alt
keycode 18 press; keycode 18 = +e
keycode 100 release; keycode 100 = Alt
keycode 18 release; keycode 18 = +e
keycode 100 press; keycode 100 = Alt
keycode 31 press; keycode 31 = +s
keycode 100 release; keycode 100 = Alt
keycode 31 release; keycode 31 = +s
keycode 100 press; keycode 100 = Alt
keycode 20 press; keycode 20 = +t
keycode 100 release; keycode 100 = Alt
keycode 20 rel; keycode 20 = +t
Contents of uinput_test.py:
#!/usr/bin/env python3
import os
os.environ['PYNPUT_BACKEND_KEYBOARD'] = 'uinput'
os.environ['PYNPUT_BACKEND_MOUSE'] = 'dummy'
import pynput
# importing pynput after defining env variables for uinput
Key = pynput.keyboard.Key
controller = pynput.keyboard.Controller()
input('Press enter to send test string: ')
controller.type('#This is uinput keyboard controller test')
# Press and release space
controller.press(Key.space)
controller.release(Key.space)
# Type a lower case A; this will work even if no key on the
# physical keyboard is labelled 'A'
controller.press('a')
controller.release('a')
# Type two upper case As
controller.press('A')
controller.release('A')
with controller.pressed(Key.shift):
controller.press('a')
controller.release('a')
print('Done!')