annotate osdep/getch2.c @ 24515:c5c0cb0e90d2

getch2: Fix incorrect test Keycode length wasn't checked in one case because of missing parentheses. This was accidentally broken in my previous commit to the file. Most likely the error had no practical effect; the length checks are unreliable in any case as they can be satisfied by unrelated data corresponding to other keypresses.
author uau
date Sat, 15 Sep 2007 18:13:56 +0000
parents d62ddc94c474
children e7c989f7a7c9
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
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
38 #include "mp_fifo.h"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39 #include "keycodes.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
41 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42 static struct termios tio_orig;
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
43 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 static int getch2_len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 static char getch2_buf[BUF_LEN];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 int screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 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
49 char * erase_to_end_of_line = NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 typedef struct {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52 int len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 int code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54 char chars[8];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55 } keycode_st;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 static keycode_st getch2_keys[MAX_KEYS];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 static int getch2_key_db=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 #ifdef USE_TERMCAP
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 #include <termcap.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 extern int tgetent (char *BUFFER, char *TERMTYPE);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 extern int tgetnum (char *NAME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 extern int tgetflag (char *NAME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 extern char *tgetstr (char *NAME, char **AREA);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 static char term_buffer[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 static char term_buffer2[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 static char *term_p=term_buffer2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 static void termcap_add(char *id,int code){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 char *p=tgetstr(id,&term_p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 if(!p) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 if(getch2_key_db>=MAX_KEYS) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 getch2_keys[getch2_key_db].len=strlen(p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 strncpy(getch2_keys[getch2_key_db].chars,p,8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 getch2_keys[getch2_key_db].code=code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 ++getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 /* printf("%s=%s\n",id,p); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 static int success=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 int load_termcap(char *termtype){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 if(!termtype) termtype=getenv("TERM");
8889
18427eee9205 The attached little patch fixes a core dump on termcap systems when
arpi
parents: 8016
diff changeset
89 if(!termtype) termtype="unknown";
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 success=tgetent(term_buffer, termtype);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 if(success<0){ printf("Could not access the 'termcap' data base.\n"); return 0; }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 if(success==0){ printf("Terminal type `%s' is not defined.\n", termtype);return 0;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 screen_width=tgetnum("co");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 screen_height=tgetnum("li");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 if(screen_width<1 || screen_width>255) screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 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
98 erase_to_end_of_line= tgetstr("cd",&term_p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 termcap_add("kP",KEY_PGUP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 termcap_add("kN",KEY_PGDWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 termcap_add("kh",KEY_HOME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 termcap_add("kH",KEY_END);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 termcap_add("kI",KEY_INS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 termcap_add("kD",KEY_DEL);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 termcap_add("kb",KEY_BS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 termcap_add("kl",KEY_LEFT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 termcap_add("kd",KEY_DOWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 termcap_add("ku",KEY_UP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 termcap_add("kr",KEY_RIGHT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 termcap_add("k0",KEY_F+0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 termcap_add("k1",KEY_F+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 termcap_add("k2",KEY_F+2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 termcap_add("k3",KEY_F+3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 termcap_add("k4",KEY_F+4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 termcap_add("k5",KEY_F+5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 termcap_add("k6",KEY_F+6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 termcap_add("k7",KEY_F+7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 termcap_add("k8",KEY_F+8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 termcap_add("k9",KEY_F+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 termcap_add("k;",KEY_F+10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 return getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
127 void get_screen_size(void){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 #ifdef USE_IOCTL
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 struct winsize ws;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 if (ioctl(0, TIOCGWINSZ, &ws) < 0 || !ws.ws_row || !ws.ws_col) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 /* printf("Using IOCTL\n"); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 screen_width=ws.ws_col;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133 screen_height=ws.ws_row;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
137 void getch2(void)
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
138 {
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
139 int retval = read(0, &getch2_buf[getch2_len], BUF_LEN-getch2_len);
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
140 if (retval < 1)
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
141 return;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
142 getch2_len += retval;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
144 while (getch2_len > 0 && (getch2_len > 1 || getch2_buf[0] != 27)) {
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
145 int i, len, code;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
146
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
147 /* First find in the TERMCAP database: */
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
148 for (i = 0; i < getch2_key_db; i++) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
149 if ((len = getch2_keys[i].len) <= getch2_len)
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
150 if(memcmp(getch2_keys[i].chars, getch2_buf, len) == 0) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
151 code = getch2_keys[i].code;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
152 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
153 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 }
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
155 /* We always match some keypress here, with length 1 if nothing else.
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
156 * Since some of the cases explicitly test remaining buffer length
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
157 * having a keycode only partially read in the buffer could incorrectly
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
158 * use the first byte as an independent character.
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
159 * However the buffer is big enough that this shouldn't happen too
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
160 * easily, and it's been this way for years without many complaints.
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
161 * I see no simple fix as there's no easy test which would tell
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
162 * whether a string must be part of a longer keycode. */
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
163 len = 1;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
164 code = getch2_buf[0];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
165 /* Check the well-known codes... */
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
166 if (code != 27) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
167 if (code == 'A'-64) code = KEY_HOME;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
168 else if (code == 'E'-64) code = KEY_END;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
169 else if (code == 'D'-64) code = KEY_DEL;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
170 else if (code == 'H'-64) code = KEY_BS;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
171 else if (code == 'U'-64) code = KEY_PGUP;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
172 else if (code == 'V'-64) code = KEY_PGDWN;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
173 else if (code == 8 || code==127) code = KEY_BS;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
174 else if (code == 10 || code==13) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
175 if (getch2_len > 1) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
176 int c = getch2_buf[1];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
177 if ((c == 10 || c == 13) && (c != code))
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
178 len = 2;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
179 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
180 code = KEY_ENTER;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
181 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 }
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
183 else if (getch2_len > 1) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
184 int c = getch2_buf[1];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
185 if (c == 27) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
186 code = KEY_ESC;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
187 len = 2;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
188 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
189 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
190 if (c >= '0' && c <= '9') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
191 code = c-'0'+KEY_F;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
192 len = 2;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
193 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
194 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
195 if (getch2_len >= 4 && c == '[' && getch2_buf[2] == '[') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
196 int c = getch2_buf[3];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
197 if (c >= 'A' && c < 'A'+12) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
198 code = KEY_F+1 + c-'A';
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
199 len = 4;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
200 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
201 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
202 }
24515
c5c0cb0e90d2 getch2: Fix incorrect test
uau
parents: 24130
diff changeset
203 if ((c == '[' || c == 'O') && getch2_len >= 3) {
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
204 int c = getch2_buf[2];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
205 const short ctable[] = {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
206 KEY_UP, KEY_DOWN, KEY_RIGHT, KEY_LEFT, 0,
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
207 KEY_END, KEY_PGDWN, KEY_HOME, KEY_PGUP, 0, 0, KEY_INS, 0, 0, 0,
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
208 KEY_F+1, KEY_F+2, KEY_F+3, KEY_F+4};
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
209 if (c >= 'A' && c <= 'S')
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
210 if (ctable[c - 'A']) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
211 code = ctable[c - 'A'];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
212 len = 3;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
213 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
214 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
215 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
216 if (getch2_len >= 4 && c == '[' && getch2_buf[3] == '~') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
217 int c = getch2_buf[2];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
218 const int ctable[8] = {KEY_HOME, KEY_INS, KEY_DEL, KEY_END, KEY_PGUP, KEY_PGDWN, KEY_HOME, KEY_END};
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
219 if (c >= '1' && c <= '8') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
220 code = ctable[c - '1'];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
221 len = 4;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
222 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
223 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
224 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
225 if (getch2_len >= 5 && c == '[' && getch2_buf[4] == '~') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
226 int i = getch2_buf[2] - '0';
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
227 int j = getch2_buf[3] - '0';
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
228 if (i >= 0 && i <= 9 && j >= 0 && j <= 9) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
229 const short ftable[20] = {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
230 11,12,13,14,15, 17,18,19,20,21,
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
231 23,24,25,26,28, 29,31,32,33,34 };
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
232 int a = i*10 + j;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
233 for (i = 0; i < 20; i++)
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
234 if (ftable[i] == a) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
235 code = KEY_F+1 + i;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
236 len = 5;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
237 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
238 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
239 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
240 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 }
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
242 found:
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
243 getch2_len -= len;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
244 for (i = 0; i < getch2_len; i++)
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
245 getch2_buf[i] = getch2_buf[len+i];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
246 mplayer_put_key(code);
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
247 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
250 static int getch2_status=0;
77cf72182c7f status management
arpi
parents: 1451
diff changeset
251
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
252 void getch2_enable(void){
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
253 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 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
255 tcgetattr(0,&tio_orig);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 tio_new=tio_orig;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 tio_new.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 tio_new.c_cc[VMIN] = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 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
260 tcsetattr(0,TCSANOW,&tio_new);
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
261 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
262 getch2_status=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
265 void getch2_disable(void){
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
266 if(!getch2_status) return; // already disabled / never enabled
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
267 #ifdef HAVE_TERMIOS
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
268 tcsetattr(0,TCSANOW,&tio_orig);
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
269 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
270 getch2_status=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272
22442
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
273 #ifdef USE_ICONV
22886
71b3e04d0555 "()" to "(void)" function param list fixes
uau
parents: 22442
diff changeset
274 char* get_term_charset(void)
22442
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
275 {
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
276 char* charset = NULL;
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
277 #ifdef USE_LANGINFO
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
278 setlocale(LC_CTYPE, "");
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
279 charset = nl_langinfo(CODESET);
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
280 setlocale(LC_CTYPE, "C");
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
281 #endif
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
282 return charset;
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
283 }
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
284 #endif
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
285