diff --git a/Makefile b/Makefile
index 6f89426..669ba48 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,8 @@ K := -K # prompt for sudo password
O := # additional options
P := site.yml # playbook
T := # if y, time the process
-V := -vvv # verbosity
+V := # verbosity
+# V := -vvv # verbosity
ifeq ($T,y)
diff --git a/roles/desktop/tasks/main.yml b/roles/desktop/tasks/main.yml
index 9ed0ad0..7c839b3 100644
--- a/roles/desktop/tasks/main.yml
+++ b/roles/desktop/tasks/main.yml
@@ -31,6 +31,7 @@
with_items:
- i3
- i3lock
+ - stumpwm
- name: set up xprogs
become: true
diff --git a/roles/development/tasks/main.yml b/roles/development/tasks/main.yml
index f1f0795..6b33117 100644
--- a/roles/development/tasks/main.yml
+++ b/roles/development/tasks/main.yml
@@ -242,6 +242,8 @@
become: true
ansible.builtin.apt: name=code state=present
+
+
## rust
- name: check if cargo is installed
@@ -287,3 +289,40 @@
- scipy
- tensorflow
- torch
+
+- name: install balena etcher repo key
+ become: true
+ when: (dev_full or dev_embedded) and not headless
+ ansible.builtin.apt_key:
+ url: https://dl.cloudsmith.io/public/balena/etcher/gpg.70528471AFF9A051.key
+ state: present
+
+- name: setup balena etcher repo
+ become: true
+ when: (dev_full or dev_embedded) and not headless
+ ansible.builtin.apt_repository:
+ repo: 'deb https://dl.cloudsmith.io/public/balena/etcher/deb/ubuntu jammy main'
+ state: present
+
+- name: setup balena etcher source repo
+ become: true
+ when: (dev_full or dev_embedded) and not headless
+ ansible.builtin.apt_repository:
+ repo: 'deb-src https://dl.cloudsmith.io/public/balena/etcher/deb/ubuntu jammy main'
+ state: present
+
+- name: install balena etcher
+ become: true
+ when: (dev_full or dev_embedded) and not headless
+ ansible.builtin.apt: name=balena-etcher-electron state=present
+
+- name: link etcher to /usr/bin
+ become: true
+ when: (dev_full or dev_embedded) and not headless
+ ansible.builtin.file:
+ src: /opt/balenaEtcher/balena-etcher-electron
+ dest: /usr/local/bin/etcher
+ owner: root
+ group: root
+ mode: 0755
+ state: link
diff --git a/roles/dotfiles/files/.stumpwmrc b/roles/dotfiles/files/.stumpwmrc
new file mode 100644
index 0000000..4db4307
--- /dev/null
+++ b/roles/dotfiles/files/.stumpwmrc
@@ -0,0 +1,228 @@
+Content-Type: text/enriched
+Text-Width: 70
+
+;; #565766-*-lisp-*-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;;; #565766INDEX ;;;
+;;; #565766- DEPRECATED - MANIFEST ;;;
+;;; #565766- SWANK INTERACTION ;;;
+;;; #565766- GENERAL CONFIG ;;;
+;;; #565766- UTILITY FUNCTIONS ;;;
+;;; #565766- KEY BINDING ;;;
+;;; #565766- EXECUTION ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;;; #565766DEPRECATED - MANIFEST ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;; #565766without the ability to select localhost-only, we can't use
+;; #565766manifest at this time.
+;; #565766(defvar *manifest-url*
+;; #565766(manifest:start))
+;; #565766(defun browse-manifest ()
+;; #565766(format nil "exec ~A ~A" *default-browser* *manifest-url*))
+;; #565766(define-key *root-map* (kbd "C-d") (browse-manifest))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;;; #565766SWANK INTERACTION ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;; #565766swank interaction allows us to connect to the StumpWM
+;; #565766process from emacs while it's running.
+
+(ql:quickload #a3646f:swank)
+
+(#93e57clet ((server-running nil))
+ (defcommand swank () ()
+ #627e95"Toggle the swank server on/off"
+ (#93e57cif server-running
+ (#93e57cprogn
+ (swank:stop-server 4005)
+ (echo-string
+ (current-screen)
+ #627e95"Stopping swank.")
+ (setf server-running nil))
+ (#93e57cprogn
+ (swank:create-server #a3646f:port 4005
+ #a3646f:style swank:*communication-style*
+ #a3646f:dont-close t)
+ (echo-string
+ (current-screen)
+ #627e95"Starting swank. M-x slime-connect RET RET, then (in-packqage stumpwm).")
+ (setf server-running t)))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;;; #565766GENERAL CONFIG ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;; #565766this is where configuration parameters, the frame numbering
+;; #565766and switching, and other general configuration is set up.
+
+(#93e57cdefparameter #9e79b3*default-browser* #627e95"firefox")
+(#93e57cdefparameter #9e79b3*default-terminal* #627e95"mate-terminal")
+
+;; #565766make frames 1-numbered (i.e. for getting with ALT-FN)
+(setf *frame-number-map* #627e95"1234567890")
+
+(run-commands
+ #627e95"gnewbg G2" ;; #565766F2
+ #627e95"gnewbg G3" ;; #565766F3
+ #627e95"gnewbg G4" ;; #565766F4
+ #627e95"gnewbg G5" ;; #565766F5
+ #627e95"gnewbg G6" ;; #565766F6
+ #627e95"gnewbg G7" ;; #565766F7
+ #627e95"gnewbg G8" ;; #565766F8
+ #627e95"gnewbg G9" ;; #565766F9
+ #627e95"gnewbg G10" ;; #565766F10
+ #627e95"gnewbg G11" ;; #565766F11
+ #627e95"gnewbg G12"
+ #627e95"gnewbg G13"
+ #627e95"gnewbg G14"
+ #627e95"gnewbg G15"
+
+
+ #627e95"gnewbg G16"
+ #627e95"gnewbg G17"
+ #627e95"gnewbg G18"
+ #627e95"gnewbg G19")
+
+
+;; #565766Fluxbox-style Alt-F# virtual desktop (group in StumpWM-speak)
+;; #565766switching. Modified from:
+;; #565766http://hcl-club.lu/svn/development/lisp/.stumpwmrc
+(#93e57cloop for i from 1 to 9
+ do
+ (#93e57cprogn
+ (format t #627e95"Key: ~A~%" i)
+ (define-key *top-map*
+ (kbd (format nil #627e95"M-~a" i))
+ (format nil #627e95"gselect ~a" i))))
+
+(define-key *top-map* (kbd #627e95"M-!") #627e95"gselect 10")
+(define-key *top-map* (kbd #627e95"M-@") #627e95"gselect 11")
+(define-key *top-map* (kbd #627e95"M-#") #627e95"gselect 12")
+(define-key *top-map* (kbd #627e95"M-$") #627e95"gselect 13")
+(define-key *top-map* (kbd #627e95"M-%") #627e95"gselect 14")
+(define-key *top-map* (kbd #627e95"M-^") #627e95"gselect 15")
+(define-key *top-map* (kbd #627e95"M-&") #627e95"gselect 16")
+(define-key *top-map* (kbd #627e95"M-*") #627e95"gselect 17")
+(define-key *top-map* (kbd #627e95"M-\(") #627e95"gselect 18")
+(define-key *top-map* (kbd #627e95"M-\)") #627e95"gselect 19")
+
+;; #565766set FFM
+(setf *mouse-focus-policy* #a3646f:sloppy)
+
+;; #565766show input bar in centre of screen
+(setf *input-window-gravity* #a3646f:center)
+
+
+;; #565766enable the mode-line (and preferably the system tray)
+
+(setf *mode-line-position* #a3646f:bottom)
+
+(load-module #627e95"stumptray")
+
+
+(#93e57cdolist
+
+ (head (screen-heads (current-screen)))
+
+ (toggle-mode-line (current-screen) head))
+
+
+(stumptray::stumptray)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;;; #565766UTILITY FUNCTIONS ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+
+(defcommand acpi-status () ()
+ #627e95"Print ACPI status in the StumpWM message box."
+ (stumpwm:echo-string (current-screen)
+ (#93e57cwith-output-to-string (stream)
+ (sb-ext:run-program
+ #627e95"/usr/bin/acpitool"
+ nil
+ #a3646f:output stream))))
+
+(defcommand lock () ()
+ #627e95"Lock the screen by invoking i3lock."
+ (stumpwm:echo-string (current-screen) #627e95"Locking screen...")
+ (sb-ext:run-program #627e95"/usr/bin/i3lock" nil))
+
+(#93e57cdefun #beb7f7exec-for-status (path #5992c2&rest args)
+ #565766"Run the path with args and return the status code."
+ (sb-ext:process-exit-code
+ (sb-ext:run-program path args #a3646f:wait t)))
+
+(#93e57cdefun #beb7f7exec-ok (path #5992c2&rest args)
+ #565766"Returns true if path with args ran without error."
+ (zerop (exec-for-status path args)))
+
+(#93e57cdefun #beb7f7daemon-is-running (daemon)
+ (zerop (exec-for-status #627e95"/usr/bin/pgrep" daemon)))
+
+(#93e57cdefun #beb7f7start-daemon-if-not-running (path #5992c2&rest args)
+ #565766"If the program specified at path isn't running, start it."
+ (#93e57cwhen (not (daemon-is-running (pathname-name path)))
+ (run-shell-command (#93e57cif (null args)
+ path
+ (format nil #627e95"~A~{ ~A~}" path args)))))
+
+(#93e57cdefun #beb7f7start-program-if-not-running (program #5992c2&rest args)
+ (format t #627e95"WOULD RUN: nohup ~A~{ ~A~}" program args)
+ (#93e57cwhen (not (exec-ok #627e95"/usr/bin/pgrep" program))
+ (run-shell-command (format nil #627e95"nohup ~A~{ ~A~}"
+ program args))))
+
+(#93e57cdefun #beb7f7with-terminal (#5992c2&key (run #627e95"" run-p) (term *default-terminal*))
+ (concat #627e95"exec " term (#93e57cif run-p #627e95" -e " #627e95"") run))
+
+(#93e57cdefun #beb7f7with-homedir (path)
+ (merge-pathnames path (user-homedir-pathname)))
+
+(#93e57cdefun #beb7f7in-homedir-p (path)
+ (probe-file (#93e57cwith-homedir path)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+;;; #565766DEMON^WKEY BINDING ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#565766
+
+(define-key stumpwm:*root-map* (kbd #627e95"B") #627e95"exec firefox")
+(define-key stumpwm:*root-map* (kbd #627e95"c") (#93e57cwith-terminal))
+(define-key *root-map* (kbd #627e95"b") #627e95"acpi-status")
+(define-key *root-map* (kbd #627e95"RET") (#93e57cwith-terminal))
+(define-key *root-map* (kbd #627e95"d") #627e95"exec dmenu_run")
+(define-key *root-map* (kbd #627e95"D") #627e95"exec i3-dmenu-desktop")
+(define-key *root-map* (kbd #627e95"e") #627e95"exec emacsclient -c -a \"\"")
+(define-key *root-map* (kbd #627e95"E") (#93e57cwith-terminal #a3646f:run #627e95"'emacsclient -c -nw -a \"\"'"))
+(define-key *root-map* (kbd #627e95"g") (#93e57cwith-terminal #a3646f:run #627e95"ghci"))
+(define-key *root-map* (kbd #627e95"C-i") (#93e57cwith-terminal #a3646f:run #627e95"ipython"))
+(define-key *root-map* (kbd #627e95"l") #627e95"lock")
+(define-key *root-map* (kbd #627e95"C-l") (#93e57cwith-terminal #a3646f:run #627e95"rlwrap sbcl"))
+(Purpledefine-key *root-map* (kbd VioletRed4"M") (Purplewith-terminal dark slate blue:run VioletRed4"htop"))
+(Purpledefine-key *root-map* (kbd VioletRed4"C-s") VioletRed4"swank")
+(Purpledefine-key *root-map* (kbd VioletRed4"C-v") VioletRed4"exec pavucontrol")
+(Purpledefine-key *root-map* (kbd VioletRed4"w") (Purplewith-terminal dark slate blue:run VioletRed4"nmtui-connect"))
+(Purpledefine-key *root-map* (kbd VioletRed4"`") VioletRed4"scratch-pad")
+(Purpledefine-key *root-map* (kbd VioletRed4"~") VioletRed4"scratch-pad-float")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Firebrick
+;;; FirebrickEXECUTION ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Firebrick
+
+(run-shell-command VioletRed4"ssh-add")
+
+(Purplewhen (in-homedir-p VioletRed4".fehbg")
+ (sb-ext:run-program VioletRed4"/bin/sh" (Purplewith-homedir VioletRed4".fehbg")))
+(Purplewhen (in-homedir-p VioletRed4".screenlayouts/norminal.sh")
+ (run-shell-command (Purplewith-homedir VioletRed4".screenlayouts/norminal.sh")))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Firebrick
+;;; FirebrickTHIS BATTLESTATION IS FULLY OPERATIONAL ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Firebrick
+(message VioletRed4"Ready.")
+
+;;FirebrickLISP=sbcl
+
\ No newline at end of file
diff --git a/roles/dotfiles/tasks/main.yml b/roles/dotfiles/tasks/main.yml
index 4926ebf..471fd33 100644
--- a/roles/dotfiles/tasks/main.yml
+++ b/roles/dotfiles/tasks/main.yml
@@ -5,6 +5,15 @@
directory_mode: 0755
force: false
+# changes are made often enough right now that this
+# should be copied every run.
+- name: copy the shell profile over
+ ansible.builtin.copy:
+ src: "{{ role_path }}/files/.profile"
+ dest: "/home/{{ laptop_user }}/.profile"
+ mode: 0644
+ force: true
+
- name: create binary directory
ansible.builtin.file:
path: "/home/{{ laptop_user }}/.local/bin"
@@ -27,9 +36,7 @@
- .gitignore_global
- .hgrc
- .mg
- - .profile
- .vimrc
- - .XCompose
- name: copy vim directory
ansible.builtin.copy:
@@ -37,3 +44,13 @@
dest: "/home/{{ laptop_user }}/"
directory_mode: 0755
force: false
+
+- name: copy various dotfiles for non-headless systems
+ when: not headless
+ ansible.builtin.copy:
+ src: "{{ role_path }}/files/{{ item }}"
+ dest: "/home/{{ laptop_user }}/{{ item }}"
+ mode: 0644
+ with_items:
+ - .stumpwmrc
+ - .XCompose