emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/exwm dd6596b 2/2: Another fix for input focus issues


From: Chris Feng
Subject: [elpa] externals/exwm dd6596b 2/2: Another fix for input focus issues
Date: Fri, 24 Nov 2017 09:53:48 -0500 (EST)

branch: externals/exwm
commit dd6596b1f41a02021d5b60e823a3ae7e5664c92a
Author: Chris Feng <address@hidden>
Commit: Chris Feng <address@hidden>

    Another fix for input focus issues
    
    * exwm-core.el (exwm--defer):
    * exwm-input.el (exwm-input--update-focus-defer): Avoid unnecessarily
    long delay.
    
    * exwm-input.el (exwm-input--on-FocusIn): Filter out FocusIn events
    generated as a result of grab/ungrab or when the keyboard is grabbed.
---
 exwm-core.el  |  8 +++++---
 exwm-input.el | 29 ++++++++++++++---------------
 2 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/exwm-core.el b/exwm-core.el
index 146594d..2c810df 100644
--- a/exwm-core.el
+++ b/exwm-core.el
@@ -76,10 +76,12 @@
   (xcb:flush exwm--connection))
 
 (defmacro exwm--defer (secs function &rest args)
-  "Defer the action until SECS seconds later.
+  "Defer the execution of FUNCTION.
 
-The action is to call FUNCTION with arguments ARGS."
-  `(run-with-idle-timer (time-add (or (current-idle-time) 0) ,secs)
+The action is to call FUNCTION with arguments ARGS.  If Emacs is not idle,
+defer the action until Emacs is idle.  Otherwise, defer the action until at
+least SECS seconds later."
+  `(run-with-idle-timer (time-add (or (current-idle-time) (- ,secs)) ,secs)
                         nil
                         ,function
                         ,@args))
diff --git a/exwm-input.el b/exwm-input.el
index 6a60ac3..7bcbc9e 100644
--- a/exwm-input.el
+++ b/exwm-input.el
@@ -116,18 +116,16 @@ ARGS are additional arguments to CALLBACK."
                (cdr exwm-input--timestamp-callback))
         (setq exwm-input--timestamp-callback nil)))))
 
-(defun exwm-input--on-FocusIn (&rest _args)
+(defun exwm-input--on-FocusIn (data _synthetic)
   "Handle FocusIn events."
-  ;; Not sure if this is the right thing to do but the point is the
-  ;; input focus should not stay at the root window or any container,
-  ;; or the result would be unpredictable.  `x-focus-frame' would
-  ;; first set the input focus to the (previously) selected frame, and
-  ;; then `select-window' would further update the input focus if the
-  ;; selected window is displaying an `exwm-mode' buffer.  Perhaps we
-  ;; should carefully filter out FocusIn events with certain 'detail'
-  ;; and 'mode' combinations, but this just works.
-  (x-focus-frame (selected-frame))
-  (select-window (selected-window)))
+  (let ((obj (make-instance 'xcb:FocusIn)))
+    (xcb:unmarshal obj data)
+    (with-slots (mode) obj
+      ;; Revert input focus back to Emacs frame / X window when it's set on
+      ;; the root window or some workspace container.
+      (when (eq mode xcb:NotifyMode:Normal)
+        (x-focus-frame (selected-frame))
+        (select-window (selected-window))))))
 
 (defun exwm-input--on-workspace-list-change ()
   "Run in `exwm-input--update-global-prefix-keys'."
@@ -139,7 +137,6 @@ ARGS are additional arguments to CALLBACK."
           (make-instance 'xcb:ChangeWindowAttributes
                          :window (frame-parameter f 'exwm-workspace)
                          :value-mask xcb:CW:EventMask
-                         ;; There should no other event selected there.
                          :event-mask xcb:EventMask:FocusChange))))
   (exwm-input--update-global-prefix-keys)
   (xcb:flush exwm--connection))
@@ -193,9 +190,11 @@ This value should always be overwritten.")
     (when exwm-input--update-focus-timer
       (cancel-timer exwm-input--update-focus-timer))
     (setq exwm-input--update-focus-timer
-          (exwm--defer exwm-input--update-focus-interval
-                       #'exwm-input--update-focus-commit
-                       exwm-input--update-focus-window))))
+          ;; Attempt to accumulate successive events close enough.
+          (run-with-timer exwm-input--update-focus-interval
+                          nil
+                          #'exwm-input--update-focus-commit
+                          exwm-input--update-focus-window))))
 
 (declare-function exwm-layout--iconic-state-p "exwm-layout.el" (&optional id))
 (declare-function exwm-layout--set-state "exwm-layout.el" (id state))



reply via email to

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