Thu Jan 29 01:56:02 2015 UTC ()
add wsmouse support to wscons driver


(jmcneill)
diff -r1.67 -r1.68 pkgsrc/devel/SDL/distinfo
diff -r1.5 -r1.6 pkgsrc/devel/SDL/patches/patch-src_video_wscons_SDL__wsconsevents.c
diff -r1.3 -r1.4 pkgsrc/devel/SDL/patches/patch-src_video_wscons_SDL__wsconsvideo.c

cvs diff -r1.67 -r1.68 pkgsrc/devel/SDL/distinfo (expand / switch to context diff)
--- pkgsrc/devel/SDL/distinfo 2015/01/28 17:14:47 1.67
+++ pkgsrc/devel/SDL/distinfo 2015/01/29 01:56:02 1.68
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.67 2015/01/28 17:14:47 jmcneill Exp $
+$NetBSD: distinfo,v 1.68 2015/01/29 01:56:02 jmcneill Exp $
 
 SHA1 (SDL-1.2.15.tar.gz) = 0c5f193ced810b0d7ce3ab06d808cbb5eef03a2c
 RMD160 (SDL-1.2.15.tar.gz) = d4802a090cb4a24eeb0c8ce5690802f596d394c3
@@ -8,6 +8,8 @@
 SHA1 (patch-src_audio_sun_SDL__sunaudio.c) = 4b492b40d39e6444037dfda55766e4a149cc6c30
 SHA1 (patch-src_joystick_bsd_SDL__sysjoystick.c) = 4ea0136f231729129b82e5f7ee4b9eaf68a13876
 SHA1 (patch-src_video_quartz_SDL__QuartzVideo.h) = 19d952bade06dbd646e94f42139c38436969b1a8
-SHA1 (patch-src_video_wscons_SDL__wsconsevents.c) = 6ae894622078c2cc2a0add0b496944567d38f797
-SHA1 (patch-src_video_wscons_SDL__wsconsvideo.c) = 356a8817cc41dde5e24cb23f032215931f85a84b
+SHA1 (patch-src_video_wscons_SDL__wsconsevents.c) = f7519864e9c13ad69eae9a42df22a944586ab93b
+SHA1 (patch-src_video_wscons_SDL__wsconsevents__c.h) = 97206e2aca0b620005217d9d07ad1177516cac92
+SHA1 (patch-src_video_wscons_SDL__wsconsvideo.c) = 17e048ccb201ae961e820ab880d5a588b2db2639
+SHA1 (patch-src_video_wscons_SDL__wsconsvideo.h) = 82028df57cf3de95152278924ffe3134fe32f85a
 SHA1 (patch-src_video_x11_SDL_x11video.c) = 624fbb7e701d6de6ec93096beea7c085125934aa

cvs diff -r1.5 -r1.6 pkgsrc/devel/SDL/patches/patch-src_video_wscons_SDL__wsconsevents.c (expand / switch to context diff)
--- pkgsrc/devel/SDL/patches/patch-src_video_wscons_SDL__wsconsevents.c 2015/01/28 17:14:47 1.5
+++ pkgsrc/devel/SDL/patches/patch-src_video_wscons_SDL__wsconsevents.c 2015/01/29 01:56:02 1.6
@@ -1,7 +1,5 @@
-$NetBSD: patch-src_video_wscons_SDL__wsconsevents.c,v 1.5 2015/01/28 17:14:47 jmcneill Exp $
+$NetBSD: patch-src_video_wscons_SDL__wsconsevents.c,v 1.6 2015/01/29 01:56:02 jmcneill Exp $
 
-Add support for USB keyboards on NetBSD.
-
 --- src/video/wscons/SDL_wsconsevents.c.orig	2012-01-19 06:30:06.000000000 +0000
 +++ src/video/wscons/SDL_wsconsevents.c
 @@ -47,6 +47,13 @@ int WSCONS_InitKeyboard(_THIS)
@@ -18,9 +16,123 @@
    if (tcgetattr(private->fd, &private->saved_tty) == -1) {
      WSCONS_ReportError("cannot get terminal attributes: %s", strerror(errno));
      return -1;
-@@ -146,7 +153,72 @@ void WSCONS_InitOSKeymap(_THIS)
+@@ -65,6 +72,7 @@ int WSCONS_InitKeyboard(_THIS)
+     WSCONS_ReportError("cannot set terminal attributes: %s", strerror(errno));
+     return -1;
    }
++
+   if (ioctl(private->fd, KDSKBMODE, K_RAW) == -1) {
+     WSCONS_ReportError("cannot set raw keyboard mode: %s", strerror(errno));
+     return -1;
+@@ -89,8 +97,57 @@ void WSCONS_ReleaseKeyboard(_THIS)
+   }
+ }
  
