Initial commit: Moonarch reproduzierbares Arch-Linux-Setup

Niri-basierter Wayland-Desktop mit greetd/regreet, Catppuccin Mocha
Theming, Rofi-Menus, Waybar und vollstaendiger Post-Install-Automatisierung.

Archinstall-Config klont das Repo automatisch via custom-commands,
danach genuegt ein einzelner Befehl fuer die komplette Einrichtung.
This commit is contained in:
nevaforget 2026-03-23 17:42:26 +01:00
commit 5d2ce00455
69 changed files with 10527 additions and 0 deletions

9
.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
# ABOUTME: Gitignore für Moonarch.
# ABOUTME: Schließt temporäre Dateien und Build-Artefakte aus.
*.pyc
__pycache__/
*.swp
*.swo
*~
.DS_Store

20
CLAUDE.md Normal file
View File

@ -0,0 +1,20 @@
# Moonarch
Reproduzierbares Arch-Linux-Setup basierend auf archinstall + Post-Install-Automatisierung.
## Projektstruktur
- `config/` — archinstall-Konfiguration (inkl. custom-commands die das Repo nach /opt/moonarch klonen)
- `scripts/` — Post-Install- und Helper-Scripts
- `packages/` — Paketlisten (offiziell + AUR), getrennt gepflegt
- `defaults/` — XDG-Configs, Shell-Config, Helper-Binaries, greetd-Config, Wallpaper
## Konventionen
- Paketlisten sind einfache Textdateien, ein Paket pro Zeile, Kommentare mit `#`
- Shell-Scripts müssen POSIX-kompatibel oder explizit bash/zsh sein
- Alle Pfade im archinstall-Config relativ zum Installationsziel
## Ich bin Apollo
Benannt nach dem Programm, das Menschen zum Mond gebracht hat — passend für ein Projekt namens Moonarch.

48
README.md Normal file
View File

@ -0,0 +1,48 @@
# Moonarch
Reproduzierbares Arch-Linux-Setup mit Niri (Wayland Compositor), greetd/regreet, Catppuccin Mocha Theming und durchgehender Automatisierung.
## Schnellstart
1. Arch ISO booten
2. `archinstall --config /pfad/zur/user_configuration.json` (Disk + Kernel interaktiv)
3. Reboot — das Repo liegt bereits in `/opt/moonarch`
4. Einloggen, dann:
```bash
/opt/moonarch/scripts/post-install.sh
```
5. Nochmal rebooten — fertig
## Struktur
```
config/ archinstall-Konfiguration
packages/ Paketlisten (official.txt + aur.txt)
scripts/ Bootstrap, Post-Install, Update, Theme-Installer
defaults/
bin/ moonarch-* Helper-Scripts (/usr/local/bin/)
xdg/ XDG-Defaults (/etc/xdg/)
shell/ Zsh-Konfiguration
etc/ greetd/regreet Konfiguration
backgrounds/ Greeter-Wallpaper
```
## Update
```bash
moonarch-update
```
Aktualisiert Repo, Systempakete, fehlende Pakete und Defaults — alles interaktiv mit Bestaetigungen.
## Stack
- **Compositor:** Niri (Scrollable Tiling Wayland)
- **Greeter:** greetd + regreet
- **Bar:** Waybar
- **Launcher:** Rofi (lbonn Wayland Fork)
- **Terminal:** Foot
- **Theme:** Catppuccin Mocha + Sweet Cursors + Newaita Icons
- **Shell:** Zsh

View File

@ -0,0 +1,77 @@
{
"__comment": "ABOUTME: archinstall-Konfiguration für Moonarch.",
"__comment2": "ABOUTME: Basis-Setup — Kernel, Disk und Filesystem werden interaktiv gewählt.",
"audio_config": {
"audio": "pipewire"
},
"bootloader": "Systemd-boot",
"hostname": "moonarch",
"locale_config": {
"sys_lang": "de_DE.UTF-8",
"sys_enc": "UTF-8",
"kb_layout": "de"
},
"network_config": {
"type": "nm"
},
"ntp": true,
"packages": [
"base-devel",
"btrfs-progs",
"efibootmgr",
"man-db",
"git",
"neovim",
"zsh",
"networkmanager",
"pipewire",
"pipewire-alsa",
"pipewire-jack",
"pipewire-pulse",
"wireplumber",
"docker",
"docker-compose",
"fwupd",
"ufw",
"greetd",
"greetd-regreet",
"niri",
"waybar",
"foot",
"dunst",
"polkit-gnome",
"stow"
],
"profile_config": {
"gfx_driver": "All open-source",
"greeter": "greetd",
"profile": {
"main": "Desktop",
"details": []
}
},
"services": [
"NetworkManager",
"bluetooth",
"docker",
"greetd",
"systemd-timesyncd",
"ufw"
],
"timezone": "Europe/Berlin",
"custom-commands": [
"git clone https://gitea.moonarch.de/nevaforget/moonarch.git /opt/moonarch",
"chown -R 1000:1000 /opt/moonarch"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

142
defaults/bin/moonarch-bangs Executable file
View File

@ -0,0 +1,142 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-based tool launcher that provides a searchable menu of system utilities.
# ABOUTME: Includes VPN, sound, bluetooth, shortcuts, and other system management tools.
declare -A LABELS
declare -A COMMANDS
###
# List of defined 'bangs'
# launch programs
# COMMANDS["apps"]="rofi -combi-modi window,drun -show combi"
# LABELS["apps"]=""
# open bookmarks
# COMMANDS["bookmarks"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-bookmarks.sh"
# LABELS["bookmarks"]=""
# search local files
COMMANDS[""]="moonarch-locate"
LABELS[""]="Locate"
COMMANDS[""]="wlogout -P 1 -s -r 10 -c 10"
LABELS[""]="Session Menu"
# open custom web searches
# COMMANDS["websearch"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-websearch.sh"
# LABELS["websearch"]=""
# show clipboard history
# source: https://bitbucket.org/pandozer/rofi-clipboard-manager/overview
# COMMANDS["clipboard"]='rofi -modi "clipboard:~/.bin/rofi-clipboard-manager/mclip.py menu" -show clipboard && ~/.bin/rofi-clipboard-manager/mclip.py paste'
# LABELS["clipboard"]=""
# references --------------------------
# COMMANDS[";sr2"]="chromium 'wikipedia.org/search-redirect.php?search=\" \${input}\""
# LABELS[";sr2"]=""
# COMMANDS[";piratebay"]="chromium --disk-cache-dir=/tmp/cache http://thepiratebay.org/search/\" \${input}\""
# LABELS[";piratebay"]=""
# COMMANDS[".bin"]="spacefm -r '/home/dka/bin'"
# LABELS[".bin"]=".bin"
# COMMANDS["#screenshot"]='/home/dka/bin/screenshot-scripts/myscreenshot.sh'
# LABELS["#screenshot"]="screenshot"
# greenclip clipboard history
# source: https://github.com/erebe/greenclip
COMMANDS[""]='rofi -modi "clipboard:greenclip print" -show Clipboard'
LABELS[""]="Clipboard"
COMMANDS["󰖂"]='moonarch-vpn'
LABELS["󰖂"]='VPN Connection Manager'
COMMANDS["󰗅"]='moonarch-volume'
LABELS["󰗅"]='Sound Manager'
#COMMANDS[""]='shortcuts module was removed'
#LABELS[""]='Hotkey List'
COMMANDS["󰍹"]='wdisplays'
LABELS["󰍹"]='Display Setup'
COMMANDS[""]='nwg-look'
LABELS[""]='Appearance Settings'
COMMANDS["󱘆"]='noisetorch'
LABELS["󱘆"]='Audio Noise Reduction'
COMMANDS["󰋋"]='$HOME/.local/share/headset-charge-indicator/headset-charge-indicator.py &'
LABELS["󰋋"]='Headset Control'
COMMANDS[""]='moonarch-bluetooth'
LABELS[""]='Bluetooth Control'
COMMANDS["󰛳"]='nm-applet --indicator &'
LABELS["󰛳"]='Networker Manager'
COMMANDS["󰴱"]='wl-color-picker'
LABELS["󰴱"]='Color Picker'
COMMANDS["󰚞"]='font-manager'
LABELS["󰚞"]='Font Manager'
COMMANDS["󱨑"]='gufw'
LABELS["󱨑"]='Firewall Settings'
COMMANDS[""]='stacer'
LABELS[" "]='System Maintenance'
################################################################################
# do not edit below
################################################################################
##
# Generate menu
##
function print_menu()
{
for key in ${!LABELS[@]}
do
# echo "$key ${LABELS}"
echo "$key ${LABELS[$key]}"
# my top version just shows the first field in labels row, not two words side by side
done
}
##
# Show rofi.
##
function start()
{
# print_menu | rofi -dmenu -p "?=>"
print_menu | sort | rofi -show "Tools" -dmenu -mesg " Tools" -i -p "rofi-bangs: "
}
# Run it
value="$(start)"
# Split input.
# grab upto first space.
choice=${value%%\ *}
# graph remainder, minus space.
input=${value:$((${#choice}+1))}
##
# Cancelled? bail out
##
if test -z ${choice}
then
exit
fi
# check if choice exists
if test ${COMMANDS[$choice]+isset}
then
# Execute the choice
${COMMANDS[$choice]}
else
echo "Unknown command: ${choice}" | rofi -dmenu -p "error"
fi

314
defaults/bin/moonarch-bluetooth Executable file
View File

@ -0,0 +1,314 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-based Bluetooth device manager using bluetoothctl.
# ABOUTME: Supports connecting, pairing, trusting devices, and toggling power/scan/discoverable.
# Author: Nick Clyde (clydedroid)
#
# A script that generates a rofi menu that uses bluetoothctl to
# connect to bluetooth devices and display status info.
#
# Inspired by networkmanager-dmenu (https://github.com/firecat53/networkmanager-dmenu)
# Thanks to x70b1 (https://github.com/polybar/polybar-scripts/tree/master/polybar-scripts/system-bluetooth-bluetoothctl)
#
# Depends on:
# Arch repositories: rofi, bluez-utils (contains bluetoothctl)
# Constants
divider="---------"
goback="Back"
# Checks if bluetooth controller is powered on
power_on() {
if bluetoothctl show | grep -q "Powered: yes"; then
return 0
else
return 1
fi
}
# Toggles power state
toggle_power() {
if power_on; then
bluetoothctl power off
show_menu
else
if rfkill list bluetooth | grep -q 'blocked: yes'; then
rfkill unblock bluetooth && sleep 3
fi
bluetoothctl power on
show_menu
fi
}
# Checks if controller is scanning for new devices
scan_on() {
if bluetoothctl show | grep -q "Discovering: yes"; then
echo "Scan: on"
return 0
else
echo "Scan: off"
return 1
fi
}
# Toggles scanning state
toggle_scan() {
if scan_on; then
kill $(pgrep -f "bluetoothctl scan on")
bluetoothctl scan off
show_menu
else
bluetoothctl scan on &
echo "Scanning..."
sleep 5
show_menu
fi
}
# Checks if controller is able to pair to devices
pairable_on() {
if bluetoothctl show | grep -q "Pairable: yes"; then
echo "Pairable: on"
return 0
else
echo "Pairable: off"
return 1
fi
}
# Toggles pairable state
toggle_pairable() {
if pairable_on; then
bluetoothctl pairable off
show_menu
else
bluetoothctl pairable on
show_menu
fi
}
# Checks if controller is discoverable by other devices
discoverable_on() {
if bluetoothctl show | grep -q "Discoverable: yes"; then
echo "Discoverable: on"
return 0
else
echo "Discoverable: off"
return 1
fi
}
# Toggles discoverable state
toggle_discoverable() {
if discoverable_on; then
bluetoothctl discoverable off
show_menu
else
bluetoothctl discoverable on
show_menu
fi
}
# Checks if a device is connected
device_connected() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -q "Connected: yes"; then
return 0
else
return 1
fi
}
# Toggles device connection
toggle_connection() {
if device_connected "$1"; then
bluetoothctl disconnect "$1"
device_menu "$device"
else
bluetoothctl connect "$1"
device_menu "$device"
fi
}
# Checks if a device is paired
device_paired() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -q "Paired: yes"; then
echo "Paired: yes"
return 0
else
echo "Paired: no"
return 1
fi
}
# Toggles device paired state
toggle_paired() {
if device_paired "$1"; then
bluetoothctl remove "$1"
device_menu "$device"
else
bluetoothctl pair "$1"
device_menu "$device"
fi
}
# Checks if a device is trusted
device_trusted() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -q "Trusted: yes"; then
echo "Trusted: yes"
return 0
else
echo "Trusted: no"
return 1
fi
}
# Toggles device connection
toggle_trust() {
if device_trusted "$1"; then
bluetoothctl untrust "$1"
device_menu "$device"
else
bluetoothctl trust "$1"
device_menu "$device"
fi
}
# Prints a short string with the current bluetooth status
# Useful for status bars like polybar, etc.
print_status() {
if power_on; then
printf ''
paired_devices_cmd="devices Paired"
# Check if an outdated version of bluetoothctl is used to preserve backwards compatibility
if (( $(echo "$(bluetoothctl version | cut -d ' ' -f 2) < 5.65" | bc -l) )); then
paired_devices_cmd="paired-devices"
fi
mapfile -t paired_devices < <(bluetoothctl $paired_devices_cmd | grep Device | cut -d ' ' -f 2)
counter=0
for device in "${paired_devices[@]}"; do
if device_connected "$device"; then
device_alias=$(bluetoothctl info "$device" | grep "Alias" | cut -d ' ' -f 2-)
if [ $counter -gt 0 ]; then
printf ", %s" "$device_alias"
else
printf " %s" "$device_alias"
fi
((counter++))
fi
done
printf "\n"
else
echo ""
fi
}
# A submenu for a specific device that allows connecting, pairing, and trusting
device_menu() {
device=$1
# Get device name and mac address
device_name=$(echo "$device" | cut -d ' ' -f 3-)
mac=$(echo "$device" | cut -d ' ' -f 2)
# Build options
if device_connected "$mac"; then
connected="Connected: yes"
else
connected="Connected: no"
fi
paired=$(device_paired "$mac")
trusted=$(device_trusted "$mac")
options="$connected\n$paired\n$trusted\n$divider\n$goback\nExit"
# Open rofi menu, read chosen option
chosen="$(echo -e "$options" | $rofi_command "$device_name")"
# Match chosen option to command
case "$chosen" in
"" | "$divider")
echo "No option chosen."
;;
"$connected")
toggle_connection "$mac"
;;
"$paired")
toggle_paired "$mac"
;;
"$trusted")
toggle_trust "$mac"
;;
"$goback")
show_menu
;;
esac
}
# Opens a rofi menu with current bluetooth status and options to connect
show_menu() {
# Get menu options
if power_on; then
power="Power: on"
# Human-readable names of devices, one per line
# If scan is off, will only list paired devices
devices=$(bluetoothctl devices | grep Device | cut -d ' ' -f 3-)
# Get controller flags
scan=$(scan_on)
pairable=$(pairable_on)
discoverable=$(discoverable_on)
# Options passed to rofi
options="$devices\n$divider\n$power\n$scan\n$pairable\n$discoverable\nExit"
else
power="Power: off"
options="$power\nExit"
fi
# Open rofi menu, read chosen option
chosen="$(echo -e "$options" | $rofi_command "Bluetooth")"
# Match chosen option to command
case "$chosen" in
"" | "$divider")
echo "No option chosen."
;;
"$power")
toggle_power
;;
"$scan")
toggle_scan
;;
"$discoverable")
toggle_discoverable
;;
"$pairable")
toggle_pairable
;;
*)
device=$(bluetoothctl devices | grep "$chosen")
# Open a submenu if a device is selected
if [[ $device ]]; then device_menu "$device"; fi
;;
esac
}
# Rofi command to pipe into, can add any options here
rofi_command="rofi -dmenu $* -p -theme /etc/xdg/rofi/bluetooth/bluetooth.rasi -mesg -Bluetooth-Control"
case "$1" in
--status)
print_status
;;
*)
show_menu
;;
esac

19
defaults/bin/moonarch-btnote Executable file
View File

@ -0,0 +1,19 @@
#!/bin/bash
# ABOUTME: Prüft Bluetooth-Geräte auf niedrigen Akkustand und sendet Notification.
# ABOUTME: Kann per Timer oder Cron regelmäßig ausgeführt werden.
NOTIFY_AT_PERCENTAGE=70
ICON="/usr/share/icons/Newaita-reborn/status/symbolic/battery-empty-symbolic.svg"
for d in $(upower -e); do
DEVICE_DATA=$(upower -i "$d")
PERCENTAGE=$(echo $DEVICE_DATA | grep -Po '(?<=(percentage: )).*(?= icon)')
PER_INT=$(echo "${PERCENTAGE//%}")
DEVICE_NAME=$(echo $DEVICE_DATA | grep -Po '(?<=(model: )).*(?= serial)')
if [ ! -z "$DEVICE_NAME" ] && [ "$PER_INT" -lt "$NOTIFY_AT_PERCENTAGE" ]; then
notify-send -t 5000 -e "Low battery $DEVICE_NAME $PER_INT%" -i "$ICON" \
-h string:x-canonical-private-synchronous:battery \
-h int:value:"$PER_INT" -u critical
fi
done

98
defaults/bin/moonarch-calendar Executable file
View File

@ -0,0 +1,98 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-based calendar widget with month navigation.
# ABOUTME: Displays a calendar grid and highlights the current day.
DIR=$(dirname $PWD)
current_day=$(date +"%e")
current_month=$(date +"%m")
current_year=$(date +"%Y")
month=$(date +"%-m")
year=$(date +"%Y")
previous_month="◀"
next_month="▶"
last_selected_option=""
format_calendar () {
echo "$1" \
| sed -E 's/([[:alpha:]])__/\1\n/g' \
| sed -E 's/___([[:digit:]])/.\n\1/g' \
| sed -e 's/___/\n./g' \
| sed -e 's/__/\n/g' \
| sed -e 's/_/\n/g'
}
print_month() {
calendar="$(cal -v -- $1 $2 | tail -n +2 | sed -e 's/ /_/g')"
echo "$(format_calendar "$calendar")"
}
find_day_index() {
index=0
while IFS=' ' read -ra arr; do
for i in "${arr[@]}"; do
if [[ "$i" == "$2" ]]; then
echo "$index"
break
fi
((index++))
done
done <<< "$1"
}
calendar_menu() {
calendar_header=$(cal -v -- $month $year | head -n 1)
month_page="$(print_month $month $year)"
calendar_body="\n\n\n$previous_month\n\n\n\n$month_page\n\n\n\n$next_month\n\n\n"
previous_month_index="3"
next_month_index="59"
calendar_body_column="7"
urgent="-u $previous_month_index,$next_month_index"
active=""
selected_row=""
if [[ "$(echo $current_month | bc) $current_year" == "$(echo $month | bc) $year" ]]; then
current_day_index=$(($(find_day_index "$month_page" $current_day) + $calendar_body_column))
active="-a $current_day_index"
selected_row="-selected-row $current_day_index"
fi
if [[ $last_selected_option == $previous_month ]]; then
selected_row="-selected-row $previous_month_index"
fi
if [[ $last_selected_option == $next_month ]]; then
selected_row="-selected-row $next_month_index"
fi
echo -e "$calendar_body" | rofi -dmenu \
-theme /etc/xdg/rofi/calendar/rofi-calendar.rasi \
-p "$calendar_header" $urgent $active $selected_row
}
while [[ true ]]; do
selected=$(calendar_menu)
last_selected_option="$selected"
case $selected in
$previous_month)
((month--))
if [[ $month -lt 1 ]]; then
month=12
((year--))
fi
;;
$next_month)
((month++))
if [[ $month -gt 12 ]]; then
month=1
((year++))
fi
;;
*)
break
;;
esac
done

19
defaults/bin/moonarch-capsnote Executable file
View File

@ -0,0 +1,19 @@
#!/usr/bin/env bash
# ABOUTME: Zeigt eine Notification beim Umschalten von Caps Lock an.
# ABOUTME: Gedacht für Keybinding oder Input-Event-Trigger.
sleep 0.2
value=($(cat /sys/class/leds/input*::capslock/brightness | cut -f1 -d,))
if [ ${value[2]} == 1 ]; then
icon_name="capslock-enabled-symbolic"
output="caps lock on"
else
icon_name="capslock-disabled-symbolic"
output="caps lock off"
fi
notify-send -e "$output" -i "$icon_name" \
-h string:x-canonical-private-synchronous:state \
-h boolean:value:"${value[2]}" -r 555

72
defaults/bin/moonarch-cpugov Executable file
View File

