]> git.eshelyaron.com Git - emacs.git/commitdiff
(gdb-invalidate-assembler): Update assembler buffer
authorNick Roberts <nickrob@snap.net.nz>
Mon, 12 May 2003 23:47:31 +0000 (23:47 +0000)
committerNick Roberts <nickrob@snap.net.nz>
Mon, 12 May 2003 23:47:31 +0000 (23:47 +0000)
correctly when frame changes.
(gdb-info-threads-custom, gdb-threads-buffer-name)
(gdb-display-threads-buffer, gdb-frame-threads-buffer)
(gdb-threads-mode-map, gdb-threads-mode, gdb-get-thread-number)
(gdb-threads-select, gdb-threads-mouse-select): New functions and
variable for a buffer that provides a selectable threads list.

lisp/gdb-ui.el

index 79e185fe7a5a0c73094804e7639605ddac90948f..4ebd4ad43640b130de86e6a9389352b861dc040e 100644 (file)
@@ -524,7 +524,7 @@ This filter may simply queue output for a later time."
     ("signal" gdb-stopping)
     ("breakpoint" gdb-stopping)
     ("watchpoint" gdb-stopping)
-    ("frame-begin" gdb-frame-begin)
+;    ("frame-begin" gdb-frame-begin)
     ("stopped" gdb-stopped)
     ("display-begin" gdb-display-begin)
     ("display-end" gdb-display-end)
@@ -665,7 +665,8 @@ output from the current command if that happens to be appropriate."
        (gdb-get-current-frame)
        (gdb-invalidate-registers ignored)
        (gdb-invalidate-locals ignored)
-       (gdb-invalidate-display ignored)))
+       (gdb-invalidate-display ignored)
+       (gdb-invalidate-threads)))
   (let ((sink (gdb-get-output-sink)))
     (cond
      ((eq sink 'user) t)
@@ -1572,6 +1573,82 @@ the source buffer."
   (gdb-frames-select))
 \f
 ;;
+;; Threads buffer.  This displays a selectable thread list.
+;;
+(gdb-set-buffer-rules 'gdb-threads-buffer
+                     'gdb-threads-buffer-name
+                     'gdb-threads-mode)
+
+(def-gdb-auto-updated-buffer gdb-threads-buffer
+  gdb-invalidate-threads
+  "info threads\n"
+  gdb-info-threads-handler
+  gdb-info-threads-custom)
+
+(defun gdb-info-threads-custom ()
+  (save-excursion
+    (set-buffer (gdb-get-buffer 'gdb-threads-buffer))
+    (let ((buffer-read-only nil))
+      (goto-char (point-min))
+      (while (< (point) (point-max))
+       (put-text-property (progn (beginning-of-line) (point))
+                          (progn (end-of-line) (point))
+                          'mouse-face 'highlight)
+       (forward-line 1)))))
+
+(defun gdb-threads-buffer-name ()
+  (with-current-buffer gud-comint-buffer
+    (concat "*threads of " (gdb-get-target-string) "*")))
+
+(defun gdb-display-threads-buffer ()
+  (interactive)
+  (gdb-display-buffer
+   (gdb-get-create-buffer 'gdb-threads-buffer)))
+
+(defun gdb-frame-threads-buffer ()
+  (interactive)
+  (switch-to-buffer-other-frame
+   (gdb-get-create-buffer 'gdb-threads-buffer)))
+
+(defvar gdb-threads-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "\r" 'gdb-threads-select)
+    (define-key map [mouse-2] 'gdb-threads-mouse-select)
+    map))
+
+(defun gdb-threads-mode ()
+  "Major mode for gdb frames.
+
+\\{gdb-frames-mode-map}"
+  (setq major-mode 'gdb-threads-mode)
+  (setq mode-name "Threads")
+  (setq buffer-read-only t)
+  (use-local-map gdb-threads-mode-map)
+  (gdb-invalidate-threads))
+
+(defun gdb-get-thread-number ()
+  (save-excursion
+    (re-search-backward "^\\s-*\\([0-9]*\\)" nil t)
+    (match-string-no-properties 1)))
+
+
+(defun gdb-threads-select ()
+  "Make the thread on the current line become the current thread and display the
+source in the source buffer."
+  (interactive)
+  (gdb-enqueue-input
+   (list (concat "thread " (gdb-get-thread-number) "\n") 'ignore))
+  (gud-display-frame))
+
+(defun gdb-threads-mouse-select (event)
+  "Make the selected frame become the current frame and display the source in
+the source buffer."
+  (interactive "e")
+  (mouse-set-point event)
+  (gdb-threads-select))
+\f
+;;
 ;; Registers buffer.
 ;;
 (gdb-set-buffer-rules 'gdb-registers-buffer
@@ -1900,6 +1977,7 @@ the source buffer."
   (define-key menu [frames] '("Stack" . gdb-display-stack-buffer))
   (define-key menu [breakpoints] '("Breakpoints" . gdb-display-breakpoints-buffer))
   (define-key menu [display] '("Display" . gdb-display-display-buffer))
+  (define-key menu [threads] '("Threads" . gdb-display-threads-buffer))
   (define-key menu [assembler] '("Assembler" . gdb-display-assembler-buffer)))
 
 (defun gdb-frame-gdb-buffer ()
@@ -1916,6 +1994,7 @@ the source buffer."
   (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer))
   (define-key menu [breakpoints] '("Breakpoints" . gdb-frame-breakpoints-buffer))
   (define-key menu [display] '("Display" . gdb-frame-display-buffer))
+  (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer))
   (define-key menu [assembler] '("Assembler" . gdb-frame-assembler-buffer)))
 
 (defvar gdb-main-file nil "Source file from which program execution begins.")
@@ -2246,11 +2325,11 @@ BUFFER nil or omitted means use the current buffer."
        (save-excursion
          (set-buffer gud-comint-buffer)
          (let ((queue gdb-idle-input-queue) (item))
-           (while queue
+           (dolist (item queue)
              (setq item (car queue))
              (if (equal (cdr item) '(gdb-assembler-handler))
-                 (delete item gdb-idle-input-queue))
-             (setq queue (cdr queue)))))
+                 (setq gdb-idle-input-queue 
+                       (delete item gdb-idle-input-queue))))))
        (gdb-enqueue-idle-input
         (list (concat "server disassemble " gdb-main-or-pc "\n")
               'gdb-assembler-handler))