Generic_Window_Manager/data/dir-focus.gwm

81 lines
2.3 KiB
Plaintext

;; dir-focus.gwm -- moves the focus to the closest window in a given direction
;;
;; Author: Teemu Hirsimaki <thirsima@cc.hut.fi>
;; Last change: 8 Nov 1998
;;
;; The function is "(focus-dir DIR)" where DIR is 'north, 'east,
;; 'south or 'west. It searches the closest window in the given
;; direction and sets focus in it. The variable dir-skip-list
;; specifies regular expressions for windows to ignore.
(defaults-to
dir-skip-list '(
"^panlist$" "^virtual$" "^door-mgr$" "load$" "lock$" "^Gwm$")
)
(defun abs (x)
(if (< x 0) (- x) x)
)
;; Score function
(defun dir-score-function (distance offset)
(if (< distance 1)
0
(+ (/ (* 1000 (abs offset)) distance) distance)
)))
;; Calculates a score for a window. The smaller the better.
(defun dir-calculate-score (cur dir)
(with (win-x (+ window-x (/ window-width 2)) win-y window-y)
(with (window cur)
(with (cur-x (+ window-x (/ window-width 2)) cur-y window-y)
(cond
((= dir 'north)
(dir-score-function (- cur-y win-y) (- cur-x win-x))
)
((= dir 'south)
(dir-score-function (- win-y cur-y) (- cur-x win-x))
)
((= dir 'east)
(dir-score-function (- win-x cur-x) (- cur-y win-y))
)
((= dir 'west)
(dir-score-function (- cur-x win-x) (- cur-y win-y))
))))))
;; Checks if the window is in dir-skip-list
(defun dir-legal-window ()
(tag return
(for exp dir-skip-list
(if (match exp window-name)
(exit return ())
))
t
))
;; Moves focus to the closest window in the given direction
(defun dir-focus (dir)
(with (cur window best-score 0 best-win ())
(for window (list-of-windows 'mapped 'window)
(if (dir-legal-window)
(with (score (dir-calculate-score cur dir))
(if
(and (> score 0)
(or (< score best-score)
(= best-win ())))
(progn
(setq best-score score)
(setq best-win window)))))
)
(if (not (= best-win ()))
(with (window best-win)
(if (boundp 'virtual-make-window-visible)
(virtual-make-window-visible))
(warp-pointer (/ window-width 2) 2 best-win)
(process-events)
(set-focus best-win)
))))
;; end of file