xref: /aosp_15_r20/external/autotest/client/cros/graphics/graphics_uinput.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li# Copyright 2020 The Chromium OS Authors. All rights reserved.
3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
4*9c5db199SXin Li# found in the LICENSE file.
5*9c5db199SXin Li
6*9c5db199SXin Li"""
7*9c5db199SXin LiProvides uinput utils for generating user input events.
8*9c5db199SXin Li"""
9*9c5db199SXin Li
10*9c5db199SXin Li# Please limit the use of the uinput library to this file. Try not to spread
11*9c5db199SXin Li# dependencies and abstract as much as possible to make switching to a different
12*9c5db199SXin Li# input library in the future easier.
13*9c5db199SXin Liimport uinput
14*9c5db199SXin Li
15*9c5db199SXin Li
16*9c5db199SXin Li# Don't create a device during build_packages or for tests that don't need it.
17*9c5db199SXin Liuinput_device_keyboard = None
18*9c5db199SXin Liuinput_device_touch = None
19*9c5db199SXin Liuinput_device_mouse_rel = None
20*9c5db199SXin Li
21*9c5db199SXin Li# Don't add more events to this list than are used. For a complete list of
22*9c5db199SXin Li# available events check python2.7/site-packages/uinput/ev.py.
23*9c5db199SXin LiUINPUT_DEVICE_EVENTS_KEYBOARD = [
24*9c5db199SXin Li    uinput.KEY_F4,
25*9c5db199SXin Li    uinput.KEY_F11,
26*9c5db199SXin Li    uinput.KEY_KPPLUS,
27*9c5db199SXin Li    uinput.KEY_KPMINUS,
28*9c5db199SXin Li    uinput.KEY_LEFTCTRL,
29*9c5db199SXin Li    uinput.KEY_TAB,
30*9c5db199SXin Li    uinput.KEY_UP,
31*9c5db199SXin Li    uinput.KEY_DOWN,
32*9c5db199SXin Li    uinput.KEY_LEFT,
33*9c5db199SXin Li    uinput.KEY_RIGHT,
34*9c5db199SXin Li    uinput.KEY_RIGHTSHIFT,
35*9c5db199SXin Li    uinput.KEY_LEFTALT,
36*9c5db199SXin Li    uinput.KEY_A,
37*9c5db199SXin Li    uinput.KEY_M,
38*9c5db199SXin Li    uinput.KEY_Q,
39*9c5db199SXin Li    uinput.KEY_V
40*9c5db199SXin Li]
41*9c5db199SXin Li# TODO(ihf): Find an ABS sequence that actually works.
42*9c5db199SXin LiUINPUT_DEVICE_EVENTS_TOUCH = [
43*9c5db199SXin Li    uinput.BTN_TOUCH,
44*9c5db199SXin Li    uinput.ABS_MT_SLOT,
45*9c5db199SXin Li    uinput.ABS_MT_POSITION_X + (0, 2560, 0, 0),
46*9c5db199SXin Li    uinput.ABS_MT_POSITION_Y + (0, 1700, 0, 0),
47*9c5db199SXin Li    uinput.ABS_MT_TRACKING_ID + (0, 10, 0, 0),
48*9c5db199SXin Li    uinput.BTN_TOUCH
49*9c5db199SXin Li]
50*9c5db199SXin LiUINPUT_DEVICE_EVENTS_MOUSE_REL = [
51*9c5db199SXin Li    uinput.REL_X,
52*9c5db199SXin Li    uinput.REL_Y,
53*9c5db199SXin Li    uinput.BTN_MOUSE,
54*9c5db199SXin Li    uinput.BTN_LEFT,
55*9c5db199SXin Li    uinput.BTN_RIGHT
56*9c5db199SXin Li]
57*9c5db199SXin Li
58*9c5db199SXin Li
59*9c5db199SXin Lidef get_device_keyboard():
60*9c5db199SXin Li    """
61*9c5db199SXin Li    Lazy initialize device and return it. We don't want to create a device
62*9c5db199SXin Li    during build_packages or for tests that don't need it, hence init with None.
63*9c5db199SXin Li    """
64*9c5db199SXin Li    global uinput_device_keyboard
65*9c5db199SXin Li    if uinput_device_keyboard is None:
66*9c5db199SXin Li        uinput_device_keyboard = uinput.Device(UINPUT_DEVICE_EVENTS_KEYBOARD)
67*9c5db199SXin Li    return uinput_device_keyboard
68*9c5db199SXin Li
69*9c5db199SXin Li
70*9c5db199SXin Lidef get_device_mouse_rel():
71*9c5db199SXin Li    """
72*9c5db199SXin Li    Lazy initialize device and return it. We don't want to create a device
73*9c5db199SXin Li    during build_packages or for tests that don't need it, hence init with None.
74*9c5db199SXin Li    """
75*9c5db199SXin Li    global uinput_device_mouse_rel
76*9c5db199SXin Li    if uinput_device_mouse_rel is None:
77*9c5db199SXin Li        uinput_device_mouse_rel = uinput.Device(UINPUT_DEVICE_EVENTS_MOUSE_REL)
78*9c5db199SXin Li    return uinput_device_mouse_rel
79*9c5db199SXin Li
80*9c5db199SXin Li
81*9c5db199SXin Lidef get_device_touch():
82*9c5db199SXin Li    """
83*9c5db199SXin Li    Lazy initialize device and return it. We don't want to create a device
84*9c5db199SXin Li    during build_packages or for tests that don't need it, hence init with None.
85*9c5db199SXin Li    """
86*9c5db199SXin Li    global uinput_device_touch
87*9c5db199SXin Li    if uinput_device_touch is None:
88*9c5db199SXin Li        uinput_device_touch = uinput.Device(UINPUT_DEVICE_EVENTS_TOUCH)
89*9c5db199SXin Li    return uinput_device_touch
90*9c5db199SXin Li
91*9c5db199SXin Li
92*9c5db199SXin Lidef translate_name(event_name):
93*9c5db199SXin Li    """
94*9c5db199SXin Li    Translates string |event_name| to uinput event.
95*9c5db199SXin Li    """
96*9c5db199SXin Li    return getattr(uinput, event_name)
97*9c5db199SXin Li
98*9c5db199SXin Li
99*9c5db199SXin Lidef emit(device, event_name, value, syn=True):
100*9c5db199SXin Li    """
101*9c5db199SXin Li    Wrapper for uinput.emit. Emits event with value.
102*9c5db199SXin Li    Example: ('REL_X', 20), ('BTN_RIGHT', 1)
103*9c5db199SXin Li    """
104*9c5db199SXin Li    event = translate_name(event_name)
105*9c5db199SXin Li    device.emit(event, value, syn)
106*9c5db199SXin Li
107*9c5db199SXin Li
108*9c5db199SXin Lidef emit_click(device, event_name, syn=True):
109*9c5db199SXin Li    """
110*9c5db199SXin Li    Wrapper for uinput.emit_click. Emits click event. Only KEY and BTN events
111*9c5db199SXin Li    are accepted, otherwise ValueError is raised. Example: 'KEY_A'
112*9c5db199SXin Li    """
113*9c5db199SXin Li    event = translate_name(event_name)
114*9c5db199SXin Li    device.emit_click(event, syn)
115*9c5db199SXin Li
116*9c5db199SXin Li
117*9c5db199SXin Lidef emit_combo(device, event_names, syn=True):
118*9c5db199SXin Li    """
119*9c5db199SXin Li    Wrapper for uinput.emit_combo. Emits sequence of events.
120*9c5db199SXin Li    Example: ['KEY_LEFTCTRL', 'KEY_LEFTALT', 'KEY_F5']
121*9c5db199SXin Li    """
122*9c5db199SXin Li    events = [translate_name(en) for en in event_names]
123*9c5db199SXin Li    device.emit_combo(events, syn)
124