82 lines
2.7 KiB
Scheme
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)))
|