xfree86: Make xf86SetDDCproperties work more than once (v2)
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. v2: Removed pointless version check, deobfuscate math (Walter Harms) Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
8be83fff04
commit
7961377567
|
@ -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,39 @@
|
|||
|
||||
#define EDID1_ATOM_NAME "XFree86_DDC_EDID1_RAWDATA"
|
||||
|
||||
static int
|
||||
edidSize(const xf86MonPtr DDC)
|
||||
{
|
||||
int ret = 128;
|
||||
|
||||
if (DDC->flags & EDID_COMPLETE_RAWDATA)
|
||||
ret += DDC->no_sections * 128;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
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 +77,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",
|
||||
|
|
Loading…
Reference in New Issue
Block a user