📄 keys.pas
字号:
unit keys;
{----------------------------------------------------------------------------}
{ }
{ File(s): keys.h,Keys.c - Input handling }
{ }
{ }
{ Initial conversion by : ggs (tazipper@lyocs.com) }
{ Initial conversion on : -Jan-2002 }
{ }
{ This File contains part of convertion of Quake2 source to ObjectPascal. }
{ More information about this project can be found at: }
{ http://www.sulaco.co.za/quake2/ }
{ }
{ Copyright (C) 1997-2001 Id Software, Inc. }
{ }
{ 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. }
{ }
{----------------------------------------------------------------------------}
{ Updated on : 03-jun-2002 }
{ Updated by : Juha Hartikainen (juha@linearteam.org) }
{ - added needed units to uses clause }
{ - removed NODEPEND hack }
{}
{ Updated on : 04-jun-2002 }
{ Updated by : Juha Hartikainen (juha@linearteam.org) }
{ - Moved keydown variable to globalscopy as qmenu.pas needs it}
{}
{ Updated on : 05-jun-2002 }
{ Updated by : Juha Hartikainen (juha@linearteam.org) }
{ - conversion fixes}
{}
{ Updated on : 25-jul-2002 }
{ Updated by : burnin (leonel@linuxbr.com.br) }
{ - Uncommented menu calls }
{----------------------------------------------------------------------------}
{ Key.h is used by Clients.h }
{ Key.h is used by Clients.h }
{ * Still dependent (to compile correctly) on: }
{----------------------------------------------------------------------------}
{ * TODO: }
{----------------------------------------------------------------------------}
interface
uses
{$IFDEF WIN32}
Windows,
{$ENDIF}
Client,
q_shared;
const
//
// these are the key numbers that should be passed to Key_Event
//
K_TAB = 9;
K_ENTER = 13;
K_ESCAPE = 27;
K_SPACE = 32;
// normal keys should be passed as lowercased ascii
K_BACKSPACE = 127;
K_UPARROW = 128;
K_DOWNARROW = 129;
K_LEFTARROW = 130;
K_RIGHTARROW = 131;
K_ALT = 132;
K_CTRL = 133;
K_SHIFT = 134;
K_F1 = 135;
K_F2 = 136;
K_F3 = 137;
K_F4 = 138;
K_F5 = 139;
K_F6 = 140;
K_F7 = 141;
K_F8 = 142;
K_F9 = 143;
K_F10 = 144;
K_F11 = 145;
K_F12 = 146;
K_INS = 147;
K_DEL = 148;
K_PGDN = 149;
K_PGUP = 150;
K_HOME = 151;
K_END = 152;
K_KP_HOME = 160;
K_KP_UPARROW = 161;
K_KP_PGUP = 162;
K_KP_LEFTARROW = 163;
K_KP_5 = 164;
K_KP_RIGHTARROW = 165;
K_KP_END = 166;
K_KP_DOWNARROW = 167;
K_KP_PGDN = 168;
K_KP_ENTER = 169;
K_KP_INS = 170;
K_KP_DEL = 171;
K_KP_SLASH = 172;
K_KP_MINUS = 173;
K_KP_PLUS = 174;
K_PAUSE = 255;
//
// mouse buttons generate virtual keys
//
K_MOUSE1 = 200;
K_MOUSE2 = 201;
K_MOUSE3 = 202;
//
// joystick buttons
//
K_JOY1 = 203;
K_JOY2 = 204;
K_JOY3 = 205;
K_JOY4 = 206;
//
// aux keys are for multi-buttoned joysticks to generate so they can use
// the normal binding process
//
K_AUX1 = 207;
K_AUX2 = 208;
K_AUX3 = 209;
K_AUX4 = 210;
K_AUX5 = 211;
K_AUX6 = 212;
K_AUX7 = 213;
K_AUX8 = 214;
K_AUX9 = 215;
K_AUX10 = 216;
K_AUX11 = 217;
K_AUX12 = 218;
K_AUX13 = 219;
K_AUX14 = 220;
K_AUX15 = 221;
K_AUX16 = 222;
K_AUX17 = 223;
K_AUX18 = 224;
K_AUX19 = 225;
K_AUX20 = 226;
K_AUX21 = 227;
K_AUX22 = 228;
K_AUX23 = 229;
K_AUX24 = 230;
K_AUX25 = 231;
K_AUX26 = 232;
K_AUX27 = 233;
K_AUX28 = 234;
K_AUX29 = 235;
K_AUX30 = 236;
K_AUX31 = 237;
K_AUX32 = 238;
K_MWHEELDOWN = 239;
K_MWHEELUP = 240;
procedure Key_Event(key: integer; Down: qboolean; time: Longword);
procedure Key_Init;
procedure Key_WriteBindings(var f: integer);
procedure Key_SetBinding(keynum: integer; binding: Pchar);
procedure Key_ClearStates;
function Key_GetKey: integer;
function Key_KeynumToString(keynum: Integer): Pchar;
// variable that need to be put in the Interface section
var
chat_team: qboolean;
chat_buffer: array[0..255] of char;
chat_bufferlen: integer;
anykeydown: integer;
key_repeats: array[0..255] of Integer; // if > 1, it is autorepeating
keybindings: array[0..255] of Pchar; //char *keybindings[256];
keydown: array[0..255] of qboolean;
const
MaxCmdLine = 256;
var
key_lines: array[0..32 - 1, 0..MAXCMDLINE - 1] of char;
key_linepos: integer;
edit_line: integer = 0;
implementation
uses
Sysutils,
Cmd,
Common,
CVar,
Console,
{$IFDEF WIN32}
sys_win,
{$ELSE}
sys_linux,
vid_so, //Sys_GetClipboardData
{$ENDIF}
cl_main,
menu,
cl_scrn;
// key up events are sent even if in console mode
var
shift_down: qBoolean = false; // int shift_down=false;
history_line: integer = 0;
key_waiting: integer;
consolekeys: array[0..255] of qboolean; // if true, can't be rebound while in console
menubound: array[0..255] of qboolean; // if true, can't be rebound while in menu
keyshift: array[0..255] of Integer; // key to map to if shift held down in console
type
keyname_p = ^keyname_t;
keyname_t = record
name: pchar;
keynum: integer;
end;
const
keynames: array[0..88] of keyname_t =
(
(name: 'TAB'; keynum: K_TAB),
(name: 'ENTER'; keynum: K_ENTER),
(name: 'ESCAPE'; keynum: K_ESCAPE),
(name: 'SPACE'; keynum: K_SPACE),
(name: 'BACKSPACE'; keynum: K_BACKSPACE),
(name: 'UPARROW'; keynum: K_UPARROW),
(name: 'DOWNARROW'; keynum: K_DOWNARROW),
(name: 'LEFTARROW'; keynum: K_LEFTARROW),
(name: 'RIGHTARROW'; keynum: K_RIGHTARROW),
(name: 'ALT'; keynum: K_ALT),
(name: 'CTRL'; keynum: K_CTRL),
(name: 'SHIFT'; keynum: K_SHIFT),
(name: 'F1'; keynum: K_F1),
(name: 'F2'; keynum: K_F2),
(name: 'F3'; keynum: K_F3),
(name: 'F4'; keynum: K_F4),
(name: 'F5'; keynum: K_F5),
(name: 'F6'; keynum: K_F6),
(name: 'F7'; keynum: K_F7),
(name: 'F8'; keynum: K_F8),
(name: 'F9'; keynum: K_F9),
(name: 'F10'; keynum: K_F10),
(name: 'F11'; keynum: K_F11),
(name: 'F12'; keynum: K_F12),
(name: 'INS'; keynum: K_INS),
(name: 'DEL'; keynum: K_DEL),
(name: 'PGDN'; keynum: K_PGDN),
(name: 'PGUP'; keynum: K_PGUP),
(name: 'HOME'; keynum: K_HOME),
(name: 'END'; keynum: K_END),
(name: 'MOUSE1'; keynum: K_MOUSE1),
(name: 'MOUSE2'; keynum: K_MOUSE2),
(name: 'MOUSE3'; keynum: K_MOUSE3),
(name: 'JOY1'; keynum: K_JOY1),
(name: 'JOY2'; keynum: K_JOY2),
(name: 'JOY3'; keynum: K_JOY3),
(name: 'JOY4'; keynum: K_JOY4),
(name: 'AUX1'; keynum: K_AUX1),
(name: 'AUX2'; keynum: K_AUX2),
(name: 'AUX3'; keynum: K_AUX3),
(name: 'AUX4'; keynum: K_AUX4),
(name: 'AUX5'; keynum: K_AUX5),
(name: 'AUX6'; keynum: K_AUX6),
(name: 'AUX7'; keynum: K_AUX7),
(name: 'AUX8'; keynum: K_AUX8),
(name: 'AUX9'; keynum: K_AUX9),
(name: 'AUX10'; keynum: K_AUX10),
(name: 'AUX11'; keynum: K_AUX11),
(name: 'AUX12'; keynum: K_AUX12),
(name: 'AUX13'; keynum: K_AUX13),
(name: 'AUX14'; keynum: K_AUX14),
(name: 'AUX15'; keynum: K_AUX15),
(name: 'AUX16'; keynum: K_AUX16),
(name: 'AUX17'; keynum: K_AUX17),
(name: 'AUX18'; keynum: K_AUX18),
(name: 'AUX19'; keynum: K_AUX19),
(name: 'AUX20'; keynum: K_AUX20),
(name: 'AUX21'; keynum: K_AUX21),
(name: 'AUX22'; keynum: K_AUX22),
(name: 'AUX23'; keynum: K_AUX23),
(name: 'AUX24'; keynum: K_AUX24),
(name: 'AUX25'; keynum: K_AUX25),
(name: 'AUX26'; keynum: K_AUX26),
(name: 'AUX27'; keynum: K_AUX27),
(name: 'AUX28'; keynum: K_AUX28),
(name: 'AUX29'; keynum: K_AUX29),
(name: 'AUX30'; keynum: K_AUX30),
(name: 'AUX31'; keynum: K_AUX31),
(name: 'AUX32'; keynum: K_AUX32),
(name: 'KP_HOME'; keynum: K_KP_HOME),
(name: 'KP_UPARROW'; keynum: K_KP_UPARROW),
(name: 'KP_PGUP'; keynum: K_KP_PGUP),
(name: 'KP_LEFTARROW'; keynum: K_KP_LEFTARROW),
(name: 'KP_5'; keynum: K_KP_5),
(name: 'KP_RIGHTARROW'; keynum: K_KP_RIGHTARROW),
(name: 'KP_END'; keynum: K_KP_END),
(name: 'KP_DOWNARROW'; keynum: K_KP_DOWNARROW),
(name: 'KP_PGDN'; keynum: K_KP_PGDN),
(name: 'KP_ENTER'; keynum: K_KP_ENTER),
(name: 'KP_INS'; keynum: K_KP_INS),
(name: 'KP_DEL'; keynum: K_KP_DEL),
(name: 'KP_SLASH'; keynum: K_KP_SLASH),
(name: 'KP_MINUS'; keynum: K_KP_MINUS),
(name: 'KP_PLUS'; keynum: K_KP_PLUS),
(name: 'MWHEELUP'; keynum: K_MWHEELUP),
(name: 'MWHEELDOWN'; keynum: K_MWHEELDOWN),
(name: 'PAUSE'; keynum: K_PAUSE),
(name: 'SEMICOLON'; keynum: ord(';')), // because a raw semicolon seperates commands
(name: nil; keynum: - 1)
);
{
==============================================================================
LINE TYPING INTO THE CONSOLE
==============================================================================
}
procedure CompleteCommand;
var
s, cmd: Pchar; // s,cmd : String;
begin
// TODO : Conferm string handling translation
s := @key_lines[edit_line][1]; // key_lines[edit_line]+1; this works to, but isnt clear
if (s[0] = '/') or (s[0] = '\') then
Inc(s);
cmd := Cmd_CompleteCommand(s);
if cmd = nil then
cmd := Cvar_CompleteVariable(s);
if cmd <> nil then
begin
key_lines[edit_line][1] := '/';
strcopy(@key_lines[edit_line][2], cmd); // strcpy (key_lines[edit_line]+2, cmd);
key_linepos := strlen(cmd) + 2;
key_lines[edit_line][key_linepos] := ' ';
Inc(key_linepos);
key_lines[edit_line][key_linepos] := #0;
end;
end; {CompleteCommand}
{
====================
Key_Console
Interactive line editing and console scrollback
====================
void Key_Console (int key)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -