]> gitweb.factorcode.org Git - factor.git/commitdiff
FUEL: Better handling of popup windows (q goes back to original).
authorJose A. Ortega Ruiz <jao@gnu.org>
Sun, 21 Dec 2008 15:04:39 +0000 (16:04 +0100)
committerJose A. Ortega Ruiz <jao@gnu.org>
Sun, 21 Dec 2008 15:04:39 +0000 (16:04 +0100)
misc/fuel/fuel-debug.el
misc/fuel/fuel-help.el
misc/fuel/fuel-popup.el [new file with mode: 0644]
misc/fuel/fuel-xref.el

index 46c1f74f0f0fe3ef482db89db48edcbf8a726638..91811f62c2a24625d3963ac4b7edb7594fcc9567 100644 (file)
 
 ;;; Code:
 
-(require 'fuel-base)
 (require 'fuel-eval)
+(require 'fuel-popup)
 (require 'fuel-font-lock)
+(require 'fuel-base)
 
 \f
 ;;; Customization:
@@ -82,7 +83,8 @@
 \f
 ;;; 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))
 (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))
       (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)
index 6f232754bb6036b550474bc01f18c38b85ea0f89..ac57954360404bf4b32e0ae987e7996136b32e10 100644 (file)
@@ -18,6 +18,7 @@
 (require 'fuel-autodoc)
 (require 'fuel-completion)
 (require 'fuel-font-lock)
+(require 'fuel-popup)
 (require 'fuel-base)
 
 \f
 \f
 ;;; 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)
 
       (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)
         (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))
 
 \f
diff --git a/misc/fuel/fuel-popup.el b/misc/fuel/fuel-popup.el
new file mode 100644 (file)
index 0000000..8cccc44
--- /dev/null
@@ -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 <jao@gnu.org>
+;; 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)
+\f
+(provide 'fuel-popup)
+;;; fuel-popup.el ends here
index 3f020132904ceb14c18d3605731653471d3b0e58..8027aa4e62b46162b009dd205d3c2829b4c30d37 100644 (file)
 \f
 ;;; 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)))
 
 \f
 ;;; Xref mode: