[PATCH v3] xwayland: Update screen size on output removal
Marek Chalupa
mchqwerty at gmail.com
Mon Nov 23 01:00:30 PST 2015
Hi,
looks good to me and seems working
Reviewed-by: Marek Chalupa <mchqwerty at gmail.com>
Cheers,
Marek
On 11/20/2015 07:05 PM, Olivier Fourdan wrote:
> When unplugging an output, it's still listed in xrandr and the size
> of the root window still includes the removed output.
>
> The RR output should be destroyed when its Wayland counterpart is
> destroyed and the screen dimensions must be updated in both the done
> and the destroy handlers.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92914
> Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
> ---
> v2: Less intrusive patch
> v3: Simpler patch, no need to skip the output being removed, simply
> remove it from the list prior to walk the list.
>
> hw/xwayland/xwayland-output.c | 64 +++++++++++++++++++++++++++----------------
> 1 file changed, 41 insertions(+), 23 deletions(-)
>
> diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c
> index e4623d4..5ef444d 100644
> --- a/hw/xwayland/xwayland-output.c
> +++ b/hw/xwayland/xwayland-output.c
> @@ -159,33 +159,11 @@ approximate_mmpd(struct xwl_screen *xwl_screen)
> }
>
> static void
> -output_handle_done(void *data, struct wl_output *wl_output)
> +update_screen_size(struct xwl_output *xwl_output, int width, int height)
> {
> - struct xwl_output *it, *xwl_output = data;
> struct xwl_screen *xwl_screen = xwl_output->xwl_screen;
> - int width = 0, height = 0, has_this_output = 0;
> double mmpd;
>
> - xorg_list_for_each_entry(it, &xwl_screen->output_list, link) {
> - /* output done event is sent even when some property
> - * of output is changed. That means that we may already
> - * have this output. If it is true, we must not add it
> - * into the output_list otherwise we'll corrupt it */
> - if (it == xwl_output)
> - has_this_output = 1;
> -
> - output_get_new_size(it, &height, &width);
> - }
> -
> - if (!has_this_output) {
> - xorg_list_append(&xwl_output->link, &xwl_screen->output_list);
> -
> - /* we did not check this output for new screen size, do it now */
> - output_get_new_size(xwl_output, &height, &width);
> -
> - --xwl_screen->expecting_event;
> - }
> -
> if (xwl_screen->screen->root)
> SetRootClip(xwl_screen->screen, FALSE);
>
> @@ -214,6 +192,36 @@ output_handle_done(void *data, struct wl_output *wl_output)
> }
>
> static void
> +output_handle_done(void *data, struct wl_output *wl_output)
> +{
> + struct xwl_output *it, *xwl_output = data;
> + struct xwl_screen *xwl_screen = xwl_output->xwl_screen;
> + int width = 0, height = 0, has_this_output = 0;
> +
> + xorg_list_for_each_entry(it, &xwl_screen->output_list, link) {
> + /* output done event is sent even when some property
> + * of output is changed. That means that we may already
> + * have this output. If it is true, we must not add it
> + * into the output_list otherwise we'll corrupt it */
> + if (it == xwl_output)
> + has_this_output = 1;
> +
> + output_get_new_size(it, &height, &width);
> + }
> +
> + if (!has_this_output) {
> + xorg_list_append(&xwl_output->link, &xwl_screen->output_list);
> +
> + /* we did not check this output for new screen size, do it now */
> + output_get_new_size(xwl_output, &height, &width);
> +
> + --xwl_screen->expecting_event;
> + }
> +
> + update_screen_size(xwl_output, width, height);
> +}
> +
> +static void
> output_handle_scale(void *data, struct wl_output *wl_output, int32_t factor)
> {
> }
> @@ -259,8 +267,18 @@ xwl_output_create(struct xwl_screen *xwl_screen, uint32_t id)
> void
> xwl_output_destroy(struct xwl_output *xwl_output)
> {
> + struct xwl_output *it;
> + struct xwl_screen *xwl_screen = xwl_output->xwl_screen;
> + int width = 0, height = 0;
> +
> wl_output_destroy(xwl_output->output);
> xorg_list_del(&xwl_output->link);
> + RROutputDestroy(xwl_output->randr_output);
> +
> + xorg_list_for_each_entry(it, &xwl_screen->output_list, link)
> + output_get_new_size(it, &height, &width);
> + update_screen_size(xwl_output, width, height);
> +
> free(xwl_output);
> }
>
>
More information about the xorg-devel
mailing list