120 lines
4.1 KiB
Plaintext
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
|
|
)
|
|
|
|
|