[prev in list] [next in list] [prev in thread] [next in thread]
List: linux-kernel
Subject: More on HID keyboard handling.
From: "Zephaniah E\. Hull" <warp () mercury ! d2dc ! net>
Date: 2003-03-31 22:27:43
[Download RAW message or body]
[Attachment #2 (multipart/mixed)]
I still have not heard anything back from you either way on the attached
patch.
It goes on top of the grabbing patch you already accepted, but it allows
for /much/ more flexibility.
If this is not an approach you would like to take, do you have any
alternate ideas?
--=20
1024D/E65A7801 Zephaniah E. Hull <warp@babylon.d2dc.net>
92ED 94E4 B1E6 3624 226D 5727 4453 008B E65A 7801
CCs of replies from mailing lists are requested.
"First they came for the Jews, and I didn't speak out - because I
was not a jew. Then they came for the Communists, and I did not speak
out - because I was not a Communist. Then they came for the trade
unionists, and I did not speak out - because I was not a trade unionist.
Then they came for me and there was no one left to speak for me!"
- Pastor Niemoeller - victim of Hitler's Nazis
["hid_mask_2.5.63.diff" (text/plain)]
diff -ur linux-2.5.63/drivers/char/keyboard.c linux-2.5.63.input/drivers/char/keyboard.c
--- linux-2.5.63/drivers/char/keyboard.c 2003-03-13 18:09:29.000000000 -0500
+++ linux-2.5.63.input/drivers/char/keyboard.c 2003-03-15 07:23:12.000000000 -0500
@@ -1174,6 +1174,7 @@
handle->dev = dev;
handle->handler = handler;
handle->name = kbd_name;
+ handle->mask = ~BIT(0);
input_open_device(handle);
kbd_refresh_leds(handle);
diff -ur linux-2.5.63/drivers/input/evdev.c linux-2.5.63.input/drivers/input/evdev.c
--- linux-2.5.63/drivers/input/evdev.c 2003-03-15 08:35:36.000000000 -0500
+++ linux-2.5.63.input/drivers/input/evdev.c 2003-03-15 07:20:29.000000000 -0500
@@ -36,6 +36,7 @@
struct input_event buffer[EVDEV_BUFFER_SIZE];
int head;
int tail;
+ unsigned long mask;
struct fasync_struct *fasync;
struct evdev *evdev;
struct list_head node;
@@ -47,11 +48,15 @@
{
struct evdev *evdev = handle->private;
struct evdev_list *list;
+ struct timeval time;
+ unsigned long mask = input_get_device_mask(handle->dev);
+
+ do_gettimeofday(&time);
if (evdev->grab) {
list = evdev->grab;
- do_gettimeofday(&list->buffer[list->head].time);
+ list->buffer[list->head].time = time;
list->buffer[list->head].type = type;
list->buffer[list->head].code = code;
list->buffer[list->head].value = value;
@@ -60,14 +65,15 @@
kill_fasync(&list->fasync, SIGIO, POLL_IN);
} else
list_for_each_entry(list, &evdev->list, node) {
+ if (~list->mask & mask) {
+ list->buffer[list->head].time = time;
+ list->buffer[list->head].type = type;
+ list->buffer[list->head].code = code;
+ list->buffer[list->head].value = value;
+ list->head = (list->head + 1) & (EVDEV_BUFFER_SIZE - 1);
- do_gettimeofday(&list->buffer[list->head].time);
- list->buffer[list->head].type = type;
- list->buffer[list->head].code = code;
- list->buffer[list->head].value = value;
- list->head = (list->head + 1) & (EVDEV_BUFFER_SIZE - 1);
-
- kill_fasync(&list->fasync, SIGIO, POLL_IN);
+ kill_fasync(&list->fasync, SIGIO, POLL_IN);
+ }
}
wake_up_interruptible(&evdev->wait);
@@ -286,6 +292,28 @@
return 0;
}
+ case EVIOCGMASK:
+ if (put_user(~list->mask, ((unsigned long *) arg) + 0))
+ return -EFAULT;
+ return 0;
+
+ case EVIOCSMASK:
+ list->mask = ~arg;
+ return 0;
+
+ case EVIOCGDMASK:
+ {
+ unsigned long mask;
+ mask = input_get_device_mask (dev);
+ if (put_user(mask, ((unsigned long *) arg) + 0))
+ return -EFAULT;
+ return 0;
+ }
+
+ case EVIOCSDMASK:
+ input_set_device_mask(dev, arg);
+ return 0;
+
default:
if (_IOC_TYPE(cmd) != 'E' || _IOC_DIR(cmd) != _IOC_READ)
diff -ur linux-2.5.63/drivers/input/input.c linux-2.5.63.input/drivers/input/input.c
--- linux-2.5.63/drivers/input/input.c 2003-03-15 08:35:36.000000000 -0500
+++ linux-2.5.63.input/drivers/input/input.c 2003-03-15 07:17:52.000000000 -0500
@@ -33,6 +33,8 @@
EXPORT_SYMBOL(input_unregister_handler);
EXPORT_SYMBOL(input_register_minor);
EXPORT_SYMBOL(input_unregister_minor);
+EXPORT_SYMBOL(input_get_device_mask);
+EXPORT_SYMBOL(input_set_device_mask);
EXPORT_SYMBOL(input_grab_device);
EXPORT_SYMBOL(input_release_device);
EXPORT_SYMBOL(input_open_device);
@@ -183,7 +185,7 @@
dev->grab->handler->event(dev->grab, type, code, value);
else
list_for_each_entry(handle, &dev->h_list, d_node)
- if (handle->open)
+ if (handle->open && (~handle->mask & ~dev->mask))
handle->handler->event(handle, type, code, value);
}
@@ -208,6 +210,16 @@
return 0;
}
+unsigned long input_get_device_mask (struct input_dev *dev)
+{
+ return ~dev->mask;
+}
+
+void input_set_device_mask (struct input_dev *dev, unsigned long mask)
+{
+ dev->mask = ~mask;
+}
+
int input_grab_device(struct input_handle *handle)
{
if (handle->dev->grab)
diff -ur linux-2.5.63/drivers/input/joydev.c linux-2.5.63.input/drivers/input/joydev.c
--- linux-2.5.63/drivers/input/joydev.c 2003-03-13 18:09:29.000000000 -0500
+++ linux-2.5.63.input/drivers/input/joydev.c 2003-03-15 07:23:50.000000000 -0500
@@ -400,6 +400,7 @@
joydev->handle.name = joydev->name;
joydev->handle.handler = handler;
joydev->handle.private = joydev;
+ joydev->handle.mask = ~BIT(0);
sprintf(joydev->name, "js%d", minor);
for (i = 0; i < ABS_MAX; i++)
diff -ur linux-2.5.63/drivers/input/mousedev.c linux-2.5.63.input/drivers/input/mousedev.c
--- linux-2.5.63/drivers/input/mousedev.c 2003-03-13 18:09:29.000000000 -0500
+++ linux-2.5.63.input/drivers/input/mousedev.c 2003-03-15 07:23:58.000000000 -0500
@@ -419,6 +419,7 @@
mousedev->handle.name = mousedev->name;
mousedev->handle.handler = handler;
mousedev->handle.private = mousedev;
+ mousedev->handle.mask = ~BIT(0);
sprintf(mousedev->name, "mouse%d", minor);
if (mousedev_mix.open)
diff -ur linux-2.5.63/include/linux/input.h linux-2.5.63.input/include/linux/input.h
--- linux-2.5.63/include/linux/input.h 2003-03-15 08:35:36.000000000 -0500
+++ linux-2.5.63.input/include/linux/input.h 2003-03-15 08:10:53.000000000 -0500
@@ -77,7 +77,11 @@
#define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */
#define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */
-#define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */
+#define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */
+#define EVIOCGMASK _IOR('E', 0x91, unsigned long *) /* Get our input mask */
+#define EVIOCSMASK _IOW('E', 0x92, unsigned long) /* Set our input mask */
+#define EVIOCGDMASK _IOR('E', 0x93, unsigned long *) /* Get device input mask */
+#define EVIOCSDMASK _IOW('E', 0x94, unsigned long) /* Set device input mask */
/*
* Event types
@@ -801,6 +805,7 @@
int (*upload_effect)(struct input_dev *dev, struct ff_effect *effect);
int (*erase_effect)(struct input_dev *dev, int effect_id);
+ unsigned long mask;
struct input_handle *grab;
struct list_head h_list;
@@ -874,6 +879,7 @@
int open;
char *name;
+ unsigned long mask;
struct input_dev *dev;
struct input_handler *handler;
@@ -893,6 +899,9 @@
void input_register_handler(struct input_handler *);
void input_unregister_handler(struct input_handler *);
+unsigned long input_get_device_mask(struct input_dev *);
+void input_set_device_mask(struct input_dev *, unsigned long mask);
+
int input_grab_device(struct input_handle *);
void input_release_device(struct input_handle *);
[Attachment #6 (application/pgp-signature)]
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic