Skip to content

Commit

Permalink
Fix sway_session_lock_has_surface
Browse files Browse the repository at this point in the history
Before this commit, if the cursor is at screen center, and the lock is
swaylock, the cursor would be at swaylock's subsurface(the indicator).

Since it's not the lock surface, `handle_rebase` would refuse to
rebase the cursor to there. Thereby the cursor enter event won't be
sent to swaylock.

This commit fix the issue.
  • Loading branch information
ookami authored and OkamiW committed Nov 22, 2024
1 parent 625127d commit 97c2204
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion sway/lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,11 +331,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

0 comments on commit 97c2204

Please sign in to comment.