/ modules / wayland / interface.scm
interface.scm
  1  (define-module (wayland interface)
  2    #:use-module (srfi srfi-9)
  3    #:use-module (wayland util)
  4    #:use-module (bytestructures guile)
  5    #:use-module (bytestructure-class)
  6    #:use-module (oop goops)
  7    #:use-module ((system foreign) #:select (make-pointer))
  8    #:export (%wl-message-struct
  9              %wl-interface-struct
 10              wrap-wl-message unwrap-wl-message wl-message?
 11              .name
 12              .signature
 13              .version
 14              .method-count
 15              .methods
 16              .event-count
 17              .events
 18              wrap-wl-interface unwrap-wl-interface wl-interface?
 19              %make-wl-interface
 20              %wl-interface-update-message-types))
 21  
 22  (define %wl-interface-struct
 23    (bs:struct
 24     `((name ,cstring-pointer*)
 25       (version ,int)
 26       (method-count ,int)
 27       (methods ,(bs:pointer '*))
 28       (event-count ,int)
 29       (events ,(bs:pointer '*)))))
 30  
 31  (define %wl-message-struct
 32    (bs:struct
 33     `((name ,cstring-pointer*)
 34       (signature ,cstring-pointer*)
 35       (types ,(bs:pointer %wl-interface-struct)))))
 36  
 37  (define-bytestructure-class <wl-message> ()
 38    %wl-message-struct
 39    wrap-wl-message unwrap-wl-message wl-message?
 40    (name #:accessor .name)
 41    (signature #:accessor .signature)
 42    (types #:accessor .types))
 43  
 44  (define (display-address o file)
 45    (display (number->string (object-address o) 16) file))
 46  
 47  (define-method (write (o <wl-message>) file)
 48    (let ((class (class-of o)))
 49      (begin
 50        (display "#<" file)
 51        (display (class-name class) file)
 52        (display #\space file)
 53        (display (.name o) file)
 54        (display #\space file)
 55        (write (.signature o)  file)
 56        (display #\space file)
 57        (display-address o file)
 58        (display #\> file))))
 59  
 60  (define-bytestructure-class <wl-interface> ()
 61    %wl-interface-struct
 62    wrap-wl-interface unwrap-wl-interface wl-interface?
 63    (name #:accessor .name)
 64    (version #:accessor .version)
 65    (method-count #:accessor .method-count)
 66    (methods #:accessor .methods
 67             #:allocation #:virtual
 68             #:slot-ref
 69             (lambda (o)
 70               (let* ((bs (get-bytestructure o))
 71                      (method-count (bytestructure-ref bs 'method-count)))
 72                 (if (zero? method-count)
 73                     '()
 74                     (let* ((methods (pointer->bytestructure
 75                                      (make-pointer (bytestructure-ref bs 'methods))
 76                                      (bs:vector method-count %wl-message-struct))))
 77                       (map (lambda (n) (wrap-wl-message
 78                                         (bytestructure-ref methods n)))
 79                            (iota method-count))))))
 80             #:slot-set! (const #f))
 81    (event-count #:accessor .event-count)
 82    (events #:allocation #:virtual
 83            #:slot-ref
 84            (lambda (o)
 85              (let* ((bs (get-bytestructure o))
 86                     (event-count (bytestructure-ref bs 'event-count)))
 87                (if (zero? event-count)
 88                    '()
 89                    (let* ((events (pointer->bytestructure
 90                                    (make-pointer (bytestructure-ref bs 'events))
 91                                    (bs:vector event-count %wl-message-struct))))
 92                      (map (lambda (n)
 93                             (wrap-wl-message
 94                              (bytestructure-ref events n)))
 95                           (iota event-count))))))
 96            #:slot-set! (const #f)
 97            #:accessor .events))
 98  
 99  (define-method (write (o <wl-interface>) file)
100    (let ((class (class-of o)))
101      (begin
102        (display "#<" file)
103        (display (class-name class) file)
104        (display #\space file)
105        (display (.name o) file)
106        (display #\space file)
107        (display #\v file)
108        (display (.version o) file)
109        (display #\space file)
110        (display-address o file)
111        (display #\> file))))
112  
113  (eval-when (expand load eval)
114    (load-extension "libguile-wayland" "scm_init_wl_interface"))