Skip to content

Commit c76fe19

Browse files
committed
extensions: randr: fix RR-GET-OUTPUT-INFO indices
The CRTC-START index was incorrect, which caused RR-GET-OUTPUT-INFO to return bogus CRTCs, modes, clones, and name. Additionally, document the function's multiple return values and declaim its type. The latter required adding some types and adjusting some existing types and constants. Finally, wrap some overlong lines, remove some superfluous blank lines, and reindent RR-GET-OUTPUT-INFO and format its comments better.
1 parent bfed9f0 commit c76fe19

File tree

1 file changed

+85
-38
lines changed

1 file changed

+85
-38
lines changed

extensions/randr.lisp

Lines changed: 85 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,16 @@
166166

167167

168168
(eval-when (:compile-toplevel :load-toplevel :execute)
169-
(defconstant +rr-config-status+ '#(:success :invalid-config-time :invalid-time :failed))
170-
(defconstant +rr-connection+ '#(:connected :disconnected :unknown-connection)))
169+
(defconstant +rr-config-status-vector+
170+
'#(:success :invalid-config-time :invalid-time :failed))
171+
(defconstant +connection-vector+
172+
'#(:connected :disconnected :unknown-connection)))
173+
174+
(deftype rr-config-status ()
175+
'(member :success :invalid-config-time :invalid-time :failed))
176+
177+
(deftype connection ()
178+
'(member :connected :disconnected :unknown-connection))
171179

172180
;;; mask-vectors and types
173181

@@ -214,10 +222,19 @@
214222

215223
;; temporarily here since not in xrender.lisp
216224

217-
218225
(eval-when (:compile-toplevel :load-toplevel :execute)
219-
(defconstant +render-subpixel-order+
220-
'#(:unknown :horizontal-RGB :horizontal-BGR :vertical-RGB :vertical-BGR :none)))
226+
(defconstant +render-subpixel-order-vector+
227+
'#(:unknown
228+
:horizontal-RGB :horizontal-BGR
229+
:vertical-RGB :vertical-BGR
230+
:none)))
231+
232+
(deftype render-subpixel-order ()
233+
'(member
234+
:unknown
235+
:horizontal-RGB :horizontal-BGR
236+
:vertical-RGB :vertical-BGR
237+
:none))
221238

222239
;; mask encode-decode functions
223240

@@ -259,8 +276,8 @@
259276

260277
(deftype size-id () 'card16)
261278
(deftype rr-mode () '(or null resource-id))
279+
(deftype crtc () 'resource-id)
262280
(deftype output () 'resource-id)
263-
(deftype connection () '(or +connected+ +disconnected+ +unknown-connection+))
264281

265282
;; structs
266283

@@ -467,11 +484,11 @@
467484
(card16 refresh)
468485
(pad16))
469486
(values
470-
(member8-vector-get 1 +rr-config-status+)
487+
(member8-vector-get 1 +rr-config-status-vector+)
471488
(card32-get 8) ;; timestamp
472489
(card32-get 12) ;; config timestamp
473490
(window-get 16) ;; root window
474-
(member16-vector-get 20 +render-subpixel-order+) ;; sub pixel order
491+
(member16-vector-get 20 +render-subpixel-order-vector+)
475492
))))
476493

477494
(defun rr-select-input (window enable)
@@ -572,37 +589,67 @@
572589
(string-get name-bytes name-start))
573590
))))
574591

575-
576-
577-
(defun rr-get-output-info (display output config-timestamp &optional (result-type 'list))
578-
"FIXME: indexes might be off, name not decoded properly"
579-
(with-buffer-request-and-reply (display (randr-opcode display) nil :sizes (8 16 32))
592+
(declaim (ftype (function (display output timestamp &optional t)
593+
(values rr-config-status
594+
timestamp
595+
crtc
596+
card32
597+
card32
598+
connection
599+
render-subpixel-order
600+
(clx-sequence crtc)
601+
card16
602+
(clx-sequence rr-mode)
603+
(clx-sequence output)
604+
string
605+
&optional))
606+
rr-get-output-info))
607+
(defun rr-get-output-info (display output config-timestamp
608+
&optional (result-type 'list))
609+
"Execute the RRGetOutputInfo request and return its result as multiple
610+
values consisting of:
611+
612+
1. Configuration status
613+
2. Timestamp
614+
3. Current connected CRTC
615+
4. Width in millimeters
616+
5. Height in millimeters
617+
6. Connection
618+
7. Subpixel order
619+
8. Sequence of CRTCs
620+
9. Number of preferred modes
621+
10. Sequence of modes
622+
11. Sequence of clones
623+
12. Name"
624+
(with-buffer-request-and-reply (display (randr-opcode display) nil
625+
:sizes (8 16 32))
580626
((data +rr-getoutputinfo+)
581627
(card32 output)
582628
(card32 config-timestamp))
583629
(let* ((num-crtcs (card16-get 26))
584-
(num-modes (card16-get 28))
585-
(num-clones (card16-get 32))
586-
(name-length (card16-get 34))
587-
(crtc-start 26)
588-
(mode-start (index+ crtc-start (index* num-crtcs 4)))
589-
(clone-start (index+ mode-start (index* num-modes 4)))
590-
(name-start (index+ clone-start (index* num-clones 4))))
630+
(num-modes (card16-get 28))
631+
(num-clones (card16-get 32))
632+
(name-length (card16-get 34))
633+
(crtc-start 36)
634+
(mode-start (index+ crtc-start (index* num-crtcs 4)))
635+
(clone-start (index+ mode-start (index* num-modes 4)))
636+
(name-start (index+ clone-start (index* num-clones 4))))
591637
(values
592-
(member8-vector-get 1 +rr-config-status+)
593-
(card32-get 8) ; timestamp
594-
(card32-get 12) ; current connected crtc
595-
(card32-get 16) ; width in mm
596-
(card32-get 20) ; height in mm
597-
(member8-vector-get 24 +rr-connection+)
598-
(member8-vector-get 25 +render-subpixel-order+) ; sub-pixel-order
599-
(sequence-get :result-type result-type :length num-crtcs :index 26)
600-
(card16-get 30)
601-
(sequence-get :result-type result-type :length num-modes :index mode-start)
602-
(sequence-get :result-type result-type :length num-clones :index clone-start)
603-
;(string-get name-length name-start )
604-
(sequence-get :result-type 'string :format card16 :length name-length :index name-start :transform #'code-char))
605-
)))
638+
(member8-vector-get 1 +rr-config-status-vector+)
639+
(card32-get 8) ; Timestamp
640+
(card32-get 12) ; Current connected CRTC
641+
(card32-get 16) ; Width in millimeters
642+
(card32-get 20) ; Height in millimeters
643+
(member8-vector-get 24 +connection-vector+)
644+
(member8-vector-get 25 +render-subpixel-order-vector+)
645+
(sequence-get :result-type result-type :length num-crtcs
646+
:index crtc-start)
647+
(card16-get 30) ; Number of preferred modes
648+
(sequence-get :result-type result-type :length num-modes
649+
:index mode-start)
650+
(sequence-get :result-type result-type :length num-clones
651+
:index clone-start)
652+
(string-get name-length name-start)))))
606653

607654
(defun rr-list-output-properties (display output &optional (result-type 'list))
608655
"Returns a list of atom properties for given display. ?keep it simple and return id's or atom-names?"
@@ -754,7 +801,7 @@
754801
(pos-outputs (card16-get 30))
755802
(pos-start (index+ +replysize+ (index* num-outputs 4))))
756803
(values
757-
(member8-vector-get 1 +rr-config-status+)
804+
(member8-vector-get 1 +rr-config-status-vector+)
758805
(card32-get 8) ; timestamp
759806
(int16-get 12) ; x
760807
(int16-get 14) ; y
@@ -782,7 +829,7 @@
782829
(pad16)
783830
((sequence :format card32) seq))
784831
(values
785-
(member8-vector-get 1 +rr-config-status+)
832+
(member8-vector-get 1 +rr-config-status-vector+)
786833
(card32-get 8) ; new timestamp
787834
))))
788835

@@ -908,7 +955,7 @@
908955
;; ((data +rr-getpanning+)
909956
;; (card32 crtc))
910957
;; (values
911-
;; (member8-vector-get 1 +rr-config-status+)
958+
;; (member8-vector-get 1 +rr-config-status-vector+)
912959
;; (card32-get 8) ; timestamp
913960
;; (rr-panning-get 12)
914961
;; ;(sequence-get :length 8 :format card16 :index 12 :result-type result-type)
@@ -928,7 +975,7 @@
928975
;; (rr-panning rr-panning))
929976

930977
;; (values
931-
;; (member8-vector-get 1 +rr-config-status+)
978+
;; (member8-vector-get 1 +rr-config-status-vector+)
932979
;; ; (card32-get 8) ; new timestamp
933980
;; )))
934981

0 commit comments

Comments
 (0)