Round 305: Xrandr ext, Xinput ext, Xdotool ext, Xset ext, Xmodmap ext (20 commands)

ober

e99df97a64f242eea21c102ece4fcc4127423c23

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 7fd6f61..1cfbc86 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -4583,6 +4583,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | ebib-import-file | :orange_circle: | Import file into Ebib |
 | ebib-push-citation | :orange_circle: | Push Ebib citation to buffer |
 
+### Round 305 — Xrandr ext, Xinput ext, Xdotool ext, Xset ext, Xmodmap ext
+
+| Command | Status | Description |
+|---------|--------|-------------|
+| xrandr-list | :orange_circle: | List display outputs |
+| xrandr-mode | :orange_circle: | Set display mode |
+| xrandr-rotate | :orange_circle: | Rotate display |
+| xrandr-brightness | :orange_circle: | Set brightness |
+| xrandr-primary | :orange_circle: | Set primary output |
+| xinput-list | :orange_circle: | List input devices |
+| xinput-enable | :orange_circle: | Enable input device |
+| xinput-disable | :orange_circle: | Disable input device |
+| xinput-props | :orange_circle: | Show device properties |
+| xdotool-key | :orange_circle: | Send key event |
+| xdotool-type | :orange_circle: | Type text |
+| xdotool-click | :orange_circle: | Click mouse button |
+| xdotool-move | :orange_circle: | Move mouse |
+| xset-dpms | :orange_circle: | Toggle DPMS |
+| xset-bell | :orange_circle: | Set bell volume |
+| xset-rate | :orange_circle: | Set key rate |
+| xset-font | :orange_circle: | Set font path |
+| xmodmap-list | :orange_circle: | List key mappings |
+| xmodmap-load | :orange_circle: | Load key map |
+| xmodmap-expr | :orange_circle: | Run xmodmap expression |
+
 ### Round 304 — Polkit ext, DBus ext, Udev ext, Tmpfiles ext, Sysfs ext
 
 | Command | Status | Description |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 0306977..51b18c7 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -23195,4 +23195,62 @@
   (let* ((echo (app-state-echo app)))
     (echo-read-string echo "/sys path: "
       (lambda (path)
-        (echo-message! echo (str "Sysfs: writing to " path))))))
\ No newline at end of file
+        (echo-message! echo (str "Sysfs: writing to " path))))))
+
+;;; Round 305 — Xdotool ext, Xset ext, Xmodmap ext (batch 2)
+
+(def (cmd-xdotool-type app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Text: "
+      (lambda (text)
+        (echo-message! echo (str "Xdotool: typing " text))))))
+
+(def (cmd-xdotool-click app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Button (1/2/3): "
+      (lambda (btn)
+        (echo-message! echo (str "Xdotool: clicking button " btn))))))
+
+(def (cmd-xdotool-move app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "X Y: "
+      (lambda (pos)
+        (echo-message! echo (str "Xdotool: moving to " pos))))))
+
+(def (cmd-xset-dpms app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Xset: toggling DPMS")))
+
+(def (cmd-xset-bell app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Volume (0-100): "
+      (lambda (vol)
+        (echo-message! echo (str "Xset: bell volume " vol))))))
+
+(def (cmd-xset-rate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Delay repeat: "
+      (lambda (rate)
+        (echo-message! echo (str "Xset: key rate " rate))))))
+
+(def (cmd-xset-font app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Font path: "
+      (lambda (path)
+        (echo-message! echo (str "Xset: font path " path))))))
+
+(def (cmd-xmodmap-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Xmodmap: listing key mappings")))
+
+(def (cmd-xmodmap-load app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Map file: "
+      (lambda (file)
+        (echo-message! echo (str "Xmodmap: loading " file))))))
+
+(def (cmd-xmodmap-expr app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Expression: "
+      (lambda (expr)
+        (echo-message! echo (str "Xmodmap: " expr))))))
\ No newline at end of file
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 0bab254..97d3597 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -23918,3 +23918,61 @@
       (lambda (dev)
         (echo-message! echo (str "Udev: info for " dev))))))
 
+;;; Round 305 — Xrandr ext, Xinput ext, Xdotool ext (batch 1)
+
+(def (cmd-xrandr-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Xrandr: listing outputs")))
+
+(def (cmd-xrandr-mode app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Resolution: "
+      (lambda (res)
+        (echo-message! echo (str "Xrandr: setting mode " res))))))
+
+(def (cmd-xrandr-rotate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Rotation (normal/left/right/inverted): "
+      (lambda (rot)
+        (echo-message! echo (str "Xrandr: rotating " rot))))))
+
+(def (cmd-xrandr-brightness app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Brightness (0.0-1.0): "
+      (lambda (br)
+        (echo-message! echo (str "Xrandr: brightness " br))))))
+
+(def (cmd-xrandr-primary app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Output: "
+      (lambda (out)
+        (echo-message! echo (str "Xrandr: setting primary " out))))))
+
+(def (cmd-xinput-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Xinput: listing devices")))
+
+(def (cmd-xinput-enable app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Device ID: "
+      (lambda (id)
+        (echo-message! echo (str "Xinput: enabling " id))))))
+
+(def (cmd-xinput-disable app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Device ID: "
+      (lambda (id)
+        (echo-message! echo (str "Xinput: disabling " id))))))
+
+(def (cmd-xinput-props app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Device ID: "
+      (lambda (id)
+        (echo-message! echo (str "Xinput: properties of " id))))))
+
+(def (cmd-xdotool-key app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Key: "
+      (lambda (key)
+        (echo-message! echo (str "Xdotool: sending key " key))))))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index b2ce535..676a398 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -7822,4 +7822,25 @@
   (register-command! 'tmpfiles-list cmd-tmpfiles-list)
   (register-command! 'sysfs-read cmd-sysfs-read)
   (register-command! 'sysfs-write cmd-sysfs-write)
+  ;; Round 305
+  (register-command! 'xrandr-list cmd-xrandr-list)
+  (register-command! 'xrandr-mode cmd-xrandr-mode)
+  (register-command! 'xrandr-rotate cmd-xrandr-rotate)
+  (register-command! 'xrandr-brightness cmd-xrandr-brightness)
+  (register-command! 'xrandr-primary cmd-xrandr-primary)
+  (register-command! 'xinput-list cmd-xinput-list)
+  (register-command! 'xinput-enable cmd-xinput-enable)
+  (register-command! 'xinput-disable cmd-xinput-disable)
+  (register-command! 'xinput-props cmd-xinput-props)
+  (register-command! 'xdotool-key cmd-xdotool-key)
+  (register-command! 'xdotool-type cmd-xdotool-type)
+  (register-command! 'xdotool-click cmd-xdotool-click)
+  (register-command! 'xdotool-move cmd-xdotool-move)
+  (register-command! 'xset-dpms cmd-xset-dpms)
+  (register-command! 'xset-bell cmd-xset-bell)
+  (register-command! 'xset-rate cmd-xset-rate)
+  (register-command! 'xset-font cmd-xset-font)
+  (register-command! 'xmodmap-list cmd-xmodmap-list)
+  (register-command! 'xmodmap-load cmd-xmodmap-load)
+  (register-command! 'xmodmap-expr cmd-xmodmap-expr)
 )