From d4d5f2e75bdea9f1c4585a062850872dad3a30d2 Mon Sep 17 00:00:00 2001 From: Andri Yngvason Date: Sun, 3 Jul 2022 10:46:29 +0000 Subject: [PATCH] vnc: Set a variable to tell that a framebuffer update is in progress --- include/vnc.h | 1 + src/vnc.c | 28 ++++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/include/vnc.h b/include/vnc.h index ce757e4..33f677b 100644 --- a/include/vnc.h +++ b/include/vnc.h @@ -49,6 +49,7 @@ struct vnc_client { struct pixman_region16 damage; bool handler_lock; + bool is_updating; }; struct vnc_client* vnc_client_create(void); diff --git a/src/vnc.c b/src/vnc.c index 71259a8..73e1512 100644 --- a/src/vnc.c +++ b/src/vnc.c @@ -94,6 +94,26 @@ static void vnc_client_clear_av_frames(struct vnc_client* self) self->n_av_frames = 0; } +static void vnc_client_start_update(rfbClient* client) +{ + struct vnc_client* self = rfbClientGetClientData(client, NULL); + assert(self); + + self->pts = NO_PTS; + pixman_region_clear(&self->damage); + vnc_client_clear_av_frames(self); + + self->is_updating = true; +} + +static void vnc_client_cancel_update(rfbClient* client) +{ + struct vnc_client* self = rfbClientGetClientData(client, NULL); + assert(self); + + self->is_updating = false; +} + static void vnc_client_finish_update(rfbClient* client) { struct vnc_client* self = rfbClientGetClientData(client, NULL); @@ -101,11 +121,9 @@ static void vnc_client_finish_update(rfbClient* client) DTRACE_PROBE2(wlvncc, vnc_client_finish_update, client, self->pts); - self->update_fb(self); + self->is_updating = false; - self->pts = NO_PTS; - pixman_region_clear(&self->damage); - vnc_client_clear_av_frames(self); + self->update_fb(self); } static void vnc_client_got_cut_text(rfbClient* client, const char* text, @@ -225,6 +243,8 @@ struct vnc_client* vnc_client_create(void) client->MallocFrameBuffer = vnc_client_alloc_fb; client->GotFrameBufferUpdate = vnc_client_update_box; client->FinishedFrameBufferUpdate = vnc_client_finish_update; + client->StartingFrameBufferUpdate = vnc_client_start_update; + client->CancelledFrameBufferUpdate = vnc_client_cancel_update; client->GotXCutText = vnc_client_got_cut_text; self->pts = NO_PTS;