<br><br><div class="gmail_quote">On Fri, Oct 26, 2012 at 10:26 PM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

That seems like an ok solution.<br>
<br>
I would be tempted to write<br>
<br>
 (define-cstruct _XEvent ([type _int]))<br>
<br>
 (define-cstruct (_XAnyEvent _XEvent) ([serial _ulong]<br>
                                       ....))<br>
 (define-cstruct (_XKeyEvent _XEvent) ([serial _ulong]<br>
                                       ....))<br>
 ....<br>
<br>
Those declarations more directly fit the sub-structuring that is<br>
implemented by the union in &quot;Xlib.h&quot;, but it doesn&#39;t give you<br>
`XAnyEvent-type&#39;, `XKeyEvent-type&#39;, etc., and the size of `_XEvent&#39;<br>
isn&#39;t the maximum of the variant sizes.<br></blockquote><div><br>Ok, so as Jon pointed out, the last part may be a problem then.<br>And _union is not the right thing to use here apparently.<br><br>Now I think that Jon&#39;s solution is actually quite good.<br>

The XNextEvent* procedure does all that is needed (add the correct pointer-tag) for the user, who can then use the corresponding 
&quot;sub-struct&quot; on the event.<br>I&#39;m just wondering if it would not be possible to simply add all relevant tags to the any XEvent, e.g.:<br>(define (make-dummy-XEvent)<br>    (let ((s (malloc _int (* 24 (ctype-sizeof _long)))))<br>

      (memset s 0 24 _long)<br>      (cpointer-push-tag! s XEvent-tag)<br>      (cpointer-push-tag! s XAnyEvent-tag)<br>      (cpointer-push-tag! s XKeypressedEvent-tag)<br>      ....<br>      s)<br>without caring about the actual kind of event received, and let the user use the event kind it wants. But it&#39;s probably not so important now.<br>

<br>Thanks for your answers, I understand it better now.<br><br>Laurent<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5"><br>
At Fri, 26 Oct 2012 19:00:01 +0200, Laurent wrote:<br>
&gt; Oooohh, I think I understand now: the way it was is already sufficiently<br>
&gt; general.<br>
&gt; The writer of the initial code took a different direction.<br>
&gt; Instead of defining a union type, he changes the tag of the pointer<br>
&gt; depending on what kind of type he needs in the union:<br>
&gt; (cpointer-push-tag! e XAnyEvent-tag)<br>
&gt; (case (XAnyEvent-type e)<br>
&gt;     ((KeyPress) (cpointer-push-tag! e XKeyPressedEvent-tag))<br>
&gt;     ((KeyRelease) (cpointer-push-tag! e XKeyReleasedEvent-tag))<br>
&gt;     ....<br>
&gt;<br>
&gt; It&#39;s pretty smart. Is it the right way to go in general, and should _unions<br>
&gt; be avoided?<br>
&gt;<br>
&gt; Laurent<br>
&gt;<br>
&gt; On Fri, Oct 26, 2012 at 6:39 PM, Laurent &lt;<a href="mailto:laurent.orseau@gmail.com">laurent.orseau@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; Hi,<br>
&gt; &gt;<br>
&gt; &gt; I am trying to convert an FFI cstruct definition into a union.<br>
&gt; &gt; More exactly, the previous definition was :<br>
&gt; &gt; (define-cstruct _XEvent<br>
&gt; &gt;     ((type EventType)))<br>
&gt; &gt;<br>
&gt; &gt; with EventType being defined elsewhere.<br>
&gt; &gt; But this was an incomplete definition, and I now want to translate the<br>
&gt; &gt; following C union:<br>
&gt; &gt; typedef union _XEvent {<br>
&gt; &gt;         int type;        /* must not be changed; first element */<br>
&gt; &gt;     XAnyEvent xany;<br>
&gt; &gt;     XKeyEvent xkey;<br>
&gt; &gt;     // ... the rest for later<br>
&gt; &gt; } XEvent;<br>
&gt; &gt;<br>
&gt; &gt; I searched the collects directory, but I see only a single and too simple<br>
&gt; &gt; _union use, so I&#39;m not sure how to use it.<br>
&gt; &gt; I guessed the following:<br>
&gt; &gt;   (define _XEvent<br>
&gt; &gt;     (_union EventType ; type<br>
&gt; &gt;             _XAnyEvent ; xany<br>
&gt; &gt;             _XKeyEvent ; xkey<br>
&gt; &gt;             ; etc.<br>
&gt; &gt;             ))<br>
&gt; &gt;   (define (XEvent-type ev) (union-ref ev 0))<br>
&gt; &gt;   (define (XEvent-xany ev) (union-ref ev 1))<br>
&gt; &gt;   (define (XEvent-xkey ev) (union-ref ev 2))<br>
&gt; &gt;<br>
&gt; &gt; However, now I don&#39;t use define-cstruct anymore (it would not work with<br>
&gt; &gt; _union, would it?), so I don&#39;t have all the -tag, -pointer, etc. bindings,<br>
&gt; &gt; which I need.<br>
&gt; &gt;<br>
&gt; &gt; What should I do ?<br>
&gt; &gt;<br>
&gt; &gt; Thanks,<br>
&gt; &gt; Laurent<br>
&gt; &gt;<br>
&gt; &gt;<br>
</div></div>&gt; ____________________<br>
&gt;   Racket Users list:<br>
&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div><br>