@ -0,0 +1,72 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-based CPU governor switcher using auto-cpufreq.
# ABOUTME: Allows switching between performance, powersave, and reset modes.
declare -A LABELS
declare -A COMMANDS
###
# List of defined 'bangs'
COMMANDS["󰓅"]="pkexec auto-cpufreq --force=performance"
LABELS["󰓅"]="Performance"
COMMANDS["󰌪"]='pkexec auto-cpufreq --force=powersave'
LABELS["󰌪"]="Powersave"
COMMANDS[""]='pkexec auto-cpufreq --force=reset'
LABELS[""]="Reset"
################################################################################
# do not edit below
################################################################################
##
# Generate menu
##
function print_menu()
{
for key in ${!LABELS[@]}
do
# echo "$key ${LABELS}"
echo "$key ${LABELS[$key]}"
# my top version just shows the first field in labels row, not two words side by side
done
}
##
# Show rofi.
##
function start()
{
# print_menu | rofi -dmenu -p "?=>"
print_menu | sort | rofi -theme /etc/xdg/rofi/cpugov/rofi-cpugov.rasi -show "CPU Modes" -dmenu -mesg "󰓅 CPU Modes" -i -p "rofi-bangs: "
}
# Run it
value="$(start)"
# Split input.
# grab upto first space.
choice=${value%%\ *}
# graph remainder, minus space.
input=${value:$((${#choice}+1))}
##
# Cancelled? bail out
##
if test -z ${choice}
then
exit
fi
# check if choice exists
if test ${COMMANDS[$choice]+isset}
then
# Execute the choice
${COMMANDS[$choice]}
dunstify --replace 553 -i "/usr/share/icons/zafiro-dark/devices/48/cpu.svg" "CPU Mode" "Set to $choice ${LABELS[$choice]}"
else
echo "Unknown command: ${choice}" | rofi -dmenu -p "error"
fi

26
defaults/bin/moonarch-dnd Executable file
View File

@ -0,0 +1,26 @@
#!/usr/bin/env bash
# ABOUTME: Waybar-Modul das den DND-Status von dunst als JSON ausgibt.
# ABOUTME: Wird von der Waybar custom/dnd Config referenziert.
set -euo pipefail
readonly ENABLED=''
readonly DISABLED=''
dbus-monitor path='/org/freedesktop/Notifications',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged' --profile |
while read -r _; do
PAUSED="$(dunstctl is-paused)"
if [ "$PAUSED" == 'false' ]; then
CLASS="enabled"
TEXT="$ENABLED"
TOOLTIP="Notifications are on"
else
CLASS="disabled"
TEXT="$DISABLED"
TOOLTIP="Notifications are off"
COUNT="$(dunstctl count waiting)"
if [ "$COUNT" != '0' ]; then
TEXT="$DISABLED ($COUNT)"
fi
fi
printf '{"text": "%s", "class": "%s", "tooltip": "%s"}\n' "$TEXT" "$CLASS" "$TOOLTIP"
done

14
defaults/bin/moonarch-emojis Executable file
View File

@ -0,0 +1,14 @@
#!/bin/sh
# ABOUTME: Rofi emoji picker that copies selected emoji to clipboard.
# ABOUTME: Reads emoji list from /etc/xdg/rofi/emojis/emojis.txt.
FILE="/etc/xdg/rofi/emojis/emojis.txt"
if [ "$@" ]
then
smiley=$(echo $@ | cut -d' ' -f1)
echo -n "$smiley" | xsel -bi
exit 0
fi
cat $FILE

63
defaults/bin/moonarch-gtk-style Executable file
View File

@ -0,0 +1,63 @@
#!/usr/bin/env python3
# ABOUTME: Converts GTK theme colors to rofi-compatible CSS color values.
# ABOUTME: Reads a template file and replaces {@theme_*_color} placeholders with hex values.
# https://github.com/Git-Fal7/gtk-rofi/
# Taken from MATE-HUD github.com/ubuntu-mate/mate-hud
# Used for rofi css
# Usage
# ./moonarch-gtk-style [input file] > [output file]
# examples
# background-color: {@theme_bg_color}
# see the array below for list of style context to use
import sys
if len(sys.argv)<2:
sys.exit(1)
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gio, GLib, Gtk
#Converts from rgba <GTK R, G, B> to hex #RRGGBB
def rgba_to_hex(color):
return "#{0:02x}{1:02x}{2:02x}".format( int(color.red * 255), int(color.green * 255), int(color.blue * 255))
window = Gtk.Window()
style_context = window.get_style_context()
#List of style contexts
lists = [
#Foreground
'theme_fg_color', 'theme_selected_fg_color', 'theme_fg_color',
'warning_fg_color', 'info_fg_color',
#Background
'theme_bg_color', 'theme_selected_bg_color', 'error_bg_color',
'warning_bg_color', 'info_bg_color',
#Others
'theme_unfocused_fg_color', 'theme_text_color',
'theme_unfocused_text_color',
'theme_base_color',
'theme_unfocused_fg_color',
'theme_unfocused_text_color',
'theme_unfocused_bg_color',
'theme_unfocused_base_color',
'theme_unfocused_selected_bg_color',
'theme_unfocused_selected_fg_color',
'unfocused_insensitive_color',
'borders',
'unfocused_borders',
'warning_color',
'error_color',
'success_color'
]
with open(sys.argv[1]) as f:
file=f.read()
for style in lists:
file=file.replace("{@" + style + "}", rgba_to_hex(style_context.lookup_color(style)[1]))
print(file)

52
defaults/bin/moonarch-json Executable file
View File

@ -0,0 +1,52 @@
#!/bin/bash
# ABOUTME: Rofi helper that reads a JSON config file to build a dynamic menu.
# ABOUTME: Parses name/command/icon fields from JSON and launches selected entries.
#https://github.com/luiscrjunior/rofi-json
user_file="${1/#\~/$HOME}"
if [[ "$user_file" = /* ]]
then
config_file="$user_file"
else
cwd=$(dirname $0)
config_file="${cwd}/${user_file}"
fi
json=$(cat ${config_file})
if [ $# -eq 1 ]; then
echo $json | jq -cr '.[] | "\(.name)|\(.command)|\(.icon)"' |
while IFS="|" read -r name command icon
do
if [[ $name == "null" ]]; then
continue
fi
if [[ $icon == "null" ]]; then
icon="system-run"
fi
echo -en "${name}\0icon\x1f${icon}\n"
done
exit 1
fi
if [ $# -eq 2 ]; then
selected=$2
task=$(echo $json | jq ".[] | select(.name == \"$selected\")")
if [[ $task == "" ]]; then
exit 1
fi
command=$(echo $task | jq -j ".command")
if [[ $command == "null" ]]; then
command=$(echo $task | jq -j ".name")
fi
coproc bash -c "$command"
exit
fi

41
defaults/bin/moonarch-launcher Executable file
View File

@ -0,0 +1,41 @@
#!/usr/bin/env bash
# ABOUTME: Application launcher using rofi with GTK theme integration.
# ABOUTME: Supports window, files, run, and drun modes.
SETTINGS=/etc/xdg/rofi/gtk-theme.ini
#Gets the current gtk using gsettings and removes the quotes
CURRENT_GTK_THEME=$(gsettings get org.gnome.desktop.interface gtk-theme)
CURRENT_GTK_THEME="${CURRENT_GTK_THEME#?}"
CURRENT_GTK_THEME="${CURRENT_GTK_THEME%?}"
#Gets the gtk theme that is in the settings.ini file
SETTINGS_GTK_THEME=$(grep "GTK_THEME" "${SETTINGS}" | cut -b 11-)
#create new colors.rasi from template
if [ "${SETTINGS_GTK_THEME}" != "${CURRENT_GTK_THEME}" ]; then
sed -i "s:GTK_THEME=${SETTINGS_GTK_THEME}:GTK_THEME=${CURRENT_GTK_THEME}:g" "${SETTINGS}"
python3 moonarch-gtk-style /etc/xdg/rofi/_template/colors.rasi > /etc/xdg/rofi/colors.rasi
fi
case $1 in
window)
showmode="window"
;;
files)
showmode="filebrowser"
;;
run)
showmode="run"
;;
*)
showmode="drun"
;;
esac
## Run
rofi \
-show $showmode \
-click-to-exit \
-theme /etc/xdg/rofi/launcher/launcher.rasi

9
defaults/bin/moonarch-locate Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
# ABOUTME: Rofi-based file search using the locate/mlocate database.
# ABOUTME: Opens selected files with xdg-open.
# info: rofi-locate is a script to search local files and folders on your computer using the locate command and the updatedb database
# requirements: rofi mlocate
# playlist: rofi https://www.youtube.com/playlist?list=PLqv94xWU9zZ0LVP1SEFQsLEYjZC_SUB3m
xdg-open "$(locate home media | rofi -threads 0 -width 100 -dmenu -i -p "locate:")"

84
defaults/bin/moonarch-powermenu Executable file
View File

@ -0,0 +1,84 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-basiertes Power-Menü für Moonarch (Niri).
# ABOUTME: Bietet Shutdown, Reboot, Lock, Suspend und Logout.
# CMDs
uptime="`uptime -p | sed -e 's/up //g'`"
host="$USER@"`hostname`
# Options
shutdown='󰤆'
reboot=''
lock=''
suspend=''
logout='󰗽'
yes=''
no='󰆢'
# Rofi CMD
rofi_cmd() {
rofi -dmenu \
-p "$host uptime: $uptime" \
-mesg "$host uptime: $uptime" \
-theme /etc/xdg/rofi/powermenu/powermenu.rasi
}
# Confirmation CMD
confirm_cmd() {
rofi -dmenu \
-p 'Confirmation' \
-normal-window \
-mesg 'Confirm '${chosen} \
-theme /etc/xdg/rofi/powermenu/confirm.rasi
}
# Ask for confirmation
confirm_exit() {
echo -e "$yes\n$no" | confirm_cmd ${chosen}
}
# Pass variables to rofi dmenu
run_rofi() {
echo -e "$lock\n$suspend\n$logout\n$reboot\n$shutdown" | rofi_cmd
}
# Execute Command
run_cmd() {
selected="$(confirm_exit)"
if [[ "$selected" == "$yes" ]]; then
if [[ $1 == '--shutdown' ]]; then
systemctl poweroff
elif [[ $1 == '--reboot' ]]; then
systemctl reboot
elif [[ $1 == '--suspend' ]]; then
mpc -q pause
amixer set Master mute
systemctl suspend
elif [[ $1 == '--logout' ]]; then
niri msg action quit
fi
else
exit 0
fi
}
# Actions
chosen="$(run_rofi)"
case ${chosen} in
$shutdown)
run_cmd --shutdown
;;
$reboot)
run_cmd --reboot
;;
$lock)
killall rofi
wlogout -P 1 -s -r 10 -c 10
;;
$suspend)
run_cmd --suspend
;;
$logout)
run_cmd --logout
;;
esac

66
defaults/bin/moonarch-setmen Executable file
View File

@ -0,0 +1,66 @@
#!/usr/bin/env bash
# ABOUTME: Rofi script mode that lists desktop files from /usr/share/settings-menu/.
# ABOUTME: Used with rofi -show fb -modes "fb:moonarch-setmen" for a settings launcher.
####
# @author moonarch.de (nevaforget)
# script used with rofi to list desktop files of specific dir
# dir: /usr/share/settings-menu/
# @example rofi -show fb -modes "fb:moonarch-setmen" -theme /etc/xdg/rofi/settings-menu/settings-menu.rasi
# @dependencies glib >= 2.67.2
####
function get_name {
local lang=$(locale | grep LANG | cut -d= -f2 | cut -d_ -f1)
local find="Name\[$lang\]="
local name=$(grep "^$find" $1 | tail -1 | sed "s/^$find//" | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g')
if [ "${name}" = "" ]
then
find="Name="
name=$(grep "^$find" $1 | tail -1 | sed "s/^$find//" | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g')
fi
echo "$name"
}
if [ "$ROFI_RETV" = "1" ]
then
for deskfile in /usr/share/settings-menu/*
do
match=$(grep "^Name" $deskfile | grep "$@" )
if [ -n "$match" ]
then
#gio launch $deskfile
# old way
app=$(grep '^Exec' $deskfile | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g')
coproc ( $app > /dev/null 2>&1 )
break
fi
done
exit 0
fi
function init {
for file in /usr/share/settings-menu/*
do
local name=$(get_name "$file")
local iconline=$(sed -n -e '/^Icon=/p' "$file")
local icon=${iconline/Icon=/""}
if [ -n "$name" ]
then
echo -en "$name\0icon\x1f$icon\n"
fi
done
}
init

135
defaults/bin/moonarch-settings Executable file
View File

@ -0,0 +1,135 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-based settings menu that launches various system tools and scripts.
# ABOUTME: Provides a searchable list of system utilities like VPN, sound, bluetooth, etc.
declare -A LABELS
declare -A COMMANDS
###
# List of defined 'bangs'
# launch programs
# COMMANDS["apps"]="rofi -combi-modi window,drun -show combi"
# LABELS["apps"]=""
# open bookmarks
# COMMANDS["bookmarks"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-bookmarks.sh"
# LABELS["bookmarks"]=""
# search local files
# COMMANDS[""]="moonarch-locate"
# LABELS[""]="Locate"
COMMANDS[""]="wlogout -P 1 -s -r 10 -c 10"
LABELS[""]="Session Menu"
# greenclip clipboard history
# source: https://github.com/erebe/greenclip
COMMANDS[""]='cliphist -db-path /run/user/1000/cliphist/db list | rofi -dmenu | cliphist -db-path /run/user/1000/cliphist/db decode | wl-copy'
LABELS[""]="Clipboard"
COMMANDS["󰖂"]='moonarch-vpn'
LABELS["󰖂"]='VPN Connection Manager'
COMMANDS[""]='waypaper'
LABELS[""]='Wallpaper Settings'
COMMANDS["󰗅"]='moonarch-volume'
LABELS["󰗅"]='Sound Manager'
#COMMANDS[""]='shortcuts module was removed'
#LABELS[""]='Hotkey List'
COMMANDS["󰍹"]='wdisplays'
LABELS["󰍹"]='Display Setup'
COMMANDS[""]='nwg-look'
LABELS[""]='Appearance Settings'
COMMANDS["󱘆"]='noisetorch'
LABELS["󱘆"]='Audio Noise Reduction'
COMMANDS["󰋋"]='$HOME/.local/share/headset-charge-indicator/headset-charge-indicator.py &'
LABELS["󰋋"]='Headset Control'
COMMANDS[""]='moonarch-bluetooth'
LABELS[""]='Bluetooth Control'
COMMANDS["󰛳"]='nm-applet --indicator &'
LABELS["󰛳"]='Networker Manager'
COMMANDS["󰴱"]='wl-color-picker'
LABELS["󰴱"]='Color Picker'
COMMANDS["󰚞"]='font-manager'
LABELS["󰚞"]='Font Manager'
COMMANDS["󱨑"]='gufw'
LABELS["󱨑"]='Firewall Settings'
COMMANDS[""]='env GTK_THEME=Adwaita:dark resources'
LABELS[""]='System Resources'
COMMANDS["󰓅"]='moonarch-cpugov'
LABELS["󰓅"]='CPU Modes'
COMMANDS["󰓅"]='hardinfo'
LABELS["󰓅"]='System Profiler and Benchmark'
COMMANDS["󰀠"]='alarm-clock-applet'
LABELS["󰀠"]='Alarm & Timer'
COMMANDS["󱓞"]='moonarch-launcher'
LABELS["󱓞"]='App Launcher'
################################################################################
# do not edit below
################################################################################
##
# Generate menu
##
function print_menu()
{
for key in ${!LABELS[@]}
do
# echo "$key ${LABELS}"
echo "$key ${LABELS[$key]}"
# my top version just shows the first field in labels row, not two words side by side
done
}
##
# Show rofi.
##
function start()
{
# print_menu | rofi -dmenu -p "?=>"
title="MoonArch \ $USER \ $(date +"%H:%M") \ $(uptime -p | sed 's/up //')"
print_menu | sort | rofi -theme /etc/xdg/rofi/settings-menu/settings-menu.rasi -show $title -dmenu -markup-rows -mesg "󰣇 $title" -i -p "rofi-bangs: "
}
# Run it
value="$(start)"
# Split input.
# grab upto first space.
choice=${value%%\ *}
# graph remainder, minus space.
input=${value:$((${#choice}+1))}
##
# Cancelled? bail out
##
if test -z ${choice}
then
exit
fi
# check if choice exists
if test ${COMMANDS[$choice]+isset}
then
# Execute the choice
${COMMANDS[$choice]}
else
echo "Unknown command: ${choice}" | rofi -dmenu -p "error"
fi

View File

@ -0,0 +1,16 @@
#!/usr/bin/bash
# ABOUTME: Rofi-based PulseAudio sink switcher using ponymix.
# ABOUTME: Changes the default sink and moves all active streams to it.
# choose pulseaudio sink via rofi or dmenu
# changes default sink and moves all streams to that sink
#https://gist.github.com/Nervengift/844a597104631c36513c?permalink_comment_id=1826282
sink=$(ponymix -t sink list|awk '/^sink/ {s=$1" "$2;getline;gsub(/^ +/,"",$0);print s" "$0}'|rofi -dmenu -theme '/etc/xdg/rofi/volume/volume.rasi' -mesg '󱡫 Sink Switcher' -p 'pulseaudio sink:' -location 6 -width 100|grep -Po '[0-9]+(?=:)') &&
ponymix set-default -d $sink &&
for input in $(ponymix list -t sink-input|grep -Po '[0-9]+(?=:)');do
echo "$input -> $sink"
ponymix -t sink-input -d $input move $sink
done

142
defaults/bin/moonarch-ssh Executable file
View File

@ -0,0 +1,142 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-based tool launcher with SSH and system utility shortcuts.
# ABOUTME: Provides a searchable menu of tools including VPN, sound, bluetooth, etc.
declare -A LABELS
declare -A COMMANDS
###
# List of defined 'bangs'
# launch programs
# COMMANDS["apps"]="rofi -combi-modi window,drun -show combi"
# LABELS["apps"]=""
# open bookmarks
# COMMANDS["bookmarks"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-bookmarks.sh"
# LABELS["bookmarks"]=""
# search local files
COMMANDS[""]="moonarch-locate"
LABELS[""]="Locate"
# open custom web searches
# COMMANDS["websearch"]="~/.scripts/rofi-scripts-collection/rofi-surfraw-websearch.sh"
# LABELS["websearch"]=""
# show clipboard history
# source: https://bitbucket.org/pandozer/rofi-clipboard-manager/overview
# COMMANDS["clipboard"]='rofi -modi "clipboard:~/.bin/rofi-clipboard-manager/mclip.py menu" -show clipboard && ~/.bin/rofi-clipboard-manager/mclip.py paste'
# LABELS["clipboard"]=""
# references --------------------------
# COMMANDS[";sr2"]="chromium 'wikipedia.org/search-redirect.php?search=\" \${input}\""
# LABELS[";sr2"]=""
# COMMANDS[";piratebay"]="chromium --disk-cache-dir=/tmp/cache http://thepiratebay.org/search/\" \${input}\""
# LABELS[";piratebay"]=""
# COMMANDS[".bin"]="spacefm -r '/home/dka/bin'"
# LABELS[".bin"]=".bin"
# COMMANDS["#screenshot"]='/home/dka/bin/screenshot-scripts/myscreenshot.sh'
# LABELS["#screenshot"]="screenshot"
# greenclip clipboard history
# source: https://github.com/erebe/greenclip
COMMANDS[""]='rofi -modi "clipboard:greenclip print" -show Clipboard'
LABELS[""]="Clipboard"
COMMANDS["󰖂"]='moonarch-vpn'
LABELS["󰖂"]='VPN Connection Manager'
COMMANDS["󰗅"]='moonarch-volume'
LABELS["󰗅"]='Sound Manager'
#COMMANDS[""]='shortcuts module was removed'
#LABELS[""]='Hotkey List'
COMMANDS[""]='wlogout'
LABELS[""]='Session Menu'
COMMANDS["󰍹"]='wdisplays'
LABELS["󰍹"]='Display Setup'
COMMANDS[""]='nwg-look'
LABELS[""]='Appearance Settings'
COMMANDS["󱘆"]='noisetorch'
LABELS["󱘆"]='Audio Noise Reduction'
COMMANDS["󰋋"]='$HOME/.local/share/headset-charge-indicator/headset-charge-indicator.py &'
LABELS["󰋋"]='Headset Control'
COMMANDS[""]='moonarch-bluetooth'
LABELS[""]='Bluetooth Control'
COMMANDS["󰛳"]='nm-applet --indicator &'
LABELS["󰛳"]='Networker Manager'
COMMANDS["󰴱"]='wl-color-picker'
LABELS["󰴱"]='Color Picker'
COMMANDS["󰚞"]='font-manager'
LABELS["󰚞"]='Font Manager'
COMMANDS["󱨑"]='gufw'
LABELS["󱨑"]='Firewall Settings'
COMMANDS[""]='stacer'
LABELS[" "]='System Maintenance'
################################################################################
# do not edit below
################################################################################
##
# Generate menu
##
function print_menu()
{
for key in ${!LABELS[@]}
do
# echo "$key ${LABELS}"
echo "$key ${LABELS[$key]}"
# my top version just shows the first field in labels row, not two words side by side
done
}
##
# Show rofi.
##
function start()
{
# print_menu | rofi -dmenu -p "?=>"
print_menu | sort | rofi -show "Tools" -dmenu -mesg " Tools" -i -p "rofi-bangs: "
}
# Run it
value="$(start)"
# Split input.
# grab upto first space.
choice=${value%%\ *}
# graph remainder, minus space.
input=${value:$((${#choice}+1))}
##
# Cancelled? bail out
##
if test -z ${choice}
then
exit
fi
# check if choice exists
if test ${COMMANDS[$choice]+isset}
then
# Execute the choice
${COMMANDS[$choice]}
else
echo "Unknown command: ${choice}" | rofi -dmenu -p "error"
fi

122
defaults/bin/moonarch-volume Executable file
View File

@ -0,0 +1,122 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-based volume control applet for managing speakers and microphone.
# ABOUTME: Provides mute toggles, sink switching, mixer access, and NoiseTorch.
## Author : Aditya Shakya (adi1090x)
## Github : @adi1090x
#
## Applets : Volume
theme="/etc/xdg/rofi/volume/volume.rasi"
# Volume Info
mixer="`amixer info Master | grep 'Mixer name' | cut -d':' -f2 | tr -d \',' '`"
speaker="`amixer get Master | tail -n1 | awk -F ' ' '{print $5}' | tr -d '[]'`"
mic="`amixer get Capture | tail -n1 | awk -F ' ' '{print $5}' | tr -d '[]'`"
active=""
urgent=""
# Speaker Info
amixer get Master | grep '\[on\]' &>/dev/null
if [[ "$?" == 0 ]]; then
active="-a 1"
stext='Mute Speaker'
sicon='󰓃'
else
urgent="-u 1"
stext='Unmute Speaker'
sicon='󰓄'
fi
# Microphone Info
amixer get Capture | grep '\[on\]' &>/dev/null
if [[ "$?" == 0 ]]; then
[ -n "$active" ] && active+=",3" || active="-a 3"
mtext='Mute Mic'
micon=''
else
[ -n "$urgent" ] && urgent+=",3" || urgent="-u 3"
mtext='Unmute Mic'
micon=''
fi
currentsink=$(ponymix defaults|awk '/^sink/ {s=$1" "$2;getline;gsub(/^ +/,"",$0);print s" "$0}' | cut -d':' -f2)
currentsource=$(ponymix defaults|awk '/^source/ {s=$1" "$2;getline;gsub(/^ +/,"",$0);print s" "$0}' | cut -d':' -f2)
# Theme Elements
prompt="Speaker: $sicon Mic: $micon "
mesg="$mixer Speaker: $speaker Mic: $mic"
list_col='6'
list_row='3'
win_width='670px'
# Options
option_1="$micon $mtext $currentsource"
option_2="$sicon $stext $currentsink"
option_3="󱡫 Sink Switcher"
option_4=""
option_5=" Mixer"
option_6="󰍯 Noise Torch"
# Rofi CMD
#-theme-str "listview {columns: $list_col; lines: $list_row;}" \
rofi_cmd() {
rofi -theme-str "window {width: $win_width;}" \
-dmenu \
-p "$prompt" \
-mesg "$mesg" \
${active} ${urgent} \
-markup-rows \
-theme ${theme}
}
# Pass variables to rofi dmenu
run_rofi() {
echo -e "$option_1\n$option_2\n$option_3\n$option_4\n$option_5\n$option_6" | rofi_cmd
}
# Execute Command
run_cmd() {
if [[ "$1" == '--opt3' ]]; then
#amixer -Mq set Master,0 5%+ unmute
moonarch-sink-switcher
elif [[ "$1" == '--opt2' ]]; then
amixer set Master toggle
elif [[ "$1" == '--opt4' ]]; then
amixer -Mq set Master,0 5%- unmute
elif [[ "$1" == '--opt1' ]]; then
amixer set Capture toggle
elif [[ "$1" == '--opt5' ]]; then
pavucontrol
elif [[ "$1" == '--opt6' ]]; then
noisetorch
fi
}
# Actions
chosen="$(run_rofi)"
case ${chosen} in
$option_1)
run_cmd --opt1
;;
$option_2)
run_cmd --opt2
;;
$option_3)
run_cmd --opt3
;;
$option_4)
run_cmd --opt4
;;
$option_5)
run_cmd --opt5
;;
$option_6)
run_cmd --opt6
;;
esac

101
defaults/bin/moonarch-vpn Executable file
View File

@ -0,0 +1,101 @@
#!/usr/bin/env bash
# ABOUTME: Rofi-based VPN connection manager using NetworkManager (nmcli).
# ABOUTME: Lists VPN connections and toggles them on/off.
# Copyright (C) 2021 Damien Cassou
# Author: Damien Cassou <damien@cassou.me>
# Url: https://gitlab.com/DamienCassou/rofi-vpn
# Version: 0.2.0
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# Commentary:
# This program uses rofi and nmcli to let the user enable/disable VPN
# connections.
# Code:
# What to show in front of an active VPN connection:
ACTIVE_PREFIX="󰌘 "
# What to show in front of an inactive VPN connection:
INACTIVE_PREFIX="󰌙 "
# Display on standard output all VPN connections, one per line. An
# active VPN connection is prefixed with `ACTIVE_PREFIX` and an inactive
# one is prefixed with `INACTIVE_PREFIX`.
function list_vpn_connections() {
nmcli --get-values ACTIVE,NAME,TYPE connection show \
| grep ':vpn$' \
| sed \
-e "s/^no:/${INACTIVE_PREFIX}/" \
-e "s/^yes:/${ACTIVE_PREFIX}/" \
-e 's/:vpn$//'
}
# Take a line as displayed by `list_vpn_connections()` as argument and
# use nmcli to toggle the corresponding connection.
function toggle_vpn_connection() {
local result="$1"
local connection
connection=$(extract_connection_name_from_result "${result}")
if [[ $result = ${ACTIVE_PREFIX}* ]]; then
feedback=$(nmcli connection down "$connection")
notify-send "VPN Status '$connection'" "$feedback"
else
foot -a="vpn-prompt" -T="VPN Connection" nmcli connection --ask up "$connection"
#feedback=$(nmcli connection up "$connection")
notify-send "VPN Status '$connection'" "Trying to connect"
fi
}
# Take a line as displayed by `list_vpn_connections()` as argument and
# remove `ACTIVE_PREFIX` or `INACTIVE_PREFIX` to only display the
# connection name.
function extract_connection_name_from_result() {
local result="$1"
# I don't know how to use plain bash to remove the prefix so I'm
# using sed:
# shellcheck disable=SC2001
sed -e 's/^.* \([^ ]\+\)$/\1/' <<< "$result"
}
# Execute the `rofi` command. The first argument of the function is
# used as lines to select from.
function start_rofi() {
local content="$1"
echo -e "$content" | rofi -dmenu -theme /etc/xdg/rofi/nm-vpn/nm-vpn.rasi -mesg "󰖂 VPN Connection Manager" -icon "󰖂"
}
# List the VPN connections and let the user toggle one using rofi.
function main() {
local connections
local result
connections=$(list_vpn_connections)
result=$(start_rofi "$connections")
if [ -n "$result" ]; then
toggle_vpn_connection "$result"
else
exit 1
fi
}
main

View File

@ -0,0 +1,48 @@
#!/usr/bin/bash
# ABOUTME: Waybar-Modul das den CPU-Governor als JSON ausgibt.
# ABOUTME: Wird von der Waybar custom/cpugov Config referenziert.
while :
do
CPU_GOV=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)
case $CPU_GOV in
performance)
CPU_GOV_SHORT=󰓅
;;
balanced)
CPU_GOV_SHORT=󰾅
;;
powersave)
CPU_GOV_SHORT=󰌪
;;
userspace)
CPU_GOV_SHORT=uspace
;;
ondemand)
CPU_GOV_SHORT=ondmnd
;;
conservative)
CPU_GOV_SHORT=cons
;;
schedutil)
CPU_GOV_SHORT=sutil
;;
*)
CPU_GOV_SHORT="?"
;;
esac
CPU_GOV_FULL="${CPU_GOV^}"
s="text|alt|tooltip|class
$CPU_GOV_SHORT|$CPU_GOV_FULL|CPU Mode: $CPU_GOV_FULL|cpugov"
jq --unbuffered --compact-output -Rn '
( input | split("|") ) as $keys |
( inputs | split("|") ) as $vals |
[[$keys, $vals] | transpose[] | {key:.[0],value:.[1]}] | from_entries
' <<<"$s"
sleep 5
done

View File

@ -0,0 +1,38 @@
#!/usr/bin/bash
# ABOUTME: Waybar-Modul das die GPU-Auslastung als JSON ausgibt.
# ABOUTME: Wird von der Waybar custom/gpu-usage Config referenziert.
while :
do
GPU_STAT=$(cat /sys/class/hwmon/hwmon5/device/gpu_busy_percent 2>/dev/null || echo "0")
ICON="<span color='#69ff94' size='8pt' rise='1.5pt'>▁</span>"
if [ "$GPU_STAT" -lt 10 ]; then
ICON="<span color='#69ff94' size='8pt' rise='1.5pt'>▁</span>"
elif [ "$GPU_STAT" -lt 20 ]; then
ICON="<span color='#2aa9ff' size='8pt' rise='1.5pt'>▂</span>"
elif [ "$GPU_STAT" -lt 40 ]; then
ICON="<span color='#f8f8f2' size='8pt' rise='1.5pt'>▃</span>"
elif [ "$GPU_STAT" -lt 50 ]; then
ICON="<span color='#f8f8f2' size='8pt' rise='1.5pt'>▄</span>"
elif [ "$GPU_STAT" -lt 60 ]; then
ICON="<span color='#ffffa5' size='8pt' rise='1.5pt'>▅</span>"
elif [ "$GPU_STAT" -lt 70 ]; then
ICON="<span color='#ffffa5' size='8pt' rise='1.5pt'>▆</span>"
elif [ "$GPU_STAT" -lt 80 ]; then
ICON="<span color='#ff9977' size='8pt' rise='1.5pt'>▇</span>"
elif [ "$GPU_STAT" -lt 100 ]; then
ICON="<span color='#dd532e' size='8pt' rise='1.5pt'>█</span>"
fi
s="text|alt|tooltip|class|percentage
GPU $ICON|GPU $ICON $GPU_STAT%|GPU $ICON $GPU_STAT%|gpustat|$GPU_STAT"
jq --unbuffered --compact-output -Rn '
( input | split("|") ) as $keys |
( inputs | split("|") ) as $vals |
[[$keys, $vals] | transpose[] | {key:.[0],value:.[1]}] | from_entries
' <<<"$s"
sleep 5
done

View File

@ -0,0 +1,9 @@
# ABOUTME: greetd-Konfiguration fuer Moonarch.
# ABOUTME: Startet regreet unter niri als Wayland-Compositor.
[terminal]
vt = 1
[default_session]
command = "niri -c /etc/greetd/niri-greeter.kdl"
user = "greeter"

View File

@ -0,0 +1,58 @@
// ABOUTME: Minimale Niri-Konfiguration fuer den regreet Login-Greeter.
// ABOUTME: Wird von greetd gestartet statt cage, um Multi-Monitor korrekt zu handhaben.
input {
keyboard {
xkb {
layout "de"
}
numlock
}
touchpad {
tap
natural-scroll
}
mouse {
accel-profile "flat"
}
}
cursor {
xcursor-theme "Sweet-cursors"
}
layout {
gaps 0
focus-ring {
off
}
border {
off
}
}
// regreet starten und niri beenden, sobald regreet sich schliesst
spawn-at-startup "sh" "-c" "regreet; niri msg action quit --skip-confirmation"
// Greeter-Fenster maximiert darstellen
window-rule {
open-maximized true
}
hotkey-overlay {
skip-at-startup
}
prefer-no-csd
animations {
off
}
binds {
// Keine Keybinds noetig fuer den Greeter
}

View File

@ -0,0 +1,40 @@
/* ABOUTME: Catppuccin Mocha CSS-Overrides fuer regreet. */
/* ABOUTME: Ergaenzt das GTK-Theme mit greeter-spezifischem Styling. */
window {
background-color: #1e1e2e;
}
entry {
border-radius: 8px;
padding: 8px 12px;
border: 1px solid #45475a;
background-color: #313244;
color: #cdd6f4;
}
entry:focus {
border-color: #b4befe;
}
button {
border-radius: 8px;
padding: 8px 16px;
background-color: #313244;
color: #cdd6f4;
border: 1px solid #45475a;
}
button:hover {
background-color: #45475a;
}
button.suggested-action {
background-color: #b4befe;
color: #1e1e2e;
border: none;
}
button.suggested-action:hover {
background-color: #89b4fa;
}

View File

@ -0,0 +1,17 @@
# ABOUTME: regreet-Konfiguration fuer Moonarch.
# ABOUTME: Definiert Aussehen und Verhalten des Login-Greeters.
[background]
path = "/usr/share/backgrounds/moonarch-greeter.jpg"
fit = "Cover"
[GTK]
application_prefer_dark_theme = true
cursor_theme_name = "Sweet-cursors"
font_name = "Hack Nerd Font 12"
icon_theme_name = "Newaita-reborn-gray-dark"
theme_name = "catppuccin-mocha-lavender-standard+default"
[commands]
reboot = ["systemctl", "reboot"]
poweroff = ["systemctl", "poweroff"]

130
defaults/shell/zshrc Normal file
View File

@ -0,0 +1,130 @@
# ABOUTME: Moonarch default zsh configuration with Catppuccin-themed prompt.
# ABOUTME: Sources user overrides from ~/.zshrc.d/ and ~/.zshrc.local
# --- History ---
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt autocd nomatch notify appendhistory sharehistory hist_ignore_space hist_ignore_all_dups hist_save_no_dups hist_find_no_dups
unsetopt beep extendedglob
bindkey -e
# --- Completion ---
zstyle :compinstall filename "$HOME/.zshrc"
autoload -Uz compinit
compinit
# --- Window title ---
autoload -Uz add-zsh-hook
_precmd_title() {
print -Pn "\e]0;%~\a"
}
_preexec_title() {
print -Pn "\e]0;$2\a"
}
add-zsh-hook precmd _precmd_title
add-zsh-hook preexec _preexec_title
# --- Prompt (Catppuccin Mocha) ---
parse_git_branch() {
local branch=""
branch=$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
local git_status=$(git status --porcelain 2>/dev/null)
local color=green
if echo "$git_status" | grep -q "^ M"; then
color=yellow
branch="${branch}*"
fi
if echo "$git_status" | grep -qE "^ A|^\?\?"; then
color=yellow
branch="${branch}+"
fi
if echo "$git_status" | grep -q "^ D"; then
color=yellow
branch="${branch}-"
fi
if [[ -n "$branch" ]]; then
branch=[%F{${color}}${branch}%F{reset}]
fi
echo " $branch"
}
precmd() {
print ""
print -rP "%F{#b4befe}%B%n@%M%b %2~%F{#f5e0dc}$(parse_git_branch)%f"
}
PROMPT="%B%F{#b4befe}$%f%b "
RPROMPT="%F{241}%B%T%b%f"
# --- PATH ---
if [ -d "$HOME/.local/bin" ]; then
PATH="$HOME/.local/bin:$PATH"
fi
# --- Key bindings ---
bindkey "^[[3~" delete-char
bindkey "^[[H" beginning-of-line
bindkey "^[[F" end-of-line
bindkey "^[[1;5C" forward-word
bindkey "^[[1;5D" backward-word
# --- Aliases ---
alias ssh="TERM=xterm-256color ssh"
alias orphans='[[ -n $(pacman -Qdt) ]] && sudo pacman -Rs $(pacman -Qdtq) || echo "no orphans to remove"'
alias ls='eza --icons --color=always --group-directories-first'
alias ll='eza -lF --icons --color=always --group-directories-first'
alias la='eza -a --icons --color=always --group-directories-first'
alias l='eza -F --icons --color=always --group-directories-first'
alias vim='nvim'
alias uninstall='sudo pacman -Rsn'
# --- FZF ---
if command -v fzf &>/dev/null; then
eval "$(fzf --zsh)"
export FZF_DEFAULT_COMMAND="fd --hidden --strip-cwd-prefix --exclude .git"
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND="fd --type=d --hidden --strip-cwd-prefix --exclude .git"
export FZF_DEFAULT_OPTS="--height 50% --layout=default --border --color=hl:#2dd4bf"
export FZF_CTRL_T_OPTS="--preview 'bat --color=always -n --line-range :500 {}'"
export FZF_ALT_C_OPTS="--preview 'eza --tree --color=always {} | head -200'"
fi
# --- Plugins (oh-my-zsh) ---
if [[ -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" ]]; then
source "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
fi
if [[ -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]]; then
source "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh"
ZSH_AUTOSUGGEST_STRATEGY=(history completion)
fi
# --- Wayland environment ---
export TERMINAL="footclient"
export GDK_BACKEND="wayland,x11,*"
export QT_QPA_PLATFORM="wayland;xcb"
export QT_QPA_PLATFORMTHEME="qt6ct"
export QT_AUTO_SCREEN_SCALE_FACTOR="1"
export QT_WAYLAND_DISABLE_WINDOWDECORATION="1"
export SDL_VIDEODRIVER="wayland"
export CLUTTER_BACKEND="wayland"
export XDG_CURRENT_DESKTOP="niri"
export XDG_SESSION_DESKTOP="niri"
export XDG_SESSION_TYPE="wayland"
export EDITOR="nvim"
export SUDO_EDITOR="nvim"
export MOZ_ENABLE_WAYLAND="1"
# --- User override scripts ---
# Drop custom config snippets into ~/.zshrc.d/*.zsh
if [[ -d "$HOME/.zshrc.d" ]]; then
for f in "$HOME/.zshrc.d"/*.zsh(N); do
source "$f"
done
fi
# Single-file user override (for simple additions)
[[ -f "$HOME/.zshrc.local" ]] && source "$HOME/.zshrc.local"

460
defaults/xdg/dunst/dunstrc Normal file
View File

@ -0,0 +1,460 @@
# ABOUTME: Moonarch default dunst notification daemon config with Catppuccin Mocha colors.
# ABOUTME: User overrides go in ~/.config/dunst/dunstrc
# See dunst(5) for all configuration options
[global]
### Display ###
enable_posix_regex = true
# Which monitor should the notifications be displayed on.
monitor = 0
# Display notification on focused monitor. Possible modes are:
# mouse: follow mouse pointer
# keyboard: follow window with keyboard focus
# none: don't follow anything
#
# "keyboard" needs a window manager that exports the
# _NET_ACTIVE_WINDOW property.
# This should be the case for almost all modern window managers.
#
# If this option is set to mouse or keyboard, the monitor option
# will be ignored.
follow = mouse
### Geometry ###
# dynamic width from 0 to 300
# width = (0, 300)
# constant width of 300
width = 300
# The maximum height of a single notification, excluding the frame.
#height = 300
# Position the notification in the top right corner
origin = top-right
# Offset from the origin
offset = 15x15
# Scale factor. It is auto-detected if value is 0.
scale = 0
# Maximum number of notification (0 means no limit)
notification_limit = 10
### Progress bar ###
# Turn on the progess bar. It appears when a progress hint is passed with
# for example dunstify -h int:value:12
progress_bar = true
# Set the progress bar height. This includes the frame, so make sure
# it's at least twice as big as the frame width.
progress_bar_height = 8
# Set the frame width of the progress bar
progress_bar_frame_width = 1
# Set the minimum width for the progress bar
progress_bar_min_width = 150
# Set the maximum width for the progress bar
progress_bar_max_width = 300
highlight = "#b4befe"
# Show how many messages are currently hidden (because of
# notification_limit).
indicate_hidden = yes
# The transparency of the window. Range: [0; 100].
# This option will only work if a compositing window manager is
# present (e.g. xcompmgr, compiz, etc.). (X11 only)
transparency = 0
# Draw a line of "separator_height" pixel height between two
# notifications.
# Set to 0 to disable.
# If gap_size is greater than 0, this setting will be ignored.
separator_height = 2
# Padding between text and separator.
padding = 16
# Horizontal padding.
horizontal_padding = 16
# Padding between text and icon.
text_icon_padding = 0
# Defines width in pixels of frame around the notification window.
# Set to 0 to disable.
frame_width = 2
# Defines color of the frame around the notification window.
frame_color = "#b4befe"
# Size of gap to display between notifications - requires a compositor.
# If value is greater than 0, separator_height will be ignored and a border
# of size frame_width will be drawn around each notification instead.
# Click events on gaps do not currently propagate to applications below.
gap_size = 5
# Define a color for the separator.
# possible values are:
# * auto: dunst tries to find a color fitting to the background;
# * foreground: use the same color as the foreground;
# * frame: use the same color as the frame;
# * anything else will be interpreted as a X color.
separator_color = frame
# Sort messages by urgency.
sort = yes
# Don't remove messages, if the user is idle (no mouse or keyboard input)
# for longer than idle_threshold seconds.
# Set to 0 to disable.
# A client can set the 'transient' hint to bypass this. See the rules
# section for how to disable this if necessary
# idle_threshold = 120
### Text ###
font = JetBrainsMono Nerd Font 10
# The spacing between lines. If the height is smaller than the
# font height, it will get raised to the font height.
line_height = 0
# Possible values are:
# full: Allow a small subset of html markup in notifications:
# <b>bold</b>
# <i>italic</i>
# <s>strikethrough</s>
# <u>underline</u>
#
# For a complete reference see
# <https://docs.gtk.org/Pango/pango_markup.html>.
#
# strip: This setting is provided for compatibility with some broken
# clients that send markup even though it's not enabled on the
# server. Dunst will try to strip the markup but the parsing is
# simplistic so using this option outside of matching rules for
# specific applications *IS GREATLY DISCOURAGED*.
#
# no: Disable markup parsing, incoming notifications will be treated as
# plain text. Dunst will not advertise that it has the body-markup
# capability if this is set as a global setting.
#
# It's important to note that markup inside the format option will be parsed
# regardless of what this is set to.
markup = full
# The format of the message. Possible variables are:
# %a appname
# %s summary
# %b body
# %i iconname (including its path)
# %I iconname (without its path)
# %p progress value if set ([ 0%] to [100%]) or nothing
# %n progress value if set without any extra characters
# %% Literal %
# Markup is allowed
format = "<b>%s</b>\n%b"
# Alignment of message text.
# Possible values are "left", "center" and "right".
alignment = left
# Vertical alignment of message text and icon.
# Possible values are "top", "center" and "bottom".
vertical_alignment = center
# Show age of message if message is older than show_age_threshold
# seconds.
# Set to -1 to disable.
show_age_threshold = 60
# Specify where to make an ellipsis in long lines.
# Possible values are "start", "middle" and "end".
ellipsize = middle
# Ignore newlines '\n' in notifications.
ignore_newline = no
# Stack together notifications with the same content
stack_duplicates = true
# Hide the count of stacked notifications with the same content
hide_duplicate_count = false
# Display indicators for URLs (U) and actions (A).
show_indicators = yes
### Icons ###
# Recursive icon lookup. You can set a single theme, instead of having to
# define all lookup paths.
enable_recursive_icon_lookup = true
# Set icon theme (only used for recursive icon lookup)
icon_theme = "Tela-purple-dark"
# You can also set multiple icon themes, with the leftmost one being used first.
# icon_theme = "Adwaita, breeze"
# Align icons left/right/top/off
icon_position = left
# Scale small icons up to this size, set to 0 to disable. Helpful
# for e.g. small files or high-dpi screens. In case of conflict,
# max_icon_size takes precedence over this.
min_icon_size = 16
# Scale larger icons down to this size, set to 0 to disable
max_icon_size = 64
# Paths to default icons (only neccesary when not using recursive icon lookup)
#icon_path = /usr/share/icons/Tela-purple-dark/16x16/status/:/usr/share/icons/Tela-purple-dark/16x16/devices/
### History ###
# Should a notification popped up from history be sticky or timeout
# as if it would normally do.
sticky_history = yes
# Maximum amount of notifications kept in history
history_length = 20
### Misc/Advanced ###
# dmenu path.
dmenu = /usr/bin/dmenu -p dunst:
# Browser for opening urls in context menu.
browser = /usr/bin/xdg-open
# Always run rule-defined scripts, even if the notification is suppressed
always_run_script = true
# Define the title of the windows spawned by dunst
title = Dunst
# Define the class of the windows spawned by dunst
class = Dunst
# Define the corner radius of the notification window
# in pixel size. If the radius is 0, you have no rounded
# corners.
# The radius will be automatically lowered if it exceeds half of the
# notification height to avoid clipping text and/or icons.
corner_radius = 10
# Ignore the dbus closeNotification message.
# Useful to enforce the timeout set by dunst configuration. Without this
# parameter, an application may close the notification sent before the
# user defined timeout.
ignore_dbusclose = false
### Wayland ###
# These settings are Wayland-specific. They have no effect when using X11
# Uncomment this if you want to let notications appear under fullscreen
# applications (default: overlay)
layer = overlay
# Set this to true to use X11 output on Wayland.
force_xwayland = false
### Legacy
# Use the Xinerama extension instead of RandR for multi-monitor support.
# This setting is provided for compatibility with older nVidia drivers that
# do not support RandR and using it on systems that support RandR is highly
# discouraged.
#
# By enabling this setting dunst will not be able to detect when a monitor
# is connected or disconnected which might break follow mode if the screen
# layout changes.
force_xinerama = false
### mouse
# Defines list of actions for each mouse event
# Possible values are:
# * none: Don't do anything.
# * do_action: Invoke the action determined by the action_name rule. If there is no
# such action, open the context menu.
# * open_url: If the notification has exactly one url, open it. If there are multiple
# ones, open the context menu.
# * close_current: Close current notification.
# * close_all: Close all notifications.
# * context: Open context menu for the notification.
# * context_all: Open context menu for all notifications.
# These values can be strung together for each mouse event, and
# will be executed in sequence.
mouse_left_click = close_current
mouse_middle_click = do_action, close_current
mouse_right_click = close_all
# Experimental features that may or may not work correctly. Do not expect them
# to have a consistent behaviour across releases.
[experimental]
# Calculate the dpi to use on a per-monitor basis.
# If this setting is enabled the Xft.dpi value will be ignored and instead
# dunst will attempt to calculate an appropriate dpi value for each monitor
# using the resolution and physical size. This might be useful in setups
# where there are multiple screens with very different dpi values.
per_monitor_dpi = true
[urgency_low]
# IMPORTANT: colors have to be defined in quotation marks.
# Otherwise the "#" and following would be interpreted as a comment.
background = "#1e1e2e"
foreground = "#eff1f5"
timeout = 10
# Icon for notifications with low urgency, uncomment to enable
#default_icon = /path/to/icon
[urgency_normal]
background = "#1e1e2e"
foreground = "#eff1f5"
timeout = 10
# Icon for notifications with normal urgency, uncomment to enable
#default_icon = /path/to/icon
[urgency_critical]
background = "#313244"
foreground = "#CDD6F4"
frame_color = "#eba0ac"
timeout = 60
# Icon for notifications with critical urgency, uncomment to enable
#default_icon = /path/to/icon
# Every section that isn't one of the above is interpreted as a rules to
# override settings for certain messages.
#
# Messages can be matched by
# appname (discouraged, see desktop_entry)
# body
# category
# desktop_entry
# icon
# match_transient
# msg_urgency
# stack_tag
# summary
#
# and you can override the
# background
# foreground
# format
# frame_color
# fullscreen
# new_icon
# set_stack_tag
# set_transient
# set_category
# timeout
# urgency
# icon_position
# skip_display
# history_ignore
# action_name
# word_wrap
# ellipsize
# alignment
# hide_text
#
# Shell-like globbing will get expanded.
#
# Instead of the appname filter, it's recommended to use the desktop_entry filter.
# GLib based applications export their desktop-entry name. In comparison to the appname,
# the desktop-entry won't get localized.
#
# SCRIPTING
# You can specify a script that gets run when the rule matches by
# setting the "script" option.
# The script will be called as follows:
# script appname summary body icon urgency
# where urgency can be "LOW", "NORMAL" or "CRITICAL".
#
# NOTE: It might be helpful to run dunst -print in a terminal in order
# to find fitting options for rules.
# Disable the transient hint so that idle_threshold cannot be bypassed from the
# client
#[transient_disable]
# match_transient = yes
# set_transient = no
#
# Make the handling of transient notifications more strict by making them not
# be placed in history.
#[transient_history_ignore]
# match_transient = yes
# history_ignore = yes
# fullscreen values
# show: show the notifications, regardless if there is a fullscreen window opened
# delay: displays the new notification, if there is no fullscreen window active
# If the notification is already drawn, it won't get undrawn.
# pushback: same as delay, but when switching into fullscreen, the notification will get
# withdrawn from screen again and will get delayed like a new notification
#[fullscreen_delay_everything]
# fullscreen = delay
[fullscreen_show_critical]
msg_urgency = critical
fullscreen = pushback
#[espeak]
# summary = "*"
# script = dunst_espeak.sh
#[script-test]
# summary = "*script*"
# script = dunst_test.sh
#[ignore]
# # This notification will not be displayed
# summary = "foobar"
# skip_display = true
#[history-ignore]
# # This notification will not be saved in history
# summary = "foobar"
# history_ignore = yes
#[skip-display]
# # This notification will not be displayed, but will be included in the history
# summary = "foobar"
# skip_display = yes
#[signed_on]
# appname = Pidgin
# summary = "*signed on*"
# urgency = low
#
#[signed_off]
# appname = Pidgin
# summary = *signed off*
# urgency = low
#
#[says]
# appname = Pidgin
# summary = *says*
# urgency = critical
#
#[twitter]
# appname = Pidgin
# summary = *twitter.com*
# urgency = normal
#
#[stack-volumes]
# appname = "some_volume_notifiers"
# set_stack_tag = "volume"
#
# vim: ft=cfg

View File

@ -0,0 +1,136 @@
// Load with --load-config examples/2.jsonc
// Note that you must replace the image path to an existing image to display it.
{
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
"logo": {
"type": "none"
},
"display": {
"separator": " -> ",
"constants": [
"──────────────────────────────"
],
"key": {
"paddingLeft": 2
}
},
"modules": [
{
"type": "custom",
"format": "┌{$1}{$1}┐",
"outputColor": "90"
},
{
"type": "title",
"keyWidth": 10
},
{
"type": "custom",
"format": "└{$1}{$1}┘",
"outputColor": "90"
},
{
"type": "custom",
"format": " {#90} {#31} {#32} {#33} {#34} {#35} {#36} {#37} {#38} {#39}  {#38} {#37} {#36} {#35} {#34} {#33} {#32} {#31} {#90}"
},
{
"type": "custom",
"format": "┌{$1}{$1}┐",
"outputColor": "90"
},
{
"type": "os",
"key": "{icon} OS",
"keyColor": "yellow"
},
{
"type": "kernel",
"key": "│ ├",
"keyColor": "yellow"
},
{
"type": "packages",
"key": "│ ├󰏖",
"keyColor": "yellow"
},
{
"type": "shell",
"key": "│ └",
"keyColor": "yellow"
},
{
"type": "wm",
"key": " DE/WM",
"keyColor": "blue"
},
{
"type": "wmtheme",
"key": "│ ├󰉼",
"keyColor": "blue"
},
{
"type": "terminal",
"key": "│ ├",
"keyColor": "blue"
},
{
"type": "wallpaper",
"key": "│ └󰸉",
"keyColor": "blue"
},
{
"type": "host",
"key": "󰌢 PC",
"keyColor": "green"
},
{
"type": "cpu",
"key": "│ ├󰻠",
"keyColor": "magenta"
},
{
"type": "gpu",
"key": "│ ├󰍛",
"keyColor": "magenta"
},
{
"type": "disk",
"key": "│ ├",
"keyColor": "green"
},
{
"type": "memory",
"key": "│ ├󰑭",
"keyColor": "green"
},
{
"type": "uptime",
"key": "│ ├󰅐",
"keyColor": "green"
},
{
"type": "sound",
"key": " SND",
"keyColor": "cyan"
},
{
"type": "player",
"key": "│ ├󰥠",
"keyColor": "cyan"
},
{
"type": "media",
"key": "│ └󰝚",
"keyColor": "cyan"
},
{
"type": "custom",
"format": "└{$1}{$1}┘",
"outputColor": "90"
}
]
}

260
defaults/xdg/foot/foot.ini Normal file
View File

@ -0,0 +1,260 @@
# ABOUTME: Moonarch default foot terminal configuration with Catppuccin Mocha colors.
# ABOUTME: User overrides go in ~/.config/foot/foot.ini
# -*- conf -*-
# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
# term=foot (or xterm-256color if built with -Dterminfo=disabled)
# login-shell=no
# app-id=foot # globally set wayland app-id. Default values are "foot" and "footclient" for desktop and server mode
# title=foot
# locked-title=no
font=Hack Nerd Font:size=11
# font-bold=<bold variant of regular font>
# font-italic=<italic variant of regular font>
# font-bold-italic=<bold+italic variant of regular font>
# font-size-adjustment=0.5
# line-height=<font metrics>
# letter-spacing=0
# horizontal-letter-offset=0
# vertical-letter-offset=0
# underline-offset=<font metrics>
# underline-thickness=<font underline thickness>
# strikeout-thickness=<font strikeout thickness>
# box-drawings-uses-font-glyphs=no
# dpi-aware=no
# gamma-correct-blending=no
# initial-color-theme=1
# initial-window-size-pixels=700x500 # Or,
# initial-window-size-chars=<COLSxROWS>
# initial-window-mode=windowed
# pad=0x0 center-when-maximized-and-fullscreen
# resize-by-cells=yes
# resize-keep-grid=yes
# resize-delay-ms=100
# bold-text-in-bright=no
# word-delimiters=,│`|:"'()[]{}<>
# selection-target=primary
# workers=<number of logical CPUs>
# utmp-helper=/usr/lib/utempter/utempter # When utmp backend is 'libutempter' (Linux)
# utmp-helper=/usr/libexec/ulog-helper # When utmp backend is 'ulog' (FreeBSD)
# uppercase-regex-insert=yes
[environment]
# name=value
[security]
# osc52=enabled # disabled|copy-enabled|paste-enabled|enabled
[bell]
# system=yes
# urgent=no
# notify=no
# visual=no
# command=
# command-focused=no
[desktop-notifications]
# command=notify-send --wait --app-name ${app-id} --icon ${app-id} --category ${category} --urgency ${urgency} --expire-time ${expire-time} --hint STRING:image-path:${icon} --hint BOOLEAN:suppress-sound:${muted} --hint STRING:sound-name:${sound-name} --replace-id ${replace-id} ${action-argument} --print-id -- ${title} ${body}
# command-action-argument=--action ${action-name}=${action-label}
# close=""
# inhibit-when-focused=yes
[scrollback]
# lines=1000
# multiplier=3.0
# indicator-position=relative
# indicator-format=""
[url]
# launch=xdg-open ${url}
# label-letters=sadfjklewcmpgh
# osc8-underline=url-mode
# regex=(((https?://|mailto:|ftp://|file:|ssh:|ssh://|git://|tel:|magnet:|ipfs://|ipns://|gemini://|gopher://|news:)|www\.)([0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]+|\([]\["0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\)|\[[\(\)"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\]|"[]\[\(\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*"|'[]\[\(\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]*')+([0-9a-zA-Z/#@$&*+=~_%^\-]|\([]\["0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\)|\[[\(\)"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*\]|"[]\[\(\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\-]*"|'[]\[\(\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\-]*'))
# You can define your own regex's, by adding a section called
# 'regex:<ID>' with a 'regex' and 'launch' key. These can then be tied
# to a key-binding. See foot.ini(5) for details
# [regex:your-fancy-name]
# regex=<a POSIX-Extended Regular Expression>
# launch=<path to script or application> ${match}
#
# [key-bindings]
# regex-launch=[your-fancy-name] Control+Shift+q
# regex-copy=[your-fancy-name] Control+Alt+Shift+q
[cursor]
# style=block
# blink=no
# blink-rate=500
# beam-thickness=1.5
# underline-thickness=<font underline thickness>
[mouse]
# hide-when-typing=no
# alternate-scroll-mode=yes
[touch]
# long-press-delay=400
[colors-dark]
alpha=0.9
# alpha-mode=default # Can be `default`, `matching` or `all`
cursor=11111b f5e0dc
foreground=cdd6f4
background=1e1e2e
regular0=45475a
regular1=f38ba8
regular2=a6e3a1
regular3=f9e2af
regular4=89b4fa
regular5=f5c2e7
regular6=94e2d5
regular7=bac2de
bright0=585b70
bright1=f38ba8
bright2=a6e3a1
bright3=f9e2af
bright4=89b4fa
bright5=f5c2e7
bright6=94e2d5
bright7=a6adc8
16=fab387
17=f5e0dc
selection-foreground=cdd6f4
selection-background=414356
search-box-no-match=11111b f38ba8
search-box-match=cdd6f4 313244
jump-labels=11111b fab387
urls=89b4fa
[colors2]
# Alternative color theme, see man page foot.ini(5)
# Same builtin defaults as [color], except for:
# dim-blend-towards=white
[csd]
# preferred=server
# size=26
# font=<primary font>
# color=<foreground color>
# hide-when-maximized=no
# double-click-to-maximize=yes
# border-width=0
# border-color=<csd.color>
# button-width=26
# button-color=<background color>
# button-minimize-color=<regular4>
# button-maximize-color=<regular2>
# button-close-color=<regular1>
[key-bindings]
# scrollback-up-page=Shift+Page_Up Shift+KP_Page_Up
# scrollback-up-half-page=none
# scrollback-up-line=none
# scrollback-down-page=Shift+Page_Down Shift+KP_Page_Down
# scrollback-down-half-page=none
# scrollback-down-line=none
# scrollback-home=none
# scrollback-end=none
# clipboard-copy=Control+Shift+c XF86Copy
# clipboard-paste=Control+Shift+v XF86Paste
# primary-paste=Shift+Insert
# search-start=Control+Shift+r
# font-increase=Control+plus Control+equal Control+KP_Add
# font-decrease=Control+minus Control+KP_Subtract
# font-reset=Control+0 Control+KP_0
# spawn-terminal=Control+Shift+n
# minimize=none
# maximize=none
# fullscreen=none
# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none
# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none
# pipe-selected=[xargs -r firefox] none
# pipe-command-output=[wl-copy] none # Copy last command's output to the clipboard
# show-urls-launch=Control+Shift+o
# show-urls-copy=none
# show-urls-persistent=none
# prompt-prev=Control+Shift+z
# prompt-next=Control+Shift+x
# unicode-input=Control+Shift+u
# color-theme-switch-1=none
# color-theme-switch-2=none
# color-theme-toggle=none
# noop=none
# quit=none
[search-bindings]
# cancel=Control+g Control+c Escape
# commit=Return KP_Enter
# find-prev=Control+r
# find-next=Control+s
# cursor-left=Left Control+b
# cursor-left-word=Control+Left Mod1+b
# cursor-right=Right Control+f
# cursor-right-word=Control+Right Mod1+f
# cursor-home=Home Control+a
# cursor-end=End Control+e
# delete-prev=BackSpace
# delete-prev-word=Mod1+BackSpace Control+BackSpace
# delete-next=Delete
# delete-next-word=Mod1+d Control+Delete
# delete-to-start=Control+u
# delete-to-end=Control+k
# extend-char=Shift+Right
# extend-to-word-boundary=Control+w Control+Shift+Right
# extend-to-next-whitespace=Control+Shift+w
# extend-line-down=Shift+Down
# extend-backward-char=Shift+Left
# extend-backward-to-word-boundary=Control+Shift+Left
# extend-backward-to-next-whitespace=none
# extend-line-up=Shift+Up
# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste
# primary-paste=Shift+Insert
# unicode-input=none
# scrollback-up-page=Shift+Page_Up Shift+KP_Page_Up
# scrollback-up-half-page=none
# scrollback-up-line=none
# scrollback-down-page=Shift+Page_Down Shift+KP_Page_Down
# scrollback-down-half-page=none
# scrollback-down-line=none
# scrollback-home=none
# scrollback-end=none
[url-bindings]
# cancel=Control+g Control+c Control+d Escape
# toggle-url-visible=t
[text-bindings]
# \x03=Mod4+c # Map Super+c -> Ctrl+c
\x1b\x5b\x31\x33\x3b\x32\x75=Shift+Return
[mouse-bindings]
# scrollback-up-mouse=BTN_WHEEL_BACK
# scrollback-down-mouse=BTN_WHEEL_FORWARD
# font-increase=Control+BTN_WHEEL_BACK
# font-decrease=Control+BTN_WHEEL_FORWARD
# selection-override-modifiers=Shift
# primary-paste=BTN_MIDDLE
# select-begin=BTN_LEFT
# select-begin-block=Control+BTN_LEFT
# select-extend=BTN_RIGHT
# select-extend-character-wise=Control+BTN_RIGHT
# select-word=BTN_LEFT-2
# select-word-whitespace=Control+BTN_LEFT-2
# select-quote = BTN_LEFT-3
# select-row=BTN_LEFT-4
# vim: ft=dosini

View File

@ -0,0 +1,20 @@
# ABOUTME: Moonarch default GTK3 settings.
# ABOUTME: User overrides go in ~/.config/gtk-3.0/settings.ini
[Settings]
gtk-theme-name=catppuccin-mocha-lavender-standard+default
gtk-icon-theme-name=Newaita-reborn-gray-dark
gtk-font-name=Hack Nerd Font 11
gtk-cursor-theme-name=Sweet-cursors
gtk-cursor-theme-size=24
gtk-toolbar-style=GTK_TOOLBAR_BOTH
gtk-toolbar-icon-size=GTK_ICON_SIZE_SMALL_TOOLBAR
gtk-button-images=1
gtk-menu-images=1
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=0
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintslight
gtk-xft-rgba=rgb
gtk-application-prefer-dark-theme=1

View File

@ -0,0 +1,5 @@
# ABOUTME: Moonarch default GTK4 settings.
# ABOUTME: User overrides go in ~/.config/gtk-4.0/settings.ini
[Settings]
gtk-application-prefer-dark-theme=1

View File

@ -0,0 +1,29 @@
# ABOUTME: Moonarch default gtklock configuration.
# ABOUTME: User overrides go in ~/.config/gtklock/config.ini
[main]
modules=powerbar-module;userinfo-module;playerctl-module;dpms
follow-focus=true
layout=/etc/xdg/gtklock/gtklock.ui
[powerbar]
show-labels=false
linked-buttons=true
reboot-command=systemctl reboot
poweroff-command=systemctl -i poweroff
suspend-command=systemctl suspend
userswitch-command=
logout-command=
[playerctl]
art-size=64
position=under-clock
[userinfo]
round-image=true
horizontal-layout=false
under-clock=false
[dpms]
idle-hide=true
idle-timeout=10

View File

@ -0,0 +1,138 @@
<!-- ABOUTME: Moonarch default gtklock UI layout definition. -->
<!-- ABOUTME: User overrides go in ~/.config/gtklock/gtklock.ui -->
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkBox" id="window-box">
<property name="name">window-box</property>
<property name="margin">20</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<property name="spacing">50</property>
<child>
<object class="GtkBox" id="info-box">
<property name="name">info-box</property>
<property name="halign">center</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox" id="time-box">
<property name="name">time-box</property>
<property name="halign">center</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="clock-label">
<property name="name">clock-label</property>
<property name="halign">center</property>
</object>
</child>
<child>
<object class="GtkLabel" id="date-label">
<property name="name">date-label</property>
<property name="halign">center</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkRevealer" id="body-revealer">
<property name="transition-type">none</property>
<property name="reveal-child">0</property>
<child>
<object class="GtkGrid" id="body-grid">
<property name="row-spacing">5</property>
<property name="column-spacing">5</property>
<child>
<object class="GtkLabel" id="input-label">
<property name="name">input-label</property>
<property name="label" translatable="yes">Password:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="input-field">
<property name="name">input-field</property>
<property name="width-request">380</property>
<property name="visibility">0</property>
<property name="caps-lock-warning">0</property>
<property name="input-purpose">password</property>
<property name="secondary-icon-name">view-reveal-symbolic</property>
<signal name="icon-release" handler="window_pw_toggle_vis"/>
<signal name="activate" handler="window_pw_check"/>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
<property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkRevealer" id="message-revealer">
<property name="transition-type">none</property>
<property name="no-show-all">1</property>
<child>
<object class="GtkScrolledWindow" id="message-scrolled-window">
<property name="hscrollbar-policy">never</property>
<property name="max-content-height">256</property>
<property name="propagate-natural-height">1</property>
<child>
<object class="GtkViewport">
<child>
<object class="GtkBox" id="message-box">
<property name="orientation">vertical</property>
<property name="homogeneous">1</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
<property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="halign">end</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="warning-label">
<property name="name">warning-label</property>
</object>
</child>
<child>
<object class="GtkLabel" id="error-label">
<property name="name">error-label</property>
</object>
</child>
<child>
<object class="GtkButton" id="unlock-button">
<property name="name">unlock-button</property>
<property name="label" translatable="yes">Unlock</property>
<style>
<class name="suggested-action"/>
</style>
<signal name="clicked" handler="window_pw_check"/>
</object>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
<property name="width">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@ -0,0 +1,12 @@
/* ABOUTME: Moonarch default gtklock stylesheet. */
/* ABOUTME: User overrides go in ~/.config/gtklock/style.css */
window {
background-image: url("/usr/share/moonarch/wallpaper.jpg");
background-size: cover;
}
#powerbar {
padding-bottom: 100px;
background: red;
}

View File

@ -0,0 +1,280 @@
// ABOUTME: Moonarch default Niri compositor configuration.
// ABOUTME: User overrides go in ~/.config/niri/config.kdl
cursor {
xcursor-theme "Sweet-cursors"
hide-when-typing
hide-after-inactive-ms 1000
}
input {
mod-key "Super"
keyboard {
xkb {
layout "de"
}
numlock
}
touchpad {
tap
natural-scroll
}
mouse {
accel-profile "flat"
}
trackpoint {
}
warp-mouse-to-focus
focus-follows-mouse max-scroll-amount="0%"
}
gestures {
hot-corners {
off
}
}
layout {
gaps 8
center-focused-column "never"
preset-column-widths {
proportion 0.33333
proportion 0.5
proportion 0.66667
}
default-column-width { proportion 0.5; }
focus-ring {
width 2
active-color "#7f849c80"
inactive-color "#1e1e2e80"
}
border {
off
width 2
active-color "#ffc87f"
inactive-color "#505050"
urgent-color "#9b0000"
}
shadow {
off
softness 30
spread 2
offset x=0 y=5
color "#0007"
}
struts {
}
}
spawn-at-startup "xwayland-satellite"
spawn-at-startup "waybar"
spawn-at-startup "dunst"
spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1"
spawn-sh-at-startup "waypaper --restore"
// spawn-sh-at-startup "nemo . &> /dev/null &"
spawn-sh-at-startup "foot --server"
spawn-sh-at-startup "mkdir -p /run/user/1000/cliphist && wl-paste --watch cliphist -db-path /run/user/1000/cliphist/db store"
spawn-sh-at-startup "mkdir -p /run/user/1000/cliphist && wl-paste --type image --watch cliphist -db-path /run/user/1000/cliphist/db store"
hotkey-overlay {
hide-not-bound
}
prefer-no-csd
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
animations {
on
}
window-rule {
match app-id=r#"^org\.wezfurlong\.wezterm$"#
default-column-width {}
}
window-rule {
match app-id=r#"firefox$"# title="^Picture-in-Picture$"
open-floating true
}
window-rule {
match app-id=r#"waterfox$"# title="^Picture-in-Picture$"
open-floating true
}
window-rule {
geometry-corner-radius 4
clip-to-geometry true
}
binds {
Mod+Shift+Slash { show-hotkey-overlay; }
Super+C hotkey-overlay-title=null { spawn-sh "cliphist -db-path /run/user/1000/cliphist/db list | rofi -dmenu | cliphist -db-path /run/user/1000/cliphist/db decode | wl-copy"; }
Alt+W { spawn-sh "killall waybar && waybar &"; }
Super+E { spawn-sh "xdg-open ~"; }
Super+T { spawn-sh "pkill rofi || rofi -show fb -modes \"fb:moonarch-setmen\" -theme /etc/xdg/rofi/settings-menu/settings-menu.rasi"; }
Super+N { spawn-sh "pkill rofi || moonarch-vpn"; }
Mod+Return hotkey-overlay-title="Open a Terminal: foot" { spawn "foot"; }
Mod+Space hotkey-overlay-title="Run an Application: rofi" { spawn-sh "pkill rofi || moonarch-launcher"; }
Super+Alt+L hotkey-overlay-title="Lock/Logout: wlogout" { spawn-sh "wlogout -P 1 -s -r 10 -c 10"; }
Mod+A { spawn-sh "pkill rofi || moonarch-volume"; }
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
Mod+O repeat=false { toggle-overview; }
Mod+Tab repeat=false { toggle-overview; }
Mod+Q repeat=false { close-window; }
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+H { focus-column-left; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+L { focus-column-right; }
Mod+Ctrl+Left { move-column-left; }
Mod+Ctrl+Down { move-window-down; }
Mod+Ctrl+Up { move-window-up; }
Mod+Ctrl+Right { move-column-right; }
Mod+Ctrl+H { move-column-left; }
Mod+Ctrl+J { move-window-down; }
Mod+Ctrl+K { move-window-up; }
Mod+Ctrl+L { move-column-right; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Shift+Left { focus-monitor-left; }
Mod+Shift+Down { focus-monitor-down; }
Mod+Shift+Up { focus-monitor-up; }
Mod+Shift+Right { focus-monitor-right; }
Mod+Shift+H { focus-monitor-left; }
Mod+Shift+J { focus-monitor-down; }
Mod+Shift+K { focus-monitor-up; }
Mod+Shift+L { focus-monitor-right; }
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
Mod+U { focus-workspace-down; }
Mod+I { focus-workspace-up; }
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
Mod+Ctrl+U { move-column-to-workspace-down; }
Mod+Ctrl+I { move-column-to-workspace-up; }
Mod+Shift+Page_Down { move-workspace-down; }
Mod+Shift+Page_Up { move-workspace-up; }
Mod+Shift+U { move-workspace-down; }
Mod+Shift+I { move-workspace-up; }
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Ctrl+WheelScrollRight { move-column-right; }
Mod+Ctrl+WheelScrollLeft { move-column-left; }
Mod+Shift+WheelScrollDown { focus-column-right; }
Mod+Shift+WheelScrollUp { focus-column-left; }
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Ctrl+1 { move-column-to-workspace 1; }
Mod+Ctrl+2 { move-column-to-workspace 2; }
Mod+Ctrl+3 { move-column-to-workspace 3; }
Mod+Ctrl+4 { move-column-to-workspace 4; }
Mod+Ctrl+5 { move-column-to-workspace 5; }
Mod+Ctrl+6 { move-column-to-workspace 6; }
Mod+Ctrl+7 { move-column-to-workspace 7; }
Mod+Ctrl+8 { move-column-to-workspace 8; }
Mod+Ctrl+9 { move-column-to-workspace 9; }
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
Mod+Comma { consume-window-into-column; }
Mod+Period { expel-window-from-column; }
Mod+R { switch-preset-column-width; }
Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
Mod+Ctrl+F { expand-column-to-available-width; }
Mod+C { center-column; }
Mod+Ctrl+C { center-visible-columns; }
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
Mod+V { toggle-window-floating; }
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
Mod+W { toggle-column-tabbed-display; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
Mod+Shift+E { quit; }
Ctrl+Alt+Delete { quit; }
Mod+Shift+P { power-off-monitors; }
}

View File

@ -0,0 +1,36 @@
# ABOUTME: Moonarch default PipeWire input denoising via RNNoise LADSPA plugin.
# ABOUTME: User overrides go in ~/.config/pipewire/pipewire.conf.d/
context.modules = [
{ name = libpipewire-module-filter-chain
args = {
node.description = "Noise Canceling source"
media.name = "Noise Canceling source"
filter.graph = {
nodes = [
{
type = ladspa
name = rnnoise
plugin = librnnoise_ladspa
label = noise_suppressor_mono
control = {
"VAD Threshold (%)" = 90.0
"VAD Grace Period (ms)" = 150
"Retroactive VAD Grace (ms)" = 0
}
}
]
}
capture.props = {
node.name = "capture.rnnoise_source"
node.passive = true
audio.rate = 48000
}
playback.props = {
node.name = "rnnoise_source"
media.class = Audio/Source
audio.rate = 48000
}
}
}
]

View File

@ -0,0 +1,82 @@
/**
* @author Dominik Kressler
* @package rofi-archer
* @version 1.0.0
**/
* {
background: {@theme_bg_color};
background-alt: {@theme_unfocused_fg_color}80;
foreground: {@theme_text_color};
selected: #4c566a;
border: {@borders};
active: #98C37988;
urgent: var(error-color);
/*https://catppuccin.ryanccn.dev/palette*/
rosewater: #f5e0dc;
flamingo: #f2cdcd;
pink: #f5c2e7;
mauve: #cba6f7;
red: #f38ba8;
maroon: #eba0ac;
peach: #fab387;
yellow: #f9e2af;
green: #a6e3a1;
teal: #94e2d5;
sky: #89dceb;
sapphire: #74c7ec;
blue: #89b4fa;
lavender: #b4befe;
text: {@theme_text_color};
subtext1: {@theme_text_color}80;
subtext0: #a6adc8;
overlay0: #6c7086;
overlay1: #7f849c;
overlay2: #9399b2;
surface0: #313244;
surface1: #45475a;
surface2: #585b70;
base: #1e1e2e;
mantle: #181825;
crust: #11111b;
/* GTK THEME VARS*/
theme-fg-color: {@theme_fg_color};
theme-text-color: {@theme_text_color};
theme-bg-color: {@theme_bg_color};
theme-base-color: {@theme_base_color};
theme-bg-color-shade-1: {@theme_bg_color}EF;
theme-bg-color-shade-2: {@theme_bg_color}D8;
theme-bg-color-shade-3: {@theme_bg_color}C9;
theme-selected-bg-color: {@theme_selected_bg_color};
theme-selected-fg-color: {@theme_selected_fg_color};
theme-unfocused-fg-color: {@theme_unfocused_fg_color};
theme-unfocused-text-color: {@theme_unfocused_text_color};
theme-unfocused-bg-color: {@theme_unfocused_bg_color};
theme-unfocused-base-color: {@theme_unfocused_base_color};
theme-unfocused-selected-bg-color: {@theme_unfocused_selected_bg_color};
theme-unfocused-selected-fg-color: {@theme_unfocused_selected_fg_color};
unfocused-insensitive-color: {@unfocused_insensitive_color};
borders: {@theme_selected_bg_color}30;
unfocused-borders: {@unfocused_borders};
warning-color: {@warning_color};
error-color: {@error_color};
success-color: {@success_color};
}

View File

@ -0,0 +1,295 @@
/**
*
* Author : Aditya Shakya (adi1090x)
* Github : @adi1090x
*
* Rofi Theme File
* Rofi Version: 1.7.3
**/
/*****----- Configuration -----*****/
configuration {
modi: "";
show-icons: false;
drun-display-format: "{name}";
window-format: "{w} · {c} · {t}";
}
/*****----- Global Properties -----*****/
@import "../colors.rasi"
@import "../fonts.rasi"
* {
border-colour: var(border);
handle-colour: var(selected);
background-colour: var(background);
foreground-colour: var(foreground);
alternate-background: var(background-alt);
normal-background: var(background);
normal-foreground: var(foreground);
urgent-background: var(urgent);
urgent-foreground: var(background);
active-background: var(active);
active-foreground: var(background);
selected-normal-background: var(selected);
selected-normal-foreground: var(background);
selected-urgent-background: var(active);
selected-urgent-foreground: var(background);
selected-active-background: var(urgent);
selected-active-foreground: var(background);
alternate-normal-background: var(background);
alternate-normal-foreground: var(foreground);
alternate-urgent-background: var(urgent);
alternate-urgent-foreground: var(background);
alternate-active-background: var(active);
alternate-active-foreground: var(background);
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 600px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
margin: 0px;
padding: 0px;
border: 1px solid;
border-radius: 10px;
border-color: @border-colour;
cursor: "default";
/* Backgroud Colors */
background-color: @background-colour;
/* Backgroud Image */
//background-image: url("/path/to/image.png", none);
/* Simple Linear Gradient */
//background-image: linear-gradient(red, orange, pink, purple);
/* Directional Linear Gradient */
//background-image: linear-gradient(to bottom, pink, yellow, magenta);
/* Angle Linear Gradient */
//background-image: linear-gradient(45, cyan, purple, indigo);
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 10px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px 0px 0px 0px;
border-color: @border-colour;
background-color: transparent;
children: [ "message", "listview", "inputbar" ];
}
/*****----- Inputbar -----*****/
inputbar {
enabled: false;
spacing: 10px;
margin: 0;
padding: 20px 0px 0;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
children: [ "textbox-prompt-colon", "entry", "mode-switcher" ];
}
prompt {
enabled: true;
background-color: inherit;
text-color: inherit;
}
textbox-prompt-colon {
enabled: true;
padding: 5px 0px 0px 15px;
expand: false;
font: "MonarchOS 14";
str: "";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
padding: 5px 0px;
background-color: inherit;
text-color: inherit;
cursor: text;
placeholder: "...";
placeholder-color: inherit;
}
num-filtered-rows {
enabled: true;
expand: false;
background-color: inherit;
text-color: inherit;
}
textbox-num-sep {
enabled: true;
expand: false;
str: "/";
background-color: inherit;
text-color: inherit;
}
num-rows {
enabled: true;
expand: false;
background-color: inherit;
text-color: inherit;
}
case-indicator {
enabled: true;
background-color: inherit;
text-color: inherit;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 1;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 5px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
cursor: "default";
}
scrollbar {
handle-width: 5px;
handle-color: @handle-colour;
border-radius: 10px;
background-color: transparent;
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 10px;
margin: 0px;
padding: 5px 10px;
border: 0px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
cursor: pointer;
}
element normal.normal {
background-color: transparent;
text-color: var(normal-foreground);
}
element normal.urgent {
background-color: var(urgent-background);
text-color: var(urgent-foreground);
}
element normal.active {
background-color: var(normal-foreground);
text-color: var(normal-background);
}
element selected.normal {
background-color: var(selected-normal-background);
text-color: var(normal-foreground);
}
element selected.urgent {
background-color: var(selected-urgent-background);
text-color: var(normal-background);
}
element selected.active {
background-color: var(selected-active-background);
text-color: var(normal-background);
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
cursor: inherit;
}
element-text {
background-color: transparent;
text-color: inherit;
highlight: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
/*****----- Mode Switcher -----*****/
mode-switcher{
enabled: true;
spacing: 10px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
}
button {
padding: 7px 15px 7px 10px;
border: 0px solid;
border-radius: 100%;
border-color: @border-colour;
background-color: @alternate-background;
text-color: inherit;
cursor: pointer;
}
button selected {
background-color: var(selected-normal-background);
text-color: var(selected-normal-foreground);
}
/*****----- Message -----*****/
message {
enabled: true;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px 0px 0px 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
}
textbox {
padding: 8px 10px;
border: 0px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: @alternate-background;
text-color: @foreground-colour;
vertical-align: 0.5;
horizontal-align: 0.0;
highlight: none;
placeholder-color: @foreground-colour;
blink: true;
markup: true;
}
error-message {
padding: 10px;
border: 2px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: @background-colour;
text-color: @foreground-colour;
}

View File

@ -0,0 +1,157 @@
* {
on: #98B3C8;
off: #CC9498;
}
/*****----- Global Properties -----*****/
@import "../colors.rasi"
@import "../fonts.rasi"
configuration {
show-icons: false;
icon-theme: "Papirus";
display-drun: ":";
drun-display-format: "{name}";
threads: 0;
scroll-method: 0;
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
window {
transparency: "real";
background-color: @background;
text-color: @foreground;
border: 0px;
border-radius: 0px;
border-color: @selected;
width: 384px;
location: center;
anchor: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 4px 4px 6px 6px;
background-color: @background;
text-color: @foreground;
}
textbox-prompt-colon {
expand: false;
str: "";
background-color: @background;
text-color: @urgent;
padding: 5px 0px 0px 4px;
}
inputbar {
children: [ textbox-prompt-colon, prompt ];
background-color: @background;
text-color: @foreground;
expand: false;
border: 0px 0px 1px 0px;
border-radius: 0px;
border-color: @selected;
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
position: center;
}
entry {
background-color: @background;
text-color: @foreground;
placeholder-color: @foreground;
expand: true;
horizontal-align: 0;
placeholder: "Search";
blink: true;
padding: 4px 0px 0px 0px;
}
case-indicator {
background-color: @background;
text-color: @foreground;
spacing: 0;
}
listview {
background-color: @background;
columns: 9;
lines: 7;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @background;
children: [ inputbar, listview ];
spacing: 5px;
padding: 5px 5px 5px 5px;
}
element {
background-color: @background;
text-color: @foreground;
orientation: horizontal;
border: 0px;
border-radius: 0px;
border-color: @selected;
padding: 5px 5px 5px 5px;
}
element-icon {
size: 24px;
border: 0px;
}
element-text {
expand: true;
horizontal-align: 0;
vertical-align: 0;
margin: 2px 0px 2px 2px;
}
element selected {
background-color: @selected;
text-color: @background;
border: 0px;
border-radius: 0px;
border-color: @selected;
}
element.active,
element.selected.urgent {
background-color: @background-alt;
text-color: @background;
border-color: @background-alt;
}
element.selected.urgent {
border-color: @urgent;
}
element.urgent,
element.selected.active {
background-color: @background;
text-color: @foreground;
border-color: @background;
}
element.selected.active {
border-color: @selected;
}
element-text, element-icon {
background-color: inherit;
text-color: inherit;
}

View File

@ -0,0 +1,82 @@
/**
* @author Dominik Kressler
* @package rofi-archer
* @version 1.0.0
**/
* {
background: #1e1e2e;
background-alt: #eff1f580;
foreground: #eff1f5;
selected: #4c566a;
border: #eff1f5;
active: #98C37988;
urgent: var(error-color);
/*https://catppuccin.ryanccn.dev/palette*/
rosewater: #f5e0dc;
flamingo: #f2cdcd;
pink: #f5c2e7;
mauve: #cba6f7;
red: #f38ba8;
maroon: #eba0ac;
peach: #fab387;
yellow: #f9e2af;
green: #a6e3a1;
teal: #94e2d5;
sky: #89dceb;
sapphire: #74c7ec;
blue: #89b4fa;
lavender: #b4befe;
text: #eff1f5;
subtext1: #eff1f580;
subtext0: #a6adc8;
overlay0: #6c7086;
overlay1: #7f849c;
overlay2: #9399b2;
surface0: #313244;
surface1: #45475a;
surface2: #585b70;
base: #1e1e2e;
mantle: #181825;
crust: #11111b;
/* GTK THEME VARS*/
theme-fg-color: #eff1f5;
theme-text-color: #eff1f5;
theme-bg-color: #1e1e2e;
theme-base-color: #1e1e2e;
theme-bg-color-shade-1: #1e1e2eEF;
theme-bg-color-shade-2: #1e1e2eD8;
theme-bg-color-shade-3: #1e1e2eC9;
theme-selected-bg-color: #b4befe;
theme-selected-fg-color: #11111b;
theme-unfocused-fg-color: #eff1f5;
theme-unfocused-text-color: #eff1f5;
theme-unfocused-bg-color: #1e1e2e;
theme-unfocused-base-color: #1e1e2e;
theme-unfocused-selected-bg-color: #b4befe;
theme-unfocused-selected-fg-color: #11111b;
unfocused-insensitive-color: #eff1f5;
borders: #b4befe30;
unfocused-borders: #eff1f5;
warning-color: #f9e2af;
error-color: #f38ba8;
success-color: #a6e3a1;
}

View File

@ -0,0 +1,305 @@
/**
*
* Author : Aditya Shakya (adi1090x)
* Github : @adi1090x
*
* Rofi Theme File
* Rofi Version: 1.7.3
**/
/*****----- Configuration -----*****/
configuration {
modi: "drun,run,filebrowser,window";
show-icons: true;
display-drun: "";
display-run: "";
display-filebrowser: "";
display-window: "";
display-combi: "練";
drun-display-format: "{name}";
window-format: "{w} · {c} · {t}";
matching: "fuzzy";
sidebar-mode: true;
threads: 0;
scroll-method: 0;
ssh-command: "sshfs_connect {host}";
}
/*****----- Global Properties -----*****/
@import "colors.rasi"
* {
handle-colour: var(selected);
foreground-colour: var(foreground);
alternate-background: var(background-alt);
normal-background: var(background);
normal-foreground: var(foreground);
urgent-background: var(urgent);
urgent-foreground: var(background);
active-background: var(active);
active-foreground: var(background);
selected-normal-background: var(selected);
selected-normal-foreground: var(background);
selected-urgent-background: var(active);
selected-urgent-foreground: var(background);
selected-active-background: var(urgent);
selected-active-foreground: var(background);
alternate-normal-background: var(background);
alternate-normal-foreground: var(foreground);
alternate-urgent-background: var(urgent);
alternate-urgent-foreground: var(background);
alternate-active-background: var(active);
alternate-active-foreground: var(background);
font: "JetBrainsMono Nerd Font 11";
border-radius: 4px;
frame-border: 1px solid;
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 600px;
x-offset: 0px;
y-offset: 60px;
/* properties for all widgets */
enabled: true;
margin: 0px;
padding: 0px;
border-radius: var(border-radius);
border: var(frame-border);
border-color: var(borders);
cursor: "default";
background-color: @theme-bg-color-shade-3;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 10px;
margin: 0px;
/*padding: 30px;*/
background-color: transparent;
children: [ "message", "listview", "inputbar" ];
padding: 0 0 30px 0;
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 10px;
margin: 0;
padding: 20px 0 0 30px;
border: 0px solid;
border-radius: 0px;
border-color: @borders;
background-color: transparent;
text-color: var(theme-text-color);
children: [ "textbox-prompt-colon", "entry", "mode-switcher" ];
}
prompt {
enabled: true;
background-color: inherit;
text-color: inherit;
}
textbox-prompt-colon {
enabled: true;
padding: 5px 3px 0px 0;
expand: false;
//font: "MonarchOS 14";
//str: "";
str: "󰍉";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
padding: 5px 0px;
background-color: inherit;
text-color: inherit;
cursor: text;
placeholder: "...";
placeholder-color: inherit;
}
num-filtered-rows {
enabled: true;
expand: false;
background-color: inherit;
text-color: inherit;
}
textbox-num-sep {
enabled: true;
expand: false;
str: "/";
background-color: inherit;
text-color: inherit;
}
num-rows {
enabled: true;
expand: false;
background-color: inherit;
text-color: inherit;
}
case-indicator {
enabled: true;
background-color: inherit;
text-color: inherit;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 1;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 10px;
margin: 0px;
padding: 30px 30px 0px 30px;
border: 0px solid;
border-radius: 0px;
border-color: @borders;
background-color: transparent;
text-color: var(theme-text-color);
cursor: "default";
}
scrollbar {
handle-width: 5px;
handle-color: @handle-colour;
border-radius: var(border-radius);
background-color: transparent;
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 10px;
margin: 0px;
padding: 5px 10px;
border: 0px solid;
border-radius: var(border-radius);
border-color: @borders;
background-color: transparent;
text-color: var(theme-text-color);
cursor: pointer;
orientation: horizontal;
children: ["element-text"];
}
element normal.normal {
background-color: transparent;
text-color: var(normal-foreground);
}
element normal.urgent {
background-color: var(urgent-background);
text-color: var(urgent-foreground);
}
element normal.active {
background-color: var(normal-foreground);
text-color: var(theme-bg-color-shade-1);
}
element selected.normal {
background-color: var(theme-selected-fg-color);
text-color: var(theme-selected-bg-color);
}
element selected.urgent {
background-color: var(theme-bg-color-shade-1);
text-color: var(theme-text-color);
}
element selected.active {
background-color: var(error-color);
text-color: var(theme-text-color);
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 16px;
cursor: inherit;
}
element-text {
background-color: transparent;
text-color: inherit;
highlight: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
/*****----- Mode Switcher -----*****/
mode-switcher{
enabled: true;
spacing: 10px;
margin: 0px;
padding: 0px 30px 0px 0;
border: 0px solid;
border-radius: 0px;
border-color: @borders;
background-color: transparent;
text-color: var(theme-text-color);
}
button {
padding: 2px 14px 2px 9px;
border: 0px solid;
border-radius: var(border-radius);
border-color: @borders;
background-color: @theme-bg-color-shade-1;
text-color: var(theme-selected-bg-color);
cursor: pointer;
}
button selected {
background-color: var(theme-selected-fg-color);
text-color: var(theme-selected-bg-color);
}
/*****----- Message -----*****/
message {
enabled: true;
margin: 0px;
padding: 0 0 0 0;
border: 0px solid;
border-radius: 0px 0px 0px 0px;
border-color: @borders;
background-color: transparent;
text-color: var(theme-text-color);
}
textbox {
padding: 30px 10px 0 10px;
border: 0px solid;
/*border-radius: 10px 10px 0 0;*/
border-radius: 0 0 0 0;
border-color: @borders;
background-color: transparent;
font: "JetBrainsMono Nerd Font 12";
text-color: var(theme-text-color);
horizontal-align: 0.5;
highlight: none;
placeholder-color: var(theme-text-color);
blink: true;
markup: true;
}
error-message {
padding: 10px;
border: 2px solid;
border-radius: var(border-radius);
border-color: @borders;
background-color: @background;
text-color: var(theme-text-color);
}

View File

@ -0,0 +1,45 @@
configuration {
modi: "drun";
show-icons: false;
drun-display-format: "{name}";
}
@import "../config.rasi"
@import "../colors.rasi"
window {
enabled: true;
cursor: "default";
width: 300px;
height: 300px;
}
mainbox {
children: [ "message", "listview", "inputbar" ];
}
inputbar {
enabled: true;
children: [ "textbox-prompt-colon", "entry", "mode-switcher" ];
}
listview {
enabled: true;
columns: 1;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
}
element-icon {
size: 0px;
}

View File

@ -0,0 +1,280 @@
/**
*
* Author : Aditya Shakya (adi1090x)
* Github : @adi1090x
*
* Rofi Theme File
* Rofi Version: 1.7.3
**/
@import "../config.rasi"
@import "../colors.rasi"
/*****----- Configuration -----*****/
configuration {
show-icons: true;
display-emoji: "";
}
/*****----- Global Properties -----*****/
* {
border-colour: var(border);
handle-colour: var(selected);
background-colour: var(background);
foreground-colour: var(foreground);
alternate-background: var(background-alt);
normal-background: var(background);
normal-foreground: var(foreground);
urgent-background: var(urgent);
urgent-foreground: var(background);
active-background: var(active);
active-foreground: var(background);
selected-normal-background: var(selected);
selected-normal-foreground: var(background);
selected-urgent-background: var(active);
selected-urgent-foreground: var(background);
selected-active-background: var(urgent);
selected-active-foreground: var(background);
alternate-normal-background: var(background);
alternate-normal-foreground: var(foreground);
alternate-urgent-background: var(urgent);
alternate-urgent-foreground: var(background);
alternate-active-background: var(active);
alternate-active-foreground: var(background);
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 600px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 10px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px 0px 0px 0px;
border-color: @border-colour;
background-color: transparent;
children: [ "message", "listview", "inputbar" ];
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 10px;
margin: 0;
padding: 20px 0px 0;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
children: [ "textbox-prompt-colon", "entry" ];
}
prompt {
enabled: true;
background-color: inherit;
text-color: inherit;
}
textbox-prompt-colon {
enabled: true;
padding: 5px 0px 0px 15px;
expand: false;
font: "MonarchOS 14";
str: "";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
padding: 5px 0px;
background-color: inherit;
text-color: inherit;
cursor: text;
placeholder: "...";
placeholder-color: inherit;
}
num-filtered-rows {
enabled: true;
expand: false;
background-color: inherit;
text-color: inherit;
}
textbox-num-sep {
enabled: true;
expand: false;
str: "/";
background-color: inherit;
text-color: inherit;
}
num-rows {
enabled: true;
expand: false;
background-color: inherit;
text-color: inherit;
}
case-indicator {
enabled: true;
background-color: inherit;
text-color: inherit;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 4;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: true;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 5px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
background-color: transparent;
text-color: @subtext1;
cursor: "default";
}
scrollbar {
handle-width: 5px;
handle-color: @handle-colour;
border-radius: 10px;
background-color: transparent;
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 0px;
margin: 0px;
padding: 5px;
border: 0px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: transparent;
text-color: @text;
cursor: pointer;
}
element normal.normal {
background-color: transparent;
text-color: var(normal-foreground);
}
element normal.urgent {
background-color: var(urgent-background);
text-color: var(urgent-foreground);
}
element normal.active {
background-color: var(normal-foreground);
text-color: var(normal-background);
}
element selected.normal {
background-color: var(selected-normal-background);
text-color: var(normal-foreground);
}
element selected.urgent {
background-color: var(selected-urgent-background);
text-color: var(normal-background);
}
element selected.active {
background-color: var(selected-active-background);
text-color: var(normal-background);
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 0;
cursor: inherit;
}
element-text {
background-color: transparent;
text-color: inherit;
highlight: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
/*****----- Mode Switcher -----*****/
mode-switcher{
enabled: true;
spacing: 10px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
}
button {
padding: 7px 15px 7px 10px;
border: 0px solid;
border-radius: 100%;
border-color: @border-colour;
background-color: @alternate-background;
text-color: inherit;
cursor: pointer;
}
button selected {
background-color: var(selected-normal-background);
text-color: var(selected-normal-foreground);
}
/*****----- Message -----*****/
message {
enabled: true;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px 0px 0px 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
}
textbox {
padding: 8px 10px;
border: 0px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: @alternate-background;
text-color: @foreground-colour;
vertical-align: 0.5;
horizontal-align: 0.0;
highlight: none;
placeholder-color: @foreground-colour;
blink: true;
markup: true;
}
error-message {
padding: 10px;
border: 2px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: @background-colour;
text-color: @foreground-colour;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
GTK_THEME=catppuccin-mocha-lavender-standard+default

View File

@ -0,0 +1,291 @@
/**
*
* Author : Aditya Shakya (adi1090x)
* Github : @adi1090x
*
* Rofi Theme File
* Rofi Version: 1.7.3
**/
/*****----- Configuration -----*****/
configuration {
modi: "drun,run,filebrowser,window";
show-icons: true;
drun-display-format: "{name}";
}
/*****----- Global Properties -----*****/
@import "../config.rasi"
@import "../colors.rasi"
@import "../fonts.rasi"
* {
border-colour: var(border);
handle-colour: var(selected);
background-colour: var(background);
foreground-colour: var(foreground);
alternate-background: var(background-alt);
normal-background: var(background);
normal-foreground: var(foreground);
urgent-background: var(urgent);
urgent-foreground: var(background);
active-background: var(active);
active-foreground: var(background);
selected-normal-background: var(selected);
selected-normal-foreground: var(background);
selected-urgent-background: var(active);
selected-urgent-foreground: var(background);
selected-active-background: var(urgent);
selected-active-foreground: var(background);
alternate-normal-background: var(background);
alternate-normal-foreground: var(foreground);
alternate-urgent-background: var(urgent);
alternate-urgent-foreground: var(background);
alternate-active-background: var(active);
alternate-active-foreground: var(background);
}
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 600px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
cursor: "default";
/* Backgroud Colors */
background-color: @background-colour;
/* Backgroud Image */
//background-image: url("/path/to/image.png", none);
/* Simple Linear Gradient */
//background-image: linear-gradient(red, orange, pink, purple);
/* Directional Linear Gradient */
//background-image: linear-gradient(to bottom, pink, yellow, magenta);
/* Angle Linear Gradient */
//background-image: linear-gradient(45, cyan, purple, indigo);
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 10px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px 0px 0px 0px;
border-color: @border-colour;
background-color: transparent;
children: [ "message", "listview", "inputbar" ];
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 10px;
margin: 0;
padding: 20px 0px 0;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
children: [ "textbox-prompt-colon", "entry", "mode-switcher" ];
}
prompt {
enabled: true;
background-color: inherit;
text-color: inherit;
}
textbox-prompt-colon {
enabled: true;
padding: 5px 0px 0px 15px;
expand: false;
font: "MonarchOS 14";
str: "";
background-color: inherit;
text-color: inherit;
}
entry {
enabled: true;
padding: 5px 0px;
background-color: inherit;
text-color: inherit;
cursor: text;
placeholder: "...";
placeholder-color: inherit;
}
num-filtered-rows {
enabled: true;
expand: false;
background-color: inherit;
text-color: inherit;
}
textbox-num-sep {
enabled: true;
expand: false;
str: "/";
background-color: inherit;
text-color: inherit;
}
num-rows {
enabled: true;
expand: false;
background-color: inherit;
text-color: inherit;
}
case-indicator {
enabled: true;
background-color: inherit;
text-color: inherit;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 2;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 5px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
cursor: "default";
}
scrollbar {
handle-width: 5px;
handle-color: @handle-colour;
border-radius: 10px;
background-color: transparent;
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 0;
margin: 0px;
padding: 5px 10px;
border: 0px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
cursor: pointer;
}
element normal.normal {
background-color: transparent;
text-color: var(normal-foreground);
}
element normal.urgent {
background-color: var(urgent-background);
text-color: var(urgent-foreground);
}
element normal.active {
background-color: var(normal-foreground);
text-color: var(normal-background);
}
element selected.normal {
background-color: var(selected-normal-background);
text-color: var(normal-foreground);
}
element selected.urgent {
background-color: var(selected-urgent-background);
text-color: var(normal-background);
}
element selected.active {
background-color: var(selected-active-background);
text-color: var(normal-background);
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 0;
cursor: inherit;
}
element-text {
background-color: transparent;
text-color: inherit;
highlight: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.0;
}
/*****----- Mode Switcher -----*****/
mode-switcher{
enabled: true;
spacing: 10px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
}
button {
padding: 7px 15px 7px 10px;
border: 0px solid;
border-radius: 100%;
border-color: @border-colour;
background-color: @alternate-background;
text-color: inherit;
cursor: pointer;
}
button selected {
background-color: var(selected-normal-background);
text-color: var(selected-normal-foreground);
}
/*****----- Message -----*****/
message {
enabled: true;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px 0px 0px 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
}
textbox {
padding: 8px 10px;
border: 0px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: @alternate-background;
text-color: @foreground-colour;
vertical-align: 0.5;
horizontal-align: 0.0;
highlight: none;
placeholder-color: @foreground-colour;
blink: true;
markup: true;
}
error-message {
padding: 10px;
border: 2px solid;
border-radius: 10px;
border-color: @border-colour;
background-color: @background-colour;
text-color: @foreground-colour;
}

View File

@ -0,0 +1,16 @@
@import "../config.rasi"
@import "../colors.rasi"
element {
children: ["element-icon", "element-text"];
}
element-icon {
size: 32px;
}
element-text {
vertical-align: 0.5;
horizontal-align: 0.0;
}

View File

@ -0,0 +1,45 @@
configuration {
modi: "drun";
show-icons: false;
drun-display-format: "{name}";
}
@import "../config.rasi"
@import "../colors.rasi"
window {
enabled: true;
cursor: "default";
width: 300px;
height: 300px;
}
mainbox {
children: [ "message", "listview", "inputbar" ];
}
inputbar {
enabled: true;
children: [ "textbox-prompt-colon", "entry", "mode-switcher" ];
}
listview {
enabled: true;
columns: 1;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
}
element-icon {
size: 0px;
}

View File

@ -0,0 +1,76 @@
@import "config.rasi"
@import "colors.rasi"
configuration {
show-icons: false;
}
window {
width:200px;
}
mainbox {
children: [ "message", "listview"];
}
/*****----- Message -----*****/
message {
enabled: true;
margin: 0px;
padding: 8px;
border: 0px solid;
border-radius: 100%;
background-color: transparent;
text-color: var(theme-text-color);
}
textbox {
background-color: inherit;
text-color: inherit;
placeholder-color: var(theme-text-color);
font: "JetBrainsMono Nerd Font Bold 12";
}
error-message {
padding: 12px;
border: 0px solid;
border-radius: 0px;
background-color: var(theme-bg-color);
text-color: var(theme-text-color);
}
listview {
columns: 2;
lines: 1;
layout:vertical;
}
element {
enabled: true;
spacing: 0px;
margin: 0px;
border: 0px solid;
border-radius: 100%;
background-color: transparent;
cursor: "pointer";
}
element-text {
background-color: transparent;
text-color: var(theme-text-color);
cursor: inherit;
horizontal-align: 0.5;
vertical-align:0;
font: "JetBrainsMono Nerd Font 18";
}
element selected.normal {
background-color: var(theme-selected-bg-color);
text-color: var(theme-selected-fg-color);
}
element-text selected.normal {
text-color: var(mantle);
}

View File

@ -0,0 +1,102 @@
configuration {
show-icons: false;
}
@import "../config.rasi"
window {
fullscreen: true;
border: none;
border-radius: 0;
}
mainbox {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 200px;
background-color: transparent;
children: ["inputbar", "listview" ];
expand: true;
}
inputbar {
enabled: true;
spacing: 10px;
margin: 0px;
padding: 12px 19px 12px 16px;
border-radius: 10px;
text-color: var(theme-selected-bg-color);
children: ["textbox-prompt-colon", "prompt"];
background-color: var(theme-selected-fg-color);
expand: false;
}
textbox-prompt-colon {
enabled: true;
expand: false;
str: "󰣇";
margin: 0;
padding: 0 4px 0 0;
font: "JetBrainsMono Nerd Font 16";
}
prompt {
padding: 4px 0 0 0;
}
dummy {
background-color: inherit;
}
listview {
enabled: true;
layout: horizontal;
columns: 2;
lines: 5;
cycle: true;
dynamic: false;
scrollbar: false;
reverse: false;
fixed-height: true;
fixed-columns: true;
vertical-align: 0.5;
horizontal-align: 0.5;
spacing: 15px;
background-color: transparent;
text-color: var(theme-text-color);
cursor: "default";
padding: 0;
margin:0 ;
}
element {
enabled: true;
spacing: 0px;
margin: 0px;
border: 0px solid;
border-radius: 10px;
background-color: transparent;
cursor: "pointer";
}
element-text {
font: "JetBrainsMono Nerd Font 28";
background-color: transparent;
text-color: var(text);
cursor: inherit;
vertical-align: 0;
horizontal-align: 1;
padding: 0 10px;
}
element selected.normal {
background-color: var(theme-selected-bg-color);
}
element-text selected.normal {
text-color: var(theme-bg-color);
}

View File

@ -0,0 +1,26 @@
@import "../config.rasi"
@import "../colors.rasi"
listview {
columns: 4;
lines: 4;
}
inputbar {
children: [ "textbox-prompt-colon", "entry"];
}
element {
orientation:vertical;
children: ["element-icon", "element-text"];
}
element-icon {
size: 32px;
}
element-text {
vertical-align: 0.5;
horizontal-align: 0.5;
font: "JetBrainsMono Nerd Font 9";
}

View File

@ -0,0 +1,176 @@
/**
*
* Author : Aditya Shakya (adi1090x)
* Github : @adi1090x
*
* Rofi Theme File
* Rofi Version: 1.7.3
* ---
*
* @Modification Dominik Kressler
* @package rofi-archer
* @version 1.0.0
**/
/*****----- Configuration -----*****/
configuration {
show-icons: false;
}
/*****----- Global Properties -----*****/
@import "../colors.rasi"
@import "../fonts.rasi"
/*
USE_BUTTONS=YES
*/
/*****----- Main Window -----*****/
window {
/* properties for window widget */
transparency: "real";
location: center;
anchor: center;
fullscreen: false;
width: 800px;
x-offset: 0px;
y-offset: 0px;
/* properties for all widgets */
enabled: true;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 10px;
border-color: @selected;
cursor: "default";
background-color: @background;
}
/*****----- Main Box -----*****/
mainbox {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 30px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
children: [ "inputbar", "listview" ];
}
/*****----- Inputbar -----*****/
inputbar {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 0px;
border: 0px;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
children: [ "textbox-prompt-colon", "prompt"];
}
dummy {
background-color: transparent;
}
textbox-prompt-colon {
enabled: true;
expand: false;
str: "";
padding: 12px 20px 12px 16px;
border-radius: 100%;
background-color: @urgent;
text-color: @background;
}
prompt {
enabled: true;
padding: 12px;
border-radius: 100%;
background-color: @active;
text-color: @background;
}
/*****----- Message -----*****/
message {
enabled: true;
margin: 0px;
padding: 12px;
border: 0px solid;
border-radius: 100%;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
font-weight: bold;
}
textbox {
background-color: inherit;
text-color: inherit;
vertical-align: 0.5;
horizontal-align: 0.5;
placeholder-color: @foreground;
blink: true;
markup: true;
}
error-message {
padding: 12px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: @background;
text-color: @foreground;
}
/*****----- Listview -----*****/
listview {
enabled: true;
columns: 5;
lines: 1;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 15px;
margin: 0px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
cursor: "default";
}
/*****----- Elements -----*****/
element {
enabled: true;
spacing: 0px;
margin: 0px;
padding: 40px 10px;
border: 0px solid;
border-radius: 100%;
border-color: @selected;
background-color: @selected;
text-color: var(background-alt);
cursor: pointer;
}
element-text {
font: "JetBrainsMono Nerd Font bold 32";
background-color: transparent;
text-color: inherit;
cursor: inherit;
vertical-align: 0.5;
horizontal-align: 0.5;
}
element selected.normal {
background-color: var(background-alt);
text-color: @foreground;
}

View File

@ -0,0 +1,43 @@
configuration {
modi: "drun";
show-icons: false;
drun-display-format: "{name}";
}
@import "../config.rasi"
@import "../colors.rasi"
window {
enabled: true;
cursor: "default";
}
mainbox {
children: [ "message", "listview", "inputbar" ];
}
inputbar {
enabled: true;
children: [ "textbox-prompt-colon", "entry", "mode-switcher" ];
}
listview {
enabled: true;
columns: 1;
lines: 8;
cycle: true;
dynamic: true;
scrollbar: false;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
}
element-icon {
size: 0px;
}

559
defaults/xdg/waybar/config Normal file
View File

@ -0,0 +1,559 @@
{
"__aboutme1": "Moonarch default waybar configuration for Niri.",
"__aboutme2": "User overrides go in ~/.config/waybar/config",
"layer": "top",
"margin-top": 0,
"spacing": 5,
"fixed-center": true,
"modules-left": [
"group/sys",
"niri/workspaces",
"tray",
"wlr/taskbar",
"niri/window"
],
"modules-center": [
],
"modules-right": [
"mpris",
"custom/cpugov",
"group/net",
"group/sound",
"backlight",
"battery",
"group/indicators"
],
"group/indicators": {
"orientation": "inherit",
"modules": [
"gamemode",
//"custom/updates",
"idle_inhibitor",
"custom/dnd",
"privacy"
]
},
"group/net": {
"orientation": "inherit",
"modules": [
"custom/vpn",
"network",
"bluetooth"
]
},
"group/stats": {
"orientation": "inherit",
"modules": [
"custom/cpugov",
"cpu",
"memory",
"custom/gpu-usage"
],
"drawer": {
"transition-duration": 500,
"transition-left-to-right": false
}
},
"group/sound": {
"orientation": "inherit",
"modules": [
"pulseaudio",
"pulseaudio/slider"
],
"drawer": {
"transition-duration": 500,
"transition-left-to-right": true
}
},
"group/sys": {
"orientation": "inherit",
"modules": [
"custom/power",
"clock"
]
},
"network": {
"format-wifi": "{icon}",
"format-ethernet": " {ifname}",
"format-disconnected": "󰱟 Offline",
"tooltip-format": "󰊗 {ifname} via {gwaddr}",
"tooltip-format-wifi": " WiFi {essid} ({signalStrength}%)",
"tooltip-format-ethernet": "󰱔 {ifname}",
"tooltip-format-disconnected": "Disconnected",
"on-click": "nm-connection-editor",
"format-icons": [
"󱛅",
"󱛂",
"󱛃",
"󱚽"
],
"max-length": 5
},
"tray": {
"icon-size": 15,
"spacing": 10
},
"clock": {
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
"format-alt": "<b>{:%d.%m.%Y %H:%M}</b>",
"format": "<b>{:%d.%m. %H:%M}</b>",
"timezone": "DE",
"calendar": {
"mode": "month",
"mode-mon-col": 3,
"weeks-pos": "right",
"on-scroll": 1,
"on-click-right": "mode",
"format": {
"months": "<span color='#b4befe'><b>{}</b></span>",
"days": "<span color='#bac2de'><b>{}</b></span>",
"weeks": "<span color='#f5e0dc'><b>W{}</b></span>",
"weekdays": "<span color='#f9e2af'><b>{}</b></span>",
"today": "<span color='#f38ba8'><b><u>{}</u></b></span>"
}
},
"actions": {
"on-click-right": "mode",
"on-click-forward": "tz_up",
"on-click-backward": "tz_down",
"on-scroll-up": "shift_up",
"on-scroll-down": "shift_down",
"on-click-middle": "alarm-clock-applet"
}
// "on-click": "evolution"
},
"user": {
"format": "{user}",
"interval": 240,
"icon": false,
"height": 16,
"width": 16,
"open-on-click": false
},
"pulseaudio": {
"format": "{format_source} {icon} <small>{volume}%</small>",
"format-bluetooth": "{icon} {volume}% {format_source}",
"format-bluetooth-muted": "{icon} {format_source}",
"format-muted": "{icon} <b>0</b>%",
"format-source": "",
"format-source-muted": "",
"format-icons": {
"headphone": "",
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": [
"",
"",
"󰕾"
]
},
"on-click": "moonarch-sink-switcher &",
"on-click-right": "pavucontrol",
"scroll-step": 5.0,
"max-volume": 99
},
"pulseaudio/slider": {
"min": 0,
"max": 99,
"orientation": "horizontal"
},
"mpris": {
"format": "⏸ {title:.10}",
"format-paused": "▶ {player}",
"player-icons": {
"default": "⏸",
"mpv": "🎵",
"spotify": "",
"firefox": "󰈹",
"mercury": "󰈹"
},
"status-icons": {
"paused": "⏸"
}
},
"custom/power": {
"format": "󰣇",
"menu": "on-click",
"menu-file": "~/.config/waybar/session_menu.xml",
"menu-actions": {
"lock": "gtklock",
"logout": "niri msg action quit",
"hibernate": "systemctl hibernate",
"reboot": "systemctl reboot",
"suspend": "systemctl suspend",
"shutdown": "systemctl poweroff"
}
},
"gamemode": {
"format": "{glyph}<small>{count}</small>",
"format-alt": "{glyph}",
"glyph": "",
"hide-not-running": true,
"use-icon": true,
"icon-name": "input-gaming-symbolic",
"icon-spacing": 1,
"icon-size": 12,
"tooltip": true,
"tooltip-format": "Games running: {count}"
},
"wlr/taskbar": {
"markup": true,
"format": "{icon}",
"icon-size": 16,
"tooltip-format": "{title:.100}",
// "sort-by-app-id": true,
"on-click": "activate",
"on-click-middle": "close",
"on-right-middle": "minimize-raise",
"ignore-list": ["title<>"],
"app_ids-mapping": {
"firefoxdeveloperedition": "firefox-developer-edition"
},
"rewrite": {
"Mozilla Firefox": "Firefox",
"firefox": "Firefox",
"VSCodium": "Code",
"codium": "Code",
"Alacritty": "Terminal",
},
"squash-list": [
"firefox"
]
},
"custom/updates": {
"format": "{icon}",
"return-type": "json",
"format-icons": {
"has-updates": "󱍷",
"updated": "󰂪"
},
"exec-if": "which waybar-module-pacman-updates",
"exec": "waybar-module-pacman-updates",
"on-click": "alacritty paru"
},
"custom/dnd": {
"format": " {} ",
"exec": "moonarch-dnd",
"return-type": "json",
"on-click": "dunstctl set-paused toggle",
"restart-interval": 1,
},
"custom/notification": {
"tooltip": false,
"format": "{icon} {}",
"format-icons": {
"notification": "󰂞",
"none": "󰂜",
"dnd-notification": "󰂛",
"dnd-none": "󰂛",
"inhibited-notification": "󰂜",
"inhibited-none": "󰂜",
"dnd-inhibited-notification": "󰂛",
"dnd-inhibited-none": "󰂛"
},
"return-type": "json",
"exec-if": "which swaync-client",
"exec": "swaync-client -swb",
"on-click": "sh -c 'sleep 0.1s; swaync-client -t -sw; sleep 0.1s'",
"on-click-right": "swaync-client -d -sw",
"escape": true
},
"cava": {
// "cava_config": "$XDG_CONFIG_HOME/cava/cava.conf",
"framerate": 30,
"autosens": 1,
//"sensitivity": 50,
"bars": 2,
"lower_cutoff_freq": 50,
"higher_cutoff_freq": 10000,
"method": "pipewire",
"source": "auto",
"stereo": true,
"reverse": false,
"bar_delimiter": 0,
"monstercat": true,
"hide_on_silence": true,
"waves": true,
"noise_reduction": 0.77,
"input_delay": 2,
"sleep_timer": 5,
"format-icons": [
"▁",
"▂",
"▃",
"▄",
"▅",
"▆",
"▇",
"█"
],
"actions": {
"on-click-right": "mode"
}
},
"cpu": {
"interval": 10,
"format": "CPU {icon}",
"max-length": 10,
"format-icons": [
"<span color='#69ff94' size='8pt' rise='1.5pt'>▁</span>",
"<span color='#2aa9ff' size='8pt' rise='1.5pt'>▂</span>",
"<span color='#f8f8f2' size='8pt' rise='1.5pt'>▃</span>",
"<span color='#f8f8f2' size='8pt' rise='1.5pt'>▄</span>",
"<span color='#ffffa5' size='8pt' rise='1.5pt'>▅</span>",
"<span color='#ffffa5' size='8pt' rise='1.5pt'>▆</span>",
"<span color='#ff9977' size='8pt' rise='1.5pt'>▇</span>",
"<span color='#dd532e' size='8pt' rise='1.5pt'>█</span>"
]
},
"memory": {
"interval": 30,
"format": "MEM {icon}",
"max-length": 10,
"tooltip": true,
"format-icons": [
"<span color='#69ff94' size='8pt' rise='1.5pt'>▁</span>",
"<span color='#2aa9ff' size='8pt' rise='1.5pt'>▂</span>",
"<span color='#f8f8f2' size='8pt' rise='1.5pt'>▃</span>",
"<span color='#f8f8f2' size='8pt' rise='1.5pt'>▄</span>",
"<span color='#ffffa5' size='8pt' rise='1.5pt'>▅</span>",
"<span color='#ffffa5' size='8pt' rise='1.5pt'>▆</span>",
"<span color='#ff9977' size='8pt' rise='1.5pt'>▇</span>",
"<span color='#dd532e' size='8pt' rise='1.5pt'>█</span>"
]
},
"custom/cpugov": {
"exec": "moonarch-waybar-cpugov",
"return-type": "json",
"restart-interval": 10,
"on-click": "moonarch-cpugov"
},
"custom/gpu-usage": {
"exec": "moonarch-waybar-gpustat",
"return-type": "json",
"restart-interval": 10
},
"battery": {
"interval": 60,
"states": {
"warning": 30,
"critical": 15
},
"format": "{capacity}% {icon}",
"format-icons": [
"",
"",
"",
"",
""
],
"max-length": 25
},
"bluetooth": {
// "controller": "controller1", // specify the alias of the controller if there are more than 1 on the system
"format": " {status}",
"format-disabled": "󰂲", // an empty format will hide the module
"format-connected": "<small>{num_connections}</small>",
"tooltip-format": "{controller_alias}\t{controller_address}",
"tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{device_enumerate}\t{device_battery_percentage}%",
"tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
"on-click": "blueberry"
},
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
"activated": "󱎴",
"deactivated": "󰷛"
},
"tooltip-format-activated": "󱎴 No Lockscreen on idle",
"tooltip-format-deactivated": "󰷛 Lockscreen on idle"
},
"custom/vpn": {
"format": "󰖂",
"exec": "echo '{\"class\": \"connected\", \"tooltip\": \"VPN Connected\"}'",
"exec-if": "test -d /proc/sys/net/ipv4/conf/tun0",
"return-type": "json",
"interval": 5
},
"power-profiles-daemon": {
"format": "{icon}",
"tooltip-format": "Power profile: {profile}\nDriver: {driver}",
"tooltip": true,
"format-icons": {
"default": "󰓅",
"performance": "󰓅",
"balanced": "󰾅",
"power-saver": "󰌪"
}
},
"privacy": {
"icon-spacing": 4,
"icon-size": 12,
"transition-duration": 250,
"modules": [
{
"type": "screenshare",
"tooltip": true,
"tooltip-icon-size": 12
},
{
"type": "audio-out",
"tooltip": true,
"tooltip-icon-size": 12
},
{
"type": "audio-in",
"tooltip": true,
"tooltip-icon-size": 12
}
]
},
"niri/workspaces": {
"format": "{icon}",
"format-icons": {
// Named workspaces
// (you need to configure them in niri)
"browser": "",
"discord": "",
"chat": "<b></b>",
// Icons by state
"active": "",
"default": ""
}
},
"niri/window": {
"format": "{}",
"rewrite": {
"(.*) - Mozilla Firefox": "🌎 $1",
"(.*) - zsh": "> [$1]"
}
},
"backlight": {
"device": "intel_backlight",
"format": "{percent}% {icon}",
"format-icons": ["", ""]
},
"backlight/slider": {
"min": 10,
"max": 100,
"orientation": "horizontal",
"device": "intel_backlight"
},
"cffi/niri-workspaces-enhanced": {
// Make sure to set the path to the install location on your system
// "module_path": "~/.config/waybar/niri-workspaces-enhanced.so",
"module_path": "/usr/lib/waybar/libwaybar_niri_workspaces_enhanced.so",
// Format string for workspace labels. Available placeholders:
// {index} - Workspace index number
// {name} - Workspace name (might be empty)
// {index-and-name} - Index followed by name if present (e.g., "1 Work")
// {value} - Name if present, otherwise index
// {separator} - ": " when icons are present, "" when empty
// {window-icons} - Formatted icons for windows in workspace
"format": "{window-icons}",
// Apply separate styles to icons depending on current state
"window-icon-format": {
"default": "{icon}",
"urgent": "<span foreground='red'>{icon}</span>",
"focused": "<span foreground='blue'>{icon}</span>",
},
// A mapping from window app_id to icon. Note that this module does
// case-insensitive matching of app_ids, so capitalization doesn't matter.
"window-icons": {
"com.mitchellh.ghostty": "",
"darktable": "",
"foot": "",
"google-chrome": "",
"spotify": "",
"steam": "",
},
// If no icon is found for a window, the default is used instead
"window-icon-default": "*",
},
"height": 40,
},
"cffi/niri-windows": {
// path where you placed the .so file
"module_path": "/usr/lib/waybar-niri-windows.so",
// configure the module's behavior
"options": {
// set the module mode
// "graphical" (default): draw a minimap of windows in the current workspace
// "text": draws symbols and a focus indicator for each column (mirrors v1 behavior)
"mode": "graphical",
// ======= graphical mode options =======
// when to show floating windows
// - "always": always show floating window view, even if there are no floating windows
// - "auto" (default): show floating window view if there are floating windows on the current workspace
// - "never": never show floating windows
"show-floating": "auto",
// pick where the floating windows be shown relative to tiled windows
// - "left": show floating windows on the left
// - "right" (default): show floating windows on the right
"floating-position": "right",
// set minimum size of windows, in pixels (default: 1, minimum: 1)
// if this value is too large to fit all windows (e.g. in a column with many windows),
// it will be reduced
"minimum-size": 1,
// set spacing between windows/columns, in pixels (default: 1, minimum: 0)
// if this value is too large, it will be reduced
"spacing": 1,
// set minimum size of windows, in pixels, to draw icons for (default: 0, minimum: 0)
// if unset or 0, icons will only be drawn for tiled windows that are the only one in their column
// if 1+, icons will be drawn for all windows where w >= icon-minimum-size and h >= icon-minimum-size
// icons must be set in the "rules" section below for this to have any effect
"icon-minimum-size": 0,
// account for borders when calculating window sizes; see note below (default: 0, minimum: 0)
"column-borders": 0, // border on .column
"floating-borders": 0, // border on .floating
// trigger actions on tile click (see https://yalter.github.io/niri/niri_ipc/enum.Action.html for available actions)
// only actions that take a single window ID are supported
// set to an empty string to disable
"on-tile-click": "FocusWindow", // (default: FocusWindow)
"on-tile-middle-click": "CloseWindow", // (default: CloseWindow)
"on-tile-right-click": "", // (default: none)
// add CSS classes/icons to windows based on their App ID/Title (see `niri msg windows`)
// Go regular expression syntax is supported for app-id and title (see https://pkg.go.dev/regexp/syntax)
// rules are checked in the order they are defined - first match wins and checking stops
// set "continue" to true to also check and apply subsequent rules even if this rule matches
// if multiple rules with icons are applied, the first one will be used
// *icons are not drawn for floating windows by default*; set "icon-minimum-size" to enable (see above)
"rules": [
// .alacritty will be added to all windows with the App ID "Alacritty"
// will be drawn in windows that match
{ "app-id": "Alacritty", "class": "alacritty", "icon": "" },
// .firefox will be added to all windows with the App ID "firefox"
// subsequent rules are also checked and applied for firefox windows
{ "app-id": "firefox", "class": "firefox", "continue": true },
// .youtube-music will be added to all windows that have "YouTube Music" at the end of their title
// will be drawn in windows that match
{ "title": "YouTube Music$", "class": "youtube-music", "icon": "" }
],
// ======= text mode options =======
// customize the symbols used to draw the columns/windows
"symbols": {
"unfocused": "⋅",
"focused": "⊙",
"unfocused-floating": "",
"focused-floating": "⊛",
// text to display when there are no windows on the current workspace
// if this is an empty string (default), the module will be hidden when there are no windows
"empty": ""
}
},
"actions": {
// use niri IPC action names to trigger them (see https://yalter.github.io/niri/niri_ipc/enum.Action.html for available actions)
// any action that has no fields is supported
"on-scroll-up": "FocusColumnLeft",
"on-scroll-down": "FocusColumnRight"
// in graphical mode, don't configure click actions here—they're handled by the module above
}
}
}

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkMenu" id="menu">
<child>
<object class="GtkMenuItem" id="suspend">
<property name="label">Suspend</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="hibernate">
<property name="label">Hibernate</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="shutdown">
<property name="label">Shutdown</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="delimiter1"/>
</child>
<child>
<object class="GtkMenuItem" id="reboot">
<property name="label">Reboot</property>
</object>
</child>
</object>
</interface>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkMenu" id="menu">
<child>
<object class="GtkMenuItem" id="lock">
<property name="label"> Lock</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="logout">
<property name="label">󰗽 Logout</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="hibernate">
<property name="label">󰤄 Hibernate</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="reboot">
<property name="label">󰑐 Reboot</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="delimiter1"/>
</child>
<child>
<object class="GtkMenuItem" id="shutdown">
<property name="label"> Shutdown</property>
</object>
</child>
</object>
</interface>

View File

@ -0,0 +1,351 @@
/* ABOUTME: Moonarch default waybar stylesheet with Catppuccin Mocha inspired styling. */
/* ABOUTME: User overrides go in ~/.config/waybar/style.css */
* {
border: none;
font-family: "Ubuntu Nerd Font", sans-serif;
font-size: 13px;
color: alpha(@theme_text_color, 0.8);
}
window#waybar {
/*background: transparent;*/
background: alpha(@theme_selected_fg_color, 0.2);
}
/*-----main groups----*/
.modules-right {
margin: 0;
padding-left: 5px;
padding-right: 0;
border-radius: 0;
}
.modules-center {
margin: 0;
border-radius: 0;
}
.modules-left {
margin: 0 0 0 5px;
/* background-color:alpha(@theme_selected_bg_color, 0.15);
background: @theme_bg_color */
border-radius: 0;
margin-left: 5px;
}
/**
## ALL MODULES
**/
#clock,
#battery,
#backlight,
#cpu,
#memory,
#bluetooth,
#temperature,
#network,
#pulseaudio,
#tray,
#mode,
#idle_inhibitor,
#workspaces,
#custom-power,
#custom-menu,
#custom-media,
#custom-notification,
#custom-updates,
#custom-pacman,
#user,
#cava,
#custom-gpu-usage,
#custom-cpugov,
#custom-vpn.connected,
#power-profiles-daemon,
#privacy,
#gamemode,
#taskbar,
#window {
padding: 0px 10px;
}
/**
* GROUPS
**/
#sys,
#stats,
#net,
#sound {
margin: 0;
color: alpha(@theme_text_color, 0.5);
}
/**
* SYS
**/
#sys {
padding: 0 0px 0 10px;
}
#custom-power {
margin-left: 0;
margin-right: 0;
padding-left: 0;
}
#user {
padding-left: 0;
font-weight: bold;
}
#custom-weather {
padding-left: 5px;
}
#stats .drawer-child {
padding-left: 10px;
padding-right: 10px;
}
#tray {
border-radius: 4px;
padding: 0px 8px 0px 8px;
margin: 8px 0px 8px 0px;
background-color: alpha(@theme_selected_bg_color, 0.1);
}
#custom-notification {
padding-right: 0
}
/**
* SOUND
**/
#cava {
background-color: transparent;
padding-left: 0;
}
#pulseaudio-slider {
padding-left: 10px;
padding-right: 10px;
}
#pulseaudio-slider slider {
min-height: 0px;
min-width: 0px;
opacity: 0;
background-image: none;
border: none;
box-shadow: none;
background-color: @insensitive_bg_color;
border: 1px solid alpha(@theme_selected_bg_color, 0.1);
}
#pulseaudio-slider trough {
min-height: 4px;
min-width: 80px;
border-radius: 5px;
background-color: alpha(@theme_selected_bg_color, 0.3);
}
#pulseaudio-slider highlight {
min-width: 5px;
border-radius: 5px;
background-color: #6c7086;
}
#custom-updates {
padding-right: 5px;
padding-left: 5px;
}
/**
* MISC
**/
#mpris {
border-radius: 0;
margin: 8px 10px 8px 0px;
padding: 0 10px;
}
/**
* WORKSPACES
**/
/*#workspaces {
padding: 0;
border-radius: 0
}
#workspaces button {
padding: 0px 10px 0px 8px;
margin: 8px 2px 8px 0px;
outline: none;
border-radius: 4px;
background-color: alpha(@theme_selected_bg_color, 0.05);
}
#workspaces button:last-child {
margin-right: 0;
}
#workspaces button.empty,
#workspaces button.active.empty {
color: inherit;
padding: 0px 0px 0px 8px;
}
#workspaces button.active {
background-color: transparent;
padding: 0px 10px 0px 8px;
}
#workspaces button.visible {
background-color: alpha(@theme_selected_bg_color, 0.1);
}
#workspaces button.urgent {
color: #cc3436;
}
#workspaces button:hover {
background-color: alpha(@theme_selected_bg_color, 0.05);
box-shadow: inherit;
text-shadow: inherit;
}*/
#workspaces {
padding: 0;
border-radius: 0;
}
#workspaces button {
margin: 8px 2px 8px 0px;
padding: 0;
outline: none;
border-radius: 4px;
background-color: alpha(@theme_selected_bg_color, 0.05);
}
#workspaces button:last-child {
margin-right: 0;
}
#workspaces button.empty,
#workspaces button.active.empty {
color: inherit;
}
#workspaces button.active {}
#workspaces button.visible {
background-color: alpha(@theme_selected_bg_color, 0.1);
}
#workspaces button.urgent {
color: #cc3436;
}
#workspaces button:hover {
background-color: alpha(@theme_selected_bg_color, 0.05);
box-shadow: inherit;
text-shadow: inherit;
}
/**
## INDICATORS
**/
#pulseaudio.muted {
color: #cc3436;
}
#battery.charging {
color: #2dcc36;
}
#battery.warning:not(.charging) {
color: #e6e600;
}
#battery.critical:not(.charging) {
color: #cc3436;
}
#temperature.critical {
color: #cc3436;
}
#idle_inhibitor.activated {
color: alpha(@theme_selected_bg_color, 0.9);
}
#indicators {
padding-right: 5px;
padding-left: 5px;
border-radius: 0;
}
/**
* TASKBAR
**/
#taskbar {
font-size: 8px;
margin: 0 0 0 5px;
opacity: 1;
padding: 0;
border-radius: 0;
}
#taskbar.empty {
opacity: 0;
}
#taskbar button {
padding: 3px 10px 3px 10px;
transition: 100ms border ease-in-out;
border-radius: 0;
font-size: 8px;
}
#taskbar button:not(:first-child) {
border-radius: 0px;
}
#taskbar button:first-child {}
#taskbar button:last-child {}
#taskbar button:last-child:first-child {}
#taskbar button.empty {
opacity: 0;
}
#taskbar button:hover {
background-color: alpha(@theme_selected_bg_color, 0.1);
}
#taskbar button.active {
background-color: alpha(@theme_selected_bg_color, 0.05);
opacity: 1;
}
menu {
border-radius: 4px;
}
menuitem {
border-radius: 4px;
}

