#lang racket/base
(require ffi/unsafe
         racket/class
         "../../syntax.rkt"
         "widget.rkt"
         "window.rkt"
         "utils.rkt"
         "const.rkt"
         "types.rkt")

(provide 
 (protect-out client-size-mixin))

;; ----------------------------------------

(define-signal-handler connect-size-allocate "size-allocate"
  (_fun _GtkWidget _GtkAllocation-pointer -> _gboolean)
  (lambda (gtk a)
    (let ([wx (gtk->wx gtk)])
      (when wx
        (send wx save-client-size 
              (GtkAllocation-x a)
              (GtkAllocation-y a)
              (GtkAllocation-width a)
              (GtkAllocation-height a))))
    #t))

(define (client-size-mixin %)
  (class %
    (init client-gtk)

    (connect-size-allocate client-gtk)

    (define client-x 0)
    (define client-y 0)

    (define/public (on-client-size w h) (void))

    (define client-size-key #f)

    (define/public (save-client-size x y w h)
      ;; Called in the Gtk event-loop thread
      (set! client-x x)
      (set! client-y y)
      (when client-size-key (set-box! client-size-key #f))
      (let ([key (box #t)])
        (set! client-size-key key)
        (queue-window-event this (lambda () 
                                   (when (unbox key)
                                     (internal-on-client-size w h)
                                     (on-client-size w h))))))

    (define/public (internal-on-client-size w h)
      (void))

    (define/override (get-client-delta)
      (values client-x client-y))

    (super-new)))