#!/bin/sh -e
# Find "real" keyboard devices and print their device path.
# Author: Martin Pitt <martin.pitt@ubuntu.com>
#
# Copyright (C) 2009, Canonical Ltd.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.

# returns OK if $1 contains $2
strstr() {
    [ "${1#*$2*}" != "$1" ]
}

# returns OK if $1 contains $2 at the beginning
str_starts() {
    [ "${1#$2*}" != "$1" ]
}

str_line_starts() {
    while read a; do str_starts "$a" "$1" && return 0;done
    return 1;
}

# print a list of input devices which are keyboard-like
keyboard_devices() {
    # standard AT keyboard
    for dev in `udevadm trigger --dry-run --verbose --property-match=ID_INPUT_KEYBOARD=1`; do
        walk=`udevadm info --attribute-walk --path=$dev`
        env=`udevadm info --query=env --path=$dev`
        # filter out non-event devices, such as the parent input devices which
        # have no devnode
        if ! echo "$env" | str_line_starts 'DEVNAME='; then
            continue
        fi
        if strstr "$walk" 'DRIVERS=="atkbd"'; then
            echo -n 'AT keyboard: '
        elif echo "$env" | str_line_starts 'ID_USB_DRIVER=usbhid'; then
            echo -n 'USB keyboard: '
        else
            echo -n 'Unknown type: '
        fi
        udevadm info --query=name --path=$dev
    done

    # modules
    module=$(udevadm trigger --verbose --dry-run --subsystem-match=input --attr-match=name='*Extra Buttons')
    module="$module
$(udevadm trigger --verbose --dry-run --subsystem-match=input --attr-match=name='*extra buttons')"
    module="$module
$(udevadm trigger --verbose --dry-run --subsystem-match=input --attr-match=name='Sony Vaio Keys')"
    for m in $module; do
        for evdev in $m/event*/dev; do
            if [ -e "$evdev" ]; then
		echo -n 'module: '
		udevadm info --query=name --path=${evdev%%/dev}
            fi
	done
    done
}

keyboard_devices
