[Xcb] Using COMMENT, and a Better Way for enums
Jamey Sharp
jamey@cs.pdx.edu
Mon, 17 Nov 2003 17:33:13 -0800
--dp9QYJgVRVEW2bsm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
(Sorry this reply took me so long: I got a bit swamped.)
On 11/06 10:56PM, James Mastros wrote:
> Hello, all.
> I'm working on a perl version of XCB
Great! I've been waiting for test cases for the versatility of the macro
language.
> (can we get a name that isn't tied to C, BTW?),
Heh. I recall that some of us have discussed that problem. You're
welcome to name your bits anything you want; in my opinion, XCB refers
to the C binding only, and xcb-proto inherits that name only because XCB
is the first (and perhaps most significant) user of the protocol
descriptions.
> First, the minor rant: While COMMENT is defined, it's almost never used.=
=20
> The m4 files contain comments in the form of /* ... */. This makes it=
=20
> quite obnoxious to try to generate things other then c with it.
>=20
> That one is easy, since there's already a defined API for it. enums, my=
=20
> next topic, require a new one, since the existing one is rather poor.
The COMMENT API is poor too, I think, because it doesn't express the
relationship between the comment and the thing being commented on. What
I actually want there is a way to include complete documentation - say,
all the content in the X protocol spec and extension specs - in the
protocol description files, in a manner suitable for generating
documentation from them.
However, for the purposes of your Perl binding, we might as well convert
those bits to use the COMMENT macro.
> (I'm using ENUM instead of XCBENUM here. The only difference seems to
> be that XCBENUM prepends XCB to the name given.
XCBENUM will/should go away. I did the classic thing of trying to be too
general; fortunately, XCB is recovering nicely.
> I propose the following.
> ENUM(`CW', `
> ENUMELEM(`BackPixmap', NTHBIT(0))
> ENUMELEM(`BackPixel', NTHBIT(1))
> ')
>=20
> The definition of ENUM needn't change in this proposal
>=20
> The definitions of the other two macros could be, for client-c.xcb:
> DEFINE(`ENUMELEM', $1` =3D '$2)
> DEFINE(`NTHBIT', `1L<<'$1)
>=20
> That should allow me to define them the way I need for perl.
Arguably, even ENUM is too general. I'd like to be able to write things
something like this:
VOIDREQUEST(CreateWindow, `
OPCODE(1)
...
PARAM(CONSTSET(CARD16, InputOutput, InputOnly, CopyFromParent), `class')
...
VALUEPARAM(CARD32, `value',
BackPixmap,
BackPixel,
...
Colormap,
Cursor
)
')
And produce C code like this:
enum XCBCreateWindowClass {
XCBCreateWindowInputOutput,
XCBCreateWindowInputOnly,
XCBCreateWindowCopyFromParent
};
enum XCBCreateWindowValue {
XCBCreateWindowBackPixmap =3D 1L << 0,
XCBCreateWindowBackPixel =3D 1L << 1,
...
};
XCBVoidCookie XCBCreateWindow(..., enum XCBCreateWindowClass class,
=2E.., CARD32 value_mask, CARD32 *value_list);
I'd then like to have a shorthand to make these names visible from other
requests, so that ChangeWindowAttributes wouldn't have to duplicate the
the elements of the CreateWindowValue bitmask, for example.
> Other languages may be a problem if they have different ideas of
> numeric literals then C, but this seems unlikely in practice. (In
> particular, almost all enums will be 42, 0x2a, or NTHBIT(4).)
As long as the target language accepts literal numbers in some
reasonable format, M4's built-in eval macro should let us not worry
about numeric constants: it can do shifts and all the obvious things.
Of course, m4 is powerful enough to write an arbitrary text parser in...
;-)
> Oh, one other thing. The extensions/ files seem to have another sort of=
=20
> literal C -- typedefs. I'd much rather see TYPEDEF(`INT32', `FIXED'),=20
> and the related make_fixed be in some higher layer completely.
I agree. Though perhaps a STRUCT with two INT16s is the right approach
for Render? I'd have to look at it again.
> BTW, the perl implementation isn't nearly ready for public perusal yet.=
=20
> While I think I'm done making huge changes to the existing pieces of=20
> infrastructure, there's a whole two layers that aren't there yet. This=
=20
> is my first low-level X programming, so I'm taking it a bit on the slow=
=20
> side.
There's an argument to be made for generating a Perl binding to the C
library, rather than writing a native Perl implementation. But I'm
thrilled that you're trying this, regardless of what implementation
strategy you use.
--=20
Jamey Sharp <jamey@minilop.net> - http://minilop.net/
--dp9QYJgVRVEW2bsm
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)
iD8DBQE/uXbZNgAXSpyH6VcRApDqAJsErn7PaxXBSuBl0y35Io9tSj74/wCghr5b
4Ify6ObEB+0VfGJw02LqjM8=
=GjTF
-----END PGP SIGNATURE-----
--dp9QYJgVRVEW2bsm--