mirror of
https://github.com/swaywm/sway
synced 2024-05-09 03:26:02 +02:00
Compare commits
5 Commits
c02d3576e1
...
e4807696f3
Author | SHA1 | Date | |
---|---|---|---|
Alexander Orzechowski | e4807696f3 | ||
Kenny Levinsen | 646019cad9 | ||
Kenny Levinsen | ffcde7a70c | ||
Alexander Orzechowski | 972fcc60df | ||
Alexander Orzechowski | 1800b1266b |
|
@ -99,8 +99,6 @@ struct sway_seat {
|
|||
char *prev_workspace_name; // for workspace back_and_forth
|
||||
|
||||
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
|
||||
int32_t touch_id;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
bool commit = false;
|
||||
if (layer_surface->initial_commit || committed || layer_surface->surface->mapped != surface->mapped) {
|
||||
surface->mapped = layer_surface->surface->mapped;
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_map(struct wl_listener *listener, void *data) {
|
||||
struct sway_layer_surface *surface = wl_container_of(listener,
|
||||
surface, map);
|
||||
struct sway_layer_surface *surface = wl_container_of(listener, surface, map);
|
||||
struct wlr_layer_surface_v1 *layer_surface = surface->scene->layer_surface;
|
||||
|
||||
struct wlr_layer_surface_v1 *layer_surface =
|
||||
surface->scene->layer_surface;
|
||||
bool exclusive = layer_surface->current.keyboard_interactive ==
|
||||
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE;
|
||||
|
||||
// focus on new surface
|
||||
if (layer_surface->current.keyboard_interactive &&
|
||||
|
@ -254,12 +268,15 @@ static void handle_map(struct wl_listener *listener, void *data) {
|
|||
struct sway_seat *seat;
|
||||
wl_list_for_each(seat, &server.input->seats, link) {
|
||||
// but only if the currently focused layer has a lower precedence
|
||||
if (!seat->focused_layer ||
|
||||
seat->focused_layer->current.layer >= layer_surface->current.layer) {
|
||||
if (!seat->focused_layer || exclusive || (
|
||||
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);
|
||||
}
|
||||
}
|
||||
arrange_layers(surface->output);
|
||||
transaction_commit_dirty();
|
||||
}
|
||||
|
||||
cursor_rebase_all();
|
||||
|
|
|
@ -619,7 +619,7 @@ static void output_manager_apply(struct sway_server *server,
|
|||
if (!test_only && ok) {
|
||||
struct wlr_output_configuration_head_v1 *config_head;
|
||||
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;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
struct wlr_layer_surface_v1 *layer = seat->focused_layer;
|
||||
|
||||
// Prevents the layer from losing focus if it has keyboard exclusivity
|
||||
if (seat->has_exclusive_layer) {
|
||||
struct wlr_layer_surface_v1 *layer = seat->focused_layer;
|
||||
if (layer && layer->current.keyboard_interactive ==
|
||||
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
|
||||
seat_set_focus_layer(seat, NULL);
|
||||
seat_set_workspace_focus(seat, node);
|
||||
seat_set_focus_layer(seat, layer);
|
||||
} else if (seat->focused_layer) {
|
||||
} else if (layer) {
|
||||
seat_set_focus_layer(seat, NULL);
|
||||
seat_set_workspace_focus(seat, node);
|
||||
} else {
|
||||
|
@ -1324,11 +1326,6 @@ void seat_set_focus_layer(struct sway_seat *seat,
|
|||
return;
|
||||
}
|
||||
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) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -240,13 +240,12 @@ bool server_init(struct sway_server *server) {
|
|||
|
||||
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->wl_display, 4, server->renderer);
|
||||
}
|
||||
if (wlr_renderer_get_dmabuf_texture_formats(server->renderer) != NULL &&
|
||||
debug.legacy_wl_drm) {
|
||||
wlr_drm_create(server->wl_display, server->renderer);
|
||||
if (debug.legacy_wl_drm) {
|
||||
wlr_drm_create(server->wl_display, server->renderer);
|
||||
}
|
||||
}
|
||||
|
||||
server->allocator = wlr_allocator_autocreate(server->backend,
|
||||
|
|
Loading…
Reference in New Issue