Adam, that link you gave only provides partial XRandR extension support, which iirc, does *not* include dynamic resizing of the X server.
Paresh, VNC developers have decided not to officially include RandR support for an as yet unexplained reason. The current RandR protocol version is at 1.2. I have patched my VNC server to support *some* of RandR 1.1, including resize capability. I have attached the file you need to enable resize support. Thanks go out to Nikita Youshchenko at Debian for this patch. Let us know if you have any problems implementing this patch. The rate at which this issue is raised, even on this one list, and the nearly non-existent response it gets from developers is alarming. -Chris -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Adam Tkac Sent: Thursday, April 03, 2008 4:35 AM To: PARESH MASANI Cc: vnc-list@realvnc.com; [EMAIL PROTECTED] Subject: Re: To resize the VNC session window size On Thu, Apr 03, 2008 at 01:32:59PM +0530, PARESH MASANI wrote: > Hi, > > I created a VNC session using vncserver with resolution 3200x1200. Is it > possible to resize this VNC session to 1400x1050 or any other value such that > next time when i opened that VNC session, it should have changed resoultion.? > Thanks, > Paresh > Not now. Server has to support RandR extension but it is not developed yet (something exists on http://www.freesoft.org/software/vncrotation/ but I never tested it). You have to stop that session and start it again with new resolution. Adam -- Adam Tkac, Red Hat, Inc. _______________________________________________ VNC-List mailing list VNC-List@realvnc.com To remove yourself from the list visit: http://www.realvnc.com/mailman/listinfo/vnc-list diff -urN vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/randr/randr.c vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/randr/randr.c --- vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/randr/randr.c 2003-02-08 06:52:30.000000000 +0300 +++ vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/randr/randr.c 2006-06-03 16:34:48.000000000 +0400 @@ -726,10 +726,31 @@ * timestamp, then the config information isn't up-to-date and * can't even be validated */ + /* A DIRTY WORKAROUND. + * Looks like under some reasons, this test fails, although 32bit timestamp + * passed in stuff->configTimestamp is exactly the same as was returned + * in RRGetScreenInfo just before. So 'months' parts differ. Maybe + * some bug elsewhere, causing 'months' jump? Or maybe it could happen + * if enough time passed since previous configuration? I'm afraid that + * both have happened here ... + * Since I have no time to investigate details, I'm just replacing this + * with 32bit compare. Probability of config times that differ only + * in months is extremely low ... */ if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0) { - rep.status = RRSetConfigInvalidConfigTime; - goto sendReply; + if (pScrPriv->lastConfigTime.milliseconds == stuff->configTimestamp) + { + ErrorF("Point X: last: %lu %lu, new: %lu %lu\n", + pScrPriv->lastConfigTime.months, + pScrPriv->lastConfigTime.milliseconds, + configTime.months, + configTime.milliseconds); + } + else + { + rep.status = RRSetConfigInvalidConfigTime; + goto sendReply; + } } /* diff -urN vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/vncHooks.cc vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/vncHooks.cc --- vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/vncHooks.cc 2006-06-03 16:14:57.000000000 +0400 +++ vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/vncHooks.cc 2006-06-03 16:14:30.000000000 +0400 @@ -1530,3 +1530,11 @@ vncHooksScreen->desktop->add_changed(changed.reg); } + +void vncHooksResizeScreen(ScreenPtr pScreen) +{ + vncHooksScreenPtr vncHooksScreen + = ((vncHooksScreenPtr)pScreen->devPrivates[vncHooksScreenIndex].ptr); + + vncHooksScreen->desktop->setSize(pScreen->width, pScreen->height); +} diff -urN vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/XserverDesktop.cc vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/XserverDesktop.cc --- vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/XserverDesktop.cc 2005-03-11 18:08:41.000000000 +0300 +++ vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/XserverDesktop.cc 2006-06-03 16:14:30.000000000 +0400 @@ -193,6 +193,9 @@ else data = new rdr::U8[pScreen->width * pScreen->height * (format.bpp/8)]; colourmap = this; +#ifdef RANDR + initialWidth = width_; +#endif serverReset(pScreen); @@ -714,7 +717,11 @@ grabbing = true; int bytesPerPixel = format.bpp/8; +#ifdef RANDR + int bytesPerRow = initialWidth * bytesPerPixel; +#else int bytesPerRow = pScreen->width * bytesPerPixel; +#endif std::vector<rfb::Rect> rects; std::vector<rfb::Rect>::iterator i; diff -urN vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/XserverDesktop.h vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/XserverDesktop.h --- vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/XserverDesktop.h 2005-03-11 18:08:41.000000000 +0300 +++ vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/XserverDesktop.h 2006-06-03 16:14:30.000000000 +0400 @@ -68,6 +68,12 @@ void addClient(network::Socket* sock, bool reverse); void disconnectClients(); +#ifdef RANDR + void setSize(int w, int h) { + width_ = w; height_ = h; server->setPixelBuffer(this); + } +#endif + // QueryConnect methods called from X server code // getQueryTimeout() // Returns the timeout associated with a particular @@ -126,5 +132,9 @@ void* queryConnectId; rfb::CharArray queryConnectAddress; rfb::CharArray queryConnectUsername; +#ifdef RANDR + int initialWidth; + int getStride() const { return initialWidth; } +#endif }; #endif diff -urN vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/Xvnc/Imakefile vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/Xvnc/Imakefile --- vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/Xvnc/Imakefile 2006-06-03 16:14:57.000000000 +0400 +++ vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/Xvnc/Imakefile 2006-06-03 16:14:30.000000000 +0400 @@ -44,7 +44,8 @@ INCLUDES = -I. -I.. -I$(XBUILDINCDIR) -I$(FONTINCSRC) $(FB_DEFINES) \ $(FBINCLUDE) -I../../mfb -I../../mi -I../../include -I../../os \ - -I$(EXTINCSRC) -I$(XINCLUDESRC) -I$(SERVERSRC)/render $(VNCINCLUDE) + -I$(EXTINCSRC) -I$(XINCLUDESRC) -I$(SERVERSRC)/render \ + -I$(SERVERSRC)/randr $(VNCINCLUDE) DEFINES = $(OS_DEFINES) $(SHMDEF) $(MMAPDEF) \ $(VENDOR_STRING) $(VENDOR_RELEASE) $(STD_DEFINES) ServerOSDefines \ diff -urN vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/Xvnc/xvnc.cc vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/Xvnc/xvnc.cc --- vnc4-4.1.1+X4.3.0/unix/xc/programs/Xserver/vnc/Xvnc/xvnc.cc 2006-06-03 16:14:57.000000000 +0400 +++ vnc4-4.1.1+X4.3.0+RANDR/unix/xc/programs/Xserver/vnc/Xvnc/xvnc.cc 2006-06-03 16:14:30.000000000 +0400 @@ -107,6 +107,16 @@ #define VFB_DEFAULT_LINEBIAS 0 #define XWD_WINDOW_NAME_LEN 60 +#ifdef RANDR + +extern "C" { +#include <randrstr.h> +} + +#define RR_MAX_SCREEN_SIZES 8 +typedef struct { int width, height; } rrScreenSize; +#endif + typedef struct { int scrnum; @@ -127,7 +137,10 @@ Bool pixelFormatDefined; Bool rgbNotBgr; int redBits, greenBits, blueBits; - +#ifdef RANDR + int rrScreenSizesDefined; + rrScreenSize rrScreenSizes[RR_MAX_SCREEN_SIZES]; +#endif } vfbScreenInfo, *vfbScreenInfoPtr; static int vfbNumScreens; @@ -175,6 +188,11 @@ vfbScreens[i].lineBias = VFB_DEFAULT_LINEBIAS; vfbScreens[i].pixelFormatDefined = FALSE; vfbScreens[i].pfbMemory = NULL; +#ifdef RANDR + vfbScreens[i].rrScreenSizesDefined = 0; + vfbScreens[i].rrScreenSizes[0].width = VFB_DEFAULT_WIDTH; + vfbScreens[i].rrScreenSizes[0].height = VFB_DEFAULT_HEIGHT; +#endif } vfbNumScreens = 1; } @@ -406,11 +424,45 @@ if (strcmp(argv[i], "-geometry") == 0) { if (++i >= argc) UseMsg(); +#ifdef RANDR + if (vfbScreens[0].rrScreenSizesDefined == RR_MAX_SCREEN_SIZES) + { + ErrorF("Too many modes\n"); + UseMsg(); + } + else + { + rrScreenSize *rrss; + rrss = &(vfbScreens[0].rrScreenSizes[vfbScreens[0].rrScreenSizesDefined]); + if (sscanf(argv[i], "%dx%d", &rrss->width, &rrss->height) != 2 || + rrss->width <= 32 && rrss->height <= 32) { + ErrorF("Invalid geometry %s\n", argv[i]); + UseMsg(); + } + else + { + if (vfbScreens[0].rrScreenSizesDefined == 0) { + vfbScreens[0].width = rrss->width; + vfbScreens[0].height = rrss->height; + } + else + { + if (vfbScreens[0].width < rrss->width) + vfbScreens[0].width = rrss->width; + if (vfbScreens[0].height < rrss->height) + vfbScreens[0].height = rrss->height; + } + + vfbScreens[0].rrScreenSizesDefined++; + } + } +#else if (sscanf(argv[i],"%dx%d",&vfbScreens[0].width, &vfbScreens[0].height) != 2) { ErrorF("Invalid geometry %s\n", argv[i]); UseMsg(); } +#endif return 2; } @@ -820,6 +872,189 @@ miPointerWarpCursor }; +#ifdef RANDR + +static Bool vncRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) +{ + vfbScreenInfoPtr pvfb = &vfbScreens[pScreen->myNum]; + int dpi = monitorResolution ? monitorResolution : 100; + int i; + + if (pvfb->rrScreenSizesDefined == 0) + pvfb->rrScreenSizesDefined = 1; /* case without -geometry */ + + for (i = 0; i < pvfb->rrScreenSizesDefined; i++) + { + RRScreenSizePtr pSize; + + pSize = RRRegisterSize(pScreen, + pvfb->rrScreenSizes[i].width, pvfb->rrScreenSizes[i].height, + pScreen->mmWidth, pScreen->mmHeight); + if (!pSize) + return FALSE; + RRRegisterRate(pScreen, pSize, 60); + + if (pvfb->rrScreenSizes[i].width == pScreen->width && + pvfb->rrScreenSizes[i].height == pScreen->height) + RRSetCurrentConfig(pScreen, RR_Rotate_0, 60, pSize); + } + + *rotations = RR_Rotate_0; + return TRUE; +} + +/* from hw/xfree86/common/xf86Helper.c */ + +#include "mivalidate.h" +static void +xf86SetRootClip (ScreenPtr pScreen, Bool enable) +{ + WindowPtr pWin = WindowTable[pScreen->myNum]; + WindowPtr pChild; + Bool WasViewable = (Bool)(pWin->viewable); + Bool anyMarked = FALSE; + RegionPtr pOldClip = NULL, bsExposed; +#ifdef DO_SAVE_UNDERS + Bool dosave = FALSE; +#endif + WindowPtr pLayerWin; + BoxRec box; + + if (WasViewable) + { + for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib) + { + (void) (*pScreen->MarkOverlappedWindows)(pChild, + pChild, + &pLayerWin); + } + (*pScreen->MarkWindow) (pWin); + anyMarked = TRUE; + if (pWin->valdata) + { + if (HasBorder (pWin)) + { + RegionPtr borderVisible; + + borderVisible = REGION_CREATE(pScreen, NullBox, 1); + REGION_SUBTRACT(pScreen, borderVisible, + &pWin->borderClip, &pWin->winSize); + pWin->valdata->before.borderVisible = borderVisible; + } + pWin->valdata->before.resized = TRUE; + } + } + + /* + * Use REGION_BREAK to avoid optimizations in ValidateTree + * that assume the root borderClip can't change well, normally + * it doesn't...) + */ + if (enable) + { + box.x1 = 0; + box.y1 = 0; + box.x2 = pScreen->width; + box.y2 = pScreen->height; + REGION_INIT (pScreen, &pWin->winSize, &box, 1); + REGION_INIT (pScreen, &pWin->borderSize, &box, 1); + if (WasViewable) + REGION_RESET(pScreen, &pWin->borderClip, &box); + pWin->drawable.width = pScreen->width; + pWin->drawable.height = pScreen->height; + REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList); + } + else + { + REGION_EMPTY(pScreen, &pWin->borderClip); + REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList); + } + + ResizeChildrenWinSize (pWin, 0, 0, 0, 0); + + if (WasViewable) + { + if (pWin->backStorage) + { + pOldClip = REGION_CREATE(pScreen, NullBox, 1); + REGION_COPY(pScreen, pOldClip, &pWin->clipList); + } + + if (pWin->firstChild) + { + anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin->firstChild, + pWin->firstChild, + (WindowPtr *)NULL); + } + else + { + (*pScreen->MarkWindow) (pWin); + anyMarked = TRUE; + } + +#ifdef DO_SAVE_UNDERS + if (DO_SAVE_UNDERS(pWin)) + { + dosave = (*pScreen->ChangeSaveUnder)(pLayerWin, pLayerWin); + } +#endif /* DO_SAVE_UNDERS */ + + if (anyMarked) + (*pScreen->ValidateTree)(pWin, NullWindow, VTOther); + } + + if (pWin->backStorage && + ((pWin->backingStore == Always) || WasViewable)) + { + if (!WasViewable) + pOldClip = &pWin->clipList; /* a convenient empty region */ + bsExposed = (*pScreen->TranslateBackingStore) + (pWin, 0, 0, pOldClip, + pWin->drawable.x, pWin->drawable.y); + if (WasViewable) + REGION_DESTROY(pScreen, pOldClip); + if (bsExposed) + { + RegionPtr valExposed = NullRegion; + + if (pWin->valdata) + valExposed = &pWin->valdata->after.exposed; + (*pScreen->WindowExposures) (pWin, valExposed, bsExposed); + if (valExposed) + REGION_EMPTY(pScreen, valExposed); + REGION_DESTROY(pScreen, bsExposed); + } + } + if (WasViewable) + { + if (anyMarked) + (*pScreen->HandleExposures)(pWin); +#ifdef DO_SAVE_UNDERS + if (dosave) + (*pScreen->PostChangeSaveUnder)(pLayerWin, pLayerWin); +#endif /* DO_SAVE_UNDERS */ + if (anyMarked && pScreen->PostValidateTree) + (*pScreen->PostValidateTree)(pWin, NullWindow, VTOther); + } + if (pWin->realized) + WindowsRestructured (); + FlushAllOutput (); +} + +extern void vncHooksResizeScreen(ScreenPtr pScreen); + +static Bool vncRandRSetConfig (ScreenPtr pScreen, Rotation rotation, + int rate, RRScreenSizePtr pSize) +{ + pScreen->width = pSize->width; + pScreen->height = pSize->height; + xf86SetRootClip(pScreen, TRUE); + vncHooksResizeScreen(pScreen); + return TRUE; +} + +#endif + static Bool vfbScreenInit(int index, ScreenPtr pScreen, int argc, char** argv) { vfbScreenInfoPtr pvfb = &vfbScreens[index]; @@ -942,6 +1177,20 @@ pScreen->backingStoreSupport = Always; #endif +#ifdef RANDR + if (!ret) return FALSE; + + { + rrScrPrivPtr rp; + + ret = RRScreenInit(pScreen); + if (!ret) return FALSE; + rp = rrGetScrPriv(pScreen); + rp->rrGetInfo = vncRandRGetInfo; + rp->rrSetConfig = vncRandRSetConfig; + } +#endif + return ret; } /* end vfbScreenInit */ _______________________________________________ VNC-List mailing list VNC-List@realvnc.com To remove yourself from the list visit: http://www.realvnc.com/mailman/listinfo/vnc-list