载入中...
搜索中...
未找到
EventSink.cpp
浏览该文件的文档.
1// Translates SDL key and text events into engine messages.
2//
3// This lived in the SDL event pump, which had to consult the keyboard module
4// for the key-repeat setting. Owning the translation here removes that edge.
5
6#include "common/Capability.h"
7#include "common/Module.h"
8#include "event/Event.h"
10#include "keyboard/Keyboard.h"
11
12#include <SDL2/SDL_events.h>
13#include <SDL2/SDL_keyboard.h>
14
16namespace {
17
20
21class KeyboardEventSink : public eve::event::IPlatformEventSink {
22public:
23 Message *translatePlatformEvent(const void *nativeEvent) override {
24 const auto &e = *static_cast<const SDL_Event *>(nativeEvent);
25 switch (e.type) {
26 case SDL_KEYDOWN: {
27 // Repeats are dropped unless the module opted into them.
28 if (e.key.repeat) {
29 auto *kb = eve::ModuleManager::getInstance<Keyboard>("Keyboard");
30 if (kb && !kb->hasKeyRepeat()) return nullptr;
31 }
32 const char *keyName = SDL_GetKeyName(e.key.keysym.sym);
33 const char *scanName = SDL_GetScancodeName(e.key.keysym.scancode);
34 return new Message("keypressed",
35 {Variant::makeString(keyName ? keyName : ""),
36 Variant::makeString(scanName ? scanName : ""),
37 Variant::makeInt(e.key.repeat ? 1 : 0)});
38 }
39 case SDL_KEYUP: {
40 const char *keyName = SDL_GetKeyName(e.key.keysym.sym);
41 const char *scanName = SDL_GetScancodeName(e.key.keysym.scancode);
42 return new Message("keyreleased",
43 {Variant::makeString(keyName ? keyName : ""),
44 Variant::makeString(scanName ? scanName : "")});
45 }
46 case SDL_TEXTINPUT:
47 return new Message("textinput", {Variant::makeString(e.text.text)});
48 case SDL_TEXTEDITING:
49 return new Message("textedited", {Variant::makeString(e.edit.text),
50 Variant::makeInt(e.edit.start),
51 Variant::makeInt(e.edit.length)});
52 default:
53 return nullptr;
54 }
55 }
56};
57
58struct Register {
59 Register() {
60 static KeyboardEventSink sink;
63 }
64} g_register;
65
66} // namespace
67} // namespace eve::keyboard::sdl
A named event carrying an ordered list of Variant payloads. Pushed messages are heap-allocated; the q...
Definition Event.h:56
I * query()
Definition Capability.h:77