Rev 4488 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4488 | Rev 4515 | ||
---|---|---|---|
Line 34... | Line 34... | ||
34 | * |
34 | * |
35 | * @(#)input.c 8.1 (Berkeley) 5/31/93 |
35 | * @(#)input.c 8.1 (Berkeley) 5/31/93 |
36 | */ |
36 | */ |
37 | 37 | ||
38 | /** @addtogroup tetris |
38 | /** @addtogroup tetris |
39 | * @{ |
39 | * @{ |
40 | */ |
40 | */ |
41 | /** @file |
41 | /** @file |
42 | */ |
42 | */ |
43 | 43 | ||
44 | /* |
44 | /* |
Line 90... | Line 90... | ||
90 | * If tvp is nil, wait forever, but return if select is interrupted. |
90 | * If tvp is nil, wait forever, but return if select is interrupted. |
91 | * |
91 | * |
92 | * Return 0 => no input, 1 => can read() from stdin |
92 | * Return 0 => no input, 1 => can read() from stdin |
93 | * |
93 | * |
94 | */ |
94 | */ |
95 | int |
- | |
96 | rwait(struct timeval *tvp) |
95 | int rwait(struct timeval *tvp) |
97 | { |
96 | { |
98 | struct timeval starttv, endtv, *s; |
97 | struct timeval starttv, endtv, *s; |
99 | static ipc_call_t charcall; |
98 | static ipc_call_t charcall; |
100 | ipcarg_t rc; |
99 | ipcarg_t rc; |
101 | 100 | ||
102 | /* |
101 | /* |
103 | * Someday, select() will do this for us. |
102 | * Someday, select() will do this for us. |
104 | * Just in case that day is now, and no one has |
103 | * Just in case that day is now, and no one has |
105 | * changed this, we use a temporary. |
104 | * changed this, we use a temporary. |
106 | */ |
105 | */ |
Line 108... | Line 107... | ||
108 | (void) gettimeofday(&starttv, NULL); |
107 | (void) gettimeofday(&starttv, NULL); |
109 | endtv = *tvp; |
108 | endtv = *tvp; |
110 | s = &endtv; |
109 | s = &endtv; |
111 | } else |
110 | } else |
112 | s = NULL; |
111 | s = NULL; |
113 | 112 | ||
114 | if (!lastchar) { |
113 | if (!lastchar) { |
115 | again: |
114 | again: |
116 | if (!getchar_inprog) { |
115 | if (!getchar_inprog) { |
117 | getchar_inprog = async_send_0(fphone(stdin), |
116 | getchar_inprog = async_send_0(fphone(stdin), |
118 | CONSOLE_GET_EVENT, &charcall); |
117 | CONSOLE_GET_EVENT, &charcall); |
119 | } |
118 | } |
- | 119 | ||
120 | if (!s) |
120 | if (!s) |
121 | async_wait_for(getchar_inprog, &rc); |
121 | async_wait_for(getchar_inprog, &rc); |
122 | else if (async_wait_timeout(getchar_inprog, &rc, s->tv_usec) == ETIMEOUT) { |
122 | else if (async_wait_timeout(getchar_inprog, &rc, s->tv_usec) == ETIMEOUT) { |
123 | tvp->tv_sec = 0; |
123 | tvp->tv_sec = 0; |
124 | tvp->tv_usec = 0; |
124 | tvp->tv_usec = 0; |
125 | return (0); |
125 | return (0); |
126 | } |
126 | } |
- | 127 | ||
127 | getchar_inprog = 0; |
128 | getchar_inprog = 0; |
128 | if (rc) { |
129 | if (rc) |
129 | stop("end of file, help"); |
130 | stop("end of file, help"); |
130 | } |
131 | |
131 | if (IPC_GET_ARG1(charcall) == KEY_RELEASE) |
132 | if (IPC_GET_ARG1(charcall) == KEY_RELEASE) |
132 | goto again; |
133 | goto again; |
133 | 134 | ||
134 | lastchar = IPC_GET_ARG4(charcall); |
135 | lastchar = IPC_GET_ARG4(charcall); |
135 | } |
136 | } |
- | 137 | ||
136 | if (tvp) { |
138 | if (tvp) { |
137 | /* since there is input, we may not have timed out */ |
139 | /* since there is input, we may not have timed out */ |
138 | (void) gettimeofday(&endtv, NULL); |
140 | (void) gettimeofday(&endtv, NULL); |
139 | TV_SUB(&endtv, &starttv); |
141 | TV_SUB(&endtv, &starttv); |
140 | TV_SUB(tvp, &endtv); /* adjust *tvp by elapsed time */ |
142 | TV_SUB(tvp, &endtv); /* adjust *tvp by elapsed time */ |
141 | } |
143 | } |
- | 144 | ||
142 | return (1); |
145 | return 1; |
143 | } |
146 | } |
144 | 147 | ||
145 | /* |
148 | /* |
146 | * `sleep' for the current turn time (using select). |
149 | * `sleep' for the current turn time (using select). |
147 | * Eat any input that might be available. |
150 | * Eat any input that might be available. |
148 | */ |
151 | */ |
149 | void |
- | |
150 | tsleep(void) |
152 | void tsleep(void) |
151 | { |
153 | { |
152 | struct timeval tv; |
154 | struct timeval tv; |
153 | 155 | ||
154 | tv.tv_sec = 0; |
156 | tv.tv_sec = 0; |
155 | tv.tv_usec = fallrate; |
157 | tv.tv_usec = fallrate; |
156 | while (TV_POS(&tv)) |
158 | while (TV_POS(&tv)) |
157 | if (rwait(&tv)) { |
159 | if (rwait(&tv)) { |
158 | lastchar = '\0'; |
160 | lastchar = '\0'; |
Line 161... | Line 163... | ||
161 | } |
163 | } |
162 | 164 | ||
163 | /* |
165 | /* |
164 | * getchar with timeout. |
166 | * getchar with timeout. |
165 | */ |
167 | */ |
166 | int |
- | |
167 | tgetchar(void) |
168 | int tgetchar(void) |
168 | { |
169 | { |
169 | static struct timeval timeleft; |
170 | static struct timeval timeleft; |
170 | char c; |
171 | char c; |
171 | 172 | ||
172 | /* |
173 | /* |
173 | * Reset timeleft to fallrate whenever it is not positive. |
174 | * Reset timeleft to fallrate whenever it is not positive. |
174 | * In any case, wait to see if there is any input. If so, |
175 | * In any case, wait to see if there is any input. If so, |
175 | * take it, and update timeleft so that the next call to |
176 | * take it, and update timeleft so that the next call to |
176 | * tgetchar() will not wait as long. If there is no input, |
177 | * tgetchar() will not wait as long. If there is no input, |
177 | * make timeleft zero or negative, and return -1. |
178 | * make timeleft zero or negative, and return -1. |
178 | * |
179 | * |
179 | * Most of the hard work is done by rwait(). |
180 | * Most of the hard work is done by rwait(). |
180 | */ |
181 | */ |
181 | if (!TV_POS(&timeleft)) { |
182 | if (!TV_POS(&timeleft)) { |
182 | faster(); /* go faster */ |
183 | faster(); /* go faster */ |
183 | timeleft.tv_sec = 0; |
184 | timeleft.tv_sec = 0; |
184 | timeleft.tv_usec = fallrate; |
185 | timeleft.tv_usec = fallrate; |
185 | } |
186 | } |
- | 187 | ||
186 | if (!rwait(&timeleft)) |
188 | if (!rwait(&timeleft)) |
187 | return (-1); |
189 | return -1; |
- | 190 | ||
188 | c = lastchar; |
191 | c = lastchar; |
189 | lastchar = '\0'; |
192 | lastchar = '\0'; |
190 | return ((int)(unsigned char)c); |
193 | return ((int) (unsigned char) c); |
191 | } |
194 | } |
192 | 195 | ||
193 | /** @} |
196 | /** @} |
194 | */ |
197 | */ |
195 | - |