scx/scheme/xlib/gcontext.scm

443 lines
16 KiB
Scheme
Raw Normal View History

;; create-gcontext returns a newly create graphic context for the
;; specified drawable (a window or a pixmap). The gc-value-alist has
;; to be an alist mapping a gc-value (defined above) to a
;; corresponding value. See XCreateGC.
(define (create-gcontext drawable gc-value-alist)
(let ((display (drawable-display drawable))
(Xobject (drawable-Xobject drawable))
(values (gc-value-alist->integer+vector gc-value-alist)))
(let ((Xgcontext (%create-gcontext (display-Xdisplay display)
Xobject
values)))
(make-gcontext Xgcontext display #t))))
(import-lambda-definition %create-gcontext (Xdisplay Xdrawable values)
"scx_Create_Gc")
;; *******************************************************************
(define-enumerated-type gc-function :gc-function
gc-function? gc-functions gc-function-name gc-function-index
(clear and and-reverse copy and-inverted no-op xor or nor equiv
invert or-reverse copy-inverted or-inverted nand set))
(define (integer->gc-function int)
(vector-ref gc-functions int))
(define (gc-function->integer v)
(gc-function-index v))
;; *******************************************************************
(define-enumerated-type line-style :line-style
line-style? line-styles line-style-name line-style-index
(solid on-off-dash double-dash))
(define (integer->line-style int)
(vector-ref line-styles int))
(define (line-style->integer v)
(line-style-index v))
;; *******************************************************************
(define-enumerated-type cap-style :cap-style
cap-style? cap-styles cap-style-name cap-style-index
(not-last butt round projecting))
(define (integer->cap-style int)
(vector-ref cap-styles int))
(define (cap-style->integer v)
(cap-style-index v))
;; *******************************************************************
(define-enumerated-type join-style :join-style
join-style? join-styles join-style-name join-style-index
(miter round bevel))
(define (integer->join-style int)
(vector-ref join-styles int))
(define (join-style->integer v)
(join-style-index v))
;; *******************************************************************
(define-enumerated-type fill-style :fill-style
fill-style? fill-styles fill-style-name fill-style-index
(solid tiled strippled opaque-strippled))
(define (integer->fill-style int)
(vector-ref fill-styles int))
(define (fill-style->integer v)
(fill-style-index v))
;; *******************************************************************
(define-enumerated-type subwindow-mode :subwindow-mode
subwindow-mode? subwindow-modes subwindow-mode-name subwindow-mode-index
(clip-by-children include-inferiors))
(define (integer->subwindow-mode int)
(vector-ref subwindow-modes int))
(define (subwindow-mode->integer v)
(subwindow-mode-index v))
;; *******************************************************************
(define-enumerated-type arc-mode :arc-mode
arc-mode? arc-modes arc-mode-name arc-mode-index
(chord pie-slice))
(define (integer->arc-mode int)
(vector-ref arc-modes int))
(define (arc-mode->integer v)
(arc-mode-index v))
;; *******************************************************************
;; an enumerated type corresponding to XGCValues.
(define-enumerated-type gc-value :gc-value
gc-value?
gc-values
gc-value-name
gc-value-index
(function plane-mask foreground background line-width line-style cap-style
join-style fill-style fill-rule tile stipple ts-x-origin ts-y-origin
font subwindow-mode graphics-exposures clip-x-origin clip-y-origin
clip-mask dash-offset dash-list arc-mode))
(define-syntax make-gc-value-alist
(syntax-rules
()
((make-gc-value-alist (attr arg) rest ...)
(cons (cons (gc-value attr) arg)
(make-gc-value-alist rest ...)))
((make-gc-value-alist)
'())))
(define-enum-set-type gc-value-set :gc-value-set
gc-value-set? make-gc-value-set
gc-value gc-value? gc-values gc-value-index)
(define integer->gc-value-set
(make-integer->enum-set gc-values gc-value-index make-gc-value-set))
(define gc-value-set->integer
(make-enum-set->integer gc-value-index))
(define gc-value-alist->integer+vector
(make-enum-alist->integer+vector
gc-values
gc-value-index
(lambda (attr)
(cond
((eq? attr (gc-value function))
gc-function->integer)
((or (eq? attr (gc-value plane-mask))
(eq? attr (gc-value foreground))
(eq? attr (gc-value background)))
pixel-Xpixel)
((eq? attr (gc-value line-width))
(lambda (x) x))
((eq? attr (gc-value line-style))
line-style->integer)
((eq? attr (gc-value cap-style))
cap-style->integer)
((eq? attr (gc-value join-style))
join-style->integer)
((eq? attr (gc-value fill-style))
fill-style->integer)
((eq? attr (gc-value fill-rule))
fill-rule->integer)
((or (eq? attr (gc-value tile))
(eq? attr (gc-value stipple))
(eq? attr (gc-value clip-mask)))
pixmap-Xpixmap)
((or (eq? attr (gc-value ts-x-origin))
(eq? attr (gc-value ts-y-origin)))
(lambda (x) x))
((eq? attr (gc-value font))
font-Xfont)
((eq? attr (gc-value subwindow-mode))
subwindow-mode->integer)
((eq? attr (gc-value graphics-exposures))
(lambda (x) x))
((or (eq? attr (gc-value clip-x-origin))
(eq? attr (gc-value clip-y-origin)))
(lambda (x) x))
((or (eq? attr (gc-value dash-offset))
(eq? attr (gc-value dash-list)))
(lambda (x) x))
((eq? attr (gc-value arc-mode))
arc-mode->integer)))))
(define (integer+vector->gc-value-alist display)
(make-integer+vector->enum-alist
gc-values gc-value-index
(lambda (v)
(cond
((eq? v (gc-value function))
integer->gc-function)
((or (eq? v (gc-value plane-mask))
(eq? v (gc-value foreground))
(eq? v (gc-value background)))
(lambda (Xpixel)
(make-pixel Xpixel #f #f)))
((eq? v (gc-value line-width))
(lambda (x) x))
((eq? v (gc-value line-style))
integer->line-style)
((eq? v (gc-value cap-style))
integer->cap-style)
((eq? v (gc-value join-style))
integer->join-style)
((eq? v (gc-value fill-style))
integer->fill-style)
((eq? v (gc-value fill-rule))
integer->fill-rule)
((or (eq? v (gc-value tile))
(eq? v (gc-value stipple))
(eq? v (gc-value clip-mask)))
(lambda (Xpixmap)
(make-pixmap Xpixmap display #f)))
((or (eq? v (gc-value ts-x-origin))
(eq? v (gc-value ts-y-origin))
(eq? v (gc-value clip-x-origin))
(eq? v (gc-value clip-y-origin)))
(lambda (x) x))
((eq? v (gc-value font))
(lambda (Xfont)
;; -> see Xlib Programming Manual 5.12
2002-03-17 10:49:30 -05:00
(make-font #f Xfont #f display #f)))
((eq? v (gc-value subwindow-mode))
integer->subwindow-mode)
((eq? v (gc-value graphics-exposures))
(lambda (x) x))
((or (eq? v (gc-value dash-offset))
(eq? v (gc-value dash-list)))
(lambda (x) x))
((eq? v (gc-value arc-mode))
integer->arc-mode)))))
2001-06-25 07:46:06 -04:00
;; copy-gcontext returns a newly create duplicate of the given
;; gcontext, and assigns it to the specified drawable. See XCopyGC.
2001-06-25 07:46:06 -04:00
(define (copy-gcontext gcontext drawable)
(let* ((new-gcontext (create-gcontext drawable '()))
2001-06-25 07:46:06 -04:00
(new-Xgcontext (gcontext-Xgcontext new-gcontext))
(Xgcontext (gcontext-Xgcontext gcontext))
2001-07-09 09:49:38 -04:00
(Xdisplay (display-Xdisplay (gcontext-display gcontext))))
(%copy-gcontext Xdisplay Xgcontext new-Xgcontext)
2001-06-25 07:46:06 -04:00
new-gcontext))
(import-lambda-definition %copy-gcontext (Xdisplay Xsource Xdest)
"scx_Copy_Gc")
2001-06-25 07:46:06 -04:00
;; copy-gcontext! copies the specified attributes from gc-from to
;; gc-to. The attributes have to be a enum-set of gc-value. It can be
;; created with the function make-gc-value-set or the macro
;; gc-value-set. if no gc-value-set is specified, then all attributes
;; are ;; copied. See XCopyGC.
(define (copy-gcontext! gc-from gc-to . maybe-gc-values)
(let ((gc-values (if (null? maybe-gc-values)
-1
(gc-value-set->integer (car maybe-gc-values)))))
(%copy-gcontext! (display-Xdisplay (gcontext-display gc-from))
(gcontext-Xgcontext gc-from)
(gcontext-Xgcontext gc-to)
gc-values)))
(import-lambda-definition %copy-gcontext! (Xdisplay Xfrom Xto attrs)
"scx_Copy_Gc_To_Gc")
;; get-gontext-values returns an alist of all attributes for the
;; specified graphic context. See the gc-value and create-gcontext
;; above. See XGetGCValues.
2001-06-25 07:46:06 -04:00
(define (get-gcontext-values gcontext)
(let* ((Xgcontext (gcontext-Xgcontext gcontext))
(display (gcontext-display gcontext))
(Xdisplay (display-Xdisplay display)))
2001-07-09 09:49:38 -04:00
(let ((vals (%get-gcontext-values Xgcontext Xdisplay)))
(if (not vals)
2001-06-25 07:46:06 -04:00
(error "cannot get gcontext values." gcontext)
((integer+vector->gc-value-alist display) vals)))))
2001-07-09 09:49:38 -04:00
(import-lambda-definition %get-gcontext-values (Xgcontext Xdisplay)
"scx_Get_Gc_Values")
2001-06-25 07:46:06 -04:00
(define (make-gcontext-getter name)
(lambda (gcontext)
2003-01-17 11:42:14 -05:00
(let ((values (get-gcontext-values gcontext)))
(and values (cdr (assq name values))))))
2001-06-25 07:46:06 -04:00
(define gcontext-function (make-gcontext-getter (gc-value function)))
(define gcontext-plane-mask (make-gcontext-getter (gc-value plane-mask)))
(define gcontext-foreground (make-gcontext-getter (gc-value foreground)))
(define gcontext-background (make-gcontext-getter (gc-value background)))
(define gcontext-line-width (make-gcontext-getter (gc-value line-width)))
(define gcontext-line-style (make-gcontext-getter (gc-value line-style)))
(define gcontext-cap-style (make-gcontext-getter (gc-value cap-style)))
(define gcontext-join-style (make-gcontext-getter (gc-value join-style)))
(define gcontext-fill-style (make-gcontext-getter (gc-value fill-style)))
(define gcontext-fill-rule (make-gcontext-getter (gc-value fill-rule)))
(define gcontext-arc-mode (make-gcontext-getter (gc-value arc-mode)))
(define gcontext-tile (make-gcontext-getter (gc-value tile)))
(define gcontext-stipple (make-gcontext-getter (gc-value stipple)))
(define gcontext-ts-x-origin (make-gcontext-getter (gc-value ts-x-origin)))
(define gcontext-ts-y-origin (make-gcontext-getter (gc-value ts-y-origin)))
;(define gcontext-font (make-gcontext-getter (gc-value font)))
(define gcontext-subwindow-mode
(make-gcontext-getter (gc-value subwindow-mode)))
(define gcontext-graphics-exposures
(make-gcontext-getter (gc-value graphics-exposures)))
(define gcontext-clip-x-origin (make-gcontext-getter (gc-value clip-x-origin)))
(define gcontext-clip-y-origin (make-gcontext-getter (gc-value clip-y-origin)))
(define gcontext-clip-mask (make-gcontext-getter (gc-value clip-mask)))
(define gcontext-dash-offset (make-gcontext-getter (gc-value dash-offset)))
(define gcontext-dash-list (make-gcontext-getter (gc-value dash-list)))
2001-06-25 07:46:06 -04:00
;; Alternative definition of gcontext-font. See XGcontextFromGC
;
(define (gcontext-font gcontext)
(let* ((display (gcontext-display gcontext))
(Xfontstruct (%gcontext-font
(display-Xdisplay display)
(gcontext-Xgcontext gcontext))))
(make-font #f #f Xfontstruct display #f)))
(import-lambda-definition %gcontext-font (Xdisplay Xgcontext)
"scx_GContext_Font") ; defined in font.c
;; change-gcontext sets some attributes of the specified graphic
;; context. The format of the arguments is like for
;; create-gcontext. See XChangeGC.
2001-06-25 07:46:06 -04:00
(define (change-gcontext gcontext gc-value-alist)
(%change-gcontext (gcontext-Xgcontext gcontext)
(display-Xdisplay (gcontext-display gcontext))
(gc-value-alist->integer+vector gc-value-alist)))
2001-06-25 07:46:06 -04:00
(import-lambda-definition %change-gcontext (Xgcontext Xdisplay args)
"scx_Change_Gc")
2001-06-25 07:46:06 -04:00
(define (make-gcontext-setter name)
(lambda (gcontext value)
2001-07-16 09:23:39 -04:00
(change-gcontext gcontext (list (cons name value)))))
2001-06-25 07:46:06 -04:00
(define set-gcontext-function!
(make-gcontext-setter (gc-value function)))
(define set-gcontext-plane-mask!
(make-gcontext-setter (gc-value plane-mask)))
(define set-gcontext-foreground!
(make-gcontext-setter (gc-value foreground)))
(define set-gcontext-background!
(make-gcontext-setter (gc-value background)))
(define set-gcontext-line-width!
(make-gcontext-setter (gc-value line-width)))
(define set-gcontext-line-style!
(make-gcontext-setter (gc-value line-style)))
(define set-gcontext-cap-style!
(make-gcontext-setter (gc-value cap-style)))
(define set-gcontext-join-style!
(make-gcontext-setter (gc-value join-style)))
(define set-gcontext-fill-style!
(make-gcontext-setter (gc-value fill-style)))
(define set-gcontext-fill-rule!
(make-gcontext-setter (gc-value fill-rule)))
(define set-gcontext-arc-mode! (make-gcontext-setter (gc-value arc-mode)))
(define set-gcontext-tile! (make-gcontext-setter (gc-value tile)))
(define set-gcontext-stipple! (make-gcontext-setter (gc-value stipple)))
(define set-gcontext-ts-x-origin!
(make-gcontext-setter (gc-value ts-x-origin)))
(define set-gcontext-ts-y-origin!
(make-gcontext-setter (gc-value ts-y-origin)))
(define set-gcontext-font! (make-gcontext-setter (gc-value font)))
(define set-gcontext-subwindow-mode!
(make-gcontext-setter (gc-value subwindow-mode)))
(define set-gcontext-graphics-exposures!
(make-gcontext-setter (gc-value graphics-exposures)))
(define set-gcontext-clip-x-origin!
(make-gcontext-setter (gc-value clip-x-origin)))
(define set-gcontext-clip-y-origin!
(make-gcontext-setter (gc-value clip-y-origin)))
(define set-gcontext-clip-mask!
(make-gcontext-setter (gc-value clip-mask)))
(define set-gcontext-dash-offset!
(make-gcontext-setter (gc-value dash-offset)))
(define set-gcontext-dash-list!
(make-gcontext-setter (gc-value dash-list)))
2001-06-25 07:46:06 -04:00
;; set-dashlist! is a more complex form of set-dashes!. (set-dashes! N) is
;; equivalent to (set-dash-list! .. #(N N))
(define (set-gcontext-dashlist! gcontext dash-offset dash-list)
(%set-dashlist (gcontext-Xgcontext gcontext)
(display-Xdisplay (gcontext-display gcontext))
dash-offset
(list->vector dash-list)))
2001-06-25 07:46:06 -04:00
2001-07-09 09:49:38 -04:00
(import-lambda-definition %set-dashlist (Xgcontext Xdisplay dashoffset dashlist)
"scx_Set_Gcontext_Dashlist")
2001-06-25 07:46:06 -04:00
;; set-gcontext-clip-rectangles changes the clip-mask in the specified
;; graphic context to the list of rectangles and sets the clip
;; origin. Each rectangle has to be a list (x y height width). The
;; coordinates of the rectangles are interpreted relative to the clip
;; origin specified by x and y. possible values for ordering are
;; defined below. If none is specified (rectangle-ordering unsorted)
;; is used. See XSetClipRectangles.
(define-enumerated-type rectangle-ordering :rectangle-ordering
rectangle-ordering? rectangle-orderings
rectangle-ordering-name rectangle-ordering-index
(unsorted y-sorted xy-sorted xy-banded))
(define (rectangle-ordering->integer v)
(rectangle-ordering-index v))
(define (set-gcontext-clip-rectangles! gcontext x y rectangles . ordering)
(%set-gcontext-clip-rectangles!
(gcontext-Xgcontext gcontext)
(display-Xdisplay (gcontext-display gcontext))
x y
(list->vector rectangles)
(rectangle-ordering->integer (if (null? ordering)
(rectangle-ordering unsorted)
(car ordering)))))
2001-07-09 09:49:38 -04:00
(import-lambda-definition %set-gcontext-clip-rectangles! (Xgcontext Xdisplay x
y v ord)
"scx_Set_Gcontext_Clip_Rectangles")
2001-07-09 09:49:38 -04:00
;; query-best-size/-cursor/-tile/-stipple function returns the best or
;; closest size to the specified size. For 'cursor, this is the
;; largest size that can be fully displayed on the screen specified by
;; which_screen. For 'tile, this is the size that can be tiled
;; fastest. For 'stipple, this is the size that can be stippled
;; fastest. See XQueryBestSize.
2001-07-09 09:49:38 -04:00
(define (query-best-size display width height shape) ;; not exported
2001-07-09 09:49:38 -04:00
(%query-best-size (display-Xdisplay display)
width height shape))
(import-lambda-definition %query-best-size (Xdisplay width height shape)
"scx_Query_Best_Size")
2001-07-09 09:49:38 -04:00
(define (query-best-cursor display width height)
(query-best-size display width height 0))
2001-07-09 09:49:38 -04:00
(define (query-best-tile display width height)
(query-best-size display width height 1))
2001-07-09 09:49:38 -04:00
(define (query-best-stipple display width height)
(query-best-size display width height 2))