added free-options
fixed wm-hints stuff added uppercase/lowercase to keys option
This commit is contained in:
		
							parent
							
								
									da76ea4b48
								
							
						
					
					
						commit
						1d426ce2dd
					
				| 
						 | 
				
			
			@ -68,9 +68,22 @@
 | 
			
		|||
	      option-alist type-alist)
 | 
			
		||||
    (make-options dpy colormap option-alist value-alist type-alist)))
 | 
			
		||||
 | 
			
		||||
(define (free-options options)
 | 
			
		||||
  ;; TODO
 | 
			
		||||
  #t)
 | 
			
		||||
;; if the colormap gets freed, then the colors don't have to
 | 
			
		||||
(define (free-options options free-colors?)
 | 
			
		||||
  (for-each (lambda (n.v)
 | 
			
		||||
	      (let* ((name (car n.v))
 | 
			
		||||
		     (value (cdr n.v))
 | 
			
		||||
		     (type (assq/false name (options:type-alist options))))
 | 
			
		||||
		(cond
 | 
			
		||||
		 ((eq? (option-type font) type)
 | 
			
		||||
		  (unload-font (options:dpy options) value))
 | 
			
		||||
		 ((eq? (option-type color) type)
 | 
			
		||||
		  (free-colors (options:dpy options) (options:colormap options)
 | 
			
		||||
			       (list value) 0))
 | 
			
		||||
		 ((eq? (option-type colors) type)
 | 
			
		||||
		  (free-colors (options:dpy options) (options:colormap options)
 | 
			
		||||
			       value 0)))))
 | 
			
		||||
	    (options:value-alist options)))
 | 
			
		||||
 | 
			
		||||
(define (get-option-value options name)
 | 
			
		||||
  (let ((p (assq name (options:value-alist options))))
 | 
			
		||||
| 
						 | 
				
			
			@ -120,10 +133,13 @@
 | 
			
		|||
    (define id (list (list (quote name) (option-type type) default)
 | 
			
		||||
		     ...)))))
 | 
			
		||||
 | 
			
		||||
(define (options-spec-union spec1 spec2)
 | 
			
		||||
  (append spec1 spec2))
 | 
			
		||||
 | 
			
		||||
(define (allocate-option dpy colormap name type def)
 | 
			
		||||
  (let ((check (lambda (value pred)
 | 
			
		||||
		 (if (not (pred value))
 | 
			
		||||
		     (error "wrong type argument" value) ;; TODO: other??
 | 
			
		||||
		     (error "wrong type argument" value) ;; TODO: other error??
 | 
			
		||||
		     value))))
 | 
			
		||||
    (cond
 | 
			
		||||
     ((eq? type (option-type int)) (check def integer?))
 | 
			
		||||
| 
						 | 
				
			
			@ -167,13 +183,20 @@
 | 
			
		|||
	 (keys (map (lambda (s) (string->key dpy s)) keys-s)))
 | 
			
		||||
    (and (not (memq #f keys)) keys)))
 | 
			
		||||
 | 
			
		||||
(define (is-uppercase? keysym)
 | 
			
		||||
  (let ((low.up (convert-case keysym)))
 | 
			
		||||
    (not (equal? (car low.up) keysym))))
 | 
			
		||||
 | 
			
		||||
(define (string->key dpy s)
 | 
			
		||||
  (let* ((l (reverse (split-minus s)))
 | 
			
		||||
	 (mod-strings (reverse (cdr l)))
 | 
			
		||||
	 (key-string (car l))
 | 
			
		||||
	 (modifiers (strings->modifiers mod-strings))
 | 
			
		||||
	 ;; TODO: upcase chars + Shift
 | 
			
		||||
	 (keycode (keysym->keycode dpy (string->keysym key-string))))
 | 
			
		||||
	 (keysym (string->keysym key-string))
 | 
			
		||||
	 (keycode (keysym->keycode dpy keysym))
 | 
			
		||||
	 (modifiers (enum-set-union (if (is-uppercase? keysym)
 | 
			
		||||
					(state-set shift)
 | 
			
		||||
					(state-set))
 | 
			
		||||
				    (strings->modifiers mod-strings))))
 | 
			
		||||
    (and modifiers keycode
 | 
			
		||||
	 (make-key modifiers keycode))))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -202,10 +225,9 @@
 | 
			
		|||
;; *** xlib utilities ************************************************
 | 
			
		||||
 | 
			
		||||
(define (reparent-to-root dpy window)
 | 
			
		||||
  ;; reparent window to it's root-window so that it stays virtually at
 | 
			
		||||
  ;; the same position.
 | 
			
		||||
  ;; TODO
 | 
			
		||||
  (reparent-window dpy window (window-root dpy window)))
 | 
			
		||||
  (let ((r (root-rectangle dpy window)))
 | 
			
		||||
    (reparent-window dpy window (window-root dpy window)
 | 
			
		||||
		     (rectangle:x r) (rectangle:y r))))
 | 
			
		||||
 | 
			
		||||
(define (window-path dpy window)
 | 
			
		||||
  (cons window
 | 
			
		||||
| 
						 | 
				
			
			@ -347,18 +369,21 @@
 | 
			
		|||
                       (height (cdr size))))))
 | 
			
		||||
 | 
			
		||||
(define (desired-size/hints dpy window default-size)
 | 
			
		||||
  (let* ((hints (get-wm-normal-hints dpy window)) ;; or group-leader?
 | 
			
		||||
         (size (or (assq/false (size-hint us-size) hints)
 | 
			
		||||
                   (assq/false (size-hint size) hints)
 | 
			
		||||
                   default-size)))
 | 
			
		||||
    (adjust-size/hints hints (car size) (cdr size))))
 | 
			
		||||
  (let ((hints (get-wm-normal-hints dpy window))) ;; or group-leader?
 | 
			
		||||
    (if hints
 | 
			
		||||
	(let ((size (or (assq/false (size-hint us-size) hints)
 | 
			
		||||
			(assq/false (size-hint size) hints)
 | 
			
		||||
			default-size)))
 | 
			
		||||
	  (adjust-size/hints hints (car size) (cdr size)))
 | 
			
		||||
	default-size)))
 | 
			
		||||
 | 
			
		||||
(define (desired-position/hints dpy window default-position)
 | 
			
		||||
  (let* ((hints (get-wm-normal-hints dpy window)) ;; or group-leader?
 | 
			
		||||
         (pos (or (assq/false (size-hint us-position) hints)
 | 
			
		||||
                  (assq/false (size-hint position) hints)
 | 
			
		||||
                  default-position)))
 | 
			
		||||
    pos))
 | 
			
		||||
  (let ((hints (get-wm-normal-hints dpy window))) ;; or group-leader?
 | 
			
		||||
    (if hints
 | 
			
		||||
	(or (assq/false (size-hint us-position) hints)
 | 
			
		||||
	    (assq/false (size-hint position) hints)
 | 
			
		||||
	    default-position)
 | 
			
		||||
	default-position)))
 | 
			
		||||
 | 
			
		||||
;; returns width/height pair that conform to the defined
 | 
			
		||||
;; aspects/resize-inc etc. in hints, and are as close as possible to
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue