udev-builtin-input_id.c revision 606df97b6a2438a8844c828ecdef1e9b25e2e838
/*
* expose input properties via udev
*
* Copyright (C) 2009 Martin Pitt <martin.pitt@ubuntu.com>
* Portions Copyright (C) 2004 David Zeuthen, <david@fubar.dk>
* Copyright (C) 2011 Kay Sievers <kay@vrfy.org>
* Copyright (C) 2014 Carlos Garnacho <carlosg@gnome.org>
* Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "udev.h"
#include "util.h"
/* we must use this kernel-compatible implementation */
#define BITS_PER_LONG (sizeof(unsigned long) * 8)
#define OFF(x) ((x)%BITS_PER_LONG)
#define LONG(x) ((x)/BITS_PER_LONG)
}
if (fd < 0)
return;
return;
return;
}
/*
* Read a capability attribute and return bitmask.
* @param dev udev_device
* @param attr sysfs attribute name (e. g. "capabilities/key")
* @param bitmask: Output array which has a sizeof of bitmask_size
*/
bool test) {
const char *v;
char text[4096];
unsigned i;
char* word;
unsigned long val;
if (!v)
v = "";
i = 0;
if (i < bitmask_size/sizeof(unsigned long))
else
*word = '\0';
++i;
}
if (i < bitmask_size / sizeof(unsigned long))
else
if (test) {
/* printf pattern with the right unsigned long number of hex chars */
val = bitmask_size / sizeof (unsigned long);
/* skip over leading zeros */
--val;
for (i = 0; i < val; ++i) {
}
}
}
/* pointer devices */
const unsigned long* bitmask_ev,
const unsigned long* bitmask_abs,
const unsigned long* bitmask_key,
const unsigned long* bitmask_rel,
const unsigned long* bitmask_props,
bool test) {
int is_mouse = 0;
int is_touchpad = 0;
return;
}
is_touchpad = 1;
/* This path is taken by VMware's USB mouse, which has
is_mouse = 1;
/* joysticks don't necessarily have to have buttons; e. g.
* other fancy axes */
}
is_mouse = 1;
if (is_mouse)
if (is_touchpad)
}
/* key like devices */
const unsigned long* bitmask_ev,
const unsigned long* bitmask_key,
bool test) {
unsigned i;
unsigned long found;
unsigned long mask;
/* do we have any KEY_* capability? */
log_debug("test_key: no EV_KEY capability");
return;
}
/* only consider KEY_* here, not BTN_* */
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", (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", i);
found = 1;
break;
}
}
}
if (found > 0)
/* the first 32 bits are ESC, numbers, and Q to D; if we have all of
* those, consider it a full keyboard; do not test KEY_RESERVED, though */
mask = 0xFFFFFFFE;
}
struct udev_device *pdev;
/* walk up the parental chain until we find the real input device; the
* argument is very likely a subdevice of this, like eventN */
if (pdev) {
/* Use this as a flag that input devices were detected, so that this
* program doesn't need to be called more than once per device */
}
return EXIT_SUCCESS;
}
const struct udev_builtin udev_builtin_input_id = {
.name = "input_id",
.cmd = builtin_input_id,
.help = "Input device properties",
};