Home | History | Annotate | Download | only in wscons
      1 /*
      2     SDL - Simple DirectMedia Layer
      3     Copyright (C) 1997-2012 Sam Lantinga
      4 
      5     This library is free software; you can redistribute it and/or
      6     modify it under the terms of the GNU Lesser General Public
      7     License as published by the Free Software Foundation; either
      8     version 2.1 of the License, or (at your option) any later version.
      9 
     10     This library is distributed in the hope that it will be useful,
     11     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13     Lesser General Public License for more details.
     14 
     15     You should have received a copy of the GNU Lesser General Public
     16     License along with this library; if not, write to the Free Software
     17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     18 
     19     Sam Lantinga
     20     slouken (at) libsdl.org
     21 */
     22 #include "SDL_config.h"
     23 
     24 #include <sys/types.h>
     25 #include <dev/wscons/wsdisplay_usl_io.h>
     26 #include <sys/ioctl.h>
     27 #include <fcntl.h>
     28 #include <unistd.h>
     29 #include <termios.h>
     30 #include <errno.h>
     31 #include <string.h>
     32 
     33 #include "SDL.h"
     34 #include "../../events/SDL_sysevents.h"
     35 #include "../../events/SDL_events_c.h"
     36 #include "SDL_wsconsvideo.h"
     37 #include "SDL_wsconsevents_c.h"
     38 
     39 static int posted = 0;
     40 
     41 int WSCONS_InitKeyboard(_THIS)
     42 {
     43   struct termios tty;
     44 
     45   if (ioctl(private->fd, WSKBDIO_GTYPE, &private->kbdType) == -1) {
     46     WSCONS_ReportError("cannot get keyboard type: %s", strerror(errno));
     47     return -1;
     48   }
     49 
     50   if (tcgetattr(private->fd, &private->saved_tty) == -1) {
     51     WSCONS_ReportError("cannot get terminal attributes: %s", strerror(errno));
     52     return -1;
     53   }
     54   private->did_save_tty = 1;
     55   tty = private->saved_tty;
     56   tty.c_iflag = IGNPAR | IGNBRK;
     57   tty.c_oflag = 0;
     58   tty.c_cflag = CREAD | CS8;
     59   tty.c_lflag = 0;
     60   tty.c_cc[VTIME] = 0;
     61   tty.c_cc[VMIN] = 1;
     62   cfsetispeed(&tty, 9600);
     63   cfsetospeed(&tty, 9600);
     64   if (tcsetattr(private->fd, TCSANOW, &tty) < 0) {
     65     WSCONS_ReportError("cannot set terminal attributes: %s", strerror(errno));
     66     return -1;
     67   }
     68   if (ioctl(private->fd, KDSKBMODE, K_RAW) == -1) {
     69     WSCONS_ReportError("cannot set raw keyboard mode: %s", strerror(errno));
     70     return -1;
     71   }
     72 
     73   return 0;
     74 }
     75 
     76 void WSCONS_ReleaseKeyboard(_THIS)
     77 {
     78   if (private->fd != -1) {
     79     if (ioctl(private->fd, KDSKBMODE, K_XLATE) == -1) {
     80       WSCONS_ReportError("cannot restore keyboard to translated mode: %s",
     81 			 strerror(errno));
     82     }
     83     if (private->did_save_tty) {
     84       if (tcsetattr(private->fd, TCSANOW, &private->saved_tty) < 0) {
     85 	WSCONS_ReportError("cannot restore keynoard attributes: %s",
     86 			   strerror(errno));
     87       }
     88     }
     89   }
     90 }
     91 
     92 static void updateMouse()
     93 {
     94 }
     95 
     96 static SDLKey keymap[128];
     97 
     98 static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym)
     99 {
    100   keysym->scancode = scancode;
    101   keysym->sym = SDLK_UNKNOWN;
    102   keysym->mod = KMOD_NONE;
    103 
    104   if (scancode < SDL_arraysize(keymap))
    105     keysym->sym = keymap[scancode];
    106 
    107   if (keysym->sym == SDLK_UNKNOWN)
    108     printf("Unknown mapping for scancode %d\n", scancode);
    109 
    110   return keysym;
    111 }
    112 
    113 static void updateKeyboard(_THIS)
    114 {
    115   unsigned char buf[100];
    116   SDL_keysym keysym;
    117   int n, i;
    118 
    119   if ((n = read(private->fd, buf, sizeof(buf))) > 0) {
    120     for (i = 0; i < n; i++) {
    121       unsigned char c = buf[i] & 0x7f;
    122       if (c == 224) // special key prefix -- what should we do with it?
    123 	continue;
    124       posted += SDL_PrivateKeyboard((buf[i] & 0x80) ? SDL_RELEASED : SDL_PRESSED,
    125 				    TranslateKey(c, &keysym));
    126     }
    127   }
    128 }
    129 
    130 void WSCONS_PumpEvents(_THIS)
    131 {
    132   do {
    133     posted = 0;
    134     updateMouse();
    135     updateKeyboard(this);
    136   } while (posted);
    137 }
    138 
    139 void WSCONS_InitOSKeymap(_THIS)
    140 {
    141   int i;
    142 
    143   /* Make sure unknown keys are mapped correctly */
    144   for (i=0; i < SDL_arraysize(keymap); i++) {
    145     keymap[i] = SDLK_UNKNOWN;
    146   }
    147 
    148   switch (private->kbdType) {
    149 #ifdef WSKBD_TYPE_ZAURUS
    150   case WSKBD_TYPE_ZAURUS:
    151     /* top row */
    152     keymap[2] = SDLK_1;
    153     keymap[3] = SDLK_2;
    154     keymap[4] = SDLK_3;
    155     keymap[5] = SDLK_4;
    156     keymap[6] = SDLK_5;
    157     keymap[7] = SDLK_6;
    158     keymap[8] = SDLK_7;
    159     keymap[9] = SDLK_8;
    160     keymap[10] = SDLK_9;
    161     keymap[11] = SDLK_0;
    162     keymap[14] = SDLK_BACKSPACE;
    163 
    164     /* second row */
    165     keymap[16] = SDLK_q;
    166     keymap[17] = SDLK_w;
    167     keymap[18] = SDLK_e;
    168     keymap[19] = SDLK_r;
    169     keymap[20] = SDLK_t;
    170     keymap[21] = SDLK_y;
    171     keymap[22] = SDLK_u;
    172     keymap[23] = SDLK_i;
    173     keymap[24] = SDLK_o;
    174     keymap[25] = SDLK_p;
    175 
    176     /* third row */
    177     keymap[15] = SDLK_TAB;
    178     keymap[30] = SDLK_a;
    179     keymap[31] = SDLK_s;
    180     keymap[32] = SDLK_d;
    181     keymap[33] = SDLK_f;
    182     keymap[34] = SDLK_g;
    183     keymap[35] = SDLK_h;
    184     keymap[36] = SDLK_j;
    185     keymap[37] = SDLK_k;
    186     keymap[38] = SDLK_l;
    187 
    188     /* fourth row */
    189     keymap[42] = SDLK_LSHIFT;
    190     keymap[44] = SDLK_z;
    191     keymap[45] = SDLK_x;
    192     keymap[46] = SDLK_c;
    193     keymap[47] = SDLK_v;
    194     keymap[48] = SDLK_b;
    195     keymap[49] = SDLK_n;
    196     keymap[50] = SDLK_m;
    197     keymap[54] = SDLK_RSHIFT;
    198     keymap[28] = SDLK_RETURN;
    199 
    200     /* fifth row */
    201     keymap[56] = SDLK_LALT;
    202     keymap[29] = SDLK_LCTRL;
    203     /* keymap[56] = ; */
    204     keymap[0] = SDLK_LSUPER;
    205     keymap[12] = SDLK_MINUS;
    206     keymap[57] = SDLK_SPACE;
    207     keymap[51] = SDLK_COMMA;
    208     keymap[52] = SDLK_PERIOD;
    209 
    210     /* misc */
    211     keymap[59] = SDLK_F1;
    212     keymap[60] = SDLK_F2;
    213     keymap[61] = SDLK_F3;
    214     keymap[62] = SDLK_F4;
    215     keymap[63] = SDLK_F5;
    216     keymap[1] = SDLK_ESCAPE;
    217     /* keymap[28] = SDLK_KP_ENTER; */
    218     keymap[72] = SDLK_UP;
    219     keymap[75] = SDLK_LEFT;
    220     keymap[77] = SDLK_RIGHT;
    221     keymap[80] = SDLK_DOWN;
    222     break;
    223 #endif /* WSKBD_TYPE_ZAURUS */
    224 
    225   default:
    226     WSCONS_ReportError("Unable to map keys for keyboard type %u",
    227 		       private->kbdType);
    228     break;
    229   }
    230 }
    231 
    232 /* end of SDL_wsconsevents.c ... */
    233 
    234