Improving the EXWM Experience

Check out the final code here.

Desktop.org

Take a look at new Desktop.org file. We have to update auto-tangle hook to accomodate this:

;; Automatically tangle our Emacs.org config file when we save it
(defun efs/org-babel-tangle-config ()
  (when (string-equal (file-name-directory (buffer-file-name))
                      (expand-file-name "~/.emacs.d/"))
    ;; Dynamic scoping to the rescue
    (let ((org-confirm-babel-evaluate nil))
      (org-babel-tangle))))

Only load desktop.el when EXWM is needed in start-exwm.sh:

exec dbus-launch --exit-with-session emacs -mm --debug-init -l ~/.emacs.d/desktop.el

Configuring EXWM after load

Use exwm-init-hook:

(defun efs/run-in-background (command)
  (let ((command-parts (split-string command "[ ]+")))
    (apply #'call-process `(,(car command-parts) nil 0 nil ,@(cdr command-parts)))))

(defun dw/exwm-init-hook ()
  ;; Make workspace 1 be the one where we land at startup
  (exwm-workspace-switch-create 1)

  ;; Open eshell by default
  ;;(eshell)

  ;; Launch apps that will run in the background
  (efs/run-in-background "nm-applet"))

In use-package exwm:

;; When EXWM finishes initialization, do some extra setup
(add-hook 'exwm-init-hook #'efs/after-exwm-init)

Setting a background image

Install and run Compton:

sudo apt install compton
compton &

There’s a newer program called Picom for this purpose, but it may not be in all Linux distributions. Compton is pretty universal.

Install and run feh:

sudo apt install feh
feh --bg-scale /usr/share/backgrounds/matt-mcnulty-nyc-2nd-ave.jpg

Set frame transparency and maximize windows by default.

;; Set frame transparency
(set-frame-parameter (selected-frame) 'alpha '(90 . 90))
(add-to-list 'default-frame-alist '(alpha . (90 . 90)))
(set-frame-parameter (selected-frame) 'fullscreen 'maximized)
(add-to-list 'default-frame-alist '(fullscreen . maximized))

Add to your configuration early in EXWM setup:

(defun efs/set-wallpaper ()
  (interactive)
  (start-process-shell-command
   "feh" nil  "feh --bg-scale /usr/share/backgrounds/matt-mcnulty-nyc-2nd-ave.jpg"))

Run this function after running xrandr to make sure it stretches to screen size!

;; Set the wallpaper after setting screen resolution
(efs/set-wallpaper)

In start-exwm.sh:

# Enable screen compositing
compton &

Using media keys

Use the desktop-environment package!

https://github.com/DamienCassou/desktop-environment

(use-package desktop-environment
  :after exwm
  :config (desktop-environment-mode)
  :custom
  (desktop-environment-brightness-small-increment "2%+")
  (desktop-environment-brightness-small-decrement "2%-")
  (desktop-environment-brightness-normal-increment "5%+")
  (desktop-environment-brightness-normal-decrement "5%-"))

Make sure to install dependencies:

sudo apt install scrot brightnessctl playerctl

Computer status and configuration

Tray apps

Tray apps like blueman and pasystray:

sudo apt install blueman pasystray pavucontrol
(efs/run-in-background "pavucontrol"))
(efs/run-in-background "blueman-applet"))

Make sure to add exwm-systemtray-height to make sure icons appear!

(setq exwm-systemtray-height 32)

Mode line status

Battery and time display:

;; Show battery status in the mode line
(display-battery-mode 1)

;; Show the time and date in modeline
(setq display-time-day-and-date t)
(display-time-mode 1)
;; Also take a look at display-time-format and format-time-string

Better app launcher

Use counsel-linux-app!

In your use-package counsel:

:custom
(counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)

In your EXWM config:

(exwm-input-set-key (kbd "s-SPC") 'counsel-linux-app)
(exwm-input-set-key (kbd "s-f") 'exwm-layout-toggle-fullscreen)

Locking the screen

Use slock and xss-lock!

sudo apt install slock xss-lock

Add this to start-exwm.sh:

# Enable screen locking on suspend
xss-lock -- slock &
Subscribe to the System Crafters Newsletter!
Stay up to date with the latest System Crafters news and updates! Read the Newsletter page for more information.
Name (optional)
Email Address