+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <linux/input.h>
-
-#include "hd.h"
-#include "hd_int.h"
-#include "hddb.h"
-#include "input.h"
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * input devs
- *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- */
-
-static void get_input_devices(hd_data_t *hd_data);
-static char *all_bits(char *str);
-static int test_bit(char *str, unsigned bit);
-
-void hd_scan_input(hd_data_t *hd_data)
-{
- if(!hd_probe_feature(hd_data, pr_input)) return;
-
- hd_data->module = mod_input;
-
- /* some clean-up */
- remove_hd_entries(hd_data);
-
- PROGRESS(1, 0, "joydev mod");
- load_module(hd_data, "joydev");
-
- PROGRESS(1, 1, "evdev mod");
- load_module(hd_data, "evdev");
-
- PROGRESS(2, 0, "input");
-
- get_input_devices(hd_data);
-}
-
-
-#define INP_NAME "N: Name="
-#define INP_HANDLERS "H: Handlers="
-#define INP_KEY "B: KEY="
-#define INP_REL "B: REL="
-
-void get_input_devices(hd_data_t *hd_data)
-{
- hd_t *hd;
- str_list_t *input, *sl, *sl1;
- char *s;
- unsigned ok, u;
- unsigned bus, vendor, product, version;
- unsigned mouse_buttons, mouse_wheels;
- char *name = NULL, *handlers = NULL, *key = NULL, *rel = NULL;
- size_t len;
- str_list_t *handler_list;
- hd_dev_num_t dev_num = { type: 'c', range: 1 };
-
- input = read_file("/proc/bus/input/devices", 0, 0);
-
- ADD2LOG("----- /proc/bus/input/devices -----\n");
- for(sl = input; sl; sl = sl->next) {
- ADD2LOG(" %s", sl->str);
- }
- ADD2LOG("----- /proc/bus/input/devices end -----\n");
-
- for(ok = 0, sl = input; sl; sl = sl->next) {
- if(*sl->str == '\n') {
- ADD2LOG("bus = %u, name = %s\n", bus, name);
- if(handlers) ADD2LOG(" handlers = %s\n", handlers);
- if(key) ADD2LOG(" key = %s\n", key);
- if(rel) ADD2LOG(" rel = %s\n", rel);
-
- mouse_buttons = 0;
- if(key) {
- for(u = BTN_MOUSE; u < BTN_MOUSE + 8; u++) {
- if(test_bit(key, u)) mouse_buttons++;
- }
- }
- ADD2LOG(" mouse buttons = %u\n", mouse_buttons);
-
- mouse_wheels = 0;
- if(rel) {
- for(u = REL_HWHEEL; u <= REL_MAX; u++) {
- if(test_bit(rel, u)) mouse_wheels++;
- }
- }
- ADD2LOG(" mouse wheels = %u\n", mouse_wheels);
-
- if(ok && handlers) {
- handler_list = hd_split(' ', handlers);
-
- if(bus == BUS_USB) {
- s = NULL;
- for(sl1 = handler_list; sl1; sl1 = sl1->next) {
- if(sscanf(sl1->str, "mouse%u", &u) == 1) {
- str_printf(&s, 0, "/dev/input/mouse%u", u);
- break;
- }
- }
-
- if(s) {
- for(hd = hd_data->hd; hd; hd = hd->next) {
- if(hd->unix_dev_name2 && !strcmp(hd->unix_dev_name2, s)) {
- hd->compat_vendor.id = MAKE_ID(TAG_SPECIAL, 0x0210);
- hd->compat_device.id = MAKE_ID(TAG_SPECIAL, (mouse_wheels << 4) + mouse_buttons);
- }
- }
- }
-
- s = free_mem(s);
- }
- else {
- if(search_str_list(handler_list, "kbd") && test_bit(key, KEY_1)) {
- hd = add_hd_entry(hd_data, __LINE__, 0);
- hd->base_class.id = bc_keyboard;
- hd->sub_class.id = sc_keyboard_kbd;
- hd->bus.id = bus_ps2;
-
- hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0211);
- hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0001);
- hd->device.name = new_str(name);
-
- for(sl1 = handler_list; sl1; sl1 = sl1->next) {
- if(sscanf(sl1->str, "event%u", &u) == 1) {
- str_printf(&hd->unix_dev_name, 0, "/dev/input/event%u", u);
- dev_num.major = 13;
- dev_num.minor = 64 + u;
- hd->unix_dev_num = dev_num;
- break;
- }
- }
- }
- else if(strstr(handlers, "mouse")) {
- hd = add_hd_entry(hd_data, __LINE__, 0);
- hd->base_class.id = bc_mouse;
- hd->sub_class.id = sc_mou_ps2;
- hd->bus.id = bus_ps2;
-
- hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0210);
- hd->device.id = MAKE_ID(TAG_SPECIAL, (mouse_wheels << 4) + mouse_buttons);
- hd->device.name = new_str(name);
-
- /* Synaptics/Alps TouchPad */
- if(vendor == 2 && (product == 7 || product == 8)) {
- hd->compat_vendor.id = hd->vendor.id;
- hd->compat_device.id = hd->device.id;
- hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0212);
- hd->device.id = MAKE_ID(TAG_SPECIAL, product - 6);
- }
-
- hd->unix_dev_name = new_str(DEV_MICE);
- dev_num.major = 13;
- dev_num.minor = 63;
- hd->unix_dev_num = dev_num;
-
- for(sl1 = handler_list; sl1; sl1 = sl1->next) {
- if(sscanf(sl1->str, "mouse%u", &u) == 1) {
- str_printf(&hd->unix_dev_name2, 0, "/dev/input/mouse%u", u);
- dev_num.major = 13;
- dev_num.minor = 32 + u;
- hd->unix_dev_num2 = dev_num;
- break;
- }
- }
-
- }
- }
-
- handler_list = free_str_list(handler_list);
- }
-
- ok = 0;
-
- name = free_mem(name);
- handlers = free_mem(handlers);
- key = free_mem(key);
- rel = free_mem(rel);
- }
-
- if(sscanf(sl->str, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x", &bus, &vendor, &product, &version) == 4) {
- ok = 1;
- continue;
- }
-
- if(!strncmp(sl->str, INP_NAME, sizeof INP_NAME - 1)) {
- s = sl->str + sizeof INP_NAME;
- len = strlen(s);
- if(len > 2) {
- name = canon_str(s, len - 2);
- }
- continue;
- }
-
- if(!strncmp(sl->str, INP_HANDLERS, sizeof INP_HANDLERS - 1)) {
- s = sl->str + sizeof INP_HANDLERS - 1;
- handlers = canon_str(s, strlen(s));
- continue;
- }
-
- if(!strncmp(sl->str, INP_KEY, sizeof INP_KEY - 1)) {
- s = sl->str + sizeof INP_KEY - 1;
- key = canon_str(s, strlen(s));
- key = all_bits(key);
- continue;
- }
-
- if(!strncmp(sl->str, INP_REL, sizeof INP_REL - 1)) {
- s = sl->str + sizeof INP_REL - 1;
- rel = canon_str(s, strlen(s));
- rel = all_bits(rel);
- continue;
- }
- }
-
- free_str_list(input);
-
-}
-
-
-char *all_bits(char *str)
-{
- str_list_t *sl, *sl0;
- char *s = NULL;
- unsigned u;
-
- if(!str) return NULL;
-
- sl = sl0 = hd_split(' ', str);
- for(; sl; sl = sl->next) {
- u = strtoul(sl->str, NULL, 16);
- str_printf(&s, -1, "%08x", u);
- }
- free_str_list(sl0);
- free_mem(str);
-
- return s;
-}
-
-
-int test_bit(char *str, unsigned bit)
-{
- size_t len, ofs;
- unsigned u, mask;
-
- if(!str) return 0;
-
- len = strlen(str);
-
- ofs = bit >> 2;
- mask = 1 << (bit & 3);
-
- if(ofs >= len) return 0;
-
- ofs = len - ofs - 1;
-
- u = str[ofs] >= 'a' ? str[ofs] - 'a' + 10 : str[ofs] - '0';
-
- return (u & mask) ? 1 : 0;
-}
-
-