diff --git a/include/labwc.h b/include/labwc.h index 8d7c5eb7..df9e8012 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -221,7 +221,7 @@ void view_unminimize(struct view *view); void view_for_each_surface(struct view *view, wlr_surface_iterator_func_t iterator, void *user_data); -void desktop_focus_view(struct view *view); +void desktop_focus_view(struct seat *seat, struct view *view); /** * desktop_next_view - return next view diff --git a/src/cursor.c b/src/cursor.c index c9931915..ab909e24 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -248,7 +248,7 @@ cursor_button(struct wl_listener *listener, void *data) server->cursor_mode = LAB_CURSOR_PASSTHROUGH; } else { /* Focus that client if the button was _pressed_ */ - desktop_focus_view(view); + desktop_focus_view(&server->seat, view); switch (view_area) { case LAB_DECO_BUTTON_CLOSE: view->impl->close(view); diff --git a/src/desktop.c b/src/desktop.c index 1f0db9db..371432f8 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -64,43 +64,31 @@ set_activated(struct wlr_surface *surface, bool activated) } } -static void -focus_view(struct view *view) -{ - struct server *server = view->server; - struct wlr_seat *wlr_seat = server->seat.seat; - struct wlr_surface *prev_surface; - prev_surface = wlr_seat->keyboard_state.focused_surface; - if (prev_surface == view->surface) { - /* Don't re-focus an already focused surface. */ - return; - } - if (prev_surface) { - set_activated(prev_surface, false); - } - - move_to_front(view); - set_activated(view->surface, true); - - struct wlr_keyboard *kb = &server->seat.keyboard_group->keyboard; - wlr_seat_keyboard_notify_enter(wlr_seat, view->surface, kb->keycodes, - kb->num_keycodes, &kb->modifiers); - - move_xwayland_sub_views_to_front(view); -} - void -desktop_focus_view(struct view *view) +desktop_focus_view(struct seat *seat, struct view *view) { if (!view) { - seat_focus_surface(view->server->seat.seat, NULL); + seat_focus_surface(seat->seat, NULL); return; } if (view->minimized) { - /* this will unmap and focus */ + /* this will unmap and then focus */ view_unminimize(view); + return; } else if (view->mapped) { - focus_view(view); + struct wlr_surface *prev_surface; + prev_surface = seat->seat->keyboard_state.focused_surface; + if (prev_surface == view->surface) { + /* Don't re-focus an already focused surface. */ + return; + } + if (prev_surface) { + set_activated(prev_surface, false); + } + move_to_front(view); + set_activated(view->surface, true); + seat_focus_surface(seat->seat, view->surface); + move_xwayland_sub_views_to_front(view); } } @@ -187,7 +175,7 @@ desktop_focus_next_mapped_view(struct view *current) { assert(current); struct view *view = desktop_next_mapped_view(current); - desktop_focus_view(view); + desktop_focus_view(¤t->server->seat, view); } static bool diff --git a/src/keyboard.c b/src/keyboard.c index 496d328b..45d64184 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -52,7 +52,7 @@ keyboard_key_notify(struct wl_listener *listener, void *data) if ((syms[0] == XKB_KEY_Alt_L) && event->state == WLR_KEY_RELEASED) { /* end cycle */ - desktop_focus_view(server->cycle_view); + desktop_focus_view(&server->seat, server->cycle_view); server->cycle_view = NULL; } else if (event->state == WLR_KEY_PRESSED) { /* cycle to next */ diff --git a/src/xdg.c b/src/xdg.c index e48e4985..265dff56 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -195,7 +195,7 @@ xdg_toplevel_view_map(struct view *view) &view->commit); view->commit.notify = handle_commit; - desktop_focus_view(view); + desktop_focus_view(&view->server->seat, view); } static void diff --git a/src/xwayland.c b/src/xwayland.c index 413a5815..174e6db6 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -112,7 +112,7 @@ map(struct view *view) &view->commit); view->commit.notify = handle_commit; - desktop_focus_view(view); + desktop_focus_view(&view->server->seat, view); } static void