Commit c265e73f3bcf126d86da1afdb924d4f3677ed19f

Sam Lantinga 2021-01-17T10:05:11

Fixed bug 5473 - Add WSCONS support for NetBSD wahil1976 This patch adds WSCONS support for NetBSD.

diff --git a/configure b/configure
index 49fb94d..8ea32a1 100755
--- a/configure
+++ b/configure
@@ -24902,7 +24902,7 @@ $as_echo "#define SDL_VIDEO_DRIVER_ANDROID 1" >>confdefs.h
           freebsd)
               CheckInputKBIO
           ;;
-          openbsd)
+          openbsd|netbsd)
               CheckInputWSCONS
           ;;
         esac
diff --git a/configure.ac b/configure.ac
index b47c75b..f9a8802 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3626,7 +3626,7 @@ case "$host" in
           freebsd)
               CheckInputKBIO
           ;;
-          openbsd)
+          openbsd|netbsd)
               CheckInputWSCONS
           ;;
         esac
diff --git a/src/core/openbsd/SDL_wscons_kbd.c b/src/core/openbsd/SDL_wscons_kbd.c
index 52dfe8a..23c8bd0 100644
--- a/src/core/openbsd/SDL_wscons_kbd.c
+++ b/src/core/openbsd/SDL_wscons_kbd.c
@@ -38,6 +38,12 @@
 
 #include "../../events/SDL_events_c.h"
 
+#ifdef __NetBSD__
+#define KS_GROUP_Ascii KS_GROUP_Plain
+#define KS_Cmd_ScrollBack KS_Cmd_ScrollFastUp
+#define KS_Cmd_ScrollFwd KS_Cmd_ScrollFastDown
+#endif
+
 #define RETIFIOCTLERR(x) if (x == -1) { free(input); input = NULL; return NULL;}
 
 typedef struct SDL_WSCONS_mouse_input_data SDL_WSCONS_mouse_input_data;
@@ -216,11 +222,13 @@ static struct SDL_wscons_compose_tab_s {
     { { KS_asciicircum,		KS_u },			KS_ucircumflex },
     { { KS_grave,			KS_u },			KS_ugrave },
     { { KS_acute,			KS_y },			KS_yacute },
+#ifndef __NetBSD__
     { { KS_dead_caron,		KS_space },		KS_L2_caron },
     { { KS_dead_caron,		KS_S },			KS_L2_Scaron },
     { { KS_dead_caron,		KS_Z },			KS_L2_Zcaron },
     { { KS_dead_caron,		KS_s },			KS_L2_scaron },
     { { KS_dead_caron,		KS_z },			KS_L2_zcaron }
+#endif
 };
 
 static keysym_t ksym_upcase(keysym_t ksym)
