[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