Mercurial > emacs
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)) |