#include <sys/mman.h>
#include <assert.h>
#include <unistd.h>
+#include <fcntl.h>
#include "../shared/os-compatibility.h"
#include "compositor.h"
{
enum xkb_key_direction direction;
+ /* Keyboard modifiers don't exist in raw keyboard mode */
+ if (!seat->compositor->use_xkbcommon)
+ return;
+
if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
direction = XKB_KEY_DOWN;
else
wl_list_insert(&seat->keyboard->resource_list, wl_resource_get_link(cr));
wl_resource_set_destructor(cr, unbind_resource);
- wl_keyboard_send_keymap(cr, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
- seat->xkb_info.keymap_fd,
- seat->xkb_info.keymap_size);
+ if (seat->compositor->use_xkbcommon) {
+ wl_keyboard_send_keymap(cr, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
+ seat->xkb_info.keymap_fd,
+ seat->xkb_info.keymap_size);
+ } else {
+ int null_fd = open("/dev/null", O_RDONLY);
+ wl_keyboard_send_keymap(cr, WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP,
+ null_fd,
+ 0);
+ close(null_fd);
+ }
if (seat->keyboard->focus &&
wl_resource_get_client(seat->keyboard->focus->resource) == client) {
weston_compositor_xkb_init(struct weston_compositor *ec,
struct xkb_rule_names *names)
{
+ /*
+ * If we're operating in raw keyboard mode, libxkbcommon isn't used and
+ * shouldn't be initialized.
+ */
+ if (!ec->use_xkbcommon)
+ return 0;
+
if (ec->xkb_context == NULL) {
ec->xkb_context = xkb_context_new(0);
if (ec->xkb_context == NULL) {
void
weston_compositor_xkb_destroy(struct weston_compositor *ec)
{
+ /*
+ * If we're operating in raw keyboard mode, we never initialized
+ * libxkbcommon so there's no cleanup to do either.
+ */
+ if (!ec->use_xkbcommon)
+ return;
+
free((char *) ec->xkb_names.rules);
free((char *) ec->xkb_names.model);
free((char *) ec->xkb_names.layout);
if (seat->keyboard)
return 0;
- if (keymap != NULL) {
- seat->xkb_info.keymap = xkb_map_ref(keymap);
- if (weston_xkb_info_new_keymap(&seat->xkb_info) < 0)
- return -1;
- } else {
- if (weston_compositor_build_global_keymap(seat->compositor) < 0)
+
+ if (seat->compositor->use_xkbcommon) {
+ if (keymap != NULL) {
+ seat->xkb_info.keymap = xkb_map_ref(keymap);
+ if (weston_xkb_info_new_keymap(&seat->xkb_info) < 0)
+ return -1;
+ } else {
+ if (weston_compositor_build_global_keymap(seat->compositor) < 0)
+ return -1;
+ seat->xkb_info = seat->compositor->xkb_info;
+ seat->xkb_info.keymap = xkb_map_ref(seat->xkb_info.keymap);
+ }
+
+ seat->xkb_state.state = xkb_state_new(seat->xkb_info.keymap);
+ if (seat->xkb_state.state == NULL) {
+ weston_log("failed to initialise XKB state\n");
return -1;
- seat->xkb_info = seat->compositor->xkb_info;
- seat->xkb_info.keymap = xkb_map_ref(seat->xkb_info.keymap);
- }
+ }
- seat->xkb_state.state = xkb_state_new(seat->xkb_info.keymap);
- if (seat->xkb_state.state == NULL) {
- weston_log("failed to initialise XKB state\n");
- return -1;
+ seat->xkb_state.leds = 0;
}
- seat->xkb_state.leds = 0;
-
keyboard = weston_keyboard_create();
if (keyboard == NULL) {
weston_log("failed to allocate weston keyboard struct\n");
wl_list_remove(&seat->link);
/* The global object is destroyed at wl_display_destroy() time. */
- if (seat->xkb_state.state != NULL)
- xkb_state_unref(seat->xkb_state.state);
- xkb_info_destroy(&seat->xkb_info);
+ if (seat->compositor->use_xkbcommon) {
+ if (seat->xkb_state.state != NULL)
+ xkb_state_unref(seat->xkb_state.state);
+ xkb_info_destroy(&seat->xkb_info);
+ }
if (seat->pointer)
weston_pointer_destroy(seat->pointer);