frame.scm 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. ;; Frames: Fenster mit Rahmen drum
  2. ;; ,open threads rendezvous rendezvous-channels rendezvous-async-channels \
  3. ;; toy-geometry toy-display-system toy-window-system define-record-types
  4. (define-record-type frame :frame
  5. (really-make-frame widget-env highlight-channel)
  6. frame?
  7. (widget-env frame-widget-env)
  8. (highlight-channel frame-highlight-channel))
  9. (define frame-border 8)
  10. (define (make-frame realize widget-env)
  11. (let* ((frame-bitmap (widget-env-bitmap widget-env))
  12. (outer-rectangle (bitmap-rectangle frame-bitmap))
  13. (frame-rectangle
  14. (make-rectangle 0 0
  15. (- (rectangle-width outer-rectangle) 1)
  16. (- (rectangle-height outer-rectangle) 1)))
  17. (highlight-rectangle
  18. (make-rectangle 1 1
  19. (- (rectangle-width outer-rectangle) 3)
  20. (- (rectangle-height outer-rectangle) 3)))
  21. (child-rectangle
  22. (make-rectangle frame-border frame-border
  23. (- (rectangle-width outer-rectangle)
  24. (* 2 frame-border))
  25. (- (rectangle-height outer-rectangle)
  26. (* 2 frame-border))))
  27. (child-mouse-channel (make-channel))
  28. (child-widget-env
  29. (make-widget-env (make-bitmap frame-bitmap child-rectangle)
  30. child-mouse-channel
  31. (widget-env-keyboard-channel widget-env)
  32. (widget-env-control-in-channel widget-env)
  33. (widget-env-control-out-channel widget-env)))
  34. (highlight-channel (make-channel))
  35. (draw-highlight
  36. (lambda (rator)
  37. (bitmap-draw-rectangle frame-bitmap rator highlight-rectangle)))
  38. (mouse-translation
  39. (make-point frame-border frame-border)))
  40. (bitmap-clear frame-bitmap)
  41. (bitmap-draw-rectangle frame-bitmap 'set frame-rectangle)
  42. (spawn
  43. (lambda ()
  44. (let loop ()
  45. (send child-mouse-channel
  46. (mouse-message-translate
  47. mouse-translation
  48. (receive (widget-env-mouse-channel widget-env))))
  49. (loop))))
  50. (spawn
  51. (lambda ()
  52. (let loop ((highlight? #f))
  53. (let ((new-highlight? (receive highlight-channel)))
  54. (cond
  55. ((and highlight? (not new-highlight?))
  56. (draw-highlight 'clear))
  57. ((and (not highlight?) new-highlight?)
  58. (draw-highlight 'copy)))
  59. (loop new-highlight?)))))
  60. (values (really-make-frame widget-env highlight-channel)
  61. (realize child-widget-env))))
  62. (define (frame=? frame-1 frame-2)
  63. (eq? frame-1 frame-2))
  64. (define (frame-highlight! frame highlight?)
  65. (send (frame-highlight-channel frame) highlight?))
  66. ;; Test
  67. (define (test-frame-with-button)
  68. (make-frame
  69. (lambda (widget-env)
  70. (make-button "Click me!"
  71. (lambda ()
  72. (display "Click! Click!")
  73. (newline))
  74. widget-env))
  75. (make-window-system "Button/Frame Test" 320 200)))