|
3 | 3 |
|
4 | 4 | #include <gf2/graphics/Keyboard.h> |
5 | 5 |
|
| 6 | +#include <memory> |
6 | 7 | #include <type_traits> |
7 | 8 |
|
8 | 9 | #include <SDL3/SDL.h> |
9 | 10 |
|
| 11 | +#include <gf2/core/KeyboardTypes.h> |
| 12 | +#include <gf2/core/Log.h> |
| 13 | + |
10 | 14 | namespace gf { |
11 | 15 |
|
12 | 16 | namespace { |
13 | 17 |
|
| 18 | + static_assert(std::is_same_v<std::underlying_type_t<KeyboardId>, SDL_KeyboardID>); |
14 | 19 | static_assert(std::is_same_v<std::underlying_type_t<Modifier>, SDL_Keymod>); |
15 | 20 | static_assert(std::is_same_v<std::underlying_type_t<Keycode>, SDL_Keycode>); |
16 | 21 | static_assert(std::is_same_v<std::underlying_type_t<Scancode>, std::make_unsigned_t<SDL_Scancode>>); |
@@ -477,8 +482,45 @@ namespace gf { |
477 | 482 | keycode_check<Keycode::Mode, SDLK_MODE>(); |
478 | 483 | } |
479 | 484 |
|
| 485 | + struct KeyboardIdDeleter { |
| 486 | + void operator()(SDL_KeyboardID* ids) |
| 487 | + { |
| 488 | + SDL_free(ids); |
| 489 | + } |
| 490 | + }; |
| 491 | + |
480 | 492 | } // namespace |
481 | 493 |
|
| 494 | + bool Keyboard::connected() |
| 495 | + { |
| 496 | + return SDL_HasKeyboard(); |
| 497 | + } |
| 498 | + |
| 499 | + std::vector<KeyboardId> Keyboard::devices() |
| 500 | + { |
| 501 | + int count = 0; |
| 502 | + std::unique_ptr<SDL_KeyboardID[], KeyboardIdDeleter> raw_devices(SDL_GetKeyboards(&count)); |
| 503 | + |
| 504 | + std::vector<KeyboardId> devices; |
| 505 | + devices.reserve(count); |
| 506 | + |
| 507 | + for (int i = 0; i < count; ++i) { |
| 508 | + devices.push_back(KeyboardId{ raw_devices[i] }); |
| 509 | + } |
| 510 | + |
| 511 | + return devices; |
| 512 | + } |
| 513 | + |
| 514 | + ZString Keyboard::name(KeyboardId id) |
| 515 | + { |
| 516 | + if (const char* name = SDL_GetKeyboardNameForID(static_cast<SDL_KeyboardID>(id)); name != nullptr) { |
| 517 | + return name; |
| 518 | + } |
| 519 | + |
| 520 | + Log::error("Failed to get keyboard name: {}", SDL_GetError()); |
| 521 | + return ""; |
| 522 | + } |
| 523 | + |
482 | 524 | const char* Keyboard::scancode_name(Scancode scancode) |
483 | 525 | { |
484 | 526 | return SDL_GetScancodeName(static_cast<SDL_Scancode>(scancode)); |
|
0 commit comments