2017-01-10 62 views
1

手柄控制鍵組合在我SDL 2.0基礎的應用,我想同時處理Control +Control =如何正確SDL2

據我所知,我可以處理SDL_KEYDOWN事件,並尋找SDLK_EQUALS鍵碼與KEYMODE_CTRL的組合。甚至檢查KEYMOD_SHIFT' to distinguish between + and =`。但是,這不是可移植的,並且在那些符號被映射到不同鍵的鍵盤上斷開。

我試過的另一件事是啓用SDL_StartTextInput(),然後聽SDL_TEXTINPUT事件。但是,只適用於可打印的字符。它完全忽略了控制序列。

這樣做的正確方法是什麼?我看到SDL 1.2實際上在SDL_Keysym結構中有一個unicode字段。這肯定會讓我更容易。有誰知道爲什麼這被刪除,什麼等效於SDL 2.0會是什麼?

+0

我認爲它被文本輸入事件所取代,看看https://wiki.libsdl.org/Tutorials/TextInput – keltar

+0

@keltar問題在於TextInput吞下控制鍵。它只適用於可打印字符。我可以閱讀代碼,看看它是如何在內部工作,也許構建類似的東西,但我寧願不這樣做。 –

+0

但是如果它不是輸入序列的一部分,你仍然有ctrl的keydown事件,所以你可以將兩者結合起來。 – keltar

回答

0

下面是一個例子,你如何能得到的unicode輸入作爲SDL_TEXTINPUT但其餘爲SDL_KEYDOWN:

#include "SDL.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; 
} 

爲了簡化問題,卻忽視了SDL_TEXTEDITING,你想要什麼可以(或不)。也可以使用SDL_GetKeyboardState來代替手動處理事件並累積修飾符鍵標誌,結果相同。