#lang racket/base (require racket/class racket/gui/base ffi/unsafe (only-in mred/private/wx/gtk/types _GtkWidget)) (define gtk:make-button (get-ffi-obj "gtk_button_new_with_label" #f (_fun [label : _string/utf-8] -> [button : _GtkWidget]))) (define gtk:widget-size-allocate! (get-ffi-obj "gtk_widget_size_allocate" #f (_fun (widget x y width height) :: [widget : _GtkWidget] [size : (_ptr i (_list-struct _int _int _int _int)) = (list x y width height)] -> _void))) (define gtk:widget-size-allocation (get-ffi-obj "gtk_widget_get_allocation" #f (_fun [widget : _GtkWidget] [size : (_ptr o (_list-struct _int _int _int _int))] -> _void -> (apply values size)))) (define gtk:widget-queue-draw (get-ffi-obj "gtk_widget_queue_draw" #f (_fun [widget : _GtkWidget] -> _void))) (define gtk:widget-show (get-ffi-obj "gtk_widget_show" #f (_fun [widget : _GtkWidget] -> _void))) (define gtk:container-add! (get-ffi-obj "gtk_container_add" #f (_fun [container : _GtkWidget] [widget : _GtkWidget] -> _void))) (define button-panel% (class panel% (init label) (field [button (gtk:make-button label)]) (inherit get-handle get-size) (super-new) (gtk:container-add! (get-handle) button) (define/public button-size (case-lambda [() (gtk:widget-size-allocation button)] [(x y width height) (gtk:widget-size-allocate! button x y width height)])) (define/override (on-size width height) (let-values ([(x y width0 height0) (button-size)]) (button-size x y width height))) (define/public (button-resize+redraw) (let-values ([(width height) (get-size)]) (button-size 0 0 width height) (gtk:widget-queue-draw button))) )) (define (go) (let* ([frame (new frame% [label "Test"])] [panel (new button-panel% [parent frame] [label "Hello!"])]) (send frame show #t) panel))