diff --git a/clients/window.c b/clients/window.c
index d3b7d6961608b905abd72abd163e679a98ce8740..18295ffa8bf7f02c1a88251d6a2450b2ca6197af 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -44,9 +44,7 @@
 
 
 #include <xkbcommon/xkbcommon.h>
-#ifdef HAVE_XKBCOMMON_COMPOSE
 #include <xkbcommon/xkbcommon-compose.h>
-#endif
 #include <wayland-cursor.h>
 
 #include <linux/input.h>
@@ -400,10 +398,8 @@ struct input {
 	struct {
 		struct xkb_keymap *keymap;
 		struct xkb_state *state;
-#ifdef HAVE_XKBCOMMON_COMPOSE
 		struct xkb_compose_table *compose_table;
 		struct xkb_compose_state *compose_state;
-#endif
 		xkb_mod_mask_t control_mask;
 		xkb_mod_mask_t alt_mask;
 		xkb_mod_mask_t shift_mask;
@@ -3102,10 +3098,8 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
 	struct input *input = data;
 	struct xkb_keymap *keymap;
 	struct xkb_state *state;
-#ifdef HAVE_XKBCOMMON_COMPOSE
 	struct xkb_compose_table *compose_table;
 	struct xkb_compose_state *compose_state;
-#endif
 	char *locale;
 	char *map_str;
 
@@ -3153,7 +3147,6 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
 				locale = "C";
 
 	/* Set up XKB compose table */
-#ifdef HAVE_XKBCOMMON_COMPOSE
 	compose_table =
 		xkb_compose_table_new_from_locale(input->display->xkb_context,
 						  locale,
@@ -3177,7 +3170,6 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
 		fprintf(stderr, "could not create XKB compose table for locale '%s'.  "
 			"Disabiling compose\n", locale);
 	}
-#endif
 
 	xkb_keymap_unref(input->xkb.keymap);
 	xkb_state_unref(input->xkb.state);
@@ -3228,7 +3220,6 @@ keyboard_handle_leave(void *data, struct wl_keyboard *keyboard,
 static xkb_keysym_t
 process_key_press(xkb_keysym_t sym, struct input *input)
 {
-#ifdef HAVE_XKBCOMMON_COMPOSE
 	if (!input->xkb.compose_state)
 		return sym;
 	if (sym == XKB_KEY_NoSymbol)
@@ -3249,9 +3240,6 @@ process_key_press(xkb_keysym_t sym, struct input *input)
 	default:
 		return sym;
 	}
-#else
-	return sym;
-#endif
 }
 
 static void
diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h
index d1e7587d595602956c428022c2904a683b22356e..e9d0d59e7f4a305e00754f8a9a5f15f03ab294c3 100644
--- a/include/libweston/libweston.h
+++ b/include/libweston/libweston.h
@@ -110,6 +110,10 @@ enum weston_led {
 	LED_NUM_LOCK = (1 << 0),
 	LED_CAPS_LOCK = (1 << 1),
 	LED_SCROLL_LOCK = (1 << 2),
+#ifdef HAVE_COMPOSE_AND_KANA
+	LED_COMPOSE = (1 << 3),
+	LED_KANA = (1 << 4),
+#endif
 };
 
 enum weston_mode_aspect_ratio {
@@ -1229,6 +1233,10 @@ struct weston_xkb_info {
 	xkb_led_index_t num_led;
 	xkb_led_index_t caps_led;
 	xkb_led_index_t scroll_led;
+#ifdef HAVE_COMPOSE_AND_KANA
+	xkb_led_index_t compose_led;
+	xkb_led_index_t kana_led;
+#endif
 };
 
 struct weston_keyboard {
diff --git a/libweston/input.c b/libweston/input.c
index 0aee74d28360cb9da91a4f8e50070581204eaf29..379ab1b4a6314d430b49451ee4837b09d8a011f9 100644
--- a/libweston/input.c
+++ b/libweston/input.c
@@ -2525,6 +2525,14 @@ notify_modifiers(struct weston_seat *seat, uint32_t serial)
 	if (xkb_state_led_index_is_active(keyboard->xkb_state.state,
 					  keyboard->xkb_info->scroll_led))
 		leds |= LED_SCROLL_LOCK;
+#ifdef HAVE_COMPOSE_AND_KANA
+	if (xkb_state_led_index_is_active(keyboard->xkb_state.state,
+					  keyboard->xkb_info->compose_led))
+		leds |= LED_COMPOSE;
+	if (xkb_state_led_index_is_active(keyboard->xkb_state.state,
+					  keyboard->xkb_info->kana_led))
+		leds |= LED_KANA;
+#endif
 	if (leds != keyboard->xkb_state.leds && seat->led_update)
 		seat->led_update(seat, leds);
 	keyboard->xkb_state.leds = leds;
@@ -4017,6 +4025,12 @@ weston_xkb_info_create(struct xkb_keymap *keymap)
 						      XKB_LED_NAME_CAPS);
 	xkb_info->scroll_led = xkb_keymap_led_get_index(xkb_info->keymap,
 							XKB_LED_NAME_SCROLL);
+#ifdef HAVE_COMPOSE_AND_KANA
+	xkb_info->compose_led = xkb_keymap_led_get_index(xkb_info->keymap,
+							XKB_LED_NAME_COMPOSE);
+	xkb_info->kana_led = xkb_keymap_led_get_index(xkb_info->keymap,
+							XKB_LED_NAME_KANA);
+#endif
 
 	keymap_string = xkb_keymap_get_as_string(xkb_info->keymap,
 							   XKB_KEYMAP_FORMAT_TEXT_V1);
diff --git a/libweston/libinput-device.c b/libweston/libinput-device.c
index 31b88ac43c3af0e5047739452d4d6549dcb83bb3..ac1f990787ebaed7be5702b40c89d9001abd55c0 100644
--- a/libweston/libinput-device.c
+++ b/libweston/libinput-device.c
@@ -63,7 +63,12 @@ evdev_led_update(struct evdev_device *device, enum weston_led weston_leds)
 		leds |= LIBINPUT_LED_CAPS_LOCK;
 	if (weston_leds & LED_SCROLL_LOCK)
 		leds |= LIBINPUT_LED_SCROLL_LOCK;
-
+#ifdef HAVE_COMPOSE_AND_KANA
+	if (weston_leds & LED_COMPOSE)
+		leds |= LIBINPUT_LED_COMPOSE;
+	if (weston_leds & LED_KANA)
+		leds |= LIBINPUT_LED_KANA;
+#endif
 	libinput_device_led_update(device->device, leds);
 }
 
diff --git a/meson.build b/meson.build
index 6e516c390c94788b70c397ab204271b58c0bf39b..13fff0fe0099508eb8c246f8fc32b37c260606e7 100644
--- a/meson.build
+++ b/meson.build
@@ -149,15 +149,17 @@ if not get_option('backend-' + backend_default)
 	error('Backend @0@ was chosen as native but is not being built.'.format(backend_default))
 endif
 
-dep_xkbcommon = dependency('xkbcommon', version: '>= 0.3.0')
-if dep_xkbcommon.version().version_compare('>= 0.5.0')
-	config_h.set('HAVE_XKBCOMMON_COMPOSE', '1')
-endif
-
 dep_wayland_server = dependency('wayland-server', version: '>= 1.22.0')
 dep_wayland_client = dependency('wayland-client', version: '>= 1.22.0')
 dep_pixman = dependency('pixman-1', version: '>= 0.25.2')
+dep_xkbcommon = dependency('xkbcommon', version: '>= 0.5.0')
 dep_libinput = dependency('libinput', version: '>= 1.2.0')
+if dep_xkbcommon.version().version_compare('>= 1.8.0')
+	if dep_libinput.version().version_compare('>= 1.26.0')
+		config_h.set('HAVE_COMPOSE_AND_KANA', '1')
+	endif
+endif
+
 dep_libevdev = dependency('libevdev')
 dep_libm = cc.find_library('m')
 dep_libdl = cc.find_library('dl')