53 int i, j, n, number_cwins, state;
56 char *row, *scoreboard;
66 Scr->cmapInfo.pushed_cmaps = cmaps;
70 if(
Scr->cmapInfo.root_pushes) {
77 if(
Scr->cmapInfo.cmaps) {
78 for(i =
Scr->cmapInfo.cmaps->number_cwins,
79 cwins =
Scr->cmapInfo.cmaps->cwins; i-- > 0; cwins++) {
83 Scr->cmapInfo.cmaps = cmaps;
87 case VisibilityNotify:
92 number_cwins =
Scr->cmapInfo.cmaps->number_cwins;
93 cwins =
Scr->cmapInfo.cmaps->cwins;
94 scoreboard =
Scr->cmapInfo.cmaps->scoreboard;
100 for(i = 0; i < number_cwins; i++) {
103 for(i = n = 0; i < number_cwins && n <
Scr->cmapInfo.maxCmaps; i++) {
111 if(cwin->
visibility != VisibilityFullyObscured) {
112 row = scoreboard + (i * (i - 1) / 2);
113 for(j = 0; j < i; j++)
114 if(row[j] && (cwins[j]->colormap->state &
CM_INSTALL)) {
132 Scr->cmapInfo.first_req = NextRequest(
dpy);
134 for(; n > 0 && maxcwin >= &cwins[0]; maxcwin--) {
135 cmap = (*maxcwin)->colormap;
141 XInstallColormap(
dpy, cmap->
c);
196 if(ev->type == EnterNotify) {
197 if(ev->xcrossing.mode != NotifyGrab) {
201 else if(ev->type == LeaveNotify) {
202 if(ev->xcrossing.mode == NotifyNormal) {
278 XWindowAttributes attributes;
294 VisibilityPartiallyObscured : VisibilityUnobscured;
308 if(!XGetWindowAttributes(
dpy, w, &attributes) ||
315 (XPointer *)&cwin->
colormap) == XCNOENT) {
332 if(property_window &&
333 (attributes.your_event_mask &
334 (ColormapChangeMask | VisibilityChangeMask)) !=
335 (ColormapChangeMask | VisibilityChangeMask)) {
336 XSelectInput(
dpy, w, attributes.your_event_mask |
337 (ColormapChangeMask | VisibilityChangeMask));
357 Window *cmap_windows = NULL;
358 bool can_free_cmap_windows =
false;
359 int number_cmap_windows = 0;
363 number_cmap_windows = 0;
373 if(XGetWMColormapWindows(
dpy, tmp->
w, &cmap_windows,
374 &number_cmap_windows) &&
375 number_cmap_windows > 0) {
380 for(i = 0; i < number_cmap_windows; i++) {
381 if(cmap_windows[i] == tmp->
w) {
385 if(i == number_cmap_windows) {
386 Window *new_cmap_windows =
387 calloc((number_cmap_windows + 1),
sizeof(Window));
389 if(!new_cmap_windows) {
391 "%s: unable to allocate %d element colormap window array\n",
395 new_cmap_windows[0] = tmp->
w;
396 for(i = 0; i < number_cmap_windows; i++) {
397 new_cmap_windows[i + 1] = cmap_windows[i];
400 can_free_cmap_windows =
true;
401 cmap_windows = new_cmap_windows;
402 number_cmap_windows++;
407 for(i = 0; i < number_cmap_windows; i++) {
427 (XPointer *)&cwins[i]) == XCNOENT) {
432 for(k = i + 1; k < number_cmap_windows; k++) {
433 cmap_windows[k - 1] = cmap_windows[k];
436 number_cmap_windows--;
449 if(number_cmap_windows == 0) {
451 number_cmap_windows = 1;
469 if(number_cmap_windows > 1)
479 if(can_free_cmap_windows) {
610 for(sc =
Scr->StdCmapInfo.head; sc; sc = sc->
next) {
623 if(
Scr->StdCmapInfo.head == sc) {
624 Scr->StdCmapInfo.head = sc->
next;
626 if(
Scr->StdCmapInfo.tail == sc) {
627 Scr->StdCmapInfo.tail = prev;
629 if(
Scr->StdCmapInfo.mru == sc) {
630 Scr->StdCmapInfo.mru = NULL;