emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 7cfe2dc: In edebug in GUIs, move focus to the selec


From: Alan Mackenzie
Subject: [Emacs-diffs] master 7cfe2dc: In edebug in GUIs, move focus to the selected frame.
Date: Fri, 19 Oct 2018 13:54:17 -0400 (EDT)

branch: master
commit 7cfe2dc415d0a5768f9e6800836ff6887079dc30
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>

    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 fb567c9..ce4ed68 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)) "<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 ()
diff --git a/src/keyboard.c b/src/keyboard.c
index 8ea15d3..be727a6 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]