[PATCH:xf86-input-keyboard 18/21] Fix wskbd handling when VT switching.

Thomas Klausner wiz at NetBSD.org
Mon Jul 29 01:20:11 PDT 2013


On Sat, Jul 27, 2013 at 11:55:27AM +0200, walter harms wrote:
> 
> 
> Am 26.07.2013 23:24, schrieb Thomas Klausner:
> > When using /dev/wskbd* we need to close the device when VT switching
> > out of X, and open it again when switching back.
> > 
> > From Michael Lorenz <macallan at NetBSD.org>
> > Signed-off-by: Thomas Klausner <wiz at NetBSD.org>
> > ---
> >  src/bsd_kbd.c   | 35 ++++++++++++++++++++++++++++++++++-
> >  src/xf86OSKbd.h |  1 +
> >  2 files changed, 35 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/bsd_kbd.c b/src/bsd_kbd.c
> > index 70a3ff1..0615cf2 100644
> > --- a/src/bsd_kbd.c
> > +++ b/src/bsd_kbd.c
> > @@ -204,6 +204,24 @@ KbdOn(InputInfoPtr pInfo, int what)
> >  		 break;
> >  #endif
> >          }
> > +    } else {
> > +        switch (pKbd->consType) {
> > +#ifdef WSCONS_SUPPORT
> > +            case WSCONS:
> > +            	 if ((pKbd->wsKbdDev[0] != 0) && (pInfo->fd == -1)) {
> > +			xf86Msg(X_INFO, "opening %s\n", pKbd->wsKbdDev);
> > +			pInfo->fd = open(pKbd->wsKbdDev, O_RDONLY | O_NONBLOCK | O_EXCL);
> > +#ifdef WSKBDIO_SETVERSION
> > +			int version = WSKBDIO_EVENT_VERSION;
> > +			if (ioctl(pInfo->fd, WSKBDIO_SETVERSION, &version) == -1) {
> > +				xf86Msg(X_WARNING, "%s: cannot set version\n", pInfo->name);
> > +				return FALSE;
> > +			}
> > +#endif
> 
> I remember this from a patch before.
> IMHO you can impove readablity be using a function to set version.
> like:
> 
> int set_version(pinfo,int version) {
> if (ioctl(pInfo->fd, WSKBDIO_SETVERSION, &version) == -1) {
> 	xf86Msg(X_WARNING, "%s: cannot set version\n", pInfo->name);
> 	return -1; /* do we need to know ??? */
> }
> 	return 0;
> }
> 
> 
> #ifdef WSKBDIO_SETVERSION
> 	if ( set_version(pinfo, WSKBDIO_EVENT_VERSION ) <0 ) return FALSE;
> #endif
> 
> when  WSKBDIO_EVENT_VERSION is defined unconditionaly you let set_version() return 0,
> and has reduced the #ifdef level by 1.

Ok, I've done that. Patch attached.

> I would also think again about the open(). In case open fails
> the user get an error like "cannot set version", sending him on the wrong path.
> adding an xopen() like:
> 
> int xopen(char *name, int mode) {
> int fd=open (name,mode);
> if ( fd < 0 ) 	error("failed to open %s\n",name);	
> return fd;
> }
> In this case you could even ignore the error from ioctl() because it is clear what the acutal
> problem is.

I don't think this improves the code in this particular piece of code.

Thanks for the comments,
 Thomas
-------------- next part --------------
>From dfb06978c1f45416f591967690b478b6eeecdccb Mon Sep 17 00:00:00 2001
From: Thomas Klausner <wiz at NetBSD.org>
Date: Mon, 29 Jul 2013 09:11:18 +0200
Subject: [PATCH:xf86-input-keyboard 23/23] Factor out common code.

Suggested by Walter Harms <wharms at bfs.de>.

Signed-off-by: Thomas Klausner <wiz at NetBSD.org>
---
 src/bsd_kbd.c | 31 ++++++++++++++++++-------------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/src/bsd_kbd.c b/src/bsd_kbd.c
index 1e0531e..175c544 100644
--- a/src/bsd_kbd.c
+++ b/src/bsd_kbd.c
@@ -39,6 +39,21 @@ typedef struct {
    struct termios kbdtty;
 } BsdKbdPrivRec, *BsdKbdPrivPtr;
 
+#ifdef WSCONS_SUPPORT
+static Bool
+WSSetVersion(int fd, const char *name)
+{
+#ifdef WSKBDIO_SETVERSION
+    int version = WSKBDIO_EVENT_VERSION;
+    if (ioctl(fd, WSKBDIO_SETVERSION, &version) == -1) {
+        xf86Msg(X_WARNING, "%s: cannot set version\n", name);
+        return FALSE;
+    }
+#endif
+    return TRUE;
+}
+#endif
+
 static
 int KbdInit(InputInfoPtr pInfo, int what)
 {
@@ -211,13 +226,8 @@ KbdOn(InputInfoPtr pInfo, int what)
             	 if ((pKbd->wsKbdDev[0] != 0) && (pInfo->fd == -1)) {
 			xf86Msg(X_INFO, "opening %s\n", pKbd->wsKbdDev);
 			pInfo->fd = open(pKbd->wsKbdDev, O_RDONLY | O_NONBLOCK | O_EXCL);
-#ifdef WSKBDIO_SETVERSION
-			int version = WSKBDIO_EVENT_VERSION;
-			if (ioctl(pInfo->fd, WSKBDIO_SETVERSION, &version) == -1) {
-				xf86Msg(X_WARNING, "%s: cannot set version\n", pInfo->name);
+			if (WSSetVersion(pInfo->fd, pInfo->name) == FALSE)
 				return FALSE;
-			}
-#endif
 		}
 		break;
 #endif
@@ -416,13 +426,8 @@ OpenKeyboard(InputInfoPtr pInfo)
 #ifdef WSCONS_SUPPORT
     if( prot == PROT_WSCONS) {
        pKbd->consType = WSCONS;
-#ifdef WSKBDIO_SETVERSION
-       int version = WSKBDIO_EVENT_VERSION;
-       if (ioctl(pInfo->fd, WSKBDIO_SETVERSION, &version) == -1) {
-           xf86Msg(X_WARNING, "%s: cannot set version\n", pInfo->name);
-           return FALSE;
-       }
-#endif
+       if (WSSetVersion(pInfo->fd, pInfo->name) == FALSE)
+	   return FALSE;
        /* Find out keyboard type */
        if (ioctl(pInfo->fd, WSKBDIO_GTYPE, &(pKbd->wsKbdType)) == -1) {
            xf86Msg(X_ERROR, "%s: cannot get keyboard type", pInfo->name);
-- 
1.8.3.3



More information about the xorg-devel mailing list