Mercurial > sdl-ios-xcode
view 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 source
/* 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 ... */