[Larceny-users] XQueryTree
    Eduardo Cavazos 
    wayo.cavazos at gmail.com
       
    Wed Mar 11 20:33:51 EDT 2009
    
    
  
Hello,
XQueryTree is a function from xlib:
extern Status XQueryTree(
     Display*		/* display */,
     Window		/* w */,
     Window*		/* root_return */,
     Window*		/* parent_return */,
     Window**		/* children_return */,
     unsigned int*	/* nchildren_return */
);
This is how I'm pulling it into Larceny (using a 'c-function' macro I'm 
using for cross-Scheme compatability):
   (c-function Status XQueryTree (void* ulong boxed boxed boxed boxed))
Here's an example of how I'm able to call it:
   (define root-return      (make-bytevector 4))
   (define parent-return    (make-bytevector 4))
   (define children-return  (make-bytevector 4))
   (define nchildren-return (make-bytevector 4))
   (XQueryTree dpy root
               root-return
               parent-return
               children-return
               nchildren-return)
Getting at root-return, parent-return, and nchildren-return is simple 
since they're passed in as bytevectors. So for example this returns the 
root window:
   (bytevector-u32-native-ref root-return 0)
So now for 'children-return'. Ideally, we'd end up with the array of 
children as a Scheme bytevector.
If you do:
   (bytevector-u32-native-ref children-return 0)
you get back an integer which is the pointer to the memory that xlib 
allocated for us (may be freed with XFree).
The best I was able to come up with for accessing elements of that 
memory is:
   (%peek32u (+ addr (* 0 4))) ; first element
   (%peek32u (+ addr (* 1 4))) ; second element
   (%peek32u (+ addr (* 2 4))) ; third element
   ...
My question is, is this the best way given the Larceny FFI?
Another question; is there a way to create a Scheme bytevector given an 
address of some C array and the size of the array?
For comparison, Ypsilon offers 'make-bytevector-mapping':
http://www.littlewing.co.jp/ypsilon/doc-draft/libref.ypsilon.ffi.html#make-bytevector-mapping
Thanks for any suggestions you might have!
Even if something like 'make-bytevector-mapping' doesn't exist for 
Larceny, I should be able to cook something up that will copy the 
elements into a fresh bytearray. That would be good anyway since then 
the memory xlib allocates can be freed via XFree.
Ed
    
    
More information about the Larceny-users
mailing list