View File

@ -0,0 +1,29 @@
# ABOUTME: Moonarch default waypaper configuration.
# ABOUTME: User overrides go in ~/.config/waypaper/config.ini
[Settings]
language = en
folder = ~/Pictures/Wallpaper
monitors = All
wallpaper = /usr/share/moonarch/wallpaper.jpg
backend = swww
fill = fill
sort = name
color = #ffffff
subfolders = False
show_hidden = False
show_gifs_only = False
show_transition_options = True
post_command =
number_of_columns = 3
swww_transition_type = any
swww_transition_step = 90
swww_transition_angle = 0
swww_transition_duration = 2
swww_transition_fps = 60
use_xdg_state = False
show_path_in_tooltip = True
all_subfolders = False
mpvpaper_sound = False
mpvpaper_options =
zen_mode = False

View File

@ -0,0 +1,38 @@
// ABOUTME: Moonarch default wlogout layout.
// ABOUTME: User overrides go in ~/.config/wlogout/layout
{
"label" : "lock",
"action" : "gtklock",
"text" : "Lock",
"keybind" : "l"
}
{
"label" : "hibernate",
"action" : "systemctl hibernate",
"text" : "Hibernate",
"keybind" : "h"
}
{
"label" : "logout",
"action" : "niri msg action quit",
"text" : "Logout",
"keybind" : "e"
}
{
"label" : "shutdown",
"action" : "systemctl poweroff",
"text" : "Shutdown",
"keybind" : "s"
}
{
"label" : "suspend",
"action" : "systemctl suspend",
"text" : "Suspend",
"keybind" : "u"
}
{
"label" : "reboot",
"action" : "systemctl reboot",
"text" : "Reboot",
"keybind" : "r"
}

