From 4a3be107ae0c78e1b0f95cb90eda63af18ff4d36 Mon Sep 17 00:00:00 2001 From: "Jose A. Ortega Ruiz" Date: Sun, 21 Dec 2008 16:04:39 +0100 Subject: [PATCH] FUEL: Better handling of popup windows (q goes back to original). --- misc/fuel/fuel-debug.el | 15 ++++------- misc/fuel/fuel-help.el | 14 +++++----- misc/fuel/fuel-popup.el | 59 +++++++++++++++++++++++++++++++++++++++++ misc/fuel/fuel-xref.el | 23 +++++++--------- 4 files changed, 80 insertions(+), 31 deletions(-) create mode 100644 misc/fuel/fuel-popup.el diff --git a/misc/fuel/fuel-debug.el b/misc/fuel/fuel-debug.el index 46c1f74f0f..91811f62c2 100644 --- a/misc/fuel/fuel-debug.el +++ b/misc/fuel/fuel-debug.el @@ -14,9 +14,10 @@ ;;; Code: -(require 'fuel-base) (require 'fuel-eval) +(require 'fuel-popup) (require 'fuel-font-lock) +(require 'fuel-base) ;;; Customization: @@ -82,7 +83,8 @@ ;;; Debug buffer: -(defvar fuel-debug--buffer nil) +(fuel-popup--define fuel-debug--buffer + "*fuel debug*" 'fuel-debug-mode) (make-variable-buffer-local (defvar fuel-debug--last-ret nil)) @@ -90,13 +92,6 @@ (make-variable-buffer-local (defvar fuel-debug--file nil)) -(defun fuel-debug--buffer () - (or (and (buffer-live-p fuel-debug--buffer) fuel-debug--buffer) - (with-current-buffer - (setq fuel-debug--buffer (get-buffer-create "*fuel dbg*")) - (fuel-debug-mode) - (current-buffer)))) - (defun fuel-debug--display-retort (ret &optional success-msg no-pop file) (let ((err (fuel-eval--retort-error ret)) (inhibit-read-only t)) @@ -120,7 +115,7 @@ (setq fuel-debug--file file) (goto-char (point-max)) (font-lock-fontify-buffer) - (when (and err (not no-pop)) (pop-to-buffer fuel-debug--buffer)) + (when (and err (not no-pop)) (fuel-popup--display)) (not err)))) (defun fuel-debug--display-output (ret) diff --git a/misc/fuel/fuel-help.el b/misc/fuel/fuel-help.el index 6f232754bb..ac57954360 100644 --- a/misc/fuel/fuel-help.el +++ b/misc/fuel/fuel-help.el @@ -18,6 +18,7 @@ (require 'fuel-autodoc) (require 'fuel-completion) (require 'fuel-font-lock) +(require 'fuel-popup) (require 'fuel-base) @@ -81,10 +82,9 @@ ;;; Fuel help buffer and internals: -(defun fuel-help--help-buffer () - (with-current-buffer (get-buffer-create "*fuel help*") - (fuel-help-mode) - (current-buffer))) +(fuel-popup--define fuel-help--buffer + "*fuel help*" 'fuel-help-mode) + (defvar fuel-help--prompt-history nil) @@ -111,7 +111,7 @@ (fuel-help--insert-contents def out)))) (defun fuel-help--insert-contents (def str &optional nopush) - (let ((hb (fuel-help--help-buffer)) + (let ((hb (fuel-help--buffer)) (inhibit-read-only t) (font-lock-verbose nil)) (set-buffer hb) @@ -124,7 +124,7 @@ (kill-region (point-min) (point)) (fuel-help--history-push (cons def (buffer-string))))) (set-buffer-modified-p nil) - (pop-to-buffer hb) + (fuel-popup--display) (goto-char (point-min)) (message "%s" def))) @@ -211,7 +211,6 @@ buffer." (let ((map (make-sparse-keymap))) (suppress-keymap map) (define-key map "\C-m" 'fuel-help) - (define-key map "q" 'bury-buffer) (define-key map "b" 'fuel-help-previous) (define-key map "f" 'fuel-help-next) (define-key map "l" 'fuel-help-previous) @@ -245,6 +244,7 @@ buffer." (fuel-autodoc-mode) (run-mode-hooks 'fuel-help-mode-hook) + (setq buffer-read-only t)) diff --git a/misc/fuel/fuel-popup.el b/misc/fuel/fuel-popup.el new file mode 100644 index 0000000000..8cccc44836 --- /dev/null +++ b/misc/fuel/fuel-popup.el @@ -0,0 +1,59 @@ +;;; fuel-popup.el -- popup windows + +;; Copyright (C) 2008 Jose Antonio Ortega Ruiz +;; See http://factorcode.org/license.txt for BSD license. + +;; Author: Jose Antonio Ortega Ruiz +;; Keywords: languages, fuel, factor +;; Start date: Sun Dec 21, 2008 14:37 + +;;; Comentary: + +;; A minor mode to pop up windows and restore configurations +;; afterwards. + +;;; Code: + +(make-variable-buffer-local + (defvar fuel-popup--created-window nil)) + +(make-variable-buffer-local + (defvar fuel-popup--selected-window nil)) + +(defun fuel-popup--display () + (let ((selected-window (selected-window)) + (buffer (current-buffer))) + (unless (eq selected-window (get-buffer-window buffer)) + (let ((windows)) + (walk-windows (lambda (w) (push w windows)) nil t) + (prog1 (pop-to-buffer buffer) + (set (make-local-variable 'fuel-popup--created-window) + (unless (memq (selected-window) windows) (selected-window))) + (set (make-local-variable 'fuel-popup--selected-window) + selected-window)))))) + +(defun fuel-popup--quit () + (interactive) + (let ((selected fuel-popup--selected-window) + (created fuel-popup--created-window)) + (bury-buffer) + (when (eq created (selected-window)) (delete-window created)) + (when (window-live-p selected) (select-window selected)))) + +(define-minor-mode fuel-popup-mode + "Mode for displaying read only stuff" + nil nil + '(("q" . fuel-popup--quit))) + +(defmacro fuel-popup--define (fun name mode) + `(defun ,fun () + (or (get-buffer ,name) + (with-current-buffer (get-buffer-create ,name) + (funcall ,mode) + (fuel-popup-mode) + (current-buffer))))) + +(put 'fuel-popup--define 'lisp-indent-function 1) + +(provide 'fuel-popup) +;;; fuel-popup.el ends here diff --git a/misc/fuel/fuel-xref.el b/misc/fuel/fuel-xref.el index 3f02013290..8027aa4e62 100644 --- a/misc/fuel/fuel-xref.el +++ b/misc/fuel/fuel-xref.el @@ -45,20 +45,14 @@ ;;; The xref buffer: -(defvar fuel-xref--buffer-name "*fuel xref*") - -(defun fuel-xref--get-buffer () - (let ((buffer (get-buffer fuel-xref--buffer-name))) - (or (and (buffer-live-p buffer) buffer) - (prog1 - (set-buffer (get-buffer-create fuel-xref--buffer-name)) - (fuel-xref-mode))))) +(fuel-popup--define fuel-xref--buffer + "*fuel xref*" 'fuel-xref-mode) (defvar fuel-xref--help-string "(Press RET or click to follow crossrefs)") (defun fuel-xref--fill-buffer (title refs) (let ((inhibit-read-only t)) - (with-current-buffer (fuel-xref--get-buffer) + (with-current-buffer (fuel-xref--buffer) (erase-buffer) (insert title "\n\n") (dolist (ref refs) @@ -74,7 +68,8 @@ (newline))) (when refs (insert "\n\n" fuel-xref--help-string "\n")) - (goto-char (point-min))))) + (goto-char (point-min)) + (current-buffer)))) (defun fuel-xref--show-callers (word) (let* ((cmd `(:fuel* (((:quote ,word) fuel-callers-xref)))) @@ -82,8 +77,8 @@ (title (format (if res "Callers of '%s':" "No callers found for '%s'") word))) - (fuel-xref--fill-buffer title res) - (pop-to-buffer (fuel-xref--get-buffer)))) + (set-buffer (fuel-xref--fill-buffer title res)) + (fuel-popup--display))) (defun fuel-xref--show-callees (word) (let* ((cmd `(:fuel* (((:quote ,word) fuel-callees-xref)))) @@ -91,8 +86,8 @@ (title (format (if res "Words called by '%s':" "No callees found for '%s'") word))) - (fuel-xref--fill-buffer title res) - (pop-to-buffer (fuel-xref--get-buffer)))) + (set-buffer (fuel-xref--fill-buffer title res)) + (fuel-popup--display))) ;;; Xref mode: