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

Reply via email to