+-static void updateMouse()
++int WSCONS_InitMouse(_THIS)
++{
++  if (private->mouseFd != -1) {
++#if defined(WSMOUSEIO_SETVERSION)
++    int version = WSMOUSE_EVENT_VERSION;
++    if (ioctl(private->mouseFd, WSMOUSEIO_SETVERSION, &version) == -1) {
++      WSCONS_ReportError("cannot set mouse API version: %s", strerror(errno));
++      return -1;
++    }
++#endif
++  }
++  return 0;
++}
++
++void WSCONS_ReleaseMouse(_THIS)
++{
++}
++
++#define NUMEVENTS 64
++
++static void updateMouse(_THIS)
+ {
++  struct wscons_event evlist[NUMEVENTS];
++  struct wscons_event *ev = evlist;
++  int nev, i;
++  ssize_t len;
++
++  len = read(private->mouseFd, evlist, sizeof(evlist));
++  if (len == -1) {
++    WSCONS_ReportError("Failed to read wsmouse event: %s", strerror(errno));
++    return;
++  }
++
++  nev = len / sizeof(*ev);
++
++  for (i = 0; i < nev; i++, ev++) {
++    switch (ev->type) {
++    case WSCONS_EVENT_MOUSE_UP:
++      posted += SDL_PrivateMouseButton(SDL_RELEASED, ev->value+1, 0, 0);
++      break;
++    case WSCONS_EVENT_MOUSE_DOWN:
++      posted += SDL_PrivateMouseButton(SDL_PRESSED, ev->value+1, 0, 0);
++      break;
++    case WSCONS_EVENT_MOUSE_DELTA_X:
++      posted += SDL_PrivateMouseMotion(0, 1, ev->value, 0);
++      break;
++    case WSCONS_EVENT_MOUSE_DELTA_Y:
++      posted += SDL_PrivateMouseMotion(0, 1, 0, -ev->value);
++      break;
++    }
++  }
+ }
+ 
+ static SDLKey keymap[128];
+@@ -120,19 +177,42 @@ static void updateKeyboard(_THIS)
+     for (i = 0; i < n; i++) {
+       unsigned char c = buf[i] & 0x7f;
+       if (c == 224) // special key prefix -- what should we do with it?
+-	continue;
++       continue;
+       posted += SDL_PrivateKeyboard((buf[i] & 0x80) ? SDL_RELEASED : SDL_PRESSED,
+-				    TranslateKey(c, &keysym));
++                                   TranslateKey(c, &keysym));
+     }
+   }
+ }
+ 
+ void WSCONS_PumpEvents(_THIS)
+ {
++  static struct timeval zero;
++  int maxfd = 0;
++
++  if (private->fd > maxfd)
++    maxfd = private->fd;
++  if (private->mouseFd > maxfd)
++    maxfd = private->mouseFd;
++
+   do {
++    fd_set fds;
++
+     posted = 0;
+-    updateMouse();
+-    updateKeyboard(this);
++
++    FD_ZERO(&fds);
++    if (private->fd != -1)
++      FD_SET(private->fd, &fds);
++    if (private->mouseFd != -1)
++      FD_SET(private->mouseFd, &fds);
++
++    if (select(maxfd+1, &fds, NULL, NULL, &zero) > 0) {
++      if (private->mouseFd != -1 && FD_ISSET(private->mouseFd, &fds)) {
++        updateMouse(this);
++      }
++      if (private->fd != -1 && FD_ISSET(private->fd, &fds)) {
++        updateKeyboard(this);
++      }
++    }
+   } while (posted);
+ }
+ 
+@@ -146,7 +226,72 @@ void WSCONS_InitOSKeymap(_THIS)
+   }
+ 
    switch (private->kbdType) {
 -#ifdef WSKBD_TYPE_ZAURUS
 +  case WSKBD_TYPE_USB:
@@ -92,7 +204,7 @@
    case WSKBD_TYPE_ZAURUS:
      /* top row */
      keymap[2] = SDLK_1;
-@@ -220,7 +292,7 @@ void WSCONS_InitOSKeymap(_THIS)
+@@ -220,7 +365,7 @@ void WSCONS_InitOSKeymap(_THIS)
      keymap[77] = SDLK_RIGHT;
      keymap[80] = SDLK_DOWN;
      break;

cvs diff -r1.3 -r1.4 pkgsrc/devel/SDL/patches/patch-src_video_wscons_SDL__wsconsvideo.c (expand / switch to context diff)
--- pkgsrc/devel/SDL/patches/patch-src_video_wscons_SDL__wsconsvideo.c 2012/01/24 15:17:05 1.3
+++ pkgsrc/devel/SDL/patches/patch-src_video_wscons_SDL__wsconsvideo.c 2015/01/29 01:56:02 1.4
@@ -1,10 +1,8 @@
-$NetBSD: patch-src_video_wscons_SDL__wsconsvideo.c,v 1.3 2012/01/24 15:17:05 wiz Exp $
+$NetBSD: patch-src_video_wscons_SDL__wsconsvideo.c,v 1.4 2015/01/29 01:56:02 jmcneill Exp $
 
-Fix tty device and color patterns for wscons driver on NetBSD.
-
---- src/video/wscons/SDL_wsconsvideo.c.orig	2009-10-12 23:07:14.000000000 +0000
+--- src/video/wscons/SDL_wsconsvideo.c.orig	2012-01-19 06:30:06.000000000 +0000
 +++ src/video/wscons/SDL_wsconsvideo.c
-@@ -141,7 +141,13 @@ VideoBootStrap WSCONS_bootstrap = {
+@@ -141,12 +141,18 @@ VideoBootStrap WSCONS_bootstrap = {
    WSCONS_CreateDevice
  };
  
@@ -18,9 +16,39 @@
  
  int WSCONS_VideoInit(_THIS, SDL_PixelFormat *vformat)
  {
-@@ -184,6 +190,11 @@ int WSCONS_VideoInit(_THIS, SDL_PixelFor
+   char devnamebuf[30];
+-  char *devname;
++  char *devname, *mouse_devname;
+   char *rotation;
+   int wstype;
+   int wsmode = WSDISPLAYIO_MODE_DUMBFB;
+@@ -166,11 +172,23 @@ int WSCONS_VideoInit(_THIS, SDL_PixelFor
+     devname = devnamebuf;
+   }
+ 
++  mouse_devname = SDL_getenv("SDL_WSMOUSEDEV");
++  if (mouse_devname == NULL) {
++    mouse_devname = "/dev/wsmouse";
++  }
++
+   private->fd = open(devname, O_RDWR | O_NONBLOCK, 0);
+   if (private->fd == -1) {
+     WSCONS_ReportError("open %s: %s", devname, strerror(errno));
      return -1;
    }
++
++  private->mouseFd = open(mouse_devname, O_RDWR | O_NONBLOCK, 0);
++  if (private->mouseFd == -1) {
++    WSCONS_ReportError("open %s: %s", mouse_devname, strerror(errno));
++    return -1;
++  }
++
+   if (ioctl(private->fd, WSDISPLAYIO_GINFO, &private->info) == -1) {
+     WSCONS_ReportError("ioctl WSDISPLAY_GINFO: %s", strerror(errno));
+     return -1;
+@@ -184,6 +202,11 @@ int WSCONS_VideoInit(_THIS, SDL_PixelFor
+     return -1;
+   }
    if (private->info.depth > 8) {
 +#ifdef __NetBSD__
 +    private->greenMask = 0x00ff00;
@@ -30,7 +58,7 @@
      if (wstype == WSDISPLAY_TYPE_SUN24 ||
  	wstype == WSDISPLAY_TYPE_SUNCG12 ||
  	wstype == WSDISPLAY_TYPE_SUNCG14 ||
-@@ -202,6 +213,7 @@ int WSCONS_VideoInit(_THIS, SDL_PixelFor
+@@ -202,6 +225,7 @@ int WSCONS_VideoInit(_THIS, SDL_PixelFor
        WSCONS_ReportError("Unknown video hardware");
        return -1;
      }
@@ -38,3 +66,26 @@
    } else {
      WSCONS_ReportError("Displays with 8 bpp or less are not supported");
      return -1;
+@@ -326,6 +350,9 @@ int WSCONS_VideoInit(_THIS, SDL_PixelFor
+   if (WSCONS_InitKeyboard(this) == -1) {
+     return -1;
+   }
++  if (WSCONS_InitMouse(this) == -1) {
++    return -1;
++  }
+   
+   return 0;
+ }
+@@ -601,7 +628,12 @@ void WSCONS_VideoQuit(_THIS)
+   }
+ 
+   WSCONS_ReleaseKeyboard(this);
++  WSCONS_ReleaseMouse(this);
+ 
++  if (private->mouseFd != -1) {
++    close(private->mouseFd);
++    private->mouseFd = -1;
++  }
+   if (private->fd != -1) {
+     close(private->fd);
+     private->fd = -1;