载入中...
搜索中...
未找到
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 "keyboard/Keyboard.h"
11
12#include <SDL2/SDL_events.h>
13#include <SDL2/SDL_keyboard.h>
14
16namespace {
17
20
21eve::keyboard::Keyboard *g_owner = nullptr;
22
23class KeyboardEventSink : public eve::platform_event::IPlatformEventSink {
24public:
25 Message *translatePlatformEvent(const void *nativeEvent) override {
26 const auto &e = *static_cast<const SDL_Event *>(nativeEvent);
27 switch (e.type) {
28 case SDL_KEYDOWN: {
29 // Repeats are dropped unless the module opted into them.
30 if (e.key.repeat) {
31 if (g_owner && !g_owner->hasKeyRepeat()) return nullptr;
32 }
33 const char *keyName = SDL_GetKeyName(e.key.keysym.sym);
34 const char *scanName = SDL_GetScancodeName(e.key.keysym.scancode);
35 return new Message("keypressed",
36 {Variant::makeString(keyName ? keyName : ""),
37 Variant::makeString(scanName ? scanName : ""),
38 Variant::makeInt(e.key.repeat ? 1 : 0)});
39 }
40 case SDL_KEYUP: {
41 const char *keyName = SDL_GetKeyName(e.key.keysym.sym);
42 const char *scanName = SDL_GetScancodeName(e.key.keysym.scancode);
43 return new Message("keyreleased",
44 {Variant::makeString(keyName ? keyName : ""),
45 Variant::makeString(scanName ? scanName : "")});
46 }
47 case SDL_TEXTINPUT:
48 return new Message("textinput", {Variant::makeString(e.text.text)});
49 case SDL_TEXTEDITING:
50 return new Message("textedited", {Variant::makeString(e.edit.text),
51 Variant::makeInt(e.edit.start),
52 Variant::makeInt(e.edit.length)});
53 default:
54 return nullptr;
55 }
56 }
57};
58
59struct Register {
60 Register() {
61 static KeyboardEventSink sink;
62 eve::cap::addListener<eve::platform_event::IPlatformEventSink>(&sink,
64 }
65} g_register;
66
67} // namespace
68
69void bindKeyboardEventSinkOwner(eve::keyboard::Keyboard *owner) noexcept { g_owner = owner; }
70
71} // namespace eve::keyboard::sdl
Keyboard input. Key / scancode names follow SDL naming (SDL_GetKeyName / SDL_GetScancodeName),...
Definition Keyboard.h:15
virtual bool hasKeyRepeat() const =0
True when key-repeat events are enabled.
EVENGINE_API_FOUNDATION public API.
A named event carrying an ordered list of Variant payloads. Pushed messages are heap-allocated; the q...
void bindKeyboardEventSinkOwner(eve::keyboard::Keyboard *owner) noexcept
Bind the live Keyboard module into the SDL event sink. @ownership Borrowed; cleared when the Keyboard...
Definition EventSink.cpp:69