summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>2014-06-30 11:52:07 +0300
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2014-07-25 15:08:06 +0300
commiteb3cf22018beee559d3239e51fdc82610387fc63 (patch)
tree7b9ca5c9e4ae377772b1461bc9aefde35c76891a
parent0250a740c2320d0eeafabfedcbea20ef95b45f43 (diff)
compositor: quick fix for sub-surface mapping
If a client does this: 1. create a main window and map it 2. create a wl_surface, and make it a sub-surface of the main window 3. set the sub-surface to desync 4. commit content to the sub-surface to map it Then step 4 should cause the sub-surface to become mapped. However, Weston fails to schedule a repaint in that case, so the sub-surface will not appear until something else causes a repaint on that output, e.g. the main window. A quick and dirty fix is to set the output mask for the surface in Weston, which allows the repaint to be scheduled. This patch implements that, and might only work right on single-output systems. A proper fix would involve rewriting the whole "is surface mapped" mechanism in Weston, to not rely on output assignments but to have a separate flag for "mapped", and figuring out how to schedule repaints for the right outputs. Following is the actual protocol sequence used to trigger the problem: [3224648.125] -> wl_compositor@4.create_surface(new id wl_surface@3) [3224648.206] -> xdg_shell@7.get_xdg_surface(new id xdg_surface@8, wl_surface@3) [3224648.311] -> xdg_surface@8.set_title("simple-shm") [3224648.378] -> wl_surface@3.damage(0, 0, 250, 250) [3224649.888] -> wl_shm@6.create_pool(new id wl_shm_pool@9, fd 6, 250000) [3224650.031] -> wl_shm_pool@9.create_buffer(new id wl_buffer@10, 0, 250, 250, 1000, 1) [3224650.244] -> wl_shm_pool@9.destroy() [3224651.975] -> wl_surface@3.attach(wl_buffer@10, 0, 0) [3224652.100] -> wl_surface@3.damage(20, 20, 210, 210) [3224652.243] -> wl_surface@3.frame(new id wl_callback@11) [3224652.317] -> wl_surface@3.commit() [3228652.535] -> wl_compositor@4.create_surface(new id wl_surface@12) [3228652.610] -> wl_subcompositor@5.get_subsurface(new id wl_subsurface@13, wl_surface@12, wl_surface@3) [3228652.644] -> wl_subsurface@13.set_desync() [3228652.659] -> wl_subsurface@13.set_position(100, 100) [3228654.090] -> wl_shm@6.create_pool(new id wl_shm_pool@14, fd 6, 250000) [3228654.140] -> wl_shm_pool@14.create_buffer(new id wl_buffer@15, 0, 250, 250, 1000, 1) [3228654.180] -> wl_shm_pool@14.destroy() [3228654.408] -> wl_surface@12.attach(wl_buffer@15, 0, 0) [3228654.436] -> wl_surface@12.damage(0, 0, 250, 250) [3228654.462] -> wl_surface@12.commit() Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Cc: George Kiagiadakis <george.kiagiadakis@collabora.com> Cc: Jason Ekstrand <jason.ekstrand@intel.com>
-rw-r--r--src/compositor.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/compositor.c b/src/compositor.c
index 2b52b4f5..02f569f6 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -2554,6 +2554,8 @@ subsurface_configure(struct weston_surface *surface, int32_t dx, int32_t dy)
* will not be drawn either.
*/
if (!weston_surface_is_mapped(surface)) {
+ struct weston_output *output;
+
/* Cannot call weston_surface_update_transform(),
* because that would call it also for the parent surface,
* which might not be mapped yet. That would lead to
@@ -2563,11 +2565,14 @@ subsurface_configure(struct weston_surface *surface, int32_t dx, int32_t dy)
* Instead just assing any output, to make
* weston_surface_is_mapped() return true, so that when the
* parent surface does get mapped, this one will get
- * included, too. See surface_list_add().
+ * included, too. See view_list_add().
*/
assert(!wl_list_empty(&compositor->output_list));
- surface->output = container_of(compositor->output_list.next,
- struct weston_output, link);
+ output = container_of(compositor->output_list.next,
+ struct weston_output, link);
+
+ surface->output = output;
+ weston_surface_update_output_mask(surface, 1 << output->id);
}
}