annotate osdep/getch2.c @ 32282:606e4157cd4c

Split alloc and init of context so that parameters can be set in the context instead of requireing being passed through function parameters. This also makes sws work with AVOptions.
author michael
date Sun, 26 Sep 2010 19:33:57 +0000
parents 32725ca88fed
children 3ee9fd074b8c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28744
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
1 /*
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
2 * GyS-TermIO v2.0 (for GySmail v3)
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
3 * a very small replacement of ncurses library
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
4 *
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
5 * copyright (C) 1999 A'rpi/ESP-team
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
6 *
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
7 * This file is part of MPlayer.
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
8 *
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
9 * MPlayer is free software; you can redistribute it and/or modify
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
10 * it under the terms of the GNU General Public License as published by
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
12 * (at your option) any later version.
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
13 *
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
14 * MPlayer is distributed in the hope that it will be useful,
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
17 * GNU General Public License for more details.
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
18 *
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
19 * You should have received a copy of the GNU General Public License along
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
20 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
5cfef41a1771 Add standard license headers to files.
diego
parents: 28051
diff changeset
22 */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
23
16985
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15566
diff changeset
24 #include "config.h"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25
27359
d788e177a35e Rename some preprocessor directives from CONFIG_* to HAVE_* where appropriate;
diego
parents: 27341
diff changeset
26 //#define HAVE_TERMCAP
12122
cacdfa298d37 morphos support by Nicolas Det
alex
parents: 12063
diff changeset
27 #if !defined(__OS2__) && !defined(__MORPHOS__)
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 24515
diff changeset
28 #define CONFIG_IOCTL
5300
5d7bd47b46ef OS2 support
arpi
parents: 3282
diff changeset
29 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
30
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 #define MAX_KEYS 64
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32 #define BUF_LEN 256
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34 #include <stdio.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 #include <stdlib.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 #include <string.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37 #include <sys/time.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 #include <sys/types.h>
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 24515
diff changeset
39 #ifdef CONFIG_IOCTL
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 #include <sys/ioctl.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 #endif
3281
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
42
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
43 #ifdef HAVE_TERMIOS
3281
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
44 #ifdef HAVE_TERMIOS_H
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
45 #include <termios.h>
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
46 #endif
3282
alex
parents: 3281
diff changeset
47 #ifdef HAVE_SYS_TERMIOS_H
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 #include <sys/termios.h>
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
49 #endif
3281
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
50 #endif
310c0b9bea21 detect termios.h if no sys/termios.h (qnx getch2 support working)
alex
parents: 3014
diff changeset
51
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27359
diff changeset
52 #if defined(HAVE_LANGINFO) && defined(CONFIG_ICONV)
22442
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
53 #include <locale.h>
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
54 #include <langinfo.h>
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
55 #endif
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
56
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 #include <unistd.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
59 #include "mp_fifo.h"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60 #include "keycodes.h"
30554
321e9ea69b9f #include corresponding .h files in .c files.
diego
parents: 29290
diff changeset
61 #include "getch2.h"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
63 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 static struct termios tio_orig;
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
65 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 static int getch2_len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 static char getch2_buf[BUF_LEN];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 int screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 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
71 char * erase_to_end_of_line = NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 typedef struct {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 int len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 int code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 char chars[8];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 } keycode_st;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 static keycode_st getch2_keys[MAX_KEYS];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 static int getch2_key_db=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80
27359
d788e177a35e Rename some preprocessor directives from CONFIG_* to HAVE_* where appropriate;
diego
parents: 27341
diff changeset
81 #ifdef HAVE_TERMCAP
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 #include <termcap.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 #else
28051
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27393
diff changeset
86 int tgetent(char *BUFFER, char *TERMTYPE);
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27393
diff changeset
87 int tgetnum(char *NAME);
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27393
diff changeset
88 int tgetflag(char *NAME);
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27393
diff changeset
89 char *tgetstr(char *NAME, char **AREA);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 static char term_buffer[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 static char term_buffer2[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 static char *term_p=term_buffer2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 static void termcap_add(char *id,int code){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 char *p=tgetstr(id,&term_p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 if(!p) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 if(getch2_key_db>=MAX_KEYS) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 getch2_keys[getch2_key_db].len=strlen(p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 strncpy(getch2_keys[getch2_key_db].chars,p,8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 getch2_keys[getch2_key_db].code=code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 ++getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 /* printf("%s=%s\n",id,p); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 static int success=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 int load_termcap(char *termtype){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 if(!termtype) termtype=getenv("TERM");
8889
18427eee9205 The attached little patch fixes a core dump on termcap systems when
arpi
parents: 8016
diff changeset
111 if(!termtype) termtype="unknown";
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 success=tgetent(term_buffer, termtype);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 if(success<0){ printf("Could not access the 'termcap' data base.\n"); return 0; }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 if(success==0){ printf("Terminal type `%s' is not defined.\n", termtype);return 0;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 screen_width=tgetnum("co");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 screen_height=tgetnum("li");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 if(screen_width<1 || screen_width>255) screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 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
120 erase_to_end_of_line= tgetstr("cd",&term_p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 termcap_add("kP",KEY_PGUP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 termcap_add("kN",KEY_PGDWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 termcap_add("kh",KEY_HOME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 termcap_add("kH",KEY_END);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 termcap_add("kI",KEY_INS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 termcap_add("kD",KEY_DEL);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 termcap_add("kb",KEY_BS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 termcap_add("kl",KEY_LEFT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 termcap_add("kd",KEY_DOWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 termcap_add("ku",KEY_UP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 termcap_add("kr",KEY_RIGHT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133 termcap_add("k0",KEY_F+0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 termcap_add("k1",KEY_F+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 termcap_add("k2",KEY_F+2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 termcap_add("k3",KEY_F+3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137 termcap_add("k4",KEY_F+4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 termcap_add("k5",KEY_F+5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 termcap_add("k6",KEY_F+6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 termcap_add("k7",KEY_F+7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 termcap_add("k8",KEY_F+8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 termcap_add("k9",KEY_F+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 termcap_add("k;",KEY_F+10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 return getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
149 void get_screen_size(void){
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 24515
diff changeset
150 #ifdef CONFIG_IOCTL
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 struct winsize ws;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 if (ioctl(0, TIOCGWINSZ, &ws) < 0 || !ws.ws_row || !ws.ws_col) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 /* printf("Using IOCTL\n"); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 screen_width=ws.ws_col;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 screen_height=ws.ws_row;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
159 void getch2(void)
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
160 {
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
161 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
162 if (retval < 1)
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
163 return;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
164 getch2_len += retval;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
166 while (getch2_len > 0 && (getch2_len > 1 || getch2_buf[0] != 27)) {
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
167 int i, len, code;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
168
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
169 /* First find in the TERMCAP database: */
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
170 for (i = 0; i < getch2_key_db; i++) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
171 if ((len = getch2_keys[i].len) <= getch2_len)
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
172 if(memcmp(getch2_keys[i].chars, getch2_buf, len) == 0) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
173 code = getch2_keys[i].code;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
174 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
175 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 }
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
177 /* We always match some keypress here, with length 1 if nothing else.
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
178 * Since some of the cases explicitly test remaining buffer length
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
179 * having a keycode only partially read in the buffer could incorrectly
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
180 * use the first byte as an independent character.
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
181 * However the buffer is big enough that this shouldn't happen too
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
182 * easily, and it's been this way for years without many complaints.
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
183 * 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
184 * whether a string must be part of a longer keycode. */
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
185 len = 1;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
186 code = getch2_buf[0];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
187 /* Check the well-known codes... */
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
188 if (code != 27) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
189 if (code == 'A'-64) code = KEY_HOME;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
190 else if (code == 'E'-64) code = KEY_END;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
191 else if (code == 'D'-64) code = KEY_DEL;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
192 else if (code == 'H'-64) code = KEY_BS;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
193 else if (code == 'U'-64) code = KEY_PGUP;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
194 else if (code == 'V'-64) code = KEY_PGDWN;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
195 else if (code == 8 || code==127) code = KEY_BS;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
196 else if (code == 10 || code==13) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
197 if (getch2_len > 1) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
198 int c = getch2_buf[1];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
199 if ((c == 10 || c == 13) && (c != code))
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
200 len = 2;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
201 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
202 code = KEY_ENTER;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
203 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 }
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
205 else if (getch2_len > 1) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
206 int c = getch2_buf[1];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
207 if (c == 27) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
208 code = KEY_ESC;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
209 len = 2;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
210 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
211 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
212 if (c >= '0' && c <= '9') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
213 code = c-'0'+KEY_F;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
214 len = 2;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
215 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
216 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
217 if (getch2_len >= 4 && c == '[' && getch2_buf[2] == '[') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
218 int c = getch2_buf[3];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
219 if (c >= 'A' && c < 'A'+12) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
220 code = KEY_F+1 + c-'A';
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 }
24515
c5c0cb0e90d2 getch2: Fix incorrect test
uau
parents: 24130
diff changeset
225 if ((c == '[' || c == 'O') && getch2_len >= 3) {
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
226 int c = getch2_buf[2];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
227 const short ctable[] = {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
228 KEY_UP, KEY_DOWN, KEY_RIGHT, KEY_LEFT, 0,
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
229 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
230 KEY_F+1, KEY_F+2, KEY_F+3, KEY_F+4};
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
231 if (c >= 'A' && c <= 'S')
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
232 if (ctable[c - 'A']) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
233 code = ctable[c - 'A'];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
234 len = 3;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
235 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
236 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
237 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
238 if (getch2_len >= 4 && c == '[' && getch2_buf[3] == '~') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
239 int c = getch2_buf[2];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
240 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
241 if (c >= '1' && c <= '8') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
242 code = ctable[c - '1'];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
243 len = 4;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
244 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
245 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
246 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
247 if (getch2_len >= 5 && c == '[' && getch2_buf[4] == '~') {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
248 int i = getch2_buf[2] - '0';
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
249 int j = getch2_buf[3] - '0';
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
250 if (i >= 0 && i <= 9 && j >= 0 && j <= 9) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
251 const short ftable[20] = {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
252 11,12,13,14,15, 17,18,19,20,21,
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
253 23,24,25,26,28, 29,31,32,33,34 };
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
254 int a = i*10 + j;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
255 for (i = 0; i < 20; i++)
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
256 if (ftable[i] == a) {
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
257 code = KEY_F+1 + i;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
258 len = 5;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
259 goto found;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
260 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
261 }
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
262 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 }
24130
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
264 found:
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
265 getch2_len -= len;
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
266 for (i = 0; i < getch2_len; i++)
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
267 getch2_buf[i] = getch2_buf[len+i];
d62ddc94c474 Clean up getch2() code somewhat
uau
parents: 24129
diff changeset
268 mplayer_put_key(code);
24129
50e1e79056b6 Make terminal input work more like VO key input
uau
parents: 22886
diff changeset
269 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
272 static int getch2_status=0;
77cf72182c7f status management
arpi
parents: 1451
diff changeset
273
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
274 void getch2_enable(void){
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
275 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276 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
277 tcgetattr(0,&tio_orig);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278 tio_new=tio_orig;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279 tio_new.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 tio_new.c_cc[VMIN] = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 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
282 tcsetattr(0,TCSANOW,&tio_new);
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
283 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
284 getch2_status=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
287 void getch2_disable(void){
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
288 if(!getch2_status) return; // already disabled / never enabled
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
289 #ifdef HAVE_TERMIOS
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
290 tcsetattr(0,TCSANOW,&tio_orig);
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
291 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
292 getch2_status=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294
27393
4876c89bafdd Rename font-related preprocessor directives.
diego
parents: 27359
diff changeset
295 #ifdef CONFIG_ICONV
22886
71b3e04d0555 "()" to "(void)" function param list fixes
uau
parents: 22442
diff changeset
296 char* get_term_charset(void)
22442
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
297 {
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
298 char* charset = NULL;
27359
d788e177a35e Rename some preprocessor directives from CONFIG_* to HAVE_* where appropriate;
diego
parents: 27341
diff changeset
299 #ifdef HAVE_LANGINFO
22442
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
300 setlocale(LC_CTYPE, "");
29290
ef46d5a66bb2 Use a malloced string for the get_term_charset return value.
reimar
parents: 28744
diff changeset
301 charset = strdup(nl_langinfo(CODESET));
22442
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
302 setlocale(LC_CTYPE, "C");
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
303 #endif
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
304 return charset;
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
305 }
56a0b0f8a66e Add code to detect and convert to console codepage on Windows.
reimar
parents: 21589
diff changeset
306 #endif