@@ -306,10 +314,12 @@ static struct wscons_keycode_to_SDL {
     {KS_f18, SDL_SCANCODE_F18},
     {KS_f19, SDL_SCANCODE_F19},
     {KS_f20, SDL_SCANCODE_F20},
+#if !defined(__NetBSD__)
     {KS_f21, SDL_SCANCODE_F21},
     {KS_f22, SDL_SCANCODE_F22},
     {KS_f23, SDL_SCANCODE_F23},
     {KS_f24, SDL_SCANCODE_F24},
+#endif
     {KS_Meta_L, SDL_SCANCODE_LGUI},
     {KS_Meta_R, SDL_SCANCODE_RGUI},
     {KS_Zenkaku_Hankaku, SDL_SCANCODE_LANG5},
@@ -397,6 +407,9 @@ static SDL_WSCONS_mouse_input_data* mouseInputData = NULL;
 #define IS_CAPSLOCK_ON   (input->ledstate & LED_CAP)
 static SDL_WSCONS_input_data* SDL_WSCONS_Init_Keyboard(const char* dev)
 {
+#ifdef WSKBDIO_SETVERSION
+    int version = WSKBDIO_EVENT_VERSION;
+#endif
     SDL_WSCONS_input_data* input = (SDL_WSCONS_input_data*)SDL_calloc(1, sizeof(SDL_WSCONS_input_data));
 
     if (!input) {
@@ -419,7 +432,6 @@ static SDL_WSCONS_input_data* SDL_WSCONS_Init_Keyboard(const char* dev)
     input->origledstate = input->ledstate;
     RETIFIOCTLERR(ioctl(input->fd, WSKBDIO_GETENCODING, &input->encoding));
 #ifdef WSKBDIO_SETVERSION
-    int version = WSKBDIO_EVENT_VERSION;
     RETIFIOCTLERR(ioctl(input->fd, WSKBDIO_SETVERSION, &version));
 #endif
     return input;
@@ -583,6 +595,7 @@ static void updateKeyboard(SDL_WSCONS_input_data* input)
                     input->lockheldstate[2] = 1;
                     break;
                 }
+#ifndef __NetBSD__
                 case KS_Mode_Lock: {
                     if (input->lockheldstate[3] >= 1) break;
                     input->ledstate ^= 1 << 4;
@@ -590,6 +603,7 @@ static void updateKeyboard(SDL_WSCONS_input_data* input)
                     input->lockheldstate[3] = 1;
                     break;
                 }
+#endif
                 case KS_Shift_Lock: {
                     if (input->lockheldstate[4] >= 1) break;
                     input->ledstate ^= 1 << 5;
@@ -656,10 +670,12 @@ static void updateKeyboard(SDL_WSCONS_input_data* input)
                     if (input->lockheldstate[2]) input->lockheldstate[2] = 0;
                 }
                 break;
+#ifndef __NetBSD__
                 case KS_Mode_Lock: {
                     if (input->lockheldstate[3]) input->lockheldstate[3] = 0;
                 }
                 break;
+#endif
                 case KS_Shift_Lock: {
                     if (input->lockheldstate[4]) input->lockheldstate[4] = 0;
                 }
@@ -770,7 +786,7 @@ static void updateKeyboard(SDL_WSCONS_input_data* input)
                         result = KS_voidSymbol;
                         input->ledstate &= ~WSKBD_LED_COMPOSE;
                         ioctl(input->fd,WSKBDIO_SETLEDS, &input->ledstate);
-                        for (acc_i = 0; acc_i < nitems(compose_tab); acc_i++) {
+                        for (acc_i = 0; acc_i < SDL_arraysize(compose_tab); acc_i++) {
                             if ((compose_tab[acc_i].elem[0] == input->composebuffer[0]
                                     && compose_tab[acc_i].elem[1] == input->composebuffer[1])
                                     || (compose_tab[acc_i].elem[0] == input->composebuffer[1]
diff --git a/src/core/openbsd/SDL_wscons_mouse.c b/src/core/openbsd/SDL_wscons_mouse.c
index bda7ca6..4df927b 100644
--- a/src/core/openbsd/SDL_wscons_mouse.c
+++ b/src/core/openbsd/SDL_wscons_mouse.c
@@ -37,16 +37,20 @@ typedef struct SDL_WSCONS_mouse_input_data
 
 SDL_WSCONS_mouse_input_data* SDL_WSCONS_Init_Mouse()
 {
+#ifdef WSMOUSEIO_SETVERSION
+    int version = WSMOUSE_EVENT_VERSION;
+#endif
     SDL_WSCONS_mouse_input_data* mouseInputData = SDL_calloc(1, sizeof(SDL_WSCONS_mouse_input_data));
 
     if (!mouseInputData) return NULL;
     mouseInputData->fd = open("/dev/wsmouse",O_RDWR | O_NONBLOCK);
     if (mouseInputData->fd == -1) {free(mouseInputData); return NULL; }
+#ifdef WSMOUSEIO_SETMODE
     ioctl(mouseInputData->fd, WSMOUSEIO_SETMODE, WSMOUSE_COMPAT);
-    #ifdef WSMOUSEIO_SETVERSION
-    int version = WSMOUSEIO_EVENT_VERSION;
-    ioctl(inputData->fd, WSMOUSEIO_SETVERSION, &version);
-    #endif
+#endif
+#ifdef WSMOUSEIO_SETVERSION
+    ioctl(mouseInputData->fd, WSMOUSEIO_SETVERSION, &version);
+#endif
     return mouseInputData;
 }