Пример #1
0
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;
}
Пример #2
0
/** 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;
}