; iconification following the "group" hint

;;File: icon-groups.gwm -- iconify-window manage groups
;;Author: colas@mirsa.inria.fr (Colas NAHABOO) -- Bull Research FRANCE
;;Revision: 1.2 -- Jan 30 1990
;;State: Exp
;;GWM Version: 1.4

; do not manage some groups and manage groups starting iconified

(if (not (boundp 'iconify-window-redefined-for-groups))
    (setq opening
	  (+ opening
	     '((if (and window-group (= window-status 'window))
		   (with (leader (# 0 window-group))
		     (if (member (atom window-client-class)
				 icon-groups.excluded)
			 (## 'no-group wob t)
		       (if (and (not (= leader window))
                                (not window-is-transient-for)
				(with (window leader)
				  (and window-starts-iconic
				       (= 'icon (window-wm-state)))))
			   (: window-starts-iconic t)))))))))

(defaults-to icon-groups.excluded ())

; iconifies a whole group in a single icon

(if (not (boundp 'iconify-window-redefined-for-groups))
  (progn
    (: iconify-window-redefined-for-groups iconify-window)
    (de iconify-window ()
      (if window-group	
					; we are in a group
	(if (= window-window (# 0 window-group))
					; leader
	  (if (= window-status 'window)
					; iconify leader
	    (if (# 'no-group window)
	      (iconify-window-redefined-for-groups)
	      (progn
		(for window window-group
		  (if window-is-mapped
		    (progn (register-group-member window)
		      (unmap-window))))
		(raise-and-map-window window-icon))
	    )
					; de-iconify leader
	    (progn
	      (raise-and-map-window window-window)
	      (for w window-group 
		(if (is-group-member w)
		  (raise-and-map-window w)))
	      (unmap-window window-icon)
	      (clear-group-members window-group)
	  ))
					; member
	  (if (= window-status 'window)
					; iconify member
	    (if (# 'no-group window)
	      (iconify-window-redefined-for-groups)
	      (progn
		(setq window-wm-state-icon 
		  (with (window (# 0 window-group))
		    (raise-and-map-window window-icon)
		    window-icon))
		(register-group-member window)
		(unmap-window window))
	    )
					; de-iconify member 
					; (not possible normally)
	    (iconify-window-redefined-for-groups)))
					; window do not belong to a group
	(iconify-window-redefined-for-groups)))))

; not to map back withdrawn windows, we maintain a 'group property for mapped
; windows of the group

(de register-group-member (w)
    (## 'group w t))

(de is-group-member (w)
    (# 'group w))

(de clear-group-members (l)
    (for w l
	 (## 'group w ())))

(de raise-and-map-window (w)
    (with (window w)
      (raise-window)
      (map-window)))

;; iconify all the group except this window

(defun iconify-other-windows ()
  (with (leader (# 0 window-group)
      current window)
    (for window window-group
      (if (= window current) ()
	(= window leader) (iconify-window-redefined-for-groups)
	(= 'window window-status)
	(iconify-window)))))

;; inconify all group, even if clicked on a son

(defun iconify-all-windows ()
  (for window window-group
    (if (= 'window window-status)
      (iconify-window)
)))

;; sets entries in the window menu

(## 0 window-pop-items 
  '(multi-item-make 
    ("Group" (iconify-all-windows))
    ("Iconify" (iconify-window)) 
    ("Others" (iconify-other-windows))
))
