summaryrefslogtreecommitdiffstats
path: root/client_examples
diff options
context:
space:
mode:
Diffstat (limited to 'client_examples')
-rw-r--r--client_examples/Makefile.am2
-rw-r--r--client_examples/SDLvncviewer.c6
-rw-r--r--client_examples/backchannel.c99
3 files changed, 103 insertions, 4 deletions
diff --git a/client_examples/Makefile.am b/client_examples/Makefile.am
index 6ffcf51..77998f0 100644
--- a/client_examples/Makefile.am
+++ b/client_examples/Makefile.am
@@ -23,7 +23,7 @@ SDLvncviewer_CFLAGS=$(SDL_CFLAGS)
SDLvncviewer_LDADD=$(LDADD) $(SDL_LIBS)
endif
-noinst_PROGRAMS=ppmtest $(SDLVIEWER) $(FFMPEG_CLIENT)
+noinst_PROGRAMS=ppmtest $(SDLVIEWER) $(FFMPEG_CLIENT) backchannel
diff --git a/client_examples/SDLvncviewer.c b/client_examples/SDLvncviewer.c
index 07d3869..8375ea6 100644
--- a/client_examples/SDLvncviewer.c
+++ b/client_examples/SDLvncviewer.c
@@ -16,7 +16,7 @@ static rfbBool resize(rfbClient* client) {
okay=SDL_VideoModeOK(width,height,depth,flags);
if(okay) {
SDL_Surface* sdl=SDL_SetVideoMode(width,height,depth,flags);
- client->clientData=sdl;
+ rfbClientSetClientData(client, SDL_Init, sdl);
client->frameBuffer=sdl->pixels;
if(first || depth!=client->format.bitsPerPixel) {
first=FALSE;
@@ -30,7 +30,7 @@ static rfbBool resize(rfbClient* client) {
SetFormatAndEncodings(client);
}
} else {
- SDL_Surface* sdl=client->clientData;
+ SDL_Surface* sdl=rfbClientGetClientData(client, SDL_Init);
rfbClientLog("Could not set resolution %dx%d!\n",
client->width,client->height);
if(sdl) {
@@ -188,7 +188,7 @@ static rfbKeySym SDL_keysym2rfbKeySym(int keysym) {
}
static void update(rfbClient* cl,int x,int y,int w,int h) {
- SDL_UpdateRect(cl->clientData, x, y, w, h);
+ SDL_UpdateRect(rfbClientGetClientData(cl, SDL_Init), x, y, w, h);
}
#ifdef __MINGW32__
diff --git a/client_examples/backchannel.c b/client_examples/backchannel.c
new file mode 100644
index 0000000..643754e
--- /dev/null
+++ b/client_examples/backchannel.c
@@ -0,0 +1,99 @@
+/* A simple example of an RFB client */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <errno.h>
+#include <rfb/rfbclient.h>
+
+static void HandleRect(rfbClient* client, int x, int y, int w, int h) {
+}
+
+/*
+ * The client part of the back channel extension example.
+ *
+ */
+
+#define rfbBackChannel 155
+
+typedef struct backChannelMsg {
+ uint8_t type;
+ uint8_t pad1;
+ uint16_t pad2;
+ uint32_t size;
+} backChannelMsg;
+
+static void sendMessage(rfbClient* client, char* text)
+{
+ backChannelMsg msg;
+ uint32_t length = strlen(text)+1;
+
+ msg.type = rfbBackChannel;
+ msg.size = rfbClientSwap32IfLE(length);
+ if(!WriteToRFBServer(client, (char*)&msg, sizeof(msg)) ||
+ !WriteToRFBServer(client, text, length)) {
+ rfbClientLog("enableBackChannel: write error (%d: %s)", errno, strerror(errno));
+ }
+}
+
+static rfbBool handleBackChannelMessage(rfbClient* client,
+ rfbServerToClientMsg* message)
+{
+ backChannelMsg msg;
+ char* text;
+
+ if(message->type != rfbBackChannel)
+ return FALSE;
+
+ rfbClientSetClientData(client, sendMessage, sendMessage);
+
+ if(!ReadFromRFBServer(client, ((char*)&msg)+1, sizeof(msg)-1))
+ return TRUE;
+ msg.size = rfbClientSwap32IfLE(msg.size);
+ text = malloc(msg.size);
+ if(!ReadFromRFBServer(client, text, msg.size)) {
+ free(text);
+ return TRUE;
+ }
+
+ rfbClientLog("got back channel message: %s\n", text);
+ free(text);
+
+ return TRUE;
+}
+
+static int backChannelEncodings[] = { rfbBackChannel, 0 };
+
+static rfbClientProtocolExtension backChannel = {
+ backChannelEncodings, /* encodings */
+ NULL, /* handleEncoding */
+ handleBackChannelMessage, /* handleMessage */
+ NULL /* next extension */
+};
+
+int
+main(int argc, char **argv)
+{
+ rfbClient* client = rfbGetClient(8,3,4);
+
+ client->GotFrameBufferUpdate = HandleRect;
+ rfbClientRegisterExtension(&backChannel);
+
+ if (!rfbInitClient(client,&argc,argv))
+ return 1;
+
+ while (1) {
+ /* After each idle second, send a message */
+ if(WaitForMessage(client,1000000)>0)
+ HandleRFBServerMessage(client);
+ else if(rfbClientGetClientData(client, sendMessage))
+ sendMessage(client, "Dear Server,\n"
+ "thank you for understanding "
+ "back channel messages!");
+ }
+
+ rfbClientCleanup(client);
+
+ return 0;
+}
+