Hi
You are right. Luckily I have the patch from some other mail thread.
Attached.
Best regards,
// Ola
On Sun, Oct 21, 2007 at 08:12:38PM -0700, Duncan Findlay wrote:
> Hi,
>
> Unless I've missed something, the patch for bug 366493 has
> disappeared from the internet. It's not attached to the bug report,
> and I can't find evidence of it in the vnc-list mail archives. Could
> someone please post the patch to this bug report?
>
> Thanks,
> Duncan
>
>
>
>
--
--------------------- Ola Lundqvist ---------------------------
/ [EMAIL PROTECTED] Annebergsslingan 37 \
| [EMAIL PROTECTED] 654 65 KARLSTAD |
| http://opalsys.net/ +46 (0)70-332 1551 |
\ gpg/f.p.: 7090 A92B 18FE 7994 0C36 4FE4 18A1 B1CF 0FE5 3DD9 /
---------------------------------------------------------------
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 */