mirror of
https://github.com/zserge/fenster.git
synced 2025-04-20 00:18:57 +03:00
342 lines
7.8 KiB
C
342 lines
7.8 KiB
C
//
|
|
// Copyright(C) 1993-1996 Id Software, Inc.
|
|
// Copyright(C) 2005-2014 Simon Howard
|
|
//
|
|
// 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.
|
|
//
|
|
|
|
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
|
|
#include "config.h"
|
|
#include "deh_str.h"
|
|
#include "doomtype.h"
|
|
#include "doomkeys.h"
|
|
#include "i_joystick.h"
|
|
#include "i_system.h"
|
|
#include "i_swap.h"
|
|
#include "i_timer.h"
|
|
#include "i_video.h"
|
|
#include "i_scale.h"
|
|
#include "m_argv.h"
|
|
#include "m_config.h"
|
|
#include "m_misc.h"
|
|
#include "tables.h"
|
|
#include "v_video.h"
|
|
#include "w_wad.h"
|
|
#include "z_zone.h"
|
|
|
|
#include "doomgeneric.h"
|
|
|
|
int vanilla_keyboard_mapping = 1;
|
|
|
|
// Is the shift key currently down?
|
|
|
|
static int shiftdown = 0;
|
|
|
|
// Lookup table for mapping AT keycodes to their doom keycode
|
|
static const char at_to_doom[] =
|
|
{
|
|
/* 0x00 */ 0x00,
|
|
/* 0x01 */ KEY_ESCAPE,
|
|
/* 0x02 */ '1',
|
|
/* 0x03 */ '2',
|
|
/* 0x04 */ '3',
|
|
/* 0x05 */ '4',
|
|
/* 0x06 */ '5',
|
|
/* 0x07 */ '6',
|
|
/* 0x08 */ '7',
|
|
/* 0x09 */ '8',
|
|
/* 0x0a */ '9',
|
|
/* 0x0b */ '0',
|
|
/* 0x0c */ '-',
|
|
/* 0x0d */ '=',
|
|
/* 0x0e */ KEY_BACKSPACE,
|
|
/* 0x0f */ KEY_TAB,
|
|
/* 0x10 */ 'q',
|
|
/* 0x11 */ 'w',
|
|
/* 0x12 */ 'e',
|
|
/* 0x13 */ 'r',
|
|
/* 0x14 */ 't',
|
|
/* 0x15 */ 'y',
|
|
/* 0x16 */ 'u',
|
|
/* 0x17 */ 'i',
|
|
/* 0x18 */ 'o',
|
|
/* 0x19 */ 'p',
|
|
/* 0x1a */ '[',
|
|
/* 0x1b */ ']',
|
|
/* 0x1c */ KEY_ENTER,
|
|
/* 0x1d */ KEY_FIRE, /* KEY_RCTRL, */
|
|
/* 0x1e */ 'a',
|
|
/* 0x1f */ 's',
|
|
/* 0x20 */ 'd',
|
|
/* 0x21 */ 'f',
|
|
/* 0x22 */ 'g',
|
|
/* 0x23 */ 'h',
|
|
/* 0x24 */ 'j',
|
|
/* 0x25 */ 'k',
|
|
/* 0x26 */ 'l',
|
|
/* 0x27 */ ';',
|
|
/* 0x28 */ '\'',
|
|
/* 0x29 */ '`',
|
|
/* 0x2a */ KEY_RSHIFT,
|
|
/* 0x2b */ '\\',
|
|
/* 0x2c */ 'z',
|
|
/* 0x2d */ 'x',
|
|
/* 0x2e */ 'c',
|
|
/* 0x2f */ 'v',
|
|
/* 0x30 */ 'b',
|
|
/* 0x31 */ 'n',
|
|
/* 0x32 */ 'm',
|
|
/* 0x33 */ ',',
|
|
/* 0x34 */ '.',
|
|
/* 0x35 */ '/',
|
|
/* 0x36 */ KEY_RSHIFT,
|
|
/* 0x37 */ KEYP_MULTIPLY,
|
|
/* 0x38 */ KEY_LALT,
|
|
/* 0x39 */ KEY_USE,
|
|
/* 0x3a */ KEY_CAPSLOCK,
|
|
/* 0x3b */ KEY_F1,
|
|
/* 0x3c */ KEY_F2,
|
|
/* 0x3d */ KEY_F3,
|
|
/* 0x3e */ KEY_F4,
|
|
/* 0x3f */ KEY_F5,
|
|
/* 0x40 */ KEY_F6,
|
|
/* 0x41 */ KEY_F7,
|
|
/* 0x42 */ KEY_F8,
|
|
/* 0x43 */ KEY_F9,
|
|
/* 0x44 */ KEY_F10,
|
|
/* 0x45 */ KEY_NUMLOCK,
|
|
/* 0x46 */ 0x0,
|
|
/* 0x47 */ 0x0, /* 47 (Keypad-7/Home) */
|
|
/* 0x48 */ 0x0, /* 48 (Keypad-8/Up) */
|
|
/* 0x49 */ 0x0, /* 49 (Keypad-9/PgUp) */
|
|
/* 0x4a */ 0x0, /* 4a (Keypad--) */
|
|
/* 0x4b */ 0x0, /* 4b (Keypad-4/Left) */
|
|
/* 0x4c */ 0x0, /* 4c (Keypad-5) */
|
|
/* 0x4d */ 0x0, /* 4d (Keypad-6/Right) */
|
|
/* 0x4e */ 0x0, /* 4e (Keypad-+) */
|
|
/* 0x4f */ 0x0, /* 4f (Keypad-1/End) */
|
|
/* 0x50 */ 0x0, /* 50 (Keypad-2/Down) */
|
|
/* 0x51 */ 0x0, /* 51 (Keypad-3/PgDn) */
|
|
/* 0x52 */ 0x0, /* 52 (Keypad-0/Ins) */
|
|
/* 0x53 */ 0x0, /* 53 (Keypad-./Del) */
|
|
/* 0x54 */ 0x0, /* 54 (Alt-SysRq) on a 84+ key keyboard */
|
|
/* 0x55 */ 0x0,
|
|
/* 0x56 */ 0x0,
|
|
/* 0x57 */ 0x0,
|
|
/* 0x58 */ 0x0,
|
|
/* 0x59 */ 0x0,
|
|
/* 0x5a */ 0x0,
|
|
/* 0x5b */ 0x0,
|
|
/* 0x5c */ 0x0,
|
|
/* 0x5d */ 0x0,
|
|
/* 0x5e */ 0x0,
|
|
/* 0x5f */ 0x0,
|
|
/* 0x60 */ 0x0,
|
|
/* 0x61 */ 0x0,
|
|
/* 0x62 */ 0x0,
|
|
/* 0x63 */ 0x0,
|
|
/* 0x64 */ 0x0,
|
|
/* 0x65 */ 0x0,
|
|
/* 0x66 */ 0x0,
|
|
/* 0x67 */ KEY_UPARROW,
|
|
/* 0x68 */ 0x0,
|
|
/* 0x69 */ KEY_LEFTARROW,
|
|
/* 0x6a */ KEY_RIGHTARROW,
|
|
/* 0x6b */ 0x0,
|
|
/* 0x6c */ KEY_DOWNARROW,
|
|
/* 0x6d */ 0x0,
|
|
/* 0x6e */ 0x0,
|
|
/* 0x6f */ 0x0,
|
|
/* 0x70 */ 0x0,
|
|
/* 0x71 */ 0x0,
|
|
/* 0x72 */ 0x0,
|
|
/* 0x73 */ 0x0,
|
|
/* 0x74 */ 0x0,
|
|
/* 0x75 */ 0x0,
|
|
/* 0x76 */ 0x0,
|
|
/* 0x77 */ 0x0,
|
|
/* 0x78 */ 0x0,
|
|
/* 0x79 */ 0x0,
|
|
/* 0x7a */ 0x0,
|
|
/* 0x7b */ 0x0,
|
|
/* 0x7c */ 0x0,
|
|
/* 0x7d */ 0x0,
|
|
/* 0x7e */ 0x0,
|
|
/* 0x7f */ KEY_FIRE, //KEY_RCTRL,
|
|
};
|
|
|
|
// Lookup table for mapping ASCII characters to their equivalent when
|
|
// shift is pressed on an American layout keyboard:
|
|
static const char shiftxform[] =
|
|
{
|
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
|
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
|
31, ' ', '!', '"', '#', '$', '%', '&',
|
|
'"', // shift-'
|
|
'(', ')', '*', '+',
|
|
'<', // shift-,
|
|
'_', // shift--
|
|
'>', // shift-.
|
|
'?', // shift-/
|
|
')', // shift-0
|
|
'!', // shift-1
|
|
'@', // shift-2
|
|
'#', // shift-3
|
|
'$', // shift-4
|
|
'%', // shift-5
|
|
'^', // shift-6
|
|
'&', // shift-7
|
|
'*', // shift-8
|
|
'(', // shift-9
|
|
':',
|
|
':', // shift-;
|
|
'<',
|
|
'+', // shift-=
|
|
'>', '?', '@',
|
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
'[', // shift-[
|
|
'!', // shift-backslash - OH MY GOD DOES WATCOM SUCK
|
|
']', // shift-]
|
|
'"', '_',
|
|
'\'', // shift-`
|
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
'{', '|', '}', '~', 127
|
|
};
|
|
|
|
|
|
static unsigned char TranslateKey(unsigned char key)
|
|
{
|
|
return key;
|
|
|
|
/*
|
|
if (key < sizeof(at_to_doom))
|
|
return at_to_doom[key];
|
|
else
|
|
return 0x0;
|
|
*/
|
|
|
|
//default:
|
|
// return tolower(key);
|
|
}
|
|
|
|
// Get the equivalent ASCII (Unicode?) character for a keypress.
|
|
|
|
static unsigned char GetTypedChar(unsigned char key)
|
|
{
|
|
key = TranslateKey(key);
|
|
|
|
// Is shift held down? If so, perform a translation.
|
|
|
|
if (shiftdown > 0)
|
|
{
|
|
if (key >= 0 && key < arrlen(shiftxform))
|
|
{
|
|
key = shiftxform[key];
|
|
}
|
|
else
|
|
{
|
|
key = 0;
|
|
}
|
|
}
|
|
|
|
return key;
|
|
}
|
|
|
|
static void UpdateShiftStatus(int pressed, unsigned char key)
|
|
{
|
|
int change;
|
|
|
|
if (pressed) {
|
|
change = 1;
|
|
} else {
|
|
change = -1;
|
|
}
|
|
|
|
if (key == KEY_RSHIFT) {
|
|
shiftdown += change;
|
|
}
|
|
}
|
|
|
|
|
|
void I_GetEvent(void)
|
|
{
|
|
event_t event;
|
|
int pressed;
|
|
unsigned char key;
|
|
|
|
|
|
while (DG_GetKey(&pressed, &key))
|
|
{
|
|
UpdateShiftStatus(pressed, key);
|
|
|
|
// process event
|
|
|
|
if (pressed)
|
|
{
|
|
// data1 has the key pressed, data2 has the character
|
|
// (shift-translated, etc)
|
|
event.type = ev_keydown;
|
|
event.data1 = TranslateKey(key);
|
|
event.data2 = GetTypedChar(key);
|
|
|
|
if (event.data1 != 0)
|
|
{
|
|
D_PostEvent(&event);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
event.type = ev_keyup;
|
|
event.data1 = TranslateKey(key);
|
|
|
|
// data2 is just initialized to zero for ev_keyup.
|
|
// For ev_keydown it's the shifted Unicode character
|
|
// that was typed, but if something wants to detect
|
|
// key releases it should do so based on data1
|
|
// (key ID), not the printable char.
|
|
|
|
event.data2 = 0;
|
|
|
|
if (event.data1 != 0)
|
|
{
|
|
D_PostEvent(&event);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
case SDL_MOUSEMOTION:
|
|
event.type = ev_mouse;
|
|
event.data1 = mouse_button_state;
|
|
event.data2 = AccelerateMouse(sdlevent.motion.xrel);
|
|
event.data3 = -AccelerateMouse(sdlevent.motion.yrel);
|
|
D_PostEvent(&event);
|
|
break;
|
|
*/
|
|
}
|
|
|
|
void I_InitInput(void)
|
|
{
|
|
}
|
|
|