plymouth
- install plymouth (recommended to use development version, but unstable)
 
paru -S plymouth
              - 
                  add plymouth hook to 
/etc/mkinitcpio.confHOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck)
HOOKS=(base udev plymouth autodetect keyboard keymap consolefont modconf block plymouth-encrypt lvm2 filesystems fsck)
 - 
                  make sure to replace 
encryptwithplymouth-encrypt!- 
                      (now: 
plymouth-encryptno longer necessary as of version22.02.122-7) 
 - 
                      (now: 
 - add 
amdgputoMODULES 
MODULES=(amdgpu ...)
              - arch wiki - silent boot
 - add kernel parameters:
 
quiet loglevel=3 udev.log_level=3 splash vt.global_cursor_default=0 fbcon=nodefer
              - 
                  
splashnecessary,fbcon=nodefer: don't try to defer vendor logo - switch display manager service for smoother transition
 
sudo systemctl disable sddm.service
sudo systemctl enable sddm-plymouth.service
              - 
                  can't quite get totally smooth transition (goes to black then
                  sddm) but good enough for me :p
                  
- 
                      (now: 
plymouth-encryptno longer necessary as of version22.02.122-7) 
 - 
                      (now: 
 
theming
- list themes (can install additional from AUR)
 
plymouth-set-default-theme -l
              - use 
-Rto rebuild initramfs 
plymouth-set-default-theme -R theme
              - or edit 
/etc/plymouth/plymouthd.conf 
[Daemon]
Theme=simple
              - 
                  and regenerate initramfs with 
sudo mkinitcpio -P - 
                  for themes using ModuleName 
two-step, e.g. spinner (check/usr/share/plymouth/themes/folder,.plymouthfile for module) - 
                  add background to
                  
/usr/share/plymouth/themes/theme/background-tile.png - can only tile! (seems hardcoded)
 
script module
- 
                  problem: many modules compiled into 
.so, hard to modify - 
                  solution: use 
scriptmodule, write code in domain-specific language - language documented on Plymouth page but out of date
 - easiest to read C source directly
 - 
                  and examples:
                  
- 
                      default script theme
                      
/usr/share/plymouth/themes/script - spinner script theme
 
 - 
                      default script theme
                      
 - 
                  language is sort of weird
                  
- everything is an object...
 - ...except functions, they seem not to be first-class objects
 - no runtime errors, 
NULLpropagation - global easily pollutes namespace
 
 - 
                  feels like what I would imagine JavaScript is
                  
- 
                      but to be honest I have written more
                      
.scriptthan.js... 
 - 
                      but to be honest I have written more
                      
 
testing
- switch to virtual console with ctrl+alt+F6
 - log in as root, run
 
plymouthd
plymouth show-splash
plymouth quit
              - problem: once plymouth starts showing splash, cannot issue commands!
 - solution: make shell file, say 
test.fish 
plymouthd --debug --debug-file=/usr/share/plymouth/themes/simple/testing/log.txt
plymouth show-splash
sleep 5
plymouth quit
              - 
                  run with 
test.fish, after 5 seconds automatically kills - testing messages:
 
plymouthd
plymouth show-splash
set message "test message"
sleep 1
plymouth display-message --text=$message
sleep 2
# has to be the same message or callback isn't called
plymouth hide-message --text=$message
sleep 2
              - 
                  testing passwords: need to inject key presses into
                  
/dev/tty1(by default) - easiest way (not necessarily best) with TIOCSTI
 - 
                  see
                  stackoverflow
                  - 
inject.py: 
import fcntl
import sys
import termios
with open(sys.argv[1], "w") as fd:
    chars = eval(f"'{sys.argv[2]}'")
    for c in chars:
        fcntl.ioctl(fd, termios.TIOCSTI, c)
              - client script:
 
plymouthd
plymouth show-splash
sleep 1
plymouth ask-for-password --prompt="test" &
sleep 1
python inject.py /dev/tty1 "these keypresses are sent to /dev/tty1"
sleep 1
# backspaces
python inject.py /dev/tty1 "\x7f\x7f\x7f\x7f\x7f\x7f\x7f"
sleep 1
python inject.py /dev/tty1 "additional text"
sleep 1
# enter, send password
python inject.py /dev/tty1 "\n"
sleep 2
plymouth quit
              - 
                  useful: 
tmuxto have multiple consoles,vimsettings: 
set autoindent
set expandtab
set shiftwidth=4
set tabstop=4
set colorcolumn=80
              multi-head
careful when scripting:
Window.GetX()
Window.GetY()
              
                are not accurate (leads to black bars on multi-head setups with
                different resolutions). Basically assume the
                Window's top left corner is (0, 0) and
                everything will be ok.