2023-06-27 13:02:39-04:00 - Getting the width of the current monitor in Emacs


If you have virtual workspaces on macOS and you use the emacs function display-pixel-width it will give the combined with of ALL the monitors you are using. You are better off using (caddr (frame-monitor-attribute 'geometry)), since frame-monitor-attribute gets the specified attribute from the monitor which the current frame is actually on. BTW: The function frame-monitor-attributes returns all the monitor attributes. The function display-monitor-attributes-list returns the attributes for ALL the monitors you are using.


I figured this out when I was debugging a couple of emacs functions to move the current frame left or right on the screen.

(defun tkb-move-frame-left ()
  "Move the current frame left by 1/10th the width of the physical montor."
  (interactive)
  (let* ((left (frame-parameter nil 'left))
         (monitor-display-width (caddr (frame-monitor-attribute 'geometry)))
         (tenth-width (/ monitor-display-width 10))
         (new-left (- left tenth-width)))
    (set-frame-parameter nil 'left new-left)))

(defun tkb-move-frame-right ()
  "Move the current frame right by 1/10th the width of the physical montor."
  (interactive)
  (let* ((left (frame-parameter nil 'left))
         (monitor-display-width (caddr (frame-monitor-attribute 'geometry)))
         (tenth-width (/ monitor-display-width 10))
         (new-left (+ left tenth-width)))
    (set-frame-parameter nil 'left new-left)))