added option-type cursor
optimized window-contains-focus? fixed take-focus and get-wm-state
This commit is contained in:
parent
36da85834f
commit
8c8e13639e
|
@ -42,11 +42,12 @@
|
|||
(spawn (lambda ()
|
||||
(with-handler
|
||||
(lambda (condition punt)
|
||||
(mdisplay "condition in " id ":\n " condition "\n")
|
||||
(mdisplay "condition in " id ":")
|
||||
(punt))
|
||||
(lambda ()
|
||||
(let ((res (fun (lambda () (sync-point-release sp)))))
|
||||
(mdisplay "thread " id " returned: " res "\n"))
|
||||
;;(mdisplay "thread " id " returned: " res "\n")
|
||||
res)
|
||||
))))
|
||||
(sync-point-wait sp))))
|
||||
|
||||
|
@ -116,7 +117,9 @@
|
|||
(list value) 0))
|
||||
((eq? (option-type colors) type)
|
||||
(free-colors (options:dpy options) (options:colormap options)
|
||||
value 0)))))
|
||||
value 0))
|
||||
((eq? (option-type cursor) type)
|
||||
(free-cursor (options:dpy options) value)))))
|
||||
(options:value-alist options)))
|
||||
|
||||
(define (get-option-value options name)
|
||||
|
@ -162,7 +165,8 @@
|
|||
(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 keys-list sexp binding-list))
|
||||
boolean symbol-list keys keys-list sexp binding-list
|
||||
cursor))
|
||||
|
||||
(define-syntax define-options-spec
|
||||
(syntax-rules
|
||||
|
@ -220,6 +224,8 @@
|
|||
(option-type keys) (car b))))
|
||||
(cons k (cdr b))))
|
||||
def)))
|
||||
((eq? type (option-type cursor))
|
||||
(check (create-font-cursor dpy def) (lambda (x) x)))
|
||||
(else (error "option type not implemented" name type)))))
|
||||
|
||||
;; *** keys utilities ************************************************
|
||||
|
@ -300,10 +306,16 @@
|
|||
(eq? (get-input-focus-window dpy) window))
|
||||
|
||||
(define (window-contains-focus? dpy window)
|
||||
(or (window-focused? dpy window)
|
||||
(any (lambda (child)
|
||||
(window-contains-focus? dpy child))
|
||||
(or (window-children dpy window) '()))))
|
||||
(let ((fw (get-input-focus-window dpy)))
|
||||
(or (equal? fw window)
|
||||
(window-contains-window? dpy window fw))))
|
||||
|
||||
(define (window-contains-window? dpy window child)
|
||||
(let ((children (or (window-children dpy window) '())))
|
||||
(or (member child children)
|
||||
(any (lambda (c)
|
||||
(window-contains-window? dpy c child))
|
||||
children))))
|
||||
|
||||
(define (take-focus dpy window time)
|
||||
;; implements the TAKE_FOCUS protocol
|
||||
|
@ -312,7 +324,7 @@
|
|||
(wm-hints (get-wm-hints dpy window))
|
||||
(t (and wm-hints (assq (wm-hint input?) wm-hints)))
|
||||
(input? (if t (cdr t) #f)))
|
||||
(if (and input? (window-mapped? dpy window))
|
||||
(if (and input? (window-viewable? dpy window))
|
||||
(set-input-focus dpy window (revert-to parent) time))
|
||||
(if (and protocols wm-take-focus
|
||||
(memq wm-take-focus protocols))
|
||||
|
@ -524,6 +536,15 @@
|
|||
(< x (+ (rectangle:x r) (rectangle:width r)))
|
||||
(< y (+ (rectangle:y r) (rectangle:height r)))))
|
||||
|
||||
(define (rectangles-overlap? r1 r2)
|
||||
(let ((x1 (rectangle:x r2))
|
||||
(y1 (rectangle:y r2))
|
||||
(x2 (+ (rectangle:x r2) (rectangle:width r2)))
|
||||
(y2 (+ (rectangle:y r2) (rectangle:height r2))))
|
||||
(any (lambda (p)
|
||||
(point-in-rectangle? r1 (car p) (cdr p)))
|
||||
(list (cons x1 y1) (cons x1 y2) (cons x2 y1) (cons x2 y2)))))
|
||||
|
||||
(define-enumerated-type wm-state :wm-state
|
||||
wm-state? wm-states wm-state-name wm-state-index
|
||||
(withdrawn normal wm-state-2 iconic))
|
||||
|
@ -540,7 +561,8 @@
|
|||
(and p
|
||||
(eq? (property-format long) (property:format p))
|
||||
(eq? ws (property:type p))
|
||||
(cons (first (property:data p)) (second (property:data p))))))
|
||||
(cons (integer->wm-state (first (property:data p)))
|
||||
(second (property:data p))))))
|
||||
|
||||
(define (set-wm-state! dpy window state icon-window)
|
||||
(let* ((ws (intern-atom dpy "WM_STATE" #f))
|
||||
|
|
Loading…
Reference in New Issue