int main(int argc, const char *argv[]) { const char *levels[] = {"Base", "Minimum", "Desktop", "Backstop", "Normal", "Floating", "TornOffMenu", "Dock", "MainMenu", "Status", "ModalPanel", "PopUpMenu", "Dragging", "ScreenSaver", "Maximum", "Overlay", "Help", "Utility", "DesktopIcon", "Cursor", "AssistiveTechHigh"}; if (argc < 2) { usage: fprintf(stderr, "usage: %s [-s <level>] <wid>\n" "Levels: Base Minimum Desktop Backstop Normal Floating TornOffMenu Dock MainMenu Status ModalPanel PopUpMenu Dragging ScreenSaver Maximum Overlay Help Utility DesktopIcon Cursor AssistiveTechHigh\n" , argv[0]); return 1; } CGSConnectionID cid = CGSMainConnectionID(); // CGSWindowID wid = (int)strtol(argv[1], NULL, 10); #if 0 CGSConnectionID owner = 0; CGSSharingState sh; if (!((CGSGetWindowOwner(cid, wid, &owner) == 0 && owner == cid) || (CGSGetWindowSharingState(cid, wid, &sh) == 0 && sh == kCGSSharingReadWrite))) { #endif size_t len = 0; struct kinfo_proc *r = NULL; int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; if (sysctl(name, 3, NULL, &len, NULL, 0) || ((r = malloc(len)) == NULL) || sysctl(name, 3, r, &len, NULL, 0)) err(1, NULL); size_t c = len / sizeof(struct kinfo_proc); struct kinfo_proc *k = r; while (c--) { if (strcmp(k->kp_proc.p_comm, "Dock") == 0) kill(k->kp_proc.p_pid, SIGKILL); k++; } #if 0 } #endif CGSSetUniversalOwner(cid); CGWindowLevel level = 0; if ((strcmp(argv[1], "-s") == 0) && (argc > 3)) { char *endptr; level = (int)strtol(argv[2], &endptr, 10); if (endptr == argv[2]) { unsigned int i = 0; do { if (strcasecmp(argv[2], levels[i]) == 0) { level = CGWindowLevelForKey(i); break; } i += 1; } while (i < sizeof(levels)/sizeof(levels[0])); if (i == sizeof(levels)/sizeof(levels[0])) { fprintf(stderr, "%s: Unknown level\n", argv[2]); goto usage; } } for (int i = 3; i < argc; i++) { if (CGSSetWindowLevel(cid, (CGSWindowID)strtol(argv[i], NULL, 10), level) != noErr) warnx("%d: failed", argv[i]); } } else { for (int j = 1; j < argc; j++) { CGSGetWindowLevel(cid, (CGSWindowID)strtol(argv[j], NULL, 10), &level); unsigned int i = 0; do { // todo: option to just print number if (level == CGWindowLevelForKey(i)) { puts(levels[i]); break; } } while (++i < sizeof(levels)/sizeof(levels[0])); // TODO: if multiple wids, format |wid: level| if (i == sizeof(levels)/sizeof(levels[0])) printf("%d\n", level); } } return 0; }
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]); } } } }