]> git.eshelyaron.com Git - emacs.git/commitdiff
In edebug in GUIs, move focus to the selected frame.
authorAlan Mackenzie <acm@muc.de>
Fri, 19 Oct 2018 17:44:31 +0000 (17:44 +0000)
committerAlan Mackenzie <acm@muc.de>
Fri, 19 Oct 2018 17:44:31 +0000 (17:44 +0000)
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
src/keyboard.c

index fb567c9cce0f0cc1ab8b3f62ff02f38b5c15db7a..ce4ed687be47fec130e15ea26aac781792ea16d8 100644 (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 ()
index 8ea15d3c890b02f7fd518fa967c22f04f732c150..be727a6549ade707b4f450a94281aedeb5bb9b6c 100644 (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