fixed intern-atom calls
added some option types added colormap installation utils
This commit is contained in:
parent
3ecd9478ee
commit
1393131948
|
@ -16,6 +16,12 @@
|
|||
'()
|
||||
lists))
|
||||
|
||||
(define (list-diff list1 list2)
|
||||
;; returns every member in list2 that is not in list1
|
||||
(filter (lambda (e)
|
||||
(not (member e list1)))
|
||||
list2))
|
||||
|
||||
;; *** cml utilities *************************************************
|
||||
|
||||
(define (select* . list) (select list))
|
||||
|
@ -39,8 +45,8 @@
|
|||
(mdisplay "condition in " id ":\n " condition "\n")
|
||||
(punt))
|
||||
(lambda ()
|
||||
(fun (lambda () (sync-point-release sp)))
|
||||
(mdisplay "thread " id " returned\n")
|
||||
(let ((res (fun (lambda () (sync-point-release sp)))))
|
||||
(mdisplay "thread " id " returned: " res "\n"))
|
||||
))))
|
||||
(sync-point-wait sp))))
|
||||
|
||||
|
@ -53,13 +59,14 @@
|
|||
;; *** option utilities **********************************************
|
||||
|
||||
(define-record-type options :options
|
||||
(make-options dpy colormap option-alist value-alist type-alist)
|
||||
(make-options dpy colormap option-alist value-alist type-alist default-alist)
|
||||
options?
|
||||
(dpy options:dpy)
|
||||
(colormap options:colormap)
|
||||
(option-alist options:option-alist set-options:option-alist!)
|
||||
(value-alist options:value-alist set-options:value-alist!)
|
||||
(type-alist options:type-alist set-options:type-alist!))
|
||||
(type-alist options:type-alist set-options:type-alist!)
|
||||
(default-alist options:default-alist))
|
||||
|
||||
(define (create-options dpy colormap spec options)
|
||||
(let ((option-alist (map (lambda (s)
|
||||
|
@ -70,12 +77,16 @@
|
|||
(value-alist '())
|
||||
(type-alist (map (lambda (s)
|
||||
(cons (first s) (second s)))
|
||||
spec)))
|
||||
spec))
|
||||
(default-alist (map (lambda (s)
|
||||
(cons (first s) (third s)))
|
||||
spec)))
|
||||
(for-each (lambda (name.option name.type)
|
||||
(allocate-option dpy colormap (car name.option)
|
||||
(cdr name.type) (cdr name.option)))
|
||||
option-alist type-alist)
|
||||
(make-options dpy colormap option-alist value-alist type-alist)))
|
||||
(make-options dpy colormap option-alist value-alist type-alist
|
||||
default-alist)))
|
||||
|
||||
;; if the colormap gets freed, then the colors don't have to
|
||||
(define (free-options options free-colors?)
|
||||
|
@ -130,10 +141,14 @@
|
|||
(define (get-options options)
|
||||
(options:option-alist options))
|
||||
|
||||
(define (get-options-diff options)
|
||||
(list-diff (options:default-alist options)
|
||||
(options:option-alist options)))
|
||||
|
||||
(define-enumerated-type option-type :option-type
|
||||
option-type? option-types option-type-name option-type-index
|
||||
(int number inexact exact string symbol font color colors
|
||||
boolean symbol-list keys))
|
||||
boolean symbol-list keys keys-list sexp))
|
||||
|
||||
(define-syntax define-options-spec
|
||||
(syntax-rules
|
||||
|
@ -177,6 +192,13 @@
|
|||
((eq? type (option-type keys))
|
||||
(let ((keys (string->keys dpy def)))
|
||||
(check keys (lambda (x) x))))
|
||||
((eq? type (option-type keys-list))
|
||||
(and (check def list?)
|
||||
(map (lambda (s) (allocate-option dpy colormap name
|
||||
(option-type keys) s))
|
||||
def)))
|
||||
((eq? type (option-type sexp))
|
||||
def)
|
||||
(else (error "option type not implemented" name type)))))
|
||||
|
||||
;; *** keys utilities ************************************************
|
||||
|
@ -261,7 +283,7 @@
|
|||
(define (take-focus dpy window time)
|
||||
;; implements the TAKE_FOCUS protocol
|
||||
(let* ((protocols (get-wm-protocols dpy window))
|
||||
(wm-take-focus (intern-atom dpy "WM_TAKE_FOCUS" #t))
|
||||
(wm-take-focus (intern-atom dpy "WM_TAKE_FOCUS" #f))
|
||||
(wm-hints (get-wm-hints dpy window))
|
||||
(t (and wm-hints (assq (wm-hint input?) wm-hints)))
|
||||
(input? (if t (cdr t) #t)))
|
||||
|
@ -286,13 +308,13 @@
|
|||
(send-event dpy window #f (event-mask)
|
||||
(create-client-message-event
|
||||
(event-type client-message) 0 #t dpy window
|
||||
(make-property (intern-atom dpy "WM_PROTOCOLS" #t)
|
||||
(make-property (intern-atom dpy "WM_PROTOCOLS" #f)
|
||||
(property-format long)
|
||||
(list atom time)))))
|
||||
|
||||
(define (delete-window dpy window time)
|
||||
(let* ((protocols (get-wm-protocols dpy window))
|
||||
(wm-delete-window (intern-atom dpy "WM_DELETE_WINDOW" #t)))
|
||||
(wm-delete-window (intern-atom dpy "WM_DELETE_WINDOW" #f)))
|
||||
(if (member wm-delete-window protocols)
|
||||
(send-protocol-message dpy window wm-delete-window time)
|
||||
(destroy-window dpy window))))
|
||||
|
@ -493,3 +515,25 @@
|
|||
thunk
|
||||
(lambda ()
|
||||
(display-select-input dpy window before)))))
|
||||
|
||||
(define (all-window-colormaps dpy window)
|
||||
(let ((wins (cons window
|
||||
(let* ((a (intern-atom dpy "WM_COLORMAP_WINDOWS" #f))
|
||||
(t (intern-atom dpy "WINDOW" #f))
|
||||
(p (get-full-window-property dpy window a #f t)))
|
||||
(if (and p (property:data p))
|
||||
(property:data p)
|
||||
'())))))
|
||||
(map (lambda (win)
|
||||
(window-attribute:colormap (get-window-attributes dpy win)))
|
||||
wins)))
|
||||
|
||||
(define (install-colormaps dpy window)
|
||||
(for-each (lambda (c)
|
||||
(install-colormap dpy c))
|
||||
(all-window-colormaps dpy window)))
|
||||
|
||||
(define (uninstall-colormaps dpy window)
|
||||
(for-each (lambda (c)
|
||||
(uninstall-colormap dpy c))
|
||||
(all-window-colormaps dpy window)))
|
||||
|
|
Loading…
Reference in New Issue