struct wl_keyboard *keyboard = NULL;
struct xkb_context *xkb_context;
+struct xkb_keymap *keymap;
+
+unsigned int has_keymap = 0;
+unsigned int set_keymap = 0;
// wl_registry listener
static void handle_global(void *, struct wl_registry *, unsigned int, const char *, unsigned int);
static void
keyboard_keymap(void *data, struct wl_keyboard *keyboard, unsigned int format, int fd, unsigned int size)
{
- (void) keyboard;
- (void) format;
- (void) fd;
- (void) size;
+ char *map = NULL;
+
+ LOGD("...WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1=%d, WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP=%d\n",
+ WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1, WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP);
+ LOGD("... format=%d, fd=%d, size=%d\n", format, fd, size);
+
+ if (!xkb_context)
+ {
+ LOGE("... This client failed to make xkb context\n");
+ close(fd);
+ return;
+ }
+ if (format == WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP)
+ {
+ has_keymap = 0;
+ }
+ else
+ {
+ LOGD("wl_keyboard has keymap...\n");
+ map = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
+ if(map == MAP_FAILED)
+ {
+ LOGE("... Failed to mmap from fd(%d) size(%d)\n", fd, size);
+ close(fd);
+ return;
+ }
+
+ keymap = xkb_map_new_from_string(xkb_context, map, XKB_KEYMAP_FORMAT_TEXT_V1, 0);
+ if(!keymap) {
+ LOGE("... Failed to get keymap from fd(%d)\n", fd);
+ munmap(map, size);
+ close(fd);
+ return;
+ }
+
+ munmap(map, size);
+ close(fd);
+ has_keymap = 1;
+ }
+
+ LOGD("has_keymap = %s\n", has_keymap ? "true" : "false");
+ set_keymap = 1;
}
static void
(void) surface;
}
+static int
+covert_kernel_keycode_to_user_keycode(int kernel_keycode)
+{
+ LOGD("kernel keycode : %d, user keycode : %d\n", kernel_keycode, kernel_keycode+8);
+ return (kernel_keycode+8);
+}
+
static void
keyboard_key(void *data, struct wl_keyboard *keyboard, unsigned int serial, unsigned int timestamp, unsigned int keycode, unsigned int state)
{
- (void) keyboard;
- (void) serial;
- (void) timestamp;
- (void) keycode;
- (void) state;
+ int user_keycode = covert_kernel_keycode_to_user_keycode(keycode);
+
+ LOGD("... serial=%d, time=%d, key=%d, state=%d\n", serial, timestamp, user_keycode, state);
+ if (!has_keymap)
+ {
+ //TODO : do anything with the given keycode
+ // ex> call application callback(s)
+ LOGD("keycode : %d, state : %d, timestamp : %d\n", user_keycode, state, timestamp);
+ }
+ else
+ {
+ LOGD("has_keymap | keycode : %d, state : %d, timestamp : %d\n", user_keycode, state, timestamp);
+ if(keymap)
+ {
+ const char * name = NULL;
+ if((name = xkb_keymap_key_get_name(keymap, user_keycode)))
+ LOGD("key name = %s, keycode = %d\n", name, user_keycode);
+ else
+ LOGD("No matched keyname from keycode = %d\n", user_keycode);
+ }
+ }
}
static void
}
wl_registry_add_listener(registry, ®istry_listener, NULL);
- wl_display_dispatch(display);
+ while(!set_keymap)
+ wl_display_roundtrip(display);
}
void _wl_shutdown(void)