普通文本  |  63行  |  1.82 KB

# 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