Generic_Window_Manager/data/fvwm-autoraise.gwm

78 lines
2.6 KiB
Plaintext

;; fvwm-autoraise - Delayed autoraise for fvwm-windows
;; Contributed by Bruno Daniel (daniel@fzi.de)
;;
;; I've changed the function maintain-focus-in in fvwm-window.gwm in order to
;; accomplish a real practical autoraise function:
;;
;; - autoraise-delay can be set. This prevents flickering of all the windows
;; on your desktop touched by the mouse when you move the mouse over the
;; screen.
;; - autoraise-delay is not performed for a window that has a smaller window
;; above it and inside its borders.
;; This avoids obscuring small windows, which is very likely to happen in the
;; autoraise-function of other window managers.
;;
;; Default value for autoraise-delay
(setq autoraise-delay 80)
;; Does window 1 contain window 2?
(defun window_contains (w1 w2)
(with (window w1
w1l window-x
w1t window-y
w1r (+ window-width w1l)
w1b (+ window-height w1t)
window w2
w2l window-x
w2t window-y
w2r (+ window-width w2l)
w2b (+ window-height w2t))
(and (< w1l w2l)
(< w1t w2t)
(> w1b w2b)
(> w1r w2r))))
(defun maintain-focus-in ()
(send-user-event 'focus-in window)
(## 'virt-col window (# 'virt-col2 window))
(## 'virt-act window t)
(if (boundp 'icon-mgr-focusin)
(icon-mgr-focusin))
(if (eval (boundp 'autoraise))
(progn
(with (etime (elapsed-time)
x0 (+ window-x)
x1 (+ window-x window-width)
y0 (+ window-y)
y1 (+ window-y window-height)
would_obscure_other_windows ()
above_current_window ())
(for w (list-of-windows 'stacking-order 'mapped)
;; Because the windows are sorted in stacking order (from
;; bottom to top), we can easily determine the state
;; above_current_window.
(if (= w window)
(: above_current_window t)
(if (and above_current_window
(window_contains window w))
(: would_obscure_other_windows t))))
(if (not would_obscure_other_windows)
(progn
;; Proceed after autoraise-delay
(while (< (- (elapsed-time) etime) autoraise-delay)
(process-events))
;; Is the mouse cursor still inside the original window?
(if (and (< x0 (# 0 (current-mouse-position)))
(> x1 (# 0 (current-mouse-position)))
(< y0 (# 1 (current-mouse-position)))
(> y1 (# 1 (current-mouse-position))))
;; If yes, raise the window.
(raise-window))))))
(if (and fvwm-virtual-colors
(boundp 'virtual-update)
(not (= (# 'virt-col1 window) (# 'virt-col2 window))))
(virtual-update)))
)