backend-vnc: move accumulated damage with output
When the output is moved, move its per-framebuffer accumulated damage with it. The alternative would be to track accumulated damage in the local output coordinate system, but that would require translating back into global coordinates for repaint_output. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
parent
0ece6cb436
commit
ce4cf2d060
@ -62,6 +62,7 @@ struct vnc_backend {
|
|||||||
struct weston_backend base;
|
struct weston_backend base;
|
||||||
struct weston_compositor *compositor;
|
struct weston_compositor *compositor;
|
||||||
struct vnc_output *output;
|
struct vnc_output *output;
|
||||||
|
struct wl_listener output_move_listener;
|
||||||
|
|
||||||
struct xkb_rule_names xkb_rule_name;
|
struct xkb_rule_names xkb_rule_name;
|
||||||
struct xkb_keymap *xkb_keymap;
|
struct xkb_keymap *xkb_keymap;
|
||||||
@ -707,6 +708,8 @@ vnc_destroy(struct weston_compositor *ec)
|
|||||||
struct weston_head *base, *next;
|
struct weston_head *base, *next;
|
||||||
struct vnc_backend *backend = to_vnc_backend(ec);
|
struct vnc_backend *backend = to_vnc_backend(ec);
|
||||||
|
|
||||||
|
wl_list_remove(&backend->output_move_listener.link);
|
||||||
|
|
||||||
nvnc_close(backend->server);
|
nvnc_close(backend->server);
|
||||||
|
|
||||||
weston_compositor_shutdown(ec);
|
weston_compositor_shutdown(ec);
|
||||||
@ -918,6 +921,22 @@ static const struct weston_vnc_output_api api = {
|
|||||||
vnc_output_set_size,
|
vnc_output_set_size,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
vnc_handle_output_move(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct weston_output *base = data;
|
||||||
|
struct vnc_output *output = to_vnc_output(base);
|
||||||
|
struct fb_side_data *fb_side_data;
|
||||||
|
|
||||||
|
if (!output)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Move accumulated damage with output */
|
||||||
|
wl_list_for_each(fb_side_data, &output->fb_side_data_list, link)
|
||||||
|
pixman_region32_translate(&fb_side_data->damage, base->move_x,
|
||||||
|
base->move_y);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vnc_aml_dispatch(int fd, uint32_t mask, void *data)
|
vnc_aml_dispatch(int fd, uint32_t mask, void *data)
|
||||||
{
|
{
|
||||||
@ -1020,6 +1039,10 @@ vnc_backend_create(struct weston_compositor *compositor,
|
|||||||
|
|
||||||
weston_log("TLS support activated\n");
|
weston_log("TLS support activated\n");
|
||||||
|
|
||||||
|
backend->output_move_listener.notify = vnc_handle_output_move;
|
||||||
|
wl_signal_add(&compositor->output_moved_signal,
|
||||||
|
&backend->output_move_listener);
|
||||||
|
|
||||||
ret = weston_plugin_api_register(compositor, WESTON_VNC_OUTPUT_API_NAME,
|
ret = weston_plugin_api_register(compositor, WESTON_VNC_OUTPUT_API_NAME,
|
||||||
&api, sizeof(api));
|
&api, sizeof(api));
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user