changeset 48963:1bb53161a4b9

(gdb-info-display-custom): Ensure that frames/buffers of displayed expressions are deleted when the displayed expressions are deleted. (gdb-delete-disp-this-line, gdb-delete-display): Frame/buffer deletion is handled by gdb-info-display-custom now. (gdb-source-info): Undo earlier change (do create display buffer automatically).
author Nick Roberts <nickrob@snap.net.nz>
date Thu, 26 Dec 2002 00:12:09 +0000
parents a494d9f972c7
children 7bba5b5ff0d2
files lisp/gdb-ui.el
diffstat 1 files changed, 70 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/gdb-ui.el	Thu Dec 26 00:11:21 2002 +0000
+++ b/lisp/gdb-ui.el	Thu Dec 26 00:12:09 2002 +0000
@@ -26,17 +26,18 @@
 ;;; Commentary:
 
 ;;  This file is based on gdba.el from GDB 5.0 written by Jim Kingdon and uses
-;;  GDB's annotation interface. You don't need to know about annotations but
-;;  If you are interested developing this mode see the Annotations section in
-;;  the GDB info manual).
-;;
-;;  It has been extended to use features of Emacs 21 such as the display
-;;  margin for breakpoints and the toolbar. It also has new buffers and lots
-;;  of other new features such as formatted auto-display of arrays and
-;;  structures (see the GDB-UI section in the Emacs info manual).
+;;  GDB's annotation interface. It has been extended to use features of Emacs
+;;  21 such as the display margin for breakpoints and the toolbar. It also has
+;;  new buffers and lots of other new features such as formatted auto-display
+;;  of arrays and structures (see the GDB-UI section in the Emacs info
+;;  manual).
+
+;;  You don't need to know about annotations to use this mode as a graphical
+;;  user interface to GDB. However, if you are interested developing the mode
+;;  itself see the Annotations section in the GDB info manual.
 ;;
 ;;  Known Bugs: Does not auto-display arrays of structures or structures 
-;;  containing arrays properly.
+;;  containing arrays.
 
 ;;; Code:
 
@@ -98,15 +99,15 @@
 `gdb-restore-windows' - To restore the window layout.
 `gdb-quit'            - To delete (most) of the buffers used by GDB-UI and 
                         reset variables."