28
packages/aur.txt Normal file
View File

@ -0,0 +1,28 @@
# ABOUTME: Liste der AUR-Pakete, die nach der Basisinstallation via paru installiert werden.
# ABOUTME: Wird von post-install.sh verwendet.
# AUR Helper (wird zuerst manuell gebaut)
# paru
# Theming
catppuccin-gtk-theme-mocha
newaita-reborn-icons-git
# Niri / Wayland Extras
rofi-lbonn-wayland-git
waybar-niri-windows-bin
waybar-niri-workspaces-enhanced-git
waypaper
wdisplays-git
wl-color-picker
wlogout
gtklock-dpms-module
# Anwendungen
blueberry
waterfox-bin
# System & Tools
auto-cpufreq
stasis
timeshift-autosnap

101
packages/official.txt Normal file
View File

@ -0,0 +1,101 @@
# ABOUTME: Liste der offiziell installierten Pakete aus den Arch-Repos.
# ABOUTME: Wird von archinstall und post-install.sh verwendet.
# Base
base
base-devel
linux-firmware
efibootmgr
btrfs-progs
man-db
cpio
unzip
zip
# Shell & Terminal
zsh
foot
foot-terminfo
bat
btop
eza
fastfetch
fd
fzf
jq
ripgrep
lazygit
# Netzwerk
networkmanager
network-manager-applet
networkmanager-openvpn
openvpn
smbclient
sshfs
nmap
wget
# Audio (PipeWire)
pipewire
pipewire-alsa
pipewire-jack
pipewire-pulse
wireplumber
libpulse
gst-plugin-pipewire
alsa-utils
pavucontrol
# Wayland / Niri
niri
xwayland-satellite
# Desktop-Utilities
waybar
dunst
cliphist
swww
brightnessctl
gtklock
gtklock-playerctl-module
gtklock-powerbar-module
gtklock-userinfo-module
nwg-look
greetd
greetd-regreet
polkit-gnome
# Dateimanager / XDG
gvfs
gvfs-dnssd
gvfs-mtp
gvfs-smb
udisks2
ntfs-3g
xdg-desktop-portal-gnome
xdg-desktop-portal-gtk
qt6-5compat
# Themes & Fonts
ttf-hack-nerd
# Anwendungen
viewnior
# Entwicklung
git
glab
go
neovim
npm
rustup
stow
# System
docker
docker-compose
fwupd
plocate
timeshift
ufw

