annotate osdep/getch2.c @ 13394:455a5056801f

New generic 'portable anymap' video output driver. It supports portable pixmaps and graymaps in both raw and ASCII mode. Besides PPM and PGM, it can also output PGMYUV files which are PGM files with the U and V plane appended to the bottom of the Y image (bottom left and bottom right). All files can be written to the current directory, to a specified output directory or to multiple subdirectories if the filesystem can't handle the amount of files in one directory anymore. Note: This driver is not yet activated and will not be compiled and linked to libvo. A separate patch will take care of that. This is just for adding the file to the repository.
author ivo
date Mon, 20 Sep 2004 00:54:57 +0000
parents cacdfa298d37
children 3758536dcef3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 /* GyS-TermIO v2.0 (for GySmail v3) (C) 1999 A'rpi/ESP-team */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
3 #include "../config.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
4
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
5 //#define USE_TERMCAP
12122
cacdfa298d37 morphos support by Nicolas Det
alex
parents: 12063
diff changeset
6 #if !defined(__OS2__) && !defined(__MORPHOS__)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7 #define USE_IOCTL
5300
5d7bd47b46ef OS2 support
arpi
parents: 3282
diff changeset
8 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
9
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
10 #define MAX_KEYS 64
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11 #define BUF_LEN 256
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13 #include <stdio.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
14 #include <stdlib.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
15 #include <string.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
16 #include <sys/time.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
17 #include <sys/types.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18 #ifdef USE_IOCTL
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19 #include <sys/ioctl.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
20 #endif
3281
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
21
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
22 #ifdef HAVE_TERMIOS
3281
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
23 #ifdef HAVE_TERMIOS_H
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
24 #include <termios.h>
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
25 #endif
3282
alex
parents: 3281
diff changeset
26 #ifdef HAVE_SYS_TERMIOS_H
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
27 #include <sys/termios.h>
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
28 #endif
3281
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
29 #endif
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
30
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 #include <unistd.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33 #include "keycodes.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
35 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 static struct termios tio_orig;
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
37 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 static int getch2_len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39 static char getch2_buf[BUF_LEN];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 int screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42 int screen_height=24;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 typedef struct {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 int len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 int code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 char chars[8];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 } keycode_st;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49 static keycode_st getch2_keys[MAX_KEYS];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 static int getch2_key_db=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52 #ifdef USE_TERMCAP
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55 #include <termcap.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 extern int tgetent (char *BUFFER, char *TERMTYPE);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 extern int tgetnum (char *NAME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 extern int tgetflag (char *NAME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60 extern char *tgetstr (char *NAME, char **AREA);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 static char term_buffer[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 static char term_buffer2[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 static char *term_p=term_buffer2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 static void termcap_add(char *id,int code){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68 char *p=tgetstr(id,&term_p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 if(!p) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 if(getch2_key_db>=MAX_KEYS) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 getch2_keys[getch2_key_db].len=strlen(p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 strncpy(getch2_keys[getch2_key_db].chars,p,8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 getch2_keys[getch2_key_db].code=code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 ++getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 /* printf("%s=%s\n",id,p); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 static int success=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 int load_termcap(char *termtype){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 if(!termtype) termtype=getenv("TERM");
8889
18427eee9205 The attached little patch fixes a core dump on termcap systems when
arpi
parents: 8016
diff changeset
82 if(!termtype) termtype="unknown";
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 success=tgetent(term_buffer, termtype);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 if(success<0){ printf("Could not access the 'termcap' data base.\n"); return 0; }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 if(success==0){ printf("Terminal type `%s' is not defined.\n", termtype);return 0;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 screen_width=tgetnum("co");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 screen_height=tgetnum("li");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 if(screen_width<1 || screen_width>255) screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 if(screen_height<1 || screen_height>255) screen_height=24;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 termcap_add("kP",KEY_PGUP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 termcap_add("kN",KEY_PGDWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 termcap_add("kh",KEY_HOME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 termcap_add("kH",KEY_END);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 termcap_add("kI",KEY_INS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 termcap_add("kD",KEY_DEL);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 termcap_add("kb",KEY_BS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 termcap_add("kl",KEY_LEFT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 termcap_add("kd",KEY_DOWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 termcap_add("ku",KEY_UP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 termcap_add("kr",KEY_RIGHT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 termcap_add("k0",KEY_F+0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 termcap_add("k1",KEY_F+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 termcap_add("k2",KEY_F+2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 termcap_add("k3",KEY_F+3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 termcap_add("k4",KEY_F+4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 termcap_add("k5",KEY_F+5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 termcap_add("k6",KEY_F+6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 termcap_add("k7",KEY_F+7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 termcap_add("k8",KEY_F+8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 termcap_add("k9",KEY_F+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 termcap_add("k;",KEY_F+10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 return getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 void get_screen_size(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 #ifdef USE_IOCTL
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 struct winsize ws;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 if (ioctl(0, TIOCGWINSZ, &ws) < 0 || !ws.ws_row || !ws.ws_col) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 /* printf("Using IOCTL\n"); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 screen_width=ws.ws_col;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 screen_height=ws.ws_row;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 int getch2(int time){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 int len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 int code=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 int i=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 while(!getch2_len || (getch2_len==1 && getch2_buf[0]==27)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 fd_set rfds;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 struct timeval tv;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137 int retval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 /* Watch stdin (fd 0) to see when it has input. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 FD_ZERO(&rfds); FD_SET(0,&rfds);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 /* Wait up to 'time' microseconds. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 tv.tv_sec=time/1000; tv.tv_usec = (time%1000)*1000;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 retval=select(1, &rfds, NULL, NULL, &tv);
3014
16576e05b93a Profiling fix by Artur Skawina <skawina@geocities.com>
atmos4
parents: 3009
diff changeset
143 if(retval<=0) return -1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 /* Data is available now. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 retval=read(0,&getch2_buf[getch2_len],BUF_LEN-getch2_len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 if(retval<1) return -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 getch2_len+=retval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 /* First find in the TERMCAP database: */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 for(i=0;i<getch2_key_db;i++){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 if((len=getch2_keys[i].len)<=getch2_len)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 if(memcmp(getch2_keys[i].chars,getch2_buf,len)==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 code=getch2_keys[i].code; goto found;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 len=1;code=getch2_buf[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 /* Check the well-known codes... */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 if(code!=27){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 if(code=='A'-64){ code=KEY_HOME; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 if(code=='E'-64){ code=KEY_END; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 if(code=='D'-64){ code=KEY_DEL; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 if(code=='H'-64){ code=KEY_BS; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 if(code=='U'-64){ code=KEY_PGUP; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 if(code=='V'-64){ code=KEY_PGDWN; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 if(code==8 || code==127){ code=KEY_BS; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 if(code==10 || code==13){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 if(getch2_len>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 int c=getch2_buf[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 if(c==10 || c==13) if(c!=code) len=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 code=KEY_ENTER;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 goto found;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 } else if(getch2_len>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 int c=getch2_buf[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 if(c==27){ code=KEY_ESC; len=2; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 if(c>='0' && c<='9'){ code=c-'0'+KEY_F; len=2; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179 if(getch2_len>=4 && c=='[' && getch2_buf[2]=='['){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180 int c=getch2_buf[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 if(c>='A' && c<'A'+12){ code=KEY_F+1+c-'A';len=4;goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 if(c=='[' || c=='O') if(getch2_len>=3){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184 int c=getch2_buf[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 static short int ctable[]={ KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT,0,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 KEY_END,KEY_PGDWN,KEY_HOME,KEY_PGUP,0,0,KEY_INS,0,0,0,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187 KEY_F+1,KEY_F+2,KEY_F+3,KEY_F+4};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 if(c>='A' && c<='S')
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 if(ctable[c-'A']){ code=ctable[c-'A']; len=3; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 if(getch2_len>=4 && c=='[' && getch2_buf[3]=='~'){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192 int c=getch2_buf[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 int ctable[8]={KEY_HOME,KEY_INS,KEY_DEL,KEY_END,KEY_PGUP,KEY_PGDWN,KEY_HOME,KEY_END};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 if(c>='1' && c<='8'){ code=ctable[c-'1']; len=4; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 if(getch2_len>=5 && c=='[' && getch2_buf[4]=='~'){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 int i=getch2_buf[2]-'0';
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 int j=getch2_buf[3]-'0';
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 if(i>=0 && i<=9 && j>=0 && j<=9){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 static short int ftable[20]={
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 11,12,13,14,15, 17,18,19,20,21,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 23,24,25,26,28, 29,31,32,33,34 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 int a=i*10+j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 for(i=0;i<20;i++) if(ftable[i]==a){ code=KEY_F+1+i;len=5;goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 found:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 if((getch2_len-=len)>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 for(i=0;i<getch2_len;i++) getch2_buf[i]=getch2_buf[len+i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 return code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
216 static int getch2_status=0;
77cf72182c7f status management
arpi
parents: 1451
diff changeset
217
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 void getch2_enable(){
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
219 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 struct termios tio_new;
12063
e11fc0ef72db The attached patch fixes a minor build problem on GNU/k*BSD: getch2.c should
diego
parents: 9380
diff changeset
221 #if defined(__NetBSD__) || defined(__svr4__) || defined(__CYGWIN__) || defined(__OS2__) || defined(__GLIBC__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
222 tcgetattr(0,&tio_orig);
5948
efce49503129 Port to darwin.
atmos4
parents: 5548
diff changeset
223 #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
224 ioctl(0,TIOCGETA,&tio_orig);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
225 #else
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
226 ioctl(0,TCGETS,&tio_orig);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
227 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 tio_new=tio_orig;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229 tio_new.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 tio_new.c_cc[VMIN] = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 tio_new.c_cc[VTIME] = 0;
12063
e11fc0ef72db The attached patch fixes a minor build problem on GNU/k*BSD: getch2.c should
diego
parents: 9380
diff changeset
232 #if defined(__NetBSD__) || defined(__svr4__) || defined(__CYGWIN__) || defined(__OS2__) || defined(__GLIBC__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
233 tcsetattr(0,TCSANOW,&tio_new);
5948
efce49503129 Port to darwin.
atmos4
parents: 5548
diff changeset
234 #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
235 ioctl(0,TIOCSETA,&tio_new);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
236 #else
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
237 ioctl(0,TCSETS,&tio_new);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
238 #endif
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
239 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
240 getch2_status=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 void getch2_disable(){
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
244 if(!getch2_status) return; // already disabled / never enabled
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
245 #ifdef HAVE_TERMIOS
12063
e11fc0ef72db The attached patch fixes a minor build problem on GNU/k*BSD: getch2.c should
diego
parents: 9380
diff changeset
246 #if defined(__NetBSD__) || defined(__svr4__) || defined(__CYGWIN__) || defined(__OS2__) || defined(__GLIBC__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
247 tcsetattr(0,TCSANOW,&tio_orig);
5948
efce49503129 Port to darwin.
atmos4
parents: 5548
diff changeset
248 #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
249 ioctl(0,TIOCSETA,&tio_orig);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
250 #else
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
251 ioctl(0,TCSETS,&tio_orig);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
252 #endif
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
253 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
254 getch2_status=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256