X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fudev%2Fudev-builtin-input_id.c;h=3b2e8975f586dff82b3e1122f832b560bd20255f;hp=ee8294b700f0979773c9e4f66c7d3a3f437d437c;hb=f8294e4175918117ca6c131720bcf287eadcd029;hpb=baa30fbc2c04b23209d0b8fb3c86cd15ef9ea81a diff --git a/src/udev/udev-builtin-input_id.c b/src/udev/udev-builtin-input_id.c index ee8294b70..3b2e8975f 100644 --- a/src/udev/udev-builtin-input_id.c +++ b/src/udev/udev-builtin-input_id.c @@ -3,7 +3,7 @@ * * Copyright (C) 2009 Martin Pitt * Portions Copyright (C) 2004 David Zeuthen, - * Copyright (C) 2011 Kay Sievers + * Copyright (C) 2011 Kay Sievers * * 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 @@ -49,23 +49,22 @@ static void get_cap_mask(struct udev_device *dev, unsigned long *bitmask, size_t bitmask_size, bool test) { - struct udev *udev = udev_device_get_udev(dev); char text[4096]; unsigned i; char* word; unsigned long val; snprintf(text, sizeof(text), "%s", udev_device_get_sysattr_value(pdev, attr)); - log_debug("%s raw kernel attribute: %s\n", attr, text); + log_debug("%s raw kernel attribute: %s", attr, text); - memset (bitmask, 0, bitmask_size); + memzero(bitmask, bitmask_size); i = 0; while ((word = strrchr(text, ' ')) != NULL) { val = strtoul (word+1, NULL, 16); if (i < bitmask_size/sizeof(unsigned long)) bitmask[i] = val; else - log_debug("ignoring %s block %lX which is larger than maximum size\n", attr, val); + log_debug("ignoring %s block %lX which is larger than maximum size", attr, val); *word = '\0'; ++i; } @@ -73,18 +72,21 @@ static void get_cap_mask(struct udev_device *dev, if (i < bitmask_size / sizeof(unsigned long)) bitmask[i] = val; else - log_debug("ignoring %s block %lX which is larger than maximum size\n", attr, val); + log_debug("ignoring %s block %lX which is larger than maximum size", attr, val); if (test) { /* printf pattern with the right unsigned long number of hex chars */ snprintf(text, sizeof(text), " bit %%4u: %%0%zilX\n", 2 * sizeof(unsigned long)); - log_debug("%s decoded bit map:\n", attr); + log_debug("%s decoded bit map:", attr); val = bitmask_size / sizeof (unsigned long); /* skip over leading zeros */ while (bitmask[val-1] == 0 && val > 0) --val; - for (i = 0; i < val; ++i) + for (i = 0; i < val; ++i) { + DISABLE_WARNING_FORMAT_NONLITERAL; log_debug(text, i * BITS_PER_LONG, bitmask[i]); + REENABLE_WARNING; + } } } @@ -114,16 +116,27 @@ static void test_pointers (struct udev_device *dev, udev_builtin_add_property(dev, test, "ID_INPUT_TABLET", "1"); else if (test_bit (BTN_TOOL_FINGER, bitmask_key) && !test_bit (BTN_TOOL_PEN, bitmask_key)) is_touchpad = 1; - else if (test_bit (BTN_TRIGGER, bitmask_key) || - test_bit (BTN_A, bitmask_key) || - test_bit (BTN_1, bitmask_key)) - udev_builtin_add_property(dev, test, "ID_INPUT_JOYSTICK", "1"); else if (test_bit (BTN_MOUSE, bitmask_key)) /* This path is taken by VMware's USB mouse, which has * absolute axes, but no touch/pressure button. */ is_mouse = 1; else if (test_bit (BTN_TOUCH, bitmask_key)) udev_builtin_add_property(dev, test, "ID_INPUT_TOUCHSCREEN", "1"); + /* joysticks don't necessarily have to have buttons; e. g. + * rudders/pedals are joystick-like, but buttonless; they have + * other fancy axes */ + else if (test_bit (BTN_TRIGGER, bitmask_key) || + test_bit (BTN_A, bitmask_key) || + test_bit (BTN_1, bitmask_key) || + test_bit (ABS_RX, bitmask_abs) || + test_bit (ABS_RY, bitmask_abs) || + test_bit (ABS_RZ, bitmask_abs) || + test_bit (ABS_THROTTLE, bitmask_abs) || + test_bit (ABS_RUDDER, bitmask_abs) || + test_bit (ABS_WHEEL, bitmask_abs) || + test_bit (ABS_GAS, bitmask_abs) || + test_bit (ABS_BRAKE, bitmask_abs)) + udev_builtin_add_property(dev, test, "ID_INPUT_JOYSTICK", "1"); } if (test_bit (EV_REL, bitmask_ev) && @@ -143,14 +156,13 @@ static void test_key (struct udev_device *dev, const unsigned long* bitmask_key, bool test) { - struct udev *udev = udev_device_get_udev(dev); unsigned i; unsigned long found; unsigned long mask; /* do we have any KEY_* capability? */ if (!test_bit (EV_KEY, bitmask_ev)) { - log_debug("test_key: no EV_KEY capability\n"); + log_debug("test_key: no EV_KEY capability"); return; } @@ -158,13 +170,13 @@ static void test_key (struct udev_device *dev, found = 0; for (i = 0; i < BTN_MISC/BITS_PER_LONG; ++i) { found |= bitmask_key[i]; - log_debug("test_key: checking bit block %lu for any keys; found=%i\n", i*BITS_PER_LONG, found > 0); + log_debug("test_key: checking bit block %lu for any keys; found=%i", (unsigned long)i*BITS_PER_LONG, found > 0); } /* If there are no keys in the lower block, check the higher block */ if (!found) { for (i = KEY_OK; i < BTN_TRIGGER_HAPPY; ++i) { if (test_bit (i, bitmask_key)) { - log_debug("test_key: Found key %x in high block\n", i); + log_debug("test_key: Found key %x in high block", i); found = 1; break; }