2008/9/9 Premysl Hruby <[EMAIL PROTECTED]>: > On (09/09/08 09:13), Szabolcs Nagy wrote: >> To: dwm mail list <[email protected]> >> From: Szabolcs Nagy <[EMAIL PROTECTED]> >> Subject: Re: [dwm] malloc'ed client in manage() >> Reply-To: dwm mail list <[email protected]> >> List-Id: dwm mail list <dwm.suckless.org> >> >> On 9/8/08, Anselm R Garbe <[EMAIL PROTECTED]> wrote: >> >> but if we really care about obscure 30 year old cpus (other than x86 >> >> :)) then i'd go with my solution: c = malloc(); and *c = (Client){}; >> > >> > Well, I agree on this proposal and go for it. It is fairly simple and >> > nice looking imho. >> >> sorry i misread the standard >> eventhough it sais >> >> "If there are fewer initializers in a brace-enclosed list than there >> are elements or members of an aggregate, or fewer characters in a >> string literal used to initialize an array of known size than there >> are elements in the array, the remainder of the aggregate shall be >> initialized implicitly the same as objects that have static storage >> duration." >> >> the initializer list must contain at least one element so the empty {} >> is not enough. (easy to overlook since it is not stated explicitly, >> just the result of the given initializer grammar) >> >> Client can be initialized with {""} (first member is .name) or {.x = >> 0} or whatever, but general zero-init is impossible this way :( >> >> tl;dr: use the original patch >> > > This can be easilly done with patch: > > diff -r e4bcaca8e6ef dwm.c > --- a/dwm.c Mon Sep 08 22:24:05 2008 +0100 > +++ b/dwm.c Tue Sep 09 10:12:01 2008 +0200 > @@ -846,22 +846,21 @@ > > void > manage(Window w, XWindowAttributes *wa) { > - static Client cz; > Client *c, *t = NULL; > Window trans = None; > XWindowChanges wc; > > if(!(c = malloc(sizeof(Client)))) > die("fatal: could not malloc() %u bytes\n", sizeof(Client)); > - *c = cz; > - c->win = w; > + *c = (const Client){ > + .win = w, > + .x = wa->x, > + .y = wa->y, > + .w = wa->width, > + .h = wa->height, > + .oldbw = wa->border_width, > + }; > > - /* geometry */ > - c->x = wa->x; > - c->y = wa->y; > - c->w = wa->width; > - c->h = wa->height; > - c->oldbw = wa->border_width; > if(c->w == sw && c->h == sh) { > c->x = sx; > c->y = sy; > > But, I dislike this whole !calloc solution. BTW: there are plenty of places > which expects that NULL == 0 -> false ...
Well, the original patch is kind of common, whereas this approach looks somehow odd to me, I go with the static initializer for now. Kind regards, --Anselm
