# HG changeset patch # User Nick Roberts # Date 1040861529 0 # Node ID 1bb53161a4b967bc294ff226d072de883554d35c # Parent a494d9f972c78edc729f9036b86c66b6b2a17e15 (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). diff -r a494d9f972c7 -r 1bb53161a4b9 lisp/gdb-ui.el --- 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))