annotate srogue/mdport.c @ 86:8757a0593e6e

srogue: add arrow-key support. This is a first attempt which may not be completely portable.
author John "Elwin" Edwards
date Sat, 10 Aug 2013 17:43:58 -0700
parents
children ea71ef31d9be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
86
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
1 /*
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
2 mdport.c - Machine Dependent Code
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
3
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
4 Copyright (C) 2005-2008 Nicholas J. Kisseberth
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
5 All rights reserved.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
6
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
7 Redistribution and use in source and binary forms, with or without
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
8 modification, are permitted provided that the following conditions
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
9 are met:
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
10 1. Redistributions of source code must retain the above copyright
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
11 notice, this list of conditions and the following disclaimer.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
12 2. Redistributions in binary form must reproduce the above copyright
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
13 notice, this list of conditions and the following disclaimer in the
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
14 documentation and/or other materials provided with the distribution.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
15 3. Neither the name(s) of the author(s) nor the names of other contributors
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
16 may be used to endorse or promote products derived from this software
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
17 without specific prior written permission.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
18
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
19 THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS ``AS IS'' AND
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
22 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
23 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
24 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
25 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
26 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
27 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
28 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
29 SUCH DAMAGE.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
30 */
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
31
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
32 /* This is a temporary stub version of rogue5's mdport.c. It is only to make
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
33 * md_readchar() available until srogue is ported to autoconf. Then the
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
34 * whole file should work.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
35 */
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
36
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
37 #include <stdlib.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
38 #include <string.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
39
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
40 #if defined(_WIN32)
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
41 #include <Windows.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
42 #include <Lmcons.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
43 #include <io.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
44 #include <conio.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
45 #pragma warning( disable: 4201 )
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
46 #include <shlobj.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
47 #pragma warning( default: 4201 )
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
48 #include <Shlwapi.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
49 #undef MOUSE_MOVED
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
50 #endif
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
51
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
52 #include <sys/types.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
53
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
54 #include <curses.h> /* AIX requires curses.h be included before term.h */
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
55
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
56 #include <ctype.h>
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
57 #include "rogue.h"
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
58
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
59 /*
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
60 Cursor/Keypad Support
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
61
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
62 Sadly Cursor/Keypad support is less straightforward than it should be.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
63
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
64 The various terminal emulators/consoles choose to differentiate the
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
65 cursor and keypad keys (with modifiers) in different ways (if at all!).
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
66 Furthermore they use different code set sequences for each key only
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
67 a subset of which the various curses libraries recognize. Partly due
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
68 to incomplete termcap/terminfo entries and partly due to inherent
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
69 limitations of those terminal capability databases.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
70
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
71 I give curses first crack at decoding the sequences. If it fails to decode
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
72 it we check for common ESC-prefixed sequences.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
73
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
74 All cursor/keypad results are translated into standard rogue movement
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
75 commands.
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
76
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
77 Unmodified keys are translated to walk commands: hjklyubn
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
78 Modified (shift,control,alt) are translated to run commands: HJKLYUBN
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
79
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
80 Console and supported (differentiated) keys
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
81 Interix: Cursor Keys, Keypad, Ctl-Keypad
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
82 Cygwin: Cursor Keys, Keypad, Alt-Cursor Keys
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
83 MSYS: Cursor Keys, Keypad, Ctl-Cursor Keys, Ctl-Keypad
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
84 Win32: Cursor Keys, Keypad, Ctl/Shift/Alt-Cursor Keys, Ctl/Alt-Keypad
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
85 DJGPP: Cursor Keys, Keypad, Ctl/Shift/Alt-Cursor Keys, Ctl/Alt-Keypad
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
86
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
87 Interix Console (raw, ncurses)
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
88 ==============================
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
89 normal shift ctrl alt
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
90 ESC [D, ESC F^, ESC [D, ESC [D /# Left #/
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
91 ESC [C, ESC F$, ESC [C, ESC [C /# Right #/
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
92 ESC [A, ESC F-, local win, ESC [A /# Up #/
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
93 ESC [B, ESC F+, local win, ESC [B /# Down #/
8757a0593e6e srogue: add arrow-key support.
John "Elwin" Edwards
parents:
diff changeset
94