diff --git a/include/session-lock.h b/include/session-lock.h index c8961731..715c859f 100644 --- a/include/session-lock.h +++ b/include/session-lock.h @@ -10,6 +10,8 @@ struct server; struct session_lock_manager { struct server *server; struct wlr_session_lock_manager_v1 *wlr_manager; + /* View re-focused on unlock */ + struct view *last_active_view; struct wlr_surface *focused; /* * When not locked: lock=NULL, locked=false diff --git a/src/session-lock.c b/src/session-lock.c index 09b62784..9bb54d1a 100644 --- a/src/session-lock.c +++ b/src/session-lock.c @@ -269,7 +269,14 @@ handle_lock_unlock(struct wl_listener *listener, void *data) wl_container_of(listener, manager, lock_unlock); session_lock_destroy(manager); manager->locked = false; - desktop_focus_topmost_view(manager->server); + + if (manager->last_active_view) { + desktop_focus_view(manager->last_active_view, /* raise */ false); + } else { + desktop_focus_topmost_view(manager->server); + } + manager->last_active_view = NULL; + cursor_update_focus(manager->server); } @@ -309,6 +316,9 @@ handle_new_session_lock(struct wl_listener *listener, void *data) } assert(wl_list_empty(&manager->lock_outputs)); + /* Remember the focused view to restore it on unlock */ + manager->last_active_view = manager->server->active_view; + struct output *output; wl_list_for_each(output, &manager->server->outputs, link) { session_lock_output_create(manager, output); diff --git a/src/view.c b/src/view.c index 1646decd..481ec195 100644 --- a/src/view.c +++ b/src/view.c @@ -2396,6 +2396,10 @@ view_destroy(struct view *view) server->active_view = NULL; } + if (server->session_lock_manager->last_active_view == view) { + server->session_lock_manager->last_active_view = NULL; + } + if (server->last_raised_view == view) { server->last_raised_view = NULL; }