Skip to content

Commit eb83123

Browse files
author
Volodymyr Samokhatko
committed
libvncserver: fbu hooks
1 parent b4312dd commit eb83123

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

include/rfb/rfb.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ enum rfbProtocolExtensionHookType {
207207
RFB_PROTOCOL_EXTENSION_HOOK_CLOSE,
208208
RFB_PROTOCOL_EXTENSION_HOOK_USAGE,
209209
RFB_PROTOCOL_EXTENSION_HOOK_PROCESS_ARGUMENT,
210+
RFB_PROTOCOL_EXTENSION_HOOK_PRE_FBU,
211+
RFB_PROTOCOL_EXTENSION_HOOK_POST_FBU,
210212
};
211213

212214
typedef void* rfbProtocolExtensionHookGeneric;
@@ -248,6 +250,13 @@ _Static_assert(sizeof(rfbProtocolExtensionHookGeneric) == sizeof(rfbProtocolExte
248250
typedef int (*rfbProtocolExtensionHookProcessArgument)(int argc, char *argv[]);
249251
_Static_assert(sizeof(rfbProtocolExtensionHookGeneric) == sizeof(rfbProtocolExtensionHookProcessArgument), "extension hook size doesn't match");
250252

253+
/** returns TRUE if proceed with the framebuffer update (PostFbu is called in any case). */
254+
typedef rfbBool (*rfbProtocolExtensionHookPreFbu)(struct _rfbClientRec* client, void* data);
255+
_Static_assert(sizeof(rfbProtocolExtensionHookGeneric) == sizeof(rfbProtocolExtensionHookPreFbu), "extension hook size doesn't match");
256+
257+
typedef void (*rfbProtocolExtensionHookPostFbu)(struct _rfbClientRec* client, void* data);
258+
_Static_assert(sizeof(rfbProtocolExtensionHookGeneric) == sizeof(rfbProtocolExtensionHookPostFbu), "extension hook size doesn't match");
259+
251260
typedef struct _rfbProtocolExtensionElement {
252261
union {
253262
/** for the type 1 extensions */
@@ -261,6 +270,9 @@ typedef struct _rfbProtocolExtensionElement {
261270
rfbProtocolExtensionHookClose close;
262271
rfbProtocolExtensionHookUsage usage;
263272
rfbProtocolExtensionHookProcessArgument processArgument;
273+
274+
rfbProtocolExtensionHookPreFbu preFbu;
275+
rfbProtocolExtensionHookPostFbu postFbu;
264276
} hook;
265277
/** which hook it is */
266278
int type;

src/libvncserver/rfbserver.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3411,6 +3411,22 @@ rfbSendFramebufferUpdate(rfbClientPtr cl,
34113411
* Now send the update.
34123412
*/
34133413

3414+
rfbBool extensionsAllowProceed = TRUE;
3415+
rfbExtension2Data *e = cl->extensions2;
3416+
for (; e; e = e->next) {
3417+
rfbProtocolExtensionElement* el = e->extension2->elements;
3418+
for (; el && el < e->extension2->elements + e->extension2->elementsCount; ++el) {
3419+
if (el->type == RFB_PROTOCOL_EXTENSION_HOOK_PRE_FBU) {
3420+
extensionsAllowProceed = extensionsAllowProceed && el->hook.preFbu(cl, e->data);
3421+
break;
3422+
}
3423+
}
3424+
}
3425+
3426+
if (!extensionsAllowProceed) {
3427+
goto updateFailed;
3428+
}
3429+
34143430
rfbStatRecordMessageSent(cl, rfbFramebufferUpdate, 0, 0);
34153431
if (cl->preferredEncoding == rfbEncodingCoRRE) {
34163432
nUpdateRegionRects = 0;
@@ -3647,6 +3663,17 @@ rfbSendFramebufferUpdate(rfbClientPtr cl,
36473663
result = FALSE;
36483664
}
36493665

3666+
e = cl->extensions2;
3667+
for (; e; e = e->next) {
3668+
rfbProtocolExtensionElement* el = e->extension2->elements;
3669+
for (; el && el < e->extension2->elements + e->extension2->elementsCount; ++el) {
3670+
if (el->type == RFB_PROTOCOL_EXTENSION_HOOK_POST_FBU) {
3671+
el->hook.postFbu(cl, e->data);
3672+
break;
3673+
}
3674+
}
3675+
}
3676+
36503677
if (!cl->enableCursorShapeUpdates) {
36513678
rfbHideCursor(cl);
36523679
}

0 commit comments

Comments
 (0)