131 lines
4.3 KiB
C++
131 lines
4.3 KiB
C++
#include "WaylandKeyboard.h"
|
|
|
|
#include "FileLogger.h"
|
|
|
|
#include <unistd.h>
|
|
#include <sys/mman.h>
|
|
|
|
void WaylandKeyboard::keyboardKeymapEvent(void *data, struct wl_keyboard *wl_keyboard, uint32_t format, int32_t fd, uint32_t size)
|
|
{
|
|
auto thisClass = static_cast<WaylandKeyboard*>(data);
|
|
thisClass->onKeymapEvent(wl_keyboard, format, fd, size);
|
|
}
|
|
|
|
void WaylandKeyboard::keyboardEnterEvent(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys)
|
|
{
|
|
(void)wl_keyboard;
|
|
(void)serial;
|
|
(void)surface;
|
|
auto thisClass = static_cast<WaylandKeyboard*>(data);
|
|
thisClass->onEnterEvent(keys);
|
|
}
|
|
|
|
void WaylandKeyboard::keyboardPressedEvent(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state)
|
|
{
|
|
(void)wl_keyboard;
|
|
(void)serial;
|
|
(void)time;
|
|
auto thisClass = static_cast<WaylandKeyboard*>(data);
|
|
thisClass->onPressedEvent(key, state);
|
|
}
|
|
|
|
static void wl_keyboard_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface)
|
|
{
|
|
(void)data;
|
|
(void)wl_keyboard;
|
|
(void)serial;
|
|
(void)surface;
|
|
}
|
|
|
|
static void wl_keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard, int32_t rate, int32_t delay)
|
|
{
|
|
(void)data;
|
|
(void)wl_keyboard;
|
|
(void)rate;
|
|
(void)delay;
|
|
}
|
|
|
|
void WaylandKeyboard::keyboardModifierEvent(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group)
|
|
{
|
|
(void)wl_keyboard;
|
|
(void)serial;
|
|
auto thisClass = static_cast<WaylandKeyboard*>(data);
|
|
thisClass->onKeyboardModifier(mods_depressed, mods_latched, mods_locked, group);
|
|
}
|
|
|
|
void WaylandKeyboard::onKeyboardModifier(uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group)
|
|
{
|
|
xkb_state_update_mask(mXkbState, mods_depressed, mods_latched, mods_locked, 0, 0, group);
|
|
}
|
|
|
|
void WaylandKeyboard::onEnterEvent(struct wl_array *keys)
|
|
{
|
|
(void)keys;
|
|
/*
|
|
char* key;
|
|
wl_array_for_each(key, keys)
|
|
{
|
|
uint32_t* key_type = static_cast<uint32_t*>(key);
|
|
|
|
char buf[128];
|
|
xkb_keysym_t sym = xkb_state_key_get_one_sym(mXkbState, *key_type + 8);
|
|
xkb_keysym_get_name(sym, buf, sizeof(buf));
|
|
//fprintf(stderr, "sym: %-12s (%d), ", buf, sym);
|
|
xkb_state_key_get_utf8(mXkbState, *key_type + 8, buf, sizeof(buf));
|
|
//fprintf(stderr, "utf8: '%s'\n", buf);
|
|
}
|
|
*/
|
|
}
|
|
|
|
void WaylandKeyboard::onPressedEvent(uint32_t key, uint32_t state)
|
|
{
|
|
char buf[128];
|
|
(void)state;
|
|
uint32_t keycode = key + 8;
|
|
xkb_keysym_t sym = xkb_state_key_get_one_sym(mXkbState, keycode);
|
|
xkb_keysym_get_name(sym, buf, sizeof(buf));
|
|
//const char *action = state == WL_KEYBOARD_KEY_STATE_PRESSED ? "press" : "release";
|
|
//fprintf(stderr, "key %s: sym: %-12s (%d), ", action, buf, sym);
|
|
xkb_state_key_get_utf8(mXkbState, keycode, buf, sizeof(buf));
|
|
//fprintf(stderr, "utf8: '%s'\n", buf);
|
|
}
|
|
|
|
void WaylandKeyboard::onKeymapEvent(struct wl_keyboard *wl_keyboard, uint32_t format, int32_t fd, uint32_t size)
|
|
{
|
|
(void)wl_keyboard;
|
|
(void)format;
|
|
// assert(format == WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1);
|
|
char* map_shm = static_cast<char*>(mmap(nullptr, size, PROT_READ, MAP_SHARED, fd, 0));
|
|
// assert(map_shm != MAP_FAILED);
|
|
|
|
struct xkb_keymap* xkb_keymap = xkb_keymap_new_from_string(mXkbContext, map_shm, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
|
munmap(map_shm, size);
|
|
close(fd);
|
|
|
|
struct xkb_state* xkb_state = xkb_state_new(xkb_keymap);
|
|
xkb_keymap_unref(mXkbKeymap);
|
|
xkb_state_unref(mXkbState);
|
|
mXkbKeymap = xkb_keymap;
|
|
mXkbState = xkb_state;
|
|
}
|
|
|
|
WaylandKeyboard::WaylandKeyboard(wl_keyboard* keyboard)
|
|
: mKeyboard(keyboard)
|
|
{
|
|
mXkbContext = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
|
|
|
mKeyboardListener.keymap = keyboardKeymapEvent;
|
|
mKeyboardListener.enter = keyboardEnterEvent;
|
|
mKeyboardListener.key = keyboardPressedEvent;
|
|
mKeyboardListener.leave = wl_keyboard_leave;
|
|
mKeyboardListener.modifiers = keyboardModifierEvent;
|
|
mKeyboardListener.repeat_info = wl_keyboard_repeat_info;
|
|
|
|
wl_keyboard_add_listener(mKeyboard, &mKeyboardListener, this);
|
|
}
|
|
|
|
|
|
WaylandKeyboard::~WaylandKeyboard()
|
|
{
|
|
wl_keyboard_release(mKeyboard);
|
|
}
|