summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Reider <[email protected]>2023-02-14 16:51:29 +0100
committerGitHub <[email protected]>2023-02-14 10:51:29 -0500
commite78fc3364b0440ff82becbec4ae57458374a145f (patch)
tree0eb825dcc36401438543dbb6fd32ec700b4b90b7
parent3efd3b558fe49bc7a7f3c30c19783e3fe5efeb24 (diff)
upstream update: merge sway 1.8.1 (#111)
-rw-r--r--build-scripts/swayfx.rpkg.spec2
-rw-r--r--include/sway/input/tablet.h2
-rw-r--r--sway/commands/font.c6
-rw-r--r--sway/desktop/output.c1
-rw-r--r--sway/desktop/render.c35
-rw-r--r--sway/input/cursor.c22
-rw-r--r--sway/input/seat.c23
-rw-r--r--sway/input/tablet.c12
-rw-r--r--sway/ipc-json.c2
-rw-r--r--sway/lock.c1
-rw-r--r--sway/meson.build1
-rw-r--r--sway/server.c5
-rw-r--r--sway/sway-ipc.7.scd5
-rw-r--r--sway/sway-output.5.scd2
-rw-r--r--sway/tree/view.c3
-rw-r--r--swaybar/render.c2
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* <name> 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;