diff --git a/awesome.c b/awesome.c index 065e9ae0..4da72fd7 100644 --- a/awesome.c +++ b/awesome.c @@ -40,7 +40,6 @@ #include "util.h" #include "statusbar.h" -Client *clients = NULL; Client *sel = NULL; Client *stack = NULL; @@ -91,6 +90,7 @@ cleanup(awesome_config *awesomeconf) } XSetInputFocus(awesomeconf->display, PointerRoot, RevertToPointerRoot, CurrentTime); XSync(awesomeconf->display, False); + p_delete(&awesomeconf->clients); p_delete(&awesomeconf); } @@ -269,6 +269,7 @@ main(int argc, char *argv[]) enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */ Atom netatom[NetLast]; event_handler **handler; + Client **clients; if(argc >= 2) { @@ -309,11 +310,13 @@ main(int argc, char *argv[]) /* allocate stuff */ awesomeconf = p_new(awesome_config, get_screen_count(dpy)); + clients = p_new(Client *, 1); for(screen = 0; screen < get_screen_count(dpy); screen++) { parse_config(dpy, screen, confpath, &awesomeconf[screen]); setup(&awesomeconf[screen]); + awesomeconf[screen].clients = clients; drawstatusbar(dpy, &awesomeconf[screen]); } diff --git a/client.c b/client.c index dc9a4d7b..2b4895cd 100644 --- a/client.c +++ b/client.c @@ -34,7 +34,7 @@ #include "layouts/floating.h" /* extern */ -extern Client *clients, *sel, *stack; /* global client list and stack */ +extern Client *sel, *stack; /* global client list and stack */ /** Attach client stack to clients stacks * \param c the client @@ -219,7 +219,7 @@ setclienttrans(Client *c, double opacity) * \param c2 second client */ static void -client_swap(Client *c1, Client *c2) +client_swap(Client **head, Client *c1, Client *c2) { Client *tmp; @@ -243,24 +243,24 @@ client_swap(Client *c1, Client *c2) if(c2->prev) c2->prev->next = c2; - if(clients == c1) - clients = c2; + if(*head == c1) + *head = c2; } /** Attach client to the beginning of the clients stack * \param c the client */ void -attach(Client * c) +attach(Client **head, Client *c) { - if(clients) - clients->prev = c; - c->next = clients; - clients = c; + if(*head) + (*head)->prev = c; + c->next = *head; + *head = c; } void -updatetitle(Client * c) +updatetitle(Client *c) { if(!xgettextprop(c->display, c->win, XInternAtom(c->display, "_NET_WM_NAME", False), c->name, sizeof c->name)) xgettextprop(c->display, c->win, XInternAtom(c->display, "WM_NAME", False), c->name, sizeof c->name); @@ -304,14 +304,14 @@ configure(Client * c) * \param c client to detach */ void -detach(Client * c) +detach(Client **head, Client *c) { if(c->prev) c->prev->next = c->next; if(c->next) c->next->prev = c->prev; - if(c == clients) - clients = c->next; + if(c == *head) + *head = c->next; c->next = c->prev = NULL; } @@ -452,7 +452,7 @@ manage(Display *disp, Window w, XWindowAttributes *wa, awesome_config *awesomeco updatetitle(c); move_client_to_screen(c, awesomeconf, False); if((rettrans = XGetTransientForHint(disp, w, &trans) == Success)) - for(t = clients; t && t->win != trans; t = t->next); + for(t = *awesomeconf->clients; t && t->win != trans; t = t->next); if(t) for(i = 0; i < awesomeconf->ntags; i++) c->tags[i] = t->tags[i]; @@ -461,7 +461,7 @@ manage(Display *disp, Window w, XWindowAttributes *wa, awesome_config *awesomeco if(!c->isfloating) c->isfloating = (rettrans == Success) || c->isfixed; saveprops(c, awesomeconf->ntags); - attach(c); + attach(awesomeconf->clients, c); attachstack(c); XMoveResizeWindow(disp, c->win, c->x, c->y, c->w, c->h); /* some windows require this */ c->isbanned = True; @@ -588,7 +588,7 @@ unmanage(Client * c, long state, awesome_config *awesomeconf) /* The server grab construct avoids race conditions. */ XGrabServer(c->display); XConfigureWindow(c->display, c->win, CWBorderWidth, &wc); /* restore border */ - detach(c); + detach(awesomeconf->clients, c); detachstack(c); if(sel == c) focus(c->display, NULL, True, awesomeconf); @@ -760,7 +760,7 @@ uicb_swapnext(Display *disp, for(next = sel->next; next && !isvisible(next, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags); next = next->next); if(next) { - client_swap(sel, next); + client_swap(awesomeconf->clients, sel, next); arrange(disp, awesomeconf); } } @@ -778,7 +778,7 @@ uicb_swapprev(Display *disp, for(prev = sel->prev; prev && !isvisible(prev, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags); prev = prev->prev); if(prev) { - client_swap(prev, sel); + client_swap(awesomeconf->clients, prev, sel); arrange(disp, awesomeconf); } } diff --git a/client.h b/client.h index 76948547..7a67983d 100644 --- a/client.h +++ b/client.h @@ -27,46 +27,12 @@ /** Mask shorthands, used in event.c and client.c */ #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) -typedef struct Client Client; -struct Client -{ - /** Client name */ - char name[256]; - /** Window geometry */ - int x, y, w, h; - /** Real window geometry for floating */ - int rx, ry, rw, rh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh; - int minax, maxax, minay, maxay; - /** True if client is unmapped */ - Bool unmapped; - long flags; - int border, oldborder; - Bool isbanned, isfixed, ismax, isfloating, wasfloating; - /** Tags for the client */ - Bool *tags; - /** Next client */ - Client *next; - /** Previous client */ - Client *prev; - Client *snext; - /** Window of the client */ - Window win; - /** Client display */ - Display *display; - /** Client logical screen */ - int screen; - /** Client physical screen */ - int phys_screen; - /** First time viewed on new layout */ - Bool ftview; -}; void grabbuttons(Client *, Bool, Bool, KeySym, unsigned int); -inline void attach(Client *); /* attaches c to global client list */ +inline void attach(Client **, Client *); +inline void detach(Client **, Client *); void ban(Client *); /* bans c */ void configure(Client *); /* send synthetic configure event */ -void detach(Client *); /* detaches c from global client list */ void focus(Display *, Client *, Bool, awesome_config *); /* focus c if visible && !NULL, or focus top visible */ void manage(Display *, Window, XWindowAttributes *, awesome_config *); void resize(Client *, int, int, int, int, awesome_config *, Bool); /* resize with given coordinates c */ diff --git a/config.h b/config.h index 2e6f21e8..5f4f3e2d 100644 --- a/config.h +++ b/config.h @@ -92,6 +92,41 @@ typedef struct Layout *layout; } Tag; +typedef struct Client Client; +struct Client +{ + /** Client name */ + char name[256]; + /** Window geometry */ + int x, y, w, h; + /** Real window geometry for floating */ + int rx, ry, rw, rh; + int basew, baseh, incw, inch, maxw, maxh, minw, minh; + int minax, maxax, minay, maxay; + /** True if client is unmapped */ + Bool unmapped; + long flags; + int border, oldborder; + Bool isbanned, isfixed, ismax, isfloating, wasfloating; + /** Tags for the client */ + Bool *tags; + /** Next client */ + Client *next; + /** Previous client */ + Client *prev; + Client *snext; + /** Window of the client */ + Window win; + /** Client display */ + Display *display; + /** Client logical screen */ + int screen; + /** Client physical screen */ + int phys_screen; + /** First time viewed on new layout */ + Bool ftview; +}; + /** Main configuration structure */ struct awesome_config { @@ -157,6 +192,8 @@ struct awesome_config Cursor cursor[CurLast]; /** Font */ XftFont *font; + /** Clients list */ + Client **clients; }; void parse_config(Display *, int, const char *, awesome_config *); /* parse configuration file */ diff --git a/event.c b/event.c index 4c3b3e26..b7975846 100644 --- a/event.c +++ b/event.c @@ -36,17 +36,17 @@ #include "layouts/floating.h" /* extern */ -extern Client *clients, *sel; /* global client list */ +extern Client *sel; #define CLEANMASK(mask, screen) (mask & ~(awesomeconf[screen].numlockmask | LockMask)) #define MOUSEMASK (BUTTONMASK | PointerMotionMask) static Client * -getclient(Window w) +getclient(Client **list, Window w) { Client *c; - for(c = clients; c && c->win != w; c = c->next); + for(c = *list; c && c->win != w; c = c->next); return c; } @@ -198,7 +198,7 @@ handle_event_buttonpress(XEvent * e, awesome_config *awesomeconf) return; } - if((c = getclient(ev->window))) + if((c = getclient(awesomeconf->clients, ev->window))) { focus(c->display, c, ev->same_screen, &awesomeconf[c->screen]); if(CLEANMASK(ev->state, c->screen) != awesomeconf[c->screen].modkey) @@ -258,7 +258,7 @@ handle_event_configurerequest(XEvent * e, awesome_config *awesomeconf) XConfigureRequestEvent *ev = &e->xconfigurerequest; XWindowChanges wc; - if((c = getclient(ev->window))) + if((c = getclient(awesomeconf->clients, ev->window))) { c->ismax = False; if(ev->value_mask & CWBorderWidth) @@ -334,7 +334,7 @@ handle_event_destroynotify(XEvent * e, awesome_config *awesomeconf) Client *c; XDestroyWindowEvent *ev = &e->xdestroywindow; - if((c = getclient(ev->window))) + if((c = getclient(awesomeconf->clients, ev->window))) unmanage(c, WithdrawnState, &awesomeconf[c->screen]); } @@ -347,7 +347,7 @@ handle_event_enternotify(XEvent * e, awesome_config *awesomeconf) if(ev->mode != NotifyNormal || ev->detail == NotifyInferior) return; - if((c = getclient(ev->window))) + if((c = getclient(awesomeconf->clients, ev->window))) { if(!sel || sel != c) { @@ -438,7 +438,7 @@ handle_event_maprequest(XEvent * e, awesome_config *awesomeconf) return; if(wa.override_redirect) return; - if(!getclient(ev->window)) + if(!getclient(awesomeconf->clients, ev->window)) { for(screen = 0; wa.screen != ScreenOfDisplay(e->xany.display, screen); screen++); if(screen == 0) @@ -456,13 +456,13 @@ handle_event_propertynotify(XEvent * e, awesome_config *awesomeconf) if(ev->state == PropertyDelete) return; /* ignore */ - if((c = getclient(ev->window))) + if((c = getclient(awesomeconf->clients, ev->window))) { switch (ev->atom) { case XA_WM_TRANSIENT_FOR: XGetTransientForHint(e->xany.display, c->win, &trans); - if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL))) + if(!c->isfloating && (c->isfloating = (getclient(awesomeconf->clients, trans) != NULL))) arrange(e->xany.display, &awesomeconf[c->screen]); break; case XA_WM_NORMAL_HINTS: @@ -484,7 +484,7 @@ handle_event_unmapnotify(XEvent * e, awesome_config *awesomeconf) Client *c; XUnmapEvent *ev = &e->xunmap; - if((c = getclient(ev->window)) + if((c = getclient(awesomeconf->clients, ev->window)) && ev->event == RootWindow(e->xany.display, c->phys_screen) && (ev->send_event || !c->unmapped)) unmanage(c, WithdrawnState, &awesomeconf[c->screen]); } @@ -494,7 +494,7 @@ handle_event_shape(XEvent * e, awesome_config *awesomeconf __attribute__ ((unused))) { XShapeEvent *ev = (XShapeEvent *) e; - Client *c = getclient(ev->window); + Client *c = getclient(awesomeconf->clients, ev->window); if(c) set_shape(c); diff --git a/layout.c b/layout.c index a7725333..bcaed39b 100644 --- a/layout.c +++ b/layout.c @@ -30,7 +30,7 @@ #include "layouts/floating.h" /* extern */ -extern Client *clients, *sel; /* global client list */ +extern Client *sel; /** Arrange windows following current selected layout * \param disp display ref @@ -41,7 +41,7 @@ arrange(Display * disp, awesome_config *awesomeconf) { Client *c; - for(c = clients; c; c = c->next) + for(c = *awesomeconf->clients; c; c = c->next) { if(isvisible(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags)) unban(c); @@ -65,7 +65,7 @@ uicb_focusnext(Display *disp __attribute__ ((unused)), return; for(c = sel->next; c && !isvisible(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags); c = c->next); if(!c) - for(c = clients; c && !isvisible(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags); c = c->next); + for(c = *awesomeconf->clients; c && !isvisible(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags); c = c->next); if(c) { focus(c->display, c, True, awesomeconf); @@ -85,7 +85,7 @@ uicb_focusprev(Display *disp __attribute__ ((unused)), for(c = sel->prev; c && !isvisible(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags); c = c->prev); if(!c) { - for(c = clients; c && c->next; c = c->next); + for(c = *awesomeconf->clients; c && c->next; c = c->next); for(; c && !isvisible(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags); c = c->prev); } if(c) @@ -137,7 +137,7 @@ restack(Display * disp, awesome_config *awesomeconf) XConfigureWindow(disp, sel->win, CWSibling | CWStackMode, &wc); wc.sibling = sel->win; } - for(c = clients; c; c = c->next) + for(c = *awesomeconf->clients; c; c = c->next) { if(!IS_TILED(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags) || c == sel) continue; @@ -189,7 +189,7 @@ uicb_setlayout(Display *disp, awesomeconf->current_layout = &awesomeconf->layouts[i]; - for(c = clients; c; c = c->next) + for(c = *awesomeconf->clients; c; c = c->next) c->ftview = True; if(sel) @@ -278,8 +278,8 @@ uicb_zoom(Display *disp __attribute__ ((unused)), { if(!sel) return; - detach(sel); - attach(sel); + detach(awesomeconf->clients, sel); + attach(awesomeconf->clients, sel); focus(sel->display, sel, True, awesomeconf); arrange(sel->display, awesomeconf); } diff --git a/layouts/floating.c b/layouts/floating.c index 09562645..4cff91cd 100644 --- a/layouts/floating.c +++ b/layouts/floating.c @@ -22,15 +22,12 @@ #include "tag.h" #include "layouts/floating.h" -/* extern */ -extern Client *clients; /* global client */ - void layout_floating(Display *disp __attribute__ ((unused)), awesome_config *awesomeconf) { /* default floating layout */ Client *c; - for(c = clients; c; c = c->next) + for(c = *awesomeconf->clients; c; c = c->next) if(isvisible(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags)) { if(c->ftview) diff --git a/layouts/max.c b/layouts/max.c index c034be09..71c178cb 100644 --- a/layouts/max.c +++ b/layouts/max.c @@ -23,16 +23,13 @@ #include "screen.h" #include "layouts/max.h" -/* extern */ -extern Client *clients; /* global client */ - void layout_max(Display *disp, awesome_config *awesomeconf) { Client *c; ScreenInfo *si = get_screen_info(disp, awesomeconf->screen, &awesomeconf->statusbar); - for(c = clients; c; c = c->next) + for(c = *awesomeconf->clients; c; c = c->next) if(IS_TILED(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags)) resize(c, si[awesomeconf->screen].x_org, si[awesomeconf->screen].y_org, si[awesomeconf->screen].width - 2 * c->border, diff --git a/layouts/tile.c b/layouts/tile.c index 43f82d7e..97d7d389 100644 --- a/layouts/tile.c +++ b/layouts/tile.c @@ -28,9 +28,6 @@ #include "layout.h" #include "layouts/tile.h" -/* extern */ -extern Client *clients; - void uicb_setnmaster(Display *disp, awesome_config *awesomeconf, @@ -104,7 +101,7 @@ _tile(Display *disp, awesome_config *awesomeconf, const Bool right) screens_info = get_screen_info(disp, awesomeconf->screen, &awesomeconf->statusbar); - for(n = 0, c = clients; c; c = c->next) + for(n = 0, c = *awesomeconf->clients; c; c = c->next) if(IS_TILED(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags)) n++; @@ -130,7 +127,7 @@ _tile(Display *disp, awesome_config *awesomeconf, const Bool right) real_ncol = MIN(otherwin, awesomeconf->ncol); - for(i = 0, c = clients; c; c = c->next) + for(i = 0, c = *awesomeconf->clients; c; c = c->next) { if(!IS_TILED(c, awesomeconf->screen, awesomeconf->tags, awesomeconf->ntags)) continue; diff --git a/screen.c b/screen.c index 169ef4d1..cc769deb 100644 --- a/screen.c +++ b/screen.c @@ -24,7 +24,7 @@ #include "tag.h" #include "layout.h" -extern Client *sel, *clients; +extern Client *sel; /** Get screens info * \param disp Display ref @@ -197,7 +197,7 @@ uicb_focusnextscreen(Display *disp, Client *c; int next_screen = awesomeconf->screen + 1 >= get_screen_count(disp) ? 0 : awesomeconf->screen + 1; - for(c = clients; c && !isvisible(c, next_screen, awesomeconf[next_screen - awesomeconf->screen].tags, awesomeconf[next_screen - awesomeconf->screen].ntags); c = c->next); + for(c = *awesomeconf->clients; c && !isvisible(c, next_screen, awesomeconf[next_screen - awesomeconf->screen].tags, awesomeconf[next_screen - awesomeconf->screen].ntags); c = c->next); if(c) { focus(c->display, c, True, &awesomeconf[next_screen - awesomeconf->screen]); @@ -214,7 +214,7 @@ uicb_focusprevscreen(Display *disp, Client *c; int prev_screen = awesomeconf->screen - 1 < 0 ? get_screen_count(disp) - 1 : awesomeconf->screen - 1; - for(c = clients; c && !isvisible(c, prev_screen, awesomeconf[prev_screen - awesomeconf->screen].tags, awesomeconf[prev_screen - awesomeconf->screen].ntags); c = c->next); + for(c = *awesomeconf->clients; c && !isvisible(c, prev_screen, awesomeconf[prev_screen - awesomeconf->screen].tags, awesomeconf[prev_screen - awesomeconf->screen].ntags); c = c->next); if(c) { focus(c->display, c, True, &awesomeconf[prev_screen - awesomeconf->screen]); diff --git a/statusbar.c b/statusbar.c index f7e580c1..1618a0de 100644 --- a/statusbar.c +++ b/statusbar.c @@ -28,7 +28,7 @@ #include "util.h" #include "layouts/tile.h" -extern Client *clients, *sel; /* global client list */ +extern Client *sel; /** Check if at least a client is tagged with tag number t and is on screen * screen @@ -37,11 +37,11 @@ extern Client *clients, *sel; /* global client list */ * \return True or False */ static Bool -isoccupied(unsigned int t, int screen) +isoccupied(Client **head, unsigned int t, int screen) { Client *c; - for(c = clients; c; c = c->next) + for(c = *head; c; c = c->next) if(c->tags[t] && c->screen == screen) return True; return False; @@ -67,7 +67,7 @@ drawstatusbar(Display *disp, awesome_config * awesomeconf) awesomeconf->statusbar.height, awesomeconf->font, awesomeconf->tags[i].name, awesomeconf->colors_selected); - if(isoccupied(i, awesomeconf->screen)) + if(isoccupied(awesomeconf->clients, i, awesomeconf->screen)) drawrectangle(disp, awesomeconf->phys_screen, x, y, (awesomeconf->font->height + 2) / 4, @@ -88,7 +88,7 @@ drawstatusbar(Display *disp, awesome_config * awesomeconf) awesomeconf->statusbar.height, awesomeconf->font, awesomeconf->tags[i].name, awesomeconf->colors_normal); - if(isoccupied(i, awesomeconf->screen)) + if(isoccupied(awesomeconf->clients, i, awesomeconf->screen)) drawrectangle(disp, awesomeconf->phys_screen, x, y, (awesomeconf->font->height + 2) / 4,