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 | - | ||