mirror of
https://github.com/emacs-exwm/exwm.git
synced 2024-11-23 21:17:59 +01:00
Merge branch 'master' of github.com:emacs-exwm/exwm
This commit is contained in:
commit
dddef55e39
6 changed files with 34 additions and 185 deletions
145
exwm-config.el
145
exwm-config.el
|
@ -1,145 +0,0 @@
|
||||||
;;; exwm-config.el --- Predefined configurations -*- lexical-binding: t -*-
|
|
||||||
|
|
||||||
;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
;; Author: Chris Feng <chris.w.feng@gmail.com>
|
|
||||||
|
|
||||||
;; This file is part of GNU Emacs.
|
|
||||||
|
|
||||||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
|
||||||
;; it under the terms of the GNU General Public License as published by
|
|
||||||
;; the Free Software Foundation, either version 3 of the License, or
|
|
||||||
;; (at your option) any later version.
|
|
||||||
|
|
||||||
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
||||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
;; GNU General Public License for more details.
|
|
||||||
|
|
||||||
;; You should have received a copy of the GNU General Public License
|
|
||||||
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
|
|
||||||
;; This module contains an example configuration of EXWM. Do not require this
|
|
||||||
;; file directly in your user configuration. Instead take it as inspiration and
|
|
||||||
;; copy the relevant settings to your user configuration.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(require 'exwm)
|
|
||||||
|
|
||||||
(defun exwm-config--warn ()
|
|
||||||
"Print obsoletion warning."
|
|
||||||
(fset #'exwm-config--warn #'ignore)
|
|
||||||
(warn "The `exwm-config' file has been deprecated. We do not recommend requiring
|
|
||||||
`exwm-config' directly in your Emacs configuration. Instead copy the relevant
|
|
||||||
settings to your configuration and modify them as needed. The code from here
|
|
||||||
will be moved out of the source repository to the manual after the next
|
|
||||||
release. See https://github.com/emacs-exwm/exwm/issues/57."))
|
|
||||||
|
|
||||||
(defun exwm-config-example ()
|
|
||||||
"Default configuration of EXWM."
|
|
||||||
(exwm-config--warn)
|
|
||||||
;; Set the initial workspace number.
|
|
||||||
(unless (get 'exwm-workspace-number 'saved-value)
|
|
||||||
(setq exwm-workspace-number 4))
|
|
||||||
;; Make class name the buffer name
|
|
||||||
(add-hook 'exwm-update-class-hook
|
|
||||||
(lambda ()
|
|
||||||
(exwm-workspace-rename-buffer exwm-class-name)))
|
|
||||||
;; Global keybindings.
|
|
||||||
(unless (get 'exwm-input-global-keys 'saved-value)
|
|
||||||
(setq exwm-input-global-keys
|
|
||||||
`(
|
|
||||||
;; 's-r': Reset (to line-mode).
|
|
||||||
([?\s-r] . exwm-reset)
|
|
||||||
;; 's-w': Switch workspace.
|
|
||||||
([?\s-w] . exwm-workspace-switch)
|
|
||||||
;; 's-&': Launch application.
|
|
||||||
([?\s-&] . (lambda (command)
|
|
||||||
(interactive (list (read-shell-command "$ ")))
|
|
||||||
(start-process-shell-command command nil command)))
|
|
||||||
;; 's-N': Switch to certain workspace.
|
|
||||||
,@(mapcar (lambda (i)
|
|
||||||
`(,(kbd (format "s-%d" i)) .
|
|
||||||
(lambda ()
|
|
||||||
(interactive)
|
|
||||||
(exwm-workspace-switch-create ,i))))
|
|
||||||
(number-sequence 0 9)))))
|
|
||||||
;; Line-editing shortcuts
|
|
||||||
(unless (get 'exwm-input-simulation-keys 'saved-value)
|
|
||||||
(setq exwm-input-simulation-keys
|
|
||||||
'(([?\C-b] . [left])
|
|
||||||
([?\C-f] . [right])
|
|
||||||
([?\C-p] . [up])
|
|
||||||
([?\C-n] . [down])
|
|
||||||
([?\C-a] . [home])
|
|
||||||
([?\C-e] . [end])
|
|
||||||
([?\M-v] . [prior])
|
|
||||||
([?\C-v] . [next])
|
|
||||||
([?\C-d] . [delete])
|
|
||||||
([?\C-k] . [S-end delete]))))
|
|
||||||
;; Enable EXWM
|
|
||||||
(exwm-enable)
|
|
||||||
;; Configure Ido
|
|
||||||
(with-no-warnings (exwm-config-ido))
|
|
||||||
;; Other configurations
|
|
||||||
(with-no-warnings (exwm-config-misc)))
|
|
||||||
(make-obsolete 'exwm-config-example "Copy the relevant settings to your configuration." "0.30")
|
|
||||||
|
|
||||||
(defun exwm-config--fix/ido-buffer-window-other-frame ()
|
|
||||||
"Fix `ido-buffer-window-other-frame'."
|
|
||||||
(defalias 'exwm-config-ido-buffer-window-other-frame
|
|
||||||
(symbol-function 'ido-buffer-window-other-frame))
|
|
||||||
(defun ido-buffer-window-other-frame (buffer)
|
|
||||||
"This is a version redefined by EXWM.
|
|
||||||
|
|
||||||
You can find the original one at `exwm-config-ido-buffer-window-other-frame'."
|
|
||||||
(with-current-buffer (window-buffer (selected-window))
|
|
||||||
(if (and (derived-mode-p 'exwm-mode)
|
|
||||||
exwm--floating-frame)
|
|
||||||
;; Switch from a floating frame.
|
|
||||||
(with-current-buffer buffer
|
|
||||||
(if (and (derived-mode-p 'exwm-mode)
|
|
||||||
exwm--floating-frame
|
|
||||||
(eq exwm--frame exwm-workspace--current))
|
|
||||||
;; Switch to another floating frame.
|
|
||||||
(frame-root-window exwm--floating-frame)
|
|
||||||
;; Do not switch if the buffer is not on the current workspace.
|
|
||||||
(or (get-buffer-window buffer exwm-workspace--current)
|
|
||||||
(selected-window))))
|
|
||||||
(with-current-buffer buffer
|
|
||||||
(when (derived-mode-p 'exwm-mode)
|
|
||||||
(if (eq exwm--frame exwm-workspace--current)
|
|
||||||
(when exwm--floating-frame
|
|
||||||
;; Switch to a floating frame on the current workspace.
|
|
||||||
(frame-selected-window exwm--floating-frame))
|
|
||||||
;; Do not switch to exwm-mode buffers on other workspace (which
|
|
||||||
;; won't work unless `exwm-layout-show-all-buffers' is set)
|
|
||||||
(unless exwm-layout-show-all-buffers
|
|
||||||
(selected-window)))))))))
|
|
||||||
|
|
||||||
(defun exwm-config-ido ()
|
|
||||||
"Configure Ido to work with EXWM."
|
|
||||||
(exwm-config--warn)
|
|
||||||
(declare-function ido-mode "ido")
|
|
||||||
(ido-mode 1)
|
|
||||||
(add-hook 'exwm-init-hook #'exwm-config--fix/ido-buffer-window-other-frame))
|
|
||||||
(make-obsolete 'exwm-config-ido "Copy the relevant settings to your configuration." "0.30")
|
|
||||||
|
|
||||||
(defun exwm-config-misc ()
|
|
||||||
"Other configurations."
|
|
||||||
(exwm-config--warn)
|
|
||||||
;; Make more room
|
|
||||||
(menu-bar-mode -1)
|
|
||||||
(tool-bar-mode -1)
|
|
||||||
(scroll-bar-mode -1)
|
|
||||||
(fringe-mode 1))
|
|
||||||
(make-obsolete 'exwm-config-misc "Copy the relevant settings to your configuration." "0.30")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(provide 'exwm-config)
|
|
||||||
|
|
||||||
;;; exwm-config.el ends here
|
|
|
@ -351,6 +351,8 @@ If TILED-P is non-nil, set actions for tiled window."
|
||||||
(set-window-buffer window (current-buffer)) ;this changes current buffer
|
(set-window-buffer window (current-buffer)) ;this changes current buffer
|
||||||
(add-hook 'window-configuration-change-hook #'exwm-layout--refresh)
|
(add-hook 'window-configuration-change-hook #'exwm-layout--refresh)
|
||||||
(set-window-dedicated-p window t)
|
(set-window-dedicated-p window t)
|
||||||
|
(set-window-parameter window 'split-window
|
||||||
|
(lambda (&rest _) (user-error "Floating window cannot be split")))
|
||||||
(exwm-layout--show id window))
|
(exwm-layout--show id window))
|
||||||
(with-current-buffer (exwm--id->buffer id)
|
(with-current-buffer (exwm--id->buffer id)
|
||||||
(if (exwm-layout--iconic-state-p id)
|
(if (exwm-layout--iconic-state-p id)
|
||||||
|
@ -710,17 +712,28 @@ Float resizing is stopped when TYPE is nil."
|
||||||
:height height))
|
:height height))
|
||||||
(when (bufferp buffer-or-id)
|
(when (bufferp buffer-or-id)
|
||||||
;; Managed.
|
;; Managed.
|
||||||
(setq value-mask (logand value-mask (logior xcb:ConfigWindow:Width
|
|
||||||
xcb:ConfigWindow:Height)))
|
|
||||||
(when (/= 0 value-mask)
|
|
||||||
(with-current-buffer buffer-or-id
|
(with-current-buffer buffer-or-id
|
||||||
|
(let ((resize-value-mask
|
||||||
|
(logand value-mask (logior xcb:ConfigWindow:Width
|
||||||
|
xcb:ConfigWindow:Height)))
|
||||||
|
(move-value-mask
|
||||||
|
(logand value-mask (logior xcb:ConfigWindow:X
|
||||||
|
xcb:ConfigWindow:Y))))
|
||||||
|
(when (/= 0 resize-value-mask)
|
||||||
(xcb:+request exwm--connection
|
(xcb:+request exwm--connection
|
||||||
(make-instance 'xcb:ConfigureWindow
|
(make-instance 'xcb:ConfigureWindow
|
||||||
:window (frame-parameter exwm--floating-frame
|
:window (frame-parameter exwm--floating-frame
|
||||||
'exwm-outer-id)
|
'exwm-outer-id)
|
||||||
:value-mask value-mask
|
:value-mask resize-value-mask
|
||||||
:width width
|
:width width
|
||||||
:height height)))))
|
:height height)))
|
||||||
|
(when (/= 0 move-value-mask)
|
||||||
|
(xcb:+request exwm--connection
|
||||||
|
(make-instance 'xcb:ConfigureWindow
|
||||||
|
:window exwm--id
|
||||||
|
:value-mask move-value-mask
|
||||||
|
:x (+ x exwm-floating-border-width)
|
||||||
|
:y (+ y exwm-floating-border-width)))))))
|
||||||
(xcb:flush exwm--connection))))
|
(xcb:flush exwm--connection))))
|
||||||
|
|
||||||
(defun exwm-floating-move (&optional delta-x delta-y)
|
(defun exwm-floating-move (&optional delta-x delta-y)
|
||||||
|
|
|
@ -305,10 +305,9 @@ Refresh when any CRTC/output changes."
|
||||||
notify)
|
notify)
|
||||||
(xcb:unmarshal evt data)
|
(xcb:unmarshal evt data)
|
||||||
(with-slots (subCode u) evt
|
(with-slots (subCode u) evt
|
||||||
(cl-case subCode
|
(cond ((= subCode xcb:randr:Notify:CrtcChange)
|
||||||
(xcb:randr:Notify:CrtcChange
|
|
||||||
(setq notify (slot-value u 'cc)))
|
(setq notify (slot-value u 'cc)))
|
||||||
(xcb:randr:Notify:OutputChange
|
((= subCode xcb:randr:Notify:OutputChange)
|
||||||
(setq notify (slot-value u 'oc))))
|
(setq notify (slot-value u 'oc))))
|
||||||
(when notify
|
(when notify
|
||||||
(with-slots (timestamp) notify
|
(with-slots (timestamp) notify
|
||||||
|
|
|
@ -258,9 +258,9 @@ Show PROMPT to the user if non-nil."
|
||||||
(if (eq frame exwm-workspace--current)
|
(if (eq frame exwm-workspace--current)
|
||||||
;; Abort the recursive minibuffer if deleting the current workspace.
|
;; Abort the recursive minibuffer if deleting the current workspace.
|
||||||
(progn
|
(progn
|
||||||
(exwm--defer 0 #'delete-frame frame)
|
(exwm--defer 0 #'exwm-workspace-delete frame)
|
||||||
(abort-recursive-edit))
|
(abort-recursive-edit))
|
||||||
(delete-frame frame)
|
(exwm-workspace-delete frame)
|
||||||
(exwm-workspace--update-switch-history)
|
(exwm-workspace--update-switch-history)
|
||||||
(goto-history-element (min minibuffer-history-position
|
(goto-history-element (min minibuffer-history-position
|
||||||
(exwm-workspace--count)))))))
|
(exwm-workspace--count)))))))
|
||||||
|
@ -824,6 +824,11 @@ INDEX must not exceed the current number of workspaces."
|
||||||
(exwm-workspace--workspace-from-frame-or-index
|
(exwm-workspace--workspace-from-frame-or-index
|
||||||
frame-or-index)
|
frame-or-index)
|
||||||
exwm-workspace--current)))
|
exwm-workspace--current)))
|
||||||
|
;; Transfer over any surrogate minibuffers before trying to delete the workspace.
|
||||||
|
(let ((minibuf (minibuffer-window frame))
|
||||||
|
(newminibuf (minibuffer-window (exwm-workspace--get-next-workspace frame))))
|
||||||
|
(dolist (f (filtered-frame-list (lambda (f) (eq (frame-parameter f 'minibuffer) minibuf))))
|
||||||
|
(set-frame-parameter f 'minibuffer newminibuf)))
|
||||||
(delete-frame frame))))
|
(delete-frame frame))))
|
||||||
|
|
||||||
(defun exwm-workspace--set-desktop (id)
|
(defun exwm-workspace--set-desktop (id)
|
||||||
|
|
5
exwm.el
5
exwm.el
|
@ -52,7 +52,10 @@
|
||||||
;; (setq exwm-input-global-keys `(([?\s-r] . exwm-reset)))
|
;; (setq exwm-input-global-keys `(([?\s-r] . exwm-reset)))
|
||||||
;; (exwm-enable)
|
;; (exwm-enable)
|
||||||
;;
|
;;
|
||||||
;; 3. Link or copy the file 'xinitrc' to '~/.xinitrc'.
|
;; 3. Add the following lines to '~/.xinitrc':
|
||||||
|
;;
|
||||||
|
;; exec emacs
|
||||||
|
;;
|
||||||
;; 4. Launch EXWM in a console (e.g. tty1) with
|
;; 4. Launch EXWM in a console (e.g. tty1) with
|
||||||
;;
|
;;
|
||||||
;; xinit -- vt01
|
;; xinit -- vt01
|
||||||
|
|
26
xinitrc
26
xinitrc
|
@ -1,26 +0,0 @@
|
||||||
echo "The xinitrc file has been deprecated. We do not recommend using
|
|
||||||
xinitrc directly as is. Instead copy the relevant settings to your
|
|
||||||
xsession or xinitrc file and modify them as needed. The code from here
|
|
||||||
will be moved out of the source repository to the manual after the
|
|
||||||
next release. See https://github.com/emacs-exwm/exwm/issues/57."
|
|
||||||
|
|
||||||
# Disable access control for the current user.
|
|
||||||
xhost +SI:localuser:$USER
|
|
||||||
|
|
||||||
# Make Java applications aware this is a non-reparenting window manager.
|
|
||||||
export _JAVA_AWT_WM_NONREPARENTING=1
|
|
||||||
|
|
||||||
# Set default cursor.
|
|
||||||
xsetroot -cursor_name left_ptr
|
|
||||||
|
|
||||||
# Set keyboard repeat rate.
|
|
||||||
xset r rate 200 60
|
|
||||||
|
|
||||||
# Uncomment the following block to use the exwm-xim module.
|
|
||||||
#export XMODIFIERS=@im=exwm-xim
|
|
||||||
#export GTK_IM_MODULE=xim
|
|
||||||
#export QT_IM_MODULE=xim
|
|
||||||
#export CLUTTER_IM_MODULE=xim
|
|
||||||
|
|
||||||
# Finally start Emacs
|
|
||||||
exec emacs
|
|
Loading…
Reference in a new issue