Function to check if key/button/combination is pressed/held bc: button mapping structure just_down: indicates that only new button presses should be logged, not held down block_meta: indicates that key can't be pressed in combination with meta keys if it's not set explicitly, e.g. do not trigger "F1" if "Ctrl+F1" is pressed
| 221 | // if it's not set explicitly, |
| 222 | // e.g. do not trigger "F1" if "Ctrl+F1" is pressed |
| 223 | int DTestButton(ButtConfig *bc, uint8_t just_down, uint8_t block_meta) |
| 224 | { |
| 225 | unsigned int *keys_data = !just_down ? GetKeyboard_nr() : GetKeyboard_jd(); |
| 226 | unsigned int *keys_data_nr = GetKeyboard_nr(); |
| 227 | |
| 228 | for (int x = 0; x < bc->NumC; x++) |
| 229 | { |
| 230 | if (bc->ButtType[x] == BUTTC_KEYBOARD) |
| 231 | { |
| 232 | int cmd = bc->ButtonNum[x]; |
| 233 | int cmdmask = cmd&CMD_KEY_MASK; |
| 234 | |
| 235 | /* test CTRL, SHIFT, ALT, WIN */ |
| 236 | if (cmd & CMD_KEY_ALT) |
| 237 | { |
| 238 | int ctlstate = (cmd & CMD_KEY_LALT) ? keys_data_nr[SCAN_LEFTALT] : 0; |
| 239 | ctlstate |= (cmd & CMD_KEY_RALT) ? keys_data_nr[SCAN_RIGHTALT] : 0; |
| 240 | if (!ctlstate) |
| 241 | continue; |
| 242 | } |
| 243 | else if (block_meta && ((cmdmask != SCAN_LEFTALT && keys_data_nr[SCAN_LEFTALT]) || (cmdmask != SCAN_RIGHTALT && keys_data_nr[SCAN_RIGHTALT]))) |
| 244 | continue; |
| 245 | |
| 246 | if (cmd & CMD_KEY_CTRL) |
| 247 | { |
| 248 | int ctlstate = (cmd & CMD_KEY_LCTRL) ? keys_data_nr[SCAN_LEFTCONTROL] : 0; |
| 249 | ctlstate |= (cmd & CMD_KEY_RCTRL) ? keys_data_nr[SCAN_RIGHTCONTROL] : 0; |
| 250 | if (!ctlstate) |
| 251 | continue; |
| 252 | } |
| 253 | else if (block_meta && ((cmdmask != SCAN_LEFTCONTROL && keys_data_nr[SCAN_LEFTCONTROL]) || (cmdmask != SCAN_RIGHTCONTROL && keys_data_nr[SCAN_RIGHTCONTROL]))) |
| 254 | continue; |
| 255 | |
| 256 | if (cmd & CMD_KEY_SHIFT) |
| 257 | { |
| 258 | int ctlstate = (cmd & CMD_KEY_LSHIFT) ? keys_data_nr[SCAN_LEFTSHIFT] : 0; |
| 259 | ctlstate |= (cmd & CMD_KEY_RSHIFT) ? keys_data_nr[SCAN_RIGHTSHIFT] : 0; |
| 260 | if (!ctlstate) |
| 261 | continue; |
| 262 | } |
| 263 | else if (block_meta && ((cmdmask != SCAN_LEFTSHIFT && keys_data_nr[SCAN_LEFTSHIFT]) || (cmdmask != SCAN_RIGHTSHIFT && keys_data_nr[SCAN_RIGHTSHIFT]))) |
| 264 | continue; |
| 265 | |
| 266 | if (cmd & CMD_KEY_WIN) |
| 267 | { |
| 268 | int ctlstate = (cmd & CMD_KEY_LWIN) ? keys_data_nr[SCAN_LEFTWIN] : 0; |
| 269 | ctlstate |= (cmd & CMD_KEY_RWIN) ? keys_data_nr[SCAN_RIGHTWIN] : 0; |
| 270 | if (!ctlstate) |
| 271 | continue; |
| 272 | } |
| 273 | else if (block_meta && ((cmdmask != SCAN_LEFTWIN && keys_data_nr[SCAN_LEFTWIN]) || (cmdmask != SCAN_RIGHTWIN && keys_data_nr[SCAN_RIGHTWIN]))) |
| 274 | continue; |
| 275 | |
| 276 | if (keys_data[cmdmask]) |
| 277 | { |
| 278 | return 1; |
| 279 | } |
| 280 | } |
no test coverage detected