| 205 | |
| 206 | |
| 207 | ResultType InputObject::KeyOpt(ResultToken &aResultToken, int aID, int aFlags, ExprTokenType *aParam[], int aParamCount) |
| 208 | { |
| 209 | _f_param_string(keys, 0); |
| 210 | _f_param_string(options, 1); |
| 211 | |
| 212 | bool adding = true; |
| 213 | UCHAR flag, add_flags = 0, remove_flags = 0; |
| 214 | for (LPTSTR cp = options; *cp; ++cp) |
| 215 | { |
| 216 | switch (ctoupper(*cp)) |
| 217 | { |
| 218 | case '+': adding = true; continue; |
| 219 | case '-': adding = false; continue; |
| 220 | case ' ': case '\t': continue; |
| 221 | case 'E': flag = END_KEY_ENABLED; break; |
| 222 | case 'I': flag = INPUT_KEY_IGNORE_TEXT; break; |
| 223 | case 'N': flag = INPUT_KEY_NOTIFY; break; |
| 224 | case 'S': |
| 225 | flag = INPUT_KEY_SUPPRESS; |
| 226 | if (adding) |
| 227 | remove_flags |= INPUT_KEY_VISIBLE; |
| 228 | break; |
| 229 | case 'V': |
| 230 | flag = INPUT_KEY_VISIBLE; |
| 231 | if (adding) |
| 232 | remove_flags |= INPUT_KEY_SUPPRESS; |
| 233 | break; |
| 234 | case 'Z': // Zero (reset) |
| 235 | add_flags = 0; |
| 236 | remove_flags = INPUT_KEY_OPTION_MASK; |
| 237 | continue; |
| 238 | default: _o_throw_value(ERR_INVALID_OPTION, cp); |
| 239 | } |
| 240 | if (adding) |
| 241 | add_flags |= flag; // Add takes precedence over remove, so remove_flags isn't changed. |
| 242 | else |
| 243 | { |
| 244 | remove_flags |= flag; |
| 245 | add_flags &= ~flag; // Override any previous add. |
| 246 | } |
| 247 | } |
| 248 | |
| 249 | if (!_tcsicmp(keys, _T("{All}"))) |
| 250 | { |
| 251 | // Could optimize by using memset() when remove_flags == 0xFF, but that doesn't seem |
| 252 | // worthwhile since this mode is already faster than SetKeyFlags() with a single key. |
| 253 | for (int i = 0; i < _countof(input.KeyVK); ++i) |
| 254 | input.KeyVK[i] = (input.KeyVK[i] & ~remove_flags) | add_flags; |
| 255 | for (int i = 0; i < _countof(input.KeySC); ++i) |
| 256 | input.KeySC[i] = (input.KeySC[i] & ~remove_flags) | add_flags; |
| 257 | return OK; |
| 258 | } |
| 259 | |
| 260 | return input.SetKeyFlags(keys, false, remove_flags, add_flags); |
| 261 | } |
nothing calls this directly
no test coverage detected