102 lines
3.8 KiB
Plaintext
102 lines
3.8 KiB
Plaintext
;; virtual-action.gwm --- "Active spots" on the Virtual Screen
|
|
;;
|
|
;; Author: Anders Holst (aho@sans.kth.se)
|
|
;; Copyright (C) 1995 Anders Holst
|
|
;; Version: virtual-1.0
|
|
;; Last change: 11/7 1995
|
|
;;
|
|
;; This file is copyrighted under the same terms as the rest of GWM
|
|
;; (see the X Inc license for details). There is no warranty that it
|
|
;; works.
|
|
;;
|
|
;; ---------------------------------------------------------------------
|
|
;;
|
|
;; This file implements "active spots" on the virtual screen, ie.
|
|
;; positions associated with actions that are run whenever the user
|
|
;; moves to (or from) such a position. Can be used for example to
|
|
;; implement different background colors at different places on the
|
|
;; virtual screen.
|
|
;;
|
|
;; There are no user customizable variables. Use 'virtual-action-add'
|
|
;; and 'virtual-action-remove' to add and remove actions.
|
|
;;
|
|
;; The call '(virtual-action-add POS ACTION1 [ACTION2] )' adds to
|
|
;; position POS (as returned from 'add-door' for example) the arrival
|
|
;; action ACTION1 and the (optional) leave action ACTION2.
|
|
;; You may add more actions to the same position with several calls to
|
|
;; 'virtual-action-add'.
|
|
;;
|
|
;; The call '(virtual-action-remove POS)' removes *all* actions (both
|
|
;; arrival and leave ones) associated with position POS.
|
|
;;
|
|
|
|
(declare-screen-dependent
|
|
virtual-active-spot-list
|
|
)
|
|
|
|
(for screen (list-of-screens)
|
|
(setq virtual-active-spot-list ())
|
|
)
|
|
|
|
;; Redefinition, to call active spot stuff
|
|
(defun virtual-move-windows (deltax deltay)
|
|
;; Moves windows by deltax and deltay adjusting virt-pos
|
|
;; appropriately
|
|
(virtual-action-execute ())
|
|
(with (move-window-func (if (boundp 'move-window-orig)
|
|
move-window-orig ; to work with vtwm profile
|
|
move-window))
|
|
(for wob (virt-movable)
|
|
(move-window-func (+ window-x deltax) (+ window-y deltay))))
|
|
(with (x (# 0 virt-pos) y (# 1 virt-pos))
|
|
(setq virt-pos (list (+ x deltax) (+ y deltay))))
|
|
(virtual-action-execute t)
|
|
(virtual-update))
|
|
|
|
;; Adds new arrive and leave actions to a position
|
|
(defun virtual-action-add args
|
|
(with (vpos (list (- (# 0 (# 0 args))) (- (# 1 (# 0 args))))
|
|
action1 (# 1 args)
|
|
action2 (# 2 args)
|
|
ind (member vpos virtual-active-spot-list)
|
|
ele1 (if ind (# (+ 1 ind) virtual-active-spot-list))
|
|
ele2 (if ind (# (+ 2 ind) virtual-active-spot-list)))
|
|
(if (and ind (= (% ind 3) 0))
|
|
(progn
|
|
(if action1
|
|
(## (+ 1 ind) virtual-active-spot-list
|
|
(if (not ele1)
|
|
action1
|
|
(and (eq (type ele1) 'list)
|
|
(eq (# 0 ele1) 'progn))
|
|
(+ ele1 (list action1))
|
|
(+ '(progn) (list ele1) (list action1)))))
|
|
(if action2
|
|
(## (+ 2 ind) virtual-active-spot-list
|
|
(if (not ele2)
|
|
action2
|
|
(and (eq (type ele2) 'list)
|
|
(eq (# 0 ele2) 'progn))
|
|
(+ ele2 (list action2))
|
|
(+ '(progn) (list ele2) (list action2))))))
|
|
(setq virtual-active-spot-list
|
|
(+ (list vpos action1 action2)
|
|
virtual-active-spot-list)))))
|
|
|
|
;; Removes *all* actions at a position
|
|
(defun virtual-action-remove (pos)
|
|
(with (vpos (list (- (# 0 pos)) (- (# 1 pos)))
|
|
ind (member vpos virtual-active-spot-list))
|
|
(if (and ind (= (% ind 3) 0))
|
|
(progn
|
|
(delete-nth (+ 2 ind) virtual-active-spot-list)
|
|
(delete-nth (+ 1 ind) virtual-active-spot-list)
|
|
(delete-nth ind virtual-active-spot-list)))))
|
|
|
|
(defun virtual-action-execute (arrive)
|
|
(with (ind (member virt-pos virtual-active-spot-list))
|
|
(if (and ind (= (% ind 3) 0))
|
|
(if arrive
|
|
(eval (# (+ 1 ind) virtual-active-spot-list))
|
|
(eval (# (+ 2 ind) virtual-active-spot-list))))))
|