Generic_Window_Manager/data/std-func.gwm

261 lines
6.9 KiB
Plaintext

;; std-func.gwm --- Standard functions used by most GWM profiles
;;
;; ---------------------------------------------------------------------
;;
;; Note from Anders Holst (aho@sans.kth.se):
;; This file is not really written by me, I just cut it out from
;; ".profile.gwm" since its functions are used by most profiles, and
;; its a pity to duplicate. I use it for the VTWM profile.
;;
;;=============================================================================
;; X resource management for the standard profile
;;=============================================================================
;;
(defun std-resource-get args
(with (resource-class (# 0 args) resource-name (# 1 args) Name () Class ())
(: Name (+ -screen-name '.
window-client-class '.
(make-string-usable-for-resource-key-non-nil window-client-name) '.
(make-string-usable-for-resource-key-non-nil window-name) '.
screen-type '.
window-machine-name '.
(if resource-name resource-name resource-class)
))
(: Class (+ "S.any.any.any.any.any.any" resource-class))
(resource-get Name Class)
))
;; puts resource:
;; (std-resource-put resource-name
;; [screen-type] clientclass[name[windnowname[machine]]]]
;; value)
(defun std-resource-put (Resource args)
(with (Client-desc () Value () Screen () Name ())
(if (= 3 (length args))
(progn
(: Client-desc (# 1 args))
(: Value (# 2 args))
(: Screen (# 0 args))
)
(progn
(: Client-desc (# 0 args))
(: Value (# 1 args))
))
(: Name (std-resource-expand Client-desc Screen Resource))
;; (? "resource-put " Name " " Value "\n")
(resource-put Name Value)
))
;; expands class[.name[.wname[.machine]]] visual Resource
;; into ScreenNumber.class.name.wname.visual.machine.Resource
(defun std-resource-expand (desc visual resource)
(if (match "[*]" desc)
(+ -screen-name
(if (match "^[*]" desc) () '.)
desc
(if (match "[*]$" desc) () '.)
resource)
(with (tmp (match
"^\\([^.]*\\)[.]*\\([^.]*\\)[.]*\\([^.]*\\)[.]*\\([^.]*\\)$"
desc 1 2 3 4
))
(make-resource-string -screen-name (# 0 tmp) (# 1 tmp) (# 2 tmp)
visual (# 3 tmp) 'any resource
))))
;; appends list elements with '.', collapsing consecutive void (or any)
;; elements into *
(defun make-resource-string l
(with (star () first t l2
(mapfor elt l
(if (or (= "any" elt) (not elt))
(if star
""
(progn
(setq star t)
"*"
)
)
(progn
(setq star ())
(if first (progn (setq first ()) elt)
(+ "." elt)
)))))
(eval (+ '(+) l2))
))
;(trace-func std-resource-put)
;; customisation of decos by context
;; (customize deco screen application context...)
(defun customize-usage (string)
(? "USAGE: (customize deco screen application context...),\n"
"error was: " string "\n"
(exit customize)
))
(defunq customize args
(tag customize
(with (Deco (# 0 args)
Screen (# 1 args)
Application (# 2 args)
Context (if (and (= 4 (length args)) (= 'list (type (# 3 args))))
(# 3 args)
(sublist 3 (length args) args)
)
l (length Context)
i 1
)
(while (< i l)
(## i Context (eval (# i Context)))
(setq i (+ 2 i))
)
(std-resource-put Deco (list Screen Application Context))
)))
;; recursively evaluates till we obtain a context
(defun get-context (name)
(do-get-context name 0)
)
(defun do-get-context (name level)
(if (> level max-autoload-evaluation) name
(progn
(setq name
(if (# (type name) string-types)
(progn ; atoms:
(if (= 'string (type name))
(: name (atom name))) ; string->atom to test if defined
(if (boundp name)
(eval name) ; defined: eval
(progn
(load name) ; undefined, load and returns itself
name
)))
(# (type name) func-types) ; function: called without args
(eval (list name))
(= (type name) 'list)
(if (= (% (length name) 2) 0) ; if even list, its a context
name
(= 1 (length name)) ; if one element, return it
(# 0 name)
(eval name) ; if odd list, eval
)
(eval name) ; others: eval
))
(if (or (not name)
(and (= (type name) 'list)(= (% (length name) 2) 0)))
name
(do-get-context name (+ 1 level)
)))))
;;=============================================================================
;; user-callable resource settings
;;=============================================================================
(defname '-screen-name screen.)
(for screen (list-of-screens)
(: -screen-name (+ "S" (itoa screen)))
(std-resource-put 'GwmWindow (list screen-type ()))
(std-resource-put 'GwmIconWindow (list screen-type ()))
(std-resource-put 'GwmIconPixmap (list screen-type ()))
(std-resource-put 'GwmPlacement (list screen-type ()))
(std-resource-put 'GwmIconPlacement (list screen-type ()))
)
(: string-types '(string t atom t pointer t active t))
(: func-types '(expr t fexpr t subr t fsubr t))
(setq max-autoload-evaluation 10)
;(defun autoload-description (name)
; (with (level 0)
; (do-autoload-description name level)
;))
;; recursively evaluates or load description to obtain a wl_client
(defun do-autoload-description (name level)
(if (> level max-autoload-evaluation) name
(progn
(setq name
(if (# (type name) string-types)
(progn ; atoms:
(if (= 'string (type name))
(: name (atom name))) ; string->atom to test if defined
(if (boundp name)
(eval name) ; defined: eval
(progn
(load name) ; undefined, load and returns itself
name
)))
(# (type name) func-types) ; function: called without args
(eval (list name))
(eval name) ; others: evalb
))
(if (= 'client (type name)) name
(do-autoload-description name (+ 1 level)
))))))
(defun autoload-description (name)
(do-autoload-description name 0)
)
(defunq set-window args (std-resource-put 'GwmWindow args))
(defunq set-icon-window args (std-resource-put 'GwmIconWindow args))
(defunq set-icon args
(## (- (length args) 1) args (expand-pixmap (# (- (length args) 1) args)))
(std-resource-put 'GwmIconPixmap args)
)
(defun expand-pixmap (obj)
(if (and obj (# (type obj) string-types))
(pixmap-make obj)
(eval obj)))
(defunq set-placement args (std-resource-put 'GwmPlacement args))
(defunq set-icon-placement args (std-resource-put 'GwmIconPlacement args))
; per-screen data setting
; =======================
(defunq defname-in-screen-to args
(with (value (eval (# 0 args))
vars (sublist 1 (length args) args))
(for var vars
(defname var screen. value))))
(defunq set-color (name value)
(if (not (= screen. (namespace-of name)))
(progn
(defname name screen.)
(for screen (list-of-screens)
(set name (color-make value)))
)))
(defunq set-pixmap args
(with (name (# 0 args)
pixmap-make-call (# 0 args 'pixmap-make))
(if (not (= screen. (namespace-of name)))
(progn
(defname name screen.)
(for screen (list-of-screens)
(set name (eval pixmap-make-call)))
))))