; Anders Hoslt virtual screen package loader for the standard profile
; ===================================================================

;;Author: colas@mirsa.inria.fr (Colas NAHABOO) -- Bull Research FRANCE
;;Revision: 1.0 -- June 28 1995

;; A wrapper to use Anders very nice virtual screen package in the 
;; standard profile
;; see virtual.gwm and virtual-door.gwm for complete options

;; here is an example of use in your .profile.gwm:

;; (setq std-virtual.doors '(
;;     ("Home" screen-background)
;;     ("Comp" "LightBlue3")
;;     ("Mail" 
;;       (pixmap-make (color-make "seagreen3") "grainy" (color-make "seagreen2"))
;;       background (color-make "seagreen3"))    
;;     ("WWW" lightgrey door-icon (pixmap-load "netscape-small.xpm"))
;;     ("Text" "LightYellow3")
;;     ("Games" grey)
;; ))
;; 
;; (load "std-virtual.gwm")


;;=============================================================================
;;                    cosmetic changes, can be overriden before load
;;=============================================================================

(if (not (boundp 'frame3d-win)) (load "frame-win"))
(set-window Gwm.menu.door-mgr frame3d-win)
(set-window Gwm.menu.virtual frame3d-win)

(defvar door-borderwidth 1)
(defvar door-mgr-no-outer-border t)
(defvar show-virtual t)
(defvar std-virtual.menupos 5)
(defvar std-virtual.windowmenupos 5)
(defvar std-virtual.iconmenupos 0)
(defvar lightgrey (color-make "LightGrey"))
(defvar door-background lightgrey)
(defvar virtual-background (color-make "grey90"))
(defvar initial-doors ())
(defvar std-virtual.doors '("Home" "Free"))
(defvar virtual-horizontal-step screen-width)
(defvar virtual-vertical-step screen-height)

(defvar door-mgr-xpos (- screen-width 250))
(defvar door-mgr-ypos (- screen-height 
    (+ 16 (* 16 (/ (+ 1 (length std-virtual.doors)) 2)))))

(defvar virtual-pixsize 181)
(defvar virtual-xpos door-mgr-xpos)
(defvar virtual-ypos (- door-mgr-ypos (+ virtual-pixsize 16)))

;;=============================================================================
;;                    behaviors
;;=============================================================================
;; a change: button 2 (action) on icon de-iconifies and follows the window

(: icon-behavior
  (state-make
    (on (buttonrelease action-button any)
      (with (deiconified-win window-window)
	(std-iconify-window)
	(setq window window-window)
	(virtual-make-window-visible)
))))

(reparse-standard-behaviors)

(de de-iconify-window-in-current-room ()
  (with (win window-window
      x 0 y 0
    )
    (std-iconify-window)
    (setq window win)
    (setq x (% window-x screen-width))
    (setq y (% window-y screen-height))
    (if (< x 0) (setq x (+ x screen-width)))
    (if (< y 0) (setq y (+ y screen-height)))
    (move-window x y)
))

;;=============================================================================
;;                    menu entries
;;=============================================================================

;; add entries in the root, window, icon menus
;; root: entry to toggle global map
;; window: nail/un-nail virtual window
;; icon: an entry to de-iconify in this room

(if (not (boundp 'std-virtual.menu-added)) (progn
    (setq std-virtual.menu-added t)
    
    (insert-at '(multi-item-make
	("Virtual Map On" (progn (setq show-virtual t) (virtual-show)))
	("Off" (progn (setq show-virtual ()) (virtual-show)))
      )
      root-pop-items
      std-virtual.menupos
    )
    (insert-at '(multi-item-make
	"Virtual" ()
	("Pick" (progn
	    (if (virtual-nailed) () (virtual-nail))
	    (if virtual-omit-nailed (virtual-update))
	))
	("Drop" (progn
	    (if (virtual-nailed) (virtual-unnail))
	    (if virtual-omit-nailed (virtual-update))
	))
      )
      window-pop-items
      std-virtual.windowmenupos
    )
    (insert-at '(item-make "de-icon here" (de-iconify-window-in-current-room))
      icon-pop-items
      std-virtual.iconmenupos
    )
))

;;=============================================================================
;;                    load the packages themselves
;;=============================================================================

(load "load-virtual.gwm")
(load "virtual-action.gwm")
(load "pick.gwm")

;;=============================================================================
;;                    door manager
;;=============================================================================

;; then create the defaults doors specified in std-virtual.doors

(for doorname std-virtual.doors
  (with (context '() name doorname)
    (if (= (type doorname) 'list) (progn
	(setq color (eval (# 1 doorname)))
	(setq name (# 0 doorname))
	(if color
	  (if (= (type color) 'number) 
	    ()				;already a color
	    (= (type color) 'pixmap)	;a tile
	    (setq context (+ (list
		  'tile color
		) context	 
	    ))
	    (setq color (color-make color)) ;default
	))
	(setq context (+ 
	    (if (= (type color) 'pixmap) () (list 'background color))
	    context)
	)
	(setq context (+ context (sublist 2 (length doorname) doorname)))
	(setq door-context (+ (list (atom name) context) door-context))
        (setq screen-opening (+ screen-opening (list 
              (list 'std-virtual.add-door name 
                    (list 'list ''door-set-background color))))))
      (setq screen-opening (+ screen-opening (list 
              (list 'add-door name)))))
))


(defun door-set-background (color)
  (with (wob root-window) 
    (if color 
      (if (= (type color) 'pixmap)
	(setq wob-tile color)
	(setq wob-background color))
)))

(defun std-virtual.add-door (name action)
  (with (position (add-door name))
    (virtual-action-add position action)
  )
)
