pynput icon indicating copy to clipboard operation
pynput copied to clipboard

Extra `ALT` keypresses in uinput keyboard controller

Open toddthegeek opened this issue 1 year ago • 0 comments

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!')

toddthegeek avatar Feb 05 '25 21:02 toddthegeek