opt: sync keymap to xwayland after xwayland ready

This commit is contained in:
DreamMaoMao 2026-02-08 12:13:04 +08:00
parent f33cb859f5
commit 63c356afc0
2 changed files with 16 additions and 7 deletions

View file

@ -908,9 +908,7 @@ int32_t switch_keyboard_layout(const Arg *arg) {
uint32_t latched = keyboard->modifiers.latched; uint32_t latched = keyboard->modifiers.latched;
uint32_t locked = keyboard->modifiers.locked; uint32_t locked = keyboard->modifiers.locked;
wlr_keyboard_set_keymap(keyboard, keyboard->keymap);
wlr_keyboard_notify_modifiers(keyboard, depressed, latched, locked, next); wlr_keyboard_notify_modifiers(keyboard, depressed, latched, locked, next);
keyboard->modifiers.group = 0;
// 7. 更新 seat // 7. 更新 seat
wlr_seat_set_keyboard(seat, keyboard); wlr_seat_set_keyboard(seat, keyboard);
@ -924,10 +922,7 @@ int32_t switch_keyboard_layout(const Arg *arg) {
struct wlr_keyboard *tkb = (struct wlr_keyboard *)id->device_data; struct wlr_keyboard *tkb = (struct wlr_keyboard *)id->device_data;
wlr_keyboard_set_keymap(tkb, keyboard->keymap);
wlr_keyboard_notify_modifiers(tkb, depressed, latched, locked, next); wlr_keyboard_notify_modifiers(tkb, depressed, latched, locked, next);
tkb->modifiers.group = 0;
// 7. 更新 seat // 7. 更新 seat
wlr_seat_set_keyboard(seat, tkb); wlr_seat_set_keyboard(seat, tkb);
wlr_seat_keyboard_notify_modifiers(seat, &tkb->modifiers); wlr_seat_keyboard_notify_modifiers(seat, &tkb->modifiers);

View file

@ -736,6 +736,7 @@ static void set_rect_size(struct wlr_scene_rect *rect, int32_t width,
static Client *center_tiled_select(Monitor *m); static Client *center_tiled_select(Monitor *m);
static void handlecursoractivity(void); static void handlecursoractivity(void);
static int32_t hidecursor(void *data); static int32_t hidecursor(void *data);
static int32_t synckeymap(void *data);
static bool check_hit_no_border(Client *c); static bool check_hit_no_border(Client *c);
static void reset_keyboard_layout(void); static void reset_keyboard_layout(void);
static void client_update_oldmonname_record(Client *c, Monitor *m); static void client_update_oldmonname_record(Client *c, Monitor *m);
@ -886,6 +887,7 @@ struct dvec2 *baked_points_opafadein;
struct dvec2 *baked_points_opafadeout; struct dvec2 *baked_points_opafadeout;
static struct wl_event_source *hide_source; static struct wl_event_source *hide_source;
static struct wl_event_source *sync_keymap;
static bool cursor_hidden = false; static bool cursor_hidden = false;
static bool tag_combo = false; static bool tag_combo = false;
static const char *cli_config_path = NULL; static const char *cli_config_path = NULL;
@ -5278,7 +5280,8 @@ void setup(void) {
&request_set_cursor_shape); &request_set_cursor_shape);
hide_source = wl_event_loop_add_timer(wl_display_get_event_loop(dpy), hide_source = wl_event_loop_add_timer(wl_display_get_event_loop(dpy),
hidecursor, cursor); hidecursor, cursor);
sync_keymap = wl_event_loop_add_timer(wl_display_get_event_loop(dpy),
synckeymap, NULL);
/* /*
* Configures a seat, which is a single "seat" at which a user sits and * Configures a seat, which is a single "seat" at which a user sits and
* operates the computer. This conceptually includes up to one keyboard, * operates the computer. This conceptually includes up to one keyboard,
@ -5502,6 +5505,13 @@ int32_t hidecursor(void *data) {
return 1; return 1;
} }
int32_t synckeymap(void *data) {
reset_keyboard_layout();
// we only need to sync keymap once
wl_event_source_timer_update(sync_keymap, 0);
return 1;
}
void unlocksession(struct wl_listener *listener, void *data) { void unlocksession(struct wl_listener *listener, void *data) {
SessionLock *lock = wl_container_of(listener, lock, unlock); SessionLock *lock = wl_container_of(listener, lock, unlock);
destroylock(lock, 1); destroylock(lock, 1);
@ -6097,13 +6107,17 @@ void xwaylandready(struct wl_listener *listener, void *data) {
wlr_xwayland_set_seat(xwayland, seat); wlr_xwayland_set_seat(xwayland, seat);
/* Set the default XWayland cursor to match the rest of dwl. */ /* Set the default XWayland cursor to match the rest of dwl. */
if ((xcursor = wlr_xcursor_manager_get_xcursor(cursor_mgr, "default", 1))) { if ((xcursor = wlr_xcursor_manager_get_xcursor(cursor_mgr, "default", 1))) {
struct wlr_xcursor_image *image = xcursor->images[0]; struct wlr_xcursor_image *image = xcursor->images[0];
struct wlr_buffer *buffer = wlr_xcursor_image_get_buffer(image); struct wlr_buffer *buffer = wlr_xcursor_image_get_buffer(image);
wlr_xwayland_set_cursor(xwayland, buffer, xcursor->images[0]->hotspot_x, wlr_xwayland_set_cursor(xwayland, buffer, xcursor->images[0]->hotspot_x,
xcursor->images[0]->hotspot_y); xcursor->images[0]->hotspot_y);
} }
/* xwayland can't auto sync the keymap, so we do it manually
and we need to wait the xwayland completely inited
*/
wl_event_source_timer_update(sync_keymap, 500);
} }
static void setgeometrynotify(struct wl_listener *listener, void *data) { static void setgeometrynotify(struct wl_listener *listener, void *data) {