Matthew Flatt <mfl...@cs.utah.edu> writes:

> At Tue, 26 Jul 2011 00:37:41 -0300, Diogo F. S. Ramos wrote:
>> Is there a documented way to extend the racket/gui language with widgets
>> already present in Gtk?
>
> Use the `get-client-handle' method of a `panel%' instance to get a
> GtkWidget pointer for the panel as a Gtk container. Then you can use
> the FFI to call a Gtk functions such as gtk_spin_button_new()
> and gtk_container_add().

Nice, thank you.

I'm able to add a GtkSpinButton with this method but now I'm trying to
take a step further and encapsulate the machinery.

Experimenting with different codes, I get the impression that a panel%,
using gtk_container_add(), can hold only one child. So, my idea is to
create subclasses of panel% and each of these will have a new GtkWidget
inside.

Unfortunately my new objects do not show if I add them to a panel% but
they make an appearance inside a frame%.

Below there is a code example of my proposed technique and the ninja
class (under certain weather conditions) label%, which is redundant
because of message% but illustrates my point. The object `message'
appears, but not `label'.

For the record, I'm using Racket 5.1.3.

#lang racket/gui

(require racket/class)
(require ffi/unsafe)

(define win (new frame% (label "hello, world")))
(define pan (new panel% (parent win)))
(define gtk-label-new (get-ffi-obj "gtk_label_new" #f (_fun _string -> 
_pointer)))
(define gtk-container-add (get-ffi-obj "gtk_container_add" #f (_fun _pointer 
_pointer -> _void)))
(define gtk-widget-show (get-ffi-obj "gtk_widget_show" #f (_fun _pointer -> 
_void)))

(define label%
  (class panel%
    (init parent text)
    (super-new (parent parent))
    (define ptr (gtk-label-new text))
    (gtk-container-add (send this get-client-handle) ptr)
    (gtk-widget-show ptr)))

(define label (new label%
                   (text "GtkLabel")
                   (parent pan)))
(define message (new message%
                     (label "Message")
                     (parent pan)))

(send label show #t)
(send win show #t)

-- 
Diogo F. S. Ramos
____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to