In edebug in GUIs, move focus to the selected frame.

Thus when entering edebug, the focus will be moved to the frame with the
source being debugged, and when its finished, the focus will move back.
Commands edebug-visit-eval-list (`E') and edebug-bounce-point (`p') have been
likewise amended.

* src/keyboard.c (readable_events): Handle FOCUS_OUT_EVENT as an invisible
event.  This prevents input-pending-p returning t when one of these events
arrives, and thus obviates an instant termination of sit-for when there's no
"real" event waiting.

* lisp/emacs-lisp/edebug.el (edebug-focus-frame): New function.
(edebug-default-enter, edebug--display-1, edbug-where, edebug-bounce-point)
(edebug-visit-eval-list): Call edebug-focus-frame to move focus into the
window newly selected by edebug-pop-to-buffer.
This commit is contained in:
Alan Mackenzie 2018-10-19 17:44:31 +00:00
parent d2a07b9a82
commit 7cfe2dc415
2 changed files with 20 additions and 5 deletions

View file

@ -342,6 +342,12 @@ Return the result of the last expression in BODY."
(defconst edebug-trace-buffer "*edebug-trace*"
"Name of the buffer to put trace info in.")
(defun edebug-focus-frame (frame)
"Switch focus to frame FRAME, if we're in a GUI.
Otherwise, do nothing."
(unless (memq (framep frame) '(nil t pc))
(x-focus-frame frame)))
(defun edebug-pop-to-buffer (buffer &optional window)
;; Like pop-to-buffer, but select window where BUFFER was last shown.
;; Select WINDOW if it is provided and still exists. Otherwise,
@ -2328,6 +2334,7 @@ and run its entry function, and set up `edebug-before' and
(debugger edebug-debugger) ; only while edebug is active.
(edebug-outside-debug-on-error debug-on-error)
(edebug-outside-debug-on-quit debug-on-quit)
(outside-frame (selected-frame))
;; Binding these may not be the right thing to do.
;; We want to allow the global values to be changed.
(debug-on-error (or debug-on-error edebug-on-error))
@ -2338,7 +2345,9 @@ and run its entry function, and set up `edebug-before' and
edebug-initial-mode
edebug-execution-mode)
edebug-next-execution-mode nil)
(edebug-default-enter function args body))))
(edebug-default-enter function args body))
(if (frame-live-p outside-frame)
(edebug-focus-frame outside-frame))))
(let* ((edebug-data (get function 'edebug))
(edebug-def-mark (car edebug-data)) ; mark at def start
@ -2647,6 +2656,7 @@ See `edebug-behavior-alist' for implementations.")
(edebug-eval-display eval-result-list)
;; The evaluation list better not have deleted edebug-window-data.
(select-window (car edebug-window-data))
(edebug-focus-frame (window-frame (selected-window)))
(set-buffer edebug-buffer)
(setq edebug-buffer-outside-point (point))
@ -3017,6 +3027,7 @@ Otherwise, toggle for all windows."
;;(if edebug-inside-windows
;; (edebug-set-windows edebug-inside-windows))
(edebug-pop-to-buffer edebug-buffer)
(edebug-focus-frame (window-frame (selected-window)))
(goto-char edebug-point))
(defun edebug-view-outside ()
@ -3044,13 +3055,15 @@ before returning. The default is one second."
;; If the buffer's currently displayed, avoid set-window-configuration.
(save-window-excursion
(edebug-pop-to-buffer edebug-outside-buffer)
(edebug-focus-frame (window-frame (selected-window)))
(goto-char edebug-outside-point)
(message "Current buffer: %s Point: %s Mark: %s"
(current-buffer) (point)
(if (marker-buffer (edebug-mark-marker))
(marker-position (edebug-mark-marker)) "<not set>"))
(sit-for arg)
(edebug-pop-to-buffer edebug-buffer (car edebug-window-data)))))
(edebug-pop-to-buffer edebug-buffer (car edebug-window-data))
(edebug-focus-frame (window-frame (selected-window))))))
;; Joe Wells, here is a start at your idea of adding a buffer to the internal
@ -3872,7 +3885,8 @@ May only be called from within `edebug--recursive-edit'."
"Switch to the evaluation list buffer \"*edebug*\"."
(interactive)
(edebug-eval-redisplay)
(edebug-pop-to-buffer edebug-eval-buffer))
(edebug-pop-to-buffer edebug-eval-buffer)
(edebug-focus-frame (window-frame (selected-window))))
(defun edebug-update-eval-list ()

View file

@ -3324,7 +3324,7 @@ readable_events (int flags)
if (flags & READABLE_EVENTS_DO_TIMERS_NOW)
timer_check ();
/* If the buffer contains only FOCUS_IN_EVENT events, and
/* If the buffer contains only FOCUS_IN/OUT_EVENT events, and
READABLE_EVENTS_FILTER_EVENTS is set, report it as empty. */
if (kbd_fetch_ptr != kbd_store_ptr)
{
@ -3344,7 +3344,8 @@ readable_events (int flags)
#ifdef USE_TOOLKIT_SCROLL_BARS
(flags & READABLE_EVENTS_FILTER_EVENTS) &&
#endif
event->kind == FOCUS_IN_EVENT)
(event->kind == FOCUS_IN_EVENT
|| event->kind == FOCUS_OUT_EVENT))
#ifdef USE_TOOLKIT_SCROLL_BARS
&& !((flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
&& (event->kind == SCROLL_BAR_CLICK_EVENT