diff --git a/u_xserver_xvfb-randr.patch b/u_xserver_xvfb-randr.patch new file mode 100644 index 0000000..a144e4a --- /dev/null +++ b/u_xserver_xvfb-randr.patch @@ -0,0 +1,192 @@ +Author: Lambros Lambrou +Subject: xvfb: add randr support +Patch-Mainline: To be upstreamed +References: bnc#823410 fdo#26391 +Signed-off-by: Michal Srb + +--- a/hw/vfb/InitOutput.c ++++ b/hw/vfb/InitOutput.c +@@ -66,6 +66,7 @@ + #include "dix.h" + #include "miline.h" + #include "glx_extinit.h" ++#include "randrstr.h" + + #define VFB_DEFAULT_WIDTH 1280 + #define VFB_DEFAULT_HEIGHT 1024 +@@ -812,6 +813,165 @@ + } + + static Bool ++vfbRROutputValidateMode(ScreenPtr pScreen, ++ RROutputPtr output, ++ RRModePtr mode) ++{ ++ rrScrPriv(pScreen); ++ ++ if (pScrPriv->minWidth <= mode->mode.width && ++ pScrPriv->maxWidth >= mode->mode.width && ++ pScrPriv->minHeight <= mode->mode.height && ++ pScrPriv->maxHeight >= mode->mode.height) ++ return TRUE; ++ else ++ return FALSE; ++} ++ ++static Bool ++vfbRRScreenSetSize(ScreenPtr pScreen, ++ CARD16 width, ++ CARD16 height, ++ CARD32 mmWidth, ++ CARD32 mmHeight) ++{ ++ WindowPtr root = pScreen->root; ++ WindowPtr layer; ++ WindowPtr child; ++ BoxRec box; ++ ++ pScreen->width = width; ++ pScreen->height = height; ++ pScreen->mmWidth = mmWidth; ++ pScreen->mmHeight = mmHeight; ++ ++ // Resize the root window & adjust its clipping ++ box.x1 = 0; ++ box.y1 = 0; ++ box.x2 = pScreen->width; ++ box.y2 = pScreen->height; ++ REGION_INIT(pScreen, &root->winSize, &box, 1); ++ REGION_INIT(pScreen, &root->borderSize, &box, 1); ++ REGION_RESET(pScreen, &root->borderClip, &box); ++ root->drawable.width = pScreen->width; ++ root->drawable.height = pScreen->height; ++ REGION_BREAK (pScreen, &root->clipList); ++ ++ // Update the clipping regions of all windows ++ for (child = root->firstChild; child; child = child->nextSib) ++ (*pScreen->MarkOverlappedWindows)(child, child, &layer); ++ ++ if (root->firstChild) ++ { ++ (*pScreen->MarkOverlappedWindows)(root->firstChild, ++ root->firstChild, ++ (WindowPtr *)NULL); ++ } ++ else ++ { ++ (*pScreen->MarkWindow) (root); ++ } ++ ++ (*pScreen->ValidateTree)(root, NullWindow, VTOther); ++ (*pScreen->HandleExposures)(root); ++ ++ // Reposition top-level windows to fit new root size ++ // XXX I assume this is what it does, but I'm not sure ++ ResizeChildrenWinSize (root, 0, 0, 0, 0); ++ ++ ++ // Check the pointer position ++ WindowsRestructured (); ++ ++ RRScreenSizeNotify (pScreen); ++ RRTellChanged(pScreen); ++ ++ // Flush resulting events, etc to clients ++ FlushAllOutput (); ++ ++ return TRUE; ++} ++ ++static Bool ++vfbRRCrtcSet(ScreenPtr pScreen, ++ RRCrtcPtr crtc, ++ RRModePtr mode, ++ int x, ++ int y, ++ Rotation rotation, ++ int numOutput, ++ RROutputPtr *outputs) ++{ ++ return RRCrtcNotify(crtc, mode, x, y, rotation, NULL, numOutput, outputs); ++} ++ ++static Bool ++vfbRRGetInfo(ScreenPtr pScreen, Rotation *rotations) ++{ ++ return TRUE; ++} ++ ++static Bool ++vfbRandRInit(ScreenPtr pScreen) ++{ ++ rrScrPrivPtr pScrPriv; ++#if RANDR_12_INTERFACE ++ RRModePtr mode; ++ RRCrtcPtr crtc; ++ RROutputPtr output; ++ xRRModeInfo modeInfo; ++ char name[64]; ++#endif ++ ++ if (!RRScreenInit (pScreen)) ++ return FALSE; ++ pScrPriv = rrGetScrPriv(pScreen); ++ pScrPriv->rrGetInfo = vfbRRGetInfo; ++#if RANDR_12_INTERFACE ++ pScrPriv->rrCrtcSet = vfbRRCrtcSet; ++ pScrPriv->rrScreenSetSize = vfbRRScreenSetSize; ++ pScrPriv->rrOutputSetProperty = NULL; ++#if RANDR_13_INTERFACE ++ pScrPriv->rrOutputGetProperty = NULL; ++#endif ++ pScrPriv->rrOutputValidateMode = vfbRROutputValidateMode; ++ pScrPriv->rrModeDestroy = NULL; ++ ++ RRScreenSetSizeRange (pScreen, ++ 1, 1, ++ pScreen->width, pScreen->height); ++ ++ sprintf (name, "%dx%d", pScreen->width, pScreen->height); ++ memset (&modeInfo, '\0', sizeof (modeInfo)); ++ modeInfo.width = pScreen->width; ++ modeInfo.height = pScreen->height; ++ modeInfo.nameLength = strlen (name); ++ ++ mode = RRModeGet (&modeInfo, name); ++ if (!mode) ++ return FALSE; ++ ++ crtc = RRCrtcCreate (pScreen, NULL); ++ if (!crtc) ++ return FALSE; ++ ++ output = RROutputCreate (pScreen, "screen", 6, NULL); ++ if (!output) ++ return FALSE; ++ if (!RROutputSetClones (output, NULL, 0)) ++ return FALSE; ++ if (!RROutputSetModes (output, &mode, 1, 0)) ++ return FALSE; ++ if (!RROutputSetCrtcs (output, &crtc, 1)) ++ return FALSE; ++ if (!RROutputSetConnection (output, RR_Connected)) ++ return FALSE; ++ RRCrtcNotify (crtc, mode, 0, 0, RR_Rotate_0, NULL, 1, &output); ++#endif ++ return TRUE; ++} ++ ++static Bool + vfbScreenInit(ScreenPtr pScreen, int argc, char **argv) + { + vfbScreenInfoPtr pvfb = &vfbScreens[pScreen->myNum]; +@@ -885,6 +1045,9 @@ + if (!ret) + return FALSE; + ++ if (!vfbRandRInit(pScreen)) ++ return FALSE; ++ + pScreen->InstallColormap = vfbInstallColormap; + pScreen->UninstallColormap = vfbUninstallColormap; + pScreen->ListInstalledColormaps = vfbListInstalledColormaps; diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 8f94ec2..100c96c 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Jun 6 15:21:18 UTC 2013 - msrb@suse.com + +- u_xserver_xvfb-randr.patch + * Add randr support to Xvfb (bnc#823410) + ------------------------------------------------------------------- Sat May 11 09:32:10 UTC 2013 - schwab@suse.de diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 90b74f0..a000c1d 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -181,6 +181,7 @@ Patch226: u_vgaHW-no-legacy.patch Patch227: u_init_framebuffer_base.patch Patch228: u_aarch64-support.patch Patch229: u_disable-acpi-code.patch +Patch230: u_xserver_xvfb-randr.patch %description This package contains the X.Org Server. @@ -301,6 +302,7 @@ cp %{SOURCE96} . %patch227 -p1 %patch228 -p1 %patch229 -p1 +%patch230 -p1 %build autoreconf -fi