guile-gtk-general
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: guile-clutter - prelim work - patch 1,3,4 out of 4


From: joakim
Subject: Re: guile-clutter - prelim work - patch 1,3,4 out of 4
Date: Sat, 09 Jun 2012 00:06:52 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1.50 (gnu/linux)

David Pirotte <address@hidden> writes:

>> > I read this just now, sorry!
>> 
>> Hey it's OK by me, I got to do some Guile-Clutter hacking at work due to
>> your absence :-))
>
> Ha ha, yes nice work Andy, thanks
>
>       Hey, joakim, did you get to play with the latest release ?
>
> A beer to the first of you guys telling me why in the attached clutter/cairo 
> minimal
> example the bouncer does not 'show' and moves on click ...

Cool, I'll have a look!  I havent tested the release yet, but I intend
to use it for my game Matangle:

https://github.com/jave/matangle

it's currently an old school implementation, plain C wrappers for the
Clutter functions I use.

>
> Cheers,
> David
>
>
> #! /bin/sh
> # -*- scheme -*-
> exec guile -e main -s $0 "$@"
> !#
> ;; guile-gnome
> ;; Copyright (C) 2008, 2012 Free Software Foundation, Inc.
>
> ;; This program 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 of   
> ;; the License, or (at your option) any later version.              
> ;;                                                                  
> ;; This program 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 program; if not, contact:
> ;;
> ;; Free Software Foundation           Voice:  +1-617-542-5942
> ;; 59 Temple Place - Suite 330        Fax:    +1-617-542-2652
> ;; Boston, MA  02111-1307,  USA       address@hidden
>
>
> (use-modules (ice-9 receive)
>            (system foreign)
>            (gnome-2)
>              (oop goops)
>            (cairo)
>              (gnome gobject)
>              (gnome glib)
>              (gnome clutter))
>
> (define pi (acos -1))
>
> (define libguile-gnome-gobject-2 (dynamic-link "libguile-gnome-gobject-2"))
> (define libguile-cairo (dynamic-link "libguile-cairo"))
>
> (define scm-c-gvalue-peek-boxed
>   (pointer->procedure 
>    '*
>    (dynamic-func "scm_c_gvalue_peek_boxed" libguile-gnome-gobject-2)
>    (list '*)))
>
> (define scm-from-cairo
>   (pointer->procedure 
>    '*
>    (dynamic-func "scm_from_cairo" libguile-cairo)
>    (list '*)))
>
> (define (fix-cairo x)
>   (pointer->scm (scm-from-cairo (scm-c-gvalue-peek-boxed (scm->pointer x)))))
>
> (define (get-colour name)
>   (or (clutter-color-from-string name)
>       (begin
>       (pk "Warning! undefined color " name)
>       '(#xff #xcc #xcc #xdd))))
>
> (define (prep-stage w h bg title loop)
>   (let ((stage  (clutter-stage-new)))
>     (set-background-color stage bg)
>     (set-size stage w h)
>     (set-title stage title)
>     (connect stage
>            'delete-event
>            (lambda (. args)
>              (g-main-loop-quit loop)
>              #t)) ;; stops the event to be propagated
>     stage))
>
> (define (draw-bouncer cairo-t cairo-cbf) ;; cairo-context-before-fix
>   (clear cairo-t)
>   (receive (w h)
>       (clutter-cairo-texture-get-surface-size cairo-t)
>     (let* ((cairo-c (fix-cairo cairo-cbf))
>          (radius (max w h))
>          (radius/2 (/ radius 2))
>          (dummy (cairo-arc cairo-c radius/2 radius/2 radius/2 0 (* 2 pi)))
>          (pattern (cairo-pattern-create-radial radius/2 radius/2 0 radius 
> radius radius))
>          (color (get-colour "Bisque4"))
>          (red (/ (car color) 255))
>          (green (/ (cadr color) 255))
>          (blue (/ (caddr color) 255))
>          (alpha (/ (cadddr color) 255)))
>       ;; (pk w h radius)
>       (cairo-pattern-add-color-stop-rgba pattern 0 red green blue alpha)
>       (cairo-pattern-add-color-stop-rgba pattern 0.85 red green blue 0.25)
>       ;; (cairo-set-source-rgba cairo-c red green blue alpha)
>       (cairo-set-source cairo-c pattern)
>       (cairo-fill-preserve cairo-c))))
>
> (define (make-bouncer w h x y stage)
>   (let ((b (clutter-cairo-texture-new w h)))
>     (connect b
>            'draw
>            (lambda (cairo-t cairo-c)
>              (pk "drawing the bouncer" cairo-t cairo-c)
>              (draw-bouncer cairo-t cairo-c)
>              #t)) ;; stops the event to be propagated
>     (set-name b "bouncer")
>     (set-size b w h) ;; c code does that, but is it not done above ?
>     (set-anchor-point b (/ w 2) (/ h 2))
>     (set-position b x y)
>     (set-reactive b #t)
>     (add-child stage b)
>     (invalidate b) ;; <- drawing the bouncer immediately
>     b))
>
> (define (main args)
>   (let* ((loop (g-main-loop-new))
>        (bg '(#x3c #x3c #x3c #xdd))
>        (sw 600)
>        (sh 400)
>        (stage (prep-stage sw sh bg "Bouncer" loop))
>        (bouncer (make-bouncer 75 75 200 200 stage)))
>     (connect stage
>            'button-press-event
>            (lambda (s e) 
>              (receive (x y)
>                  (get-coords e)
>                ;; (pk "button pressed @ x y: " x y)
>                (save-easing-state bouncer)
>                (set-position bouncer x y)
>                (restore-easing-state bouncer))
>              #t)) ;; stops the event to be propagated
>     (show stage)
>     (g-main-loop-run loop)
>     (exit 0)))

-- 
Joakim Verona



reply via email to

[Prev in Thread] Current Thread [Next in Thread]