On Sat, Aug 21, 2010 at 06:51:35PM +0200, Christopher Roy Bratusek wrote:
> does anyone of you have a clue on how to use rep.ffi?
You can look at attached "examples".  It was written by Sergey
Bolshakov, the person who wrote patch for rep.ffi.

-- 
Regards,    --
Sir Raorn.   --- http://thousandsofhate.blogspot.com/
#| util.jl -- FFI helpers

  Author: Sergey Bolshakov <[email protected]>
  Version: $Id: util.jl,v 1.5 2006/07/16 19:40:32 me Exp $

  This file is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2, or (at your option)
  any later version.

  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this file.  If not, write to the Free Software
  Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

|#

(define-structure rep.ffi.util

    (export ffi-bind
            ffi-type-enum)

    (open rep
          rep.ffi
          rep.data.tables)

  (define (ffi-bind soname tab)
    (let ((handle (ffi-load-library soname))
          (symtab (make-table symbol-hash eq-hash))
          (ifacetab (make-table symbol-hash eq-hash)))
      (mapc
       (lambda (elt)
         (apply
          (lambda (key dlsym ret . args)
            (table-set symtab key (ffi-lookup-symbol handle dlsym))
            (table-set ifacetab key (ffi-interface ret args)))
          elt))
       tab)
      (lambda (key . args)
        (and
         (table-bound-p symtab key)
         (ffi-apply (table-ref ifacetab key)
                    (table-ref symtab key) args)))))

  (define (enump sym enum-alist)
    (and (symbolp sym)
         (assq sym enum-alist)))

  (define (enum->sym num enum-alist)
    (let ((p (rassq num enum-alist)))
      (if p (car p)
        (signal 'bad-arg `(,num)))))

  (define (sym->enum sym enum-alist)
    (let ((p (assq sym enum-alist)))
      (if p (cdr p)
        (signal 'bad-arg `(,sym)))))
  
  (define (ffi-type-enum enum-alist)
    (ffi-type
     ffi-type-sint32
     (lambda (x) (enump x enum-alist))
     (lambda (x) (sym->enum x enum-alist))
     (lambda (x) (enum->sym x enum-alist))))

  )
#| xosd.jl -- Bindings to libxosd using rep.ffi

  Author: Sergey Bolshakov <[email protected]>
  Version: $Id: xosd.jl,v 1.3 2006/07/16 15:17:32 me Exp me $

  This file is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2, or (at your option)
  any later version.

  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this file.  If not, write to the Free Software
  Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

|#

(define-structure rep.ffi.xosd

    (export xosd)

    (open rep
          rep.ffi
          rep.ffi.util
          rep.data.objects)

  (defconst xosd-dl-soname "libxosd.so.2"
    "xosd library's soname.")
  
  (define handle
    (ffi-bind
     xosd-dl-soname
     `((create "xosd_create"                                    ; xosd 
*xosd_create(int number_lines)
               ,ffi-type-pointer ,ffi-type-sint32)
       (destroy "xosd_destroy"                                  ; int 
xosd_destroy(xosd * osd)
                ,ffi-type-sint32 ,ffi-type-pointer)                     
       (set-bar-len! "xosd_set_bar_length"                      ; int 
xosd_set_bar_length(xosd * osd, int length)
                     ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (display-string "xosd_display"                           ; int 
xosd_display(xosd * osd, int line, xosd_command command, ...)
                       ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32
                       ,(ffi-type-enum '((string . 1) (printf . 2)))
                       ,ffi-type-pointer)
       (display-bar "xosd_display"                              ; int 
xosd_display(xosd * osd, int line, xosd_command command, ...)
                    ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32
                    ,(ffi-type-enum '((percentage . 0) (slider . 3)))
                    ,ffi-type-sint32)
       (onscreenp "xosd_is_onscreen"                            ; int 
xosd_is_onscreen(xosd * osd)
                  ,ffi-type-sint32 ,ffi-type-pointer)
       (wait "xosd_wait_until_no_display"                       ; int 
xosd_wait_until_no_display(xosd * osd)
             ,ffi-type-sint32 ,ffi-type-pointer)
       (hide "xosd_hide"                                        ; int 
xosd_hide(xosd * osd)
             ,ffi-type-sint32 ,ffi-type-pointer)
       (show "xosd_show"                                        ; int 
xosd_show(xosd * osd)
             ,ffi-type-sint32 ,ffi-type-pointer)
       (set-pos! "xosd_set_pos"                                 ; int 
xosd_set_pos(xosd * osd, xosd_pos pos)
                 ,ffi-type-sint32 ,ffi-type-pointer
                 ,(ffi-type-enum '((top . 0) (bottom . 1) (middle . 2))))
       (set-align! "xosd_set_align"                             ; int 
xosd_set_align(xosd * osd, xosd_align align)
                   ,ffi-type-sint32 ,ffi-type-pointer 
                   ,(ffi-type-enum '((left . 0) (center . 1) (right . 2))))
       (set-shadow-offset! "xosd_set_shadow_offset"             ; int 
xosd_set_shadow_offset(xosd * osd, int shadow_offset)
                           ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (set-outline-offset! "xosd_set_outline"                  ; int 
xosd_set_outline_offset(xosd * osd, int outline_offset)
                            ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (set-outline-colour! "xosd_set_outline_colour"           ; int 
xosd_set_outline_colour(xosd * osd, const char *colour)
                            ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (set-shadow-colour! "xosd_set_shadow_colour"             ; int 
xosd_set_shadow_colour(xosd * osd, const char *colour)
                           ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (set-horiz-offset! "xosd_set_horizontal_offset"          ; int 
xosd_set_horizontal_offset(xosd * osd, int offset)
                          ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (set-vert-offset! "xosd_set_vertical_offset"             ; int 
xosd_set_vertical_offset(xosd * osd, int offset)
                         ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (set-timeout! "xosd_set_timeout"                         ; int 
xosd_set_timeout(xosd * osd, int timeout)
                     ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (set-colour! "xosd_set_colour"                           ; int 
xosd_set_colour(xosd * osd, const char *colour)
                    ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-pointer)
       (set-font! "xosd_set_font"                               ; int 
xosd_set_font(xosd * osd, const char *font)
                  ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-pointer)
       (colour "xosd_get_colour"                                ; int 
xosd_get_colour(xosd * osd, int *red, int *green, int *blue)
               ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-pointer
               ,ffi-type-pointer ,ffi-type-pointer)
       (scroll "xosd_scroll"                                    ; int 
xosd_scroll(xosd * osd, int lines)
               ,ffi-type-sint32 ,ffi-type-pointer ,ffi-type-sint32)
       (lines "xosd_get_number_lines"                           ; int 
xosd_get_number_lines(xosd * osd)
              ,ffi-type-sint32 ,ffi-type-pointer))))
  
  (define (xosd #!key lines position align font colour timeout voffset hoffset
                shadow-colour shadow-offset outline-colour outline-offset)
    (let ((o (handle 'create (or lines 1))))
      (and align (handle 'set-align! o align))
      (and position (handle 'set-pos! o position))
      (and font (handle 'set-font! o font))
      (and colour (handle 'set-colour! o colour))
      (and timeout (handle 'set-timeout! o timeout))
      (and voffset (handle 'set-vert-offset! o voffset))
      (and hoffset (handle 'set-horiz-offset! o hoffset))
      (and shadow-colour (handle 'set-shadow-colour! o shadow-colour))
      (and shadow-offset (handle 'set-shadow-offset! o shadow-offset))
      (and outline-colour (handle 'set-outline-colour! o outline-colour))
      (and outline-offset (handle 'set-outline-offset! o outline-offset))
      (object 
       nil
       ((display type . args)
        (case type
          ((string format) (apply handle 'display-string o 0 type args))
          ((percentage slider) (apply handle 'display-bar o 0 type args))))
       ((destroy) (handle 'destroy o))
       ((hide) (handle 'hide o))
       ((show) (handle 'show o))
       ((scroll) (handle 'scroll o))
       ((wait) (handle 'wait o))
       ((onscreenp) (handle 'onscreenp o)))))
  )

;; local variables:
;; comment-column: 64
;; end:

Attachment: signature.asc
Description: Digital signature

Reply via email to