blob: c15a9f8d4ad80d347eee23f0fb8fdfcf8f6aefb7 [file] [log] [blame] [edit]
# Copyright (c) 2012 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.
"""Keyboard device module to capture keyboard events."""
import fcntl
import os
import re
import sys
sys.path.append('../../bin/input')
import input_device
import mtb
from linux_input import EV_KEY
class KeyboardDevice:
"""A class about keyboard device properties."""
def __init__(self, device_node=None):
if device_node:
self.device_node = device_node
else:
self.device_node = input_device.get_device_node(
input_device.KEYBOARD_TYPES))
self.system_device = self._non_blocking_open(self.device_node)
self._input_event = input_device.InputEvent()
def __del__(self):
self.system_device.close()
def exists(self):
"""Indicate whether this device exists or not."""
return bool(self.device_node)
def _non_blocking_open(self, filename):
"""Open the system file in the non-blocking mode."""
fd = open(filename)
fcntl.fcntl(fd, fcntl.F_SETFL, os.O_NONBLOCK)
return fd
def _non_blocking_read(self, fd):
"""Non-blocking read on fd."""
try:
self._input_event.read(fd)
return self._input_event
except Exception:
return None
def get_key_press_event(self, fd):
"""Read the keyboard device node to get the key press events."""
event = True
# Read the device node continuously until either a key press event
# is got or there is no more events to read.
while event:
event = self._non_blocking_read(fd)
if event and event.type == EV_KEY and event.value == 1:
return event.code
return None