summaryrefslogtreecommitdiff
path: root/randr
diff options
context:
space:
mode:
authorKeith Packard <keithp@guitar.keithp.com>2006-09-18 12:18:22 -0700
committerKeith Packard <keithp@guitar.keithp.com>2006-09-18 12:18:22 -0700
commitafe5e9483b352ed06075ed68a6ffa50799194e2d (patch)
treef44e59a037f6132e3873609027c65c837bab4fbc /randr
parent2be1ac15aee592782d7693b8de2c3815478a094e (diff)
RandR working with old clients and old API.
Diffstat (limited to 'randr')
-rw-r--r--randr/randr.c5
-rw-r--r--randr/randrstr.h3
-rw-r--r--randr/rrcrtc.c16
-rw-r--r--randr/rrdispatch.c6
-rw-r--r--randr/rrmode.c19
-rw-r--r--randr/rroutput.c18
6 files changed, 62 insertions, 5 deletions
diff --git a/randr/randr.c b/randr/randr.c
index 63d471ce0..926e32f1c 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -477,6 +477,7 @@ RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
if (!output)
return;
RROutputSetCrtcs (output, &crtc, 1);
+ RROutputSetCrtc (output, crtc);
RROutputSetConnection (output, RR_Connected);
}
@@ -552,8 +553,8 @@ RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
/* notice current mode */
if (newMode)
- RRCrtcSet (output->crtc, newMode, 0, 0, pScrPriv->rotation,
- 1, &output);
+ RRCrtcNotify (output->crtc, newMode, 0, 0, pScrPriv->rotation,
+ 1, &output);
}
#endif
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 33461570f..a7f91b79a 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -482,6 +482,9 @@ RROutputSetCrtcs (RROutputPtr output,
RRCrtcPtr *crtcs,
int numCrtcs);
+void
+RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc);
+
Bool
RROutputSetConnection (RROutputPtr output,
CARD8 connection);
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index d343c3a57..d1328e7ba 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -59,7 +59,13 @@ RRCrtcCreate (ScreenPtr pScreen,
crtc->numOutputs = 0;
crtc->changed = TRUE;
crtc->devPrivate = devPrivate;
+
+ if (!AddResource (crtc->id, RRCrtcType, (pointer) crtc))
+ return NULL;
+
+ pScrPriv->crtcs = crtcs;
pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
+ pScrPriv->changed = TRUE;
return crtc;
}
@@ -165,6 +171,16 @@ RRCrtcSet (RRCrtcPtr crtc,
ScreenPtr pScreen = crtc->pScreen;
rrScrPriv(pScreen);
+ /* See if nothing changed */
+ if (crtc->mode == mode &&
+ crtc->x == x &&
+ crtc->y == y &&
+ crtc->rotation == rotation &&
+ crtc->numOutputs == numOutputs &&
+ !memcmp (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr)))
+ {
+ return TRUE;
+ }
#if RANDR_12_INTERFACE
if (pScrPriv->rrCrtcSet)
{
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index acf629832..279acfdee 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -824,7 +824,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
if (!crtc)
{
client->errorValue = stuff->crtc;
- return RRErrorBase + BadCrtc;
+ return RRErrorBase + BadRRCrtc;
}
if (stuff->mode == None)
{
@@ -838,7 +838,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
if (!mode)
{
client->errorValue = stuff->mode;
- return RRErrorBase + BadMode;
+ return RRErrorBase + BadRRMode;
}
if (numOutputs == 0)
return BadMatch;
@@ -854,7 +854,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
if (!outputs[i])
{
client->errorValue = outputIds[i];
- return RRErrorBase + BadOutput;
+ return RRErrorBase + BadRROutput;
}
/* validate crtc for this output */
for (j = 0; j < outputs[i]->numCrtcs; j++)
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 3a9d55671..52585d967 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -32,6 +32,7 @@ RRModeGet (ScreenPtr pScreen,
rrScrPriv (pScreen);
int i;
RRModePtr mode;
+ RRModePtr *modes;
for (i = 0; i < pScrPriv->numModes; i++)
{
@@ -43,16 +44,34 @@ RRModeGet (ScreenPtr pScreen,
return mode;
}
}
+
mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1);
+ if (!mode)
+ return NULL;
mode->refcnt = 1;
mode->mode = *modeInfo;
mode->name = (char *) (mode + 1);
memcpy (mode->name, name, modeInfo->nameLength);
mode->name[modeInfo->nameLength] = '\0';
+
+ if (pScrPriv->numModes)
+ modes = xrealloc (pScrPriv->modes,
+ (pScrPriv->numModes + 1) * sizeof (RRModePtr));
+ else
+ modes = xalloc (sizeof (RRModePtr));
+
+ if (!modes)
+ {
+ xfree (mode);
+ return NULL;
+ }
+
mode->id = FakeClientID(0);
if (!AddResource (mode->id, RRModeType, (pointer) mode))
return NULL;
++mode->refcnt;
+ pScrPriv->modes = modes;
+ pScrPriv->modes[pScrPriv->numModes++] = mode;
pScrPriv->changed = TRUE;
return mode;
}
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 6b67f1997..ba5bcb451 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -56,6 +56,7 @@ RROutputCreate (ScreenPtr pScreen,
output->name = (char *) (output + 1);
output->nameLength = nameLength;
memcpy (output->name, name, nameLength);
+ output->name[nameLength] = '\0';
output->connection = RR_UnknownConnection;
output->subpixelOrder = SubPixelUnknown;
output->crtc = NULL;
@@ -67,7 +68,13 @@ RROutputCreate (ScreenPtr pScreen,
output->modes = NULL;
output->changed = TRUE;
output->devPrivate = devPrivate;
+
+ if (!AddResource (output->id, RROutputType, (pointer) output))
+ return NULL;
+
+ pScrPriv->outputs = outputs;
pScrPriv->outputs[pScrPriv->numOutputs++] = output;
+ pScrPriv->changed = TRUE;
return output;
}
@@ -89,6 +96,7 @@ RROutputSetClones (RROutputPtr output,
memcpy (newClones, clones, numClones * sizeof (RROutputPtr));
output->clones = newClones;
output->numClones = numClones;
+ output->changed = TRUE;
return TRUE;
}
@@ -107,6 +115,7 @@ RROutputSetModes (RROutputPtr output,
memcpy (newModes, modes, numModes * sizeof (RRModePtr));
output->modes = newModes;
output->numModes = numModes;
+ output->changed = TRUE;
return TRUE;
}
@@ -125,14 +134,23 @@ RROutputSetCrtcs (RROutputPtr output,
memcpy (newCrtcs, crtcs, numCrtcs * sizeof (RRCrtcPtr));
output->crtcs = newCrtcs;
output->numCrtcs = numCrtcs;
+ output->changed = TRUE;
return TRUE;
}
+void
+RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc)
+{
+ output->crtc = crtc;
+ output->changed = TRUE;
+}
+
Bool
RROutputSetConnection (RROutputPtr output,
CARD8 connection)
{
output->connection = connection;
+ output->changed = TRUE;
return TRUE;
}