diff --git a/lisp/main.lisp b/lisp/main.lisp index e393cce..59d42b9 100644 --- a/lisp/main.lisp +++ b/lisp/main.lisp @@ -4,10 +4,6 @@ (declare (ignore seat)) (log-string :trace "cursor callback called")) -(cffi:defcallback output-callback :void ((seat (:pointer (:struct hrt-output)))) - (declare (ignore seat)) - (log-string :trace "output change callback called")) - (cffi:defcallback keyboard-callback :bool ((seat (:pointer (:struct hrt-seat))) (info (:pointer (:struct hrt-keypress-info)))) @@ -46,8 +42,8 @@ (view-callbacks '(:struct hrt-view-callbacks)) (server '(:struct hrt-server))) (init-callback-struct output-callbacks (:struct hrt-output-callbacks) - (output-added output-callback) - (output-removed output-callback)) + (output-added handle-new-output) + (output-removed handle-output-removed)) (init-callback-struct seat-callbacks (:struct hrt-seat-callbacks) (button-event cursor-callback) (wheel-event cursor-callback) diff --git a/lisp/output.lisp b/lisp/output.lisp new file mode 100644 index 0000000..38e7cd7 --- /dev/null +++ b/lisp/output.lisp @@ -0,0 +1,13 @@ +(in-package #:mahogany) + +(defstruct (mahogany-output (:constructor make-mahogany-output (hrt-output))) + (hrt-output cffi:null-pointer :type cffi:foreign-pointer :read-only t)) + +(cffi:defcallback handle-new-output :void ((output (:pointer (:struct hrt-output)))) + (log-string :trace "New output added") + (vector-push-extend (make-mahogany-output output) (mahogany-state-outputs *compositor-state*))) + +(cffi:defcallback handle-output-removed :void ((output (:pointer (:struct hrt-output)))) + (log-string :trace "Output removed") + (with-accessors ((outputs mahogany-state-outputs)) *compositor-state* + (setf outputs (delete output outputs :key #'mahogany-output-hrt-output)))) diff --git a/lisp/state.lisp b/lisp/state.lisp index 90df2e3..698f2f7 100644 --- a/lisp/state.lisp +++ b/lisp/state.lisp @@ -10,6 +10,12 @@ (keybindings :type list :initform nil :reader mahogany-state-keybindings) + (outputs :type vector + :initform (make-array 0 + :element-type 'mahogany-output + :adjustable t + :fill-pointer t) + :accessor mahogany-state-outputs) (views :type list :initform nil :reader mahogany-state-views))) diff --git a/mahogany.asd b/mahogany.asd index 896889f..3841134 100644 --- a/mahogany.asd +++ b/mahogany.asd @@ -40,6 +40,7 @@ (:file "frame" :depends-on ("tree-interface")) (:file "view" :depends-on ("tree-interface")))) (:file "state" :depends-on ("package")) + (:file "output" :depends-on ("package" "bindings")) (:file "view" :depends-on ("package" "bindings")) (:file "input" :depends-on ("state" "keyboard")) (:file "globals" :depends-on ("state" "system"))