Mercurial > sdl-ios-xcode
diff src/video/wscons/SDL_wsconsevents.c @ 1187:19d8949b4584
To: sdl@libsdl.org
From: Staffan Ulfberg <staffan@ulfberg.se>
Date: 19 Nov 2005 01:00:48 +0100
Subject: [SDL] New driver for OpenBSD/wscons
Hello,
I've written an SDL driver for OpenBSD/wscons (console mode, somewhat
resembling the functionality of the svga driver for Linux). I use it
for playing MAME on my Sharp Zaurus. The alternative is to play under
X, which is slower.
I asked how to submit the driver a few days ago, and posted a link to
the patch in a follow-up, so maybe it was missed?
Anyway, the patch is on the web at:
http://multivac.fatburen.org/SDL-wscons.patch
Comments?
Staffan
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Tue, 22 Nov 2005 15:19:50 +0000 |
parents | |
children | c9b51268668f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/video/wscons/SDL_wsconsevents.c Tue Nov 22 15:19:50 2005 +0000 @@ -0,0 +1,236 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2004 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id$"; +#endif + +#include <sys/types.h> +#include <dev/wscons/wsdisplay_usl_io.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <unistd.h> +#include <termios.h> +#include <errno.h> +#include <string.h> + +#include "SDL.h" +#include "SDL_sysevents.h" +#include "SDL_events_c.h" +#include "SDL_wsconsvideo.h" +#include "SDL_wsconsevents_c.h" + +static int posted = 0; + +int WSCONS_InitKeyboard(_THIS) +{ + struct termios tty; + + if (ioctl(private->fd, WSKBDIO_GTYPE, &private->kbdType) == -1) { + WSCONS_ReportError("cannot get keyboard type: %s", strerror(errno)); + return -1; + } + + if (tcgetattr(private->fd, &private->saved_tty) == -1) { + WSCONS_ReportError("cannot get terminal attributes: %s", strerror(errno)); + return -1; + } + private->did_save_tty = 1; + tty = private->saved_tty; + tty.c_iflag = IGNPAR | IGNBRK; + tty.c_oflag = 0; + tty.c_cflag = CREAD | CS8; + tty.c_lflag = 0; + tty.c_cc[VTIME] = 0; + tty.c_cc[VMIN] = 1; + cfsetispeed(&tty, 9600); + cfsetospeed(&tty, 9600); + if (tcsetattr(private->fd, TCSANOW, &tty) < 0) { + 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; + } + + return 0; +} + +void WSCONS_ReleaseKeyboard(_THIS) +{ + if (private->fd != -1) { + if (ioctl(private->fd, KDSKBMODE, K_XLATE) == -1) { + WSCONS_ReportError("cannot restore keyboard to translated mode: %s", + strerror(errno)); + } + if (private->did_save_tty) { + if (tcsetattr(private->fd, TCSANOW, &private->saved_tty) < 0) { + WSCONS_ReportError("cannot restore keynoard attributes: %s", + strerror(errno)); + } + } + } +} + +static void updateMouse() +{ +} + +static SDLKey keymap[128]; + +static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) +{ + keysym->scancode = scancode; + keysym->sym = SDLK_UNKNOWN; + keysym->mod = KMOD_NONE; + + if (scancode < SDL_TABLESIZE(keymap)) + keysym->sym = keymap[scancode]; + + if (keysym->sym == SDLK_UNKNOWN) + printf("Unknown mapping for scancode %d\n", scancode); + + return keysym; +} + +static void updateKeyboard(_THIS) +{ + unsigned char buf[100]; + SDL_keysym keysym; + int n, i; + + if ((n = read(private->fd, buf, sizeof(buf))) > 0) { + for (i = 0; i < n; i++) { + char c = buf[i] & 0x7f; + if (c == 224) // special key prefix -- what should we do with it? + continue; + int release = (buf[i] & 0x80) != 0; + posted += SDL_PrivateKeyboard(release ? SDL_RELEASED : SDL_PRESSED, + TranslateKey(c, &keysym)); + } + } +} + +void WSCONS_PumpEvents(_THIS) +{ + do { + posted = 0; + updateMouse(); + updateKeyboard(this); + } while (posted); +} + +void WSCONS_InitOSKeymap(_THIS) +{ + int i; + + /* Make sure unknown keys are mapped correctly */ + for (i=0; i < SDL_TABLESIZE(keymap); i++) { + keymap[i] = SDLK_UNKNOWN; + } + + switch (private->kbdType) { + case WSKBD_TYPE_ZAURUS: + /* top row */ + keymap[2] = SDLK_1; + keymap[3] = SDLK_2; + keymap[4] = SDLK_3; + keymap[5] = SDLK_4; + keymap[6] = SDLK_5; + keymap[7] = SDLK_6; + keymap[8] = SDLK_7; + keymap[9] = SDLK_8; + keymap[10] = SDLK_9; + keymap[11] = SDLK_0; + keymap[14] = SDLK_BACKSPACE; + + /* second row */ + keymap[16] = SDLK_q; + keymap[17] = SDLK_w; + keymap[18] = SDLK_e; + keymap[19] = SDLK_r; + keymap[20] = SDLK_t; + keymap[21] = SDLK_y; + keymap[22] = SDLK_u; + keymap[23] = SDLK_i; + keymap[24] = SDLK_o; + keymap[25] = SDLK_p; + + /* third row */ + keymap[15] = SDLK_TAB; + keymap[30] = SDLK_a; + keymap[31] = SDLK_s; + keymap[32] = SDLK_d; + keymap[33] = SDLK_f; + keymap[34] = SDLK_g; + keymap[35] = SDLK_h; + keymap[36] = SDLK_j; + keymap[37] = SDLK_k; + keymap[38] = SDLK_l; + + /* fourth row */ + keymap[42] = SDLK_LSHIFT; + keymap[44] = SDLK_z; + keymap[45] = SDLK_x; + keymap[46] = SDLK_c; + keymap[47] = SDLK_v; + keymap[48] = SDLK_b; + keymap[49] = SDLK_n; + keymap[50] = SDLK_m; + keymap[54] = SDLK_RSHIFT; + keymap[28] = SDLK_RETURN; + + /* fifth row */ + keymap[56] = SDLK_LALT; + keymap[29] = SDLK_LCTRL; + /* keymap[56] = ; */ + keymap[0] = SDLK_LSUPER; + keymap[12] = SDLK_MINUS; + keymap[57] = SDLK_SPACE; + keymap[51] = SDLK_COMMA; + keymap[52] = SDLK_PERIOD; + + /* misc */ + keymap[59] = SDLK_F1; + keymap[60] = SDLK_F2; + keymap[61] = SDLK_F3; + keymap[62] = SDLK_F4; + keymap[63] = SDLK_F5; + keymap[1] = SDLK_ESCAPE; + /* keymap[28] = SDLK_KP_ENTER; */ + keymap[72] = SDLK_UP; + keymap[75] = SDLK_LEFT; + keymap[77] = SDLK_RIGHT; + keymap[80] = SDLK_DOWN; + break; + + default: + WSCONS_ReportError("Unable to map keys for keyboard type %u", + private->kbdType); + break; + } +} + +/* end of SDL_wsconsevents.c ... */ +