When recognizing a new keyboard enable or disable Num Lock.
Default is on.
+*<keyboard layoutScope="">* [global|window]
+ Stores the keyboard layout either globally or per window and restores
+ it when switching back to the window. Default is global.
+
*<keyboard><keybind key="" layoutDependent="">*
Define a *key* binding in the format *modifier-key*, where supported
modifiers are:
-->
<keyboard>
<numlock>on</numlock>
+ <layoutScope>global</layoutScope>
<repeatRate>25</repeatRate>
<repeatDelay>600</repeatDelay>
<keybind key="A-Tab">
int repeat_rate;
int repeat_delay;
bool kb_numlock_enable;
+ bool kb_layout_per_window;
struct wl_list keybinds; /* struct keybind.link */
/* mouse */
#define LABWC_KEYBOARD_H
#include <stdbool.h>
+#include <xkbcommon/xkbcommon.h>
struct seat;
struct keyboard;
void keyboard_setup_handlers(struct keyboard *keyboard);
void keyboard_set_numlock(struct wlr_keyboard *keyboard);
+void keyboard_update_layout(struct seat *seat, xkb_layout_index_t layout);
void keyboard_cancel_keybind_repeat(struct keyboard *keyboard);
bool keyboard_any_modifiers_pressed(struct wlr_keyboard *keyboard);
#include <wlr/types/wlr_virtual_pointer_v1.h>
#include <wlr/types/wlr_virtual_keyboard_v1.h>
#include <wlr/util/log.h>
-#include <xkbcommon/xkbcommon.h>
#include "config/keybind.h"
#include "config/rcxml.h"
#include "input/cursor.h"
#include <stdint.h>
#include <wayland-util.h>
#include <wlr/util/box.h>
+#include <xkbcommon/xkbcommon.h>
#define LAB_MIN_VIEW_WIDTH 100
#define LAB_MIN_VIEW_HEIGHT 60
bool fullscreen;
enum view_edge tiled;
bool inhibits_keybinds;
+ xkb_layout_index_t keyboard_layout;
/* Pointer to an output owned struct region, may be NULL */
struct region *tiled_region;
rc.repeat_delay = atoi(content);
} else if (!strcasecmp(nodename, "numlock.keyboard")) {
set_bool(content, &rc.kb_numlock_enable);
+ } else if (!strcasecmp(nodename, "layoutScope.keyboard")) {
+ /*
+ * This can be changed to an enum later on
+ * if we decide to also support "application".
+ */
+ rc.kb_layout_per_window = !strcasecmp(content, "window");
} else if (!strcasecmp(nodename, "screenEdgeStrength.resistance")) {
rc.screen_edge_strength = atoi(content);
} else if (!strcasecmp(nodename, "range.snapping")) {
rc.repeat_rate = 25;
rc.repeat_delay = 600;
rc.kb_numlock_enable = true;
+ rc.kb_layout_per_window = false;
rc.screen_edge_strength = 20;
rc.snap_edge_range = 1;
}
}
}
+ wlr_seat_set_keyboard(seat->seat, wlr_keyboard);
wlr_seat_keyboard_notify_modifiers(seat->seat, &wlr_keyboard->modifiers);
}
struct seat *seat = keyboard->base.seat;
struct wlr_keyboard_key_event *event = data;
struct wlr_seat *wlr_seat = seat->seat;
- struct wlr_keyboard *wlr_keyboard = keyboard->wlr_keyboard;
idle_manager_notify_activity(seat->seat);
/* any new press/release cancels current keybind repeat */
start_keybind_repeat(seat->server, keyboard, event);
}
} else {
- wlr_seat_set_keyboard(wlr_seat, wlr_keyboard);
+ wlr_seat_set_keyboard(wlr_seat, keyboard->wlr_keyboard);
wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,
event->keycode, event->state);
}
keyboard->modifiers.latched, locked, keyboard->modifiers.group);
}
+void
+keyboard_update_layout(struct seat *seat, xkb_layout_index_t layout)
+{
+ assert(seat);
+
+ struct input *input;
+ struct keyboard *keyboard;
+ struct wlr_keyboard *kb = NULL;
+
+ /* We are not using wlr_seat_get_keyboard() here because it might be a virtual one */
+ wl_list_for_each(input, &seat->inputs, link) {
+ if (input->wlr_input_device->type != WLR_INPUT_DEVICE_KEYBOARD) {
+ continue;
+ }
+ keyboard = (struct keyboard *)input;
+ if (keyboard->is_virtual) {
+ continue;
+ }
+ kb = keyboard->wlr_keyboard;
+ break;
+ }
+ if (!kb) {
+ wlr_log(WLR_INFO, "Restoring kb layout failed: no physical keyboard found");
+ return;
+ }
+ if (kb->modifiers.group == layout) {
+ return;
+ }
+
+ /* By updating a member of the keyboard group, all members of the group will get updated */
+ wlr_log(WLR_DEBUG, "Updating group layout to %u", layout);
+ wlr_keyboard_notify_modifiers(kb, kb->modifiers.depressed,
+ kb->modifiers.latched, kb->modifiers.locked, layout);
+}
+
void
keyboard_init(struct seat *seat)
{
#include "common/match.h"
#include "common/mem.h"
#include "common/scene-helpers.h"
+#include "input/keyboard.h"
#include "labwc.h"
#include "menu/menu.h"
#include "regions.h"
wlr_foreign_toplevel_handle_v1_set_activated(
view->toplevel.handle, activated);
}
+
+ if (rc.kb_layout_per_window) {
+ if (!activated) {
+ /* Store configured keyboard layout per view */
+ view->keyboard_layout =
+ view->server->seat.keyboard_group->keyboard.modifiers.group;
+ } else {
+ /* Switch to previously stored keyboard layout */
+ keyboard_update_layout(&view->server->seat, view->keyboard_layout);
+ }
+ }
}
void