Generic_Window_Manager/data/virtual-action.gwm

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))))))