Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package wlroots for openSUSE:Factory checked in at 2022-02-22 21:18:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/wlroots (Old) and /work/SRC/openSUSE:Factory/.wlroots.new.1958 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wlroots" Tue Feb 22 21:18:04 2022 rev:20 rq:956559 version:0.15.1 Changes: -------- --- /work/SRC/openSUSE:Factory/wlroots/wlroots.changes 2022-01-29 20:59:30.239713976 +0100 +++ /work/SRC/openSUSE:Factory/.wlroots.new.1958/wlroots.changes 2022-02-22 21:18:35.178290586 +0100 @@ -1,0 +2,18 @@ +Mon Feb 21 12:29:04 UTC 2022 - Martin Sirringhaus <martin.sirringh...@suse.com> + +- Update to 0.15.1: + * xdg-foreign: Fix crash on destroy of degenerate surface + * wlr_texture: remove wlr_texture_from_wl_drm() from header + * foreign-toplevel: send enter if needed on output bind + * tinywl: fix check whether client is focused or not + * scene/subsurface_tree: fix handling subsurface destruction + * compositor: damage the whole buffer on viewport src change + * subsurface: unlock cached state on commit if desynced + * backend: error out in autocreate without libinput support + * scene: schedule an output frame on wl_surface.frame + * scene: try to import buffers as textures before rendering + * input_method_v2: improve mapping detection + * render/gles2: don't constrain shm formats to ones that support reading + * vulkan: Fix imported image layout + +------------------------------------------------------------------- Old: ---- wlroots-0.15.0.tar.gz New: ---- wlroots-0.15.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ wlroots.spec ++++++ --- /var/tmp/diff_new_pack.YWhUGr/_old 2022-02-22 21:18:35.754290692 +0100 +++ /var/tmp/diff_new_pack.YWhUGr/_new 2022-02-22 21:18:35.758290692 +0100 @@ -24,7 +24,7 @@ %bcond_without xcb_errors Name: wlroots -Version: 0.15.0 +Version: 0.15.1 Release: 0 Summary: Modular Wayland compositor library License: MIT ++++++ wlroots-0.15.0.tar.gz -> wlroots-0.15.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/backend/backend.c new/wlroots-0.15.1/backend/backend.c --- old/wlroots-0.15.0/backend/backend.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/backend/backend.c 2022-02-03 22:19:54.000000000 +0100 @@ -364,6 +364,19 @@ return NULL; } wlr_multi_backend_add(backend, libinput); +#else + const char *no_devs = getenv("WLR_LIBINPUT_NO_DEVICES"); + if (no_devs && strcmp(no_devs, "1") == 0) { + wlr_log(WLR_INFO, "WLR_LIBINPUT_NO_DEVICES is set, " + "starting without libinput backend"); + } else { + wlr_log(WLR_ERROR, "libinput support is not compiled in, " + "refusing to start"); + wlr_log(WLR_ERROR, "Set WLR_LIBINPUT_NO_DEVICES=1 to suppress this check"); + wlr_session_destroy(multi->session); + wlr_backend_destroy(backend); + return NULL; + } #endif #if WLR_HAS_DRM_BACKEND diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/include/wlr/render/wlr_texture.h new/wlroots-0.15.1/include/wlr/render/wlr_texture.h --- old/wlroots-0.15.0/include/wlr/render/wlr_texture.h 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/include/wlr/render/wlr_texture.h 2022-02-03 22:19:54.000000000 +0100 @@ -34,16 +34,6 @@ const void *data); /** - * Create a new texture from a wl_drm resource. The returned texture is - * immutable. - * - * Should not be called in a rendering block like renderer_begin()/end() or - * between attaching a renderer to an output and committing it. - */ -struct wlr_texture *wlr_texture_from_wl_drm(struct wlr_renderer *renderer, - struct wl_resource *data); - -/** * Create a new texture from a DMA-BUF. The returned texture is immutable. * * Should not be called in a rendering block like renderer_begin()/end() or diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/include/wlr/types/wlr_foreign_toplevel_management_v1.h new/wlroots-0.15.1/include/wlr/types/wlr_foreign_toplevel_management_v1.h --- old/wlroots-0.15.0/include/wlr/types/wlr_foreign_toplevel_management_v1.h 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/include/wlr/types/wlr_foreign_toplevel_management_v1.h 2022-02-03 22:19:54.000000000 +0100 @@ -36,10 +36,13 @@ struct wlr_foreign_toplevel_handle_v1_output { struct wl_list link; // wlr_foreign_toplevel_handle_v1::outputs - struct wl_listener output_destroy; struct wlr_output *output; - struct wlr_foreign_toplevel_handle_v1 *toplevel; + + // private state + + struct wl_listener output_bind; + struct wl_listener output_destroy; }; struct wlr_foreign_toplevel_handle_v1 { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/include/wlr/types/wlr_scene.h new/wlroots-0.15.1/include/wlr/types/wlr_scene.h --- old/wlroots-0.15.0/include/wlr/types/wlr_scene.h 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/include/wlr/types/wlr_scene.h 2022-02-03 22:19:54.000000000 +0100 @@ -68,6 +68,9 @@ // May be NULL struct wlr_presentation *presentation; struct wl_listener presentation_destroy; + + // List of buffers which need to be imported as textures + struct wl_list pending_buffers; // wlr_scene_buffer.pending_link }; /** A sub-tree in the scene-graph. */ @@ -114,6 +117,7 @@ struct wlr_fbox src_box; int dst_width, dst_height; enum wl_output_transform transform; + struct wl_list pending_link; // wlr_scene.pending_buffers }; /** A viewport for an output in the scene-graph */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/meson.build new/wlroots-0.15.1/meson.build --- old/wlroots-0.15.0/meson.build 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/meson.build 2022-02-03 22:19:54.000000000 +0100 @@ -1,7 +1,7 @@ project( 'wlroots', 'c', - version: '0.15.0', + version: '0.15.1', license: 'MIT', meson_version: '>=0.58.1', default_options: [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/render/gles2/pixel_format.c new/wlroots-0.15.1/render/gles2/pixel_format.c --- old/wlroots-0.15.0/render/gles2/pixel_format.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/render/gles2/pixel_format.c 2022-02-03 22:19:54.000000000 +0100 @@ -98,6 +98,10 @@ // TODO: more pixel formats +/* + * Return true if supported for texturing, even if other operations like + * reading aren't supported. + */ bool is_gles2_pixel_format_supported(const struct wlr_gles2_renderer *renderer, const struct wlr_gles2_pixel_format *format) { if (format->gl_type == GL_UNSIGNED_INT_2_10_10_10_REV_EXT @@ -108,10 +112,12 @@ && !renderer->exts.OES_texture_half_float_linear) { return false; } - if (format->gl_format == GL_BGRA_EXT - && !renderer->exts.EXT_read_format_bgra) { - return false; - } + /* + * Note that we don't need to check for GL_EXT_texture_format_BGRA8888 + * here, since we've already checked if we have it at renderer creation + * time and bailed out if not. We do the check there because Wayland + * requires all compositors to support SHM buffers in that format. + */ return true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/render/gles2/renderer.c new/wlroots-0.15.1/render/gles2/renderer.c --- old/wlroots-0.15.0/render/gles2/renderer.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/render/gles2/renderer.c 2022-02-03 22:19:54.000000000 +0100 @@ -441,6 +441,12 @@ return false; } + if (fmt->gl_format == GL_BGRA_EXT && !renderer->exts.EXT_read_format_bgra) { + wlr_log(WLR_ERROR, + "Cannot read pixels: missing GL_EXT_read_format_bgra extension"); + return false; + } + const struct wlr_pixel_format_info *drm_fmt = drm_get_pixel_format_info(fmt->drm_format); assert(drm_fmt); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/render/vulkan/renderer.c new/wlroots-0.15.1/render/vulkan/renderer.c --- old/wlroots-0.15.0/render/vulkan/renderer.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/render/vulkan/renderer.c 2022-02-03 22:19:54.000000000 +0100 @@ -598,7 +598,7 @@ wl_list_for_each_safe(texture, tmp_tex, &renderer->foreign_textures, foreign_link) { VkImageLayout src_layout = VK_IMAGE_LAYOUT_GENERAL; if (!texture->transitioned) { - src_layout = VK_IMAGE_LAYOUT_PREINITIALIZED; + src_layout = VK_IMAGE_LAYOUT_UNDEFINED; texture->transitioned = true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/render/vulkan/texture.c new/wlroots-0.15.1/render/vulkan/texture.c --- old/wlroots-0.15.0/render/vulkan/texture.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/render/vulkan/texture.c 2022-02-03 22:19:54.000000000 +0100 @@ -438,7 +438,7 @@ img_info.arrayLayers = 1; img_info.samples = VK_SAMPLE_COUNT_1_BIT; img_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - img_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED; + img_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; img_info.extent = (VkExtent3D) { attribs->width, attribs->height, 1 }; img_info.usage = for_render ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/tinywl/tinywl.c new/wlroots-0.15.1/tinywl/tinywl.c --- old/wlroots-0.15.0/tinywl/tinywl.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/tinywl/tinywl.c 2022-02-03 22:19:54.000000000 +0100 @@ -611,7 +611,8 @@ struct tinywl_server *server = view->server; struct wlr_surface *focused_surface = server->seat->pointer_state.focused_surface; - if (view->xdg_surface->surface != focused_surface) { + if (view->xdg_surface->surface != + wlr_surface_get_root_surface(focused_surface)) { /* Deny move/resize requests from unfocused clients. */ return; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/types/scene/subsurface_tree.c new/wlroots-0.15.1/types/scene/subsurface_tree.c --- old/wlroots-0.15.0/types/scene/subsurface_tree.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/types/scene/subsurface_tree.c 2022-02-03 22:19:54.000000000 +0100 @@ -13,15 +13,20 @@ struct wlr_surface *surface; struct wlr_scene_surface *scene_surface; - struct wlr_scene_subsurface_tree *parent; // NULL for the top-level surface - struct wlr_addon surface_addon; // only set if there's a parent - struct wl_listener tree_destroy; struct wl_listener surface_destroy; struct wl_listener surface_commit; - struct wl_listener surface_map; - struct wl_listener surface_unmap; struct wl_listener surface_new_subsurface; + + struct wlr_scene_subsurface_tree *parent; // NULL for the top-level surface + + // Only valid if the surface is a sub-surface + + struct wlr_addon surface_addon; + + struct wl_listener subsurface_destroy; + struct wl_listener subsurface_map; + struct wl_listener subsurface_unmap; }; static void subsurface_tree_handle_tree_destroy(struct wl_listener *listener, @@ -31,23 +36,17 @@ // tree and scene_surface will be cleaned up by scene_node_finish if (subsurface_tree->parent) { wlr_addon_finish(&subsurface_tree->surface_addon); + wl_list_remove(&subsurface_tree->subsurface_destroy.link); + wl_list_remove(&subsurface_tree->subsurface_map.link); + wl_list_remove(&subsurface_tree->subsurface_unmap.link); } wl_list_remove(&subsurface_tree->tree_destroy.link); wl_list_remove(&subsurface_tree->surface_destroy.link); wl_list_remove(&subsurface_tree->surface_commit.link); - wl_list_remove(&subsurface_tree->surface_map.link); - wl_list_remove(&subsurface_tree->surface_unmap.link); wl_list_remove(&subsurface_tree->surface_new_subsurface.link); free(subsurface_tree); } -static void subsurface_tree_handle_surface_destroy(struct wl_listener *listener, - void *data) { - struct wlr_scene_subsurface_tree *subsurface_tree = - wl_container_of(listener, subsurface_tree, surface_destroy); - wlr_scene_node_destroy(&subsurface_tree->tree->node); -} - static const struct wlr_addon_interface subsurface_tree_addon_impl; static struct wlr_scene_subsurface_tree *subsurface_tree_from_subsurface( @@ -97,6 +96,13 @@ } } +static void subsurface_tree_handle_surface_destroy(struct wl_listener *listener, + void *data) { + struct wlr_scene_subsurface_tree *subsurface_tree = + wl_container_of(listener, subsurface_tree, surface_destroy); + wlr_scene_node_destroy(&subsurface_tree->tree->node); +} + static void subsurface_tree_handle_surface_commit(struct wl_listener *listener, void *data) { struct wlr_scene_subsurface_tree *subsurface_tree = @@ -106,18 +112,25 @@ subsurface_tree_reconfigure(subsurface_tree); } -static void subsurface_tree_handle_surface_map(struct wl_listener *listener, +static void subsurface_tree_handle_subsurface_destroy(struct wl_listener *listener, void *data) { struct wlr_scene_subsurface_tree *subsurface_tree = - wl_container_of(listener, subsurface_tree, surface_map); + wl_container_of(listener, subsurface_tree, subsurface_destroy); + wlr_scene_node_destroy(&subsurface_tree->tree->node); +} + +static void subsurface_tree_handle_subsurface_map(struct wl_listener *listener, + void *data) { + struct wlr_scene_subsurface_tree *subsurface_tree = + wl_container_of(listener, subsurface_tree, subsurface_map); wlr_scene_node_set_enabled(&subsurface_tree->tree->node, true); } -static void subsurface_tree_handle_surface_unmap(struct wl_listener *listener, +static void subsurface_tree_handle_subsurface_unmap(struct wl_listener *listener, void *data) { struct wlr_scene_subsurface_tree *subsurface_tree = - wl_container_of(listener, subsurface_tree, surface_unmap); + wl_container_of(listener, subsurface_tree, subsurface_unmap); wlr_scene_node_set_enabled(&subsurface_tree->tree->node, false); } @@ -151,8 +164,14 @@ wlr_addon_init(&child->surface_addon, &subsurface->surface->addons, parent, &subsurface_tree_addon_impl); - wl_signal_add(&subsurface->events.map, &child->surface_map); - wl_signal_add(&subsurface->events.unmap, &child->surface_unmap); + child->subsurface_destroy.notify = subsurface_tree_handle_subsurface_destroy; + wl_signal_add(&subsurface->events.destroy, &child->subsurface_destroy); + + child->subsurface_map.notify = subsurface_tree_handle_subsurface_map; + wl_signal_add(&subsurface->events.map, &child->subsurface_map); + + child->subsurface_unmap.notify = subsurface_tree_handle_subsurface_unmap; + wl_signal_add(&subsurface->events.unmap, &child->subsurface_unmap); return true; } @@ -214,12 +233,6 @@ subsurface_tree->surface_commit.notify = subsurface_tree_handle_surface_commit; wl_signal_add(&surface->events.commit, &subsurface_tree->surface_commit); - subsurface_tree->surface_map.notify = subsurface_tree_handle_surface_map; - wl_list_init(&subsurface_tree->surface_map.link); - - subsurface_tree->surface_unmap.notify = subsurface_tree_handle_surface_unmap; - wl_list_init(&subsurface_tree->surface_unmap.link); - subsurface_tree->surface_new_subsurface.notify = subsurface_tree_handle_surface_new_subsurface; wl_signal_add(&surface->events.new_subsurface, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/types/scene/wlr_scene.c new/wlroots-0.15.1/types/scene/wlr_scene.c --- old/wlroots-0.15.0/types/scene/wlr_scene.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/types/scene/wlr_scene.c 2022-02-03 22:19:54.000000000 +0100 @@ -130,6 +130,7 @@ break; case WLR_SCENE_NODE_BUFFER:; struct wlr_scene_buffer *scene_buffer = scene_buffer_from_node(node); + wl_list_remove(&scene_buffer->pending_link); wlr_texture_destroy(scene_buffer->texture); wlr_buffer_unlock(scene_buffer->buffer); free(scene_buffer); @@ -145,6 +146,7 @@ scene_node_init(&scene->node, WLR_SCENE_NODE_ROOT, NULL); wl_list_init(&scene->outputs); wl_list_init(&scene->presentation_destroy.link); + wl_list_init(&scene->pending_buffers); return scene; } @@ -236,10 +238,6 @@ wl_container_of(listener, scene_surface, surface_commit); struct wlr_surface *surface = scene_surface->surface; - if (!pixman_region32_not_empty(&surface->buffer_damage)) { - return; - } - struct wlr_scene *scene = scene_node_get_root(&scene_surface->node); int lx, ly; @@ -256,6 +254,17 @@ return; } + // Even if the surface hasn't submitted damage, schedule a new frame if + // the client has requested a wl_surface.frame callback. + if (!wl_list_empty(&surface->current.frame_callback_list) && + scene_surface->primary_output != NULL) { + wlr_output_schedule_frame(scene_surface->primary_output); + } + + if (!pixman_region32_not_empty(&surface->buffer_damage)) { + return; + } + struct wlr_scene_output *scene_output; wl_list_for_each(scene_output, &scene->outputs, link) { struct wlr_output *output = scene_output->output; @@ -353,6 +362,9 @@ scene_node_damage_whole(&scene_buffer->node); + struct wlr_scene *scene = scene_node_get_root(parent); + wl_list_insert(&scene->pending_buffers, &scene_buffer->pending_link); + return scene_buffer; } @@ -1106,6 +1118,15 @@ return true; } + // Try to import new buffers as textures + struct wlr_scene_buffer *scene_buffer, *scene_buffer_tmp; + wl_list_for_each_safe(scene_buffer, scene_buffer_tmp, + &scene_output->scene->pending_buffers, pending_link) { + scene_buffer_get_texture(scene_buffer, renderer); + wl_list_remove(&scene_buffer->pending_link); + wl_list_init(&scene_buffer->pending_link); + } + wlr_renderer_begin(renderer, output->width, output->height); int nrects; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/types/wlr_foreign_toplevel_management_v1.c new/wlroots-0.15.1/types/wlr_foreign_toplevel_management_v1.c --- old/wlroots-0.15.0/types/wlr_foreign_toplevel_management_v1.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/types/wlr_foreign_toplevel_management_v1.c 2022-02-03 22:19:54.000000000 +0100 @@ -256,6 +256,23 @@ toplevel_update_idle_source(toplevel); } +static void toplevel_handle_output_bind(struct wl_listener *listener, + void *data) { + struct wlr_foreign_toplevel_handle_v1_output *toplevel_output = + wl_container_of(listener, toplevel_output, output_bind); + struct wlr_output_event_bind *event = data; + struct wl_client *client = wl_resource_get_client(event->resource); + + struct wl_resource *resource; + wl_resource_for_each(resource, &toplevel_output->toplevel->resources) { + if (wl_resource_get_client(resource) == client) { + send_output_to_resource(resource, toplevel_output->output, true); + } + } + + toplevel_update_idle_source(toplevel_output->toplevel); +} + static void toplevel_handle_output_destroy(struct wl_listener *listener, void *data) { struct wlr_foreign_toplevel_handle_v1_output *toplevel_output = @@ -285,6 +302,9 @@ toplevel_output->toplevel = toplevel; wl_list_insert(&toplevel->outputs, &toplevel_output->link); + toplevel_output->output_bind.notify = toplevel_handle_output_bind; + wl_signal_add(&output->events.bind, &toplevel_output->output_bind); + toplevel_output->output_destroy.notify = toplevel_handle_output_destroy; wl_signal_add(&output->events.destroy, &toplevel_output->output_destroy); @@ -294,6 +314,7 @@ static void toplevel_output_destroy( struct wlr_foreign_toplevel_handle_v1_output *toplevel_output) { wl_list_remove(&toplevel_output->link); + wl_list_remove(&toplevel_output->output_bind.link); wl_list_remove(&toplevel_output->output_destroy.link); free(toplevel_output); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/types/wlr_input_method_v2.c new/wlroots-0.15.1/types/wlr_input_method_v2.c --- old/wlroots-0.15.0/types/wlr_input_method_v2.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/types/wlr_input_method_v2.c 2022-02-03 22:19:54.000000000 +0100 @@ -157,9 +157,22 @@ && popup_surface->input_method->client_active); } +static void popup_surface_surface_role_precommit(struct wlr_surface *surface) { + struct wlr_input_popup_surface_v2 *popup_surface = surface->role_data; + if (popup_surface == NULL) { + return; + } + if (surface->pending.committed & WLR_SURFACE_STATE_BUFFER && + surface->pending.buffer == NULL) { + // This is a NULL commit + popup_surface_set_mapped(popup_surface, false); + } +} + static const struct wlr_surface_role input_popup_surface_v2_role = { .name = "zwp_input_popup_surface_v2", .commit = popup_surface_surface_role_commit, + .precommit = popup_surface_surface_role_precommit, }; bool wlr_surface_is_input_popup_surface_v2(struct wlr_surface *surface) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/types/wlr_surface.c new/wlroots-0.15.1/types/wlr_surface.c --- old/wlroots-0.15.0/types/wlr_surface.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/types/wlr_surface.c 2022-02-03 22:19:54.000000000 +0100 @@ -207,8 +207,12 @@ pixman_region32_clear(buffer_damage); if (pending->width != current->width || - pending->height != current->height) { - // Damage the whole buffer on resize + pending->height != current->height || + pending->viewport.src.x != current->viewport.src.x || + pending->viewport.src.y != current->viewport.src.y || + pending->viewport.src.width != current->viewport.src.width || + pending->viewport.src.height != current->viewport.src.height) { + // Damage the whole buffer on resize or viewport source box change pixman_region32_union_rect(buffer_damage, buffer_damage, 0, 0, pending->buffer_width, pending->buffer_height); } else { @@ -491,7 +495,7 @@ static void subsurface_parent_commit(struct wlr_subsurface *subsurface) { struct wlr_surface *surface = subsurface->surface; - + bool moved = subsurface->current.x != subsurface->pending.x || subsurface->current.y != subsurface->pending.y; if (subsurface->mapped && moved) { @@ -530,6 +534,9 @@ } subsurface->has_cache = true; subsurface->cached_seq = wlr_surface_lock_pending(surface); + } else if (subsurface->has_cache) { + wlr_surface_unlock_cached(surface, subsurface->cached_seq); + subsurface->has_cache = false; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/types/wlr_xdg_foreign_v1.c new/wlroots-0.15.1/types/wlr_xdg_foreign_v1.c --- old/wlroots-0.15.0/types/wlr_xdg_foreign_v1.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/types/wlr_xdg_foreign_v1.c 2022-02-03 22:19:54.000000000 +0100 @@ -33,7 +33,7 @@ if (wlr_surface_is_xdg_surface(surface)) { struct wlr_xdg_surface *xdg_surface = wlr_xdg_surface_from_wlr_surface(surface); - if (xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) { + if (xdg_surface == NULL || xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) { wl_resource_post_error(client_resource, -1, "surface must be an xdg_toplevel"); return false; @@ -151,7 +151,10 @@ wl_list_for_each_safe(child, child_tmp, &imported->children, link) { struct wlr_xdg_surface *xdg_child = wlr_xdg_surface_from_wlr_surface(child->surface); - wlr_xdg_toplevel_set_parent(xdg_child, NULL); + + if (xdg_child != NULL) { + wlr_xdg_toplevel_set_parent(xdg_child, NULL); + } } wl_list_remove(&imported->exported_destroyed.link); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.15.0/types/wlr_xdg_foreign_v2.c new/wlroots-0.15.1/types/wlr_xdg_foreign_v2.c --- old/wlroots-0.15.0/types/wlr_xdg_foreign_v2.c 2021-12-15 15:34:08.000000000 +0100 +++ new/wlroots-0.15.1/types/wlr_xdg_foreign_v2.c 2022-02-03 22:19:54.000000000 +0100 @@ -42,7 +42,7 @@ struct wlr_xdg_surface *xdg_surface = wlr_xdg_surface_from_wlr_surface(surface); - if (xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) { + if (xdg_surface == NULL || xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) { wl_resource_post_error(client_resource, ZXDG_EXPORTER_V2_ERROR_INVALID_SURFACE, "surface must be an xdg_toplevel"); @@ -157,7 +157,10 @@ wl_list_for_each_safe(child, child_tmp, &imported->children, link) { struct wlr_xdg_surface *xdg_child = wlr_xdg_surface_from_wlr_surface(child->surface); - wlr_xdg_toplevel_set_parent(xdg_child, NULL); + + if (xdg_child != NULL) { + wlr_xdg_toplevel_set_parent(xdg_child, NULL); + } } wl_list_remove(&imported->exported_destroyed.link);