Here's a slightly upgraded version of bbdb-screen.el. It adds the
ability to toggle the separate screen functionality by typing a "T" in
the *BBDB* buffer. The code is also a bit cleaner.

Anyway, enjoy :-)

Feedback is appreciated.

8<-----------8<-----------8<-----------8<-----------8<-----------
;;
;; Author: Michael D. Carney 
;; Module: bbdb-screen.el
;; Version: 1.0
;; Created: Jan 19, 1995
;; Description:
;;     Puts the *BBDB* buffer into a separate screen and uses that screen to
;;     display the *BBDB* buffer whenever it needs to.
;;

(require 'advice)

(defvar bbdb-screen-parameter-alist nil
 "*Alist of screen parameters used for creating the BBDB screen.")

(defvar bbdb-screen nil)

(defvar bbdb-screen-name "BBDB"
  "Used to name the screen that holds the *BBDB* buffer")

(defun bbdb-resolve (var arg)
 (if (or (and (symbolp var) (fboundp var))
         (and (listp var) (eq (car var) 'lambda)))
     (funcall var arg)
   var))

(defvar bbdb-separate-screen t
  "If true, then put the *BBDB* buffer in its own screen")

(defun bbdb-toggle-separate-screen (&optional onoff)
  "Toggle the separate screen functionality."
  (interactive "P")
  (setq bbdb-separate-screen (if onoff
                                 (> (if (numberp onoff) onoff
                                      (prefix-numeric-value onoff))
                                    0)
                               (not bbdb-separate-screen)))
  (if bbdb-separate-screen
      (progn
        (define-key bbdb-mode-map "q" 'bbdb-iconify))
    (if bbdb-screen
        (progn
          (delete-screen bbdb-screen)
          (setq bbdb-screen nil)))
    (define-key bbdb-mode-map "q" 'bbdb-bury-buffer)))

(defun bbdb-select-screen ()
 "Create and/or select and raise the BBDB screen for the *BBDB* buffer."
 (interactive)
 (if bbdb-separate-screen
     (let* ((fname (expand-file-name bbdb-file))
            (new-screen (not (screen-live-p bbdb-screen))))
       (if new-screen
           (setq bbdb-screen (make-screen
                              (append (bbdb-resolve bbdb-screen-parameter-alist
                                                    (file-name-nondirectory fname))
                                      (list (cons 'name bbdb-screen-name))))))
       (select-screen bbdb-screen)
       (make-screen-visible bbdb-screen)
       (switch-to-buffer bbdb-buffer-name)
       (raise-screen bbdb-screen)
       )))

(defadvice bbdb-display-records-1 (before
                                   screen-bbdb-activate
                                   first
                                   activate)
  "BBDB is started inside its own screen (bbdb-screen)."
  (bbdb-select-screen))

(defun bbdb-iconify ()
  "Saves the current folder and iconifies the current frame."
  (interactive)
  (bbdb-save-db)
  (and (screen-live-p (selected-screen))
       (iconify-screen (selected-screen))))

(setq bbdb-screen-parameter-alist '((width . 80)
                                    (height . 20)
                                    (left . 100)
                                    (top . 100)))


(define-key bbdb-mode-map "T" 'bbdb-toggle-separate-screen)

(bbdb-toggle-separate-screen 1)
(provide 'bbdb-screen)
;; end bbdb-screen.el
8<-----------8<-----------8<-----------8<-----------8<-----------


        Mike

Reply via email to