x-input-evdev: src/evdev.c src/evdev_funcs.c src/Xevdev.h
Tiago Vignatti
vignatti at kemper.freedesktop.org
Thu Aug 24 15:04:45 PDT 2006
src/Xevdev.h | 15 ++++++--
src/evdev.c | 97 ++++++++++++------------------------------------------
src/evdev_funcs.c | 58 ++++++++++++++++++++++++++++++--
3 files changed, 89 insertions(+), 81 deletions(-)
New commits:
diff-tree 424970118d18d86b392a6a530c56a46d169ec585 (from 60470caba4887c19923d4a8e1325c239ab9fab36)
Author: Tiago Vignatti <vignatti at c3sl.ufpr.br>
Date: Thu Aug 24 19:03:51 2006 -0300
Added EvdevBlockSigio, EvdevUnblockSigio, EvdevAssertSigioBlocked and evdevGetBits funcs to evdev_funcs.c
diff --git a/src/Xevdev.h b/src/Xevdev.h
index dc07458..a317c7f 100644
--- a/src/Xevdev.h
+++ b/src/Xevdev.h
@@ -1,6 +1,11 @@
#ifndef XEVDEV_H
#define XEVDEV_H
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <signal.h>
+
#include <linux/input.h>
#include <errno.h>
#include <string.h>
@@ -17,6 +22,7 @@
#endif
#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
+#define MASK(x) (1UL << ((x) & (BITS_PER_LONG - 1)))
#ifndef SYSCALL
#define SYSCALL(call) while(((call) == -1) && (errno == EINTR))
@@ -117,16 +123,19 @@ typedef struct _evdevDevice {
} evdevDeviceRec, *evdevDevicePtr;
+typedef void (*EvdevReadInputProc) ();
+
/* FUNCTIONS */
+void EvdevUnblockSigio (void);
+void EvdevBlockSigio (void);
int evdevGetFDForDevice (evdevDevicePtr driver);
-typedef void (*EvdevReadInputProc) ();
int OpenEvdevInput (char *kbdEvdev,
char *ptrEvdev,
EvdevReadInputProc readInput);
int EvdevSetLeds(long int leds);
-void EvdevGrabKeyboard();
-void EvdevUngrabKeyboard();
+Bool EvdevGrabKeyboard();
+Bool EvdevUngrabKeyboard();
int EvdevCheckIfEvent(struct input_event *ie);
#endif /* XEVDEV_H */
diff --git a/src/evdev.c b/src/evdev.c
index a16b716..5f75aa6 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -31,75 +31,37 @@
#include "Xevdev.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
-
-int kbd_fd,
- ptr_fd;
+int kbd_fd, /* Keyboard file descriptor */
+ ptr_fd; /* Mouse file descriptor */
static EvdevReadInputProc EvdevReadInput;
-static int
-BlockSIGIO(void)
-{
- sigset_t set,
- old;
-
- sigemptyset(&set);
- sigaddset(&set, SIGIO);
- sigprocmask(SIG_BLOCK, &set, &old);
- return sigismember(&old, SIGIO);
-}
-
-static void
-UnblockSIGIO(int wasset)
-{
- sigset_t set;
-
- if (!wasset) {
- sigemptyset(&set);
- sigaddset(&set, SIGIO);
- sigprocmask(SIG_UNBLOCK, &set, NULL);
- }
-}
static void
-EvdevSigioReadInput(int sig)
+EvdevSigio(int sig)
{
- int wasset = BlockSIGIO();
- (*EvdevReadInput)();
- UnblockSIGIO(wasset);
+ EvdevAssertSigioBlocked("EvdevSigio");
+
+ EvdevBlockSigio();
+ (*EvdevReadInput)(); /* defined in each DDX*/
+ EvdevUnblockSigio();
}
-#define BIT(x) (1UL<<((x)%BITS_PER_LONG))
-
-#define EVIOCGMASK _IOR('E', 0x91, unsigned long *)
-#define EVIOCSMASK _IOW('E', 0x92, unsigned long)
-#define EVIOCGDMASK _IOR('E', 0x93, unsigned long *)
-#define EVIOCSDMASK _IOW('E', 0x94, unsigned long)
-
int
OpenEvdevInput (char *KbdEvdev,
char *PtrEvdev,
EvdevReadInputProc readInput)
{
- static int already_open = 0;
struct sigaction sa;
- struct sigaction osa;
evdevDevicePtr KbdDevice;
evdevDevicePtr PtrDevice;
- if (already_open)
- return 1;
-
EvdevReadInput = readInput;
if (!(KbdDevice = Xcalloc(sizeof(*KbdDevice))))
@@ -132,52 +94,39 @@ OpenEvdevInput (char *KbdEvdev,
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGIO);
sa.sa_flags = 0;
- sa.sa_handler = EvdevSigioReadInput;
- sigaction(SIGIO, &sa, &osa);
-
- already_open = 1;
+ sa.sa_handler = EvdevSigio;
+ sigaction(SIGIO, &sa, 0);
return 1;
}
-static int grabbed = 0;
+//static int grabbed = 0;
-void
+Bool
EvdevGrabKeyboard()
{
- unsigned long mask;
-
- if (grabbed)
- return;
+// if (grabbed)
+// return 0;
- if (ioctl(kbd_fd, EVIOCGMASK, &mask) < 0) {
- fprintf (stderr, "unable to use input device masking '%s', trying grabbing.\n", strerror(errno));
- if (ioctl(kbd_fd, EVIOCGRAB, 1) < 0)
- fprintf (stderr, "unable to grab device '%s', you may have problems.\n", strerror(errno));
- return;
+ if (ioctl(kbd_fd, EVIOCGRAB, (void *)1) < 0) {
+ fprintf (stderr, "unable to grab device '%s', you may have problems.\n", strerror(errno));
+ return 0;
}
-
- mask |= BIT(2);
- ioctl(kbd_fd, EVIOCSMASK, mask);
- ioctl(kbd_fd, EVIOCGDMASK, &mask);
- mask &= ~BIT(0);
- mask |= BIT(2);
- ioctl(kbd_fd, EVIOCSDMASK, mask);
+ return 1;
}
-
-void
+Bool
EvdevUngrabKeyboard()
{
unsigned long mask;
- if (!grabbed)
- return;
-
+// if (!grabbed)
+// return;
+/*
if (ioctl(kbd_fd, EVIOCGDMASK, &mask) >= 0) {
mask |= BIT(0);
ioctl(kbd_fd, EVIOCSDMASK, mask);
- }
+ }*/
}
int
diff --git a/src/evdev_funcs.c b/src/evdev_funcs.c
index 7a9dcda..407a8f4 100644
--- a/src/evdev_funcs.c
+++ b/src/evdev_funcs.c
@@ -31,10 +31,37 @@
#include "Xevdev.h"
-/* open() */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
+void
+EvdevBlockSigio(void)
+{
+ sigset_t set;
+
+ sigemptyset(&set);
+ sigaddset(&set, SIGIO);
+ sigprocmask(SIG_BLOCK, &set, 0);
+}
+
+void
+EvdevUnblockSigio(void)
+{
+ sigset_t set;
+
+ sigemptyset(&set);
+ sigaddset(&set, SIGIO);
+ sigprocmask(SIG_UNBLOCK, &set, 0);
+}
+
+void
+EvdevAssertSigioBlocked (char *where)
+{
+ sigset_t set, old;
+
+ sigemptyset (&set);
+ sigprocmask (SIG_BLOCK, &set, &old);
+ if (!sigismember (&old, SIGIO))
+ ErrorF ("SIGIO not blocked at %s\n", where);
+}
+
int
evdevGetFDForDevice (evdevDevicePtr device)
@@ -55,3 +82,26 @@ evdevGetFDForDevice (evdevDevicePtr devi
return -1;
}
+Bool
+evdevGetBits (int fd, evdevBitsPtr bits)
+{
+#define get_bitmask(fd, which, where) \
+ if (ioctl(fd, EVIOCGBIT(which, sizeof (where)), where) < 0) { \
+ fprintf(stderr, "ioctl EVIOCGBIT %s failed: %s\n", #which, strerror(errno)); \
+ return 0; \
+ }
+
+ get_bitmask (fd, 0, bits->ev);
+ get_bitmask (fd, EV_KEY, bits->key);
+ get_bitmask (fd, EV_REL, bits->rel);
+ get_bitmask (fd, EV_ABS, bits->abs);
+ get_bitmask (fd, EV_MSC, bits->msc);
+ get_bitmask (fd, EV_LED, bits->led);
+ get_bitmask (fd, EV_SND, bits->snd);
+ get_bitmask (fd, EV_FF, bits->ff);
+
+#undef get_bitmask
+
+ return 1;
+}
+
More information about the xorg-commit
mailing list