diff --git a/unix/kasmxproxy/CMakeLists.txt b/unix/kasmxproxy/CMakeLists.txt index 9319bb9..ee846ef 100644 --- a/unix/kasmxproxy/CMakeLists.txt +++ b/unix/kasmxproxy/CMakeLists.txt @@ -3,6 +3,6 @@ include_directories(${X11_INCLUDE_DIR}) add_executable(kasmxproxy kasmxproxy.c) -target_link_libraries(kasmxproxy ${X11_LIBRARIES} ${X11_XTest_LIB}) +target_link_libraries(kasmxproxy ${X11_LIBRARIES} ${X11_XTest_LIB} ${X11_Xrandr_LIB}) install(TARGETS kasmxproxy DESTINATION ${BIN_DIR}) diff --git a/unix/kasmxproxy/kasmxproxy.c b/unix/kasmxproxy/kasmxproxy.c index bf07570..dc091c7 100644 --- a/unix/kasmxproxy/kasmxproxy.c +++ b/unix/kasmxproxy/kasmxproxy.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -149,7 +150,46 @@ int main(int argc, char **argv) { break; if (resize && (appattr.width != vncattr.width || appattr.height != vncattr.height)) { - // TODO resize app display to VNC display size + // resize app display to VNC display size + XRRScreenConfiguration *config = XRRGetScreenInfo(appdisp, approot); + + int nsizes, i, match = -1; + XRRScreenSize *sizes = XRRConfigSizes(config, &nsizes); + //printf("%u sizes\n", nsizes); + for (i = 0; i < nsizes; i++) { + if (sizes[i].width == vncattr.width && + sizes[i].height == vncattr.height) { + //printf("match %u\n", i); + match = i; + break; + } + } + + if (match >= 0) { + XRRSetScreenConfig(appdisp, config, approot, match, + RR_Rotate_0, CurrentTime); + } else { + /*XRRSetScreenSize(appdisp, approot, + vncattr.width, vncattr.height, + sizes[0].mwidth, sizes[0].mheight);*/ + XRRScreenResources *res = XRRGetScreenResources(appdisp, approot); + + char name[32]; + sprintf(name, "%ux%u", vncattr.width, vncattr.height); + XRRModeInfo *mode = XRRAllocModeInfo(name, strlen(name)); + + mode->width = vncattr.width; + mode->height = vncattr.height; + + RRMode rmode = XRRCreateMode(appdisp, approot, mode); + XRRAddOutputMode(appdisp, + res->outputs[0], + rmode); + XRRFreeModeInfo(mode); + XRRFreeScreenResources(res); + } + + XRRFreeScreenConfigInfo(config); } const unsigned w = min(appattr.width, vncattr.width);