| 8677 | } |
| 8678 | |
| 8679 | static int inputdevice_translatekeycode_2 (int keyboard, int scancode, int keystate, bool qualifiercheckonly, bool ignorecanrelease) |
| 8680 | { |
| 8681 | struct uae_input_device *na = &keyboards[keyboard]; |
| 8682 | int j, k; |
| 8683 | int handled = 0; |
| 8684 | bool didcustom = false; |
| 8685 | |
| 8686 | if (!keyboards || scancode < 0) |
| 8687 | return handled; |
| 8688 | |
| 8689 | j = 0; |
| 8690 | while (j < MAX_INPUT_DEVICE_EVENTS && na->extra[j] >= 0) { |
| 8691 | if (na->extra[j] == scancode) { |
| 8692 | bool qualonly; |
| 8693 | uae_u64 qualmask[MAX_INPUT_SUB_EVENT]; |
| 8694 | getqualmask (qualmask, na, j, &qualonly); |
| 8695 | |
| 8696 | if (qualonly) |
| 8697 | qualifiercheckonly = true; |
| 8698 | for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) {/* send key release events in reverse order */ |
| 8699 | uae_u64 *flagsp = &na->flags[j][sublevdir[keystate == 0 ? 1 : 0][k]]; |
| 8700 | int evt = na->eventid[j][sublevdir[keystate == 0 ? 1 : 0][k]]; |
| 8701 | uae_u64 flags = *flagsp; |
| 8702 | int autofire = (flags & ID_FLAG_AUTOFIRE) ? 1 : 0; |
| 8703 | int toggle = (flags & ID_FLAG_TOGGLE) ? 1 : 0; |
| 8704 | int inverttoggle = (flags & ID_FLAG_INVERTTOGGLE) ? 1 : 0; |
| 8705 | int invert = (flags & ID_FLAG_INVERT) ? 1 : 0; |
| 8706 | int setmode = (flags & ID_FLAG_SET_ONOFF) ? 1: 0; |
| 8707 | int setvalval = (flags & (ID_FLAG_SET_ONOFF_VAL1 | ID_FLAG_SET_ONOFF_VAL2)); |
| 8708 | int setval = setvalval == (ID_FLAG_SET_ONOFF_VAL1 | ID_FLAG_SET_ONOFF_VAL2) ? SET_ONOFF_PRESSREL_VALUE : |
| 8709 | (setvalval == ID_FLAG_SET_ONOFF_VAL2 ? SET_ONOFF_PRESS_VALUE : (setvalval == ID_FLAG_SET_ONOFF_VAL1 ? SET_ONOFF_ON_VALUE : SET_ONOFF_OFF_VALUE)); |
| 8710 | int toggled; |
| 8711 | int state; |
| 8712 | int ie_flags = na->port[j][sublevdir[keystate == 0 ? 1 : 0][k]] == 0 ? HANDLE_IE_FLAG_ALLOWOPPOSITE : 0; |
| 8713 | |
| 8714 | if (keystate < 0) { |
| 8715 | state = keystate; |
| 8716 | } else if (invert) { |
| 8717 | state = keystate ? 0 : 1; |
| 8718 | } else { |
| 8719 | state = keystate; |
| 8720 | } |
| 8721 | if (setmode) { |
| 8722 | if (state || setval == SET_ONOFF_PRESS_VALUE || setval == SET_ONOFF_PRESSREL_VALUE) |
| 8723 | state = setval | (keystate ? 1 : 0); |
| 8724 | } |
| 8725 | |
| 8726 | setqualifiers (evt, state > 0); |
| 8727 | |
| 8728 | if (qualifiercheckonly) { |
| 8729 | if (!state && (flags & ID_FLAG_CANRELEASE)) { |
| 8730 | *flagsp &= ~ID_FLAG_CANRELEASE; |
| 8731 | handle_input_event (evt, state, 1, (autofire ? HANDLE_IE_FLAG_AUTOFIRE : 0) | HANDLE_IE_FLAG_CANSTOPPLAYBACK | ie_flags); |
| 8732 | if (k == 0) { |
| 8733 | process_custom_event (na, j, state, qualmask, autofire, k); |
| 8734 | } |
| 8735 | } |
| 8736 | continue; |
no test coverage detected