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 "xf86.h"
|
||||||
#include "xf86DDC.h"
|
#include "xf86DDC.h"
|
||||||
|
#include "xf86Priv.h"
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include "property.h"
|
#include "property.h"
|
||||||
#include "propertyst.h"
|
#include "propertyst.h"
|
||||||
|
@ -34,17 +35,39 @@
|
||||||
|
|
||||||
#define EDID1_ATOM_NAME "XFree86_DDC_EDID1_RAWDATA"
|
#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
|
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;
|
Atom atom;
|
||||||
unsigned char *atom_data;
|
unsigned char *atom_data;
|
||||||
|
int size = edidSize(DDC);
|
||||||
|
|
||||||
if (!(atom_data = malloc(size * sizeof(CARD8))))
|
if (!(atom_data = malloc(size * sizeof(CARD8))))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
atom = MakeAtom(name, strlen(name), TRUE);
|
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);
|
xf86RegisterRootWindowProperty(i, atom, XA_INTEGER, 8, size, atom_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,10 +77,10 @@ addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
|
||||||
int scrnIndex = pScrn->scrnIndex;
|
int scrnIndex = pScrn->scrnIndex;
|
||||||
|
|
||||||
if (DDC->ver.version == 1) {
|
if (DDC->ver.version == 1) {
|
||||||
int size = 128 +
|
if (xf86Initialising)
|
||||||
(DDC->flags & EDID_COMPLETE_RAWDATA ? DDC->no_sections * 128 : 0);
|
edidMakeAtom(scrnIndex, EDID1_ATOM_NAME, DDC);
|
||||||
|
else
|
||||||
edidMakeAtom(scrnIndex, EDID1_ATOM_NAME, DDC->rawData, size);
|
setRootWindowEDID(pScrn->pScreen, DDC);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
xf86DrvMsg(scrnIndex, X_PROBED, "unexpected EDID version %d.%d\n",
|
xf86DrvMsg(scrnIndex, X_PROBED, "unexpected EDID version %d.%d\n",
|
||||||
|
|
Loading…
Reference in New Issue