[PATCH xserver v2 6/9] xfree86: Make xf86SetDDCproperties work more than once per generation
walter harms
wharms at bfs.de
Mon Apr 11 12:23:27 UTC 2016
Am 05.04.2016 19:54, schrieb Adam Jackson:
> We can call this more than once via xf86OutputSetEDID since hotplug is
> actually a thing in RANDR 1.2, but xf86RegisterRootWindowProperty merely
> adds the data to a list to be applied to the root at CreateWindow time,
> so calls past the first (for a given screen) would have no effect until
> server regen.
>
> Once we've initialised pScrn->pScreen is filled in, so we can just set
> the property directly.
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
> hw/xfree86/ddc/ddcProperty.c | 34 ++++++++++++++++++++++++++++------
> 1 file changed, 28 insertions(+), 6 deletions(-)
>
> diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
> index c51c3e6..a31e9c7 100644
> --- a/hw/xfree86/ddc/ddcProperty.c
> +++ b/hw/xfree86/ddc/ddcProperty.c
> @@ -27,6 +27,7 @@
>
> #include "xf86.h"
> #include "xf86DDC.h"
> +#include "xf86Priv.h"
> #include <X11/Xatom.h>
> #include "property.h"
> #include "propertyst.h"
> @@ -34,17 +35,38 @@
>
> #define EDID1_ATOM_NAME "XFree86_DDC_EDID1_RAWDATA"
>
> +static int
> +edidSize(const xf86MonPtr DDC)
> +{
> + if (DDC->ver.version != 1)
> + return 0;
> +
> + return 128 +
> + (DDC->flags & EDID_COMPLETE_RAWDATA ? DDC->no_sections * 128 : 0);
> +}
> +
i would that a bit more readable, like
if (DDC->flags & EDID_COMPLETE_RAWDATA)
return 128+DDC->no_sections * 128;
return 128;
> static void
> -edidMakeAtom(int i, const char *name, CARD8 *data, int size)
> +setRootWindowEDID(ScreenPtr pScreen, xf86MonPtr DDC)
> +{
> + Atom atom = MakeAtom(EDID1_ATOM_NAME, strlen(EDID1_ATOM_NAME), TRUE);
> +
> + dixChangeWindowProperty(serverClient, pScreen->root, atom, XA_INTEGER,
> + 8, PropModeReplace, edidSize(DDC), DDC->rawData,
> + FALSE);
> +}
> +
> +static void
> +edidMakeAtom(int i, const char *name, xf86MonPtr DDC)
> {
> Atom atom;
> unsigned char *atom_data;
> + int size = edidSize(DDC);
>
> if (!(atom_data = malloc(size * sizeof(CARD8))))
> return;
>
> atom = MakeAtom(name, strlen(name), TRUE);
> - memcpy(atom_data, data, size);
> + memcpy(atom_data, DDC->rawData, size);
> xf86RegisterRootWindowProperty(i, atom, XA_INTEGER, 8, size, atom_data);
> }
>
> @@ -54,10 +76,10 @@ addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
> int scrnIndex = pScrn->scrnIndex;
>
> if (DDC->ver.version == 1) {
> - int size = 128 +
> - (DDC->flags & EDID_COMPLETE_RAWDATA ? DDC->no_sections * 128 : 0);
> -
> - edidMakeAtom(scrnIndex, EDID1_ATOM_NAME, DDC->rawData, size);
> + if (xf86Initialising)
> + edidMakeAtom(scrnIndex, EDID1_ATOM_NAME, DDC);
> + else
> + setRootWindowEDID(pScrn->pScreen, DDC);
> }
> else {
> xf86DrvMsg(scrnIndex, X_PROBED, "unexpected EDID version %d.%d\n",
More information about the xorg-devel
mailing list