32
scripts/install-themes.sh Executable file
View File

@ -0,0 +1,32 @@
#!/bin/bash
# ABOUTME: Installiert Themes die nicht via Pakete verfügbar sind (Cursor-Theme).
# ABOUTME: Wird von post-install.sh aufgerufen.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
log() {
echo -e "\e[1;34m[Moonarch]\e[0m $*"
}
# --- Sweet-cursors ---
CURSOR_DEST="/usr/share/icons/Sweet-cursors"
if [[ -d "$CURSOR_DEST" ]]; then
log "Sweet-cursors bereits installiert."
else
log "Installiere Sweet-cursors..."
TMPDIR=$(mktemp -d)
git clone --depth 1 https://github.com/EliverLara/Sweet.git "$TMPDIR/sweet"
if [[ -d "$TMPDIR/sweet/kde/cursors/Sweet-cursors" ]]; then
sudo cp -r "$TMPDIR/sweet/kde/cursors/Sweet-cursors" "$CURSOR_DEST"
log "Sweet-cursors nach $CURSOR_DEST installiert."
else
echo "Cursor-Verzeichnis nicht gefunden im Repository." >&2
echo "Bitte manuell installieren: https://github.com/EliverLara/Sweet" >&2
fi
rm -rf "$TMPDIR"
fi

