backend-vnc: use output power_state to disable repainting while disconnected
With weston_output_power_on/off() we can use power_state to disable repainting completely while no VNC client is connected. This allows to remove the initial repaint and per-output damage tracking. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
parent
1446d9cb3c
commit
40f5eaf401
@ -85,13 +85,8 @@ struct vnc_output {
|
||||
struct nvnc_display *display;
|
||||
|
||||
struct nvnc_fb_pool *fb_pool;
|
||||
/* damage accumulated while not repainting */
|
||||
pixman_region32_t damage;
|
||||
|
||||
struct wl_list peers;
|
||||
|
||||
/* used to trigger initial repaint */
|
||||
bool fb_pool_empty;
|
||||
};
|
||||
|
||||
struct vnc_peer {
|
||||
@ -436,6 +431,7 @@ static void
|
||||
vnc_client_cleanup(struct nvnc_client *client)
|
||||
{
|
||||
struct vnc_peer *peer = nvnc_get_userdata(client);
|
||||
struct vnc_output *output = peer->backend->output;
|
||||
|
||||
wl_list_remove(&peer->link);
|
||||
weston_seat_release_keyboard(peer->seat);
|
||||
@ -443,6 +439,9 @@ vnc_client_cleanup(struct nvnc_client *client)
|
||||
weston_seat_release(peer->seat);
|
||||
free(peer);
|
||||
weston_log("VNC Client disconnected\n");
|
||||
|
||||
if (wl_list_empty(&output->peers))
|
||||
weston_output_power_off(&output->base);
|
||||
}
|
||||
|
||||
static struct weston_pointer *
|
||||
@ -668,6 +667,9 @@ vnc_new_client(struct nvnc_client *client)
|
||||
weston_seat_init_pointer(peer->seat);
|
||||
weston_seat_init_keyboard(peer->seat, backend->xkb_keymap);
|
||||
|
||||
if (wl_list_empty(&output->peers))
|
||||
weston_output_power_on(&output->base);
|
||||
|
||||
wl_list_insert(&output->peers, &peer->link);
|
||||
|
||||
nvnc_set_userdata(client, peer, NULL);
|
||||
@ -743,16 +745,8 @@ vnc_output_enable(struct weston_output *base)
|
||||
|
||||
output->display = nvnc_display_new(0, 0);
|
||||
|
||||
pixman_region32_init(&output->damage);
|
||||
|
||||
nvnc_add_display(backend->server, output->display);
|
||||
|
||||
/*
|
||||
* Neat VNC warns when a client connects before a display buffer has
|
||||
* been set. Repaint once to create an initial buffer.
|
||||
*/
|
||||
output->fb_pool_empty = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -770,8 +764,6 @@ vnc_output_disable(struct weston_output *base)
|
||||
if (!output->base.enabled)
|
||||
return 0;
|
||||
|
||||
pixman_region32_fini(&output->damage);
|
||||
|
||||
nvnc_display_unref(output->display);
|
||||
nvnc_fb_pool_unref(output->fb_pool);
|
||||
|
||||
@ -905,18 +897,11 @@ vnc_output_repaint(struct weston_output *base, pixman_region32_t *damage)
|
||||
|
||||
assert(output);
|
||||
|
||||
if (wl_list_empty(&output->peers))
|
||||
weston_output_power_off(base);
|
||||
|
||||
if (pixman_region32_not_empty(damage)) {
|
||||
/* Accumulate damage for the next repaint */
|
||||
pixman_region32_union(&output->damage,
|
||||
&output->damage, damage);
|
||||
|
||||
/* Only repaint when a client is connected */
|
||||
if (!wl_list_empty(&output->peers) || output->fb_pool_empty) {
|
||||
vnc_update_buffer(output->display, &output->damage);
|
||||
pixman_region32_clear(&output->damage);
|
||||
output->fb_pool_empty = false;
|
||||
}
|
||||
|
||||
vnc_update_buffer(output->display, damage);
|
||||
pixman_region32_subtract(&ec->primary_plane.damage,
|
||||
&ec->primary_plane.damage, damage);
|
||||
}
|
||||
@ -1071,19 +1056,6 @@ static const struct weston_vnc_output_api api = {
|
||||
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);
|
||||
|
||||
if (!output)
|
||||
return;
|
||||
|
||||
/* Move accumulated damage with output */
|
||||
pixman_region32_translate(&output->damage, base->move_x, base->move_y);
|
||||
}
|
||||
|
||||
static int
|
||||
vnc_aml_dispatch(int fd, uint32_t mask, void *data)
|
||||
{
|
||||
@ -1202,10 +1174,6 @@ vnc_backend_create(struct weston_compositor *compositor,
|
||||
|
||||
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,
|
||||
&api, sizeof(api));
|
||||
if (ret < 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user