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