- changed the action for the kill-button, to manually kill zombie
clients. - added tracking of the last two focused clients, to refocus the last one if a client has been killed.
This commit is contained in:
		
							parent
							
								
									328ddca7b0
								
							
						
					
					
						commit
						43866aff9e
					
				| 
						 | 
				
			
			@ -99,6 +99,7 @@
 | 
			
		|||
	  wm-clients wm-current-client
 | 
			
		||||
	  wm-manage-window wm-unmanage-window wm-select-client
 | 
			
		||||
	  wm-configure-window wm-iconify-window wm-maximize-window
 | 
			
		||||
	  wm-deinit-client
 | 
			
		||||
 | 
			
		||||
	  ignore-next-enter-notify!
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,10 +19,21 @@
 | 
			
		|||
	       wm)))
 | 
			
		||||
 | 
			
		||||
(define-record-type switch-wm-data :switch-wm-data
 | 
			
		||||
  (make-switch-wm-data titlebars empty-titlebar)
 | 
			
		||||
  (make-switch-wm-data titlebars empty-titlebar last-focused)
 | 
			
		||||
  switch-wm-data?
 | 
			
		||||
  (titlebars data:titlebars set-data:titlebars!)
 | 
			
		||||
  (empty-titlebar data:empty-titlebar))
 | 
			
		||||
  (empty-titlebar data:empty-titlebar)
 | 
			
		||||
  (last-focused data:last-focused set-data:last-focused!))
 | 
			
		||||
 | 
			
		||||
;; only for switch-wm's, but maybe we will need that for all...
 | 
			
		||||
(define (last-focused-client wm data)
 | 
			
		||||
  (let ((c (cdr (data:last-focused data))))
 | 
			
		||||
    (and (memq c (wm-clients wm)) c)))
 | 
			
		||||
 | 
			
		||||
(define (add-last-focused-client! wm data client)
 | 
			
		||||
  (let ((p (data:last-focused data)))
 | 
			
		||||
    (set-cdr! p (car p))
 | 
			
		||||
    (set-car! p client)))
 | 
			
		||||
 | 
			
		||||
(define (init-switch-wm wm channel)
 | 
			
		||||
  (let* ((dpy (wm:dpy wm))
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +41,7 @@
 | 
			
		|||
	 (options (wm:options wm))
 | 
			
		||||
	 (gc (create-gc dpy window '()))
 | 
			
		||||
	 (empty-titlebar (create-empty-titlebar wm))
 | 
			
		||||
	 (data (make-switch-wm-data '() empty-titlebar)))
 | 
			
		||||
	 (data (make-switch-wm-data '() empty-titlebar (cons #f #f))))
 | 
			
		||||
    (update-titlebars wm data)
 | 
			
		||||
 | 
			
		||||
    (grab-shortcut dpy window
 | 
			
		||||
| 
						 | 
				
			
			@ -131,7 +142,8 @@
 | 
			
		|||
			      (if (window-viewable? dpy window)
 | 
			
		||||
				  'active
 | 
			
		||||
				  'normal))))
 | 
			
		||||
	       (set-titlebar-state! titlebar state)))))
 | 
			
		||||
	       (set-titlebar-state! titlebar state)))
 | 
			
		||||
	 (if focused? (add-last-focused-client! wm data client))))
 | 
			
		||||
 | 
			
		||||
      ((update-client-name)
 | 
			
		||||
       (let ((client (second msg))
 | 
			
		||||
| 
						 | 
				
			
			@ -223,7 +235,16 @@
 | 
			
		|||
		(wm-select-client wm client (fourth msg)))
 | 
			
		||||
	       ;; from titlebar-buttons
 | 
			
		||||
	       ((kill)
 | 
			
		||||
		(delete-window dpy (client:window client) (second msg)))
 | 
			
		||||
		(let ((time (second msg)))
 | 
			
		||||
		  ;; sometimes zombie-client-windows still hang
 | 
			
		||||
		  ;; around. this is just a hack to let the user close
 | 
			
		||||
		  ;; those manually:
 | 
			
		||||
		  (if (or (not (window-exists? dpy (client:window client)))
 | 
			
		||||
			  (not (eq? (window-parent dpy (client:window client))
 | 
			
		||||
				    (client:client-window client))))
 | 
			
		||||
		      (spawn (lambda ()
 | 
			
		||||
			       (wm-deinit-client wm client)))
 | 
			
		||||
		      (delete-window dpy (client:window client) time))))
 | 
			
		||||
	       (else (warn "unhandled client message " wm client msg))))
 | 
			
		||||
	   (loop))))
 | 
			
		||||
      
 | 
			
		||||
| 
						 | 
				
			
			@ -276,7 +297,9 @@
 | 
			
		|||
	(if (null? (wm-clients wm))
 | 
			
		||||
	    (set-input-focus dpy (wm:window wm) (revert-to parent)
 | 
			
		||||
			     current-time)
 | 
			
		||||
	    (wm-select-client wm (car (wm-clients wm)) current-time)))))
 | 
			
		||||
	    (let ((next-client (or (last-focused-client wm data)
 | 
			
		||||
				   (car (wm-clients wm)))))
 | 
			
		||||
	      (wm-select-client wm next-client current-time))))))
 | 
			
		||||
 | 
			
		||||
;; ***
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue