diff options
author | Chris Feng <chris.w.feng@gmail.com> | 2015-09-20T02·51+0800 |
---|---|---|
committer | Chris Feng <chris.w.feng@gmail.com> | 2015-09-20T02·51+0800 |
commit | 9f30672b15abd84e5755ed36f505830e80739b13 (patch) | |
tree | caa22af6a6b7625e9b4e1be222d9fc908826b576 /exwm-input.el | |
parent | 81478de9e6676ebe3c67d4673a7d4e56e7ad2265 (diff) |
Fix input & input focus issues
* exwm-manage.el (exwm-manage--manage-window): Only grab left/middle/right buttons. * exwm-input.el (exwm-input--on-ButtonPress): Only perform click-to-focus on unfocused X windows. * exwm-input.el (exwm-input--update-focus): Do not focus an X window on another workspace, but instead keep focusing on the current one and set exwm--urgency parameter on that frame. * exwm-input.el (exwm-input--fake-key): Send KeyRelease event (some applications reply on it).
Diffstat (limited to 'exwm-input.el')
-rw-r--r-- | exwm-input.el | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/exwm-input.el b/exwm-input.el index 042467b96125..eb287925a5a7 100644 --- a/exwm-input.el +++ b/exwm-input.el @@ -114,7 +114,14 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (when exwm-input--focus-window (with-current-buffer (window-buffer exwm-input--focus-window) (if (eq major-mode 'exwm-mode) - (progn + (if (not (eq exwm--frame exwm-workspace--current)) + ;; Do not focus X windows on other workspace + (progn + (set-frame-parameter exwm--frame 'exwm--urgency t) + (setq exwm-workspace--switch-history-outdated t) + (force-mode-line-update) + ;; The application may have changed its input focus + (exwm-workspace-switch exwm-workspace-current-index t)) (when exwm--floating-frame (redirect-frame-focus exwm--floating-frame nil) (select-frame-set-input-focus exwm--floating-frame t)) @@ -180,7 +187,9 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (exwm-floating--start-moveresize event)) (t ;; Click to focus - (select-window (get-buffer-window (exwm--id->buffer event) t)) + (let ((window (get-buffer-window (exwm--id->buffer event) t))) + (unless (eq window (selected-window)) + (select-window window))) ;; The event should be replayed (setq mode xcb:Allow:ReplayPointer)))) (xcb:+request exwm--connection @@ -360,21 +369,22 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (keycode (xcb:keysyms:keysym->keycode exwm--connection (car keysym))) (id (exwm--buffer->id (window-buffer (selected-window))))) (when keycode - (xcb:+request exwm--connection - (make-instance 'xcb:SendEvent - :propagate 0 :destination id - :event-mask xcb:EventMask:NoEvent - :event (xcb:marshal - (make-instance 'xcb:KeyPress - :detail keycode - :time xcb:Time:CurrentTime - :root exwm--root :event id - :child 0 - :root-x 0 :root-y 0 - :event-x 0 :event-y 0 - :state (cadr keysym) - :same-screen 1) - exwm--connection)))) + (dolist (class '(xcb:KeyPress xcb:KeyRelease)) + (xcb:+request exwm--connection + (make-instance 'xcb:SendEvent + :propagate 0 :destination id + :event-mask xcb:EventMask:NoEvent + :event (xcb:marshal + (make-instance class + :detail keycode + :time xcb:Time:CurrentTime + :root exwm--root :event id + :child 0 + :root-x 0 :root-y 0 + :event-x 0 :event-y 0 + :state (cadr keysym) + :same-screen 1) + exwm--connection))))) (xcb:flush exwm--connection))) ;;;###autoload |