From 5ab55e289d70b59aa8a55d9aa4b5dea55c557db1 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Fri, 1 Jan 2021 00:00:31 +0000 Subject: [PATCH] Add multi-monitor support to EXWM config --- config.org | 50 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/config.org b/config.org index 525394d..61ef55a 100644 --- a/config.org +++ b/config.org @@ -312,15 +312,49 @@ needs to be set up to install them if they aren't already. (use-package yaml-mode) #+end_src -* EXWM - One must fulfil the meme of doing everything with Emacs... +* Desktop +** 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 - (use-package exwm - :config - (require 'exwm-config) - (exwm-config-default)) - #+end_src + #+begin_src emacs-lisp + (use-package exwm + :config + (require 'exwm-randr) + (exwm-randr-enable) + (require 'exwm-config) + (exwm-config-default)) + #+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 This was a little more work than I expected... =password-store=