Add multi-monitor support to EXWM config

This commit is contained in:
Camden Dixie O'Brien 2021-01-01 00:00:31 +00:00
parent e52af46621
commit 5ab55e289d

View File

@ -312,16 +312,50 @@ needs to be set up to install them if they aren't already.
(use-package yaml-mode) (use-package yaml-mode)
#+end_src #+end_src
* EXWM * Desktop
One must fulfil the meme of doing everything with Emacs... ** EXWM
One must fulfil the meme of doing everything with Emacs... still
got a lot of tweaking to do here before I'm happy.
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package exwm (use-package exwm
:config :config
(require 'exwm-randr)
(exwm-randr-enable)
(require 'exwm-config) (require 'exwm-config)
(exwm-config-default)) (exwm-config-default))
#+end_src #+end_src
When I have my laptop connected to a monitor I want the built-in
display to turn off, but turn back on when it's disconnected. Turns
out this is a total pain.
To start with we need a function to tell whether a monitor's
attached. =exwm-randr= provides [[help:exwm-randr--get-monitors][exwm-randr--get-monitors]], but its
result is not -- as I'd expect -- a list of monitors, but instead a
rather complicated mess that is (as far as I can tell)
undocumented. Rather than trying to figure out what was going on
there, I opted for the search-in-shell-command-output route
#+begin_src emacs-lisp
(defun hdmi-connected-p ()
(string-match-p "HDMI-2 connected"
(shell-command-to-string "xrandr")))
#+end_src
With that defined, an [[help:exwm-randr-screen-change-hook][exwm-randr-screen-change-hook]] can then be
added to turn the built-in display on and off appropriately.
#+begin_src emacs-lisp
(add-hook 'exwm-randr-screen-change-hook
(lambda ()
(let ((xrandr-command
(if (hdmi-connected-p)
"xrandr --output eDP-1 --off --output HDMI-2 --auto"
"xrandr --output eDP-1 --auto")))
(start-process-shell-command "xrandr" nil xrandr-command))))
#+end_src
* Passwords * Passwords
This was a little more work than I expected... =password-store= This was a little more work than I expected... =password-store=
provides a nice interface to =pass=, but annoyingly appears to provides a nice interface to =pass=, but annoyingly appears to