Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package wlroots for openSUSE:Factory checked in at 2026-05-27 16:18:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/wlroots (Old) and /work/SRC/openSUSE:Factory/.wlroots.new.1937 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wlroots" Wed May 27 16:18:17 2026 rev:42 rq:1355306 version:0.20.1 Changes: -------- --- /work/SRC/openSUSE:Factory/wlroots/wlroots.changes 2026-04-01 19:51:52.648237331 +0200 +++ /work/SRC/openSUSE:Factory/.wlroots.new.1937/wlroots.changes 2026-05-27 16:19:05.842167248 +0200 @@ -1,0 +2,17 @@ +Wed May 20 09:18:17 UTC 2026 - zeus <[email protected]> + +- Update to 0.20.1: + * ext_image_capture_source_v1/scene: fix extents + * {wlr,ext}-foreign-toplevel: add new toplevels to end of list + * wlr_ext_workspace_v1.c: add new workspaces to end of list + * wlr_virtual_keyboard_v1: specify size when creating keymap + * render/pixman: fix bilinear filtering to match gles2 renderer + * keyboard: fix modifiers event when no keymap set + * scene/surface: schedule on frame pacing output + * wlr_compositor: Apply state before updating surface_damage + * linux_drm_syncobj_v1: fix memory leak + * scene: only send leave events to outputs with matching scene + root + * toplevel_capture: allocate new_request argument on the stack + +------------------------------------------------------------------- Old: ---- wlroots-0.20.0.tar.gz wlroots-0.20.0.tar.gz.sig New: ---- wlroots-0.20.1.tar.gz wlroots-0.20.1.tar.gz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ wlroots.spec ++++++ --- /var/tmp/diff_new_pack.01YIY7/_old 2026-05-27 16:19:06.622199225 +0200 +++ /var/tmp/diff_new_pack.01YIY7/_new 2026-05-27 16:19:06.622199225 +0200 @@ -18,7 +18,7 @@ %global ver_suffix 0.20 %global sover 0_20 -%global patch_ver 0 +%global patch_ver 1 %global libname libwlroots-%{sover} %bcond_without drm_backend %bcond_without libinput_backend @@ -48,7 +48,7 @@ BuildRequires: pkgconfig(libavformat) BuildRequires: pkgconfig(libavutil) BuildRequires: pkgconfig(libdisplay-info) -BuildRequires: pkgconfig(libdrm) >= 2.4.113 +BuildRequires: pkgconfig(libdrm) >= 2.4.129 BuildRequires: pkgconfig(libliftoff) %if %{with libinput_backend} BuildRequires: pkgconfig(libinput) >= 1.14.0 ++++++ wlroots-0.20.0.tar.gz -> wlroots-0.20.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/include/wlr/types/wlr_compositor.h new/wlroots-0.20.1/include/wlr/types/wlr_compositor.h --- old/wlroots-0.20.0/include/wlr/types/wlr_compositor.h 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/include/wlr/types/wlr_compositor.h 2026-05-19 22:56:13.000000000 +0200 @@ -127,6 +127,8 @@ struct { struct wl_listener bind; struct wl_listener destroy; + + bool suspended; } WLR_PRIVATE; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/meson.build new/wlroots-0.20.1/meson.build --- old/wlroots-0.20.0/meson.build 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/meson.build 2026-05-19 22:56:13.000000000 +0200 @@ -1,7 +1,7 @@ project( 'wlroots', 'c', - version: '0.20.0', + version: '0.20.1', license: 'MIT', meson_version: '>=1.3', default_options: [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/render/pixman/pass.c new/wlroots-0.20.1/render/pixman/pass.c --- old/wlroots-0.20.0/render/pixman/pass.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/render/pixman/pass.c 2026-05-19 22:56:13.000000000 +0200 @@ -159,6 +159,7 @@ switch (options->filter_mode) { case WLR_SCALE_FILTER_BILINEAR: + pixman_image_set_repeat(texture->image, PIXMAN_REPEAT_PAD); pixman_image_set_filter(texture->image, PIXMAN_FILTER_BILINEAR, NULL, 0); break; case WLR_SCALE_FILTER_NEAREST: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/ext_image_capture_source_v1/foreign_toplevel.c new/wlroots-0.20.1/types/ext_image_capture_source_v1/foreign_toplevel.c --- old/wlroots-0.20.0/types/ext_image_capture_source_v1/foreign_toplevel.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/ext_image_capture_source_v1/foreign_toplevel.c 2026-05-19 22:56:13.000000000 +0200 @@ -34,18 +34,13 @@ return; } - struct wlr_ext_foreign_toplevel_image_capture_source_manager_v1_request *request = - calloc(1, sizeof(*request)); - if (request == NULL) { - wl_resource_post_no_memory(manager_resource); - return; - } - - request->toplevel_handle = toplevel_handle; - request->client = client; - request->new_id = new_id; + struct wlr_ext_foreign_toplevel_image_capture_source_manager_v1_request request = { + .toplevel_handle = toplevel_handle, + .client = client, + .new_id = new_id, + }; - wl_signal_emit_mutable(&manager->events.new_request, request); + wl_signal_emit_mutable(&manager->events.new_request, &request); } static void foreign_toplevel_manager_handle_destroy(struct wl_client *client, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/ext_image_capture_source_v1/scene.c new/wlroots-0.20.1/types/ext_image_capture_source_v1/scene.c --- old/wlroots-0.20.0/types/ext_image_capture_source_v1/scene.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/ext_image_capture_source_v1/scene.c 2026-05-19 22:56:13.000000000 +0200 @@ -34,13 +34,14 @@ static size_t last_output_num = 0; -static void _get_scene_node_extents(struct wlr_scene_node *node, struct wlr_box *box, int lx, int ly) { +static void _get_scene_node_extents(struct wlr_scene_node *node, int lx, int ly, + int *x_min, int *y_min, int *x_max, int *y_max) { switch (node->type) { case WLR_SCENE_NODE_TREE:; struct wlr_scene_tree *scene_tree = wlr_scene_tree_from_node(node); struct wlr_scene_node *child; wl_list_for_each(child, &scene_tree->children, link) { - _get_scene_node_extents(child, box, lx + child->x, ly + child->y); + _get_scene_node_extents(child, lx + child->x, ly + child->y, x_min, y_min, x_max, y_max); } break; case WLR_SCENE_NODE_RECT: @@ -48,27 +49,30 @@ struct wlr_box node_box = { .x = lx, .y = ly }; scene_node_get_size(node, &node_box.width, &node_box.height); - if (node_box.x < box->x) { - box->x = node_box.x; + if (node_box.x < *x_min) { + *x_min = node_box.x; } - if (node_box.y < box->y) { - box->y = node_box.y; + if (node_box.y < *y_min) { + *y_min = node_box.y; } - if (node_box.x + node_box.width > box->x + box->width) { - box->width = node_box.x + node_box.width - box->x; + if (node_box.x + node_box.width > *x_max) { + *x_max = node_box.x + node_box.width; } - if (node_box.y + node_box.height > box->y + box->height) { - box->height = node_box.y + node_box.height - box->y; + if (node_box.y + node_box.height > *y_max) { + *y_max = node_box.y + node_box.height; } break; } } static void get_scene_node_extents(struct wlr_scene_node *node, struct wlr_box *box) { - *box = (struct wlr_box){ .x = INT_MAX, .y = INT_MAX }; int lx = 0, ly = 0; wlr_scene_node_coords(node, &lx, &ly); - _get_scene_node_extents(node, box, lx, ly); + *box = (struct wlr_box){ .x = INT_MAX, .y = INT_MAX }; + int x_max = INT_MIN, y_max = INT_MIN; + _get_scene_node_extents(node, lx, ly, &box->x, &box->y, &x_max, &y_max); + box->width = x_max - box->x; + box->height = y_max - box->y; } static void source_render(struct scene_node_source *source) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/scene/surface.c new/wlroots-0.20.1/types/scene/surface.c --- old/wlroots-0.20.0/types/scene/surface.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/scene/surface.c 2026-05-19 22:56:13.000000000 +0200 @@ -30,8 +30,8 @@ struct wlr_output *frame_pacing_output = NULL; struct wlr_surface_output *surface_output; wl_list_for_each(surface_output, &surface->current_outputs, link) { - if (frame_pacing_output == NULL || - surface_output->output->refresh > frame_pacing_output->refresh) { + if (!surface_output->suspended && (frame_pacing_output == NULL || + surface_output->output->refresh > frame_pacing_output->refresh)) { frame_pacing_output = surface_output->output; } } @@ -97,11 +97,9 @@ struct wlr_scene_outputs_update_event *event = data; struct wlr_scene *scene = scene_node_get_root(&surface->buffer->node); - // If the surface is no longer visible on any output, keep the last sent - // preferred configuration to avoid unnecessary redraws - if (event->size == 0) { - return; - } + // If the surface is no longer visible on any output in the scene, keep the + // last sent preferred configuration to avoid unnecessary redraws + bool suspend = event->size == 0; // To avoid sending redundant leave/enter events when a surface is hidden and then shown // without moving to a different output the following policy is implemented: @@ -121,11 +119,24 @@ break; } } - if (!active) { - wlr_surface_send_leave(surface->surface, entered_output->output); + + struct wlr_scene_output *scene_output; + wl_list_for_each(scene_output, &scene->outputs, link) { + if (scene_output->output == entered_output->output) { + entered_output->suspended = suspend; + if (!suspend && !active) { + wlr_surface_send_leave(surface->surface, entered_output->output); + } + break; + } } } + // No reason to update the preferred configuration if we aren't sending leave/enter events. + if (suspend) { + return; + } + for (size_t i = 0; i < event->size; i++) { // This function internally checks if an enter event was already sent for the output // to avoid sending redundant events. @@ -361,10 +372,9 @@ // the surface anyway. int lx, ly; bool enabled = wlr_scene_node_coords(&scene_buffer->node, &lx, &ly); - - if (!wl_list_empty(&surface->surface->current.frame_callback_list) && - surface->buffer->primary_output != NULL && enabled) { - wlr_output_schedule_frame(surface->buffer->primary_output->output); + struct wlr_output *output = get_surface_frame_pacing_output(surface->surface); + if (!wl_list_empty(&surface->surface->current.frame_callback_list) && output && enabled) { + wlr_output_schedule_frame(output); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/wlr_compositor.c new/wlroots-0.20.1/types/wlr_compositor.c --- old/wlroots-0.20.0/types/wlr_compositor.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/wlr_compositor.c 2026-05-19 22:56:13.000000000 +0200 @@ -246,40 +246,40 @@ } static void surface_update_damage(pixman_region32_t *buffer_damage, - struct wlr_surface_state *current, struct wlr_surface_state *pending) { + struct wlr_surface_state *state) { pixman_region32_clear(buffer_damage); // Copy over surface damage + buffer damage pixman_region32_t surface_damage; pixman_region32_init(&surface_damage); - pixman_region32_copy(&surface_damage, &pending->surface_damage); + pixman_region32_copy(&surface_damage, &state->surface_damage); - if (pending->viewport.has_dst) { + if (state->viewport.has_dst) { int src_width, src_height; - surface_state_viewport_src_size(pending, &src_width, &src_height); - float scale_x = (float)pending->viewport.dst_width / src_width; - float scale_y = (float)pending->viewport.dst_height / src_height; + surface_state_viewport_src_size(state, &src_width, &src_height); + float scale_x = (float)state->viewport.dst_width / src_width; + float scale_y = (float)state->viewport.dst_height / src_height; wlr_region_scale_xy(&surface_damage, &surface_damage, 1.0 / scale_x, 1.0 / scale_y); } - if (pending->viewport.has_src) { + if (state->viewport.has_src) { // This is lossy: do a best-effort conversion pixman_region32_translate(&surface_damage, - floor(pending->viewport.src.x), - floor(pending->viewport.src.y)); + floor(state->viewport.src.x), + floor(state->viewport.src.y)); } - wlr_region_scale(&surface_damage, &surface_damage, pending->scale); + wlr_region_scale(&surface_damage, &surface_damage, state->scale); int width, height; - surface_state_transformed_buffer_size(pending, &width, &height); + surface_state_transformed_buffer_size(state, &width, &height); wlr_region_transform(&surface_damage, &surface_damage, - wlr_output_transform_invert(pending->transform), + wlr_output_transform_invert(state->transform), width, height); pixman_region32_union(buffer_damage, - &pending->buffer_damage, &surface_damage); + &state->buffer_damage, &surface_damage); pixman_region32_fini(&surface_damage); } @@ -521,8 +521,6 @@ surface->unmap_commit = false; } - surface_update_damage(&surface->buffer_damage, &surface->current, next); - surface->previous.scale = surface->current.scale; surface->previous.transform = surface->current.transform; surface->previous.width = surface->current.width; @@ -531,6 +529,7 @@ surface->previous.buffer_height = surface->current.buffer_height; surface_state_move(&surface->current, next, surface); + surface_update_damage(&surface->buffer_damage, &surface->current); if (invalid_buffer) { surface_apply_damage(surface); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/wlr_ext_foreign_toplevel_list_v1.c new/wlroots-0.20.1/types/wlr_ext_foreign_toplevel_list_v1.c --- old/wlroots-0.20.0/types/wlr_ext_foreign_toplevel_list_v1.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/wlr_ext_foreign_toplevel_list_v1.c 2026-05-19 22:56:13.000000000 +0200 @@ -168,7 +168,7 @@ return NULL; } - wl_list_insert(&list->toplevels, &toplevel->link); + wl_list_insert(list->toplevels.prev, &toplevel->link); toplevel->list = list; if (state->app_id) { toplevel->app_id = strdup(state->app_id); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/wlr_ext_workspace_v1.c new/wlroots-0.20.1/types/wlr_ext_workspace_v1.c --- old/wlroots-0.20.0/types/wlr_ext_workspace_v1.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/wlr_ext_workspace_v1.c 2026-05-19 22:56:13.000000000 +0200 @@ -790,7 +790,7 @@ wl_array_init(&workspace->coordinates); wl_signal_init(&workspace->events.destroy); - wl_list_insert(&manager->workspaces, &workspace->link); + wl_list_insert(manager->workspaces.prev, &workspace->link); struct wlr_ext_workspace_manager_v1_resource *manager_res; wl_list_for_each(manager_res, &manager->resources, link) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/wlr_foreign_toplevel_management_v1.c new/wlroots-0.20.1/types/wlr_foreign_toplevel_management_v1.c --- old/wlroots-0.20.0/types/wlr_foreign_toplevel_management_v1.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/wlr_foreign_toplevel_management_v1.c 2026-05-19 22:56:13.000000000 +0200 @@ -530,7 +530,7 @@ return NULL; } - wl_list_insert(&manager->toplevels, &toplevel->link); + wl_list_insert(manager->toplevels.prev, &toplevel->link); toplevel->manager = manager; wl_list_init(&toplevel->resources); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/wlr_keyboard.c new/wlroots-0.20.1/types/wlr_keyboard.c --- old/wlroots-0.20.0/types/wlr_keyboard.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/wlr_keyboard.c 2026-05-19 22:56:13.000000000 +0200 @@ -84,6 +84,16 @@ uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) { if (keyboard->xkb_state == NULL) { + if (keyboard->modifiers.depressed != mods_depressed || + keyboard->modifiers.latched != mods_latched || + keyboard->modifiers.locked != mods_locked || + keyboard->modifiers.group != group) { + keyboard->modifiers.depressed = mods_depressed; + keyboard->modifiers.latched = mods_latched; + keyboard->modifiers.locked = mods_locked; + keyboard->modifiers.group = group; + wl_signal_emit_mutable(&keyboard->events.modifiers, keyboard); + } return; } xkb_state_update_mask(keyboard->xkb_state, mods_depressed, mods_latched, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/wlr_linux_drm_syncobj_v1.c new/wlroots-0.20.1/types/wlr_linux_drm_syncobj_v1.c --- old/wlroots-0.20.0/types/wlr_linux_drm_syncobj_v1.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/wlr_linux_drm_syncobj_v1.c 2026-05-19 22:56:13.000000000 +0200 @@ -386,6 +386,7 @@ struct wl_resource *timeline_resource = wl_resource_create(client, &wp_linux_drm_syncobj_timeline_v1_interface, version, id); if (timeline_resource == NULL) { + wlr_drm_syncobj_timeline_unref(timeline); wl_resource_post_no_memory(resource); return; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.20.0/types/wlr_virtual_keyboard_v1.c new/wlroots-0.20.1/types/wlr_virtual_keyboard_v1.c --- old/wlroots-0.20.0/types/wlr_virtual_keyboard_v1.c 2026-03-26 17:38:50.000000000 +0100 +++ new/wlroots-0.20.1/types/wlr_virtual_keyboard_v1.c 2026-05-19 22:56:13.000000000 +0200 @@ -52,7 +52,7 @@ if (data == MAP_FAILED) { goto fd_fail; } - struct xkb_keymap *keymap = xkb_keymap_new_from_string(context, data, + struct xkb_keymap *keymap = xkb_keymap_new_from_buffer(context, data, size, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS); munmap(data, size); if (!keymap) {
