Generic_Window_Manager/data/up-door.gwm

120 lines
4.1 KiB
Plaintext

;; up-door.gwm
;; Contributed by Ulrich Pfeifer
;;
;; I'll append some functions I currently use with virtual doors. A
;; problem is that the menus are not updated if you add doos later.
;; Maybe add-door and remove door should call hook's? The other know
;; problem is that moving windows to some room automatically (this way)
;; works only if gwm is running before the application starts.
;; Example code to put in .profile.gwm
;
;(set-icon-placement any rows.right-top.placement) ; place most icons on right
;
;; Place the NNML server window always to room 'Mail'
;(set-placement XTerm.xterm.NNML
; '(lambda (foo) (up-door-place "Mail")))
;; Place all Emacs windows in the current room at the standard posistion
;; Resize to 'A4'
;(set-placement Emacs.emacs
; '(lambda (foo) (up-door-place ()) (up-door-a4)))
;; Place all Netscape windows in room "WWW" at the standard posistion
;; Resize to 'A4' size
;(set-placement Netscape.Navigator
; (lambda (foo) (up-door-place "WWW") (up-door-a4)))
;; List of x-positions to use next for all virtual rooms
(setq up-door-x-pos ())
;; Get the next x-position for room nr
(defun up-door-next-xpos (nr)
(with (pos (or (# nr up-door-x-pos) 0))
(setq up-door-x-pos
(# nr up-door-x-pos (+ 30 pos)))
pos))
;; List the names of all virtual doors
(defun up-door-list ()
(mapfor desc std-virtual.doors (# 0 desc)))
;; Find the name of the current room
(defun up-current-door ()
(with (current-door ())
(for door (up-door-list)
(if (= (door-virt-coord (door-find-name door))
(mapfor i virt-pos (- 0 i)))
(setq current-door door)))
current-door))
;; Place window in room named door to next position (n*30,0)
(defun up-door-place (door)
(with (nr (door-find-name (or door (up-current-door)))
vp (if nr (door-virt-coord nr) '(0 0))
x (+ (# 0 vp) (up-door-next-xpos nr) (# 0 virt-pos))
y (+ (# 1 vp) (# 1 virt-pos)))
(move-window x y)))
;; Resize window to full screen height.
;; Choose width so that the window looks like an a4 paper
(defun up-door-a4 ()
(resize-window (/ (* screen-height 46) 59) screen-height)) ; !42
;; Move current window to room named door. Don't change virtual position
(defun up-move-to-door (door)
(with (nr (door-find-name door)
vp (door-virt-coord nr)
x (+ window-x (# 0 vp) (# 0 virt-pos))
y (+ window-y (# 1 vp) (# 1 virt-pos)))
;(? "moveto " x "," y "\n")
(move-window x y)))
;; Emergency: move all windows to current room
(defun up-map-all ()
(for window (list-of-windows 'window)
(with (x window-x
y window-y)
(while (< x 0)
(setq x (+ x screen-width)))
(while (> x (- screen-width 1))
(setq x (- x screen-width)))
(while (< y 0)
(setq y (+ y screen-height)))
(while (> y (- screen-height 1))
(setq y (- y screen-height)))
(move-window x y)
(map-window)
(raise-window)
)))
;; One row of doors
;;(insert-at (+ (list 'multi-item-make "Door" ())
;; (mapfor door (up-door-list)
;; (list door (list 'up-move-to-door door))))
;; window-pop-items
;; 6 ; std-virtual.windowmenupos
;; )
;; Split the door list in two parts so that the menu will not too wide
(with (door-list (up-door-list)
half (/ (length door-list) 2)
left (sublist 0 half door-list)
right (sublist half (length door-list) door-list))
(insert-at (+ (list 'multi-item-make "Move" ())
(mapfor door left
(list door (list 'up-move-to-door door))))
window-pop-items 6)
(insert-at (+ (list 'multi-item-make "Door" ())
(mapfor door right
(list door (list 'up-move-to-door door))))
window-pop-items 7
))
(insert-at
'(item-make
"Map all" (up-map-all)
)
root-pop-items
11
)