comparison lisp/progmodes/gdb-ui.el @ 69180:9c5c44399069

(gdb-source-window): New variable. Re-introduce the concept of a source window. (gdb-get-buffer-create): Rename from gdb-get-create-buffer for consistency with get-buffer-create. (def-gdb-auto-update-handler, gdb-info-locals-handler) (gdb-data-list-register-values-handler) (gdb-stack-list-locals-handler): Try to preserve window-start as well as window-point. (gdb-display-source-buffer): New function (old concept). (gdb-goto-breakpoint): Use it.
author Nick Roberts <nickrob@snap.net.nz>
date Mon, 27 Feb 2006 09:14:59 +0000
parents 8ff0077b3342
children 092d8fdb26e2 8976b9f5eda1
comparison
equal deleted inserted replaced
69179:1a8aba2b127b 69180:9c5c44399069
122 (defvar gdb-error "Non-nil when GDB is reporting an error.") 122 (defvar gdb-error "Non-nil when GDB is reporting an error.")
123 (defvar gdb-macro-info nil 123 (defvar gdb-macro-info nil
124 "Non-nil if GDB knows that the inferior includes preprocessor macro info.") 124 "Non-nil if GDB knows that the inferior includes preprocessor macro info.")
125 (defvar gdb-buffer-fringe-width nil) 125 (defvar gdb-buffer-fringe-width nil)
126 (defvar gdb-signalled nil) 126 (defvar gdb-signalled nil)
127 (defvar gdb-source-window nil)
127 128
128 (defvar gdb-buffer-type nil 129 (defvar gdb-buffer-type nil
129 "One of the symbols bound in `gdb-buffer-rules'.") 130 "One of the symbols bound in `gdb-buffer-rules'.")
130 (make-variable-buffer-local 'gdb-buffer-type) 131 (make-variable-buffer-local 'gdb-buffer-type)
131 132
487 gdb-source-file-list nil 488 gdb-source-file-list nil
488 gdb-error nil 489 gdb-error nil
489 gdb-macro-info nil 490 gdb-macro-info nil
490 gdb-buffer-fringe-width (car (window-fringes)) 491 gdb-buffer-fringe-width (car (window-fringes))
491 gdb-debug-ring nil 492 gdb-debug-ring nil
492 gdb-signalled nil) 493 gdb-signalled nil
494 gdb-source-window nil)
493 495
494 (setq gdb-buffer-type 'gdba) 496 (setq gdb-buffer-type 'gdba)
495 497
496 (if gdb-use-separate-io-buffer (gdb-clear-inferior-io)) 498 (if gdb-use-separate-io-buffer (gdb-clear-inferior-io))
497 499
833 ;; of that particular buffer. 835 ;; of that particular buffer.
834 ;; 836 ;;
835 ;; The usual gdb interaction buffer is given the type `gdba' and 837 ;; The usual gdb interaction buffer is given the type `gdba' and
836 ;; is constructed specially. 838 ;; is constructed specially.
837 ;; 839 ;;
838 ;; Others are constructed by gdb-get-create-buffer and 840 ;; Others are constructed by gdb-get-buffer-create and
839 ;; named according to the rules set forth in the gdb-buffer-rules-assoc 841 ;; named according to the rules set forth in the gdb-buffer-rules-assoc
840 842
841 (defvar gdb-buffer-rules-assoc '()) 843 (defvar gdb-buffer-rules-assoc '())
842 844
843 (defun gdb-get-buffer (key) 845 (defun gdb-get-buffer (key)
844 "Return the gdb buffer tagged with type KEY. 846 "Return the gdb buffer tagged with type KEY.
845 The key should be one of the cars in `gdb-buffer-rules-assoc'." 847 The key should be one of the cars in `gdb-buffer-rules-assoc'."
846 (save-excursion 848 (save-excursion
847 (gdb-look-for-tagged-buffer key (buffer-list)))) 849 (gdb-look-for-tagged-buffer key (buffer-list))))
848 850
849 (defun gdb-get-create-buffer (key) 851 (defun gdb-get-buffer-create (key)
850 "Create a new gdb buffer of the type specified by KEY. 852 "Create a new gdb buffer of the type specified by KEY.
851 The key should be one of the cars in `gdb-buffer-rules-assoc'." 853 The key should be one of the cars in `gdb-buffer-rules-assoc'."
852 (or (gdb-get-buffer key) 854 (or (gdb-get-buffer key)
853 (let* ((rules (assoc key gdb-buffer-rules-assoc)) 855 (let* ((rules (assoc key gdb-buffer-rules-assoc))
854 (name (funcall (gdb-rules-name-maker rules))) 856 (name (funcall (gdb-rules-name-maker rules)))
922 (defun gdb-display-separate-io-buffer () 924 (defun gdb-display-separate-io-buffer ()
923 "Display IO of debugged program in a separate window." 925 "Display IO of debugged program in a separate window."
924 (interactive) 926 (interactive)
925 (if gdb-use-separate-io-buffer 927 (if gdb-use-separate-io-buffer
926 (gdb-display-buffer 928 (gdb-display-buffer
927 (gdb-get-create-buffer 'gdb-inferior-io)))) 929 (gdb-get-buffer-create 'gdb-inferior-io))))
928 930
929 (defconst gdb-frame-parameters 931 (defconst gdb-frame-parameters
930 '((height . 14) (width . 80) 932 '((height . 14) (width . 80)
931 (unsplittable . t) 933 (unsplittable . t)
932 (tool-bar-lines . nil) 934 (tool-bar-lines . nil)
937 "Display IO of inferior in a new frame." 939 "Display IO of inferior in a new frame."
938 (interactive) 940 (interactive)
939 (if gdb-use-separate-io-buffer 941 (if gdb-use-separate-io-buffer
940 (let ((special-display-regexps (append special-display-regexps '(".*"))) 942 (let ((special-display-regexps (append special-display-regexps '(".*")))
941 (special-display-frame-alist gdb-frame-parameters)) 943 (special-display-frame-alist gdb-frame-parameters))
942 (display-buffer (gdb-get-create-buffer 'gdb-inferior-io))))) 944 (display-buffer (gdb-get-buffer-create 'gdb-inferior-io)))))
943 945
944 (defvar gdb-inferior-io-mode-map 946 (defvar gdb-inferior-io-mode-map
945 (let ((map (make-sparse-keymap))) 947 (let ((map (make-sparse-keymap)))
946 (define-key map "\C-c\C-c" 'gdb-separate-io-interrupt) 948 (define-key map "\C-c\C-c" 'gdb-separate-io-interrupt)
947 (define-key map "\C-c\C-z" 'gdb-separate-io-stop) 949 (define-key map "\C-c\C-z" 'gdb-separate-io-stop)
1154 ((eq sink 'user) t) 1156 ((eq sink 'user) t)
1155 ((eq sink 'post-emacs) 1157 ((eq sink 'post-emacs)
1156 (setq gdb-output-sink 'user) 1158 (setq gdb-output-sink 'user)
1157 (let ((handler 1159 (let ((handler
1158 (car (cdr gdb-current-item)))) 1160 (car (cdr gdb-current-item))))
1159 (with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer) 1161 (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
1160 (funcall handler)))) 1162 (funcall handler))))
1161 (t 1163 (t
1162 (gdb-resync) 1164 (gdb-resync)
1163 (error "Phase error in gdb-prompt (got %s)" sink)))) 1165 (error "Phase error in gdb-prompt (got %s)" sink))))
1164 (let ((input (gdb-dequeue-input))) 1166 (let ((input (gdb-dequeue-input)))
1251 ;; Don't add to queue if there outstanding items or GDB is not known yet. 1253 ;; Don't add to queue if there outstanding items or GDB is not known yet.
1252 (unless (or gdb-pending-triggers gdb-first-post-prompt) 1254 (unless (or gdb-pending-triggers gdb-first-post-prompt)
1253 (gdb-get-selected-frame) 1255 (gdb-get-selected-frame)
1254 (gdb-invalidate-frames) 1256 (gdb-invalidate-frames)
1255 ;; Regenerate breakpoints buffer in case it has been inadvertantly deleted. 1257 ;; Regenerate breakpoints buffer in case it has been inadvertantly deleted.
1256 (gdb-get-create-buffer 'gdb-breakpoints-buffer) 1258 (gdb-get-buffer-create 'gdb-breakpoints-buffer)
1257 (gdb-invalidate-breakpoints) 1259 (gdb-invalidate-breakpoints)
1258 ;; Do this through gdb-get-selected-frame -> gdb-frame-handler 1260 ;; Do this through gdb-get-selected-frame -> gdb-frame-handler
1259 ;; so gdb-frame-address is updated. 1261 ;; so gdb-frame-address is updated.
1260 ;; (gdb-invalidate-assembler) 1262 ;; (gdb-invalidate-assembler)
1261 1263
1285 ((eq sink 'pre-emacs) 1287 ((eq sink 'pre-emacs)
1286 (setq gdb-output-sink 'emacs)) 1288 (setq gdb-output-sink 'emacs))
1287 (t 1289 (t
1288 (gdb-resync) 1290 (gdb-resync)
1289 (error "Phase error in gdb-post-prompt (got %s)" sink))))) 1291 (error "Phase error in gdb-post-prompt (got %s)" sink)))))
1292
1293 ;; GUD displays the selected GDB frame. This might might not be the current
1294 ;; GDB frame (after up, down etc). If no GDB frame is visible but the last
1295 ;; visited breakpoint is, use that window.
1296 (defun gdb-display-source-buffer (buffer)
1297 (let* ((last-window (if gud-last-last-frame
1298 (get-buffer-window
1299 (gud-find-file (car gud-last-last-frame)))))
1300 (source-window (or last-window
1301 (if (and gdb-source-window
1302 (window-live-p gdb-source-window))
1303 gdb-source-window))))
1304 (when source-window
1305 (setq gdb-source-window source-window)
1306 (set-window-buffer source-window buffer))
1307 source-window))
1290 1308
1291 (defun gud-gdba-marker-filter (string) 1309 (defun gud-gdba-marker-filter (string)
1292 "A gud marker filter for gdb. Handle a burst of output from GDB." 1310 "A gud marker filter for gdb. Handle a burst of output from GDB."
1293 (if gdb-flush-pending-output 1311 (if gdb-flush-pending-output
1294 nil 1312 nil
1368 (t 1386 (t
1369 (gdb-resync) 1387 (gdb-resync)
1370 (error "Bogon output sink %S" sink))))) 1388 (error "Bogon output sink %S" sink)))))
1371 1389
1372 (defun gdb-append-to-partial-output (string) 1390 (defun gdb-append-to-partial-output (string)
1373 (with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer) 1391 (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
1374 (goto-char (point-max)) 1392 (goto-char (point-max))
1375 (insert string))) 1393 (insert string)))
1376 1394
1377 (defun gdb-clear-partial-output () 1395 (defun gdb-clear-partial-output ()
1378 (with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer) 1396 (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
1379 (erase-buffer))) 1397 (erase-buffer)))
1380 1398
1381 (defun gdb-append-to-inferior-io (string) 1399 (defun gdb-append-to-inferior-io (string)
1382 (with-current-buffer (gdb-get-create-buffer 'gdb-inferior-io) 1400 (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io)
1383 (goto-char (point-max)) 1401 (goto-char (point-max))
1384 (insert-before-markers string)) 1402 (insert-before-markers string))
1385 (if (not (string-equal string "")) 1403 (if (not (string-equal string ""))
1386 (gdb-display-buffer (gdb-get-create-buffer 'gdb-inferior-io)))) 1404 (gdb-display-buffer (gdb-get-buffer-create 'gdb-inferior-io))))
1387 1405
1388 (defun gdb-clear-inferior-io () 1406 (defun gdb-clear-inferior-io ()
1389 (with-current-buffer (gdb-get-create-buffer 'gdb-inferior-io) 1407 (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io)
1390 (erase-buffer))) 1408 (erase-buffer)))
1391 1409
1392 1410
1393 ;; One trick is to have a command who's output is always available in a buffer 1411 ;; One trick is to have a command who's output is always available in a buffer
1394 ;; of it's own, and is always up to date. We build several buffers of this 1412 ;; of it's own, and is always up to date. We build several buffers of this
1432 gdb-pending-triggers)) 1450 gdb-pending-triggers))
1433 (let ((buf (gdb-get-buffer ',buf-key))) 1451 (let ((buf (gdb-get-buffer ',buf-key)))
1434 (and buf 1452 (and buf
1435 (with-current-buffer buf 1453 (with-current-buffer buf
1436 (let* ((window (get-buffer-window buf 0)) 1454 (let* ((window (get-buffer-window buf 0))
1455 (start (window-start window))
1437 (p (window-point window)) 1456 (p (window-point window))
1438 (buffer-read-only nil)) 1457 (buffer-read-only nil))
1439 (erase-buffer) 1458 (erase-buffer)
1440 (insert-buffer-substring (gdb-get-create-buffer 1459 (insert-buffer-substring (gdb-get-buffer-create
1441 'gdb-partial-output-buffer)) 1460 'gdb-partial-output-buffer))
1461 (set-window-start window start)
1442 (set-window-point window p))))) 1462 (set-window-point window p)))))
1443 ;; put customisation here 1463 ;; put customisation here
1444 (,custom-defun))) 1464 (,custom-defun)))
1445 1465
1446 (defmacro def-gdb-auto-updated-buffer (buffer-key 1466 (defmacro def-gdb-auto-updated-buffer (buffer-key
1686 1706
1687 (defun gdb-display-breakpoints-buffer () 1707 (defun gdb-display-breakpoints-buffer ()
1688 "Display status of user-settable breakpoints." 1708 "Display status of user-settable breakpoints."
1689 (interactive) 1709 (interactive)
1690 (gdb-display-buffer 1710 (gdb-display-buffer
1691 (gdb-get-create-buffer 'gdb-breakpoints-buffer))) 1711 (gdb-get-buffer-create 'gdb-breakpoints-buffer)))
1692 1712
1693 (defun gdb-frame-breakpoints-buffer () 1713 (defun gdb-frame-breakpoints-buffer ()
1694 "Display status of user-settable breakpoints in a new frame." 1714 "Display status of user-settable breakpoints in a new frame."
1695 (interactive) 1715 (interactive)
1696 (let ((special-display-regexps (append special-display-regexps '(".*"))) 1716 (let ((special-display-regexps (append special-display-regexps '(".*")))
1697 (special-display-frame-alist gdb-frame-parameters)) 1717 (special-display-frame-alist gdb-frame-parameters))
1698 (display-buffer (gdb-get-create-buffer 'gdb-breakpoints-buffer)))) 1718 (display-buffer (gdb-get-buffer-create 'gdb-breakpoints-buffer))))
1699 1719
1700 (defvar gdb-breakpoints-mode-map 1720 (defvar gdb-breakpoints-mode-map
1701 (let ((map (make-sparse-keymap)) 1721 (let ((map (make-sparse-keymap))
1702 (menu (make-sparse-keymap "Breakpoints"))) 1722 (menu (make-sparse-keymap "Breakpoints")))
1703 (define-key menu [quit] '("Quit" . gdb-delete-frame-or-window)) 1723 (define-key menu [quit] '("Quit" . gdb-delete-frame-or-window))
1765 1785
1766 (defun gdb-goto-breakpoint (&optional event) 1786 (defun gdb-goto-breakpoint (&optional event)
1767 "Display the breakpoint location specified at current line." 1787 "Display the breakpoint location specified at current line."
1768 (interactive (list last-input-event)) 1788 (interactive (list last-input-event))
1769 (if event (posn-set-point (event-end event))) 1789 (if event (posn-set-point (event-end event)))
1770 ;; Hack to stop gdb-goto-breakpoint displaying in GUD buffer.
1771 (let ((window (get-buffer-window gud-comint-buffer)))
1772 (if window (save-selected-window (select-window window))))
1773 (save-excursion 1790 (save-excursion
1774 (beginning-of-line 1) 1791 (beginning-of-line 1)
1775 (if (looking-at "\\([0-9]+\\) .+ in .+ at\\s-+\\(\\S-+\\):\\([0-9]+\\)") 1792 (if (looking-at "\\([0-9]+\\) .+ in .+ at\\s-+\\(\\S-+\\):\\([0-9]+\\)")
1776 (let ((bptno (match-string 1)) 1793 (let ((bptno (match-string 1))
1777 (file (match-string 2)) 1794 (file (match-string 2))
1778 (line (match-string 3))) 1795 (line (match-string 3)))
1779 (save-selected-window 1796 (save-selected-window
1780 (let* ((buf (find-file-noselect 1797 (let* ((buffer (find-file-noselect
1781 (if (file-exists-p file) file 1798 (if (file-exists-p file) file
1782 (cdr (assoc bptno gdb-location-alist))))) 1799 (cdr (assoc bptno gdb-location-alist)))))
1783 (window (display-buffer buf))) 1800 (window (unless (gdb-display-source-buffer buffer)
1784 (with-current-buffer buf 1801 (display-buffer buffer))))
1802 (setq gdb-source-window window)
1803 (with-current-buffer buffer
1785 (goto-line (string-to-number line)) 1804 (goto-line (string-to-number line))
1786 (set-window-point window (point)))))) 1805 (set-window-point window (point))))))
1787 (error "No location specified.")))) 1806 (error "No location specified."))))
1788 1807
1789 1808
1842 1861
1843 (defun gdb-display-stack-buffer () 1862 (defun gdb-display-stack-buffer ()
1844 "Display backtrace of current stack." 1863 "Display backtrace of current stack."
1845 (interactive) 1864 (interactive)
1846 (gdb-display-buffer 1865 (gdb-display-buffer
1847 (gdb-get-create-buffer 'gdb-stack-buffer))) 1866 (gdb-get-buffer-create 'gdb-stack-buffer)))
1848 1867
1849 (defun gdb-frame-stack-buffer () 1868 (defun gdb-frame-stack-buffer ()
1850 "Display backtrace of current stack in a new frame." 1869 "Display backtrace of current stack in a new frame."
1851 (interactive) 1870 (interactive)
1852 (let ((special-display-regexps (append special-display-regexps '(".*"))) 1871 (let ((special-display-regexps (append special-display-regexps '(".*")))
1853 (special-display-frame-alist gdb-frame-parameters)) 1872 (special-display-frame-alist gdb-frame-parameters))
1854 (display-buffer (gdb-get-create-buffer 'gdb-stack-buffer)))) 1873 (display-buffer (gdb-get-buffer-create 'gdb-stack-buffer))))
1855 1874
1856 (defvar gdb-frames-mode-map 1875 (defvar gdb-frames-mode-map
1857 (let ((map (make-sparse-keymap))) 1876 (let ((map (make-sparse-keymap)))
1858 (suppress-keymap map) 1877 (suppress-keymap map)
1859 (define-key map "q" 'kill-this-buffer) 1878 (define-key map "q" 'kill-this-buffer)
1923 1942
1924 (defun gdb-display-threads-buffer () 1943 (defun gdb-display-threads-buffer ()
1925 "Display IDs of currently known threads." 1944 "Display IDs of currently known threads."
1926 (interactive) 1945 (interactive)
1927 (gdb-display-buffer 1946 (gdb-display-buffer
1928 (gdb-get-create-buffer 'gdb-threads-buffer))) 1947 (gdb-get-buffer-create 'gdb-threads-buffer)))
1929 1948
1930 (defun gdb-frame-threads-buffer () 1949 (defun gdb-frame-threads-buffer ()
1931 "Display IDs of currently known threads in a new frame." 1950 "Display IDs of currently known threads in a new frame."
1932 (interactive) 1951 (interactive)
1933 (let ((special-display-regexps (append special-display-regexps '(".*"))) 1952 (let ((special-display-regexps (append special-display-regexps '(".*")))
1934 (special-display-frame-alist gdb-frame-parameters)) 1953 (special-display-frame-alist gdb-frame-parameters))
1935 (display-buffer (gdb-get-create-buffer 'gdb-threads-buffer)))) 1954 (display-buffer (gdb-get-buffer-create 'gdb-threads-buffer))))
1936 1955
1937 (defvar gdb-threads-mode-map 1956 (defvar gdb-threads-mode-map
1938 (let ((map (make-sparse-keymap))) 1957 (let ((map (make-sparse-keymap)))
1939 (suppress-keymap map) 1958 (suppress-keymap map)
1940 (define-key map "q" 'kill-this-buffer) 1959 (define-key map "q" 'kill-this-buffer)
2059 2078
2060 (defun gdb-display-registers-buffer () 2079 (defun gdb-display-registers-buffer ()
2061 "Display integer register contents." 2080 "Display integer register contents."
2062 (interactive) 2081 (interactive)
2063 (gdb-display-buffer 2082 (gdb-display-buffer
2064 (gdb-get-create-buffer 'gdb-registers-buffer))) 2083 (gdb-get-buffer-create 'gdb-registers-buffer)))
2065 2084
2066 (defun gdb-frame-registers-buffer () 2085 (defun gdb-frame-registers-buffer ()
2067 "Display integer register contents in a new frame." 2086 "Display integer register contents in a new frame."
2068 (interactive) 2087 (interactive)
2069 (let ((special-display-regexps (append special-display-regexps '(".*"))) 2088 (let ((special-display-regexps (append special-display-regexps '(".*")))
2070 (special-display-frame-alist gdb-frame-parameters)) 2089 (special-display-frame-alist gdb-frame-parameters))
2071 (display-buffer (gdb-get-create-buffer 'gdb-registers-buffer)))) 2090 (display-buffer (gdb-get-buffer-create 'gdb-registers-buffer))))
2072 2091
2073 (defun gdb-all-registers () 2092 (defun gdb-all-registers ()
2074 "Toggle the display of floating-point registers (pre GDB 6.4 only)." 2093 "Toggle the display of floating-point registers (pre GDB 6.4 only)."
2075 (interactive) 2094 (interactive)
2076 (when (string-equal gdb-version "pre-6.4") 2095 (when (string-equal gdb-version "pre-6.4")
2077 (if gdb-all-registers 2096 (if gdb-all-registers
2078 (progn 2097 (progn
2079 (setq gdb-all-registers nil) 2098 (setq gdb-all-registers nil)
2080 (with-current-buffer (gdb-get-create-buffer 'gdb-registers-buffer) 2099 (with-current-buffer (gdb-get-buffer-create 'gdb-registers-buffer)
2081 (setq mode-name "Registers"))) 2100 (setq mode-name "Registers")))
2082 (setq gdb-all-registers t) 2101 (setq gdb-all-registers t)
2083 (with-current-buffer (gdb-get-create-buffer 'gdb-registers-buffer) 2102 (with-current-buffer (gdb-get-buffer-create 'gdb-registers-buffer)
2084 (setq mode-name "Registers:All"))) 2103 (setq mode-name "Registers:All")))
2085 (message (format "Display of floating-point registers %sabled" 2104 (message (format "Display of floating-point registers %sabled"
2086 (if gdb-all-registers "en" "dis"))) 2105 (if gdb-all-registers "en" "dis")))
2087 (gdb-invalidate-registers))) 2106 (gdb-invalidate-registers)))
2088 2107
2383 2402
2384 (defun gdb-display-memory-buffer () 2403 (defun gdb-display-memory-buffer ()
2385 "Display memory contents." 2404 "Display memory contents."
2386 (interactive) 2405 (interactive)
2387 (gdb-display-buffer 2406 (gdb-display-buffer
2388 (gdb-get-create-buffer 'gdb-memory-buffer))) 2407 (gdb-get-buffer-create 'gdb-memory-buffer)))
2389 2408
2390 (defun gdb-frame-memory-buffer () 2409 (defun gdb-frame-memory-buffer ()
2391 "Display memory contents in a new frame." 2410 "Display memory contents in a new frame."
2392 (interactive) 2411 (interactive)
2393 (let ((special-display-regexps (append special-display-regexps '(".*"))) 2412 (let ((special-display-regexps (append special-display-regexps '(".*")))
2394 (special-display-frame-alist gdb-frame-parameters)) 2413 (special-display-frame-alist gdb-frame-parameters))
2395 (display-buffer (gdb-get-create-buffer 'gdb-memory-buffer)))) 2414 (display-buffer (gdb-get-buffer-create 'gdb-memory-buffer))))
2396 2415
2397 2416
2398 ;; Locals buffer. 2417 ;; Locals buffer.
2399 ;; 2418 ;;
2400 (gdb-set-buffer-rules 'gdb-locals-buffer 2419 (gdb-set-buffer-rules 'gdb-locals-buffer
2448 (replace-match gdb-array-string nil nil)))) 2467 (replace-match gdb-array-string nil nil))))
2449 (let ((buf (gdb-get-buffer 'gdb-locals-buffer))) 2468 (let ((buf (gdb-get-buffer 'gdb-locals-buffer)))
2450 (and buf 2469 (and buf
2451 (with-current-buffer buf 2470 (with-current-buffer buf
2452 (let* ((window (get-buffer-window buf 0)) 2471 (let* ((window (get-buffer-window buf 0))
2472 (start (window-start window))
2453 (p (window-point window)) 2473 (p (window-point window))
2454 (buffer-read-only nil)) 2474 (buffer-read-only nil))
2455 (erase-buffer) 2475 (erase-buffer)
2456 (insert-buffer-substring (gdb-get-create-buffer 2476 (insert-buffer-substring (gdb-get-buffer-create
2457 'gdb-partial-output-buffer)) 2477 'gdb-partial-output-buffer))
2458 (set-window-point window p))))) 2478 (set-window-start window start)
2479 (set-window-point window p))
2480 )))
2459 (run-hooks 'gdb-info-locals-hook)) 2481 (run-hooks 'gdb-info-locals-hook))
2460 2482
2461 (defvar gdb-locals-mode-map 2483 (defvar gdb-locals-mode-map
2462 (let ((map (make-sparse-keymap))) 2484 (let ((map (make-sparse-keymap)))
2463 (suppress-keymap map) 2485 (suppress-keymap map)
2487 2509
2488 (defun gdb-display-locals-buffer () 2510 (defun gdb-display-locals-buffer ()
2489 "Display local variables of current stack and their values." 2511 "Display local variables of current stack and their values."
2490 (interactive) 2512 (interactive)
2491 (gdb-display-buffer 2513 (gdb-display-buffer
2492 (gdb-get-create-buffer 'gdb-locals-buffer))) 2514 (gdb-get-buffer-create 'gdb-locals-buffer)))
2493 2515
2494 (defun gdb-frame-locals-buffer () 2516 (defun gdb-frame-locals-buffer ()
2495 "Display local variables of current stack and their values in a new frame." 2517 "Display local variables of current stack and their values in a new frame."
2496 (interactive) 2518 (interactive)
2497 (let ((special-display-regexps (append special-display-regexps '(".*"))) 2519 (let ((special-display-regexps (append special-display-regexps '(".*")))
2498 (special-display-frame-alist gdb-frame-parameters)) 2520 (special-display-frame-alist gdb-frame-parameters))
2499 (display-buffer (gdb-get-create-buffer 'gdb-locals-buffer)))) 2521 (display-buffer (gdb-get-buffer-create 'gdb-locals-buffer))))
2500 2522
2501 2523
2502 ;;;; Window management 2524 ;;;; Window management
2503 (defun gdb-display-buffer (buf &optional size) 2525 (defun gdb-display-buffer (buf &optional size)
2504 (let ((answer (get-buffer-window buf 0)) 2526 (let ((answer (get-buffer-window buf 0))
2617 (gud-find-file gdb-main-file))) 2639 (gud-find-file gdb-main-file)))
2618 (when gdb-use-separate-io-buffer 2640 (when gdb-use-separate-io-buffer
2619 (split-window-horizontally) 2641 (split-window-horizontally)
2620 (other-window 1) 2642 (other-window 1)
2621 (gdb-set-window-buffer 2643 (gdb-set-window-buffer
2622 (gdb-get-create-buffer 'gdb-inferior-io))) 2644 (gdb-get-buffer-create 'gdb-inferior-io)))
2623 (other-window 1) 2645 (other-window 1)
2624 (gdb-set-window-buffer (gdb-stack-buffer-name)) 2646 (gdb-set-window-buffer (gdb-stack-buffer-name))
2625 (split-window-horizontally) 2647 (split-window-horizontally)
2626 (other-window 1) 2648 (other-window 1)
2627 (gdb-set-window-buffer (gdb-breakpoints-buffer-name)) 2649 (gdb-set-window-buffer (gdb-breakpoints-buffer-name))
2705 (goto-char (point-min)) 2727 (goto-char (point-min))
2706 (if (search-forward "Includes preprocessor macro info." nil t) 2728 (if (search-forward "Includes preprocessor macro info." nil t)
2707 (setq gdb-macro-info t)) 2729 (setq gdb-macro-info t))
2708 (if gdb-many-windows 2730 (if gdb-many-windows
2709 (gdb-setup-windows) 2731 (gdb-setup-windows)
2710 (gdb-get-create-buffer 'gdb-breakpoints-buffer) 2732 (gdb-get-buffer-create 'gdb-breakpoints-buffer)
2711 (if gdb-show-main 2733 (if gdb-show-main
2712 (let ((pop-up-windows t)) 2734 (let ((pop-up-windows t))
2713 (display-buffer (gud-find-file gdb-main-file)))))) 2735 (display-buffer (gud-find-file gdb-main-file))))))
2714 2736
2715 (defun gdb-get-location (bptno line flag) 2737 (defun gdb-get-location (bptno line flag)
2958 (defun gdb-display-assembler-buffer () 2980 (defun gdb-display-assembler-buffer ()
2959 "Display disassembly view." 2981 "Display disassembly view."
2960 (interactive) 2982 (interactive)
2961 (setq gdb-previous-frame nil) 2983 (setq gdb-previous-frame nil)
2962 (gdb-display-buffer 2984 (gdb-display-buffer
2963 (gdb-get-create-buffer 'gdb-assembler-buffer))) 2985 (gdb-get-buffer-create 'gdb-assembler-buffer)))
2964 2986
2965 (defun gdb-frame-assembler-buffer () 2987 (defun gdb-frame-assembler-buffer ()
2966 "Display disassembly view in a new frame." 2988 "Display disassembly view in a new frame."
2967 (interactive) 2989 (interactive)
2968 (setq gdb-previous-frame nil) 2990 (setq gdb-previous-frame nil)
2969 (let ((special-display-regexps (append special-display-regexps '(".*"))) 2991 (let ((special-display-regexps (append special-display-regexps '(".*")))
2970 (special-display-frame-alist gdb-frame-parameters)) 2992 (special-display-frame-alist gdb-frame-parameters))
2971 (display-buffer (gdb-get-create-buffer 'gdb-assembler-buffer)))) 2993 (display-buffer (gdb-get-buffer-create 'gdb-assembler-buffer))))
2972 2994
2973 ;; modified because if gdb-frame-address has changed value a new command 2995 ;; modified because if gdb-frame-address has changed value a new command
2974 ;; must be enqueued to update the buffer with the new output 2996 ;; must be enqueued to update the buffer with the new output
2975 (defun gdb-invalidate-assembler (&optional ignored) 2997 (defun gdb-invalidate-assembler (&optional ignored)
2976 (if (gdb-get-buffer 'gdb-assembler-buffer) 2998 (if (gdb-get-buffer 'gdb-assembler-buffer)
3164 register-string)) 3186 register-string))
3165 (setq register-values 3187 (setq register-values
3166 (concat register-values register-string))) 3188 (concat register-values register-string)))
3167 (let ((buf (gdb-get-buffer 'gdb-registers-buffer))) 3189 (let ((buf (gdb-get-buffer 'gdb-registers-buffer)))
3168 (with-current-buffer buf 3190 (with-current-buffer buf
3169 (let ((p (window-point (get-buffer-window buf 0))) 3191 (let* ((window (get-buffer-window buf 0))
3170 (buffer-read-only nil)) 3192 (start (window-start window))
3193 (p (window-point window))
3194 (buffer-read-only nil))
3171 (erase-buffer) 3195 (erase-buffer)
3172 (insert register-values) 3196 (insert register-values)
3173 (set-window-point (get-buffer-window buf 0) p)))))) 3197 (set-window-start window start)
3198 (set-window-point window p))))))
3174 (gdb-data-list-register-values-custom)) 3199 (gdb-data-list-register-values-custom))
3175 3200
3176 (defun gdb-data-list-register-values-custom () 3201 (defun gdb-data-list-register-values-custom ()
3177 (with-current-buffer (gdb-get-buffer 'gdb-registers-buffer) 3202 (with-current-buffer (gdb-get-buffer 'gdb-registers-buffer)
3178 (save-excursion 3203 (save-excursion
3253 (setcar (nthcdr 2 local) (read (match-string 1)))) 3278 (setcar (nthcdr 2 local) (read (match-string 1))))
3254 (push local locals-list))) 3279 (push local locals-list)))
3255 (let ((buf (gdb-get-buffer 'gdb-locals-buffer))) 3280 (let ((buf (gdb-get-buffer 'gdb-locals-buffer)))
3256 (and buf (with-current-buffer buf 3281 (and buf (with-current-buffer buf
3257 (let* ((window (get-buffer-window buf 0)) 3282 (let* ((window (get-buffer-window buf 0))
3283 (start (window-start window))
3258 (p (window-point window)) 3284 (p (window-point window))
3259 (buffer-read-only nil)) 3285 (buffer-read-only nil))
3260 (erase-buffer) 3286 (erase-buffer)
3261 (dolist (local locals-list) 3287 (dolist (local locals-list)
3262 (setq name (car local)) 3288 (setq name (car local))
3268 local-map ,gdb-locals-watch-map-1) 3294 local-map ,gdb-locals-watch-map-1)
3269 name)) 3295 name))
3270 (insert 3296 (insert
3271 (concat name "\t" (nth 1 local) 3297 (concat name "\t" (nth 1 local)
3272 "\t" (nth 2 local) "\n"))) 3298 "\t" (nth 2 local) "\n")))
3299 (set-window-start window start)
3273 (set-window-point window p))))))) 3300 (set-window-point window p)))))))
3274 3301
3275 (defun gdb-get-register-names () 3302 (defun gdb-get-register-names ()
3276 "Create a list of register names." 3303 "Create a list of register names."
3277 (goto-char (point-min)) 3304 (goto-char (point-min))