-
+  ;;
   (interactive (list (gud-query-cmdline 'gdba)))
-
+  ;;
   ;; Let's start with a basic gud-gdb buffer and then modify it a bit.
   (gdb command-line)
-
+  ;;
   (set (make-local-variable 'gud-minor-mode) 'gdba)
   (set (make-local-variable 'gud-marker-filter) 'gud-gdba-marker-filter)
-
+  ;;
   (gud-def gud-break (if (not (string-equal mode-name "Assembler"))
 			 (gud-call "break %f:%l" arg)
 		       (save-excursion
@@ -114,7 +115,7 @@
 			 (forward-char 2)
 			 (gud-call "break *%a" arg)))
 	   "\C-b" "Set breakpoint at current line or address.")
-
+  ;;
   (gud-def gud-remove (if (not (string-equal mode-name "Assembler"))
 			  (gud-call "clear %f:%l" arg)
 			(save-excursion
@@ -122,25 +123,25 @@
 			  (forward-char 2)
 			  (gud-call "clear *%a" arg)))
 	   "\C-d" "Remove breakpoint at current line or address.")
-
+  ;;
   (setq comint-input-sender 'gdb-send)
-
+  ;;
   ;; (re-)initialise
   (setq gdb-main-or-pc "main")
   (setq gdb-current-address nil)
   (setq gdb-display-in-progress nil)
   (setq gdb-dive nil)
-
+  ;;
   (mapc 'make-local-variable gdb-variables)
   (setq gdb-buffer-type 'gdba)
-
+  ;;
   (gdb-clear-inferior-io)
-
+  ;;
   ;; find source file and compilation directory here
   (gdb-enqueue-input (list "server list\n" 'ignore))
   (gdb-enqueue-input (list "server info source\n"
 			   'gdb-source-info))
-
+  ;;
   (run-hooks 'gdba-mode-hook))
 
 (defun gud-display ()
@@ -725,7 +726,7 @@
 	;;else put * back on if necessary
 	(setq gdb-expression (concat char gdb-expression)))
       (setq header-line-format (concat "-- " gdb-expression " %-"))))
-
+  ;;
   ;;-if scalar/string
   (if (not (re-search-forward "##" nil t))
       (progn
@@ -1048,11 +1049,11 @@
 	  (burst (concat (gdb-get-burst) string))
 	  ;; Start accumulating output for the GUD buffer
 	  (output ""))
-
+      ;;
       ;; Process all the complete markers in this chunk.
       (while (string-match "\n\032\032\\(.*\\)\n" burst)
 	(let ((annotation (match-string 1 burst)))
-
+          ;;
 	  ;; Stuff prior to the match is just ordinary output.
 	  ;; It is either concatenated to OUTPUT or directed
 	  ;; elsewhere.
@@ -1078,7 +1079,7 @@
 	      ;; so that GDB can add new annotations without causing
 	      ;; us to blow up.
 	      ))))
-
+      ;;
       ;; Does the remaining text end in a partial line?
       ;; If it does, then keep part of the burst until we get more.
       (if (string-match "\n\\'\\|\n\032\\'\\|\n\032\032.*\\'"
@@ -1088,15 +1089,15 @@
 	    (setq output
 		  (gdb-concat-output output
 				     (substring burst 0 (match-beginning 0))))
-
+            ;;
 	    ;; Everything after, we save, to combine with later input.
 	    (setq burst (substring burst (match-beginning 0))))
-
+        ;;
 	;; In case we know the burst contains no partial annotations:
 	(progn
 	  (setq output (gdb-concat-output output burst))
 	  (setq burst "")))
-
+      ;;
       ;; Save the remaining burst for the next call to this function.
       (gdb-set-burst burst)
       output)))
@@ -1225,10 +1226,10 @@
   ;; It defines a function to serve as the annotation handler that
   ;; handles the `foo-invalidated' message.  That function is called:
   gdb-invalidate-breakpoints
-
+  ;;
   ;; To update the buffer, this command is sent to gdb.
   "server info breakpoints\n"
-
+  ;;
   ;; This also defines a function to be the handler for the output
   ;; from the command above.  That function will copy the output into
   ;; the appropriately typed buffer.  That function will be called:
@@ -1243,7 +1244,7 @@
 ;;-put breakpoint icons in relevant margins (even those set in the GUD buffer)
 (defun gdb-info-breakpoints-custom ()
   (let ((flag)(address))
-
+    ;;
     ;; remove all breakpoint-icons in source buffers but not assembler buffer
     (dolist (buffer (buffer-list))
       (save-excursion
@@ -1358,10 +1359,9 @@
        (list
 	(concat
 	 (if (eq ?y (char-after (match-beginning 2)))
-	     "server disable "
+	     "server disable " 
 	   "server enable ")
-	 (match-string 1)
-	 "\n")
+	 (match-string 1) "\n")
 	'ignore)))))
 
 (defun gdb-delete-bp-this-line ()
@@ -1422,8 +1422,7 @@
 
 (defun gdb-stack-buffer-name ()
   (with-current-buffer gud-comint-buffer
-    (concat "*stack frames of "
-	    (gdb-get-target-string) "*")))
+    (concat "*stack frames of " (gdb-get-target-string) "*")))
 
 (defun gdb-display-stack-buffer ()
   (interactive)
@@ -1471,8 +1470,7 @@
     (save-excursion
       (set-buffer gud-comint-buffer)
       (gdb-enqueue-input
-       (list (gud-format-command "server frame %p\n" selection)
-	     'ignore))
+       (list (gud-format-command "server frame %p\n" selection) 'ignore))
       (gud-display-frame))))
 
 
@@ -1533,8 +1531,8 @@
   gdb-info-locals-handler
   gdb-info-locals-custom)
 
-
-;;Abbreviate for arrays and structures. These can be expanded using gud-display
+;; Abbreviate for arrays and structures. 
+;; These can be expanded using gud-display.
 (defun gdb-info-locals-handler nil
   (gdb-set-pending-triggers (delq 'gdb-invalidate-locals
 				  (gdb-get-pending-triggers)))
@@ -1608,10 +1606,35 @@
   gdb-info-display-custom)
 
 (defun gdb-info-display-custom ()
-  ;; TODO: ensure frames of expressions that have been deleted are also deleted
-  ;;       these can be missed currently eg through GUD buffer, restarting a
-  ;;       recompiled program.
-  )
+  (let ((display-list nil))
+    (save-excursion
+      (set-buffer (gdb-get-buffer 'gdb-display-buffer))
+      (goto-char (point-min))
+      (while (< (point) (- (point-max) 1))
+	(forward-line 1)
+	(if (looking-at "\\([0-9]+\\):   \\([ny]\\)")
+	    (setq display-list 
+		  (cons (string-to-int (match-string 1)) display-list)))
+	(end-of-line)))
+    (if (not (display-graphic-p))
+	(progn
+	  (dolist (buffer (buffer-list))
+	    (if (string-match "\\*display \\([0-9]+\\)\\*" (buffer-name buffer))
+		(progn
+		  (let ((number 
+			 (match-string 1 (buffer-name buffer))))
+		    (if (not (memq (string-to-int number) display-list))
+			(kill-buffer 
+			 (get-buffer (concat "*display " number "*")))))))))
+      (dolist (frame (frame-list))
+	(let ((frame-name (frame-parameter frame 'name)))
+	  (if (string-match "\\*display \\([0-9]+\\)\\*" frame-name)
+	      (progn
+		(let ((number (match-string 1 frame-name)))
+		  (if (not (memq (string-to-int number) display-list))
+		      (progn (kill-buffer
+			      (get-buffer (concat "*display " number "*")))
+			     (delete-frame frame)))))))))))
 
 (defvar gdb-display-mode-map
   (let ((map (make-sparse-keymap))
@@ -1662,8 +1685,7 @@
 	 (if (eq ?y (char-after (match-beginning 2)))
 	     "server disable display "
 	   "server enable display ")
-	 (match-string 1)
-	 "\n")
+	 (match-string 1) "\n")
 	'ignore)))))
 
 (defun gdb-delete-disp-this-line ()
@@ -1677,20 +1699,7 @@
 	(error "No expression on this line")
       (let ((number (match-string 1)))
 	(gdb-enqueue-input
-	 (list (concat "server delete display " number "\n")
-	       'ignore))
-	(if (not (display-graphic-p))
-	    (kill-buffer (get-buffer (concat "*display " number "*")))
-	  (catch 'frame-found
-	    (let ((frames (frame-list)))
-	      (while frames
-		(if (string-equal (frame-parameter (car frames) 'name)
-				  (concat "*display " number "*"))
-		    (progn (kill-buffer
-			    (get-buffer (concat "*display " number "*")))
-			   (delete-frame (car frames))
-			   (throw 'frame-found nil)))
-		(setq frames (cdr frames))))))))))
+	 (list (concat "server delete display " number "\n") 'ignore))))))
 
 (defvar gdb-expressions-mode-map
   (let ((map (make-sparse-keymap)))
@@ -1946,6 +1955,7 @@
 	(gdb-setup-windows)
       (gdb-display-breakpoints-buffer)
       (gdb-display-stack-buffer)
+      (gdb-display-display-buffer)
       (delete-other-windows)
       (split-window)
       (other-window 1)
@@ -2054,9 +2064,7 @@
   (interactive)
   (gdb-enqueue-input
    (list (concat "server delete display " gdb-display-number "\n")
-	 'ignore))
-  (kill-buffer nil)
-  (delete-frame))
+	 'ignore)))
 
 ;;
 ;; Assembler buffer.
@@ -2083,7 +2091,6 @@
 	    (re-search-forward gdb-current-address)
 	    (setq gdb-arrow-position (point))
 	    (put-arrow "=>" gdb-arrow-position nil 'left-margin))))
-
     ;; remove all breakpoint-icons in assembler buffer  before updating.
     (save-excursion
       (set-buffer buffer)
@@ -2175,7 +2182,6 @@
 			    (gdb-get-pending-triggers)))
 	       (not (string-equal gdb-main-or-pc gdb-prev-main-or-pc))))
       (progn
-
 	;; take previous disassemble command off the queue
 	(save-excursion
 	  (set-buffer gud-comint-buffer)
@@ -2185,7 +2191,6 @@
 	      (if (equal (cdr item) '(gdb-assembler-handler))
 		  (delete item gdb-idle-input-queue))
 	      (setq queue (cdr queue)))))
-
 	(gdb-enqueue-idle-input
 	 (list (concat "server disassemble " gdb-main-or-pc "\n")
 	       'gdb-assembler-handler))