3
\$\begingroup\$

I am looking for some feedback on the code below, mainly for efficiency or mechanism correctness (like eval vs. subprocess). I am also curious if .find() is the best mechanism to use here. I am not familiar with regex, so my crutch (or benefit, depending) is using .find() over learning a sublanguage like regex.

import subprocess
get_device_id = subprocess.Popen(["xinput", "list", "SynPS/2 Synaptics TouchPad"], stdout=subprocess.PIPE)
gdi_str = str(get_device_id.stdout.read())
gdi_id_find = (gdi_str[gdi_str.find('id='):])
gdi_len = 3
gdi = (gdi_id_find[gdi_len:5])
if gdi.isdigit():
 device_id = gdi
else:
 pass
get_prop_id = subprocess.Popen(["xinput", "list-props", "15"], stdout=subprocess.PIPE)
r = str(get_prop_id.stdout.read())
if "2 Synaptics TouchPad" in r:
 b = (r[r.find('libinput Tapping Enabled ('):])
 bLen = len('libinput Tapping Enabled (')
 b = (b[bLen:b.find(')')])
 if b.isdigit():
 prop_id = b
 else:
 pass
subprocess.run(["xinput", "set-prop", device_id, prop_id, "1"])

This code parses the output of:

xinput list SynPS/2 Synaptics TouchPad

to get a numerical device ID, in this case 15:

SynPS/2 Synaptics TouchPad id=15 [slave pointer (2)]

The code then runs:

xinput list-props 15 # 15 is our parsed id

and parses this output:

Device 'SynPS/2 Synaptics TouchPad':
Device Enabled (147): 1
Coordinate Transformation Matrix (149): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
libinput Tapping Enabled (300): 0
libinput Tapping Enabled Default (301): 0
libinput Tapping Drag Enabled (302): 1
libinput Tapping Drag Enabled Default (303): 1
libinput Tapping Drag Lock Enabled (304): 0
libinput Tapping Drag Lock Enabled Default (305): 0
libinput Tapping Button Mapping Enabled (306): 1, 0
libinput Tapping Button Mapping Default (307): 1, 0
libinput Natural Scrolling Enabled (282): 0
libinput Natural Scrolling Enabled Default (283): 0
libinput Disable While Typing Enabled (308): 1
libinput Disable While Typing Enabled Default (309): 1
libinput Scroll Methods Available (286): 1, 1, 0
libinput Scroll Method Enabled (287): 1, 0, 0
libinput Scroll Method Enabled Default (288): 1, 0, 0
libinput Click Methods Available (310): 1, 1
libinput Click Method Enabled (311): 1, 0
libinput Click Method Enabled Default (312): 1, 0
libinput Middle Emulation Enabled (291): 0
libinput Middle Emulation Enabled Default (292): 0
libinput Accel Speed (293): 0.000000
libinput Accel Speed Default (294): 0.000000
libinput Left Handed Enabled (298): 0
libinput Left Handed Enabled Default (299): 0
libinput Send Events Modes Available (267): 1, 1
libinput Send Events Mode Enabled (268): 0, 0
libinput Send Events Mode Enabled Default (269): 0, 0
Device Node (270): "/dev/input/event10"
Device Product ID (271): 2, 7
libinput Drag Lock Buttons (284): <no items>
libinput Horizontal Scroll Enabled (285): 1

for the purposes of getting the prop-id for "libinput Tapping Enabled", in this case 300:

libinput Tapping Enabled (300): 0

Once the value is established, the code does a basic check for .isdigit() and if True, presents the values to:

subprocess.run(["xinput", "set-prop", device_id, prop_id, "1"])

Which ultimately sets the value to 1:

libinput Tapping Enabled (300): 1
200_success
146k22 gold badges190 silver badges479 bronze badges
asked Jul 8, 2018 at 17:39
\$\endgroup\$

1 Answer 1

1
\$\begingroup\$

There's no need for a redundant pass after your if; these can be deleted:

else:
 pass

xinput --list and xinput --list-props aren't long-running commands. It's simpler to subprocess.run() them, with standard output redirected to a variable:

get_device_id = subprocess.run(["xinput", "list",
 "SynPS/2 Synaptics TouchPad"],
 capture_output=True)
if get_device_id.returncode != 0
 sys.exit(get_device_id.returncode)
gdi_str = get_device_id.stdout

I don't believe that first command is actually required - xinput --list-props is quite happy to accept a device name instead of a property:

xinput --list-props 'SynPS/2 Synaptics TouchPad'
answered Jul 24, 2018 at 13:28
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.