diff options
-rw-r--r-- | xts5/src/lib/nextvinf.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/xts5/src/lib/nextvinf.c b/xts5/src/lib/nextvinf.c index 834cbf5c..1c01afd1 100644 --- a/xts5/src/lib/nextvinf.c +++ b/xts5/src/lib/nextvinf.c @@ -143,6 +143,7 @@ static int Ndepths; int CurVinf; static void iddebug(); +static void uniquify(); /* * Start again at the beginning of the list of visual classes. @@ -204,6 +205,13 @@ XVisualInfo vi; Vinfop = XGetVisualInfo(Dsp, VisualScreenMask, &vi, &Nvis); /* + * GLX creates a plethora of identical visuals. There is no + * need to test them all, since the core rendering code is very + * probably identical in each case. + */ + uniquify(); + + /* * For debuging purposes only consider a subset of the available * visuals. */ @@ -380,3 +388,42 @@ int nreal = Nvis; } free(viptmp); } + +static void +uniquify(void) +{ +XVisualInfo *viptmp; +int i; +int nreal = Nvis; + + /* + * Copy the original (this is realy only being done this way + * to avoid mixing free and XFree.) + */ + viptmp = (XVisualInfo*)malloc(nreal * sizeof(XVisualInfo)); + if (viptmp == 0) + return; + for (i = 0; i < nreal; i++) + viptmp[i] = Vinfop[i]; + + /* + * Copy back any visual that is different from the previous visual, + * keeping count of found ones as we go along. Note that the list may + * contain visualids for different screens. + */ + Nvis = 0; + for (i = 0; i < nreal; i++) { + if (!Nvis || + viptmp[i].screen != Vinfop[Nvis-1].screen || + viptmp[i].depth != Vinfop[Nvis-1].depth || + viptmp[i].class != Vinfop[Nvis-1].class || + viptmp[i].red_mask != Vinfop[Nvis-1].red_mask || + viptmp[i].green_mask != Vinfop[Nvis-1].green_mask || + viptmp[i].blue_mask != Vinfop[Nvis-1].blue_mask || + viptmp[i].colormap_size != Vinfop[Nvis-1].colormap_size || + viptmp[i].bits_per_rgb != Vinfop[Nvis-1].bits_per_rgb) { + Vinfop[Nvis++] = viptmp[i]; + } + } + free(viptmp); +} |