summaryrefslogtreecommitdiff
path: root/composite
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2009-09-29 11:49:09 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-09-30 10:00:07 +1000
commit6ffda5aae75272fabdc27d6f693ae827be119e95 (patch)
tree2ccf117a3972e9e83aa38278b25f1a6744abce0d /composite
parentad5c0d9efa47476ed5cf75c82265c73919e468b4 (diff)
dix/glx/composite: consolidate visual resize in one place.
The previous code was copied and in both cases incorrectly fixed up the colormaps after resizing the visuals, this patch consolidates the visual resize + colormaps fixups in one place. This version also consolidates the vid allocation for the DepthPtr inside the function. I'm not 100% sure colormap.[ch] is the correct place for this but visuals are mostly created in fb and I know thats not the place to be resizing them. Fixes fd.o bug #19470. Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'composite')
-rw-r--r--composite/compinit.c59
1 files changed, 4 insertions, 55 deletions
diff --git a/composite/compinit.c b/composite/compinit.c
index 6159e4e49..96ac70fd0 100644
--- a/composite/compinit.c
+++ b/composite/compinit.c
@@ -248,15 +248,9 @@ static Bool
compAddAlternateVisual(ScreenPtr pScreen, CompScreenPtr cs,
CompAlternateVisual *alt)
{
- VisualPtr visual, visuals;
- int i;
- int numVisuals;
- XID *installedCmaps;
- ColormapPtr installedCmap;
- int numInstalledCmaps;
+ VisualPtr visual;
DepthPtr depth;
PictFormatPtr pPictFormat;
- VisualID *vid;
unsigned long alphaMask;
/*
@@ -277,54 +271,13 @@ compAddAlternateVisual(ScreenPtr pScreen, CompScreenPtr cs,
pPictFormat->direct.red != pScreen->visuals[0].offsetRed)
return FALSE;
- vid = xalloc(sizeof(VisualID));
- if (!vid)
- return FALSE;
-
- /* Find the installed colormaps */
- installedCmaps = xalloc (pScreen->maxInstalledCmaps * sizeof (XID));
- if (!installedCmaps) {
- xfree(vid);
- return FALSE;
- }
- numInstalledCmaps = pScreen->ListInstalledColormaps(pScreen,
- installedCmaps);
-
- /* realloc the visual array to fit the new one in place */
- numVisuals = pScreen->numVisuals;
- visuals = xrealloc(pScreen->visuals, (numVisuals + 1) * sizeof(VisualRec));
- if (!visuals) {
- xfree(vid);
- xfree(installedCmaps);
- return FALSE;
+ if (ResizeVisualArray(pScreen, 1, depth) == FALSE) {
+ return FALSE;
}
- /*
- * Fix up any existing installed colormaps -- we'll assume that
- * the only ones created so far have been installed. If this
- * isn't true, we'll have to walk the resource database looking
- * for all colormaps.
- */
- for (i = 0; i < numInstalledCmaps; i++) {
- int j, rc;
-
- rc = dixLookupResourceByType((pointer *)&installedCmap,
- installedCmaps[i], RT_COLORMAP,
- serverClient, DixReadAccess);
- if (rc != Success)
- continue;
- j = installedCmap->pVisual - pScreen->visuals;
- installedCmap->pVisual = &visuals[j];
- }
-
- xfree(installedCmaps);
-
- pScreen->visuals = visuals;
- visual = visuals + pScreen->numVisuals; /* the new one */
- pScreen->numVisuals++;
+ visual = pScreen->visuals + (pScreen->numVisuals - 1); /* the new one */
/* Initialize the visual */
- visual->vid = FakeClientID (0);
visual->bitsPerRGBValue = 8;
if (PICT_FORMAT_TYPE(alt->format) == PICT_TYPE_COLOR) {
visual->class = PseudoColor;
@@ -357,10 +310,6 @@ compAddAlternateVisual(ScreenPtr pScreen, CompScreenPtr cs,
/* remember the visual ID to detect auto-update windows */
compRegisterAlternateVisuals(cs, &visual->vid, 1);
- /* Fix up the depth */
- *vid = visual->vid;
- depth->numVids = 1;
- depth->vids = vid;
return TRUE;
}