io.c - sam - An updated version of the sam text editor. | |
git clone git://vernunftzentrum.de/sam.git | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
io.c (3057B) | |
--- | |
1 /* Copyright (c) 1998 Lucent Technologies - All rights reserved. */ | |
2 #include <u.h> | |
3 #include <libg.h> | |
4 #include <frame.h> | |
5 #include "flayer.h" | |
6 #include "samterm.h" | |
7 | |
8 int cursorfd; | |
9 int input; | |
10 int got; | |
11 int block; | |
12 Keystroke keystroke; | |
13 int reshaped; | |
14 uint8_t *hostp; | |
15 uint8_t *hoststop; | |
16 uint8_t *externbase; | |
17 uint8_t *externp; | |
18 uint8_t *externstop; | |
19 void panic(char*); | |
20 | |
21 void | |
22 initio(void){ | |
23 extern int exfd; | |
24 | |
25 einit(Emouse|Ekeyboard); | |
26 estart(Ehost, 0, 0, false); | |
27 if (exfd >= 0) | |
28 estart(Eextern, exfd, 8192, true); | |
29 } | |
30 | |
31 void | |
32 frgetmouse(void) | |
33 { | |
34 mouse = emouse(); | |
35 } | |
36 | |
37 void | |
38 mouseunblock(void) | |
39 { | |
40 got &= ~Emouse; | |
41 } | |
42 | |
43 void | |
44 kbdblock(void) | |
45 { /* ca suffit */ | |
46 block = Ekeyboard|Eextern; | |
47 } | |
48 | |
49 int | |
50 button(int but) | |
51 { | |
52 frgetmouse(); | |
53 return mouse.buttons&(1<<(but-1)); | |
54 } | |
55 | |
56 void | |
57 externload(Event *e) | |
58 { | |
59 externbase = malloc(e->n); | |
60 if(externbase == 0) | |
61 return; | |
62 memmove(externbase, e->data, e->n); | |
63 externp = externbase; | |
64 externstop = externbase + e->n; | |
65 got |= Eextern; | |
66 } | |
67 | |
68 int | |
69 waitforio(void) | |
70 { | |
71 uint64_t type; | |
72 static Event e; | |
73 | |
74 if(got & ~block) | |
75 return got & ~block; | |
76 type = eread(~(got|block), &e); | |
77 switch(type){ | |
78 case Ehost: | |
79 hostp = e.data; | |
80 hoststop = hostp + e.n; | |
81 block = 0; | |
82 break; | |
83 case Eextern: | |
84 externload(&e); | |
85 break; | |
86 case Ekeyboard: | |
87 keystroke = e.keystroke; | |
88 break; | |
89 case Emouse: | |
90 mouse = e.mouse; | |
91 break; | |
92 } | |
93 got |= type; | |
94 return got; | |
95 } | |
96 | |
97 int | |
98 rcvchar(void) | |
99 { | |
100 int c; | |
101 | |
102 if(!(got & Ehost)) | |
103 return -1; | |
104 c = *hostp++; | |
105 if(hostp == hoststop) | |
106 got &= ~Ehost; | |
107 return c; | |
108 } | |
109 | |
110 char* | |
111 rcvstring(void) | |
112 { | |
113 *hoststop = 0; | |
114 got &= ~Ehost; | |
115 return (char*)hostp; | |
116 } | |
117 | |
118 int | |
119 getch(void) | |
120 { | |
121 int c; | |
122 | |
123 while((c = rcvchar()) == -1){ | |
124 block = ~Ehost; | |
125 waitforio(); | |
126 block = 0; | |
127 } | |
128 return c; | |
129 } | |
130 | |
131 int | |
132 externchar(void) | |
133 { | |
134 wchar_t r; | |
135 | |
136 loop: | |
137 if(got & (Eextern & ~block)){ | |
138 externp += chartorune(&r, (char*)externp); | |
139 if(externp >= externstop){ | |
140 got &= ~Eextern; | |
141 free(externbase); | |
142 } | |
143 if(r == 0) | |
144 goto loop; | |
145 return r; | |
146 } | |
147 return -1; | |
148 } | |
149 | |
150 Keystroke | |
151 qpeekc(void) | |
152 { | |
153 return keystroke; | |
154 } | |
155 | |
156 Keystroke | |
157 kbdchar(void) | |
158 { | |
159 Keystroke k = {0}; | |
160 static Event e; | |
161 | |
162 k.c = externchar(); | |
163 if(k.c > 0) | |
164 return k; | |
165 if(got & Ekeyboard){ | |
166 k = keystroke; | |
167 memset(&keystroke, 0, sizeof(keystroke)); | |
168 got &= ~Ekeyboard; | |
169 return k; | |
170 } | |
171 while(ecanread(Eextern)){ | |
172 eread(Eextern, &e); | |
173 externload(&e); | |
174 k.c = externchar(); | |
175 if(k.c > 0) | |
176 return k; | |
177 } | |
178 if(!ecankbd()){ | |
179 k.c = -1; | |
180 return k; | |
181 } | |
182 return ekbd(); | |
183 } | |
184 | |
185 void | |
186 ereshaped(Rectangle r) | |
187 { | |
188 reshaped = 1; | |
189 } | |
190 | |
191 int | |
192 RESHAPED(void) | |
193 { | |
194 if(reshaped){ | |
195 screen.r = bscreenrect(&screen.clipr); | |
196 reshaped = 0; | |
197 return 1; | |
198 } | |
199 return 0; | |
200 } | |
201 | |
202 void | |
203 mouseexit(void) | |
204 { | |
205 exit(EXIT_SUCCESS); | |
206 } |