[PATCH:libX11 1/2] Use C99 named initializers to fill in events passed to XSendEvent

Matthieu Herrb matthieu at herrb.eu
Fri Jul 11 22:37:55 PDT 2014


On 07/12/2014 06:22 AM, Alan Coopersmith wrote:
> Forces compiler to zero-fill unset fields in the struct (fixing bug 81236)
> and allows optimizer to order field initialization to best fit cache layout
> or other considertations.
>
> Before & after output of gcc -S on AMD64 shows insertion of "rep stosq"
> instructions to rapidly zero-fill structs.
>
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>

Reviewed-by: Matthieu Herrb <matthieu at herrb.eu>

> ---
>   src/Iconify.c  |   26 +++++++++++++++-----------
>   src/ReconfWM.c |   37 ++++++++++++++++++++-----------------
>   src/Withdraw.c |   22 ++++++++++++----------
>   3 files changed, 47 insertions(+), 38 deletions(-)
>
> diff --git a/src/Iconify.c b/src/Iconify.c
> index 3a969d7..9da4165 100644
> --- a/src/Iconify.c
> +++ b/src/Iconify.c
> @@ -67,19 +67,23 @@ Status XIconifyWindow (
>       Window w,
>       int screen)
>   {
> -    XClientMessageEvent ev;
> -    Window root = RootWindow (dpy, screen);
>       Atom prop;
>
>       prop = XInternAtom (dpy, "WM_CHANGE_STATE", False);
> -    if (prop == None) return False;
> +    if (prop == None)
> +        return False;
> +    else {
> +        XClientMessageEvent ev = {
> +            .type = ClientMessage,
> +            .window = w,
> +            .message_type = prop,
> +            .format = 32,
> +            .data.l[0] = IconicState
> +        };
> +        Window root = RootWindow (dpy, screen);
>
> -    ev.type = ClientMessage;
> -    ev.window = w;
> -    ev.message_type = prop;
> -    ev.format = 32;
> -    ev.data.l[0] = IconicState;
> -    return (XSendEvent (dpy, root, False,
> -			SubstructureRedirectMask|SubstructureNotifyMask,
> -			(XEvent *)&ev));
> +        return (XSendEvent (dpy, root, False,
> +                            SubstructureRedirectMask|SubstructureNotifyMask,
> +                            (XEvent *)&ev));
> +    }
>   }
> diff --git a/src/ReconfWM.c b/src/ReconfWM.c
> index 1776f2e..8dc3534 100644
> --- a/src/ReconfWM.c
> +++ b/src/ReconfWM.c
> @@ -41,7 +41,6 @@ Status XReconfigureWMWindow (
>       unsigned int mask,
>       XWindowChanges *changes)
>   {
> -    XConfigureRequestEvent ev;
>       Window root = RootWindow (dpy, screen);
>       _XAsyncHandler async;
>       _XAsyncErrorState async_state;
> @@ -120,20 +119,24 @@ Status XReconfigureWMWindow (
>       /*
>        * If the request succeeded, then everything is okay; otherwise, send event
>        */
> -    if (!async_state.error_count) return True;
> -
> -    ev.type		= ConfigureRequest;
> -    ev.window		= w;
> -    ev.parent		= root;
> -    ev.value_mask	= (mask & AllMaskBits);
> -    ev.x		= changes->x;
> -    ev.y		= changes->y;
> -    ev.width		= changes->width;
> -    ev.height		= changes->height;
> -    ev.border_width	= changes->border_width;
> -    ev.above		= changes->sibling;
> -    ev.detail		= changes->stack_mode;
> -    return (XSendEvent (dpy, root, False,
> -			SubstructureRedirectMask|SubstructureNotifyMask,
> -			(XEvent *)&ev));
> +    if (!async_state.error_count)
> +        return True;
> +    else {
> +        XConfigureRequestEvent ev = {
> +            .type		= ConfigureRequest,
> +            .window		= w,
> +            .parent		= root,
> +            .value_mask		= (mask & AllMaskBits),
> +            .x			= changes->x,
> +            .y			= changes->y,
> +            .width		= changes->width,
> +            .height		= changes->height,
> +            .border_width	= changes->border_width,
> +            .above		= changes->sibling,
> +            .detail		= changes->stack_mode,
> +        };
> +        return (XSendEvent (dpy, root, False,
> +                            SubstructureRedirectMask|SubstructureNotifyMask,
> +                            (XEvent *)&ev));
> +    }
>   }
> diff --git a/src/Withdraw.c b/src/Withdraw.c
> index ac15ddc..1015f5b 100644
> --- a/src/Withdraw.c
> +++ b/src/Withdraw.c
> @@ -67,16 +67,18 @@ Status XWithdrawWindow (
>       Window w,
>       int screen)
>   {
> -    XUnmapEvent ev;
> -    Window root = RootWindow (dpy, screen);
> -
>       XUnmapWindow (dpy, w);
>
> -    ev.type = UnmapNotify;
> -    ev.event = root;
> -    ev.window = w;
> -    ev.from_configure = False;
> -    return (XSendEvent (dpy, root, False,
> -			SubstructureRedirectMask|SubstructureNotifyMask,
> -			(XEvent *)&ev));
> +    {
> +        Window root = RootWindow (dpy, screen);
> +        XUnmapEvent ev = {
> +            .type = UnmapNotify,
> +            .event = root,
> +            .window = w,
> +            .from_configure = False
> +        };
> +        return (XSendEvent (dpy, root, False,
> +                            SubstructureRedirectMask|SubstructureNotifyMask,
> +                            (XEvent *)&ev));
> +    }
>   }
>



More information about the xorg-devel mailing list