1 ;;; xwem-register.el --- Registers support for XWEM.
3 ;; Copyright (C) 2004,2005 by XWEM Org.
5 ;; Author: Zajcev Evgeny <zevlg@yandex.ru>
6 ;; Created: Fri Feb 6 08:04:24 MSK 2004
8 ;; X-CVS: $Id: xwem-register.el,v 1.8 2005-04-04 19:54:15 lg Exp $
10 ;; This file is part of XWEM.
12 ;; XWEM is free software; you can redistribute it and/or modify it
13 ;; under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 2, or (at your option)
17 ;; XWEM is distributed in the hope that it will be useful, but WITHOUT
18 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
20 ;; License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with XEmacs; see the file COPYING. If not, write to the Free
24 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 ;;; Synched up with: Not in FSF
31 ;; Just like `register' packege for Emacs, but for XWEM.
33 ;; To start using it add:
35 ;; (require 'xwem-register)
36 ;; (xwem-register-install-bindings)
38 ;; to your xwemrc. That will add bonus bindings to `xwem-global-map',
39 ;; such as `H-x 6' to store current window configuration to register,
40 ;; `H-x /' to store current client to register and `H-x j' to jump to
41 ;; register, i.e. set saved window config or pop to saved client, and
44 ;; Idea about automatic registers belongs to Steve Youngs
45 ;; <steve@youngs.au.com>.
53 ;;; Customisation, note: uses `xwem-misc' group
54 (defgroup xwem-registers nil
55 "Group to customize xwem registers behaviour."
56 :prefix "xwem-registers-"
59 (defcustom xwem-registers-frame-config-no-delete t
60 "This valued passed as NO-DELETE argument to `xwem-set-frame-configuration'."
62 :group 'xwem-registers)
64 (defcustom xwem-registers-win-config-select-frame t
65 "*Non-nil mean, when jumping to window configuration also select
66 frame for which config was generated. Directly passed as
67 SELECT-FRAME-P to `xwem-set-window-configuration'."
69 :group 'xwem-registers)
71 (defcustom xwem-registers-auto-registers
72 '((?x (application "xemacs")))
73 "*List of automatic registers.
77 (setq xwem-registers-auto-registers
78 '((?x (application \"xemacs\"))
79 (?m (application \"mozilla\"))))
81 :type '(repeat (cons (character :tag "Register")
82 (sexp :tag "Match expression")))
83 :group 'xwem-registers)
85 (defcustom xwem-registers-auto-override nil
86 "*Non-nil mean when autoregister matches and such register already
87 exists it would override it with new value."
89 :group 'xwem-registers)
91 ;;; Internal variables
93 (defvar xwem-registers nil
94 "XWEM registers alist.
95 Each element in form (NAME . VALUE), one for each register.
96 NAME is a character. VALUE is a string, number, client or a list.
97 A list in form (XWEM-WIN-CONFIG CONFIG) represent a window
100 (defun xwem-register-set (register value)
101 "Set contents of XWEM register named REGISTER to VALUE.
102 Return VALUE, see documentation for `xwem-registers' for possible VALUE."
104 (put-alist register value xwem-registers)))
106 (defun xwem-register-get (reg)
107 "Return contents of XWEM register named REG, or nil if none."
108 (cdr (assq reg xwem-registers)))
110 (defun xwem-register-del (reg)
111 "Delete REG from registers list."
112 (setq xwem-registers (remassq reg xwem-registers)))
114 (defun xwem-register-del-by-value (type value)
115 "Remove all register of TYPE which has VALUE."
117 (when (and (eq (car (cdr r)) type)
118 (eq (cadr (cdr r)) value))
119 (xwem-register-del (car r))))
122 ;;;###autoload(autoload 'xwem-register-client "xwem-register" "" t)
123 (define-xwem-command xwem-register-client (register)
124 "Store selected client to REGISTER."
125 (xwem-interactive "kClient to register: ")
126 (xwem-client-set-property (xwem-cl-selected) 'register (event-key register)))
128 ;;;###autoload(autoload 'xwem-register-win-config "xwem-register" "" t)
129 (define-xwem-command xwem-register-win-config (register)
130 "Store window configuration in REGISTER."
131 (xwem-interactive "kWindow Configuration to register: ")
133 (let ((reg (event-key register)))
134 (xwem-register-set reg (list 'XWEM-WIN-CONFIG
135 (xwem-window-configuration)))))
137 ;;;###autoload(autoload 'xwem-register-frame-config "xwem-register" "" t)
138 (define-xwem-command xwem-register-frame-config (register)
139 "Store frame configuration to REGISTER."
140 (xwem-interactive "kFrame Configuration to register: ")
142 (let ((reg (event-key register)))
143 (xwem-register-set reg (list 'XWEM-FRAME-CONFIG
144 (xwem-frame-configuration)))))
146 ;;;###autoload(autoload 'xwem-register-jump "xwem-register" "" t)
147 (define-xwem-command xwem-register-jump (register &optional arg)
149 If prefix ARG is supplied remove REGISTER from `xwem-registers' alist."
150 (xwem-interactive "kJump to register: \nP")
152 (let ((reg (event-key register))
155 (xwem-register-del reg)
157 ;; Jump to REGISTER value
158 (setq rval (xwem-register-get reg))
159 (cond ((and (listp rval)
160 (eq 'XWEM-CLIENT (car rval))
161 (xwem-cl-p (cadr rval)))
162 (xwem-cl-pop-to-client (cadr rval)))
164 ((and (listp rval) (eq 'XWEM-WIN-CONFIG (car rval)))
165 (xwem-set-window-configuration
166 (cadr rval) xwem-registers-win-config-select-frame))
168 ((and (listp rval) (eq 'XWEM-FRAME-CONFIG (car rval)))
169 (xwem-set-frame-configuration
170 (cadr rval) xwem-registers-frame-config-no-delete))
172 (t (xwem-message 'todo "Hanle register value: %S" rval)))
175 ;;;###xwem-autoload(autoload 'xwem-registers-help "xwem-registers" nil "Show info about registers.")
176 (define-xwem-command xwem-registers-list ()
177 "Show info about registers."
180 (xwem-help-display "registers"
181 (insert "Registers:\n\n")
183 (insert (format " '%c' - " (car r)))
184 (let ((rval (cdr r)))
185 (cond ((and (listp rval) (eq 'XWEM-CLIENT (car rval)))
187 (let ((cl (cadr rval)))
188 (insert (format " / %s" (if (xwem-cl-alive-p cl)
190 (when (xwem-cl-alive-p cl)
192 (insert (xwem-client-name cl)))))
193 ((and (listp rval) (eq 'XWEM-WIN-CONFIG (car rval)))
194 (insert "WIN-CONFIG")
195 (let ((frame (xwem-win-config-frame (cadr rval))))
196 (insert (format " / %s" (if (xwem-frame-alive-p frame)
198 (when (if (xwem-frame-alive-p frame) "alive" "dead")
199 (insert (format " / [%d] " (xwem-frame-num frame)))
200 (insert (xwem-frame-name frame)))))
206 (defun xwem-registers-remove-client (cl)
207 "CL is dead, so remove it frome registers."
208 (xwem-register-del-by-value 'XWEM-CLIENT cl))
210 (defun xwem-registers-auto-register (cl)
211 "Put CL to register according to "
212 (let ((r (car (xwem-manda-find-match-1
213 cl xwem-registers-auto-registers 'cdr))))
214 (when (and r (or xwem-registers-auto-override
215 (not (xwem-register-get r))))
216 (xwem-register-set r (list 'XWEM-CLIENT cl)))))
219 ;;; Register as client property
220 (defun xwem-client-set-register (cl rprop reg)
221 "Set CL's register property RPROP to REG."
222 ;; Remove REG from any other clients
223 (mapc #'(lambda (ocl)
224 (when (eq reg (xwem-cl-get-prop ocl rprop))
225 (xwem-cl-rem-prop ocl rprop)))
228 ;; Save it in CL's plist
229 (xwem-cl-put-prop cl rprop reg)
231 ;; And finally register REG
233 (xwem-register-set reg (list 'XWEM-CLIENT cl))))
235 (define-xwem-client-property register nil
238 :set 'xwem-client-set-register)
241 (provide 'xwem-register)
244 (add-hook 'xwem-cl-create-hook 'xwem-registers-auto-register)
245 (add-hook 'xwem-cl-destroy-hook 'xwem-registers-remove-client)
247 ;;; xwem-register.el ends here