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