Skip to content

Mac, Linux, Web で KeyShift, KeyControl, KeyAlt, KeyCommand の挙動がおかしい #1299

Open
@Raclamusi

Description

@Raclamusi

問題

Mac, Linux, Web で KeyShift, KeyControl, KeyAlt, KeyCommand を長押しした時、 .down() が true になり続けます。
また、離した時に .up() が true になりません。

原因

原因は CKeyboard::update() の実装にあると考えられます。
macOS_Linux の CKeyboard.cpp を見ると、問題が発生するキーの InputState::update() を2回呼び出していることが判明しました。

for (auto [index, glfwKey] : detail::KeyConversionTable)
{
const bool pressed = (keys[glfwKey] == GLFW_PRESS);
m_states[index].update(pressed);
}
{
const bool shiftPressed = (keys[GLFW_KEY_LEFT_SHIFT] == GLFW_PRESS) || (keys[GLFW_KEY_RIGHT_SHIFT] == GLFW_PRESS);
m_states[0x10].update(shiftPressed);
}
{
const bool controlPressed = (keys[GLFW_KEY_LEFT_CONTROL] == GLFW_PRESS) || (keys[GLFW_KEY_RIGHT_CONTROL] == GLFW_PRESS);
m_states[0x11].update(controlPressed);
}
{
const bool altPressed = (keys[GLFW_KEY_LEFT_ALT] == GLFW_PRESS) || (keys[GLFW_KEY_RIGHT_ALT] == GLFW_PRESS);
m_states[0x12].update(altPressed);
}
{
const bool commandPressed = (keys[GLFW_KEY_LEFT_SUPER] == GLFW_PRESS) || (keys[GLFW_KEY_RIGHT_SUPER] == GLFW_PRESS);
m_states[0xD8].update(commandPressed);
}

最初の for ループで一度呼び出され、その後個別に2回目の呼び出しが行われています。
for ループ内では、問題になっているキーについては glfwKey == 0 なので、常に .update(false) が呼び出されます。
この .update(false) によって InputState が長押しを認識できず、毎フレーム .down() が true になります。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Investigating

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions