symbian-qemu-0.9.1-12/libsdl-trunk/src/video/wscons/SDL_wsconsevents.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2     SDL - Simple DirectMedia Layer
       
     3     Copyright (C) 1997-2006 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@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