Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 35 additions & 8 deletions sway/lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ struct sway_session_lock_output {

// invalid if surface is NULL
struct wl_listener surface_destroy;
struct wl_listener surface_map;
struct wl_listener surface_commit;
bool surface_committed;
};

static void focus_surface(struct sway_session_lock *lock,
Expand Down Expand Up @@ -59,12 +60,16 @@ static void refocus_output(struct sway_session_lock_output *output) {
}
}

static void handle_surface_map(struct wl_listener *listener, void *data) {
struct sway_session_lock_output *surf = wl_container_of(listener, surf, surface_map);
static void handle_surface_commit(struct wl_listener *listener, void *data) {
struct sway_session_lock_output *surf = wl_container_of(listener, surf, surface_commit);
if (surf->surface_committed) {
return;
}
if (surf->lock->focused == NULL) {
focus_surface(surf->lock, surf->surface->surface);
}
cursor_rebase_all();
surf->surface_committed = true;
}

static void handle_surface_destroy(struct wl_listener *listener, void *data) {
Expand All @@ -75,7 +80,7 @@ static void handle_surface_destroy(struct wl_listener *listener, void *data) {
sway_assert(output->surface, "Trying to destroy a surface that the lock doesn't think exists");
output->surface = NULL;
wl_list_remove(&output->surface_destroy.link);
wl_list_remove(&output->surface_map.link);
wl_list_remove(&output->surface_commit.link);
}

static void lock_output_reconfigure(struct sway_session_lock_output *output) {
Expand Down Expand Up @@ -123,8 +128,8 @@ static void handle_new_surface(struct wl_listener *listener, void *data) {

lock_output->surface_destroy.notify = handle_surface_destroy;
wl_signal_add(&lock_surface->events.destroy, &lock_output->surface_destroy);
lock_output->surface_map.notify = handle_surface_map;
wl_signal_add(&lock_surface->surface->events.map, &lock_output->surface_map);
lock_output->surface_commit.notify = handle_surface_commit;
wl_signal_add(&lock_surface->surface->events.commit, &lock_output->surface_commit);

lock_output_reconfigure(lock_output);
}
Expand All @@ -133,7 +138,7 @@ static void sway_session_lock_output_destroy(struct sway_session_lock_output *ou
if (output->surface) {
refocus_output(output);
wl_list_remove(&output->surface_destroy.link);
wl_list_remove(&output->surface_map.link);
wl_list_remove(&output->surface_commit.link);
}

wl_list_remove(&output->destroy.link);
Expand Down Expand Up @@ -237,6 +242,8 @@ static void handle_unlock(struct wl_listener *listener, void *data) {

// Views are now visible, so check if we need to activate inhibition again.
sway_idle_inhibit_v1_check_active();

cursor_rebase_all();
}

static void handle_abandon(struct wl_listener *listener, void *data) {
Expand Down Expand Up @@ -332,11 +339,31 @@ void sway_session_lock_add_output(struct sway_session_lock *lock,
}
}

struct is_lock_surface_data {
struct wlr_surface *surface;
bool is_lock_surface;
};

static void is_lock_surface(struct wlr_surface *surface, int sx, int sy, void *data) {
struct is_lock_surface_data *is_lock_surface_data = data;
if (is_lock_surface_data->surface == surface) {
is_lock_surface_data->is_lock_surface = true;
}
}

bool sway_session_lock_has_surface(struct sway_session_lock *lock,
struct wlr_surface *surface) {
struct sway_session_lock_output *lock_output;
wl_list_for_each(lock_output, &lock->outputs, link) {
if (lock_output->surface && lock_output->surface->surface == surface) {
if (!lock_output->surface) {
continue;
}
struct is_lock_surface_data data = {
.surface = surface,
.is_lock_surface = false,
};
wlr_surface_for_each_surface(lock_output->surface->surface, is_lock_surface, &data);
if (data.is_lock_surface) {
return true;
}
}
Expand Down