;; A visual information is an alist with keys of the type
;; visual-info. The corresponding values have the following meaning:
;; screen-number  the screen this visual belongs to
;; depth          the depth of the screen
;; class          one of 'direct-color 'gray-scale 'pseudo-color 
;;                'static-color 'static-gray 'true-color
;; red-mask       these masks are used for direct-color and true-color
;; green-mask     to specify which bits of the pixel value specify
;; blue-mask      red, green or blue values.
;; colormap-size  tells how many different pixel value are valid
;; bits-per-rgb   specifies how many bits in each of the red, green 
;;                and blue values in a colorcell are used to drive 
;;                the rgb gun in the screen.
;; visual         this value can be passed to other functions, e.g. 
;;                create-window.
;; visual-id      this value is not normally needed by applications.

(define-enumerated-type visual-info :visual-info
  visual-info?
  visual-infos
  visual-info-name
  visual-info-index
  (visual visual-id screen depth class red-mask green-mask blue-mask 
   colormap-size bits-per-rgp))

(define visual-info-alist->vector
  (make-enum-alist->vector
   visual-infos visual-info-index
   (lambda (i)
     (lambda (x) x))))

(define (vector->visual-info-alist vector)
  (vector-set! vector 0 (make-visual (vector-ref vector 0)))
  (map cons
       (vector->list visual-infos)
       (vector->list vector)))

;; returns a list of visual informations of visuals that match the
;; template given by visual-info-alist. the 'visual element is not
;; allowed here. See XGetVisualInfo.

(define (get-visual-info display visual-info-alist)
  (let ((res (%get-visual-info (display-Xdisplay display)
			       (visual-info-alist->vector visual-info-alist))))
    (map vector->visual-info-alist
	 (vector->list res))))

(import-lambda-definition %get-visual-info (Xdisplay v)
  "scx_Get_Visual_Info")

;; visual-id returns the id of a given visual.

(define (visual-id visual)
  (%visual-id (visual-Xvisual visual)))

(import-lambda-definition %visual-id (Xvisual)
  "scx_Visual_ID")

;; match-visual-info returns info on a matching visual or #f if none
;; exists.

(define (match-visual-info display screen-number depth class)
  (let ((res (%match-visual-info (display-Xdisplay display)
				 screen-number
				 depth
				 class)))
    (if res
	(visual-info-alist->vector res)
	res)))

(import-lambda-definition %match-visual-info (Xdisplay scrnum depth class)
  "scx_Match_Visual_Info")