bool CharacterAfter(void) { const bool consumed = false; switch (ultramod.machine.state) { case NORMAL_STATE: break; case HELD_STATE: // The user typing any character commits him to the "momentary" state if (ultramod.event.pressed) ultramod.machine.state = MOMENTARY_STATE; break; case MOMENTARY_STATE: break; case ONE_SHOT_STATE: // This character was the one-shot character. Return to normal. if (ultramod.event.pressed) SetNormalState(); break; case LOCKED_STATE: break; } return consumed; }
VOID CDXCtrlButton::SetCheckState(BOOL bChecked) { if(m_bCheck) { if(m_bChecked != bChecked) { SetPushedState(); m_bChecked = bChecked; SetNormalState(); } } }
BOOL CDXCtrlButton::OnMouseMove(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if(m_bClicked) { if(HitTest(LOWORD(lParam), HIWORD(lParam))) SetPushedState(); else SetNormalState(); return TRUE; } return FALSE; }
void UltramodMatrixScan(void) { const uint16_t now = timer_read(); switch (ultramod.machine.state) { case NORMAL_STATE: break; case HELD_STATE: break; case MOMENTARY_STATE: break; case ONE_SHOT_STATE: { const bool oneShotTimedOut = TimedOut(now, ultramod.machine.lastActionTime, ultramod.settings.oneShotTimeout); if (oneShotTimedOut) SetNormalState(); } break; case LOCKED_STATE: { const bool lockTimedOut = TimedOut(now, ultramod.machine.lastActionTime, ultramod.settings.lockedTimeout); if (lockTimedOut) SetNormalState(); } break; } UltramodSetLeds(); }
BOOL CDXCtrlButton::OnLeftButtonUp(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if(m_bClicked) { m_bClicked = FALSE; if(m_bPushed) { if(m_bCheck) m_bChecked ^= TRUE; SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(m_dwId, BN_CLICKED), (LPARAM)this); } SetNormalState(); if(m_bRepeat && m_bCheck == FALSE) KillTimer(hwnd, IDT_REPEAT); return TRUE; } return FALSE; }
BOOL CDXCtrlButton::OnTimer(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if(wParam == IDT_REPEAT && m_bPushed) { KillTimer(hwnd, IDT_REPEAT); if(m_bEnabled) { SetTimer(hwnd, IDT_REPEAT, 25, NULL); SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(m_dwId, BN_CLICKED), (LPARAM)this); } else { SetNormalState(); m_bClicked = FALSE; } return TRUE; } return FALSE; }
bool ModifierBefore(void) { bool consumed = false; // Make sure modifier chord matches exactly // if (ultramod.machine.modifierBit != get_mods()) // return; switch (ultramod.machine.state) { case NORMAL_STATE: if (ultramod.event.pressed) { ultramod.machine.modifierKey = ultramod.event.pKeyRecord->event.key; ultramod.machine.state = HELD_STATE; consumed = true; } break; case HELD_STATE: if (ultramod.event.released) { const bool tooLateForSingleTap = TimedOut(ultramod.event.time, ultramod.machine.modifierPressedTime, ultramod.settings.singleTapTimeout); if (tooLateForSingleTap) { SetNormalState(); } else { ultramod.machine.lastActionTime = ultramod.event.time; ultramod.machine.state = ONE_SHOT_STATE; } consumed = true; } break; case MOMENTARY_STATE: if (ultramod.event.released) { SetNormalState(); consumed = true; } break; case ONE_SHOT_STATE: if (ultramod.event.pressed) { const bool oneShotTimedOut = TimedOut(ultramod.event.time, ultramod.machine.modifierReleasedTime, ultramod.settings.doubleTapTimeout); if (oneShotTimedOut) SetNormalState(); else ultramod.machine.state = LOCKED_STATE; consumed = true; } break; case LOCKED_STATE: if (ultramod.event.pressed) { SetNormalState(); consumed = true; } break; } // todo: Why does this state not stick? if (ultramod.machine.state != NORMAL_STATE) { add_mods(ultramod.machine.modifierBit); layer_on(ultramod.machine.layer); } return consumed; }