From 22ee3e6c5ffdc73f231e7125f48827dc1d44237f Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Wed, 23 Sep 2015 12:53:08 +0800 Subject: [PATCH] Adjust default prefix keys; advice x-create-frame * exwm-input.el (exwm-input--on-KeyPress-line-mode, exwm-input-prefix-keys): Allow users to disable 'C-c' prefixed keys; Add 'C-c' to / remove 'M-!' from the default prefix keys. * exwm-workspace.el (exwm-workspace--x-create-frame, exwm-workspace--init): Advice `x-create-frame' to prevent it from hanging EXWM, making e.g. speedbar working. * exwm-floating.el (exwm-floating--set-floating): Remove the now unnecessary request that sets override-redirect on floating frames. --- exwm-floating.el | 5 ----- exwm-input.el | 3 +-- exwm-workspace.el | 14 ++++++++++++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/exwm-floating.el b/exwm-floating.el index 36a658a..924f7cf 100644 --- a/exwm-floating.el +++ b/exwm-floating.el @@ -141,11 +141,6 @@ (setq x (/ (- display-width width) 2) y (/ (- display-height height) 2)))))) (exwm--log "Floating geometry (corrected): %dx%d%+d%+d" width height x y) - ;; Set OverrideRedirect on this frame - (xcb:+request exwm--connection - (make-instance 'xcb:ChangeWindowAttributes - :window outer-id :value-mask xcb:CW:OverrideRedirect - :override-redirect 1)) ;; Set event mask (xcb:+request exwm--connection (make-instance 'xcb:ChangeWindowAttributes diff --git a/exwm-input.el b/exwm-input.el index eb28792..9645182 100644 --- a/exwm-input.el +++ b/exwm-input.el @@ -209,7 +209,7 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (defvar exwm-input--global-prefix-keys nil "List of prefix keys of global key bindings.") (defvar exwm-input-prefix-keys - '(?\C-x ?\C-u ?\C-h ?\M-x ?\M-` ?\M-! ?\M-& ?\M-:) + '(?\C-c ?\C-x ?\C-u ?\C-h ?\M-x ?\M-` ?\M-& ?\M-:) "List of prefix keys EXWM should forward to Emacs when in line-mode.") (defvar exwm-input--simulation-keys nil "Simulation keys in line-mode.") (defvar exwm-input--simulation-prefix-keys nil @@ -259,7 +259,6 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (setq event (xcb:keysyms:keysym->event keysym state)) (or exwm-input--during-key-sequence (setq minibuffer-window (active-minibuffer-window)) - (eq event ?\C-c) ;mode-specific key (memq event exwm-input--global-prefix-keys) (memq event exwm-input-prefix-keys) (memq event exwm-input--simulation-prefix-keys))) diff --git a/exwm-workspace.el b/exwm-workspace.el index 03972b4..566ea53 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -263,6 +263,18 @@ The optional FORCE option is for internal use only." (setq newname (format "%s<%d>" basename (cl-incf counter)))) (rename-buffer (concat (and hidden " ") newname)))) +(defun exwm-workspace--x-create-frame (orig-fun params) + "Set override-redirect on the frame created by `x-create-frame'." + (let ((frame (funcall orig-fun params))) + (xcb:+request exwm--connection + (make-instance 'xcb:ChangeWindowAttributes + :window (string-to-number + (frame-parameter frame 'outer-window-id)) + :value-mask xcb:CW:OverrideRedirect + :override-redirect 1)) + (xcb:flush exwm--connection) + frame)) + (defun exwm-workspace--init () "Initialize workspace module." (cl-assert (and (< 0 exwm-workspace-number) (>= 10 exwm-workspace-number))) @@ -306,6 +318,8 @@ The optional FORCE option is for internal use only." :window window-id :value-mask xcb:CW:EventMask :event-mask xcb:EventMask:SubstructureRedirect)))) (xcb:flush exwm--connection) + ;; We have to advice `x-create-frame' or every call to it would hang EXWM + (advice-add 'x-create-frame :around #'exwm-workspace--x-create-frame) ;; We have to delay making the frame visible until the ;; override-redirect flag has been set. (select-frame-set-input-focus (car exwm-workspace--list))