diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2017-05-26 21:51:04 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2017-05-26 22:48:09 -0700 |
commit | 78f8fce7f286fd0c71774e2567404ed51f24fef3 (patch) | |
tree | f3de4987f7a9fc1bc03331e97b65a851b041051a /src/sys/win32/osdefs.c |
*: initial commit of stripped schism stuff
Forking schism tracker's IT playback stuff into a little playback
library for embedding in demos.
Diffstat (limited to 'src/sys/win32/osdefs.c')
-rw-r--r-- | src/sys/win32/osdefs.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/sys/win32/osdefs.c b/src/sys/win32/osdefs.c new file mode 100644 index 0000000..0beccbf --- /dev/null +++ b/src/sys/win32/osdefs.c @@ -0,0 +1,198 @@ +/* + * Schism Tracker - a cross-platform Impulse Tracker clone + * copyright (c) 2003-2005 Storlek <storlek@rigelseven.com> + * copyright (c) 2005-2008 Mrs. Brisby <mrs.brisby@nimh.org> + * copyright (c) 2009 Storlek & Mrs. Brisby + * copyright (c) 2010-2012 Storlek + * URL: http://schismtracker.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Predominantly this file is keyboard crap, but we also get the network configured here */ + +#include "headers.h" +#include "sdlmain.h" +#include "it.h" +#include "osdefs.h" + +#include <windows.h> +#include <ws2tcpip.h> + +/* eek... */ +void win32_get_modkey(int *mk) +{ + BYTE ks[256]; + if (GetKeyboardState(ks) == 0) return; + + if (ks[VK_CAPITAL] & 128) { + status.flags |= CAPS_PRESSED; + } else { + status.flags &= ~CAPS_PRESSED; + } + + (*mk) = ((*mk) & ~(KMOD_NUM|KMOD_CAPS)) + | ((ks[VK_NUMLOCK]&1) ? KMOD_NUM : 0) + | ((ks[VK_CAPITAL]&1) ? KMOD_CAPS : 0); +} + +/* more windows key stuff... */ +unsigned int key_repeat_rate(void) +{ + DWORD spd; + if (!SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &spd, 0)) return 0; + if (!spd) return 1; + return spd; +} +unsigned int key_repeat_delay(void) +{ + int delay; + + if (!SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &delay, 0)) return 0; + switch (delay) { + case 0: return 250; + case 1: return 500; + case 2: return 750; + }; + return 1000; +} + +static HKL default_keymap; +static HKL us_keymap; + +static void win32_setup_keymap(void) +{ + default_keymap = GetKeyboardLayout(0); + us_keymap = LoadKeyboardLayout("00000409", KLF_ACTIVATE|KLF_REPLACELANG|KLF_NOTELLSHELL); + ActivateKeyboardLayout(default_keymap,0); +} + +int key_scancode_lookup(int k, int def) +{ +#ifndef VK_0 +#define VK_0 '0' +#define VK_1 '1' +#define VK_2 '2' +#define VK_3 '3' +#define VK_4 '4' +#define VK_5 '5' +#define VK_6 '6' +#define VK_7 '7' +#define VK_8 '8' +#define VK_9 '9' +#define VK_A 'A' +#define VK_B 'B' +#define VK_C 'C' +#define VK_D 'D' +#define VK_E 'E' +#define VK_F 'F' +#define VK_G 'G' +#define VK_H 'H' +#define VK_I 'I' +#define VK_J 'J' +#define VK_K 'K' +#define VK_L 'L' +#define VK_M 'M' +#define VK_N 'N' +#define VK_O 'O' +#define VK_P 'P' +#define VK_Q 'Q' +#define VK_R 'R' +#define VK_S 'S' +#define VK_T 'T' +#define VK_U 'U' +#define VK_V 'V' +#define VK_W 'W' +#define VK_X 'X' +#define VK_Y 'Y' +#define VK_Z 'Z' +#endif /* VK_0 */ + +/* These keys haven't been defined, but were experimentally determined */ +#define VK_SEMICOLON 0xBA +#define VK_EQUALS 0xBB +#define VK_COMMA 0xBC +#define VK_MINUS 0xBD +#define VK_PERIOD 0xBE +#define VK_SLASH 0xBF +#define VK_GRAVE 0xC0 +#define VK_LBRACKET 0xDB +#define VK_BACKSLASH 0xDC +#define VK_RBRACKET 0xDD +#define VK_APOSTROPHE 0xDE +#define VK_BACKTICK 0xDF +#define VK_OEM_102 0xE2 + switch (MapVirtualKeyEx(k, 1 /* MAPVK_VSC_TO_VK */, us_keymap)) { + case VK_0: return SDLK_0; + case VK_1: return SDLK_1; + case VK_2: return SDLK_2; + case VK_3: return SDLK_3; + case VK_4: return SDLK_4; + case VK_5: return SDLK_5; + case VK_6: return SDLK_6; + case VK_7: return SDLK_7; + case VK_8: return SDLK_8; + case VK_9: return SDLK_9; + case VK_A: return SDLK_a; + case VK_B: return SDLK_b; + case VK_C: return SDLK_c; + case VK_D: return SDLK_d; + case VK_E: return SDLK_e; + case VK_F: return SDLK_f; + case VK_G: return SDLK_g; + case VK_H: return SDLK_h; + case VK_I: return SDLK_i; + case VK_J: return SDLK_j; + case VK_K: return SDLK_k; + case VK_L: return SDLK_l; + case VK_M: return SDLK_m; + case VK_N: return SDLK_n; + case VK_O: return SDLK_o; + case VK_P: return SDLK_p; + case VK_Q: return SDLK_q; + case VK_R: return SDLK_r; + case VK_S: return SDLK_s; + case VK_T: return SDLK_t; + case VK_U: return SDLK_u; + case VK_V: return SDLK_v; + case VK_W: return SDLK_w; + case VK_X: return SDLK_x; + case VK_Y: return SDLK_y; + case VK_Z: return SDLK_z; + case VK_SEMICOLON: return SDLK_SEMICOLON; + case VK_GRAVE: return SDLK_BACKQUOTE; + case VK_APOSTROPHE: return SDLK_QUOTE; + case VK_BACKTICK: return SDLK_BACKQUOTE; + case VK_BACKSLASH: return SDLK_BACKSLASH; + case VK_LBRACKET: return SDLK_LEFTBRACKET; + case VK_RBRACKET: return SDLK_RIGHTBRACKET; + }; + return def; +} + + +void win32_sysinit(UNUSED int *pargc, UNUSED char ***pargv) +{ + static WSADATA ignored; + + win32_setup_keymap(); + + memset(&ignored, 0, sizeof(ignored)); + if (WSAStartup(0x202, &ignored) == SOCKET_ERROR) { + WSACleanup(); /* ? */ + status.flags |= NO_NETWORK; + } +} + |