61 lines
2.6 KiB
Org Mode
61 lines
2.6 KiB
Org Mode
:PROPERTIES:
|
|
:ID: cce/external_display_test_functions
|
|
:ROAM_ALIASES: cce/external-display-dpis
|
|
:END:
|
|
#+TITLE: External Display Test Functions
|
|
#+PROPERTY: header-args :mkdirp yes :results none
|
|
#+PROPERTY: header-args:emacs-lisp :tangle display-test-functions.el
|
|
#+ARROYO_EMACS_MODULE: display-test-functions
|
|
#+ARCOLOGY_KEY: cce/display-test-functions
|
|
#+ARROYO_MODULE_WANTS: cce/configure_packaging.org
|
|
#+ARCOLOGY_ALLOW_CRAWL: t
|
|
|
|
#+begin_src emacs-lisp
|
|
(provide 'cce/display-test-functions)
|
|
#+end_src
|
|
|
|
Calculating the display density is a pain in the ass because it's easier to parse xrandr output than it is to integrate with libXrandr. I guess I could write an elisp wrapper for it, but I would rather not right now. [[id:09fa0674-ad3b-43c5-8d7c-6b532346a772][open threads]]
|
|
|
|
#+begin_src emacs-lisp
|
|
(defun cce/external-display-dpis ()
|
|
"Returns a list of integers, the DPI of the connected external Display Port displays. assumes square pixels, sorry."
|
|
(let (results (xrandr-buffer (get-buffer-create " *xrandr*")))
|
|
(with-current-buffer xrandr-buffer
|
|
(erase-buffer)
|
|
(call-process-shell-command "xrandr" nil xrandr-buffer)
|
|
(goto-char (point-min))
|
|
(setq-local results nil)
|
|
(while (re-search-forward "^\\([^e][a-zA-Z]+\\(-?[0-9]+\\)+\\)" nil t)
|
|
(when-let* ((eol (save-excursion (end-of-line) (point)))
|
|
(display-name (match-string 1))
|
|
(is-connected (re-search-forward "connected \\(primary \\)?\\([0-9]+\\)x\\([0-9]+\\)" eol t))
|
|
(pixels (string-to-number (match-string 3)))
|
|
(has-physical (re-search-forward "\\([0-9]+\\)mm x \\([0-9]+\\)mm" eol))
|
|
(physical (string-to-number (match-string 2)))
|
|
(dpi (if (equal 0 physical)
|
|
140
|
|
(floor (* 25.4 (/ (float pixels) physical))))))
|
|
(add-to-list 'results (cons display-name dpi))))
|
|
results)))
|
|
|
|
(defun cce/external-display-connected ()
|
|
"returns t if there are external displayport monitors connected."
|
|
(let ((dpis (cce/external-display-dpis)))
|
|
(> (length dpis) 0)))
|
|
|
|
(defun cce/connected-displays ()
|
|
"Returns a list of displays currently connceted"
|
|
(append (list "eDP-1")
|
|
(mapcar
|
|
(lambda (cons)
|
|
(car cons))
|
|
(cce/external-display-dpis))))
|
|
|
|
(defun cce/exwm-connected-displays ()
|
|
"Return a list of displays for [`exwm-randr-workspace-monitor-plist']"
|
|
(apply #'append
|
|
(seq-map-indexed (lambda (elt idx)
|
|
(list idx elt))
|
|
(cce/connected-displays))))
|
|
#+end_src
|