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);

Reply via email to