diff options
-rw-r--r-- | hw/xwayland/xwayland-output.c | 64 |
1 files changed, 41 insertions, 23 deletions
diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c index 8b2f8cb1c..e9ec190f0 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->rootless) SetRootClip(xwl_screen->screen, FALSE); @@ -216,6 +194,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) { } @@ -284,8 +292,18 @@ err: 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); } |