python-uinput: Move cros_[type_]keys.py out of patch

Makes it easier to edit the 2 python scripts manually, no
code change.

BUG=chromium:714950
TEST=emerge-elm -av python-uinput
     equery-elm files python-uinput shows the 2 python scripts.

Change-Id: I3789d46d070c1445e5c9bb52877bf6350116441b
Reviewed-on: https://chromium-review.googlesource.com/486559
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Ilja H. Friedel <ihf@chromium.org>
Reviewed-by: Ilja H. Friedel <ihf@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/dev-python/python-uinput/files/0001-ChromeOS-uinput-wrappers.patch b/dev-python/python-uinput/files/0001-ChromeOS-uinput-wrappers.patch
deleted file mode 100644
index f21599d..0000000
--- a/dev-python/python-uinput/files/0001-ChromeOS-uinput-wrappers.patch
+++ /dev/null
@@ -1,340 +0,0 @@
-From a5cde8bbf5117293e3fecb6c6f2d0f79f48c11f0 Mon Sep 17 00:00:00 2001
-From: "Ilja H. Friedel" <ihf@chromium.org>
-Date: Mon, 9 Mar 2015 23:26:21 -0700
-Subject: [PATCH] ChromeOS uinput wrappers.
-
-Add the default ChromeOS (English) keyboard mapping.
-Also add a command line tool to conveniently use keystrokes.
-This adds xdotool functionality under freon.
-
-BUG=chromium:459451
-TEST=Verified all keys on Link.
----
- src/cros_keys.py      | 288 ++++++++++++++++++++++++++++++++++++++++++++++++++
- src/cros_type_keys.py |  19 ++++
- 2 files changed, 307 insertions(+)
- create mode 100755 src/cros_keys.py
- create mode 100755 src/cros_type_keys.py
-
-diff --git src/cros_keys.py src/cros_keys.py
-new file mode 100755
-index 0000000..6b830dc
---- /dev/null
-+++ src/cros_keys.py
-@@ -0,0 +1,288 @@
-+# Copyright 2015 The Chromium OS Authors. All rights reserved.
-+# Use of this source code is governed by a BSD-style license that can be
-+# found in the LICENSE file.
-+
-+import argparse
-+# Get all evdev/uinput events in our namespace.
-+# pylint: disable=wildcard-import, unused-wildcard-import
-+from uinput.ev import *
-+import subprocess
-+import time
-+import uinput
-+
-+# Default delay between key presses in seconds. 12ms is the xdotool default.
-+default_delay = 0.012
-+uinput_device_keyboard = None
-+
-+
-+# This dictionary contains most 7 bit ASCII characters. Add more if needed.
-+# TODO(ihf): Create this table using xkbcommon to support arbirtrary
-+# character sets and keyboard layouts.
-+_CROS_CHAR_MAP = {
-+    "\b": [KEY_BACKSPACE],
-+    "\t": [KEY_TAB],
-+    "\n": [KEY_ENTER],
-+
-+    " ":  [KEY_SPACE],
-+    "!":  [KEY_LEFTSHIFT, KEY_1],
-+    '"':  [KEY_LEFTSHIFT, KEY_APOSTROPHE],
-+    "#":  [KEY_LEFTSHIFT, KEY_3],
-+    "$":  [KEY_LEFTSHIFT, KEY_4],
-+    "%":  [KEY_LEFTSHIFT, KEY_5],
-+    "&":  [KEY_LEFTSHIFT, KEY_7],
-+    "'":  [KEY_APOSTROPHE],
-+    "(":  [KEY_LEFTSHIFT, KEY_9],
-+    ")":  [KEY_LEFTSHIFT, KEY_0],
-+    "*":  [KEY_KPASTERISK],
-+    "+":  [KEY_LEFTSHIFT, KEY_EQUAL],
-+    ",":  [KEY_COMMA],
-+    "-":  [KEY_MINUS],
-+    ".":  [KEY_DOT],
-+    "/":  [KEY_SLASH],
-+
-+    "0":  [KEY_0],
-+    "1":  [KEY_1],
-+    "2":  [KEY_2],
-+    "3":  [KEY_3],
-+    "4":  [KEY_4],
-+    "5":  [KEY_5],
-+    "6":  [KEY_6],
-+    "7":  [KEY_7],
-+    "8":  [KEY_8],
-+    "9":  [KEY_9],
-+
-+    ":":  [KEY_LEFTSHIFT, KEY_SEMICOLON],
-+    ";":  [KEY_SEMICOLON],
-+    "<":  [KEY_LEFTSHIFT, KEY_COMMA],
-+    "=":  [KEY_EQUAL],
-+    ">":  [KEY_LEFTSHIFT, KEY_DOT],
-+    "?":  [KEY_LEFTSHIFT, KEY_SLASH],
-+    "@":  [KEY_LEFTSHIFT, KEY_2],
-+
-+    "A":  [KEY_LEFTSHIFT, KEY_A],
-+    "B":  [KEY_LEFTSHIFT, KEY_B],
-+    "C":  [KEY_LEFTSHIFT, KEY_C],
-+    "D":  [KEY_LEFTSHIFT, KEY_D],
-+    "E":  [KEY_LEFTSHIFT, KEY_E],
-+    "F":  [KEY_LEFTSHIFT, KEY_F],
-+    "G":  [KEY_LEFTSHIFT, KEY_G],
-+    "H":  [KEY_LEFTSHIFT, KEY_H],
-+    "I":  [KEY_LEFTSHIFT, KEY_I],
-+    "J":  [KEY_LEFTSHIFT, KEY_J],
-+    "K":  [KEY_LEFTSHIFT, KEY_K],
-+    "L":  [KEY_LEFTSHIFT, KEY_L],
-+    "M":  [KEY_LEFTSHIFT, KEY_M],
-+    "N":  [KEY_LEFTSHIFT, KEY_N],
-+    "O":  [KEY_LEFTSHIFT, KEY_O],
-+    "P":  [KEY_LEFTSHIFT, KEY_P],
-+    "Q":  [KEY_LEFTSHIFT, KEY_Q],
-+    "R":  [KEY_LEFTSHIFT, KEY_R],
-+    "S":  [KEY_LEFTSHIFT, KEY_S],
-+    "T":  [KEY_LEFTSHIFT, KEY_T],
-+    "U":  [KEY_LEFTSHIFT, KEY_U],
-+    "V":  [KEY_LEFTSHIFT, KEY_V],
-+    "W":  [KEY_LEFTSHIFT, KEY_W],
-+    "X":  [KEY_LEFTSHIFT, KEY_X],
-+    "Y":  [KEY_LEFTSHIFT, KEY_Y],
-+    "Z":  [KEY_LEFTSHIFT, KEY_Z],
-+
-+    "[":  [KEY_LEFTBRACE],
-+    "\\": [KEY_BACKSLASH],
-+    "]":  [KEY_RIGHTBRACE],
-+    "^":  [KEY_LEFTSHIFT, KEY_6],
-+    "_":  [KEY_LEFTSHIFT, KEY_MINUS],
-+    "`":  [KEY_GRAVE],
-+
-+    "a":  [KEY_A],
-+    "b":  [KEY_B],
-+    "c":  [KEY_C],
-+    "d":  [KEY_D],
-+    "e":  [KEY_E],
-+    "f":  [KEY_F],
-+    "g":  [KEY_G],
-+    "h":  [KEY_H],
-+    "i":  [KEY_I],
-+    "j":  [KEY_J],
-+    "k":  [KEY_K],
-+    "l":  [KEY_L],
-+    "m":  [KEY_M],
-+    "n":  [KEY_N],
-+    "o":  [KEY_O],
-+    "p":  [KEY_P],
-+    "q":  [KEY_Q],
-+    "r":  [KEY_R],
-+    "s":  [KEY_S],
-+    "t":  [KEY_T],
-+    "u":  [KEY_U],
-+    "v":  [KEY_V],
-+    "w":  [KEY_W],
-+    "x":  [KEY_X],
-+    "y":  [KEY_Y],
-+    "z":  [KEY_Z],
-+
-+    "{": [KEY_LEFTSHIFT, KEY_LEFTBRACE],
-+    "|": [KEY_LEFTSHIFT, KEY_BACKSLASH],
-+    "}": [KEY_LEFTSHIFT, KEY_RIGHTBRACE],
-+    "~": [KEY_LEFTSHIFT, KEY_GRAVE],
-+}
-+
-+
-+# A list of American English ChromeOS keys to define a keyboard device.
-+_CROS_KEYS_ALL = [
-+    # Function row.
-+    KEY_ESC,
-+    KEY_F1,
-+    KEY_F2,
-+    KEY_F3,
-+    KEY_F4,
-+    KEY_F5,
-+    KEY_F6,
-+    KEY_F7,
-+    KEY_F8,
-+    KEY_F9,
-+    KEY_F10,
-+    KEY_F11,
-+    KEY_F12,
-+    KEY_HOME,
-+    KEY_END,
-+    KEY_INSERT,
-+    KEY_DELETE,
-+    # First row.
-+    KEY_GRAVE,
-+    KEY_1,
-+    KEY_2,
-+    KEY_3,
-+    KEY_4,
-+    KEY_5,
-+    KEY_6,
-+    KEY_7,
-+    KEY_8,
-+    KEY_9,
-+    KEY_0,
-+    KEY_MINUS,
-+    KEY_EQUAL,
-+    KEY_BACKSPACE,
-+    # Second row.
-+    KEY_TAB,
-+    KEY_Q,
-+    KEY_W,
-+    KEY_E,
-+    KEY_R,
-+    KEY_T,
-+    KEY_Y,
-+    KEY_U,
-+    KEY_I,
-+    KEY_O,
-+    KEY_P,
-+    KEY_LEFTBRACE,
-+    KEY_RIGHTBRACE,
-+    KEY_BACKSLASH,
-+    # Third row
-+    KEY_CAPSLOCK,
-+    KEY_A,
-+    KEY_S,
-+    KEY_D,
-+    KEY_F,
-+    KEY_G,
-+    KEY_H,
-+    KEY_J,
-+    KEY_K,
-+    KEY_L,
-+    KEY_SEMICOLON,
-+    KEY_APOSTROPHE,
-+    KEY_ENTER,
-+    # Forth row.
-+    KEY_LEFTSHIFT,
-+    KEY_Z,
-+    KEY_X,
-+    KEY_C,
-+    KEY_V,
-+    KEY_B,
-+    KEY_N,
-+    KEY_M,
-+    KEY_COMMA,
-+    KEY_DOT,
-+    KEY_SLASH,
-+    KEY_RIGHTSHIFT,
-+    # Fifth row.
-+    KEY_LEFTCTRL,
-+    KEY_FN,
-+    KEY_SEARCH,
-+    KEY_LEFTALT,
-+    KEY_SPACE,
-+    KEY_NUMLOCK,
-+    KEY_SCROLLLOCK,
-+    KEY_RIGHTALT,
-+    KEY_RIGHTCTRL,
-+    # Directional keys.
-+    KEY_UP,
-+    KEY_PAGEUP,
-+    KEY_LEFT,
-+    KEY_RIGHT,
-+    KEY_DOWN,
-+    KEY_PAGEDOWN,
-+]
-+
-+
-+def _chars_to_events(chars):
-+    """
-+    Translates string to key events.
-+
-+    @param chars: characters to translate to events.
-+    @returns: list of lists of events representing characters.
-+    """
-+    events = []
-+    for char in chars:
-+        events.append(_CROS_CHAR_MAP[char])
-+    return events
-+
-+
-+def _get_uinput_device_keyboard():
-+    """
-+    Lazy initialize device and return it. We don't want to create a device
-+    during build_packages or for tests that don't need it, hence init with None.
-+    """
-+    global uinput_device_keyboard
-+    if uinput_device_keyboard is None:
-+        # For DUTs without keyboard attached force load uinput.
-+        subprocess.Popen(['modprobe', 'uinput']).wait()
-+        uinput_device_keyboard = uinput.Device(_CROS_KEYS_ALL)
-+    return uinput_device_keyboard
-+
-+
-+def _uinput_translate_name(event_name):
-+    """
-+    Translates string |event_name| to uinput event.
-+    """
-+    return getattr(uinput, event_name)
-+
-+
-+def _uinput_emit_keycombo(device, events, syn=True):
-+    """
-+    Wrapper for uinput.emit_combo. Emits sequence of events.
-+    Example: [KEY_LEFTCTRL, KEY_LEFTALT, KEY_F5]
-+    """
-+    time.sleep(default_delay)
-+    device.emit_combo(events, syn)
-+
-+
-+def press_keys(keys):
-+    """Presses the given keys as one combination.
-+
-+    Please do not leak uinput dependencies outside of the file.
-+
-+    @param key: A simple list of key strings, e.g. ['LEFTCTRL', 'F4']
-+    """
-+    events =  [_uinput_translate_name(en) for en in keys]
-+    _uinput_emit_keycombo(_get_uinput_device_keyboard(), events)
-+
-+
-+def type_chars(text):
-+    """Translates ASCII text to keystrokes and sends them as events.
-+
-+    @param text: string to send as events to keyboard.
-+    """
-+    events = _chars_to_events(text)
-+    device = _get_uinput_device_keyboard()
-+    for keys in events:
-+        _uinput_emit_keycombo(device, keys)
-diff --git src/cros_type_keys.py src/cros_type_keys.py
-new file mode 100755
-index 0000000..0075b5d
---- /dev/null
-+++ src/cros_type_keys.py
-@@ -0,0 +1,19 @@
-+#!/usr/bin/env python
-+# Copyright 2015 The Chromium OS Authors. All rights reserved.
-+# Use of this source code is governed by a BSD-style license that can be
-+# found in the LICENSE file.
-+
-+import argparse
-+import cros_keys
-+
-+argparser = argparse.ArgumentParser(description="Type text via events.")
-+argparser.add_argument(
-+    "-k", "--keyevents", action="store_true",
-+    help="Treat text as white space separated list of keyevents.")
-+argparser.add_argument("text", help="text or list of keyevent string")
-+
-+args = argparser.parse_args()
-+if args.keyevents:
-+    cros_keys.press_keys(args.text.split())
-+else:
-+    cros_keys.type_chars(args.text)
--- 
-2.8.0.rc3.226.g39d4020
-
diff --git a/dev-python/python-uinput/files/cros_keys.py b/dev-python/python-uinput/files/cros_keys.py
new file mode 100644
index 0000000..6b830dc
--- /dev/null
+++ b/dev-python/python-uinput/files/cros_keys.py
@@ -0,0 +1,288 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+# Get all evdev/uinput events in our namespace.
+# pylint: disable=wildcard-import, unused-wildcard-import
+from uinput.ev import *
+import subprocess
+import time
+import uinput
+
+# Default delay between key presses in seconds. 12ms is the xdotool default.
+default_delay = 0.012
+uinput_device_keyboard = None
+
+
+# This dictionary contains most 7 bit ASCII characters. Add more if needed.
+# TODO(ihf): Create this table using xkbcommon to support arbirtrary
+# character sets and keyboard layouts.
+_CROS_CHAR_MAP = {
+    "\b": [KEY_BACKSPACE],
+    "\t": [KEY_TAB],
+    "\n": [KEY_ENTER],
+
+    " ":  [KEY_SPACE],
+    "!":  [KEY_LEFTSHIFT, KEY_1],
+    '"':  [KEY_LEFTSHIFT, KEY_APOSTROPHE],
+    "#":  [KEY_LEFTSHIFT, KEY_3],
+    "$":  [KEY_LEFTSHIFT, KEY_4],
+    "%":  [KEY_LEFTSHIFT, KEY_5],
+    "&":  [KEY_LEFTSHIFT, KEY_7],
+    "'":  [KEY_APOSTROPHE],
+    "(":  [KEY_LEFTSHIFT, KEY_9],
+    ")":  [KEY_LEFTSHIFT, KEY_0],
+    "*":  [KEY_KPASTERISK],
+    "+":  [KEY_LEFTSHIFT, KEY_EQUAL],
+    ",":  [KEY_COMMA],
+    "-":  [KEY_MINUS],
+    ".":  [KEY_DOT],
+    "/":  [KEY_SLASH],
+
+    "0":  [KEY_0],
+    "1":  [KEY_1],
+    "2":  [KEY_2],
+    "3":  [KEY_3],
+    "4":  [KEY_4],
+    "5":  [KEY_5],
+    "6":  [KEY_6],
+    "7":  [KEY_7],
+    "8":  [KEY_8],
+    "9":  [KEY_9],
+
+    ":":  [KEY_LEFTSHIFT, KEY_SEMICOLON],
+    ";":  [KEY_SEMICOLON],
+    "<":  [KEY_LEFTSHIFT, KEY_COMMA],
+    "=":  [KEY_EQUAL],
+    ">":  [KEY_LEFTSHIFT, KEY_DOT],
+    "?":  [KEY_LEFTSHIFT, KEY_SLASH],
+    "@":  [KEY_LEFTSHIFT, KEY_2],
+
+    "A":  [KEY_LEFTSHIFT, KEY_A],
+    "B":  [KEY_LEFTSHIFT, KEY_B],
+    "C":  [KEY_LEFTSHIFT, KEY_C],
+    "D":  [KEY_LEFTSHIFT, KEY_D],
+    "E":  [KEY_LEFTSHIFT, KEY_E],
+    "F":  [KEY_LEFTSHIFT, KEY_F],
+    "G":  [KEY_LEFTSHIFT, KEY_G],
+    "H":  [KEY_LEFTSHIFT, KEY_H],
+    "I":  [KEY_LEFTSHIFT, KEY_I],
+    "J":  [KEY_LEFTSHIFT, KEY_J],
+    "K":  [KEY_LEFTSHIFT, KEY_K],
+    "L":  [KEY_LEFTSHIFT, KEY_L],
+    "M":  [KEY_LEFTSHIFT, KEY_M],
+    "N":  [KEY_LEFTSHIFT, KEY_N],
+    "O":  [KEY_LEFTSHIFT, KEY_O],
+    "P":  [KEY_LEFTSHIFT, KEY_P],
+    "Q":  [KEY_LEFTSHIFT, KEY_Q],
+    "R":  [KEY_LEFTSHIFT, KEY_R],
+    "S":  [KEY_LEFTSHIFT, KEY_S],
+    "T":  [KEY_LEFTSHIFT, KEY_T],
+    "U":  [KEY_LEFTSHIFT, KEY_U],
+    "V":  [KEY_LEFTSHIFT, KEY_V],
+    "W":  [KEY_LEFTSHIFT, KEY_W],
+    "X":  [KEY_LEFTSHIFT, KEY_X],
+    "Y":  [KEY_LEFTSHIFT, KEY_Y],
+    "Z":  [KEY_LEFTSHIFT, KEY_Z],
+
+    "[":  [KEY_LEFTBRACE],
+    "\\": [KEY_BACKSLASH],
+    "]":  [KEY_RIGHTBRACE],
+    "^":  [KEY_LEFTSHIFT, KEY_6],
+    "_":  [KEY_LEFTSHIFT, KEY_MINUS],
+    "`":  [KEY_GRAVE],
+
+    "a":  [KEY_A],
+    "b":  [KEY_B],
+    "c":  [KEY_C],
+    "d":  [KEY_D],
+    "e":  [KEY_E],
+    "f":  [KEY_F],
+    "g":  [KEY_G],
+    "h":  [KEY_H],
+    "i":  [KEY_I],
+    "j":  [KEY_J],
+    "k":  [KEY_K],
+    "l":  [KEY_L],
+    "m":  [KEY_M],
+    "n":  [KEY_N],
+    "o":  [KEY_O],
+    "p":  [KEY_P],
+    "q":  [KEY_Q],
+    "r":  [KEY_R],
+    "s":  [KEY_S],
+    "t":  [KEY_T],
+    "u":  [KEY_U],
+    "v":  [KEY_V],
+    "w":  [KEY_W],
+    "x":  [KEY_X],
+    "y":  [KEY_Y],
+    "z":  [KEY_Z],
+
+    "{": [KEY_LEFTSHIFT, KEY_LEFTBRACE],
+    "|": [KEY_LEFTSHIFT, KEY_BACKSLASH],
+    "}": [KEY_LEFTSHIFT, KEY_RIGHTBRACE],
+    "~": [KEY_LEFTSHIFT, KEY_GRAVE],
+}
+
+
+# A list of American English ChromeOS keys to define a keyboard device.
+_CROS_KEYS_ALL = [
+    # Function row.
+    KEY_ESC,
+    KEY_F1,
+    KEY_F2,
+    KEY_F3,
+    KEY_F4,
+    KEY_F5,
+    KEY_F6,
+    KEY_F7,
+    KEY_F8,
+    KEY_F9,
+    KEY_F10,
+    KEY_F11,
+    KEY_F12,
+    KEY_HOME,
+    KEY_END,
+    KEY_INSERT,
+    KEY_DELETE,
+    # First row.
+    KEY_GRAVE,
+    KEY_1,
+    KEY_2,
+    KEY_3,
+    KEY_4,
+    KEY_5,
+    KEY_6,
+    KEY_7,
+    KEY_8,
+    KEY_9,
+    KEY_0,
+    KEY_MINUS,
+    KEY_EQUAL,
+    KEY_BACKSPACE,
+    # Second row.
+    KEY_TAB,
+    KEY_Q,
+    KEY_W,
+    KEY_E,
+    KEY_R,
+    KEY_T,
+    KEY_Y,
+    KEY_U,
+    KEY_I,
+    KEY_O,
+    KEY_P,
+    KEY_LEFTBRACE,
+    KEY_RIGHTBRACE,
+    KEY_BACKSLASH,
+    # Third row
+    KEY_CAPSLOCK,
+    KEY_A,
+    KEY_S,
+    KEY_D,
+    KEY_F,
+    KEY_G,
+    KEY_H,
+    KEY_J,
+    KEY_K,
+    KEY_L,
+    KEY_SEMICOLON,
+    KEY_APOSTROPHE,
+    KEY_ENTER,
+    # Forth row.
+    KEY_LEFTSHIFT,
+    KEY_Z,
+    KEY_X,
+    KEY_C,
+    KEY_V,
+    KEY_B,
+    KEY_N,
+    KEY_M,
+    KEY_COMMA,
+    KEY_DOT,
+    KEY_SLASH,
+    KEY_RIGHTSHIFT,
+    # Fifth row.
+    KEY_LEFTCTRL,
+    KEY_FN,
+    KEY_SEARCH,
+    KEY_LEFTALT,
+    KEY_SPACE,
+    KEY_NUMLOCK,
+    KEY_SCROLLLOCK,
+    KEY_RIGHTALT,
+    KEY_RIGHTCTRL,
+    # Directional keys.
+    KEY_UP,
+    KEY_PAGEUP,
+    KEY_LEFT,
+    KEY_RIGHT,
+    KEY_DOWN,
+    KEY_PAGEDOWN,
+]
+
+
+def _chars_to_events(chars):
+    """
+    Translates string to key events.
+
+    @param chars: characters to translate to events.
+    @returns: list of lists of events representing characters.
+    """
+    events = []
+    for char in chars:
+        events.append(_CROS_CHAR_MAP[char])
+    return events
+
+
+def _get_uinput_device_keyboard():
+    """
+    Lazy initialize device and return it. We don't want to create a device
+    during build_packages or for tests that don't need it, hence init with None.
+    """
+    global uinput_device_keyboard
+    if uinput_device_keyboard is None:
+        # For DUTs without keyboard attached force load uinput.
+        subprocess.Popen(['modprobe', 'uinput']).wait()
+        uinput_device_keyboard = uinput.Device(_CROS_KEYS_ALL)
+    return uinput_device_keyboard
+
+
+def _uinput_translate_name(event_name):
+    """
+    Translates string |event_name| to uinput event.
+    """
+    return getattr(uinput, event_name)
+
+
+def _uinput_emit_keycombo(device, events, syn=True):
+    """
+    Wrapper for uinput.emit_combo. Emits sequence of events.
+    Example: [KEY_LEFTCTRL, KEY_LEFTALT, KEY_F5]
+    """
+    time.sleep(default_delay)
+    device.emit_combo(events, syn)
+
+
+def press_keys(keys):
+    """Presses the given keys as one combination.
+
+    Please do not leak uinput dependencies outside of the file.
+
+    @param key: A simple list of key strings, e.g. ['LEFTCTRL', 'F4']
+    """
+    events =  [_uinput_translate_name(en) for en in keys]
+    _uinput_emit_keycombo(_get_uinput_device_keyboard(), events)
+
+
+def type_chars(text):
+    """Translates ASCII text to keystrokes and sends them as events.
+
+    @param text: string to send as events to keyboard.
+    """
+    events = _chars_to_events(text)
+    device = _get_uinput_device_keyboard()
+    for keys in events:
+        _uinput_emit_keycombo(device, keys)
diff --git a/dev-python/python-uinput/files/cros_type_keys.py b/dev-python/python-uinput/files/cros_type_keys.py
new file mode 100644
index 0000000..0075b5d
--- /dev/null
+++ b/dev-python/python-uinput/files/cros_type_keys.py
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import cros_keys
+
+argparser = argparse.ArgumentParser(description="Type text via events.")
+argparser.add_argument(
+    "-k", "--keyevents", action="store_true",
+    help="Treat text as white space separated list of keyevents.")
+argparser.add_argument("text", help="text or list of keyevent string")
+
+args = argparser.parse_args()
+if args.keyevents:
+    cros_keys.press_keys(args.text.split())
+else:
+    cros_keys.type_chars(args.text)