Bool systray_acquire(void) { XSetWindowAttributes wattr; if(!conf.systray.active || traywin) return False; if(XGetSelectionOwner(dpy, net_atom[net_system_tray_s]) != None) { warnx("Can't initialize system tray: owned by another process"); return False; } /* Init traywin window */ wattr.event_mask = ButtonPressMask | ExposureMask; wattr.override_redirect = True; wattr.background_pixmap = ParentRelative; wattr.background_pixel = conf.colors.bar; traywin = XCreateSimpleWindow(dpy, infobar[conf.systray.screen].bar->win, -1, -1, 1, 1, 0, 0, conf.colors.bar); XChangeWindowAttributes(dpy, traywin, CWEventMask | CWOverrideRedirect | CWBackPixel, &wattr); XSelectInput(dpy, traywin, KeyPressMask | ButtonPressMask); XMapRaised(dpy, traywin); XSetSelectionOwner(dpy, net_atom[net_system_tray_s], traywin, CurrentTime); if(XGetSelectionOwner(dpy, net_atom[net_system_tray_s]) != traywin) { systray_freeicons(); warnx("System tray: can't get systray manager"); return False; } ewmh_send_message(ROOT, ROOT, "MANAGER", CurrentTime, net_atom[net_system_tray_s], traywin, 0, 0); XSync(dpy, False); return True; }
/** Clean wmfs before the exit */ void quit(void) { Client *c; size_t i, len; /* Set the silent error handler */ XSetErrorHandler(errorhandlerdummy); /* Unmanage all clients */ for(c = clients; c; c = c->next) { client_unhide(c); XReparentWindow(dpy, c->win, ROOT, c->geo.x, c->geo.y); } free(tags); free(seltag); systray_freeicons(); XftFontClose(dpy, font); for(i = 0; i < CurLast; ++i) XFreeCursor(dpy, cursor[i]); XFreeGC(dpy, gc_stipple); infobar_destroy(); free(sgeo); free(spgeo); free(infobar); free(keys); free(net_atom); /* Clean conf alloced thing */ free(menulayout.item); if(conf.menu) { len = LEN(conf.menu); for(i = 0; i < len; ++i) free(conf.menu[i].item); free(conf.menu); } free(conf.launcher); free(conf.rule); free(conf.bars.mouse); free(conf.selbar.mouse); free(conf.titlebar.button); free(conf.client.mouse); free(conf.root.mouse); free_conf(); XSync(dpy, False); XCloseDisplay(dpy); /* kill status script */ if (conf.status_pid != (pid_t)-1) kill(conf.status_pid, SIGTERM); return; }