From e78fc3364b0440ff82becbec4ae57458374a145f Mon Sep 17 00:00:00 2001 From: Erik Reider <35975961+ErikReider@users.noreply.github.com> Date: Tue, 14 Feb 2023 16:51:29 +0100 Subject: [PATCH] upstream update: merge sway 1.8.1 (#111) --- build-scripts/swayfx.rpkg.spec | 2 +- include/sway/input/tablet.h | 2 +- sway/commands/font.c | 6 +++--- sway/desktop/output.c | 1 + sway/desktop/render.c | 35 ++++++++++++++++++++++++++++++++++ sway/input/cursor.c | 22 +++++++++++++++++++++ sway/input/seat.c | 23 ++++++++++++++++------ sway/input/tablet.c | 12 ++++-------- sway/ipc-json.c | 2 +- sway/lock.c | 1 + sway/meson.build | 1 + sway/server.c | 5 +++++ sway/sway-ipc.7.scd | 5 +++-- sway/sway-output.5.scd | 2 +- sway/tree/view.c | 3 +++ swaybar/render.c | 2 +- 16 files changed, 100 insertions(+), 24 deletions(-) diff --git a/build-scripts/swayfx.rpkg.spec b/build-scripts/swayfx.rpkg.spec index 4f57193a..cfcafd76 100644 --- a/build-scripts/swayfx.rpkg.spec +++ b/build-scripts/swayfx.rpkg.spec @@ -2,7 +2,7 @@ ### CHANGE THESE VARIABLES BEFORE RELEASE: # Change to current Sway base version! -%global SwayBaseVersion 1.8 +%global SwayBaseVersion 1.8.1 # Change to current SwayFX tag! %global Tag 0.1.1 diff --git a/include/sway/input/tablet.h b/include/sway/input/tablet.h index c0a5aff7..2fa5db6d 100644 --- a/include/sway/input/tablet.h +++ b/include/sway/input/tablet.h @@ -63,7 +63,7 @@ void sway_configure_tablet_pad(struct sway_tablet_pad *tablet_pad); void sway_tablet_pad_destroy(struct sway_tablet_pad *tablet_pad); -void sway_tablet_pad_notify_enter(struct sway_tablet_pad *tablet_pad, +void sway_tablet_pad_set_focus(struct sway_tablet_pad *tablet_pad, struct wlr_surface *surface); #endif diff --git a/sway/commands/font.c b/sway/commands/font.c index 74bb6b9f..dd80281f 100644 --- a/sway/commands/font.c +++ b/sway/commands/font.c @@ -33,10 +33,10 @@ struct cmd_results *cmd_font(int argc, char **argv) { return cmd_results_new(CMD_FAILURE, "Invalid font family."); } - const gint size = pango_font_description_get_size(font_description); - if (size == 0) { + const PangoFontMask flags = pango_font_description_get_set_fields(font_description); + if ((flags & PANGO_FONT_MASK_SIZE) == 0) { pango_font_description_free(font_description); - return cmd_results_new(CMD_FAILURE, "Invalid font size."); + return cmd_results_new(CMD_FAILURE, "Font size not given."); } if (config->font_description != NULL) { diff --git a/sway/desktop/output.c b/sway/desktop/output.c index abf60a2f..5107c43c 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -1022,6 +1022,7 @@ static void output_manager_apply(struct sway_server *server, oc->y = config_head->state.y; oc->transform = config_head->state.transform; oc->scale = config_head->state.scale; + oc->adaptive_sync = config_head->state.adaptive_sync_enabled; if (test_only) { ok &= test_output_config(oc, output); diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 932089de..cdc77ed2 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -1399,6 +1399,41 @@ void output_render(struct sway_output *output, struct timespec *when, goto renderer_end; } + if (server.session_lock.locked) { + float clear_color[] = {0.0f, 0.0f, 0.0f, 1.0f}; + if (server.session_lock.lock == NULL) { + // abandoned lock -> red BG + clear_color[0] = 1.f; + } + int nrects; + pixman_box32_t *rects = pixman_region32_rectangles(damage, &nrects); + for (int i = 0; i < nrects; ++i) { + scissor_output(wlr_output, &rects[i]); + fx_renderer_clear(clear_color); + } + + if (server.session_lock.lock != NULL) { + struct render_data data = { + .damage = damage, + .deco_data = get_undecorated_decoration_data(), + }; + + struct wlr_session_lock_surface_v1 *lock_surface; + wl_list_for_each(lock_surface, &server.session_lock.lock->surfaces, link) { + if (lock_surface->output != wlr_output) { + continue; + } + if (!lock_surface->mapped) { + continue; + } + + output_surface_for_each_surface(output, lock_surface->surface, + 0.0, 0.0, render_surface_iterator, &data); + } + } + goto renderer_end; + } + if (output_has_opaque_overlay_layer_surface(output)) { goto render_overlay; } diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 449aa430..a5f1204b 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -97,6 +97,24 @@ struct sway_node *node_at_coords( double ox = lx, oy = ly; wlr_output_layout_output_coords(root->output_layout, wlr_output, &ox, &oy); + if (server.session_lock.locked) { + if (server.session_lock.lock == NULL) { + return NULL; + } + struct wlr_session_lock_surface_v1 *lock_surf; + wl_list_for_each(lock_surf, &server.session_lock.lock->surfaces, link) { + if (lock_surf->output != wlr_output) { + continue; + } + + *surface = wlr_surface_surface_at(lock_surf->surface, ox, oy, sx, sy); + if (*surface != NULL) { + return NULL; + } + } + return NULL; + } + // layer surfaces on the overlay layer are rendered on top if ((*surface = layer_surface_at(output, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], @@ -1322,6 +1340,10 @@ static void warp_to_constraint_cursor_hint(struct sway_cursor *cursor) { double sy = constraint->current.cursor_hint.y; struct sway_view *view = view_from_wlr_surface(constraint->surface); + if (!view) { + return; + } + struct sway_container *con = view->container; double lx = sx + con->pending.content_x - view->geometry.x; diff --git a/sway/input/seat.c b/sway/input/seat.c index 646f3866..28210bb5 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -176,11 +176,11 @@ static void seat_keyboard_notify_enter(struct sway_seat *seat, state->pressed_keycodes, state->npressed, &keyboard->modifiers); } -static void seat_tablet_pads_notify_enter(struct sway_seat *seat, +static void seat_tablet_pads_set_focus(struct sway_seat *seat, struct wlr_surface *surface) { struct sway_seat_device *seat_device; wl_list_for_each(seat_device, &seat->devices, link) { - sway_tablet_pad_notify_enter(seat_device->tablet_pad, surface); + sway_tablet_pad_set_focus(seat_device->tablet_pad, surface); } } @@ -204,7 +204,7 @@ static void seat_send_focus(struct sway_node *node, struct sway_seat *seat) { #endif seat_keyboard_notify_enter(seat, view->surface); - seat_tablet_pads_notify_enter(seat, view->surface); + seat_tablet_pads_set_focus(seat, view->surface); sway_input_method_relay_set_focus(&seat->im_relay, view->surface); struct wlr_pointer_constraint_v1 *constraint = @@ -1080,9 +1080,20 @@ void seat_configure_xcursor(struct sway_seat *seat) { bool seat_is_input_allowed(struct sway_seat *seat, struct wlr_surface *surface) { + if (server.session_lock.locked) { + if (server.session_lock.lock == NULL) { + return false; + } + struct wlr_session_lock_surface_v1 *lock_surf; + wl_list_for_each(lock_surf, &server.session_lock.lock->surfaces, link) { + if (lock_surf->surface == surface) { + return true; + } + } + return false; + } struct wl_client *client = wl_resource_get_client(surface->resource); - return seat->exclusive_client == client || - (seat->exclusive_client == NULL && !server.session_lock.locked); + return seat->exclusive_client == client || seat->exclusive_client == NULL; } static void send_unfocus(struct sway_container *con, void *data) { @@ -1313,7 +1324,7 @@ void seat_set_focus_surface(struct sway_seat *seat, } sway_input_method_relay_set_focus(&seat->im_relay, surface); - seat_tablet_pads_notify_enter(seat, surface); + seat_tablet_pads_set_focus(seat, surface); } void seat_set_focus_layer(struct sway_seat *seat, diff --git a/sway/input/tablet.c b/sway/input/tablet.c index 92ede3fa..884eba74 100644 --- a/sway/input/tablet.c +++ b/sway/input/tablet.c @@ -334,14 +334,10 @@ static void handle_pad_tablet_surface_destroy(struct wl_listener *listener, struct sway_tablet_pad *tablet_pad = wl_container_of(listener, tablet_pad, surface_destroy); - wlr_tablet_v2_tablet_pad_notify_leave(tablet_pad->tablet_v2_pad, - tablet_pad->current_surface); - wl_list_remove(&tablet_pad->surface_destroy.link); - wl_list_init(&tablet_pad->surface_destroy.link); - tablet_pad->current_surface = NULL; + sway_tablet_pad_set_focus(tablet_pad, NULL); } -void sway_tablet_pad_notify_enter(struct sway_tablet_pad *tablet_pad, +void sway_tablet_pad_set_focus(struct sway_tablet_pad *tablet_pad, struct wlr_surface *surface) { if (!tablet_pad || !tablet_pad->tablet) { return; @@ -360,7 +356,8 @@ void sway_tablet_pad_notify_enter(struct sway_tablet_pad *tablet_pad, tablet_pad->current_surface = NULL; } - if (!wlr_surface_accepts_tablet_v2(tablet_pad->tablet->tablet_v2, surface)) { + if (surface == NULL || + !wlr_surface_accepts_tablet_v2(tablet_pad->tablet->tablet_v2, surface)) { return; } @@ -368,7 +365,6 @@ void sway_tablet_pad_notify_enter(struct sway_tablet_pad *tablet_pad, tablet_pad->tablet->tablet_v2, surface); tablet_pad->current_surface = surface; - wl_list_remove(&tablet_pad->surface_destroy.link); tablet_pad->surface_destroy.notify = handle_pad_tablet_surface_destroy; wl_signal_add(&surface->events.destroy, &tablet_pad->surface_destroy); } diff --git a/sway/ipc-json.c b/sway/ipc-json.c index d757f21f..cd79e1c8 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -558,7 +558,7 @@ static void ipc_json_describe_view(struct sway_container *c, json_object *object struct wlr_box window_box = { c->pending.content_x - c->pending.x, - (c->current.border == B_PIXEL) ? c->current.border_thickness : 0, + (c->current.border == B_PIXEL) ? c->pending.content_y - c->pending.y : 0, c->pending.content_width, c->pending.content_height }; diff --git a/sway/lock.c b/sway/lock.c index bf7d5de8..e893622f 100644 --- a/sway/lock.c +++ b/sway/lock.c @@ -32,6 +32,7 @@ static void handle_surface_map(struct wl_listener *listener, void *data) { if (server.session_lock.focused == NULL) { set_lock_focused_surface(surf->surface); } + wlr_surface_send_enter(surf->surface, surf->output->wlr_output); output_damage_whole(surf->output); } diff --git a/sway/meson.build b/sway/meson.build index 6f179101..c3688e92 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -23,6 +23,7 @@ sway_sources = files( 'desktop/transaction.c', 'desktop/xdg_shell.c', 'desktop/launcher.c', + 'input/input-manager.c', 'input/cursor.c', 'input/keyboard.c', diff --git a/sway/server.c b/sway/server.c index 90b2e042..b107d84a 100644 --- a/sway/server.c +++ b/sway/server.c @@ -76,6 +76,11 @@ bool server_init(struct sway_server *server) { return false; } + if (!server->backend) { + sway_log(SWAY_ERROR, "Unable to create backend"); + return false; + } + server->wlr_renderer = wlr_renderer_autocreate(server->backend); if (!server->wlr_renderer) { sway_log(SWAY_ERROR, "Failed to create wlr_renderer"); diff --git a/sway/sway-ipc.7.scd b/sway/sway-ipc.7.scd index 9121f679..f2ab30f7 100644 --- a/sway/sway-ipc.7.scd +++ b/sway/sway-ipc.7.scd @@ -337,8 +337,9 @@ node and will have the following properties: this, but borders are included. |- window_rect : object -: The geometry of the contents inside the node. The window decorations are - excluded from this calculation, but borders are included. +: The geometry of the content inside the node. These coordinates are relative + to the node itself. Window decorations and borders are outside the + _window_rect_ |- deco_rect : object : The geometry of the decorations for the node relative to the parent node diff --git a/sway/sway-output.5.scd b/sway/sway-output.5.scd index b7d5e577..028cb7ab 100644 --- a/sway/sway-output.5.scd +++ b/sway/sway-output.5.scd @@ -119,7 +119,7 @@ must be separated by one space. For example: Enables or disables the specified output (all outputs are enabled by default). - As opposed to the _power_ command, the output will loose its current + As opposed to the _power_ command, the output will lose its current workspace and windows. *output* toggle diff --git a/sway/tree/view.c b/sway/tree/view.c index 9d7b68d1..7d4dbaeb 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -377,6 +377,7 @@ void view_request_activate(struct sway_view *view) { case FOWA_SMART: if (workspace_is_visible(ws)) { seat_set_focus_container(seat, view->container); + container_raise_floating(view->container); } else { view_set_urgent(view, true); } @@ -386,10 +387,12 @@ void view_request_activate(struct sway_view *view) { break; case FOWA_FOCUS: seat_set_focus_container(seat, view->container); + container_raise_floating(view->container); break; case FOWA_NONE: break; } + transaction_commit_dirty(); } void view_set_csd_from_server(struct sway_view *view, bool enabled) { diff --git a/swaybar/render.c b/swaybar/render.c index 95f6e5be..ccf36563 100644 --- a/swaybar/render.c +++ b/swaybar/render.c @@ -292,7 +292,7 @@ static uint32_t render_status_block(struct render_context *ctx, } double offset = 0; - if (strncmp(block->align, "left", 5) == 0) { + if (strncmp(block->align, "left", 4) == 0) { offset = x_pos; } else if (strncmp(block->align, "right", 5) == 0) { offset = x_pos + width - text_width;