annotate osdep/getch2.c @ 22616:09dc129234a0

Matroska seeking fixes If a relative seek forward went past the last index position the Matroska demuxer did not seek to any index position. It did however set the mkv_d->skip_to_timecode variable which meant that the next fill_buffer() call would read from the current position until the target position (probably the end of the file). Fix this by changing the code to seek to the last index position if that is between the current and target positions. Also change backwards relative seek to accept an exactly matching index position (<= vs <) and reorganize the seeking conditionals to allow making the above change without turning the code into a complete mess.
author uau
date Fri, 16 Mar 2007 14:55:41 +0000
parents 56a0b0f8a66e
children 71b3e04d0555
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
16985
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15566
diff changeset
3 #include "config.h"
1
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
22442
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
31 #if defined(USE_LANGINFO) && defined(USE_ICONV)
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
32 #include <locale.h>
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
33 #include <langinfo.h>
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
34 #endif
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
35
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 #include <unistd.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 #include "keycodes.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
40 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 static struct termios tio_orig;
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
42 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43 static int getch2_len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 static char getch2_buf[BUF_LEN];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 int screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 int screen_height=24;
17258
3d02f6e2a432 change erase to end of line, fall back to old behavior if no termcap found
ods15
parents: 17240
diff changeset
48 char * erase_to_end_of_line = NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 typedef struct {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 int len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52 int code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 char chars[8];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54 } keycode_st;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55 static keycode_st getch2_keys[MAX_KEYS];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 static int getch2_key_db=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 #ifdef USE_TERMCAP
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 #include <termcap.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 extern int tgetent (char *BUFFER, char *TERMTYPE);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 extern int tgetnum (char *NAME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 extern int tgetflag (char *NAME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 extern char *tgetstr (char *NAME, char **AREA);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 static char term_buffer[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 static char term_buffer2[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 static char *term_p=term_buffer2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 static void termcap_add(char *id,int code){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 char *p=tgetstr(id,&term_p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 if(!p) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 if(getch2_key_db>=MAX_KEYS) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 getch2_keys[getch2_key_db].len=strlen(p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 strncpy(getch2_keys[getch2_key_db].chars,p,8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 getch2_keys[getch2_key_db].code=code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 ++getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 /* printf("%s=%s\n",id,p); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 static int success=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 int load_termcap(char *termtype){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 if(!termtype) termtype=getenv("TERM");
8889
18427eee9205 The attached little patch fixes a core dump on termcap systems when
arpi
parents: 8016
diff changeset
88 if(!termtype) termtype="unknown";
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 success=tgetent(term_buffer, termtype);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 if(success<0){ printf("Could not access the 'termcap' data base.\n"); return 0; }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 if(success==0){ printf("Terminal type `%s' is not defined.\n", termtype);return 0;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 screen_width=tgetnum("co");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 screen_height=tgetnum("li");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 if(screen_width<1 || screen_width>255) screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 if(screen_height<1 || screen_height>255) screen_height=24;
17258
3d02f6e2a432 change erase to end of line, fall back to old behavior if no termcap found
ods15
parents: 17240
diff changeset
97 erase_to_end_of_line= tgetstr("cd",&term_p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 termcap_add("kP",KEY_PGUP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 termcap_add("kN",KEY_PGDWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 termcap_add("kh",KEY_HOME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 termcap_add("kH",KEY_END);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 termcap_add("kI",KEY_INS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 termcap_add("kD",KEY_DEL);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 termcap_add("kb",KEY_BS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 termcap_add("kl",KEY_LEFT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 termcap_add("kd",KEY_DOWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 termcap_add("ku",KEY_UP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 termcap_add("kr",KEY_RIGHT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 termcap_add("k0",KEY_F+0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 termcap_add("k1",KEY_F+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 termcap_add("k2",KEY_F+2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 termcap_add("k3",KEY_F+3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 termcap_add("k4",KEY_F+4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 termcap_add("k5",KEY_F+5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 termcap_add("k6",KEY_F+6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 termcap_add("k7",KEY_F+7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 termcap_add("k8",KEY_F+8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 termcap_add("k9",KEY_F+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 termcap_add("k;",KEY_F+10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 return getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
126 void get_screen_size(void){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 #ifdef USE_IOCTL
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 struct winsize ws;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 if (ioctl(0, TIOCGWINSZ, &ws) < 0 || !ws.ws_row || !ws.ws_col) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 /* printf("Using IOCTL\n"); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 screen_width=ws.ws_col;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 screen_height=ws.ws_row;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 int getch2(int time){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137 int len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 int code=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 int i=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 while(!getch2_len || (getch2_len==1 && getch2_buf[0]==27)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 fd_set rfds;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 struct timeval tv;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 int retval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 /* Watch stdin (fd 0) to see when it has input. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 FD_ZERO(&rfds); FD_SET(0,&rfds);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 /* Wait up to 'time' microseconds. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 tv.tv_sec=time/1000; tv.tv_usec = (time%1000)*1000;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 retval=select(1, &rfds, NULL, NULL, &tv);
3014
16576e05b93a Profiling fix by Artur Skawina <skawina@geocities.com>
atmos4
parents: 3009
diff changeset
150 if(retval<=0) return -1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 /* Data is available now. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 retval=read(0,&getch2_buf[getch2_len],BUF_LEN-getch2_len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 if(retval<1) return -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 getch2_len+=retval;
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 /* First find in the TERMCAP database: */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 for(i=0;i<getch2_key_db;i++){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 if((len=getch2_keys[i].len)<=getch2_len)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 if(memcmp(getch2_keys[i].chars,getch2_buf,len)==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 code=getch2_keys[i].code; goto found;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 len=1;code=getch2_buf[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 /* Check the well-known codes... */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 if(code!=27){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 if(code=='A'-64){ code=KEY_HOME; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 if(code=='E'-64){ code=KEY_END; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 if(code=='D'-64){ code=KEY_DEL; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 if(code=='H'-64){ code=KEY_BS; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 if(code=='U'-64){ code=KEY_PGUP; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 if(code=='V'-64){ code=KEY_PGDWN; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 if(code==8 || code==127){ code=KEY_BS; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 if(code==10 || code==13){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 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==10 || c==13) if(c!=code) len=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179 code=KEY_ENTER;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180 goto found;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 } else if(getch2_len>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 int c=getch2_buf[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184 if(c==27){ code=KEY_ESC; len=2; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 if(c>='0' && c<='9'){ code=c-'0'+KEY_F; len=2; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 if(getch2_len>=4 && c=='[' && getch2_buf[2]=='['){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187 int c=getch2_buf[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 if(c>='A' && c<'A'+12){ code=KEY_F+1+c-'A';len=4;goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 if(c=='[' || c=='O') if(getch2_len>=3){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 int c=getch2_buf[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192 static short int ctable[]={ KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT,0,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 KEY_END,KEY_PGDWN,KEY_HOME,KEY_PGUP,0,0,KEY_INS,0,0,0,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 KEY_F+1,KEY_F+2,KEY_F+3,KEY_F+4};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 if(c>='A' && c<='S')
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 if(ctable[c-'A']){ code=ctable[c-'A']; len=3; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 if(getch2_len>=4 && c=='[' && getch2_buf[3]=='~'){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 int c=getch2_buf[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 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
201 if(c>='1' && c<='8'){ code=ctable[c-'1']; len=4; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 if(getch2_len>=5 && c=='[' && getch2_buf[4]=='~'){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 int i=getch2_buf[2]-'0';
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205 int j=getch2_buf[3]-'0';
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 if(i>=0 && i<=9 && j>=0 && j<=9){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 static short int ftable[20]={
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 11,12,13,14,15, 17,18,19,20,21,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 23,24,25,26,28, 29,31,32,33,34 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 int a=i*10+j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 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
212 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 found:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 if((getch2_len-=len)>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 for(i=0;i<getch2_len;i++) getch2_buf[i]=getch2_buf[len+i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 return code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
223 static int getch2_status=0;
77cf72182c7f status management
arpi
parents: 1451
diff changeset
224
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
225 void getch2_enable(void){
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
226 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 struct termios tio_new;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
228 tcgetattr(0,&tio_orig);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229 tio_new=tio_orig;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 tio_new.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 tio_new.c_cc[VMIN] = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 tio_new.c_cc[VTIME] = 0;
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);
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
234 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
235 getch2_status=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
238 void getch2_disable(void){
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
239 if(!getch2_status) return; // already disabled / never enabled
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
240 #ifdef HAVE_TERMIOS
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
241 tcsetattr(0,TCSANOW,&tio_orig);
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
242 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
243 getch2_status=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245
22442
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
246 #ifdef USE_ICONV
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
247 char* get_term_charset()
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
248 {
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
249 char* charset = NULL;
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
250 #ifdef USE_LANGINFO
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
251 setlocale(LC_CTYPE, "");
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
252 charset = nl_langinfo(CODESET);
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
253 setlocale(LC_CTYPE, "C");
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
254 #endif
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
255 return charset;
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
256 }
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
257 #endif
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
258