From 7cfe2dc415d0a5768f9e6800836ff6887079dc30 Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Fri, 19 Oct 2018 17:44:31 +0000 Subject: [PATCH] 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. --- lisp/emacs-lisp/edebug.el | 20 +++++++++++++++++--- src/keyboard.c | 5 +++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index fb567c9cce0..ce4ed687be4 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -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)) "")) (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 () diff --git a/src/keyboard.c b/src/keyboard.c index 8ea15d3c890..be727a6549a 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -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 -- 2.39.5