diff --git a/CMakeLists.txt b/CMakeLists.txt index d9709c809..8fdd7d024 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -704,6 +704,12 @@ if(WITH_LIBVNCSERVER) ) endif(WITH_LIBVNCSERVER) +if(WITH_LIBVNCCLIENT) + list(APPEND SIMPLETESTS + client_capstest + ) +endif(WITH_LIBVNCCLIENT) + if(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT) AND WITH_LIBVNCSERVER AND WITH_LIBVNCCLIENT) set(SIMPLETESTS @@ -759,6 +765,9 @@ endif(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER) if(WITH_LIBVNCSERVER) add_test(NAME cargs COMMAND test_cargstest) endif(WITH_LIBVNCSERVER) +if(WITH_LIBVNCCLIENT) + add_test(NAME client_caps COMMAND test_client_capstest) +endif(WITH_LIBVNCCLIENT) if(UNIX) if(WITH_LIBVNCSERVER) add_test(NAME includetest_server COMMAND ${TESTS_DIR}/includetest.sh ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_MAKE_PROGRAM} "rfb/rfb.h") diff --git a/src/libvncclient/rfbclient.c b/src/libvncclient/rfbclient.c index f6baf641c..4c1eef351 100644 --- a/src/libvncclient/rfbclient.c +++ b/src/libvncclient/rfbclient.c @@ -1709,6 +1709,11 @@ SendExtDesktopSize(rfbClient* client, uint16_t width, uint16_t height) return TRUE; } + if (!SupportsClient2Server(client, rfbSetDesktopSize)) { + rfbClientLog("Server does not support SetDesktopSize - not sending dimensions %dx%d\n", width, height); + return TRUE; + } + if (client->screen.width != rfbClientSwap16IfLE(width) || client->screen.height != rfbClientSwap16IfLE(height)) { rfbClientLog("Sending dimensions %dx%d\n", width, height); sdm.type = rfbSetDesktopSize; @@ -2154,6 +2159,9 @@ HandleRFBServerMessage(rfbClient* client) } if (rect.encoding == rfbEncodingExtDesktopSize) { + /* A server that sends ExtendedDesktopSize must understand SetDesktopSize. */ + SetClient2Server(client, rfbSetDesktopSize); + /* read encoding data */ int screens; int loop; diff --git a/test/client_capstest.c b/test/client_capstest.c new file mode 100644 index 000000000..eb1ded082 --- /dev/null +++ b/test/client_capstest.c @@ -0,0 +1,26 @@ +#include + +int main(void) +{ + rfbClient* client; + + client = rfbGetClient(8, 3, 4); + if (!client) + return 1; + + client->screen.width = rfbClientSwap16IfLE(640); + client->screen.height = rfbClientSwap16IfLE(480); + + if (SupportsClient2Server(client, rfbSetDesktopSize)) { + rfbClientCleanup(client); + return 1; + } + + if (!SendExtDesktopSize(client, 800, 600)) { + rfbClientCleanup(client); + return 1; + } + + rfbClientCleanup(client); + return 0; +}