diff lisp/progmodes/gdb-ui.el @ 60073:6fba1da8f37e

(gdb-find-file-unhook): New variable. (gdb-set-gud-minor-mode, gdb-set-gud-minor-mode-1) (gdb-set-gud-minor-mode-existing-buffers): New functions. (gdb-find-file-hook): New hook. Add it to find-file-hook. (gdb-info-breakpoints-custom, gdb-source-info): Simplify.
author Nick Roberts <nickrob@snap.net.nz>
date Tue, 15 Feb 2005 09:19:13 +0000
parents c2d7ae01e91d
children 106946a8423d
line wrap: on
line diff
--- a/lisp/progmodes/gdb-ui.el	Tue Feb 15 09:18:31 2005 +0000
+++ b/lisp/progmodes/gdb-ui.el	Tue Feb 15 09:19:13 2005 +0000
@@ -79,6 +79,8 @@
 (defvar gdb-overlay-arrow-position nil)
 (defvar gdb-server-prefix nil)
 (defvar gdb-flush-pending-output nil)
+(defvar gdb-location-list nil "List of directories for source files.")
+(defvar gdb-find-file-unhook nil)
 
 (defvar gdb-buffer-type nil
   "One of the symbols bound in `gdb-buffer-rules'.")
@@ -191,6 +193,35 @@
   :group 'gud
   :version "22.1")
 
+(defun gdb-set-gud-minor-mode (buffer)
+  "Set gud-minor-mode from find-file if appropriate."
+  (goto-char (point-min))
+  (unless (search-forward "No source file named " nil t)
+    (condition-case nil
+	(gdb-enqueue-input
+	 (list (concat gdb-server-prefix "info source\n")
+	       `(lambda () (gdb-set-gud-minor-mode-1 ,buffer))))
+      (error (setq gdb-find-file-unhook t)))))
+
+(defun gdb-set-gud-minor-mode-1 (buffer)
+  (goto-char (point-min))
+  (if (and (search-forward "Located in " nil t)
+	   (looking-at "\\S-*")
+	   (string-equal (buffer-file-name buffer)
+			 (match-string 0)))
+      (with-current-buffer buffer
+	(set (make-local-variable 'gud-minor-mode) 'gdba)
+	(set (make-local-variable 'tool-bar-map) gud-tool-bar-map))))
+
+(defun gdb-set-gud-minor-mode-existing-buffers ()
+  (dolist (buffer (buffer-list))
+    (let ((file (buffer-file-name buffer)))
+      (if file
+	(progn
+	  (gdb-enqueue-input
+	   (list (concat "list " (file-name-nondirectory file) ":1\n")
+		 `(lambda () (gdb-set-gud-minor-mode ,buffer)))))))))
+
 (defun gdb-ann3 ()
   (setq gdb-debug-log nil)
   (set (make-local-variable 'gud-minor-mode) 'gdba)
@@ -249,6 +280,7 @@
   (setq gdb-server-prefix "server ")
   (setq gdb-flush-pending-output nil)
   (setq gdb-location-list nil)
+  (setq gdb-find-file-unhook nil)
   ;;
   (setq gdb-buffer-type 'gdba)
   ;;
@@ -263,6 +295,7 @@
   (gdb-enqueue-input (list "server list MAIN__\n" 'ignore))   ; Fortran program
   (gdb-enqueue-input (list "server info source\n" 'gdb-source-info))
   ;;
+  (gdb-set-gud-minor-mode-existing-buffers)
   (run-hooks 'gdba-mode-hook))
 
 (defcustom gdb-use-colon-colon-notation nil
@@ -1048,8 +1081,6 @@
   ;; buffer specific functions
   gdb-info-breakpoints-custom)
 
-(defvar gdb-location-list nil "List of directories for source files.")
-
 (defconst breakpoint-xpm-data
   "/* XPM */
 static char *magick[] = {
@@ -1159,13 +1190,11 @@
 			   (setq file (cdr (assoc bptno gdb-location-list))))
 			(unless (string-equal file "File not found")
 			  (if file
-			      (with-current-buffer
-				  (find-file-noselect file)
-				(save-current-buffer
-				  (set (make-local-variable 'gud-minor-mode)
+			      (with-current-buffer (find-file-noselect file)
+				(set (make-local-variable 'gud-minor-mode)
 				     'gdba)
-				  (set (make-local-variable 'tool-bar-map)
-				       gud-tool-bar-map))
+				(set (make-local-variable 'tool-bar-map)
+				     gud-tool-bar-map)
 				;; only want one breakpoint icon at each location
 				(save-excursion
 				  (goto-line (string-to-number line))
@@ -2054,15 +2083,15 @@
   "Find the source file where the program starts and displays it with related
 buffers."
   (goto-char (point-min))
-  (if (search-forward "Located in " nil t)
-      (if (looking-at "\\S-*")
-	  (setq gdb-main-file (match-string 0))))
+  (if (and (search-forward "Located in " nil t)
+	   (looking-at "\\S-*"))
+      (setq gdb-main-file (match-string 0)))
  (if gdb-many-windows
       (gdb-setup-windows)
    (gdb-get-create-buffer 'gdb-breakpoints-buffer)
-    (if gdb-show-main
-      (let ((pop-up-windows t))
-	(display-buffer (gud-find-file gdb-main-file))))))
+   (if gdb-show-main
+       (let ((pop-up-windows t))
+	 (display-buffer (gud-find-file gdb-main-file))))))
 
 (defun gdb-get-location (bptno line flag)
   "Find the directory containing the relevant source file.
@@ -2085,6 +2114,22 @@
       (goto-line (string-to-number line))
       (gdb-put-breakpoint-icon (eq flag ?y) bptno))))
 
+(add-hook 'find-file-hook 'gdb-find-file-hook)
+
+(defun gdb-find-file-hook ()
+  (if (and (not gdb-find-file-unhook)
+	   ;; in case gud or gdb-ui is just loaded
+	   gud-comint-buffer
+	   (buffer-name gud-comint-buffer)
+	   (with-current-buffer gud-comint-buffer
+	     (eq gud-minor-mode 'gdba)))
+      (condition-case nil
+	(gdb-enqueue-input
+	 (list (concat "list " (file-name-nondirectory buffer-file-name)
+		       ":1\n")
+	       `(lambda () (gdb-set-gud-minor-mode ,(current-buffer)))))
+	(error (setq gdb-find-file-unhook t)))))
+
 ;;from put-image
 (defun gdb-put-string (putstring pos &optional dprop)
   "Put string PUTSTRING in front of POS in the current buffer.