如何正确处理 SDL2 中的控制键组合

Ste*_*ntz 6 keyboard-events sdl-2

在我基于SDL 2.0的应用程序中,我想同时处理Control +Control =

我知道我可以处理该SDL_KEYDOWN事件并SDLK_EQUALS结合KEYMODE_CTRL. 甚至检查KEYMOD_SHIFT' to distinguish between+ and=`。然而,这不是可移植的,并且会破坏键盘,因为这些符号映射到不同的键。

我尝试过的另一件事是启用SDL_StartTextInput()然后监听SDL_TEXTINPUT事件。但是,这只适用于可打印字符。它完全忽略控制序列。

执行此操作的正确方法是什么?我看到SDL 1.2实际上在结构unicode中有一个字段SDL_Keysym。这肯定会让我变得更容易。有谁知道为什么删除它以及SDL 2.0中的等效项是什么?

kel*_*tar 7

以下是如何获取 unicode 输入作为 SDL_TEXTINPUT 而其余部分作为 SDL_KEYDOWN 的示例:

#include "SDL.h"
#include <stdio.h>

int main(int argc, char *argv[]) {
    int done = 0;
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window *w = SDL_CreateWindow("foo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
            640, 480, 0);

    int lctrl = 0, rctrl = 0;

    SDL_StartTextInput();
    while (!done) {
        SDL_Event event;
        while(SDL_PollEvent(&event)) {
            switch (event.type) {
            case SDL_QUIT:
                done = 1;
                break;
            case SDL_TEXTINPUT: {
                int ctrl_state = lctrl || rctrl;
                printf("%s, ctrl %s\n", event.text.text, (ctrl_state) ? "pressed" : "released");
            } break;
            case SDL_KEYDOWN:
                if(event.key.keysym.sym == SDLK_RCTRL) { rctrl = 1; }
                else if(event.key.keysym.sym == SDLK_LCTRL) { lctrl = 1; }
                break;
            case SDL_KEYUP:
                if(event.key.keysym.sym == SDLK_RCTRL) { rctrl = 0; }
                else if(event.key.keysym.sym == SDLK_LCTRL) { lctrl = 0; }
                break;
            }
        }
        SDL_UpdateWindowSurface(w);
    }

    SDL_Quit();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为了简化事情,它忽略了 SDL_TEXTEDITING,这可能是(也不是)您想要的。也SDL_GetKeyboardState可以用来代替手动处理事件和累积修饰键标志,具有相同的结果。