190
scripts/post-install.sh Executable file
View File

@ -0,0 +1,190 @@
#!/bin/bash
# ABOUTME: Post-Install-Script für Moonarch — installiert Pakete, Defaults und konfiguriert das System.
# ABOUTME: Wird nach der archinstall-Basisinstallation als normaler User ausgeführt.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
OFFICIAL_PACKAGES="$PROJECT_DIR/packages/official.txt"
AUR_PACKAGES="$PROJECT_DIR/packages/aur.txt"
DEFAULTS_DIR="$PROJECT_DIR/defaults"
# --- Hilfsfunktionen ---
log() {
echo -e "\e[1;34m[Moonarch]\e[0m $*"
}
err() {
echo -e "\e[1;31m[Moonarch FEHLER]\e[0m $*" >&2
}
read_packages() {
grep -v '^\s*#' "$1" | grep -v '^\s*$'
}
# --- Voraussetzungen prüfen ---
if [[ $EUID -eq 0 ]]; then
err "Bitte NICHT als root ausführen. Das Script nutzt sudo wo nötig."
exit 1
fi
if ! command -v pacman &>/dev/null; then
err "pacman nicht gefunden — ist das wirklich Arch Linux?"
exit 1
fi
# --- Offizielle Pakete installieren ---
log "Installiere offizielle Pakete..."
if [[ -f "$OFFICIAL_PACKAGES" ]]; then
# shellcheck disable=SC2046
sudo pacman -S --needed --noconfirm $(read_packages "$OFFICIAL_PACKAGES")
else
err "Paketliste nicht gefunden: $OFFICIAL_PACKAGES"
exit 1
fi
# --- paru installieren (AUR Helper) ---
if ! command -v paru &>/dev/null; then
log "Installiere paru..."
PARU_TMPDIR=$(mktemp -d)
git clone https://aur.archlinux.org/paru.git "$PARU_TMPDIR/paru"
(cd "$PARU_TMPDIR/paru" && makepkg -si --noconfirm)
rm -rf "$PARU_TMPDIR"
else
log "paru bereits installiert."
fi
# --- AUR-Pakete installieren ---
log "Installiere AUR-Pakete..."
if [[ -f "$AUR_PACKAGES" ]]; then
# shellcheck disable=SC2046
paru -S --needed --noconfirm $(read_packages "$AUR_PACKAGES")
else
err "AUR-Paketliste nicht gefunden: $AUR_PACKAGES"
exit 1
fi
# --- Themes installieren (Cursor etc.) ---
log "Installiere Themes..."
"$SCRIPT_DIR/install-themes.sh"
# --- XDG Defaults installieren ---
log "Installiere XDG-Defaults nach /etc/xdg/..."
sudo cp -r "$DEFAULTS_DIR/xdg/"* /etc/xdg/
# Sicherstellen dass Rofi-Scripts ausführbar sind
sudo find /etc/xdg/rofi -name "*.sh" -exec chmod +x {} \;
# --- Helper-Scripts installieren ---
log "Installiere Moonarch Helper-Scripts nach /usr/local/bin/..."
sudo install -m 755 "$DEFAULTS_DIR/bin/moonarch-"* /usr/local/bin/
# --- Zsh-Konfiguration ---
log "Installiere Zsh-Default-Config..."
sudo cp "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch
# Eintrag in /etc/zsh/zshrc damit Moonarch-Defaults geladen werden,
# sofern der User keine eigene ~/.zshrc hat
if ! grep -q "zshrc.moonarch" /etc/zsh/zshrc 2>/dev/null; then
echo '# Moonarch defaults (wird durch ~/.zshrc überschrieben)' | sudo tee -a /etc/zsh/zshrc > /dev/null
echo '[[ ! -f "$HOME/.zshrc" ]] && source /etc/zsh/zshrc.moonarch' | sudo tee -a /etc/zsh/zshrc > /dev/null
fi
# Falls der User noch keine .zshrc hat, Moonarch-Default verlinken
if [[ ! -f "$HOME/.zshrc" ]]; then
log "Keine ~/.zshrc gefunden — sourcing Moonarch-Defaults."
mkdir -p "$HOME/.zshrc.d"
echo "# Moonarch-Defaults laden, eigene Overrides in ~/.zshrc.d/ oder hier unten" > "$HOME/.zshrc"
echo "source /etc/zsh/zshrc.moonarch" >> "$HOME/.zshrc"
fi
# --- greetd / regreet Konfiguration ---
log "Konfiguriere greetd + regreet..."
sudo mkdir -p /etc/greetd
sudo cp "$DEFAULTS_DIR/etc/greetd/config.toml" /etc/greetd/config.toml
sudo cp "$DEFAULTS_DIR/etc/greetd/niri-greeter.kdl" /etc/greetd/niri-greeter.kdl
sudo cp "$DEFAULTS_DIR/etc/greetd/regreet.toml" /etc/greetd/regreet.toml
sudo cp "$DEFAULTS_DIR/etc/greetd/regreet.css" /etc/greetd/regreet.css
# Greeter-Wallpaper installieren
log "Installiere Greeter-Wallpaper..."
sudo mkdir -p /usr/share/backgrounds
sudo cp "$DEFAULTS_DIR/backgrounds/moonarch-greeter.jpg" /usr/share/backgrounds/moonarch-greeter.jpg
# --- Systemd-Services aktivieren ---
log "Aktiviere Services..."
SERVICES=(
"NetworkManager"
"bluetooth"
"docker"
"greetd"
"systemd-timesyncd"
"ufw"
"auto-cpufreq"
)
for service in "${SERVICES[@]}"; do
if systemctl list-unit-files "${service}.service" &>/dev/null; then
sudo systemctl enable "$service"
log " + $service"
else
log " ~ $service nicht gefunden, uebersprungen."
fi
done
# --- Shell auf zsh setzen ---
if [[ "$SHELL" != */zsh ]]; then
log "Setze Standard-Shell auf zsh..."
chsh -s "$(which zsh)"
fi
# --- Firewall aktivieren ---
log "Konfiguriere UFW..."
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw --force enable
# --- Docker-Gruppe ---
if ! groups | grep -q docker; then
log "Fuege User zur docker-Gruppe hinzu..."
sudo usermod -aG docker "$USER"
fi
# --- Screenshots-Verzeichnis ---
mkdir -p "$HOME/Pictures/Screenshots"
mkdir -p "$HOME/Pictures/Wallpaper"
# --- moonarch-update Symlink ---
log "Erstelle moonarch-update Kommando..."
sudo ln -sf "$PROJECT_DIR/scripts/update.sh" /usr/local/bin/moonarch-update
# --- Fertig ---
log ""
log "============================================"
log " Moonarch Installation abgeschlossen!"
log "============================================"
log ""
log "Naechste Schritte:"
log " 1. Reboot"
log " 2. Wallpaper in ~/Pictures/Wallpaper/ ablegen"
log " 3. rustup default stable"
log " 4. User-Overrides in ~/.config/ oder ~/.zshrc.d/"
log ""

