[PATCH] compositor: Ensure views on hiden workspace are listening correct output
Xiong Zhang
xiong.y.zhang at intel.com
Thu Dec 19 01:26:49 PST 2013
The views on hiden workspace can't restored correctly when their
output was unplugged. There are two reasons:
First: the views on hiden workspace is restored through animation
which will change y coordinate continually, if the y coordinate of
invisible views are setted to first_output->height/4, these views
will be changed to some invisible region by animation.
Second: the wrong way to manage view->output_destroy_listener.link.
Considering the following serials:
a. the view is visible, so the view listen one output signal
b. the view is invisible, view->output_mask = 0 and view is still
listenering the previous output signal
c. the view is visible again. We will add view to previous output
signal again without removing the view from the previous output
signal. So the listener list of previous output's signal is wrong
at this point.When the output is unplgged, the system will dead
loop on the listener list of this output signal.
Signed-off-by: Xiong Zhang <xiong.y.zhang at intel.com>
---
src/compositor.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/compositor.c b/src/compositor.c
index 6ca297a..9929be1 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -383,7 +383,7 @@ weston_view_output_destroy_handler(struct wl_listener *listener,
/* the child window's view->geometry is a relative coordinate to
* parent view, no need to move child_view. */
- if (ev->geometry.parent)
+ if (ev->geometry.parent || wl_list_empty(&ec->output_list))
return;
x = ev->geometry.x;
@@ -406,7 +406,8 @@ weston_view_output_destroy_handler(struct wl_listener *listener,
struct weston_output, link);
x = first_output->x + first_output->width / 4;
- y = first_output->y + first_output->height / 4;
+ if (y > first_output->y)
+ y = first_output->y + first_output->height / 4;
}
weston_view_set_position(ev, x, y);
@@ -905,7 +906,7 @@ weston_view_assign_output(struct weston_view *ev)
}
pixman_region32_fini(®ion);
- if (ev->output_mask != 0) {
+ if (!wl_list_empty(&ev->output_destroy_listener.link) && mask != 0) {
wl_list_remove(&ev->output_move_listener.link);
wl_list_remove(&ev->output_destroy_listener.link);
}
--
1.8.3.2
More information about the wayland-devel
mailing list