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

David Pirotte <[email protected]> Fri, 8 Jun 2012 18:52:09 -0300
Newsgroups gmane.lisp.guile.gtk
Message-ID <20120608185209.715615b4@rascar>
> > 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 ...

Cheers,
David

_______________________________________________
guile-gtk-general mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/guile-gtk-general
bouncer.scm (text/x-scheme, 4.2 KB)
#! /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       [email protected]


(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)))