[PATCH xserver 6/9] xfree86: Make xf86SetDDCproperties work more than once per generation

Adam Jackson ajax at redhat.com
Wed Jan 6 06:30:34 PST 2016


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);
+}
+
 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",
-- 
2.5.0



More information about the xorg-devel mailing list