You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
7.1 KiB
225 lines
7.1 KiB
;; Copyright (C) 2010, 2014-2016, 2019 Free Software Foundation, Inc
|
|
|
|
;; Author: Rocky Bernstein <rocky@gnu.org>
|
|
|
|
;; This program is free software; you can redistribute it and/or modify
|
|
;; it under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
;; (at your option) any later version.
|
|
|
|
;; This program is distributed in the hope that it will be useful,
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;; GNU General Public License for more details.
|
|
|
|
(require 'load-relative)
|
|
(require-relative-list '("helper") "realgud-")
|
|
(require-relative-list '("buffer/helper") "realgud-buffer-")
|
|
|
|
(declare-function realgud:backtrace-init 'realgud-buffer-helper)
|
|
(declare-function realgud:breakpoint-init 'realgud-buffer-helper)
|
|
(declare-function realgud-get-backtrace-buf 'realgud-buffer-helper)
|
|
(declare-function realgud-get-breakpoint-buf 'realgud-buffer-helper)
|
|
(declare-function realgud-get-cmdbuf 'realgud-buffer-helper)
|
|
(declare-function realgud-get-srcbuf 'realgud-buffer-helper)
|
|
(declare-function buffer-killed? 'realgud-helper)
|
|
|
|
(declare-function one-window-p(bool))
|
|
|
|
(defun realgud-window-update-position (buffer marker)
|
|
"Update BUFFER to position specified with MARKER.
|
|
We assume MARKER points inside BUFFER"
|
|
(with-current-buffer buffer
|
|
(goto-char marker)
|
|
(let ((window (get-buffer-window buffer)))
|
|
(if window (set-window-point window marker))
|
|
)))
|
|
|
|
|
|
(defun realgud-window-src ( &optional opt-buffer )
|
|
"Make sure the source buffer is displayed in a window
|
|
We don't care if the command buffer is also displayed.
|
|
See also `realgud-window-src-undisturb-cmd'"
|
|
(let* ((buffer (or opt-buffer (current-buffer)))
|
|
(src-buffer (realgud-get-srcbuf buffer))
|
|
(src-window (get-buffer-window src-buffer 'visible))
|
|
(window (selected-window)))
|
|
(if src-buffer
|
|
(unless (and src-window (not (window-minibuffer-p)))
|
|
(set-window-buffer window src-buffer))
|
|
)
|
|
))
|
|
|
|
(defun realgud-window-src-undisturb-cmd ( &optional opt-buffer )
|
|
"Make sure the source buffers is displayed in windows without
|
|
disturbing the command window if it is also displayed. Returns
|
|
the command window
|
|
See also `realgud-window-src'."
|
|
(interactive)
|
|
(let* ((buffer (or opt-buffer (current-buffer)))
|
|
(src-buffer (realgud-get-srcbuf buffer))
|
|
(src-window (get-buffer-window src-buffer))
|
|
(cmd-buffer (realgud-get-cmdbuf buffer))
|
|
(cmd-window (get-buffer-window cmd-buffer))
|
|
(window (selected-window))
|
|
)
|
|
(if src-buffer
|
|
(unless src-window
|
|
(setq src-window
|
|
(if (eq window cmd-window)
|
|
;; FIXME: generalize what to do here.
|
|
(if (one-window-p 't)
|
|
(split-window)
|
|
(next-window window 'no-minibuf))
|
|
window))
|
|
(set-window-buffer src-window src-buffer))
|
|
)
|
|
(select-window src-window)
|
|
cmd-window)
|
|
)
|
|
|
|
(defun realgud-window-cmd-undisturb-src ( &optional opt-buffer switch?)
|
|
"Make sure the command buffer is displayed in windows without
|
|
disturbing the command window if it is also displayed. Returns
|
|
the source window."
|
|
(interactive)
|
|
(let* ((buffer (or opt-buffer (current-buffer)))
|
|
(src-buffer (realgud-get-srcbuf buffer))
|
|
(src-window (get-buffer-window src-buffer))
|
|
(cmd-buffer (realgud-get-cmdbuf buffer))
|
|
(cmd-window (get-buffer-window cmd-buffer))
|
|
(window (selected-window))
|
|
)
|
|
(when cmd-buffer
|
|
(unless cmd-window
|
|
(setq cmd-window
|
|
(if (eq window src-window)
|
|
;; FIXME: generalize what to do here.
|
|
(if (one-window-p 't)
|
|
(split-window)
|
|
(next-window window 'no-minibuf))
|
|
window))
|
|
(set-window-buffer cmd-window cmd-buffer)
|
|
)
|
|
(if switch?
|
|
(and (select-window cmd-window)
|
|
(switch-to-buffer cmd-buffer)))
|
|
|
|
)
|
|
(select-window cmd-window)
|
|
src-window)
|
|
)
|
|
|
|
(defun realgud:window-bt-undisturb-src ( &optional opt-buffer switch?)
|
|
"Make sure the backtrace buffer is displayed in windows without
|
|
disturbing the source window if it is also displayed. Returns
|
|
the source window
|
|
See also `realgud-window-src'"
|
|
(interactive)
|
|
(let* ((buffer (or opt-buffer (current-buffer)))
|
|
(src-buffer (realgud-get-srcbuf buffer))
|
|
(src-window (get-buffer-window src-buffer))
|
|
(cmd-buffer (realgud-get-cmdbuf buffer))
|
|
(cmd-window (get-buffer-window cmd-buffer))
|
|
(bt-buffer (realgud-get-backtrace-buf cmd-buffer))
|
|
(bt-window (get-buffer-window bt-buffer))
|
|
(window (selected-window))
|
|
)
|
|
(when cmd-buffer
|
|
(unless bt-window
|
|
(setq bt-window
|
|
(if (eq window src-window)
|
|
;; FIXME: generalize what to do here.
|
|
(if (one-window-p 't)
|
|
(split-window)
|
|
(next-window window 'no-minibuf))
|
|
window))
|
|
(set-window-buffer bt-window bt-buffer)
|
|
)
|
|
(if switch?
|
|
(and (select-window bt-window)
|
|
(switch-to-buffer bt-buffer)))
|
|
|
|
)
|
|
src-window)
|
|
)
|
|
|
|
(defun realgud:window-brkpt-undisturb-src ( &optional opt-buffer switch?)
|
|
"Make sure the backtrace buffer is displayed in windows without
|
|
disturbing the source window if it is also displayed. Returns
|
|
the source window
|
|
See also `realgud-window-src'"
|
|
(interactive)
|
|
(let* ((buffer (or opt-buffer (current-buffer)))
|
|
(src-buffer (realgud-get-srcbuf buffer))
|
|
(src-window (get-buffer-window src-buffer))
|
|
(cmd-buffer (realgud-get-cmdbuf buffer))
|
|
(cmd-window (get-buffer-window cmd-buffer))
|
|
(brkpt-buffer (realgud-get-breakpoint-buf cmd-buffer))
|
|
(brkpt-window (get-buffer-window brkpt-buffer))
|
|
(window (selected-window))
|
|
)
|
|
(when cmd-buffer
|
|
(unless brkpt-window
|
|
(setq brkpt-window
|
|
(if (eq window src-window)
|
|
;; FIXME: generalize what to do here.
|
|
(if (one-window-p 't)
|
|
(split-window)
|
|
(next-window window 'no-minibuf))
|
|
window))
|
|
(set-window-buffer brkpt-window brkpt-buffer)
|
|
)
|
|
(if switch?
|
|
(and (select-window brkpt-window)
|
|
(switch-to-buffer brkpt-buffer)))
|
|
|
|
)
|
|
src-window)
|
|
)
|
|
|
|
(defun realgud:window-bt()
|
|
"Refresh backtrace information and display that in a buffer"
|
|
(interactive)
|
|
(with-current-buffer-safe (realgud-get-cmdbuf)
|
|
(realgud:backtrace-init)
|
|
(realgud:window-bt-undisturb-src)
|
|
)
|
|
)
|
|
|
|
|
|
(defun realgud:window-brkpt()
|
|
"Refresh breakpoint information and display that in a buffer"
|
|
(interactive)
|
|
(with-current-buffer-safe (realgud-get-cmdbuf)
|
|
(realgud:breakpoint-init)
|
|
(realgud:window-brkpt-undisturb-src)
|
|
)
|
|
)
|
|
|
|
|
|
;; (defun realgud-window-src-and-cmd ( &optional opt-buffer )
|
|
;; "Make sure the source buffers is displayed in windows without
|
|
;; disturbing the command window if it is also displayed. Returns
|
|
;; the command window
|
|
;; See also `realgud-window-src-window'"
|
|
;; (interactive)
|
|
;; (let* ((buffer (or opt-buffer (current-buffer)))
|
|
;; (src-buffer (realgud-get-srcbuf buffer))
|
|
;; (src-window (get-buffer-window src-buffer))
|
|
;; (cmd-buffer (realgud-get-cmdbuf buffer))
|
|
;; (cmd-window (get-buffer-window cmd-buffer))
|
|
;; (window (selected-window))
|
|
;; )
|
|
;; (if src-buffer
|
|
;; (unless src-window
|
|
;; (setq src-window
|
|
;; (if (eq window cmd-window)
|
|
;; (if (one-window-p 't) (split-window) (next-window window))
|
|
;; window))
|
|
;; (set-window-buffer src-window src-buffer))
|
|
;; )
|
|
;; cmd-window)
|
|
;; )
|
|
|
|
(provide-me "realgud-")
|