tools/demo-server: split the keymap handling into two functions

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2020-10-21 11:36:09 +10:00
parent 08650b0268
commit 51bec40aa5

View file

@ -85,48 +85,50 @@ DEFINE_UNREF_CLEANUP_FUNC(xkb_state);
#endif
static void
setup_keymap(struct eis_demo_server *server, struct eis_device *device)
setup_server_keymap(struct eis_demo_server *server, struct eis_device *device)
{
#if HAVE_LIBXKBCOMMON
if (server->layout) {
colorprint("Using server layout: %s\n", server->layout);
_unref_(xkb_context) *ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
if (!ctx)
return;
struct xkb_rule_names names = {
.rules = "evdev",
.model = "pc105",
.layout = server->layout,
};
_unref_(xkb_keymap) *keymap = xkb_keymap_new_from_names(ctx, &names, 0);
if (!keymap)
return;
const char *str = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
size_t len = strlen(str) - 1;
struct memfile *f = memfile_new(str, len);
if (!f)
return;
_unref_(eis_keymap) *k = eis_keymap_new(EIS_KEYMAP_TYPE_XKB, memfile_get_fd(f),
memfile_get_size(f));
eis_device_keyboard_set_keymap(device, k);
memfile_unref(f);
_unref_(xkb_state) *state = xkb_state_new(keymap);
if (!state)
return;
server->ctx = steal(&ctx);
server->keymap = steal(&keymap);
server->state = steal(&state);
colorprint("Using server layout: %s\n", server->layout);
_unref_(xkb_context) *ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
if (!ctx)
return;
}
struct xkb_rule_names names = {
.rules = "evdev",
.model = "pc105",
.layout = server->layout,
};
_unref_(xkb_keymap) *keymap = xkb_keymap_new_from_names(ctx, &names, 0);
if (!keymap)
return;
const char *str = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
size_t len = strlen(str) - 1;
struct memfile *f = memfile_new(str, len);
if (!f)
return;
_unref_(eis_keymap) *k = eis_keymap_new(EIS_KEYMAP_TYPE_XKB, memfile_get_fd(f),
memfile_get_size(f));
eis_device_keyboard_set_keymap(device, k);
memfile_unref(f);
_unref_(xkb_state) *state = xkb_state_new(keymap);
if (!state)
return;
server->ctx = steal(&ctx);
server->keymap = steal(&keymap);
server->state = steal(&state);
#endif
}
static void
setup_client_keymap(struct eis_demo_server *server, struct eis_device *device)
{
#if HAVE_LIBXKBCOMMON
struct eis_keymap *keymap = eis_device_keyboard_get_keymap(device);
if (!keymap)
return;
@ -157,6 +159,15 @@ setup_keymap(struct eis_demo_server *server, struct eis_device *device)
#endif
}
static void
setup_keymap(struct eis_demo_server *server, struct eis_device *device)
{
if (server->layout)
setup_server_keymap(server, device);
else
setup_client_keymap(server, device);
}
static void
handle_key(struct eis_demo_server *server, uint32_t keycode, bool is_press)
{