annotate osdep/getch2.c @ 18715:30d7ddf08889

Fix window position when changing videos while in fullscreen and for window managers that modify position on Map. Oked by Alexander Strasser.
author reimar
date Thu, 15 Jun 2006 08:00:37 +0000
parents f580a7755ac5
children 17b45d55dc44
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
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;
17258
3d02f6e2a432 change erase to end of line, fall back to old behavior if no termcap found
ods15
parents: 17240
diff changeset
43 char * erase_to_end_of_line = NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 typedef struct {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 int len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 int code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 char chars[8];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49 } keycode_st;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 static keycode_st getch2_keys[MAX_KEYS];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 static int getch2_key_db=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 #ifdef USE_TERMCAP
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 #include <termcap.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 extern int tgetent (char *BUFFER, char *TERMTYPE);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 extern int tgetnum (char *NAME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60 extern int tgetflag (char *NAME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 extern char *tgetstr (char *NAME, char **AREA);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 static char term_buffer[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 static char term_buffer2[4096];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 static char *term_p=term_buffer2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68 static void termcap_add(char *id,int code){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 char *p=tgetstr(id,&term_p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 if(!p) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 if(getch2_key_db>=MAX_KEYS) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 getch2_keys[getch2_key_db].len=strlen(p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 strncpy(getch2_keys[getch2_key_db].chars,p,8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 getch2_keys[getch2_key_db].code=code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 ++getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 /* printf("%s=%s\n",id,p); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 static int success=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 int load_termcap(char *termtype){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 if(!termtype) termtype=getenv("TERM");
8889
18427eee9205 The attached little patch fixes a core dump on termcap systems when
arpi
parents: 8016
diff changeset
83 if(!termtype) termtype="unknown";
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 success=tgetent(term_buffer, termtype);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 if(success<0){ printf("Could not access the 'termcap' data base.\n"); return 0; }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 if(success==0){ printf("Terminal type `%s' is not defined.\n", termtype);return 0;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 screen_width=tgetnum("co");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 screen_height=tgetnum("li");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 if(screen_width<1 || screen_width>255) screen_width=80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 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
92 erase_to_end_of_line= tgetstr("cd",&term_p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 termcap_add("kP",KEY_PGUP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 termcap_add("kN",KEY_PGDWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 termcap_add("kh",KEY_HOME);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 termcap_add("kH",KEY_END);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 termcap_add("kI",KEY_INS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 termcap_add("kD",KEY_DEL);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 termcap_add("kb",KEY_BS);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 termcap_add("kl",KEY_LEFT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 termcap_add("kd",KEY_DOWN);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 termcap_add("ku",KEY_UP);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 termcap_add("kr",KEY_RIGHT);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 termcap_add("k0",KEY_F+0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 termcap_add("k1",KEY_F+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 termcap_add("k2",KEY_F+2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 termcap_add("k3",KEY_F+3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 termcap_add("k4",KEY_F+4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 termcap_add("k5",KEY_F+5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 termcap_add("k6",KEY_F+6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 termcap_add("k7",KEY_F+7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 termcap_add("k8",KEY_F+8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 termcap_add("k9",KEY_F+9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 termcap_add("k;",KEY_F+10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 return getch2_key_db;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
121 void get_screen_size(void){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 #ifdef USE_IOCTL
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 struct winsize ws;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 if (ioctl(0, TIOCGWINSZ, &ws) < 0 || !ws.ws_row || !ws.ws_col) return;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 /* printf("Using IOCTL\n"); */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 screen_width=ws.ws_col;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 screen_height=ws.ws_row;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 int getch2(int time){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 int len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133 int code=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 int i=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 while(!getch2_len || (getch2_len==1 && getch2_buf[0]==27)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137 fd_set rfds;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 struct timeval tv;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 int retval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 /* Watch stdin (fd 0) to see when it has input. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 FD_ZERO(&rfds); FD_SET(0,&rfds);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 /* Wait up to 'time' microseconds. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 tv.tv_sec=time/1000; tv.tv_usec = (time%1000)*1000;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 retval=select(1, &rfds, NULL, NULL, &tv);
3014
16576e05b93a Profiling fix by Artur Skawina <skawina@geocities.com>
atmos4
parents: 3009
diff changeset
145 if(retval<=0) return -1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 /* Data is available now. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 retval=read(0,&getch2_buf[getch2_len],BUF_LEN-getch2_len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 if(retval<1) return -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 getch2_len+=retval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 /* First find in the TERMCAP database: */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 for(i=0;i<getch2_key_db;i++){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 if((len=getch2_keys[i].len)<=getch2_len)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 if(memcmp(getch2_keys[i].chars,getch2_buf,len)==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 code=getch2_keys[i].code; goto found;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 len=1;code=getch2_buf[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 /* Check the well-known codes... */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 if(code!=27){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 if(code=='A'-64){ code=KEY_HOME; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 if(code=='E'-64){ code=KEY_END; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 if(code=='D'-64){ code=KEY_DEL; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 if(code=='H'-64){ code=KEY_BS; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 if(code=='U'-64){ code=KEY_PGUP; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 if(code=='V'-64){ code=KEY_PGDWN; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 if(code==8 || code==127){ code=KEY_BS; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 if(code==10 || code==13){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 if(getch2_len>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 int c=getch2_buf[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 if(c==10 || c==13) if(c!=code) len=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 code=KEY_ENTER;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 goto found;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 } else if(getch2_len>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 int c=getch2_buf[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179 if(c==27){ code=KEY_ESC; len=2; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180 if(c>='0' && c<='9'){ code=c-'0'+KEY_F; len=2; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 if(getch2_len>=4 && c=='[' && getch2_buf[2]=='['){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 int c=getch2_buf[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 if(c>='A' && c<'A'+12){ code=KEY_F+1+c-'A';len=4;goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 if(c=='[' || c=='O') if(getch2_len>=3){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 int c=getch2_buf[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187 static short int ctable[]={ KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT,0,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 KEY_END,KEY_PGDWN,KEY_HOME,KEY_PGUP,0,0,KEY_INS,0,0,0,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 KEY_F+1,KEY_F+2,KEY_F+3,KEY_F+4};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 if(c>='A' && c<='S')
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 if(ctable[c-'A']){ code=ctable[c-'A']; len=3; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 if(getch2_len>=4 && c=='[' && getch2_buf[3]=='~'){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 int c=getch2_buf[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 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
196 if(c>='1' && c<='8'){ code=ctable[c-'1']; len=4; goto found;}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 if(getch2_len>=5 && c=='[' && getch2_buf[4]=='~'){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 int i=getch2_buf[2]-'0';
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 int j=getch2_buf[3]-'0';
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 if(i>=0 && i<=9 && j>=0 && j<=9){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 static short int ftable[20]={
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 11,12,13,14,15, 17,18,19,20,21,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 23,24,25,26,28, 29,31,32,33,34 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205 int a=i*10+j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 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
207 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 found:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 if((getch2_len-=len)>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 for(i=0;i<getch2_len;i++) getch2_buf[i]=getch2_buf[len+i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 return code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
218 static int getch2_status=0;
77cf72182c7f status management
arpi
parents: 1451
diff changeset
219
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
220 void getch2_enable(void){
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
221 #ifdef HAVE_TERMIOS
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 struct termios tio_new;
17264
b62c2fdbcde9 AIX PPC port
diego
parents: 17258
diff changeset
223 #if defined(__NetBSD__) || defined(__svr4__) || defined(__CYGWIN__) || defined(__OS2__) || defined(__GLIBC__) || defined(_AIX)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
224 tcgetattr(0,&tio_orig);
15566
3758536dcef3 DragonFly BSD support
diego
parents: 12122
diff changeset
225 #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__) || defined(__DragonFly__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
226 ioctl(0,TIOCGETA,&tio_orig);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
227 #else
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
228 ioctl(0,TCGETS,&tio_orig);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
229 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 tio_new=tio_orig;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 tio_new.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 tio_new.c_cc[VMIN] = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 tio_new.c_cc[VTIME] = 0;
17264
b62c2fdbcde9 AIX PPC port
diego
parents: 17258
diff changeset
234 #if defined(__NetBSD__) || defined(__svr4__) || defined(__CYGWIN__) || defined(__OS2__) || defined(__GLIBC__) || defined(_AIX)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
235 tcsetattr(0,TCSANOW,&tio_new);
15566
3758536dcef3 DragonFly BSD support
diego
parents: 12122
diff changeset
236 #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__) || defined(__DragonFly__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
237 ioctl(0,TIOCSETA,&tio_new);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
238 #else
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
239 ioctl(0,TCSETS,&tio_new);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
240 #endif
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
241 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
242 getch2_status=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17264
diff changeset
245 void getch2_disable(void){
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
246 if(!getch2_status) return; // already disabled / never enabled
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
247 #ifdef HAVE_TERMIOS
17264
b62c2fdbcde9 AIX PPC port
diego
parents: 17258
diff changeset
248 #if defined(__NetBSD__) || defined(__svr4__) || defined(__CYGWIN__) || defined(__OS2__) || defined(__GLIBC__) || defined(_AIX)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
249 tcsetattr(0,TCSANOW,&tio_orig);
15566
3758536dcef3 DragonFly BSD support
diego
parents: 12122
diff changeset
250 #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__) || defined(__DragonFly__)
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
251 ioctl(0,TIOCSETA,&tio_orig);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
252 #else
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 958
diff changeset
253 ioctl(0,TCSETS,&tio_orig);
958
162a78d3cc08 FreeBSD support by Vladimir Kushnir vkushnir@Alfacom.net
arpi_esp
parents: 1
diff changeset
254 #endif
3009
e22bba6cb6a6 added HAVE_TERMIOS
alex
parents: 2089
diff changeset
255 #endif
1632
77cf72182c7f status management
arpi
parents: 1451
diff changeset
256 getch2_status=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258