* Called when we get a key press event on a yn window. */ ARGSUSED */
| 2172 | */ |
| 2173 | /* ARGSUSED */ |
| 2174 | static void |
| 2175 | yn_key(Widget w, XEvent *event, String *params, Cardinal *num_params) |
| 2176 | { |
| 2177 | char ch; |
| 2178 | |
| 2179 | if (appResources.slow && !input_func) |
| 2180 | map_input(w, event, params, num_params); |
| 2181 | |
| 2182 | ch = key_event_to_char((XKeyEvent *) event); |
| 2183 | |
| 2184 | if (ch == '\0') { /* don't accept nul char or modifier event */ |
| 2185 | /* no bell */ |
| 2186 | return; |
| 2187 | } |
| 2188 | |
| 2189 | if (!yn_choices /* accept any input */ |
| 2190 | || (yn_no_default && (ch == '\033' || strchr(yn_quitchars, ch)))) { |
| 2191 | yn_return = ch; |
| 2192 | } else { |
| 2193 | if (!yn_preserve_case) |
| 2194 | ch = lowc(ch); /* move to lower case */ |
| 2195 | |
| 2196 | if (ch == '\033') { |
| 2197 | yn_getting_num = FALSE; |
| 2198 | yn_return = yn_esc_map; |
| 2199 | } else if (strchr(yn_quitchars, ch)) { |
| 2200 | yn_return = yn_def; |
| 2201 | } else if (strchr(yn_choices, ch)) { |
| 2202 | if (ch == '#') { |
| 2203 | if (yn_getting_num) { /* don't select again */ |
| 2204 | X11_nhbell(); |
| 2205 | return; |
| 2206 | } |
| 2207 | yn_getting_num = TRUE; |
| 2208 | yn_ndigits = 0; |
| 2209 | yn_val = 0; |
| 2210 | return; /* wait for more input */ |
| 2211 | } |
| 2212 | yn_return = ch; |
| 2213 | if (ch != 'y') |
| 2214 | yn_getting_num = FALSE; |
| 2215 | } else { |
| 2216 | if (yn_getting_num) { |
| 2217 | if (digit(ch)) { |
| 2218 | long dgt = (long) (ch - '0'); |
| 2219 | |
| 2220 | yn_ndigits++; |
| 2221 | /* yn_val = (10 * yn_val) + (ch - '0'); */ |
| 2222 | yn_val = AppendLongDigit(yn_val, dgt); |
| 2223 | if (yn_val < 0L) { |
| 2224 | yn_ndigits = 0; |
| 2225 | yn_val = 0; |
| 2226 | } |
| 2227 | return; /* wait for more input */ |
| 2228 | } |
| 2229 | if (yn_ndigits && (ch == '\b' || ch == 127 /*DEL*/)) { |
| 2230 | yn_ndigits--; |
| 2231 | yn_val = yn_val / 10; |
nothing calls this directly
no test coverage detected