scx/scheme/xlib/error.scm

82 lines
2.7 KiB
Scheme

(define-record-type x-error :x-error
(really-make-x-error display ser-num code major-opcode minor-opcode res-id text next)
x-error?
(display x-error-display)
(ser-num x-error-ser-num)
(code x-error-code)
(major-opcode x-error-major-opcode)
(minor-opcode x-error-minor-opcode)
(res-id x-error-res-id)
(text x-error-text)
(next really-next-x-error really-set-next-x-error!))
(define (make-x-error display ser-num code major-opcode minor-opcode res-id text)
(really-make-x-error display ser-num code major-opcode
minor-opcode res-id text (make-placeholder)))
(define (next-x-error x-error)
(placeholder-value (really-next-x-error x-error)))
(define (set-next-x-error! x-error next-x-error)
(placeholder-set! (really-next-x-error x-error) next-x-error))
(define empty-x-error (make-x-error #f #f #f #f #f #f #f))
(define (empty-x-error? obj)
(eq? obj empty-x-error))
(define *most-recent-x-error* empty-x-error)
(define (most-recent-x-error)
*most-recent-x-error*)
(define (advance-most-recent-x-error!)
(set! *most-recent-x-error*
(next-x-error *most-recent-x-error*)))
(define-enumerated-type error-code :error-code
error-code? error-codes error-code-name error-code-index
(success bad-request bad-value bad-window bad-pixmap bad-atom
bad-cursor bad-font bad-match bad-drawable bad-access bad-alloc
bad-color bad-gc bad-id-choice bad-name bad-length bad-implementation))
(define (integer->error-code i)
(if (< i (vector-length error-codes))
(vector-ref error-codes i)
;; there can be larger numbers - extension errors
i))
(define internal-x-error-handler
(lambda (infos)
(let ((display (make-display (vector-ref infos 0) #f))
(ser-num (vector-ref infos 1))
(error-code (integer->error-code (vector-ref infos 2)))
(major-opcode (vector-ref infos 3))
(minor-opcode (vector-ref infos 4))
(res-id (vector-ref infos 5))
(error-string (vector-ref infos 6)))
(set-next-x-error! *most-recent-x-error*
(make-x-error display ser-num error-code major-opcode
minor-opcode res-id error-string))
(advance-most-recent-x-error!))))
(define-exported-binding "internal-x-error-handler" internal-x-error-handler)
;;; Fatal errors are handled by an ordinary handler
(define *x-fatal-error-handler* #f)
(define internal-x-fatal-error-handler
(lambda (Xdisplay)
(if *x-fatal-error-handler*
(*x-fatal-error-handler* (make-display Xdisplay #f))
#f)))
(define-exported-binding "internal-x-fatal-error-handler"
internal-x-fatal-error-handler)
(define (x-fatal-error-handler . args)
(if (null? args)
*x-fatal-error-handler*
(let ((old-hander *x-fatal-error-handler*))
(set! *x-fatal-error-handler* (car args))
old-hander)))