/ example / input.scm
input.scm
  1  (use-modules
  2   (wlroots types keyboard)
  3   (wayland server protocol wayland)
  4   (wayland server display)
  5   (wayland server listener)
  6   (wayland signal)
  7   (xkbcommon xkbcommon)
  8   (util572 color)
  9   (oop goops)
 10   (wlroots))
 11  
 12  ;;; this a simple example, pass ESC exit, other key will toggle background
 13  ;;; color.
 14  
 15  (define w-display (wl-display-create))
 16  (define w-backend (wlr-backend-autocreate w-display))
 17  (define w-renderer (wlr-renderer-autocreate w-backend))
 18  (define w-allocator (wlr-allocator-autocreate w-backend w-renderer))
 19  (define w-seat (wlr-seat-create w-display "seat0"))
 20  
 21  (define black? (make-parameter #t))
 22  
 23  (define output-frame-listener
 24    (make-wl-listener
 25     (lambda (listener output)
 26       (wlr-output-attach-render output #f)
 27       (call-with-renderer
 28        w-renderer (.width output) (.height output)
 29        (lambda (renderer . _)
 30          (wlr-renderer-clear
 31           renderer (make-rgba-color (if (black?) "#0000" "#ffff")))))
 32       (wlr-output-commit output))))
 33  
 34  (define w-backend-new-output-listener
 35    (make-wl-listener
 36     (lambda (listener output)
 37       (display "I get new output!\n")
 38       (wlr-output-init-render
 39        output w-allocator w-renderer)
 40       (wl-signal-add (get-event-signal output 'frame) output-frame-listener)
 41       (wlr-output-commit output))))
 42  
 43  (define (add-seat-capabilitie seat o)
 44    (wlr-seat-set-capabilities seat
 45                               (logior (.capabilities seat)
 46                                       (bs:enum->integer
 47                                        %wl-seat-capability-enum o))))
 48  
 49  
 50  
 51  (define (create-keyboard device)
 52    (display "new keyboard create!\n")
 53    (let* ((wl-kb (wlr-keyboard-from-input-device device))
 54           (context (xkb-context-new XKB_CONTEXT_NO_FLAGS))
 55           (keymap (xkb-keymap-new
 56                    context
 57                    #:flags XKB_KEYMAP_COMPILE_NO_FLAGS)))
 58      (wlr-keyboard-set-keymap wl-kb keymap)
 59      (wlr-keyboard-set-repeat-info wl-kb 10 600)
 60      (wl-signal-add (get-event-signal wl-kb 'modifiers)
 61                     (make-wl-listener
 62                      (lambda (listener data)
 63                        (let* ((wlr-keyboard (wrap-wlr-keyboard data))
 64                               (modifiers(.modifiers wlr-keyboard)))
 65                          (wlr-seat-set-keyboard
 66                           w-seat wl-kb)
 67                          (wlr-seat-keyboard-notify-modifiers
 68                           w-seat modifiers)
 69                          (pk 'new-modifiers modifiers)))))
 70      (wl-signal-add (get-event-signal wl-kb 'key)
 71                     (make-wl-listener
 72                      (lambda (listener data)
 73                        (let* ((event (wrap-wlr-keyboard-key-event data)))
 74                          (if (= (.keycode event) 1)
 75                              (wl-display-terminate w-display)
 76                              (begin (wlr-seat-set-keyboard w-seat wl-kb)
 77                                     (wlr-seat-keyboard-notify-key
 78                                      w-seat
 79                                      (.time-msec event)
 80                                      (.keycode event)
 81                                      (if (eq? (.state event)
 82                                               WL_KEYBOARD_KEY_STATE_PRESSED)
 83                                          1 0))
 84                                     (when (eq? (.state event)
 85                                                WL_KEYBOARD_KEY_STATE_PRESSED)
 86                                       (black? (not (black?))))
 87                                     (pk 'new-key (.keycode event))))))))))
 88  
 89  (define w-backend-new-input-listener
 90    (make-wl-listener
 91     (lambda (listener device)
 92       (display "I get new input device!\n")
 93       (case (.type device)
 94         ((WLR_INPUT_DEVICE_KEYBOARD)
 95          (create-keyboard device)
 96          (add-seat-capabilitie
 97           w-seat
 98           WL_SEAT_CAPABILITY_KEYBOARD))))))
 99  
100  (wlr-renderer-init-wl-display w-renderer w-display)
101  
102  (wl-signal-add (get-event-signal w-backend 'new-output)
103                 w-backend-new-output-listener)
104  
105  (wl-signal-add (get-event-signal w-backend 'new-input)
106                 w-backend-new-input-listener)
107  
108  (wlr-backend-start w-backend)
109  
110  (setenv "WAYLAND_DISPLAY" (wl-display-add-socket-auto w-display))
111  
112  (wl-display-run w-display)
113  
114  (wl-display-destroy-clients w-display)
115  (wl-display-destroy w-display)