[Xcb] EWMH API for XCB

Arnaud Fontaine arnaud at andesi.org
Mon Dec 14 16:13:38 PST 2009

>>>>> "Jamey" == Jamey Sharp <jamey at minilop.net> writes:


Thanks for reviewing it Jamey.

    >  Do you  really want  it in  the xcb-util  bundle though?  Why not
    > manage it as its own  project? I originally intended xcb-util as a
    > collection  of sample,  proof-of-concept code, more  than anything
    > else.  I'd  really like to see somebody split  the useful bits out
    > into their own repositories.  "Useful" is probably best defined as
    > "somebody  outside of  xcb-util is using  this," which  would mean
    > your ewmh bits already don't belong. :-)

Well, I think  it's better to keep it within  xcb-util. For instance, if
all the libraries provided in xcb-util  would have not been shipped as a
bundle, I think they would be  in a much worst shape, mainly because the
original author of  the code is rarely the maintainer  on a long stretch
of time. Keeping it as a bundle ensures that even if the author does not
have time anymore to maintain his  code, someone else will take over the
maintenance and  update it  when necessary (this  is what  happened with
xcb-util/icccm at  least).  Moreover, xcb-util/icccm  and xcb-util/image
are  already   used  in   other  projects,  but   are  still   parts  of

    > This seems like a perfectly sensible implementation of EWMH to me,
    > macros  and m4  and all. (By  all means,  do whatever it  takes to
    > avoid copying and pasting code.) I do have a few minor comments:

    >  In   xcb_ewmh_send_client_message,  you  probably   should  check
    > data_len before copying  data into a fixed-size buffer--unless you
    >  want to  declare that  function static  and ensure  that  all the
    > callers  are safe. If  you want to  go the latter route  you might
    > look at the BUILD_BUG_ON macro from include/linux/kernel.h, to get
    > a compile-time check.

When adding the following macro:
#define BUILD_BUG_OR_ZERO(e) ((void) (sizeof(struct { int:-!!(e); })))

And the following line before the memcpy:
BUILD_BUG_OR_ZERO((data_len >> 2) > 5);

I get the following error I can't get rid of:
ewmh.c:563: error: bit-field ‘<anonymous>’ width not an integer constant

I'm  a bit  confused  by this  macro  and does  not understand  anything
besides of  the basic principle. I  was thinking about  simply adding an
assertion otherwise.

    > Also  in xcb_ewmh_send_client_message, I'd  encourage using memcpy
    >  instead of  a hand-coded  loop: It's  easier to  understand  at a
    > glance, and GCC will generate better code from it.

Thanks, I have just committed it[0].

    >  Huh. So  an  xcb_ewmh_connection_t  is only  usable  on a  single
    > screen, and you have to  pick which one to use when you initialize
    > it? I  know X's concept of screens is  becoming pretty obsolete in
    > the RandR era, but if anything still has to deal with multi-screen
    > setups it'd be window managers.

Actually, it's  the caller who takes care  of xcb_ewmh_connection_t. For
instance, a window manager managing two displays would simply initialize
xcb_ewmh_connection_t by calling xcb_ewmh_init_atoms() twice. I think it
can't be done otherwise, because the Atoms are specific to a display and
so  do  xcb_connection_t.  That's  why  xcb_ewmh_connection_t  has  been
defined,  only to avoid  extra parameters  such as  xcb_connection_t and
EWMH Atoms in each function of the API.

    > xcb_ewmh_init_atoms_replies probably should explicitly discard the
    > rest of the InternAtom replies if one fails.

    >  I'm a  little dismayed  that xcb_ewmh_init_atoms_replies  gets 82
    > copies  of four nearly-identical lines  of code, even  if they are
    > all auto-generated  from a bit of m4. I would  be inclined to turn
    > it into a simple loop,  either by casting the address of the first
    > atom to (uint32_t *) and  treating it as an array, or by including
    >  offsetof(xcb_ewmh_connection_t, $1)  in the  internal ewmh_atom_t
    > struct.

Hope  that's not  too  ugly[1]  ;). Concerning  discarding  the rest  of
InternAtom replies  if one  fails, I have  just requested  the remaining
replies anyway.

    > The _NET_WM_SYNC_REQUEST  section doesn't look right to  me, but I
    > don't know the EWMH spec  well enough to figure out why.

Why doesn't it look right to you? 

    >  At  least,  the  comment  header  is  missing  a  "T".   :-)  And
    >  _NET_WM_SYNC_REQUEST_COUNTER  is mentioned  only  in the  comment
    > header.

More information about the Xcb mailing list