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