196
scripts/update.sh Executable file
View File

@ -0,0 +1,196 @@
#!/bin/bash
# ABOUTME: Moonarch System-Updater — aktualisiert System, Repo und Defaults.
# ABOUTME: Sollte regelmäßig ausgeführt werden um das System synchron zu halten.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
OFFICIAL_PACKAGES="$PROJECT_DIR/packages/official.txt"
AUR_PACKAGES="$PROJECT_DIR/packages/aur.txt"
DEFAULTS_DIR="$PROJECT_DIR/defaults"
# --- Hilfsfunktionen ---
log() {
echo -e "\e[1;34m[Moonarch]\e[0m $*"
}
err() {
echo -e "\e[1;31m[Moonarch FEHLER]\e[0m $*" >&2
}
read_packages() {
grep -v '^\s*#' "$1" | grep -v '^\s*$'
}
confirm() {
read -r -p "$1 [j/N] " response
[[ "$response" =~ ^[jJyY]$ ]]
}
# --- Voraussetzungen ---
if [[ $EUID -eq 0 ]]; then
err "Bitte NICHT als root ausfuehren."
exit 1
fi
# --- 1. Moonarch-Repo aktualisieren ---
log "=== Moonarch Repo aktualisieren ==="
cd "$PROJECT_DIR"
if git rev-parse --is-inside-work-tree &>/dev/null; then
LOCAL=$(git rev-parse HEAD)
git fetch origin
REMOTE=$(git rev-parse @{u} 2>/dev/null || echo "$LOCAL")
if [[ "$LOCAL" != "$REMOTE" ]]; then
log "Updates verfuegbar."
git --no-pager log --oneline "$LOCAL".."$REMOTE"
echo ""
if confirm "Repo aktualisieren?"; then
git pull --ff-only
log "Repo aktualisiert."
else
log "Repo-Update uebersprungen."
fi
else
log "Repo ist aktuell."
fi
else
log "Kein Git-Repo — Repo-Update uebersprungen."
fi
# --- 2. System-Pakete aktualisieren ---
log "=== System-Pakete aktualisieren ==="
if confirm "pacman -Syu ausfuehren?"; then
sudo pacman -Syu
else
log "System-Update uebersprungen."
fi
if command -v paru &>/dev/null; then
if confirm "AUR-Pakete aktualisieren (paru -Sua)?"; then
paru -Sua
else
log "AUR-Update uebersprungen."
fi
fi
# --- 3. Fehlende Pakete nachinstallieren ---
log "=== Paketlisten abgleichen ==="
if [[ -f "$OFFICIAL_PACKAGES" ]]; then
MISSING_OFFICIAL=$(comm -23 <(read_packages "$OFFICIAL_PACKAGES" | sort) <(pacman -Qqe | sort) || true)
if [[ -n "$MISSING_OFFICIAL" ]]; then
log "Fehlende offizielle Pakete:"
echo "$MISSING_OFFICIAL"
if confirm "Installieren?"; then
# shellcheck disable=SC2086
sudo pacman -S --needed --noconfirm $MISSING_OFFICIAL
fi
else
log "Alle offiziellen Pakete installiert."
fi
fi
if [[ -f "$AUR_PACKAGES" ]] && command -v paru &>/dev/null; then
MISSING_AUR=$(comm -23 <(read_packages "$AUR_PACKAGES" | sort) <(pacman -Qqe | sort) || true)
if [[ -n "$MISSING_AUR" ]]; then
log "Fehlende AUR-Pakete:"
echo "$MISSING_AUR"
if confirm "Installieren?"; then
# shellcheck disable=SC2086
paru -S --needed --noconfirm $MISSING_AUR
fi
else
log "Alle AUR-Pakete installiert."
fi
fi
# --- 4. Defaults aktualisieren ---
log "=== Defaults aktualisieren ==="
# XDG Defaults
CHANGED_XDG=false
if ! diff -rq "$DEFAULTS_DIR/xdg/" /etc/xdg/ --exclude='*.pyc' &>/dev/null 2>&1; then
CHANGED_XDG=true
fi
if $CHANGED_XDG; then
log "XDG-Defaults haben sich geaendert."
diff -rq "$DEFAULTS_DIR/xdg/" /etc/xdg/ --exclude='*.pyc' 2>/dev/null | head -20 || true
echo ""
if confirm "XDG-Defaults nach /etc/xdg/ deployen?"; then
sudo cp -r "$DEFAULTS_DIR/xdg/"* /etc/xdg/
log "XDG-Defaults aktualisiert."
fi
else
log "XDG-Defaults sind aktuell."
fi
# Binaries
CHANGED_BIN=false
for bin in "$DEFAULTS_DIR/bin/moonarch-"*; do
name=$(basename "$bin")
if ! cmp -s "$bin" "/usr/local/bin/$name" 2>/dev/null; then
CHANGED_BIN=true
break
fi
done
if $CHANGED_BIN; then
log "Moonarch-Binaries haben sich geaendert."
for bin in "$DEFAULTS_DIR/bin/moonarch-"*; do
name=$(basename "$bin")
if ! cmp -s "$bin" "/usr/local/bin/$name" 2>/dev/null; then
log " ~ $name"
fi
done
if confirm "Binaries nach /usr/local/bin/ deployen?"; then
sudo install -m 755 "$DEFAULTS_DIR/bin/moonarch-"* /usr/local/bin/
log "Binaries aktualisiert."
fi
else
log "Binaries sind aktuell."
fi
# Zsh
if ! cmp -s "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch 2>/dev/null; then
log "Zsh-Defaults haben sich geaendert."
if confirm "Zsh-Defaults aktualisieren?"; then
sudo cp "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch
log "Zsh-Defaults aktualisiert."
fi
else
log "Zsh-Defaults sind aktuell."
fi
# --- 5. Verwaiste Pakete ---
log "=== Verwaiste Pakete ==="
ORPHANS=$(pacman -Qdtq 2>/dev/null || true)
if [[ -n "$ORPHANS" ]]; then
log "Verwaiste Pakete gefunden:"
echo "$ORPHANS"
if confirm "Entfernen?"; then
# shellcheck disable=SC2086
sudo pacman -Rsn --noconfirm $ORPHANS
fi
else
log "Keine verwaisten Pakete."
fi
# --- Fertig ---
log ""
log "============================================"
log " Moonarch Update abgeschlossen!"
log "============================================"