int clientwin_check_group_leader_func(dlist *l, void *data) { ClientWin *cw = (ClientWin *)l->data; return wm_get_group_leader(cw->mainwin->dpy, cw->client.window) == *((Window*)data); }
int main(void) { dlist *clients = 0, *config = 0; Display *dpy = XOpenDisplay(NULL); MainWin *mw; Imlib_Context context; KeyCode keycode; KeySym keysym; const char *tmp, *homedir; char cfgpath[8192]; Bool invertShift = False; if(! dpy) { fprintf(stderr, "FATAL: Couldn't connect to display.\n"); return -1; } wm_get_atoms(dpy); if(! wm_check(dpy)) { fprintf(stderr, "FATAL: WM not NETWM or GNOME WM Spec compliant.\n"); return -1; } homedir = getenv("HOME"); if(homedir) { snprintf(cfgpath, 8191, "%s/%s", homedir, ".skippyrc"); config = config_load(cfgpath); } else fprintf(stderr, "WARNING: $HOME not set, not loading config.\n"); wm_use_netwm_fullscreen(strcasecmp("true", config_get(config, "general", "useNETWMFullscreen", "true")) == 0); wm_ignore_skip_taskbar(strcasecmp("true", config_get(config, "general", "ignoreSkipTaskbar", "false")) == 0); mw = mainwin_create(dpy, config); if(! mw) { fprintf(stderr, "FATAL: Couldn't create main window.\n"); config_free(config); XCloseDisplay(mw->dpy); return -1; } invertShift = strcasecmp("true", config_get(config, "xinerama", "showAll", "false")) == 0; context = imlib_context_new(); imlib_context_push(context); imlib_context_set_display(dpy); imlib_context_set_visual(mw->visual); imlib_context_set_colormap(mw->colormap); tmp = config_get(config, "general", "keysym", "F11"); keysym = XStringToKeysym(tmp); if(keysym == NoSymbol) { fprintf(stderr, "FATAL: Couldn't look up keysym for '%s', bailing out.\n", tmp); config_free(config); XCloseDisplay(mw->dpy); return -1; } mainwin_update_background(mw); XSelectInput(mw->dpy, mw->root, PropertyChangeMask); keycode = XKeysymToKeycode(mw->dpy, keysym); XGrabKey(mw->dpy, keycode, AnyModifier, mw->root, False, GrabModeAsync, GrabModeAsync); while(! DIE_NOW) { XEvent ev; XNextEvent(mw->dpy, &ev); if(ev.type == PropertyNotify && (ev.xproperty.atom == ESETROOT_PMAP_ID || ev.xproperty.atom == _XROOTPMAP_ID)) mainwin_update_background(mw); else if(ev.type == KeyRelease && ev.xkey.keycode == keycode) { Window leader = None, focused = wm_get_focused(mw->dpy); Bool shifted = (ev.xkey.state & ShiftMask) ? ! invertShift : invertShift; if(ev.xkey.state & Mod1Mask) { if(focused != None) leader = wm_get_group_leader(mw->dpy, focused); if(! leader) continue; } clients = skippy_run(mw, clients, (ev.xkey.state & ControlMask), focused, leader, shifted); } } dlist_free_with_func(clients, (dlist_free_func)clientwin_destroy); XFlush(mw->dpy); mainwin_destroy(mw); imlib_context_pop(); imlib_context_free(context); XSync(dpy, True); XCloseDisplay(dpy); config_free(config); return 0; }