double rnow(void) { double t = dnowx(); t = t - ((int) t); if (t > 1.0) { t = 1.0; } else if (t < 0.0) { t = 0.0; } return t; }
void macosxCGS_get_all_windows(void) { static double last = 0.0; static int totcnt = 0; double dt = 0.0, now = dnow(); int i, db = 0, whist_prv = 0, maxwin = 0, whist_skip = 0; CGSWindowCount cap = (CGSWindowCount) MAXWINDAT; CGSError err; CGS_levelmax = 0; CGS_levels[CGS_levelmax++] = (int) kCGDraggingWindowLevel; /* 500 ? */ if (0) CGS_levels[CGS_levelmax++] = (int) kCGHelpWindowLevel; /* 102 ? */ if (macosx_ncache_macmenu) CGS_levels[CGS_levelmax++] = (int) kCGPopUpMenuWindowLevel; /* 101 pulldown menu */ CGS_levels[CGS_levelmax++] = (int) kCGMainMenuWindowLevelKey; /* 24 ? */ CGS_levels[CGS_levelmax++] = (int) kCGModalPanelWindowLevel; /* 8 open dialog box */ CGS_levels[CGS_levelmax++] = (int) kCGFloatingWindowLevel; /* 3 ? */ CGS_levels[CGS_levelmax++] = (int) kCGNormalWindowLevel; /* 0 regular window */ if (cid == NULL) { cid = _CGSDefaultConnection(); if (cid == NULL) { return; } } if (dt > 0.0 && now < last + dt) { return; } last = now; macwinmax = 0; totcnt++; if (ncache > 0) { whist_prv = whist_idx++; if (whist_prv < 0) { whist_skip = 1; whist_prv = 0; } whist_idx = whist_idx % WINHISTMAX; for (i=0; i < WINHISTNUM; i++) { whist[whist_idx][i] = 0; qlook[i] = -1; } } err = CGSGetWindowList(cid, NULL, cap, _wins_all, &_wins_all_cnt); if (db) fprintf(stderr, "cnt: %d err: %d\n", (int) _wins_all_cnt, err); if (err != 0) { return; } for (i=0; i < (int) _wins_all_cnt; i++) { CGSRect rect; CGSWindowLevel level; int j, keepit = 0; err = CGSGetScreenRectForWindow(cid, _wins_all[i], &rect); if (err != 0) { continue; } if (rect.origin.x == 0 && rect.origin.y == 0) { if (rect.size.width == dpy_x) { if (rect.size.height == dpy_y) { continue; } } } err = CGSGetWindowLevel(cid, _wins_all[i], &level); if (err != 0) { continue; } for (j=0; j<CGS_levelmax; j++) { if ((int) level == CGS_levels[j]) { keepit = 1; break; } } if (! keepit) { continue; } macwins[macwinmax].level = (int) level; macwins[macwinmax].win = (int) _wins_all[i]; macwins[macwinmax].x = (int) rect.origin.x; macwins[macwinmax].y = (int) rect.origin.y; macwins[macwinmax].width = (int) rect.size.width; macwins[macwinmax].height = (int) rect.size.height; macwins[macwinmax].mapped = 0; macwins[macwinmax].clipped = 0; macwins[macwinmax].ncache_only = 0; if (level == kCGPopUpMenuWindowLevel) { macwins[macwinmax].ncache_only = 1; } if (0 || db) fprintf(stderr, "i=%03d ID: %06d x: %03d y: %03d w: %03d h: %03d level: %d\n", i, _wins_all[i], (int) rect.origin.x, (int) rect.origin.y,(int) rect.size.width, (int) rect.size.height, (int) level); if (macwins[macwinmax].win < WINHISTNUM) { qlook[macwins[macwinmax].win] = macwinmax; if (macwins[macwinmax].win > maxwin) { maxwin = macwins[macwinmax].win; } } macwinmax++; } err = CGSGetOnScreenWindowList(cid, NULL, cap, _wins_mapped, &_wins_mapped_cnt); if (db) fprintf(stderr, "cnt: %d err: %d\n", (int) _wins_mapped_cnt, err); if (err != 0) { return; } for (i=0; i < (int) _wins_mapped_cnt; i++) { int j, idx = -1; int win = (int) _wins_mapped[i]; if (0 <= win && win < WINHISTNUM) { j = qlook[win]; if (j >= 0 && macwins[j].win == win) { idx = j; } } if (idx < 0) { for (j=0; j < macwinmax; j++) { if (macwins[j].win == win) { idx = j; break; } } } if (idx >= 0) { macwins[idx].mapped = 1; } } if (ncache > 0) { int nv= 0, NBMAX = 64; int nv_win[64]; int nv_lvl[64]; int nv_vis[64]; for (i=0; i < macwinmax; i++) { int win = macwins[i].win; char prev, curr; if (win >= WINHISTNUM) { continue; } whist[whist_idx][win] |= is_exist; if (macwins[i].mapped) { whist[whist_idx][win] |= is_mapped; if (check_clipped(win)) { whist[whist_idx][win] |= is_clipped; macwins[i].clipped = 1; } if (check_offscreen(win)) { whist[whist_idx][win] |= is_offscreen; } } else { whist[whist_idx][win] |= is_offscreen; } curr = whist[whist_idx][win]; prev = whist[whist_prv][win]; if (whist_skip) { ; } else if ( !(prev & is_mapped) && (curr & is_mapped)) { /* MapNotify */ if (0) fprintf(stderr, "MapNotify: %d/%d %d %.4f tot=%d\n", prev, curr, win, dnowx(), totcnt); macosx_add_mapnotify(win, macwins[i].level, 1); if (0) macosxCGS_follow_animation_win(win, i, 1); } else if ( !(curr & is_mapped) && (prev & is_mapped)) { /* UnmapNotify */ if (0) fprintf(stderr, "UnmapNotify: %d/%d %d %.4f A tot=%d\n", prev, curr, win, dnowx(), totcnt); macosx_add_mapnotify(win, macwins[i].level, 0); } else if ( !(prev & is_exist) && (curr & is_exist)) { /* CreateNotify */ if (0) fprintf(stderr, "CreateNotify:%d/%d %d %.4f whist: %d/%d 0x%x tot=%d\n", prev, curr, win, dnowx(), whist_prv, whist_idx, win, totcnt); macosx_add_create(win, macwins[i].level); if (curr & is_mapped) { if (0) fprintf(stderr, "MapNotify: %d/%d %d %.4f tot=%d\n", prev, curr, win, dnowx(), totcnt); macosx_add_mapnotify(win, macwins[i].level, 1); } } if (whist_skip) { ; } else if (nv >= NBMAX) { ; } else if (!(curr & is_mapped)) { ; } else if (!(prev & is_mapped)) { if (1) { ; } else if (curr & is_clipped) { if (0) fprintf(stderr, "VisibNotify: %d/%d %d OBS tot=%d\n", prev, curr, win, totcnt); nv_win[nv] = win; nv_lvl[nv] = macwins[i].level; nv_vis[nv++] = 1; } else { if (0) fprintf(stderr, "VisibNotify: %d/%d %d UNOBS tot=%d\n", prev, curr, win, totcnt); nv_win[nv] = win; nv_lvl[nv] = macwins[i].level; nv_vis[nv++] = 0; } } else { if ( !(prev & is_clipped) && (curr & is_clipped) ) { if (0) fprintf(stderr, "VisibNotify: %d/%d %d OBS tot=%d\n", prev, curr, win, totcnt); nv_win[nv] = win; nv_lvl[nv] = macwins[i].level; nv_vis[nv++] = 1; } else if ( (prev & is_clipped) && !(curr & is_clipped) ) { if (0) fprintf(stderr, "VisibNotify: %d/%d %d UNOBS tot=%d\n", prev, curr, win, totcnt); nv_win[nv] = win; nv_lvl[nv] = macwins[i].level; nv_vis[nv++] = 0; } } } for (i=0; i < maxwin; i++) { char prev, curr; int win = i; int q = qlook[i]; int lvl = 0; if (whist_skip) { break; } if (q >= 0) { lvl = macwins[q].level; } curr = whist[whist_idx][win]; prev = whist[whist_prv][win]; if (!(curr & is_exist) && (prev & is_exist)) { if (prev & is_mapped) { if (0) fprintf(stderr, "UnmapNotify: %d/%d %d %.4f B tot=%d\n", prev, curr, win, dnowx(), totcnt); macosx_add_mapnotify(win, lvl, 0); } /* DestroyNotify */ if (0) fprintf(stderr, "DestroNotify:%d/%d %d %.4f tot=%d\n", prev, curr, win, dnowx(), totcnt); macosx_add_destroy(win, lvl); } } if (nv) { int k; for (k = 0; k < nv; k++) { macosx_add_visnotify(nv_win[k], nv_lvl[k], nv_vis[k]); } } } }