Compare commits

...

5 Commits

Author SHA1 Message Date
Alexander Orzechowski e4807696f3
Merge 972fcc60df into 646019cad9 2024-04-25 19:37:57 +03:00
Kenny Levinsen 646019cad9 desktop/output: Fix check if config should be stored
We want to check if a config_head existed for the current
matched_output_config, so we should check cfg->output. sway_output is a
temporary variable from a previous wl_list_for_each, and does not
contain anything useful to us.

Fixes: https://github.com/swaywm/sway/issues/8128
2024-04-23 13:31:30 +02:00
Kenny Levinsen ffcde7a70c server: Use wlr_renderer_get_texture_formats
wlr_renderer_get_{dmabuf|shm}_texture_formats have been replaced by a
unified wlr_renderer_get_texture_formats interface using buffer caps.

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4644
2024-04-21 17:19:33 +02:00
Alexander Orzechowski 972fcc60df layer_shell: Ensure keyboard exclusive clients remain focused 2024-03-02 18:48:03 -05:00
Alexander Orzechowski 1800b1266b seat: Drop has_exclusive_layer
We can just check if the current focused layer has exclusive input.
2024-03-02 18:48:03 -05:00
5 changed files with 33 additions and 22 deletions

View File

@ -99,8 +99,6 @@ struct sway_seat {
char *prev_workspace_name; // for workspace back_and_forth char *prev_workspace_name; // for workspace back_and_forth
struct wlr_layer_surface_v1 *focused_layer; struct wlr_layer_surface_v1 *focused_layer;
// If the exclusive layer is set, views cannot receive keyboard focus
bool has_exclusive_layer;
// Last touch point // Last touch point
int32_t touch_id; int32_t touch_id;

View File

@ -233,19 +233,33 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) {
wlr_scene_node_reparent(&surface->scene->tree->node, output_layer); wlr_scene_node_reparent(&surface->scene->tree->node, output_layer);
} }
bool commit = false;
if (layer_surface->initial_commit || committed || layer_surface->surface->mapped != surface->mapped) { if (layer_surface->initial_commit || committed || layer_surface->surface->mapped != surface->mapped) {
surface->mapped = layer_surface->surface->mapped; surface->mapped = layer_surface->surface->mapped;
arrange_layers(surface->output); arrange_layers(surface->output);
commit = true;
}
if (layer_surface->current.keyboard_interactive ==
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
struct sway_seat *seat;
wl_list_for_each(seat, &server.input->seats, link) {
seat_set_focus_layer(seat, layer_surface);
}
commit = true;
}
if (commit) {
transaction_commit_dirty(); transaction_commit_dirty();
} }
} }
static void handle_map(struct wl_listener *listener, void *data) { static void handle_map(struct wl_listener *listener, void *data) {
struct sway_layer_surface *surface = wl_container_of(listener, struct sway_layer_surface *surface = wl_container_of(listener, surface, map);
surface, map); struct wlr_layer_surface_v1 *layer_surface = surface->scene->layer_surface;
struct wlr_layer_surface_v1 *layer_surface = bool exclusive = layer_surface->current.keyboard_interactive ==
surface->scene->layer_surface; ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE;
// focus on new surface // focus on new surface
if (layer_surface->current.keyboard_interactive && if (layer_surface->current.keyboard_interactive &&
@ -254,12 +268,15 @@ static void handle_map(struct wl_listener *listener, void *data) {
struct sway_seat *seat; struct sway_seat *seat;
wl_list_for_each(seat, &server.input->seats, link) { wl_list_for_each(seat, &server.input->seats, link) {
// but only if the currently focused layer has a lower precedence // but only if the currently focused layer has a lower precedence
if (!seat->focused_layer || if (!seat->focused_layer || exclusive || (
seat->focused_layer->current.layer >= layer_surface->current.layer) { seat->focused_layer->current.keyboard_interactive !=
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE &&
seat->focused_layer->current.layer >= layer_surface->current.layer)) {
seat_set_focus_layer(seat, layer_surface); seat_set_focus_layer(seat, layer_surface);
} }
} }
arrange_layers(surface->output); arrange_layers(surface->output);
transaction_commit_dirty();
} }
cursor_rebase_all(); cursor_rebase_all();

View File

@ -619,7 +619,7 @@ static void output_manager_apply(struct sway_server *server,
if (!test_only && ok) { if (!test_only && ok) {
struct wlr_output_configuration_head_v1 *config_head; struct wlr_output_configuration_head_v1 *config_head;
wl_list_for_each(config_head, &config->heads, link) { wl_list_for_each(config_head, &config->heads, link) {
if (config_head->state.output == sway_output->wlr_output) { if (config_head->state.output == cfg->output->wlr_output) {
store_config = true; store_config = true;
break; break;
} }

View File

@ -1264,13 +1264,15 @@ static void seat_set_workspace_focus(struct sway_seat *seat, struct sway_node *n
} }
void seat_set_focus(struct sway_seat *seat, struct sway_node *node) { void seat_set_focus(struct sway_seat *seat, struct sway_node *node) {
struct wlr_layer_surface_v1 *layer = seat->focused_layer;
// Prevents the layer from losing focus if it has keyboard exclusivity // Prevents the layer from losing focus if it has keyboard exclusivity
if (seat->has_exclusive_layer) { if (layer && layer->current.keyboard_interactive ==
struct wlr_layer_surface_v1 *layer = seat->focused_layer; ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
seat_set_focus_layer(seat, NULL); seat_set_focus_layer(seat, NULL);
seat_set_workspace_focus(seat, node); seat_set_workspace_focus(seat, node);
seat_set_focus_layer(seat, layer); seat_set_focus_layer(seat, layer);
} else if (seat->focused_layer) { } else if (layer) {
seat_set_focus_layer(seat, NULL); seat_set_focus_layer(seat, NULL);
seat_set_workspace_focus(seat, node); seat_set_workspace_focus(seat, node);
} else { } else {
@ -1324,11 +1326,6 @@ void seat_set_focus_layer(struct sway_seat *seat,
return; return;
} }
assert(layer->surface->mapped); assert(layer->surface->mapped);
if (layer->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP &&
layer->current.keyboard_interactive
== ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
seat->has_exclusive_layer = true;
}
if (seat->focused_layer == layer) { if (seat->focused_layer == layer) {
return; return;
} }

View File

@ -240,13 +240,12 @@ bool server_init(struct sway_server *server) {
wlr_renderer_init_wl_shm(server->renderer, server->wl_display); wlr_renderer_init_wl_shm(server->renderer, server->wl_display);
if (wlr_renderer_get_dmabuf_texture_formats(server->renderer) != NULL) { if (wlr_renderer_get_texture_formats(server->renderer, WLR_BUFFER_CAP_DMABUF) != NULL) {
server->linux_dmabuf_v1 = wlr_linux_dmabuf_v1_create_with_renderer( server->linux_dmabuf_v1 = wlr_linux_dmabuf_v1_create_with_renderer(
server->wl_display, 4, server->renderer); server->wl_display, 4, server->renderer);
} if (debug.legacy_wl_drm) {
if (wlr_renderer_get_dmabuf_texture_formats(server->renderer) != NULL && wlr_drm_create(server->wl_display, server->renderer);
debug.legacy_wl_drm) { }
wlr_drm_create(server->wl_display, server->renderer);
} }
server->allocator = wlr_allocator_autocreate(server->backend, server->allocator = wlr_allocator_autocreate(server->backend,