aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/progmodes/gud.el166
1 files changed, 82 insertions, 84 deletions
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index 8840a01283f..cc6163d6235 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -336,9 +336,6 @@ we're in the GUD buffer)."
336;; speedbar support functions and variables. 336;; speedbar support functions and variables.
337(eval-when-compile (require 'speedbar)) ;For speedbar-with-attached-buffer. 337(eval-when-compile (require 'speedbar)) ;For speedbar-with-attached-buffer.
338 338
339(defvar gud-last-speedbar-buffer nil
340 "The last GUD buffer used.")
341
342(defvar gud-last-speedbar-stackframe nil 339(defvar gud-last-speedbar-stackframe nil
343 "Description of the currently displayed GUD stack. 340 "Description of the currently displayed GUD stack.
344t means that there is no stack, and we are in display-file mode.") 341t means that there is no stack, and we are in display-file mode.")
@@ -355,7 +352,11 @@ t means that there is no stack, and we are in display-file mode.")
355 (define-key gud-speedbar-key-map "j" 'speedbar-edit-line) 352 (define-key gud-speedbar-key-map "j" 'speedbar-edit-line)
356 (define-key gud-speedbar-key-map "e" 'speedbar-edit-line) 353 (define-key gud-speedbar-key-map "e" 'speedbar-edit-line)
357 (define-key gud-speedbar-key-map "\C-m" 'speedbar-edit-line) 354 (define-key gud-speedbar-key-map "\C-m" 'speedbar-edit-line)
358 (define-key gud-speedbar-key-map "D" 'gdb-var-delete))) 355 (define-key gud-speedbar-key-map "D" 'gdb-var-delete))
356
357 (speedbar-add-expansion-list '("GUD" gud-speedbar-menu-items
358 gud-speedbar-key-map
359 gud-expansion-speedbar-buttons)))
359 360
360(defvar gud-speedbar-menu-items 361(defvar gud-speedbar-menu-items
361 '(["Jump to stack frame" speedbar-edit-line 362 '(["Jump to stack frame" speedbar-edit-line
@@ -374,89 +375,86 @@ t means that there is no stack, and we are in display-file mode.")
374 (gud-install-speedbar-variables) 375 (gud-install-speedbar-variables)
375 (add-hook 'speedbar-load-hook 'gud-install-speedbar-variables)) 376 (add-hook 'speedbar-load-hook 'gud-install-speedbar-variables))
376 377
378(defun gud-expansion-speedbar-buttons (directory zero)
379 "Wrapper for call to speedbar-add-expansion-list. DIRECTORY and
380ZERO are not used, but are required by the caller."
381 (gud-speedbar-buttons gud-comint-buffer))
382
377(defun gud-speedbar-buttons (buffer) 383(defun gud-speedbar-buttons (buffer)
378 "Create a speedbar display based on the current state of GUD. 384 "Create a speedbar display based on the current state of GUD.
379If the GUD BUFFER is not running a supported debugger, then turn 385If the GUD BUFFER is not running a supported debugger, then turn
380off the specialized speedbar mode." 386off the specialized speedbar mode. BUFFER is not used, but are
381 (let ((minor-mode (with-current-buffer buffer gud-minor-mode))) 387required by the caller."
382 (cond 388 (when (and (boundp 'gud-comint-buffer)
383 ((memq minor-mode '(gdbmi gdba)) 389 gud-comint-buffer
384 (when (or gdb-var-changed 390 ;; gud-comint-buffer might be killed
385 (not (save-excursion 391 (buffer-name gud-comint-buffer))
386 (goto-char (point-min)) 392 (let ((minor-mode (with-current-buffer buffer gud-minor-mode)))
387 (let ((case-fold-search t)) 393 (cond
388 (looking-at "Watch Expressions:"))))) 394 ((memq minor-mode '(gdbmi gdba))
389 (erase-buffer) 395 (when (or gdb-var-changed
390 (insert "Watch Expressions:\n") 396 (not (save-excursion
391 (let ((var-list gdb-var-list)) 397 (goto-char (point-min))
392 (while var-list 398 (let ((case-fold-search t))
393 (let* ((depth 0) (start 0) (char ?+) 399 (looking-at "Watch Expressions:")))))
394 (var (car var-list)) (varnum (nth 1 var))) 400 (erase-buffer)
395 (while (string-match "\\." varnum start) 401 (insert "Watch Expressions:\n")
396 (setq depth (1+ depth) 402 (let ((var-list gdb-var-list))
397 start (1+ (match-beginning 0)))) 403 (while var-list
398 (if (equal (nth 2 var) "0") 404 (let* ((depth 0) (start 0) (char ?+)
399 (speedbar-make-tag-line 'bracket ?? nil nil 405 (var (car var-list)) (varnum (nth 1 var)))
400 (concat (car var) "\t" (nth 4 var)) 406 (while (string-match "\\." varnum start)
401 'gdb-edit-value 407 (setq depth (1+ depth)
402 nil 408 start (1+ (match-beginning 0))))
403 (if (and (nth 5 var) 409 (if (equal (nth 2 var) "0")
404 gdb-show-changed-values) 410 (speedbar-make-tag-line 'bracket ?? nil nil
405 'font-lock-warning-face 411 (concat (car var) "\t" (nth 4 var))
406 nil) depth) 412 'gdb-edit-value
407 (if (and (cadr var-list) 413 nil
408 (string-match varnum (cadr (cadr var-list)))) 414 (if (and (nth 5 var)
409 (setq char ?-)) 415 gdb-show-changed-values)
410 (speedbar-make-tag-line 'bracket char 416 'font-lock-warning-face
411 'gdb-speedbar-expand-node varnum 417 nil) depth)
412 (concat (car var) "\t" (nth 3 var)) 418 (if (and (cadr var-list)
413 nil nil nil depth))) 419 (string-match varnum (cadr (cadr var-list))))
414 (setq var-list (cdr var-list)))) 420 (setq char ?-))
415 (setq gdb-var-changed nil))) 421 (speedbar-make-tag-line 'bracket char
416 (t (if (and (save-excursion 422 'gdb-speedbar-expand-node varnum
417 (goto-char (point-min)) 423 (concat (car var) "\t" (nth 3 var))
418 (looking-at "Current Stack")) 424 nil nil nil depth)))
419 (equal gud-last-last-frame gud-last-speedbar-stackframe)) 425 (setq var-list (cdr var-list))))
420 nil 426 (setq gdb-var-changed nil)))
421 (setq gud-last-speedbar-buffer buffer) 427 (t (if (and (save-excursion
422 (let ((gud-frame-list 428 (goto-char (point-min))
423 (cond ((eq minor-mode 'gdb) 429 (looking-at "Current Stack:"))
424 (gud-gdb-get-stackframe buffer)) 430 (equal gud-last-last-frame gud-last-speedbar-stackframe))
425 ;; Add more debuggers here! 431 nil
426 (t (speedbar-remove-localized-speedbar-support buffer) 432 (let ((gud-frame-list
427 nil)))) 433 (cond ((eq minor-mode 'gdb)
428 (erase-buffer) 434 (gud-gdb-get-stackframe buffer))
429 (if (not gud-frame-list) 435 ;; Add more debuggers here!
430 (insert "No Stack frames\n") 436 (t (speedbar-remove-localized-speedbar-support buffer)
431 (insert "Current Stack:\n")) 437 nil))))
432 (dolist (frame gud-frame-list) 438 (erase-buffer)
433 (insert (nth 1 frame) ":\n") 439 (if (not gud-frame-list)
434 (if (= (length frame) 2) 440 (insert "No Stack frames\n")
435 (progn 441 (insert "Current Stack:\n"))
436; (speedbar-insert-button "[?]" 442 (dolist (frame gud-frame-list)
437; 'speedbar-button-face 443 (insert (nth 1 frame) ":\n")
438; nil nil nil t) 444 (if (= (length frame) 2)
439 (speedbar-insert-button (car frame) 445 (progn
440 'speedbar-directory-face 446 (speedbar-insert-button (car frame)
441 nil nil nil t)) 447 'speedbar-directory-face
442; (speedbar-insert-button "[+]" 448 nil nil nil t))
443; 'speedbar-button-face 449 (speedbar-insert-button
444; 'speedbar-highlight-face 450 (car frame)
445; 'gud-gdb-get-scope-data 451 'speedbar-file-face
446; frame t) 452 'speedbar-highlight-face
447 (speedbar-insert-button (car frame) 453 (cond ((memq minor-mode '(gdbmi gdba gdb))
448 'speedbar-file-face 454 'gud-gdb-goto-stackframe)
449 'speedbar-highlight-face 455 (t (error "Should never be here")))
450 (cond ((memq minor-mode '(gdbmi gdba gdb)) 456 frame t))))
451 'gud-gdb-goto-stackframe) 457 (setq gud-last-speedbar-stackframe gud-last-last-frame)))))))
452 (t (error "Should never be here")))
453 frame t)))
454; (let ((selected-frame
455; (cond ((eq ff 'gud-gdb-find-file)
456; (gud-gdb-selected-frame-info buffer))
457; (t (error "Should never be here"))))))
458 )
459 (setq gud-last-speedbar-stackframe gud-last-last-frame))))))
460 458
461 459
462;; ====================================================================== 460;; ======================================================================