diff options
author | Nicholas Rishel <rishel.nick@gmail.com> | 2022-05-07 09:33:59 +0300 |
---|---|---|
committer | Nicholas Rishel <rishel.nick@gmail.com> | 2022-06-04 19:39:32 +0300 |
commit | e230ccaf8c3b62f8c1a322d525084226136578ba (patch) | |
tree | cf2d246346ea1dd5025efa09f59191e33ac37836 | |
parent | db5ffdd1a4964aacf586249a8ee98fd1c58e7344 (diff) |
Fix Wintab button tracking logic.
Shifted flag for buttons changed was incorrectly compared with
unshifted packet flag to determine button press state.
Also fix button tracking storage; button flags are 32 bits whereas the
member variable was 8.
Differential Revision: https://developer.blender.org/D14915
-rw-r--r-- | intern/ghost/intern/GHOST_Wintab.cpp | 19 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_Wintab.h | 2 |
2 files changed, 9 insertions, 12 deletions
diff --git a/intern/ghost/intern/GHOST_Wintab.cpp b/intern/ghost/intern/GHOST_Wintab.cpp index 974a07db9c3..b136acbe098 100644 --- a/intern/ghost/intern/GHOST_Wintab.cpp +++ b/intern/ghost/intern/GHOST_Wintab.cpp @@ -310,7 +310,7 @@ void GHOST_Wintab::getInput(std::vector<GHOST_WintabInfoWin32> &outWintabInfo) outWintabInfo.reserve(numPackets); for (int i = 0; i < numPackets; i++) { - PACKET pkt = m_pkts[i]; + const PACKET pkt = m_pkts[i]; GHOST_WintabInfoWin32 out; /* % 3 for multiple devices ("DualTrack"). */ @@ -367,11 +367,12 @@ void GHOST_Wintab::getInput(std::vector<GHOST_WintabInfoWin32> &outWintabInfo) /* Some Wintab libraries don't handle relative button input, so we track button presses * manually. */ DWORD buttonsChanged = m_buttons ^ pkt.pkButtons; - WORD buttonIndex = 0; + /* We only needed the prior button state to compare to current, so we can overwrite it now. */ + m_buttons = pkt.pkButtons; - while (buttonsChanged) { + /* Iterate over button flag indices until all flags are clear. */ + for (WORD buttonIndex = 0; buttonsChanged; buttonIndex++, buttonsChanged >>= 1) { if (buttonsChanged & 1) { - /* Find the index for the changed button from the button map. */ GHOST_TButtonMask button = mapWintabToGhostButton(pkt.pkCursor, buttonIndex); if (button != GHOST_kButtonMaskNone) { @@ -381,15 +382,11 @@ void GHOST_Wintab::getInput(std::vector<GHOST_WintabInfoWin32> &outWintabInfo) } out.button = button; - out.type = buttonsChanged & pkt.pkButtons ? GHOST_kEventButtonDown : - GHOST_kEventButtonUp; - } - m_buttons ^= 1 << buttonIndex; + DWORD buttonFlag = 1 << buttonIndex; + out.type = pkt.pkButtons & buttonFlag ? GHOST_kEventButtonDown : GHOST_kEventButtonUp; + } } - - buttonsChanged >>= 1; - buttonIndex++; } outWintabInfo.push_back(out); diff --git a/intern/ghost/intern/GHOST_Wintab.h b/intern/ghost/intern/GHOST_Wintab.h index 86a0143ecc0..80eacf1f3fa 100644 --- a/intern/ghost/intern/GHOST_Wintab.h +++ b/intern/ghost/intern/GHOST_Wintab.h @@ -187,7 +187,7 @@ class GHOST_Wintab { bool m_focused = false; /** Pressed button map. */ - uint8_t m_buttons = 0; + DWORD m_buttons = 0; /** Range of a coordinate space. */ struct Range { |