diff --git a/x86_64/airootfs/etc/pacman.conf b/x86_64/airootfs/etc/pacman.conf index 00fe68e..4745275 100644 --- a/x86_64/airootfs/etc/pacman.conf +++ b/x86_64/airootfs/etc/pacman.conf @@ -25,7 +25,8 @@ Architecture = auto #IgnorePkg = #IgnoreGroup = -#NoUpgrade = +# Protect Stormux custom skel files from being overwritten by package updates +NoUpgrade = etc/skel/.bashrc etc/skel/.inputrc etc/skel/.screenrc etc/skel/.vimrc etc/skel/.vim/* #NoExtract = # Misc options diff --git a/x86_64/airootfs/etc/skel.stormux/.bashrc b/x86_64/airootfs/etc/skel.stormux/.bashrc new file mode 100644 index 0000000..77532ba --- /dev/null +++ b/x86_64/airootfs/etc/skel.stormux/.bashrc @@ -0,0 +1,43 @@ +# +# ~/.bashrc +# + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +# Change directories without using cd +shopt -s autocd + +# Load aliases and functions if they exist +[[ -f "$HOME/.bash_aliases" ]] && . "$HOME/.bash_aliases" +[[ -f "$HOME/.bash_functions" ]] && . "$HOME/.bash_functions" + +# Environment variables +export QT_ACCESSIBILITY=1 +export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1 + +# Set prompt +PS1='[\u@\h \W] \$ ' + +# Dialog accessibility options +export DIALOGOPTS='--no-lines --visit-items' + +# Browser selection based on environment +if [[ -z "$DISPLAY" ]]; then + export BROWSER=w3m +fi + +# GPG TTY +GPG_TTY=$(tty) +export GPG_TTY + +# Don't put commands prefixed with space, or duplicate commands in history +export HISTCONTROL=ignoreboth + +# Increase history size +export HISTSIZE=10000 +export HISTFILESIZE=20000 + +# Add user's local bin directories to PATH +PATH="$HOME/.local/bin:$HOME/bin:$PATH" +export PATH diff --git a/x86_64/airootfs/etc/skel.stormux/.inputrc b/x86_64/airootfs/etc/skel.stormux/.inputrc new file mode 100644 index 0000000..183f130 --- /dev/null +++ b/x86_64/airootfs/etc/skel.stormux/.inputrc @@ -0,0 +1,25 @@ +# ~/.inputrc +# Readline configuration for bash +# Reload changes with control+x followed by control+r + +# Don't echo control characters +set echo-control-characters off + +# History searching with up and down arrows +"\e[A": history-search-backward +"\e[B": history-search-forward + +# Shift+Tab sequences for console (backward menu completion) +"\e[Z": menu-complete-backward +"\eZ": menu-complete-backward +# Alt+comma as alternative +"\e,": menu-complete-backward + +# Music player keybindings (requires playerctl) +"\eX": "\C-k \C-u playerctl play\C-M" +"\eC": "\C-k \C-u playerctl play-pause\C-M" +"\eV": "\C-k \C-u playerctl stop\C-M" +"\eB": "\C-k \C-u playerctl next\C-M" +"\eU": "\C-k \C-u playerctl metadata -f '{{artist}} - {{album}} - {{title}}'\C-M" +"\e_": "\C-k \C-u playerctl volume 0.05-\C-M" +"\e+": "\C-k \C-u playerctl volume 0.05+\C-M" diff --git a/x86_64/airootfs/etc/skel.stormux/.screenrc b/x86_64/airootfs/etc/skel.stormux/.screenrc new file mode 100644 index 0000000..1778579 --- /dev/null +++ b/x86_64/airootfs/etc/skel.stormux/.screenrc @@ -0,0 +1,33 @@ +# ~/.screenrc +# GNU Screen configuration + +# Disable visual bell +vbell off +bell_msg "" + +# Disable hardstatus +hardstatus off + +# Disable startup message +startup_message off + +# Set scrollback buffer size +defscrollback 4096 + +# Extended window numbering (0-19 instead of 0-9) +bind ! select 10 +bind @ select 11 +bind \# select 12 +bind $ select 13 +bind % select 14 +bind ^ select 15 +bind & select 16 +bind * select 17 +bind ( select 18 +bind ) select 19 + +# Copy buffer to system clipboard (requires xclip) +bind b eval "writebuf" 'exec !!! xclip -selection "clipboard" -i /tmp/screen-exchange' + +# Disable alternate screen switching (allows scrollback in terminal) +termcapinfo xterm* ti@:te@ diff --git a/x86_64/airootfs/etc/skel.stormux/.vim/backup/.gitkeep b/x86_64/airootfs/etc/skel.stormux/.vim/backup/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/x86_64/airootfs/etc/skel.stormux/.vim/dates.vim b/x86_64/airootfs/etc/skel.stormux/.vim/dates.vim new file mode 100644 index 0000000..21a7cdf --- /dev/null +++ b/x86_64/airootfs/etc/skel.stormux/.vim/dates.vim @@ -0,0 +1,29 @@ +" Date and time insertion functions + +" Insert current date in format: Wednesday, January 15, 2025 +function! InsertDate() + let date_string = strftime("%A, %B %d, %Y") + execute "normal! a" . date_string +endfunction + +" Insert current time in format: 09:15PM +function! InsertTime() + let time_string = strftime("%I:%M%p") + execute "normal! a" . time_string +endfunction + +" Insert current date and time in format: Wednesday, January 15, 2025, 09:15PM +function! InsertDateTime() + let datetime_string = strftime("%A, %B %d, %Y, %I:%M%p") + execute "normal! a" . datetime_string +endfunction + +" Key mappings +nnoremap date :call InsertDate() +inoremap date :call InsertDate() + +nnoremap time :call InsertTime() +inoremap time :call InsertTime() + +nnoremap datetime :call InsertDateTime() +inoremap datetime :call InsertDateTime() diff --git a/x86_64/airootfs/etc/skel.stormux/.vim/emoji.vim b/x86_64/airootfs/etc/skel.stormux/.vim/emoji.vim new file mode 100644 index 0000000..41f8e11 --- /dev/null +++ b/x86_64/airootfs/etc/skel.stormux/.vim/emoji.vim @@ -0,0 +1,39 @@ +" Emoji insertion mappings + +" Basic expressions +inoremap ,:) 😊 +inoremap ,:( 😢 +inoremap ,:D 😃 +inoremap ,;) 😉 +inoremap ,:P 😛 +inoremap ,:o 😮 +inoremap ,:\| 😐 + +" Hearts and love +inoremap ,<3 ❤️ +inoremap ,heart ❤️ +inoremap ,love 💕 +inoremap ,kiss 😘 + +" Special expressions +inoremap ,>:) 😈 +inoremap ,devil 😈 +inoremap ,:* 😘 +inoremap ,cool 😎 +inoremap ,nerd 🤓 +inoremap ,angry 😠 + +" Hands and gestures +inoremap ,thumbs 👍 +inoremap ,clap 👏 +inoremap ,wave 👋 +inoremap ,peace ✌️ +inoremap ,pray 🙏 + +" Common symbols +inoremap ,check ✅ +inoremap ,x ❌ +inoremap ,star ⭐ +inoremap ,fire 🔥 +inoremap ,rocket 🚀 +inoremap ,tada 🎉 diff --git a/x86_64/airootfs/etc/skel.stormux/.vim/swap/.gitkeep b/x86_64/airootfs/etc/skel.stormux/.vim/swap/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/x86_64/airootfs/etc/skel.stormux/.vim/views/.gitkeep b/x86_64/airootfs/etc/skel.stormux/.vim/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/x86_64/airootfs/etc/skel.stormux/.vimrc b/x86_64/airootfs/etc/skel.stormux/.vimrc new file mode 100644 index 0000000..0f72e86 --- /dev/null +++ b/x86_64/airootfs/etc/skel.stormux/.vimrc @@ -0,0 +1,77 @@ +" ~/.vimrc +" Vim configuration for Stormux + +" Ensure vim directory structure exists +" mkdir -p ~/.vim/{backup,swap,views} + +set nocompatible " Use Vim settings (not Vi compatible) +filetype off " Required for some plugins + +" Terminal and encoding +set term=linux " Make arrow and other keys work +scriptencoding utf-8 + +" History and undo +set history=1000 " Store more history (default is 20) +set undoreload=10000 " Maximum lines to save for undo on buffer reload + +" Backup and swap file configuration +set backup " Enable backups +set backupdir=$HOME/.vim/backup// +set directory=$HOME/.vim/swap// +set viewdir=$HOME/.vim/views// + +" Search settings +set ignorecase " Case insensitive search +set smartcase " Case sensitive when uppercase present +set gdefault " /g flag on :s substitutions by default + +" Spell checking +set spell " Enable spell checking + +" Display settings +set wrap " Wrap long lines +set linebreak " Break lines at word boundaries +set noruler " Disable ruler (for accessibility) +set laststatus=0 " Never show status line +set noshowcmd " Don't show commands in status + +" Indentation settings +set shiftwidth=4 " Use indents of 4 spaces +set expandtab " Tabs are spaces, not tabs +set tabstop=4 " An indentation every four columns +set softtabstop=4 " Let backspace delete indent + +" Leader key +let mapleader = ',' + +" Remap semicolon to colon for easier commands +nnoremap ; : + +" Yank from cursor to end of line (consistent with C and D) +nnoremap Y y$ + +" Em-dash insertion +inoremap ,- — + +" Working directory shortcuts +cmap cwd lcd %:p:h +cmap cd. lcd %:p:h + +" Write with sudo if you forgot to open with sudo +cmap w!! w !sudo tee % >/dev/null + +" Disable automatic comment continuation +autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o + +" Load vim helper functions if they exist +if filereadable(expand("~/.vim/dates.vim")) + source ~/.vim/dates.vim +endif + +if filereadable(expand("~/.vim/emoji.vim")) + source ~/.vim/emoji.vim +endif + +" Enable filetype detection and indenting +filetype plugin indent on diff --git a/x86_64/airootfs/root/customize_airootfs.sh b/x86_64/airootfs/root/customize_airootfs.sh index 709b248..95eb097 100644 --- a/x86_64/airootfs/root/customize_airootfs.sh +++ b/x86_64/airootfs/root/customize_airootfs.sh @@ -38,4 +38,14 @@ if [ -d /home/stormux ]; then chown -R 1000:1000 /home/stormux fi +# Copy Stormux custom skel files to /etc/skel +# This is done after package installation to avoid conflicts with packages like screen +echo "Copying Stormux custom skel files..." +if [ -d /etc/skel.stormux ]; then + cp -a /etc/skel.stormux/. /etc/skel/ + echo "Stormux skel files copied to /etc/skel" +else + echo "Warning: /etc/skel.stormux not found" +fi + echo "Airootfs customization complete" diff --git a/x86_64/airootfs/usr/local/bin/install-stormux b/x86_64/airootfs/usr/local/bin/install-stormux index 91d9d1b..72696a0 100755 --- a/x86_64/airootfs/usr/local/bin/install-stormux +++ b/x86_64/airootfs/usr/local/bin/install-stormux @@ -18,10 +18,12 @@ declare -a userNames=() declare -a userPasswords=() declare -a userIsAdmin=() desktopEnvironment="" # "none", "i3", "mate" +hasDesktop=false # true if a desktop environment is selected timezone="" enableSsh="no" # "yes" or "no" installLinuxGameManager="no" # "yes" or "no" installAudiogameManager="no" # "yes" or "no" +autoLoginUser="" # User to auto-login for desktop environments # @@ -666,24 +668,49 @@ gather_system_info() { case "$desktop" in "Console only"*) desktopEnvironment="none" + hasDesktop=false log_info "Desktop environment: none" break ;; "i3"*) desktopEnvironment="i3" + hasDesktop=true log_info "Desktop environment: i3" break ;; "MATE"*) desktopEnvironment="mate" + hasDesktop=true log_info "Desktop environment: mate" break ;; esac done + # Auto-login user selection (only if desktop environment selected) + if [[ "$hasDesktop" == true ]]; then + echo "" + echo "=== Auto-Login Configuration ===" + if [[ ${#userNames[@]} -eq 1 ]]; then + autoLoginUser="${userNames[0]}" + echo "Auto-login user set to: $autoLoginUser" + log_info "Auto-login user: $autoLoginUser" + else + echo "Select which user should automatically login to the graphical session:" + PS3="Enter user number: " + select selectedUser in "${userNames[@]}"; do + if [[ -n "$selectedUser" ]]; then + autoLoginUser="$selectedUser" + echo "Auto-login user set to: $autoLoginUser" + log_info "Auto-login user: $autoLoginUser" + break + fi + done + fi + fi + # Game manager installation (only if desktop environment selected) - if [[ "$desktopEnvironment" != "none" ]]; then + if [[ "$hasDesktop" == true ]]; then echo "" echo "=== Optional Game Managers ===" echo "" @@ -804,7 +831,7 @@ install_base_system() { ) local utilityPackages=( - vim nano screen magic-wormhole + vi vim nano screen magic-wormhole man man-pages xdg-user-dirs xdg-utils poppler socat parted @@ -820,30 +847,22 @@ install_base_system() { # Combine all packages local allPackages=("${basePackages[@]}" "${audioPackages[@]}" "${accessibilityPackages[@]}" "${utilityPackages[@]}") - # Add wine packages for audiogame-manager - if [[ "$installAudiogameManager" == "yes" ]]; then - local winePackages=( - wine winetricks wine_gecko wine-mono - cabextract dos2unix translate-shell - gst-plugins-bad gst-plugins-good gst-plugins-ugly gst-libav - ) - allPackages+=("${winePackages[@]}") - log_info "Adding wine packages for audiogame-manager" - fi - # Add desktop-specific packages case "$desktopEnvironment" in i3) - allPackages+=(i3-wm xclip) + allPackages+=(i3-wm orca lxterminal pluma) allPackages+=(discount jq libnotify xfce4-notifyd pamixer playerctl) allPackages+=(python-i3ipc python-wxpython sox yad) + allPackages+=(lxsession magic-wormhole pcmanfm) + allPackages+=(python-gobject python-pillow python-pytesseract scrot tesseract) + allPackages+=(tesseract-data-eng udiskie xorg-setxkbmap) # Add Stormux-specific i3 packages - stormuxPackages+=(xlibre-server xlibre-input-libinput nodm-dgw) + stormuxPackages+=(xlibre-xserver xlibre-input-libinput nodm-dgw) ;; mate) - allPackages+=(mate mate-extra orca lightdm lightdm-gtk-greeter) + allPackages+=(mate mate-extra orca) # Add Stormux-specific MATE packages - stormuxPackages+=(xlibre-server xlibre-input-libinput) + stormuxPackages+=(xlibre-xserver xlibre-input-libinput nodm-dgw) ;; esac @@ -1052,6 +1071,23 @@ pacman -Sy --noconfirm --needed ${stormuxPackages[*]} 2>/dev/null || true " fi + # Build game manager packages installation command + local gameManagerPackagesCmd="" + if [[ "$installAudiogameManager" == "yes" ]]; then + gameManagerPackagesCmd+=" +# Install wine packages for audiogame-manager +echo \"Installing wine packages for audiogame-manager...\" +pacman -S --noconfirm --needed wine winetricks wine_gecko wine-mono cabextract dos2unix translate-shell gst-plugins-bad gst-plugins-good gst-plugins-ugly gst-libav 2>/dev/null || true +" + fi + if [[ "$installLinuxGameManager" == "yes" ]]; then + gameManagerPackagesCmd+=" +# Install packages for linux-game-manager +echo \"Installing packages for linux-game-manager...\" +pacman -S --noconfirm --needed linux-game-manager 2>/dev/null || true +" + fi + # Build pipewire configuration command for all users local pipewireConfigCmd="" for username in "${userNames[@]}"; do @@ -1093,6 +1129,8 @@ export GTK_MODULES=gail:atk-bridge export GNOME_ACCESSIBILITY=1 export QT_ACCESSIBILITY=1 export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1 +export EDITOR=nano +export VISUAL=nano ENV_EOF # Note: realtime group is created by realtime-privileges package @@ -1161,7 +1199,6 @@ elif [[ "${desktopEnvironment}" == "mate" ]]; then # # Executed by startx (run your window manager from here) -dbus-launch [[ -f ~/.Xresources ]] && xrdb -merge -I\$HOME ~/.Xresources if [ -d /etc/X11/xinit/xinitrc.d ]; then @@ -1171,30 +1208,24 @@ if [ -d /etc/X11/xinit/xinitrc.d ]; then unset f fi -# Source xprofile if it exists -[[ -f ~/.xprofile ]] && . ~/.xprofile +[ -f /etc/xprofile ] && . /etc/xprofile +[ -f ~/.xprofile ] && . ~/.xprofile -exec mate-session +exec dbus-run-session -- mate-session XINITRC_MATE_EOF chmod 755 /home/\$firstUser/.xinitrc chown \$firstUser:users /home/\$firstUser/.xinitrc # Create .xprofile for MATE with accessibility variables cat > /home/\$firstUser/.xprofile <<'XPROFILE_MATE_EOF' -#!/bin/sh -# -# ~/.xprofile -# -# Executed by display managers and sourced by .xinitrc - -# Accessibility environment variables +# Accessibility variables export ACCESSIBILITY_ENABLED=1 -export GTK_MODULES=gail:atk-bridge:canberra-gtk-module +export CHROME_FLAGS="--force-renderer-accessibility" +export GTK_MODULES=gail:atk-bridge export GNOME_ACCESSIBILITY=1 export QT_ACCESSIBILITY=1 export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1 -export DBUS_SESSION_BUS_PID -export DBUS_SESSION_BUS_ADDRESS +export SAL_USE_VCLPLUGIN=gtk3 # Enable Orca screen reader gsettings set org.gnome.desktop.a11y.applications screen-reader-enabled true 2>/dev/null || true @@ -1220,13 +1251,12 @@ if [[ -f /usr/share/pacman/keyrings/stormux.gpg ]]; then pacman-key --lsign-key 52ADA49000F1FF0456F8AEEFB4CDE1CD56EF8E82 2>/dev/null || true fi -# Import xlibre key -pacman-key --recv-keys 73580DE2EDDFA6D6 2>/dev/null || true -pacman-key --lsign-key 73580DE2EDDFA6D6 2>/dev/null || true - # Install Stormux-specific packages (built dynamically before chroot) $stormuxPackagesCmd +# Install game manager packages (built dynamically before chroot) +$gameManagerPackagesCmd + # Enable pipewire globally for all users (creates symlinks in /etc/systemd/user/) systemctl --global enable pipewire.service pipewire-pulse.service wireplumber.service @@ -1241,9 +1271,9 @@ $pipewireConfigCmd # Configure nodm for automatic login (only after nodm package is installed) if [[ "${desktopEnvironment}" == "i3" ]] || [[ "${desktopEnvironment}" == "mate" ]]; then if [[ -f /etc/nodm.conf ]]; then - sed -i "s/{user}/${userNames[0]}/g" /etc/nodm.conf + sed -i "s/{user}/${autoLoginUser}/g" /etc/nodm.conf systemctl enable nodm.service - echo "Display manager (nodm) configured for ${userNames[0]}" + echo "Display manager (nodm) configured for ${autoLoginUser}" else echo "Warning: /etc/nodm.conf not found, skipping nodm configuration" fi @@ -1262,6 +1292,10 @@ export GNOME_ACCESSIBILITY=1 export QT_ACCESSIBILITY=1 export QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1 +# Default editor (users can override in their own shell config) +export EDITOR=nano +export VISUAL=nano + # Dialog accessibility options export DIALOGOPTS='--no-lines --visit-items' PROFILE_EOF @@ -1356,6 +1390,10 @@ install_game_managers() { # Clone repository git clone https://git.stormux.org/storm/linux-game-manager "$mountPoint/opt/linux-game-manager" + # Configure git repository for shared group access + arch-chroot "$mountPoint" git -C /opt/linux-game-manager config core.sharedRepository group + arch-chroot "$mountPoint" git -C /opt/linux-game-manager config safe.directory /opt/linux-game-manager + # Set ownership to root:games with group-writable permissions chown -R root:games "$mountPoint/opt/linux-game-manager" chmod -R 775 "$mountPoint/opt/linux-game-manager" @@ -1366,7 +1404,13 @@ install_game_managers() { cat > "$mountPoint/usr/local/bin/linux-game-manager" <<'EOF' #!/usr/bin/env bash cd /opt/linux-game-manager || exit 1 + +# Set umask for group-writable files +umask 002 + +# Try to update - only members of games group can write git pull --quiet 2>/dev/null || true + ./linux-game-manager.sh "$@" EOF chmod 755 "$mountPoint/usr/local/bin/linux-game-manager" @@ -1383,6 +1427,10 @@ EOF # Clone repository git clone https://git.stormux.org/storm/audiogame-manager "$mountPoint/opt/audiogame-manager" + # Configure git repository for shared group access + arch-chroot "$mountPoint" git -C /opt/audiogame-manager config core.sharedRepository group + arch-chroot "$mountPoint" git -C /opt/audiogame-manager config safe.directory /opt/audiogame-manager + # Set ownership to root:games with group-writable permissions chown -R root:games "$mountPoint/opt/audiogame-manager" chmod -R 775 "$mountPoint/opt/audiogame-manager" @@ -1393,7 +1441,13 @@ EOF cat > "$mountPoint/usr/local/bin/audiogame-manager" <<'EOF' #!/usr/bin/env bash cd /opt/audiogame-manager || exit 1 + +# Set umask for group-writable files +umask 002 + +# Try to update - only members of games group can write git pull --quiet 2>/dev/null || true + ./audiogame-manager.sh "$@" EOF chmod 755 "$mountPoint/usr/local/bin/audiogame-manager" diff --git a/x86_64/pacman.conf b/x86_64/pacman.conf index 8fd3637..4745275 100644 --- a/x86_64/pacman.conf +++ b/x86_64/pacman.conf @@ -25,7 +25,8 @@ Architecture = auto #IgnorePkg = #IgnoreGroup = -#NoUpgrade = +# Protect Stormux custom skel files from being overwritten by package updates +NoUpgrade = etc/skel/.bashrc etc/skel/.inputrc etc/skel/.screenrc etc/skel/.vimrc etc/skel/.vim/* #NoExtract = # Misc options @@ -79,10 +80,6 @@ LocalFileSigLevel = Optional SigLevel = Required DatabaseOptional Server = https://packages.stormux.org/$arch -[xlibre] -SigLevel = Required DatabaseOptional -Server = https://x11libre.net/repo/arch_based/$arch - [core] Include = /etc/pacman.d/mirrorlist