xvfb: add randr support (v2)
Aaron Plattner
aplattner at nvidia.com
Thu Jun 18 08:28:18 PDT 2015
On 06/08/2015 03:14 PM, Siim Põder wrote:
> Hi
>
> This was sent to xorg-devel a few years ago. It still applies and still appears
> to work. I resending this because it affects me. Comments or application to the
> tree would be greatly appreciated :)
>
> The motivation for getting this is chrome remote desktop that runs under Xvfb
> and wants to use RANDR to adjust screen size according to the remote desktop
> client screen size. Apparently there are other use cases as well, the bug
> mentions gnome-settings-daemon testing.
Not that this patch hurts or anything, but is there any particular
reason this remote desktop thing is using Xvfb rather than Xorg +
xf86-video-dummy? I thought there was an effort to kill off the
redundant non-Xorg DDXes at some point.
I posted a patch series a while back to upgrade the dummy driver to be
able to support arbitrary resizing, including resizing to larger than
you started with:
http://lists.x.org/archives/xorg-devel/2015-January/045395.html
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=26391
> Signed-off-by: Lambros Lambrou <lambroslambrou at google.com>
> Signed-off-by: Mike Frysinger <vapier at gentoo.org>
> Signed-off-by: Michal Srb <msrb at suse.com>
> Signed-off-by: Siim Põder <siim at p6drad-teel.net>
>
> ---
> Second version, modified according to Keith suggestion.
> Tested by adding second mode and switching - worked correctly.
>
> diff --git a/hw/vfb/InitOutput.c b/hw/vfb/InitOutput.c
> index 97eccfd..bfca068 100644
> --- a/hw/vfb/InitOutput.c
> +++ b/hw/vfb/InitOutput.c
> @@ -66,6 +66,7 @@ from The Open Group.
> #include "dix.h"
> #include "miline.h"
> #include "glx_extinit.h"
> +#include "randrstr.h"
>
> #define VFB_DEFAULT_WIDTH 1280
> #define VFB_DEFAULT_HEIGHT 1024
> @@ -785,6 +786,125 @@ vfbCloseScreen(ScreenPtr pScreen)
> }
>
> 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)
> +{
> + // Prevent screen updates while we change things around
> + SetRootClip(pScreen, FALSE);
> +
> + pScreen->width = width;
> + pScreen->height = height;
> + pScreen->mmWidth = mmWidth;
> + pScreen->mmHeight = mmHeight;
> +
> + // Restore the ability to update screen, now with new dimensions
> + SetRootClip(pScreen, TRUE);
> +
> + RRScreenSizeNotify (pScreen);
> + RRTellChanged(pScreen);
> +
> + 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];
> @@ -860,6 +980,9 @@ vfbScreenInit(ScreenPtr pScreen, int argc, char **argv)
> if (!ret)
> return FALSE;
>
> + if (!vfbRandRInit(pScreen))
> + return FALSE;
> +
> pScreen->InstallColormap = vfbInstallColormap;
> pScreen->UninstallColormap = vfbUninstallColormap;
> pScreen->ListInstalledColormaps = vfbListInstalledColormaps;
>
--
Aaron
More information about the xorg-devel
mailing list