Compare commits
1 Commits
refactor-p
...
remove-rec
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a34a671dc8 |
@@ -1,9 +0,0 @@
|
|||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
insert_final_newline = true
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
end_of_line = lf
|
|
||||||
charset = utf-8
|
|
||||||
24
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -1,24 +0,0 @@
|
|||||||
name: Bug
|
|
||||||
description: Report a validated bug -- NOT FOR SUPPORT REQUESTS
|
|
||||||
labels: [bug]
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Remember: Omarchy is an open source gift, not a product you bought from a vendor
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
id: system-details
|
|
||||||
attributes:
|
|
||||||
label: System details
|
|
||||||
placeholder: e.g. AMD 9950X, NVIDIA 5090, Omarchy 2.1.0
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: steps
|
|
||||||
attributes:
|
|
||||||
label: What's wrong?
|
|
||||||
description: Describe the issue, include steps to recreate it if possible, and attach the output of `omarchy-debug` if possible
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
8
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,8 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: Suggestion
|
|
||||||
url: https://github.com/basecamp/omarchy/discussions/categories/suggestions
|
|
||||||
about: Suggest a new feature, change to existing feature, or other ideas in Discussions.
|
|
||||||
- name: Support
|
|
||||||
url: https://omarchy.org/discord
|
|
||||||
about: Need help? Join our Discord community for support with any issues. GitHub issues should be used for verified bugs only.
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
# Omarchy
|
# Omarchy
|
||||||
|
|
||||||
Omarchy is a beautiful, modern & opinionated Linux distribution by DHH.
|
Turn a fresh Arch installation into a fully-configured, beautiful, and modern web development system based on Hyprland by running a single command. That's the one-line pitch for Omarchy (like it was for Omakub). No need to write bespoke configs for every essential tool just to get started or to be up on all the latest command-line tools. Omarchy is an opinionated take on what Linux can be at its best.
|
||||||
|
|
||||||
Read more at [omarchy.org](https://omarchy.org).
|
Read more at [omarchy.org](https://omarchy.org).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Omarchy is released under the [MIT License](https://opensource.org/licenses/MIT).
|
Omarchy is released under the [MIT License](https://opensource.org/licenses/MIT).
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
TryExec=alacritty
|
|
||||||
Exec=alacritty
|
|
||||||
Icon=Alacritty
|
|
||||||
Terminal=false
|
|
||||||
Categories=System;TerminalEmulator;
|
|
||||||
Name=Alacritty
|
|
||||||
GenericName=Terminal
|
|
||||||
Comment=A fast, cross-platform, OpenGL terminal emulator
|
|
||||||
StartupNotify=true
|
|
||||||
StartupWMClass=Alacritty
|
|
||||||
Actions=New;
|
|
||||||
X-TerminalArgExec=-e
|
|
||||||
X-TerminalArgAppId=--class=
|
|
||||||
X-TerminalArgTitle=--title=
|
|
||||||
X-TerminalArgDir=--working-directory=
|
|
||||||
|
|
||||||
[Desktop Action New]
|
|
||||||
Name=New Terminal
|
|
||||||
Exec=alacritty
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Hidden=true
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Hidden=true
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Hidden=true
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Hidden=true
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Hidden=true
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Hidden=true
|
|
||||||
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 75 KiB |
12
applications/nvim.desktop
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Name=Neovim
|
||||||
|
GenericName=Text Editor
|
||||||
|
Comment=Edit text files
|
||||||
|
Exec=alacritty --class=nvim --title=nvim -e nvim -- %F
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Keywords=Text;editor;
|
||||||
|
Icon=nvim
|
||||||
|
Categories=Utility;TextEditor;
|
||||||
|
StartupNotify=false
|
||||||
|
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
|
||||||
@@ -4,20 +4,27 @@
|
|||||||
|
|
||||||
BATTERY_THRESHOLD=10
|
BATTERY_THRESHOLD=10
|
||||||
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
|
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
|
||||||
BATTERY_LEVEL=$(omarchy-battery-remaining)
|
|
||||||
BATTERY_STATE=$(upower -i $(upower -e | grep 'BAT') | grep -E "state" | awk '{print $2}')
|
get_battery_percentage() {
|
||||||
|
upower -i $(upower -e | grep 'BAT') | grep -E "percentage" | grep -o '[0-9]\+%' | sed 's/%//'
|
||||||
|
}
|
||||||
|
|
||||||
|
get_battery_state() {
|
||||||
|
upower -i $(upower -e | grep 'BAT') | grep -E "state" | awk '{print $2}'
|
||||||
|
}
|
||||||
|
|
||||||
send_notification() {
|
send_notification() {
|
||||||
notify-send -u critical " Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000
|
notify-send -u critical " Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ -n "$BATTERY_LEVEL" && "$BATTERY_LEVEL" =~ ^[0-9]+$ ]]; then
|
BATTERY_LEVEL=$(get_battery_percentage)
|
||||||
if [[ $BATTERY_STATE == "discharging" && $BATTERY_LEVEL -le $BATTERY_THRESHOLD ]]; then
|
BATTERY_STATE=$(get_battery_state)
|
||||||
if [[ ! -f $NOTIFICATION_FLAG ]]; then
|
|
||||||
send_notification $BATTERY_LEVEL
|
if [[ "$BATTERY_STATE" == "discharging" && "$BATTERY_LEVEL" -le "$BATTERY_THRESHOLD" ]]; then
|
||||||
touch $NOTIFICATION_FLAG
|
if [[ ! -f "$NOTIFICATION_FLAG" ]]; then
|
||||||
fi
|
send_notification "$BATTERY_LEVEL"
|
||||||
else
|
touch "$NOTIFICATION_FLAG"
|
||||||
rm -f $NOTIFICATION_FLAG
|
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
rm -f "$NOTIFICATION_FLAG"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Returns the battery percentage remaining as an integer.
|
|
||||||
|
|
||||||
upower -i $(upower -e | grep BAT) \
|
|
||||||
| awk -F: '/percentage/ {
|
|
||||||
gsub(/[%[:space:]]/, "", $2);
|
|
||||||
val=$2;
|
|
||||||
printf("%d\n", (val+0.5))
|
|
||||||
exit
|
|
||||||
}'
|
|
||||||
@@ -3,12 +3,5 @@
|
|||||||
if [[ $# -eq 0 ]]; then
|
if [[ $# -eq 0 ]]; then
|
||||||
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
|
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
|
||||||
else
|
else
|
||||||
DEVICE="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)"
|
sudo asdcontrol $(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1) -- "$1"
|
||||||
sudo asdcontrol "$DEVICE" -- "$1" >/dev/null
|
|
||||||
VALUE="$(sudo asdcontrol "$DEVICE" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
|
|
||||||
swayosd-client \
|
|
||||||
--monitor "$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')" \
|
|
||||||
--custom-icon display-brightness \
|
|
||||||
--custom-progress "$(awk -v v="$VALUE" 'BEGIN{printf "%.2f", v/60000}')" \
|
|
||||||
--custom-progress-text "$(( VALUE * 100 / 60000 ))%"
|
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,56 +1,19 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
focused_monitor="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')"
|
# Find all the audio sinks but exit if there are none
|
||||||
|
sinks=($(wpctl status | sed -n '/Sinks:/,/Sources:/p' | grep -E '^\s*│\s+\*?\s*[0-9]+\.' | sed -E 's/^[^0-9]*([0-9]+)\..*/\1/'))
|
||||||
|
[ ${#sinks[@]} -eq 0 ] && exit 1
|
||||||
|
|
||||||
sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]')
|
# Find current audio sink
|
||||||
sinks_count=$(echo "$sinks" | jq '. | length')
|
current=$(wpctl status | sed -n '/Sinks:/,/Sources:/p' | grep '^\s*│\s*\*' | sed -E 's/^[^0-9]*([0-9]+)\..*/\1/')
|
||||||
|
|
||||||
if [ "$sinks_count" -eq 0 ]; then
|
# Find the next sink (looping around in the list)
|
||||||
swayosd-client \
|
for i in "${!sinks[@]}"; do
|
||||||
--monitor "$focused_monitor" \
|
[ "${sinks[$i]}" = "$current" ] && next=${sinks[$(((i + 1) % ${#sinks[@]}))]}
|
||||||
--custom-message "No audio devices found"
|
done
|
||||||
exit 1
|
next=${next:-${sinks[0]}}
|
||||||
fi
|
|
||||||
|
|
||||||
current_sink_name=$(pactl get-default-sink)
|
# Set the next sink and ensure it's not muted
|
||||||
current_sink_index=$(echo "$sinks" | jq -r --arg name "$current_sink_name" 'map(.name) | index($name)')
|
wpctl set-default "$next"
|
||||||
|
wpctl set-mute "$next" 0
|
||||||
|
|
||||||
if [ "$current_sink_index" != "null" ]; then
|
|
||||||
next_sink_index=$(((current_sink_index + 1) % sinks_count))
|
|
||||||
else
|
|
||||||
next_sink_index=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
next_sink=$(echo "$sinks" | jq -r ".[$next_sink_index]")
|
|
||||||
next_sink_name=$(echo "$next_sink" | jq -r '.name')
|
|
||||||
|
|
||||||
next_sink_description=$(echo "$next_sink" | jq -r '.description')
|
|
||||||
if [ "$next_sink_description" = "(null)" ] || [ "$next_sink_description" = "null" ] || [ -z "$next_sink_description" ]; then
|
|
||||||
sink_id=$(echo "$next_sink" | jq -r '.properties."object.id"')
|
|
||||||
next_sink_description=$(wpctl status | grep -E "\s+\*?\s+${sink_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
|
|
||||||
fi
|
|
||||||
|
|
||||||
next_sink_volume=$(echo "$next_sink" | jq -r \
|
|
||||||
'.volume | to_entries[0].value.value_percent | sub("%"; "")')
|
|
||||||
next_sink_is_muted=$(echo "$next_sink" | jq -r '.mute')
|
|
||||||
|
|
||||||
if [ "$next_sink_is_muted" = "true" ] || [ "$next_sink_volume" -eq 0 ]; then
|
|
||||||
icon_state="muted"
|
|
||||||
elif [ "$next_sink_volume" -le 33 ]; then
|
|
||||||
icon_state="low"
|
|
||||||
elif [ "$next_sink_volume" -le 66 ]; then
|
|
||||||
icon_state="medium"
|
|
||||||
else
|
|
||||||
icon_state="high"
|
|
||||||
fi
|
|
||||||
|
|
||||||
next_sink_volume_icon="sink-volume-${icon_state}-symbolic"
|
|
||||||
|
|
||||||
if [ "$next_sink_name" != "$current_sink_name" ]; then
|
|
||||||
pactl set-default-sink "$next_sink_name"
|
|
||||||
fi
|
|
||||||
|
|
||||||
swayosd-client \
|
|
||||||
--monitor "$focused_monitor" \
|
|
||||||
--custom-message "$next_sink_description" \
|
|
||||||
--custom-icon "$next_sink_volume_icon"
|
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode
|
|
||||||
|
|
||||||
if [[ -f "$FIRST_RUN_MODE" ]]; then
|
|
||||||
rm -f "$FIRST_RUN_MODE"
|
|
||||||
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh"
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh"
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/firewall.sh"
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh"
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh"
|
|
||||||
sudo rm -f /etc/sudoers.d/first-run
|
|
||||||
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/welcome.sh"
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/wifi.sh"
|
|
||||||
fi
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
for cmd in "$@"; do
|
|
||||||
if ! command -v "$cmd" &>/dev/null; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
for cmd in "$@"; do
|
|
||||||
command -v "$cmd" &>/dev/null || exit 1
|
|
||||||
done
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -8,135 +8,25 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
SCOPE=""
|
screenrecording() {
|
||||||
AUDIO="false"
|
filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
|
||||||
WEBCAM="false"
|
notify-send "Screen recording starting..." -t 1000
|
||||||
|
|
||||||
for arg in "$@"; do
|
|
||||||
case "$arg" in
|
|
||||||
--with-audio) AUDIO="true" ;;
|
|
||||||
--with-webcam) WEBCAM="true" ;;
|
|
||||||
output|region) SCOPE="$arg" ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
cleanup_webcam() {
|
|
||||||
pkill -f "WebcamOverlay" 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
start_webcam_overlay() {
|
|
||||||
cleanup_webcam
|
|
||||||
|
|
||||||
# Get monitor scale
|
|
||||||
local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')
|
|
||||||
|
|
||||||
# Target width (base 360px, scaled to monitor)
|
|
||||||
local target_width=$(awk "BEGIN {printf \"%.0f\", 360 * $scale}")
|
|
||||||
|
|
||||||
# Try preferred 16:9 resolutions in order, use first available
|
|
||||||
local preferred_resolutions=("640x360" "1280x720" "1920x1080")
|
|
||||||
local video_size_arg=""
|
|
||||||
local available_formats=$(v4l2-ctl --list-formats-ext -d /dev/video0 2>/dev/null)
|
|
||||||
|
|
||||||
for resolution in "${preferred_resolutions[@]}"; do
|
|
||||||
if echo "$available_formats" | grep -q "$resolution"; then
|
|
||||||
video_size_arg="-video_size $resolution"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
ffplay -f v4l2 $video_size_arg -framerate 30 /dev/video0 \
|
|
||||||
-vf "scale=${target_width}:-1" \
|
|
||||||
-window_title "WebcamOverlay" \
|
|
||||||
-noborder \
|
|
||||||
-fflags nobuffer -flags low_delay \
|
|
||||||
-probesize 32 -analyzeduration 0 \
|
|
||||||
-loglevel quiet &
|
|
||||||
sleep 1
|
sleep 1
|
||||||
}
|
|
||||||
|
|
||||||
start_screenrecording() {
|
if lspci | grep -Eqi 'nvidia|intel.*graphics'; then
|
||||||
local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
|
wf-recorder -f "$filename" -c libx264 -p crf=23 -p preset=medium -p movflags=+faststart "$@"
|
||||||
local audio_args=""
|
|
||||||
|
|
||||||
# Merge audio tracks into one - separate tracks only play one at a time in most players
|
|
||||||
[[ "$AUDIO" == "true" ]] && audio_args="-a default_output|default_input"
|
|
||||||
|
|
||||||
gpu-screen-recorder -w "$@" -f 60 -c mp4 -o "$filename" $audio_args &
|
|
||||||
toggle_screenrecording_indicator
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_screenrecording() {
|
|
||||||
pkill -SIGINT -f "gpu-screen-recorder" # SIGINT required to save video properly
|
|
||||||
|
|
||||||
# Wait a maximum of 5 seconds to finish before hard killing
|
|
||||||
local count=0
|
|
||||||
while pgrep -f "gpu-screen-recorder" >/dev/null && [ $count -lt 50 ]; do
|
|
||||||
sleep 0.1
|
|
||||||
count=$((count + 1))
|
|
||||||
done
|
|
||||||
|
|
||||||
if pgrep -f "gpu-screen-recorder" >/dev/null; then
|
|
||||||
pkill -9 -f "gpu-screen-recorder"
|
|
||||||
cleanup_webcam
|
|
||||||
notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
|
|
||||||
else
|
else
|
||||||
cleanup_webcam
|
wl-screenrec -f "$filename" --ffmpeg-encoder-options="-c:v libx264 -crf 23 -preset medium -movflags +faststart" "$@"
|
||||||
notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
|
|
||||||
fi
|
fi
|
||||||
toggle_screenrecording_indicator
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toggle_screenrecording_indicator() {
|
if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
|
||||||
pkill -RTMIN+8 waybar
|
pkill -x wl-screenrec
|
||||||
}
|
pkill -x wf-recorder
|
||||||
|
notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
|
||||||
screenrecording_active() {
|
elif [[ "$1" == "output" ]]; then
|
||||||
pgrep -f "gpu-screen-recorder" >/dev/null || pgrep -x slurp >/dev/null || pgrep -f "WebcamOverlay" >/dev/null
|
screenrecording
|
||||||
}
|
|
||||||
|
|
||||||
if screenrecording_active; then
|
|
||||||
if pgrep -x slurp >/dev/null; then
|
|
||||||
pkill -x slurp 2>/dev/null
|
|
||||||
elif pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "gpu-screen-recorder" >/dev/null; then
|
|
||||||
cleanup_webcam
|
|
||||||
else
|
|
||||||
stop_screenrecording
|
|
||||||
fi
|
|
||||||
elif [[ "$SCOPE" == "output" ]]; then
|
|
||||||
[[ "$WEBCAM" == "true" ]] && start_webcam_overlay
|
|
||||||
|
|
||||||
if ! output=$(slurp -o -f "%o"); then
|
|
||||||
[[ "$WEBCAM" == "true" ]] && cleanup_webcam
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$output" ]]; then
|
|
||||||
notify-send "Error" "Could not detect monitor" -u critical
|
|
||||||
[[ "$WEBCAM" == "true" ]] && cleanup_webcam
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
start_screenrecording "$output"
|
|
||||||
else
|
else
|
||||||
[[ "$WEBCAM" == "true" ]] && start_webcam_overlay
|
region=$(slurp) || exit 1
|
||||||
|
screenrecording -g "$region"
|
||||||
scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')
|
|
||||||
|
|
||||||
if ! region=$(slurp -f "%wx%h+%x+%y"); then
|
|
||||||
[[ "$WEBCAM" == "true" ]] && cleanup_webcam
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$region" =~ ^([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)$ ]]; then
|
|
||||||
w=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[1]} * $scale}")
|
|
||||||
h=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[2]} * $scale}")
|
|
||||||
x=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[3]} * $scale}")
|
|
||||||
y=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[4]} * $scale}")
|
|
||||||
scaled_region="${w}x${h}+${x}+${y}"
|
|
||||||
else
|
|
||||||
scaled_region="$region"
|
|
||||||
fi
|
|
||||||
|
|
||||||
start_screenrecording region -region "$scaled_region"
|
|
||||||
fi
|
fi
|
||||||
|
|||||||
7
bin/omarchy-cmd-screenrecord-stop
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
|
||||||
|
pkill -x wl-screenrec
|
||||||
|
pkill -x wf-recorder
|
||||||
|
notify-send "Screen recording stopped" -t 2000
|
||||||
|
fi
|
||||||
@@ -1,29 +1,20 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
screensaver_in_focus() {
|
if command -v tte &>/dev/null; then
|
||||||
hyprctl activewindow -j | jq -e '.class == "Screensaver"' >/dev/null 2>&1
|
while true; do
|
||||||
}
|
effect=$(tte 2>&1 | grep -oP '{\K[^}]+' | tr ',' ' ' | tr ' ' '\n' | sed -n '/^beams$/,$p' | sort -u | shuf -n1)
|
||||||
|
tte -i ~/.config/omarchy/branding/screensaver.txt \
|
||||||
|
--frame-rate 240 --canvas-width 0 --canvas-height $(($(tput lines) - 2)) --anchor-canvas c --anchor-text c \
|
||||||
|
"$effect" &
|
||||||
|
|
||||||
exit_screensaver() {
|
while pgrep -x tte >/dev/null; do
|
||||||
hyprctl keyword cursor:invisible false
|
if read -n 1 -t 0.01; then
|
||||||
pkill -x tte 2>/dev/null
|
pkill -x tte 2>/dev/null
|
||||||
pkill -f "alacritty --class Screensaver" 2>/dev/null
|
pkill -f "alacritty --class Screensaver" 2>/dev/null
|
||||||
exit 0
|
exit 0
|
||||||
}
|
fi
|
||||||
|
done
|
||||||
trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT
|
|
||||||
|
|
||||||
hyprctl keyword cursor:invisible true &>/dev/null
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
effect=$(tte 2>&1 | grep -oP '{\K[^}]+' | tr ',' ' ' | tr ' ' '\n' | sed -n '/^beams$/,$p' | sort -u | shuf -n1)
|
|
||||||
tte -i ~/.config/omarchy/branding/screensaver.txt \
|
|
||||||
--frame-rate 240 --canvas-width 0 --canvas-height $(($(tput lines) - 2)) --anchor-canvas c --anchor-text c \
|
|
||||||
"$effect" &
|
|
||||||
|
|
||||||
while pgrep -x tte >/dev/null; do
|
|
||||||
if read -n 1 -t 3 || ! screensaver_in_focus; then
|
|
||||||
exit_screensaver
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
done
|
else
|
||||||
|
gum spin --title "Can't find tte. Try: pip install terminaltexteffects" -- sleep 2
|
||||||
|
fi
|
||||||
|
|||||||
@@ -8,76 +8,10 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
pkill slurp && exit 0
|
pkill slurp || hyprshot -m ${1:-region} --raw |
|
||||||
|
|
||||||
MODE="${1:-smart}"
|
|
||||||
PROCESSING="${2:-slurp}"
|
|
||||||
|
|
||||||
get_rectangles() {
|
|
||||||
local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
|
|
||||||
hyprctl monitors -j | jq -r --arg ws "$active_workspace" '.[] | select(.activeWorkspace.id == ($ws | tonumber)) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"'
|
|
||||||
hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
|
|
||||||
}
|
|
||||||
|
|
||||||
# Select based on mode
|
|
||||||
case "$MODE" in
|
|
||||||
region)
|
|
||||||
wayfreeze & PID=$!
|
|
||||||
sleep .1
|
|
||||||
SELECTION=$(slurp 2>/dev/null)
|
|
||||||
kill $PID 2>/dev/null
|
|
||||||
;;
|
|
||||||
windows)
|
|
||||||
wayfreeze & PID=$!
|
|
||||||
sleep .1
|
|
||||||
SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
|
|
||||||
kill $PID 2>/dev/null
|
|
||||||
;;
|
|
||||||
fullscreen)
|
|
||||||
SELECTION=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"')
|
|
||||||
;;
|
|
||||||
smart|*)
|
|
||||||
RECTS=$(get_rectangles)
|
|
||||||
wayfreeze & PID=$!
|
|
||||||
sleep .1
|
|
||||||
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
|
|
||||||
kill $PID 2>/dev/null
|
|
||||||
|
|
||||||
# If the selction area is L * W < 20, we'll assume you were trying to select whichever
|
|
||||||
# window or output it was inside of to prevent accidental 2px snapshots
|
|
||||||
if [[ "$SELECTION" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
|
|
||||||
if (( ${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20 )); then
|
|
||||||
click_x="${BASH_REMATCH[1]}"
|
|
||||||
click_y="${BASH_REMATCH[2]}"
|
|
||||||
|
|
||||||
while IFS= read -r rect; do
|
|
||||||
if [[ "$rect" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then
|
|
||||||
rect_x="${BASH_REMATCH[1]}"
|
|
||||||
rect_y="${BASH_REMATCH[2]}"
|
|
||||||
rect_width="${BASH_REMATCH[3]}"
|
|
||||||
rect_height="${BASH_REMATCH[4]}"
|
|
||||||
|
|
||||||
if (( click_x >= rect_x && click_x < rect_x+rect_width && click_y >= rect_y && click_y < rect_y+rect_height )); then
|
|
||||||
SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done <<< "$RECTS"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
[ -z "$SELECTION" ] && exit 0
|
|
||||||
|
|
||||||
if [[ $PROCESSING == "slurp" ]]; then
|
|
||||||
grim -g "$SELECTION" - |
|
|
||||||
satty --filename - \
|
satty --filename - \
|
||||||
--output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
|
--output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
|
||||||
--early-exit \
|
--early-exit \
|
||||||
--actions-on-enter save-to-clipboard \
|
--actions-on-enter save-to-clipboard \
|
||||||
--save-after-copy \
|
--save-after-copy \
|
||||||
--copy-command 'wl-copy'
|
--copy-command 'wl-copy'
|
||||||
else
|
|
||||||
grim -g "$SELECTION" - | wl-copy
|
|
||||||
fi
|
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
|
||||||
echo "Usage: omarchy-cmd-share [clipboard|file|folder]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
MODE="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [[ $MODE == "clipboard" ]]; then
|
|
||||||
TEMP_FILE=$(mktemp --suffix=.txt)
|
|
||||||
wl-paste >"$TEMP_FILE"
|
|
||||||
FILES="$TEMP_FILE"
|
|
||||||
else
|
|
||||||
if (($# > 0)); then
|
|
||||||
FILES="$*"
|
|
||||||
else
|
|
||||||
if [[ $MODE == "folder" ]]; then
|
|
||||||
# Pick a single folder from home directory
|
|
||||||
FILES=$(find "$HOME" -type d 2>/dev/null | fzf)
|
|
||||||
else
|
|
||||||
# Pick one or more files from home directory
|
|
||||||
FILES=$(find "$HOME" -type f 2>/dev/null | fzf --multi)
|
|
||||||
fi
|
|
||||||
[ -z "$FILES" ] && exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run LocalSend in its own systemd service (detached from terminal)
|
|
||||||
# Convert newline-separated files to space-separated arguments
|
|
||||||
if [[ $MODE != "clipboard" ]] && echo "$FILES" | grep -q $'\n'; then
|
|
||||||
# Multiple files selected - convert newlines to array
|
|
||||||
readarray -t FILE_ARRAY <<<"$FILES"
|
|
||||||
systemd-run --user --quiet --collect localsend --headless send "${FILE_ARRAY[@]}"
|
|
||||||
else
|
|
||||||
# Single file or clipboard mode
|
|
||||||
systemd-run --user --quiet --collect localsend --headless send "$FILES"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Note: Temporary file will remain until system cleanup for clipboard mode
|
|
||||||
# This ensures the file content is available for the LocalSend GUI
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -2,16 +2,10 @@
|
|||||||
|
|
||||||
# Go from current active terminal to its child shell process and run cwd there
|
# Go from current active terminal to its child shell process and run cwd there
|
||||||
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
|
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
|
||||||
shell_pid=$(pgrep -P "$terminal_pid" | tail -n1)
|
shell_pid=$(pgrep -P "$terminal_pid" | head -n1)
|
||||||
|
|
||||||
if [[ -n $shell_pid ]]; then
|
if [[ -n $shell_pid ]]; then
|
||||||
cwd=$(readlink -f "/proc/$shell_pid/cwd" 2>/dev/null)
|
readlink -f "/proc/$shell_pid/cwd" 2>/dev/null
|
||||||
|
|
||||||
if [[ -d $cwd ]]; then
|
|
||||||
echo "$cwd"
|
|
||||||
else
|
|
||||||
echo "$HOME"
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
echo "$HOME"
|
echo "$HOME"
|
||||||
fi
|
fi
|
||||||
|
|||||||
6
bin/omarchy-cmd-tzupdate
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
sudo tzupdate
|
||||||
|
new_timezone=$(timedatectl show -p Timezone --value)
|
||||||
|
omarchy-restart-waybar
|
||||||
|
notify-send "Timezone has been set to $new_timezone"
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
LOG_FILE="/tmp/omarchy-debug.log"
|
|
||||||
|
|
||||||
cat > "$LOG_FILE" <<EOF
|
|
||||||
Date: $(date)
|
|
||||||
Hostname: $(hostname)
|
|
||||||
Omarchy Branch: $(git -C "$OMARCHY_PATH" branch --show-current 2>/dev/null || echo "unknown")
|
|
||||||
|
|
||||||
=========================================
|
|
||||||
SYSTEM INFORMATION
|
|
||||||
=========================================
|
|
||||||
$(inxi -Farz)
|
|
||||||
|
|
||||||
=========================================
|
|
||||||
DMESG
|
|
||||||
=========================================
|
|
||||||
$(sudo dmesg)
|
|
||||||
|
|
||||||
=========================================
|
|
||||||
JOURNALCTL (CURRENT BOOT, ERRORS ONLY)
|
|
||||||
=========================================
|
|
||||||
$(journalctl -b -p 4..1)
|
|
||||||
|
|
||||||
=========================================
|
|
||||||
INSTALLED PACKAGES
|
|
||||||
=========================================
|
|
||||||
$({ expac -S '%n %v (%r)' $(pacman -Qqe) 2>/dev/null; comm -13 <(pacman -Sql | sort) <(pacman -Qqe | sort) | xargs -r expac -Q '%n %v (AUR)'; } | sort)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
OPTIONS=("View log" "Save in current directory")
|
|
||||||
if ping -c 1 8.8.8.8 >/dev/null 2>&1; then
|
|
||||||
OPTIONS=("Upload log" "${OPTIONS[@]}")
|
|
||||||
fi
|
|
||||||
|
|
||||||
ACTION=$(gum choose "${OPTIONS[@]}")
|
|
||||||
|
|
||||||
case "$ACTION" in
|
|
||||||
"Upload log")
|
|
||||||
echo "Uploading debug log to 0x0.st..."
|
|
||||||
URL=$(curl -sF "file=@$LOG_FILE" -Fexpires=24 https://0x0.st)
|
|
||||||
if [ $? -eq 0 ] && [ -n "$URL" ]; then
|
|
||||||
echo "✓ Log uploaded successfully!"
|
|
||||||
echo "Share this URL:"
|
|
||||||
echo ""
|
|
||||||
echo " $URL"
|
|
||||||
echo ""
|
|
||||||
echo "This link will expire in 24 hours."
|
|
||||||
else
|
|
||||||
echo "Error: Failed to upload log file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
"View log")
|
|
||||||
less "$LOG_FILE"
|
|
||||||
;;
|
|
||||||
"Save in current directory")
|
|
||||||
cp "$LOG_FILE" "./omarchy-debug.log"
|
|
||||||
echo "✓ Log saved to $(pwd)/omarchy-debug.log"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# FIXME: Update behavior
|
|
||||||
cd ~/.local/share/omarchy
|
cd ~/.local/share/omarchy
|
||||||
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
|
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
|
||||||
touch $migration_file
|
touch $migration_file
|
||||||
|
|||||||
@@ -1,344 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Omarchy Disk Configuration Tool
|
|
||||||
|
|
||||||
Interactive partition editor and validator for Omarchy installations.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
|
||||||
def _find_root_partition(disk_config):
|
|
||||||
for dev_mod in disk_config.device_modifications:
|
|
||||||
for part in dev_mod.partitions:
|
|
||||||
if part.mountpoint == Path('/'):
|
|
||||||
return part
|
|
||||||
|
|
||||||
if part.btrfs_subvols:
|
|
||||||
for subvol in part.btrfs_subvols:
|
|
||||||
if subvol.mountpoint == Path('/'):
|
|
||||||
return part
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def validate_disk_config(config, interactive=True):
|
|
||||||
from archinstall.lib.models.device import FilesystemType, Size, Unit, EncryptionType
|
|
||||||
from archinstall.lib.output import info, warn
|
|
||||||
|
|
||||||
if not config.disk_config:
|
|
||||||
return 'CONTINUE'
|
|
||||||
|
|
||||||
validation_warnings = []
|
|
||||||
|
|
||||||
boot_partition = None
|
|
||||||
for dev_mod in config.disk_config.device_modifications:
|
|
||||||
for part in dev_mod.partitions:
|
|
||||||
if part.mountpoint == Path('/boot') or part.mountpoint == Path('/efi'):
|
|
||||||
boot_partition = part
|
|
||||||
break
|
|
||||||
|
|
||||||
if boot_partition:
|
|
||||||
min_boot_size = Size(2, Unit.GiB, boot_partition.length.sector_size)
|
|
||||||
if boot_partition.length >= min_boot_size:
|
|
||||||
size_gb = boot_partition.length.convert(Unit.GiB).value
|
|
||||||
info(f'✓ Boot partition size: {size_gb:.1f} GiB')
|
|
||||||
else:
|
|
||||||
size_mb = boot_partition.length.convert(Unit.MiB).value
|
|
||||||
warn(f'⚠ Boot partition is only {size_mb:.0f} MiB')
|
|
||||||
warn(' Omarchy recommends at least 2 GiB for boot partition')
|
|
||||||
warn(' Multiple kernels may not fit')
|
|
||||||
validation_warnings.append('boot_size')
|
|
||||||
else:
|
|
||||||
warn('⚠ Could not find boot partition (/boot or /efi)')
|
|
||||||
warn(' System may not boot correctly')
|
|
||||||
validation_warnings.append('no_boot')
|
|
||||||
|
|
||||||
root_partition = _find_root_partition(config.disk_config)
|
|
||||||
|
|
||||||
if root_partition:
|
|
||||||
if root_partition.fs_type == FilesystemType.Btrfs:
|
|
||||||
info('✓ Root filesystem is btrfs')
|
|
||||||
|
|
||||||
if root_partition.btrfs_subvols:
|
|
||||||
subvol_names = [str(sv.name) for sv in root_partition.btrfs_subvols]
|
|
||||||
subvol_mounts = {str(sv.mountpoint): str(sv.name) for sv in root_partition.btrfs_subvols}
|
|
||||||
|
|
||||||
required_subvols = {
|
|
||||||
'/': '@',
|
|
||||||
'/home': '@home',
|
|
||||||
'/var/log': '@log',
|
|
||||||
'/var/cache/pacman/pkg': '@pkg',
|
|
||||||
}
|
|
||||||
|
|
||||||
missing_subvols = []
|
|
||||||
for mount, expected_name in required_subvols.items():
|
|
||||||
if mount not in subvol_mounts:
|
|
||||||
missing_subvols.append(f'{expected_name} → {mount}')
|
|
||||||
elif subvol_mounts[mount] != expected_name:
|
|
||||||
warn(f'⚠ Subvolume at {mount} is named "{subvol_mounts[mount]}" not "{expected_name}"')
|
|
||||||
|
|
||||||
if missing_subvols:
|
|
||||||
warn(f'⚠ Missing recommended subvolumes: {", ".join(missing_subvols)}')
|
|
||||||
warn(' Omarchy recommends: @, @home, @log, @pkg')
|
|
||||||
warn(' Some features (like Snapper) may not work optimally')
|
|
||||||
info(f' Current subvolumes: {", ".join(subvol_names)}')
|
|
||||||
validation_warnings.append('missing_subvols')
|
|
||||||
else:
|
|
||||||
info(f'✓ Btrfs subvolumes: {", ".join(subvol_names)}')
|
|
||||||
else:
|
|
||||||
warn('⚠ Btrfs partition has no subvolumes defined')
|
|
||||||
warn(' Omarchy recommends subvolumes for snapshots')
|
|
||||||
warn(' Required: @ (root), @home, @log, @pkg')
|
|
||||||
validation_warnings.append('no_subvols')
|
|
||||||
else:
|
|
||||||
fs_name = root_partition.fs_type.value if root_partition.fs_type else 'unknown'
|
|
||||||
warn(f'⚠ Root filesystem is {fs_name}, not btrfs')
|
|
||||||
warn(' Omarchy is designed for btrfs with snapshots')
|
|
||||||
warn(' Some features may not work correctly')
|
|
||||||
validation_warnings.append('not_btrfs')
|
|
||||||
|
|
||||||
is_encrypted = False
|
|
||||||
if config.disk_config.disk_encryption:
|
|
||||||
enc = config.disk_config.disk_encryption
|
|
||||||
if enc.encryption_type != EncryptionType.NoEncryption:
|
|
||||||
is_encrypted = root_partition in enc.partitions
|
|
||||||
|
|
||||||
if is_encrypted:
|
|
||||||
info('✓ Root partition is encrypted with LUKS')
|
|
||||||
|
|
||||||
if config.disk_config.disk_encryption.iter_time != 2000:
|
|
||||||
old_time = config.disk_config.disk_encryption.iter_time
|
|
||||||
config.disk_config.disk_encryption.iter_time = 2000
|
|
||||||
info(f'✓ Adjusted iteration time: {old_time}ms → 2000ms')
|
|
||||||
else:
|
|
||||||
info('✓ Iteration time: 2000ms (optimal)')
|
|
||||||
else:
|
|
||||||
warn('⚠ Root partition is NOT encrypted')
|
|
||||||
warn(' Omarchy recommends LUKS encryption for security')
|
|
||||||
validation_warnings.append('no_encryption')
|
|
||||||
else:
|
|
||||||
warn('⚠ Could not identify root partition')
|
|
||||||
validation_warnings.append('no_root')
|
|
||||||
|
|
||||||
if validation_warnings and interactive:
|
|
||||||
import subprocess
|
|
||||||
import shutil
|
|
||||||
|
|
||||||
gum_path = shutil.which('gum')
|
|
||||||
if gum_path:
|
|
||||||
warn('')
|
|
||||||
|
|
||||||
try:
|
|
||||||
result = subprocess.run(
|
|
||||||
['gum', 'choose', '--header', 'Validation warnings detected. What would you like to do?',
|
|
||||||
'Re-edit partitions', 'Continue anyway', 'Abort'],
|
|
||||||
capture_output=True,
|
|
||||||
text=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
choice = result.stdout.strip() if result.stdout else ''
|
|
||||||
|
|
||||||
if choice == 'Re-edit partitions':
|
|
||||||
return 'RE_EDIT'
|
|
||||||
elif choice == 'Abort':
|
|
||||||
return 'ABORT'
|
|
||||||
else:
|
|
||||||
info('Continuing despite warnings')
|
|
||||||
return 'CONTINUE'
|
|
||||||
|
|
||||||
except (subprocess.CalledProcessError, KeyboardInterrupt):
|
|
||||||
return 'ABORT'
|
|
||||||
|
|
||||||
return 'CONTINUE'
|
|
||||||
|
|
||||||
|
|
||||||
def apply_omarchy_partition_defaults():
|
|
||||||
import archinstall.lib.interactions.disk_conf as disk_conf_module
|
|
||||||
from archinstall.lib.models.device import (
|
|
||||||
PartitionModification, ModificationStatus, PartitionType,
|
|
||||||
Size, Unit, SectorSize, FilesystemType, PartitionFlag,
|
|
||||||
DeviceModification, BDevice
|
|
||||||
)
|
|
||||||
from archinstall.lib.interactions.disk_conf import get_default_btrfs_subvols
|
|
||||||
from archinstall.lib.disk.device_handler import device_handler
|
|
||||||
|
|
||||||
def _boot_partition_2gib(sector_size: SectorSize, using_gpt: bool) -> PartitionModification:
|
|
||||||
flags = [PartitionFlag.BOOT]
|
|
||||||
size = Size(2, Unit.GiB, sector_size)
|
|
||||||
start = Size(1, Unit.MiB, sector_size)
|
|
||||||
if using_gpt:
|
|
||||||
flags.append(PartitionFlag.ESP)
|
|
||||||
|
|
||||||
return PartitionModification(
|
|
||||||
status=ModificationStatus.Create,
|
|
||||||
type=PartitionType.Primary,
|
|
||||||
start=start,
|
|
||||||
length=size,
|
|
||||||
mountpoint=Path('/boot'),
|
|
||||||
fs_type=FilesystemType.Fat32,
|
|
||||||
flags=flags,
|
|
||||||
)
|
|
||||||
|
|
||||||
def _select_main_filesystem_btrfs() -> FilesystemType:
|
|
||||||
return FilesystemType.Btrfs
|
|
||||||
|
|
||||||
def _select_mount_options_compressed() -> list[str]:
|
|
||||||
return ['compress=zstd']
|
|
||||||
|
|
||||||
def _suggest_single_disk_auto_subvolumes(
|
|
||||||
device: BDevice,
|
|
||||||
filesystem_type: FilesystemType | None = None,
|
|
||||||
separate_home: bool | None = None,
|
|
||||||
):
|
|
||||||
if not filesystem_type:
|
|
||||||
filesystem_type = FilesystemType.Btrfs
|
|
||||||
|
|
||||||
if filesystem_type == FilesystemType.Btrfs:
|
|
||||||
using_subvolumes = True
|
|
||||||
mount_options = ['compress=zstd']
|
|
||||||
else:
|
|
||||||
using_subvolumes = False
|
|
||||||
mount_options = []
|
|
||||||
|
|
||||||
sector_size = device.device_info.sector_size
|
|
||||||
device_modification = DeviceModification(device, wipe=True)
|
|
||||||
using_gpt = device_handler.partition_table.is_gpt()
|
|
||||||
|
|
||||||
boot_partition = _boot_partition_2gib(sector_size, using_gpt)
|
|
||||||
device_modification.add_partition(boot_partition)
|
|
||||||
|
|
||||||
total_size = device.device_info.total_size
|
|
||||||
available_space = total_size - boot_partition.length - Size(1, Unit.MiB, sector_size)
|
|
||||||
|
|
||||||
root_partition = PartitionModification(
|
|
||||||
status=ModificationStatus.Create,
|
|
||||||
type=PartitionType.Primary,
|
|
||||||
start=boot_partition.start + boot_partition.length,
|
|
||||||
length=available_space,
|
|
||||||
mountpoint=None if using_subvolumes else Path('/'),
|
|
||||||
fs_type=filesystem_type,
|
|
||||||
mount_options=mount_options,
|
|
||||||
)
|
|
||||||
|
|
||||||
if using_subvolumes:
|
|
||||||
root_partition.btrfs_subvols = get_default_btrfs_subvols()
|
|
||||||
|
|
||||||
device_modification.add_partition(root_partition)
|
|
||||||
return device_modification
|
|
||||||
|
|
||||||
disk_conf_module._boot_partition = _boot_partition_2gib
|
|
||||||
disk_conf_module.select_main_filesystem_format = _select_main_filesystem_btrfs
|
|
||||||
disk_conf_module.select_mount_options = _select_mount_options_compressed
|
|
||||||
disk_conf_module.suggest_single_disk_layout = _suggest_single_disk_auto_subvolumes
|
|
||||||
|
|
||||||
|
|
||||||
def load_config(config_file: Path, creds_file: Path | None = None):
|
|
||||||
from archinstall.lib.args import ArchConfig, Arguments
|
|
||||||
|
|
||||||
with open(config_file) as f:
|
|
||||||
config_data = json.load(f)
|
|
||||||
|
|
||||||
if creds_file and creds_file.exists():
|
|
||||||
with open(creds_file) as f:
|
|
||||||
creds_data = json.load(f)
|
|
||||||
config_data.update(creds_data)
|
|
||||||
|
|
||||||
args = Arguments(
|
|
||||||
config=config_file,
|
|
||||||
creds=creds_file,
|
|
||||||
mountpoint=Path('/mnt'),
|
|
||||||
silent=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
return ArchConfig.from_config(config_data, args)
|
|
||||||
|
|
||||||
|
|
||||||
def save_config(config, output_file: Path):
|
|
||||||
from archinstall.lib.output import info
|
|
||||||
|
|
||||||
try:
|
|
||||||
config_dict = config.safe_json()
|
|
||||||
with open(output_file, 'w') as f:
|
|
||||||
json.dump(config_dict, f, indent=2, default=str)
|
|
||||||
info(f'✓ Configuration saved to: {output_file}')
|
|
||||||
except Exception as e:
|
|
||||||
from archinstall.lib.output import error
|
|
||||||
error(f'Failed to save config: {e}')
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Omarchy Disk Configuration Tool')
|
|
||||||
parser.add_argument('--config', type=Path, required=True, help='Path to config file')
|
|
||||||
parser.add_argument('--creds', type=Path, help='Path to credentials file')
|
|
||||||
parser.add_argument('--output', type=Path, help='Output path (default: overwrites input)')
|
|
||||||
parser.add_argument('--non-interactive', action='store_true', help='Skip interactive prompts')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
output_file = args.output or args.config
|
|
||||||
|
|
||||||
if not args.config.exists():
|
|
||||||
print(f'ERROR: Config file not found: {args.config}', file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if args.creds and not args.creds.exists():
|
|
||||||
print(f'ERROR: Credentials file not found: {args.creds}', file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
try:
|
|
||||||
from archinstall.lib.output import info, error
|
|
||||||
from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu
|
|
||||||
from archinstall.tui.curses_menu import Tui
|
|
||||||
|
|
||||||
apply_omarchy_partition_defaults()
|
|
||||||
|
|
||||||
info('Loading configuration...')
|
|
||||||
config = load_config(args.config, args.creds)
|
|
||||||
|
|
||||||
if not config.disk_config:
|
|
||||||
error('No disk configuration found in config file')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
info('Launching partition editor...')
|
|
||||||
|
|
||||||
with Tui():
|
|
||||||
edited_disk_config = DiskLayoutConfigurationMenu(config.disk_config).run()
|
|
||||||
if edited_disk_config:
|
|
||||||
config.disk_config = edited_disk_config
|
|
||||||
info('✓ Partition configuration updated')
|
|
||||||
else:
|
|
||||||
info('No changes made in partition editor')
|
|
||||||
|
|
||||||
interactive = not args.non_interactive
|
|
||||||
validation_result = validate_disk_config(config, interactive=interactive)
|
|
||||||
|
|
||||||
if validation_result == 'RE_EDIT':
|
|
||||||
continue
|
|
||||||
elif validation_result == 'ABORT':
|
|
||||||
info('Disk configuration cancelled by user')
|
|
||||||
sys.exit(1)
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
save_config(config, output_file)
|
|
||||||
info('✓ Disk configuration complete!')
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print('\nCancelled by user', file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
except Exception as e:
|
|
||||||
print(f'ERROR: {e}', file=sys.stderr)
|
|
||||||
import traceback
|
|
||||||
traceback.print_exc()
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Drive, like /dev/nvme0, to display information about
|
|
||||||
if (($# == 0)); then
|
|
||||||
echo "Usage: omarchy-drive-info [/dev/drive]"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
drive="$1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Find the root drive in case we are looking at partitions
|
|
||||||
root_drive=$(lsblk -no PKNAME "$drive" 2>/dev/null | tail -n1)
|
|
||||||
if [[ -n "$root_drive" ]]; then
|
|
||||||
root_drive="/dev/$root_drive"
|
|
||||||
else
|
|
||||||
root_drive="$drive"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get basic disk information
|
|
||||||
size=$(lsblk -dno SIZE "$drive" 2>/dev/null)
|
|
||||||
model=$(lsblk -dno MODEL "$root_drive" 2>/dev/null)
|
|
||||||
|
|
||||||
# Format display string
|
|
||||||
display="$drive"
|
|
||||||
[[ -n "$size" ]] && display="$display ($size)"
|
|
||||||
[[ -n "$model" ]] && display="$display - $model"
|
|
||||||
|
|
||||||
echo "$display"
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Select a drive from a list with info that includes space and brand
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
|
||||||
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
|
|
||||||
else
|
|
||||||
drives="$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
drives_with_info=""
|
|
||||||
while IFS= read -r drive; do
|
|
||||||
[[ -n "$drive" ]] || continue
|
|
||||||
drives_with_info+="$(omarchy-drive-info "$drive")"$'\n'
|
|
||||||
done <<<"$drives"
|
|
||||||
|
|
||||||
selected_drive="$(printf "%s" "$drives_with_info" | gum choose --header "Select drive")" || exit 1
|
|
||||||
printf "%s\n" "$selected_drive" | awk '{print $1}'
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)
|
|
||||||
|
|
||||||
if [[ -n $encrypted_drives ]]; then
|
|
||||||
if [[ $(wc -l <<<"$encrypted_drives") -eq 1 ]]; then
|
|
||||||
drive_to_change="$encrypted_drives"
|
|
||||||
else
|
|
||||||
drive_to_change="$(omarchy-drive-select "$encrypted_drives")"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n $drive_to_change ]]; then
|
|
||||||
echo "Changing full-disk encryption password for $drive_to_change"
|
|
||||||
sudo cryptsetup luksChangeKey --pbkdf argon2id --iter-time 2000 "$drive_to_change"
|
|
||||||
else
|
|
||||||
echo "No drive selected."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "No encrypted drives available."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
5
bin/omarchy-ensure-aur-available
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! curl -s --connect-timeout 10 --head -A "omarchy-update" -o /dev/null "https://aur.archlinux.org/"; then
|
||||||
|
gum spin --spinner "globe" --title "The AUR package repository is currently unavailable, please try again later" -- sleep 2 && exit 1
|
||||||
|
fi
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
grep -oP 'font-family:\s*["'\'']?\K[^;"'\'']+' ~/.config/waybar/style.css | head -n1
|
grep -oP 'family\s*=\s*"\K[^"]+' ~/.config/alacritty/alacritty.toml | head -n1
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u
|
fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting' | sort -u
|
||||||
|
|||||||
@@ -4,20 +4,7 @@ font_name="$1"
|
|||||||
|
|
||||||
if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then
|
if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then
|
||||||
if fc-list | grep -iq "$font_name"; then
|
if fc-list | grep -iq "$font_name"; then
|
||||||
if [[ -f ~/.config/alacritty/alacritty.toml ]]; then
|
sed -i "s/family = \".*\"/family = \"$font_name\"/g" ~/.config/alacritty/alacritty.toml
|
||||||
sed -i "s/family = \".*\"/family = \"$font_name\"/g" ~/.config/alacritty/alacritty.toml
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f ~/.config/kitty/kitty.conf ]]; then
|
|
||||||
sed -i "s/^font_family .*/font_family $font_name/g" ~/.config/kitty/kitty.conf
|
|
||||||
pkill -USR1 kitty
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f ~/.config/ghostty/config ]]; then
|
|
||||||
sed -i "s/font-family = \".*\"/font-family = \"$font_name\"/g" ~/.config/ghostty/config
|
|
||||||
pkill -SIGUSR2 ghostty
|
|
||||||
fi
|
|
||||||
|
|
||||||
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css
|
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css
|
||||||
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css
|
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css
|
||||||
xmlstarlet ed -L \
|
xmlstarlet ed -L \
|
||||||
@@ -28,8 +15,6 @@ if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then
|
|||||||
omarchy-restart-waybar
|
omarchy-restart-waybar
|
||||||
omarchy-restart-swayosd
|
omarchy-restart-swayosd
|
||||||
omarchy-restart-walker
|
omarchy-restart-walker
|
||||||
|
|
||||||
omarchy-hook font-set "$font_name"
|
|
||||||
else
|
else
|
||||||
echo "Font '$font_name' not found."
|
echo "Font '$font_name' not found."
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [[ $# -lt 1 ]]; then
|
|
||||||
echo "Usage: omarchy-hook [name] [args...]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
HOOK=$1
|
|
||||||
HOOK_PATH="$HOME/.config/omarchy/hooks/$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [[ -f $HOOK_PATH ]]; then
|
|
||||||
bash "$HOOK_PATH" "$@"
|
|
||||||
fi
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Toggle to pop-out a tile to stay fixed on a display basis.
|
|
||||||
|
|
||||||
active=$(hyprctl activewindow -j)
|
|
||||||
pinned=$(echo "$active" | jq .pinned)
|
|
||||||
addr=$(echo "$active" | jq -r ".address")
|
|
||||||
[ -z "$addr" ] && { echo "No active window"; exit 0; }
|
|
||||||
|
|
||||||
if [ "$pinned" = "true" ]; then
|
|
||||||
hyprctl -q --batch \
|
|
||||||
"dispatch pin address:$addr;" \
|
|
||||||
"dispatch togglefloating address:$addr;" \
|
|
||||||
"dispatch tagwindow -pop address:$addr;"
|
|
||||||
else
|
|
||||||
hyprctl -q --batch \
|
|
||||||
"dispatch togglefloating address:$addr;" \
|
|
||||||
"dispatch centerwindow address:$addr;" \
|
|
||||||
"dispatch pin address:$addr;" \
|
|
||||||
"dispatch alterzorder top address:$addr;" \
|
|
||||||
"dispatch tagwindow +pop address:$addr;"
|
|
||||||
fi
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
workspace_id=$(hyprctl activeworkspace -j | jq -r .id)
|
|
||||||
gaps=$(hyprctl workspacerules -j | jq -r ".[] | select(.workspaceString==\"$workspace_id\") | .gapsOut[0] // 0")
|
|
||||||
|
|
||||||
if [[ $gaps == "0" ]]; then
|
|
||||||
hyprctl keyword "workspace $workspace_id, gapsout:10, gapsin:5, bordersize:2"
|
|
||||||
else \
|
|
||||||
hyprctl keyword "workspace $workspace_id, gapsout:0, gapsin:0, bordersize:0"
|
|
||||||
fi
|
|
||||||
@@ -1,258 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Omarchy Install
|
|
||||||
|
|
||||||
Installs Arch Linux with Omarchy customizations using archinstall as a library.
|
|
||||||
For disk configuration, use omarchy-disk-config.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
|
||||||
def load_config(config_file: Path, creds_file: Path | None = None):
|
|
||||||
from archinstall.lib.args import ArchConfig, Arguments
|
|
||||||
|
|
||||||
with open(config_file) as f:
|
|
||||||
config_data = json.load(f)
|
|
||||||
|
|
||||||
if creds_file and creds_file.exists():
|
|
||||||
with open(creds_file) as f:
|
|
||||||
creds_data = json.load(f)
|
|
||||||
config_data.update(creds_data)
|
|
||||||
|
|
||||||
args = Arguments(
|
|
||||||
config=config_file,
|
|
||||||
creds=creds_file,
|
|
||||||
mountpoint=Path('/mnt'),
|
|
||||||
silent=True,
|
|
||||||
skip_ntp=True,
|
|
||||||
skip_wkd=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
return ArchConfig.from_config(config_data, args)
|
|
||||||
|
|
||||||
|
|
||||||
def load_omarchy_packages() -> list[str]:
|
|
||||||
omarchy_path = Path('/usr/share/omarchy/install')
|
|
||||||
packages = []
|
|
||||||
|
|
||||||
base_packages_file = omarchy_path / 'omarchy-base.packages'
|
|
||||||
if base_packages_file.exists():
|
|
||||||
with open(base_packages_file) as f:
|
|
||||||
packages.extend([line.strip() for line in f if line.strip() and not line.startswith('#')])
|
|
||||||
|
|
||||||
return packages
|
|
||||||
|
|
||||||
|
|
||||||
def perform_installation(config_file: Path, creds_file: Path | None = None) -> None:
|
|
||||||
from archinstall.lib.disk.filesystem import FilesystemHandler
|
|
||||||
from archinstall.lib.installer import Installer
|
|
||||||
from archinstall.lib.models.device import DiskLayoutType, EncryptionType
|
|
||||||
from archinstall.lib.output import error, info
|
|
||||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
|
||||||
from archinstall.lib.authentication.authentication_handler import auth_handler
|
|
||||||
|
|
||||||
start_time = time.time()
|
|
||||||
|
|
||||||
info('Loading configuration...')
|
|
||||||
config = load_config(config_file, creds_file)
|
|
||||||
|
|
||||||
if not config.disk_config:
|
|
||||||
error('No disk configuration found in config file')
|
|
||||||
error('Use omarchy-disk-config to configure disk layout first')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
disk_config = config.disk_config
|
|
||||||
|
|
||||||
if disk_config.config_type != DiskLayoutType.Pre_mount:
|
|
||||||
info('Performing filesystem operations...')
|
|
||||||
fs_handler = FilesystemHandler(disk_config)
|
|
||||||
fs_handler.perform_filesystem_operations()
|
|
||||||
|
|
||||||
mountpoint = Path('/mnt')
|
|
||||||
|
|
||||||
info('Loading Omarchy base packages...')
|
|
||||||
omarchy_packages = load_omarchy_packages()
|
|
||||||
|
|
||||||
info('Starting Omarchy installation...')
|
|
||||||
|
|
||||||
with Installer(
|
|
||||||
mountpoint,
|
|
||||||
disk_config,
|
|
||||||
kernels=config.kernels or ['linux'],
|
|
||||||
) as installation:
|
|
||||||
|
|
||||||
info('Mounting filesystems...')
|
|
||||||
if disk_config.config_type != DiskLayoutType.Pre_mount:
|
|
||||||
installation.mount_ordered_layout()
|
|
||||||
|
|
||||||
installation.sanity_check()
|
|
||||||
|
|
||||||
if disk_config.disk_encryption and disk_config.disk_encryption.encryption_type != EncryptionType.NoEncryption:
|
|
||||||
info('Generating encryption keys...')
|
|
||||||
installation.generate_key_files()
|
|
||||||
|
|
||||||
if config.mirror_config:
|
|
||||||
info('Configuring mirrors...')
|
|
||||||
installation.set_mirrors(config.mirror_config, on_target=False)
|
|
||||||
|
|
||||||
info('Installing base system...')
|
|
||||||
installation.minimal_installation(
|
|
||||||
optional_repositories=config.mirror_config.optional_repositories if config.mirror_config else [],
|
|
||||||
mkinitcpio=not config.uki,
|
|
||||||
hostname=config.hostname,
|
|
||||||
locale_config=config.locale_config,
|
|
||||||
)
|
|
||||||
|
|
||||||
if config.mirror_config:
|
|
||||||
installation.set_mirrors(config.mirror_config, on_target=True)
|
|
||||||
|
|
||||||
if config.swap:
|
|
||||||
info('Setting up swap...')
|
|
||||||
installation.setup_swap('zram')
|
|
||||||
|
|
||||||
all_packages = omarchy_packages + (config.packages or [])
|
|
||||||
if all_packages:
|
|
||||||
info(f'Installing {len(all_packages)} packages...')
|
|
||||||
installation.add_additional_packages(all_packages)
|
|
||||||
|
|
||||||
if config.bootloader:
|
|
||||||
info(f'Installing bootloader: {config.bootloader.value}...')
|
|
||||||
installation.add_bootloader(config.bootloader, config.uki)
|
|
||||||
|
|
||||||
if config.network_config:
|
|
||||||
info('Configuring network...')
|
|
||||||
config.network_config.install_network_config(installation, config.profile_config)
|
|
||||||
|
|
||||||
if config.auth_config and config.auth_config.users:
|
|
||||||
info('Creating users...')
|
|
||||||
installation.create_users(config.auth_config.users)
|
|
||||||
auth_handler.setup_auth(installation, config.auth_config, config.hostname)
|
|
||||||
|
|
||||||
if config.app_config:
|
|
||||||
info('Installing applications...')
|
|
||||||
from archinstall.lib.applications.application_handler import application_handler
|
|
||||||
application_handler.install_applications(installation, config.app_config)
|
|
||||||
|
|
||||||
if config.profile_config:
|
|
||||||
info('Installing profile...')
|
|
||||||
profile_handler.install_profile_config(installation, config.profile_config)
|
|
||||||
|
|
||||||
if config.timezone:
|
|
||||||
installation.set_timezone(config.timezone)
|
|
||||||
|
|
||||||
if config.ntp:
|
|
||||||
installation.activate_time_synchronization()
|
|
||||||
|
|
||||||
from archinstall.lib.installer import accessibility_tools_in_use
|
|
||||||
if accessibility_tools_in_use():
|
|
||||||
installation.enable_espeakup()
|
|
||||||
|
|
||||||
if config.auth_config and config.auth_config.root_enc_password:
|
|
||||||
from archinstall.lib.models.users import User
|
|
||||||
root_user = User('root', config.auth_config.root_enc_password, False)
|
|
||||||
installation.set_user_password(root_user)
|
|
||||||
|
|
||||||
if config.profile_config and config.profile_config.profile:
|
|
||||||
config.profile_config.profile.post_install(installation)
|
|
||||||
|
|
||||||
if config.services:
|
|
||||||
info('Enabling services...')
|
|
||||||
installation.enable_service(config.services)
|
|
||||||
|
|
||||||
if disk_config.has_default_btrfs_vols():
|
|
||||||
btrfs_options = disk_config.btrfs_options
|
|
||||||
snapshot_config = btrfs_options.snapshot_config if btrfs_options else None
|
|
||||||
snapshot_type = snapshot_config.snapshot_type if snapshot_config else None
|
|
||||||
if snapshot_type:
|
|
||||||
installation.setup_btrfs_snapshot(snapshot_type, config.bootloader)
|
|
||||||
|
|
||||||
info('Mounting offline resources for chroot access...')
|
|
||||||
from archinstall.lib.general import SysCommand
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
|
|
||||||
offline_mirror_src = Path('/var/cache/omarchy/mirror/offline')
|
|
||||||
offline_mirror_dst = mountpoint / 'var/cache/omarchy/mirror/offline'
|
|
||||||
packages_src = Path('/opt/packages')
|
|
||||||
packages_dst = mountpoint / 'opt/packages'
|
|
||||||
|
|
||||||
os.makedirs(offline_mirror_dst, exist_ok=True)
|
|
||||||
os.makedirs(packages_dst, exist_ok=True)
|
|
||||||
|
|
||||||
if offline_mirror_src.exists():
|
|
||||||
SysCommand(f'mount --bind {offline_mirror_src} {offline_mirror_dst}')
|
|
||||||
|
|
||||||
if packages_src.exists():
|
|
||||||
SysCommand(f'mount --bind {packages_src} {packages_dst}')
|
|
||||||
|
|
||||||
pacman_conf_src = Path('/etc/pacman.conf')
|
|
||||||
pacman_conf_dst = mountpoint / 'etc/pacman.conf'
|
|
||||||
if pacman_conf_src.exists():
|
|
||||||
shutil.copy(pacman_conf_src, pacman_conf_dst)
|
|
||||||
|
|
||||||
info('Copying user info to chroot...')
|
|
||||||
os.makedirs(mountpoint / 'tmp', exist_ok=True)
|
|
||||||
|
|
||||||
if os.path.exists('/tmp/omarchy-user-name.txt'):
|
|
||||||
shutil.copy('/tmp/omarchy-user-name.txt', mountpoint / 'tmp/omarchy-user-name.txt')
|
|
||||||
if os.path.exists('/tmp/omarchy-user-email.txt'):
|
|
||||||
shutil.copy('/tmp/omarchy-user-email.txt', mountpoint / 'tmp/omarchy-user-email.txt')
|
|
||||||
|
|
||||||
if config.custom_commands:
|
|
||||||
info('Running Omarchy custom commands...')
|
|
||||||
from archinstall.lib.installer import run_custom_user_commands
|
|
||||||
run_custom_user_commands(config.custom_commands, installation)
|
|
||||||
|
|
||||||
info('Generating fstab...')
|
|
||||||
installation.genfstab()
|
|
||||||
|
|
||||||
end_time = time.time()
|
|
||||||
duration_seconds = int(end_time - start_time)
|
|
||||||
duration_mins = duration_seconds // 60
|
|
||||||
duration_secs = duration_seconds % 60
|
|
||||||
|
|
||||||
timing_file = mountpoint / 'tmp/omarchy-install-time.txt'
|
|
||||||
with open(timing_file, 'w') as f:
|
|
||||||
f.write(f"{duration_mins}m {duration_secs}s\n")
|
|
||||||
|
|
||||||
info(f'Installation complete! Total time: {duration_mins}m {duration_secs}s')
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Omarchy Install')
|
|
||||||
parser.add_argument('--config', type=Path, required=True, help='Path to config file')
|
|
||||||
parser.add_argument('--creds', type=Path, help='Path to credentials file')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
if not args.config.exists():
|
|
||||||
print(f'ERROR: Config file not found: {args.config}', file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if args.creds and not args.creds.exists():
|
|
||||||
print(f'ERROR: Credentials file not found: {args.creds}', file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
try:
|
|
||||||
perform_installation(
|
|
||||||
config_file=args.config,
|
|
||||||
creds_file=args.creds,
|
|
||||||
)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print('\nInstallation cancelled by user', file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
except Exception as e:
|
|
||||||
print(f'ERROR: Installation failed: {e}', file=sys.stderr)
|
|
||||||
import traceback
|
|
||||||
traceback.print_exc()
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -f ~/.config/chromium-flags.conf ]]; then
|
|
||||||
CONF=~/.config/chromium-flags.conf
|
|
||||||
|
|
||||||
grep -qxF -- "--oauth2-client-id=77185425430.apps.googleusercontent.com" "$CONF" ||
|
|
||||||
echo "--oauth2-client-id=77185425430.apps.googleusercontent.com" >>"$CONF"
|
|
||||||
|
|
||||||
grep -qxF -- "--oauth2-client-secret=OTJgUOQcT7lO7GsGZq2G4IlT" "$CONF" ||
|
|
||||||
echo "--oauth2-client-secret=OTJgUOQcT7lO7GsGZq2G4IlT" >>"$CONF"
|
|
||||||
|
|
||||||
echo "Now you can login to your Google Account in Chromium."
|
|
||||||
fi
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [[ -z "$1" ]]; then
|
if [[ -z "$1" ]]; then
|
||||||
echo "Usage: omarchy-install-dev-env <ruby|node|bun|go|laravel|symfony|php|python|elixir|phoenix|rust|java|ocaml|dotnet|clojure>" >&2
|
echo "Usage: omarchy-install-dev-env <ruby|node|bun|go|laravel|symfony|php|python|elixir|phoenix|rust|java|ocaml|dotnet>" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
install_php() {
|
install_php() {
|
||||||
sudo pacman -S php composer php-sqlite xdebug --noconfirm
|
yay -Sy php composer php-sqlite --noconfirm
|
||||||
|
|
||||||
# Install Path for Composer
|
# Install Path for Composer
|
||||||
if [[ ":$PATH:" != *":$HOME/.config/composer/vendor/bin:"* ]]; then
|
if [[ ":$PATH:" != *":$HOME/.config/composer/vendor/bin:"* ]]; then
|
||||||
@@ -28,33 +28,22 @@ install_php() {
|
|||||||
"pdo_mysql"
|
"pdo_mysql"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Enable Xdebug
|
|
||||||
sudo sed -i \
|
|
||||||
-e 's/^;zend_extension=xdebug.so/zend_extension=xdebug.so/' \
|
|
||||||
-e 's/^;xdebug.mode=debug/xdebug.mode=debug/' \
|
|
||||||
/etc/php/conf.d/xdebug.ini
|
|
||||||
|
|
||||||
for ext in "${extensions_to_enable[@]}"; do
|
for ext in "${extensions_to_enable[@]}"; do
|
||||||
sudo sed -i "s/^;extension=${ext}/extension=${ext}/" "$php_ini_path"
|
sudo sed -i "s/^;extension=${ext}/extension=${ext}/" "$php_ini_path"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
install_node() {
|
|
||||||
echo -e "Installing Node.js...\n"
|
|
||||||
mise use --global node@lts
|
|
||||||
}
|
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
ruby)
|
ruby)
|
||||||
echo -e "Installing Ruby on Rails...\n"
|
echo -e "Installing Ruby on Rails...\n"
|
||||||
omarchy-pkg-add libyaml
|
|
||||||
mise use --global ruby@latest
|
mise use --global ruby@latest
|
||||||
mise settings add idiomatic_version_file_enable_tools ruby
|
mise settings add idiomatic_version_file_enable_tools ruby
|
||||||
mise x ruby -- gem install rails --no-document
|
mise x ruby -- gem install rails --no-document
|
||||||
echo -e "\nYou can now run: rails new myproject"
|
echo -e "\nYou can now run: rails new myproject"
|
||||||
;;
|
;;
|
||||||
node)
|
node)
|
||||||
install_node
|
echo -e "Installing Node.js...\n"
|
||||||
|
mise use --global node@lts
|
||||||
;;
|
;;
|
||||||
bun)
|
bun)
|
||||||
echo -e "Installing Bun...\n"
|
echo -e "Installing Bun...\n"
|
||||||
@@ -75,14 +64,13 @@ php)
|
|||||||
laravel)
|
laravel)
|
||||||
echo -e "Installing PHP and Laravel...\n"
|
echo -e "Installing PHP and Laravel...\n"
|
||||||
install_php
|
install_php
|
||||||
install_node
|
|
||||||
composer global require laravel/installer
|
composer global require laravel/installer
|
||||||
echo -e "\nYou can now run: laravel new myproject"
|
echo -e "\nYou can now run: laravel new myproject"
|
||||||
;;
|
;;
|
||||||
symfony)
|
symfony)
|
||||||
echo -e "Installing PHP and Symfony...\n"
|
echo -e "Installing PHP and Symfony...\n"
|
||||||
install_php
|
install_php
|
||||||
omarchy-pkg-add symfony-cli
|
yay -S symfony-cli --noconfirm
|
||||||
echo -e "\nYou can now run: symfony new --webapp myproject"
|
echo -e "\nYou can now run: symfony new --webapp myproject"
|
||||||
;;
|
;;
|
||||||
python)
|
python)
|
||||||
@@ -120,7 +108,6 @@ java)
|
|||||||
zig)
|
zig)
|
||||||
echo -e "Installing Zig...\n"
|
echo -e "Installing Zig...\n"
|
||||||
mise use --global zig@latest
|
mise use --global zig@latest
|
||||||
mise use -g zls@latest
|
|
||||||
;;
|
;;
|
||||||
ocaml)
|
ocaml)
|
||||||
echo -e "Installing OCaml...\n"
|
echo -e "Installing OCaml...\n"
|
||||||
@@ -133,9 +120,4 @@ dotnet)
|
|||||||
echo -e "Installing .NET...\n"
|
echo -e "Installing .NET...\n"
|
||||||
mise use --global dotnet@latest
|
mise use --global dotnet@latest
|
||||||
;;
|
;;
|
||||||
clojure)
|
|
||||||
echo -e "Installing Clojure...\n"
|
|
||||||
omarchy-pkg-add rlwrap
|
|
||||||
mise use --global clojure@latest
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -1,24 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB" "MSSQL")
|
options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB")
|
||||||
|
choices=$(printf "%s\n" "${options[@]}" | gum choose --no-limit --header "Select databases (space to select, return to install, esc to cancel)") || main_menu
|
||||||
if [[ "$#" -eq 0 ]]; then
|
|
||||||
choices=$(printf "%s\n" "${options[@]}" | gum choose --header "Select database (return to install, esc to cancel)") || main_menu
|
|
||||||
else
|
|
||||||
choices="$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$choices" ]]; then
|
if [[ -n "$choices" ]]; then
|
||||||
for db in $choices; do
|
for db in $choices; do
|
||||||
case $db in
|
case $db in
|
||||||
MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;;
|
MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;;
|
||||||
PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres17 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:17 ;;
|
PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres16 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:16 ;;
|
||||||
MariaDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mariadb11 -e MARIADB_ROOT_PASSWORD= -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true mariadb:11.8 ;;
|
MariaDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mariadb11 -e MARIADB_ROOT_PASSWORD= -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true mariadb:11.8 ;;
|
||||||
Redis) sudo docker run -d --restart unless-stopped -p "127.0.0.1:6379:6379" --name=redis redis:7 ;;
|
Redis) sudo docker run -d --restart unless-stopped -p "127.0.0.1:6379:6379" --name=redis redis:7 ;;
|
||||||
MongoDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:27017:27017" --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin123 mongo:noble ;;
|
MongoDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:27017:27017" --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin123 mongo:noble ;;
|
||||||
MSSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:1433:1433" --name mssql -e MSSQL_PID=Developer -e ACCEPT_EULA=Y -e "MSSQL_SA_PASSWORD=@dmin123" mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04 ;;
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
else
|
|
||||||
echo "No databases selected for installation."
|
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
echo "Installing all dependencies..."
|
echo "Installing all dependencies..."
|
||||||
omarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox
|
yay -S --noconfirm --needed \
|
||||||
|
dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox
|
||||||
|
|
||||||
echo "Starting Dropbox..."
|
echo "Starting Dropbox..."
|
||||||
uwsm-app -- dropbox-cli start &>/dev/null &
|
uwsm app -- dropbox-cli start &>/dev/null &
|
||||||
echo "See Dropbox icon behind hover tray in top right and right-click for setup."
|
echo "See Dropbox icon behind hover tray in top right and right-click for setup."
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Omarchy Final Configurations Installer
|
|
||||||
#
|
|
||||||
# This script runs from archinstall's custom_commands after base packages
|
|
||||||
# and user creation. It switches to the created user and runs install.sh
|
|
||||||
# to complete package installation and system configuration.
|
|
||||||
#
|
|
||||||
# archinstall runs custom_commands as root via:
|
|
||||||
# arch-chroot -S /mnt bash /var/tmp/user-command.0.sh
|
|
||||||
#
|
|
||||||
|
|
||||||
set -eEo pipefail
|
|
||||||
|
|
||||||
# Setup comprehensive logging for chroot execution
|
|
||||||
# This ensures all output is captured even though we're running inside chroot
|
|
||||||
CHROOT_LOG_FILE="/var/log/omarchy-install-chroot.log"
|
|
||||||
mkdir -p "$(dirname "$CHROOT_LOG_FILE")"
|
|
||||||
touch "$CHROOT_LOG_FILE"
|
|
||||||
|
|
||||||
# Redirect all output to both the log file and stdout
|
|
||||||
# This way:
|
|
||||||
# 1. Output is saved to /var/log/omarchy-install-chroot.log (inside chroot = /mnt/var/log on ISO)
|
|
||||||
# 2. Output still goes to stdout so arch-chroot can potentially capture it
|
|
||||||
# 3. We use exec to redirect the entire script's output from this point forward
|
|
||||||
exec > >(tee -a "$CHROOT_LOG_FILE") 2>&1
|
|
||||||
|
|
||||||
# Log script start with timestamp
|
|
||||||
echo "========================================"
|
|
||||||
echo "Omarchy Chroot Install Starting"
|
|
||||||
echo "Started at: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
||||||
echo "Log file: $CHROOT_LOG_FILE"
|
|
||||||
echo "========================================"
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Find the first non-root user (UID >= 1000, < 60000)
|
|
||||||
OMARCHY_USER=$(getent passwd | awk -F: '$3 >= 1000 && $3 < 60000 {print $1; exit}')
|
|
||||||
|
|
||||||
if [[ -z "$OMARCHY_USER" ]]; then
|
|
||||||
echo "ERROR: No non-root user found!"
|
|
||||||
echo "Users created:"
|
|
||||||
getent passwd | awk -F: '$3 >= 1000 {print $1, $3}'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Setting up Omarchy for user: $OMARCHY_USER"
|
|
||||||
|
|
||||||
# Setup passwordless sudo (will be removed by post-install)
|
|
||||||
echo "Setting up passwordless sudo..."
|
|
||||||
mkdir -p /etc/sudoers.d
|
|
||||||
cat >/etc/sudoers.d/99-omarchy-installer <<EOF
|
|
||||||
root ALL=(ALL:ALL) NOPASSWD: ALL
|
|
||||||
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
|
|
||||||
$OMARCHY_USER ALL=(ALL:ALL) NOPASSWD: ALL
|
|
||||||
EOF
|
|
||||||
chmod 440 /etc/sudoers.d/99-omarchy-installer
|
|
||||||
|
|
||||||
# Get user info from /tmp (written by configurator)
|
|
||||||
if [[ -f /tmp/omarchy-user-name.txt ]]; then
|
|
||||||
OMARCHY_USER_NAME=$(cat /tmp/omarchy-user-name.txt)
|
|
||||||
else
|
|
||||||
OMARCHY_USER_NAME=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f /tmp/omarchy-user-email.txt ]]; then
|
|
||||||
OMARCHY_USER_EMAIL=$(cat /tmp/omarchy-user-email.txt)
|
|
||||||
else
|
|
||||||
OMARCHY_USER_EMAIL=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run install.sh as the user
|
|
||||||
echo "========================================"
|
|
||||||
echo "Running Omarchy installation as user: $OMARCHY_USER"
|
|
||||||
echo "========================================"
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Use runuser instead of su for better output handling
|
|
||||||
# runuser doesn't go through PAM and preserves stdout/stderr better
|
|
||||||
runuser -u "$OMARCHY_USER" -- bash -c "
|
|
||||||
set -eEo pipefail
|
|
||||||
export PYTHONUNBUFFERED=1
|
|
||||||
export OMARCHY_CHROOT_INSTALL=1
|
|
||||||
export OMARCHY_ARCHINSTALL_WRAPPER=1
|
|
||||||
export OMARCHY_USER='$OMARCHY_USER'
|
|
||||||
export OMARCHY_USER_NAME='$OMARCHY_USER_NAME'
|
|
||||||
export OMARCHY_USER_EMAIL='$OMARCHY_USER_EMAIL'
|
|
||||||
cd ~
|
|
||||||
source /usr/share/omarchy/install.sh
|
|
||||||
"
|
|
||||||
|
|
||||||
exit_code=$?
|
|
||||||
|
|
||||||
if [[ $exit_code -eq 0 ]]; then
|
|
||||||
echo
|
|
||||||
echo "========================================"
|
|
||||||
echo "Omarchy install.sh completed successfully!"
|
|
||||||
echo "========================================"
|
|
||||||
echo
|
|
||||||
echo "========================================"
|
|
||||||
echo "Omarchy Chroot Install Completed"
|
|
||||||
echo "Finished at: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
||||||
echo "Log file: $CHROOT_LOG_FILE"
|
|
||||||
echo "========================================"
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
echo "========================================"
|
|
||||||
echo "ERROR: Omarchy install.sh exited with code $exit_code"
|
|
||||||
echo "========================================"
|
|
||||||
exit $exit_code
|
|
||||||
fi
|
|
||||||
12
install/first-run/firewall.sh → bin/omarchy-install-firewall
Normal file → Executable file
@@ -1,3 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! command -v ufw &>/dev/null; then
|
||||||
|
yay -S --noconfirm --needed ufw ufw-docker
|
||||||
|
fi
|
||||||
|
|
||||||
# Allow nothing in, everything out
|
# Allow nothing in, everything out
|
||||||
sudo ufw default deny incoming
|
sudo ufw default deny incoming
|
||||||
sudo ufw default allow outgoing
|
sudo ufw default allow outgoing
|
||||||
@@ -6,15 +12,15 @@ sudo ufw default allow outgoing
|
|||||||
sudo ufw allow 53317/udp
|
sudo ufw allow 53317/udp
|
||||||
sudo ufw allow 53317/tcp
|
sudo ufw allow 53317/tcp
|
||||||
|
|
||||||
|
# Allow SSH in
|
||||||
|
sudo ufw allow 22/tcp
|
||||||
|
|
||||||
# Allow Docker containers to use DNS on host
|
# Allow Docker containers to use DNS on host
|
||||||
sudo ufw allow in proto udp from 172.16.0.0/12 to 172.17.0.1 port 53 comment 'allow-docker-dns'
|
sudo ufw allow in proto udp from 172.16.0.0/12 to 172.17.0.1 port 53 comment 'allow-docker-dns'
|
||||||
|
|
||||||
# Turn on the firewall
|
# Turn on the firewall
|
||||||
sudo ufw --force enable
|
sudo ufw --force enable
|
||||||
|
|
||||||
# Enable UFW systemd service to start on boot
|
|
||||||
sudo systemctl enable ufw
|
|
||||||
|
|
||||||
# Turn on Docker protections
|
# Turn on Docker protections
|
||||||
sudo ufw-docker install
|
sudo ufw-docker install
|
||||||
sudo ufw reload
|
sudo ufw reload
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "Adding multilib repository for 32-bit compatibility"
|
||||||
|
sudo sed -i '/^\s*#\[multilib\]/,/^$/{s/^\s*#//}' /etc/pacman.conf
|
||||||
|
sudo pacman -Sy
|
||||||
|
|
||||||
echo "Now pick dependencies matching your graphics card"
|
echo "Now pick dependencies matching your graphics card"
|
||||||
sudo pacman -Syu --noconfirm steam
|
yay -S steam
|
||||||
setsid gtk-launch steam >/dev/null 2>&1 &
|
setsid gtk-launch steam >/dev/null 2>&1 &
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
|
||||||
echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
package="$1"
|
|
||||||
|
|
||||||
# Map package name to desktop entry ID
|
|
||||||
case "$package" in
|
|
||||||
alacritty)
|
|
||||||
desktop_id="Alacritty.desktop"
|
|
||||||
;;
|
|
||||||
ghostty)
|
|
||||||
desktop_id="com.mitchellh.ghostty.desktop"
|
|
||||||
;;
|
|
||||||
kitty)
|
|
||||||
desktop_id="kitty.desktop"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unknown terminal: $package"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Install package
|
|
||||||
if omarchy-pkg-add $package; then
|
|
||||||
# Set as default terminal
|
|
||||||
echo "Setting $package as new default terminal..."
|
|
||||||
sed -i "/export TERMINAL=/ c\export TERMINAL=$package" ~/.config/uwsm/default
|
|
||||||
|
|
||||||
# Copy custom desktop entry for alacritty with X-TerminalArg* keys
|
|
||||||
if [ "$package" = "alacritty" ]; then
|
|
||||||
mkdir -p ~/.local/share/applications
|
|
||||||
cp "$OMARCHY_PATH/applications/Alacritty.desktop" ~/.local/share/applications/
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update xdg-terminals.list to prioritize the proper terminal
|
|
||||||
cat > ~/.config/xdg-terminals.list << EOF
|
|
||||||
# Terminal emulator preference order for xdg-terminal-exec
|
|
||||||
# The first found and valid terminal will be used
|
|
||||||
$desktop_id
|
|
||||||
EOF
|
|
||||||
else
|
|
||||||
echo "Failed to install $package"
|
|
||||||
fi
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
echo "Installing VSCode..."
|
|
||||||
omarchy-pkg-add visual-studio-code-bin
|
|
||||||
|
|
||||||
mkdir -p ~/.vscode ~/.config/Code/User
|
|
||||||
|
|
||||||
cat > ~/.vscode/argv.json << 'EOF'
|
|
||||||
// This configuration file allows you to pass permanent command line arguments to VS Code.
|
|
||||||
// Only a subset of arguments is currently supported to reduce the likelihood of breaking
|
|
||||||
// the installation.
|
|
||||||
//
|
|
||||||
// PLEASE DO NOT CHANGE WITHOUT UNDERSTANDING THE IMPACT
|
|
||||||
//
|
|
||||||
// NOTE: Changing this file requires a restart of VS Code.
|
|
||||||
{
|
|
||||||
"password-store":"gnome-libsecret"
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Ensure VSC's own auto-update feature is turned off
|
|
||||||
printf '{\n "update.mode": "none"\n}\n' > ~/.config/Code/User/settings.json
|
|
||||||
|
|
||||||
# Apply Omarchy theme to VSCode
|
|
||||||
omarchy-theme-set-vscode
|
|
||||||
|
|
||||||
setsid gtk-launch code
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Omarchy -e bash -c 'fastfetch; read -n 1 -s'
|
|
||||||
@@ -1,12 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
default_browser=$(xdg-settings get default-web-browser)
|
exec setsid uwsm app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,/usr}/share/applications/$(xdg-settings get default-web-browser) 2>/dev/null | head -1) ${args[@]} $@
|
||||||
browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)
|
|
||||||
|
|
||||||
if [[ $browser_exec =~ (firefox|zen|librewolf) ]]; then
|
|
||||||
private_flag="--private-window"
|
|
||||||
else
|
|
||||||
private_flag="--incognito"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec setsid uwsm-app -- "$browser_exec" "${@/--private/$private_flag}"
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
omarchy-cmd-present "$EDITOR" || EDITOR=nvim
|
|
||||||
|
|
||||||
case "$EDITOR" in
|
|
||||||
nvim | vim | nano | micro | hx | helix)
|
|
||||||
exec setsid uwsm-app -- xdg-terminal-exec "$EDITOR" "$@"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
exec setsid uwsm-app -- "$EDITOR" "$@"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
cmd="$*"
|
|
||||||
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Omarchy --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done"
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
|
||||||
echo "Usage: omarchy-launch-or-focus [window-pattern] [launch-command]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
WINDOW_PATTERN="$1"
|
|
||||||
LAUNCH_COMMAND="${2:-"uwsm-app -- $WINDOW_PATTERN"}"
|
|
||||||
WINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p "$WINDOW_PATTERN" '.[]|select((.class|test("\\b" + $p + "\\b";"i")) or (.title|test("\\b" + $p + "\\b";"i")))|.address' | head -n1)
|
|
||||||
|
|
||||||
if [[ -n $WINDOW_ADDRESS ]]; then
|
|
||||||
hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS"
|
|
||||||
else
|
|
||||||
eval exec $LAUNCH_COMMAND
|
|
||||||
fi
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
|
||||||
echo "Usage: omarchy-launch-or-focus-webapp [window-pattern] [url-and-flags...]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
WINDOW_PATTERN="$1"
|
|
||||||
shift
|
|
||||||
LAUNCH_COMMAND="omarchy-launch-webapp $@"
|
|
||||||
|
|
||||||
exec omarchy-launch-or-focus "$WINDOW_PATTERN" "$LAUNCH_COMMAND"
|
|
||||||
@@ -1,10 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Exit early if we don't have the tte show
|
|
||||||
if ! command -v tte &>/dev/null; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Exit early if screensave is already running
|
# Exit early if screensave is already running
|
||||||
pgrep -f "alacritty --class Screensaver" && exit 0
|
pgrep -f "alacritty --class Screensaver" && exit 0
|
||||||
|
|
||||||
@@ -17,8 +12,6 @@ focused=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')
|
|||||||
|
|
||||||
for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
|
for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
|
||||||
hyprctl dispatch focusmonitor $m
|
hyprctl dispatch focusmonitor $m
|
||||||
|
|
||||||
# FIXME: Find a way to make this generic where we it can work for kitty + ghostty
|
|
||||||
hyprctl dispatch exec -- \
|
hyprctl dispatch exec -- \
|
||||||
alacritty --class Screensaver \
|
alacritty --class Screensaver \
|
||||||
--config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \
|
--config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Ensure elephant is running before launching walker
|
|
||||||
if ! pgrep -x elephant > /dev/null; then
|
|
||||||
setsid uwsm-app -- elephant &
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ensure walker service is running
|
|
||||||
if ! pgrep -f "walker --gapplication-service" > /dev/null; then
|
|
||||||
setsid uwsm-app -- walker --gapplication-service &
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec walker --width 644 --maxheight 300 --minheight 300 "$@"
|
|
||||||
@@ -3,8 +3,8 @@
|
|||||||
browser=$(xdg-settings get default-web-browser)
|
browser=$(xdg-settings get default-web-browser)
|
||||||
|
|
||||||
case $browser in
|
case $browser in
|
||||||
google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi* | helium-browser*) ;;
|
google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi*) ;;
|
||||||
*) browser="chromium.desktop" ;;
|
*) browser="chromium.desktop" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
exec setsid uwsm-app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$browser 2>/dev/null | head -1) --app="$1" "${@:2}"
|
exec setsid uwsm app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,/usr}/share/applications/$browser 2>/dev/null | head -1) --app="$1" "${@:2}"
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Impala -e impala "$@"
|
|
||||||
281
bin/omarchy-menu
@@ -2,21 +2,6 @@
|
|||||||
|
|
||||||
export PATH="$HOME/.local/share/omarchy/bin:$PATH"
|
export PATH="$HOME/.local/share/omarchy/bin:$PATH"
|
||||||
|
|
||||||
# Set to true when going directly to a submenu, so we can exit directly
|
|
||||||
BACK_TO_EXIT=false
|
|
||||||
|
|
||||||
back_to() {
|
|
||||||
local parent_menu="$1"
|
|
||||||
|
|
||||||
if [[ "$BACK_TO_EXIT" == "true" ]]; then
|
|
||||||
exit 0
|
|
||||||
elif [[ -n "$parent_menu" ]]; then
|
|
||||||
"$parent_menu"
|
|
||||||
else
|
|
||||||
show_main_menu
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
menu() {
|
menu() {
|
||||||
local prompt="$1"
|
local prompt="$1"
|
||||||
local options="$2"
|
local options="$2"
|
||||||
@@ -29,48 +14,36 @@ menu() {
|
|||||||
local index
|
local index
|
||||||
index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1)
|
index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1)
|
||||||
if [[ -n "$index" ]]; then
|
if [[ -n "$index" ]]; then
|
||||||
args+=("-c" "$index")
|
args+=("-a" "$index")
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "$options" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 600 -p "$prompt…" "${args[@]}" 2>/dev/null
|
echo -e "$options" | walker --dmenu --theme dmenu_250 -p "$prompt…" "${args[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
terminal() {
|
terminal() {
|
||||||
xdg-terminal-exec --app-id=com.omarchy.Omarchy "$@"
|
alacritty --class Omarchy -e "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
present_terminal() {
|
present_terminal() {
|
||||||
omarchy-launch-floating-terminal-with-presentation $1
|
alacritty --class Omarchy -e bash -c "omarchy-show-logo; eval \"$1\"; omarchy-show-done;"
|
||||||
}
|
}
|
||||||
|
|
||||||
open_in_editor() {
|
edit_in_nvim() {
|
||||||
notify-send "Editing config file" "$1"
|
notify-send "Editing config file" "$1"
|
||||||
omarchy-launch-editor "$1"
|
alacritty -e nvim "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
install() {
|
install() {
|
||||||
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm $2"
|
present_terminal "echo 'Installing $1...'; yay -Sy --noconfirm $2"
|
||||||
}
|
}
|
||||||
|
|
||||||
install_and_launch() {
|
install_and_launch() {
|
||||||
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm $2 && setsid gtk-launch $3"
|
present_terminal "echo 'Installing $1...'; yay -Sy --noconfirm $2 && setsid gtk-launch $3"
|
||||||
}
|
}
|
||||||
|
|
||||||
install_font() {
|
install_font() {
|
||||||
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm --needed $2 && sleep 2 && omarchy-font-set '$3'"
|
present_terminal "echo 'Installing $1...'; yay -Sy --noconfirm --needed $2 && sleep 2 && omarchy-font-set '$3'"
|
||||||
}
|
|
||||||
|
|
||||||
install_terminal() {
|
|
||||||
present_terminal "omarchy-install-terminal $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
aur_install() {
|
|
||||||
present_terminal "echo 'Installing $1 from AUR...'; yay -S --noconfirm $2"
|
|
||||||
}
|
|
||||||
|
|
||||||
aur_install_and_launch() {
|
|
||||||
present_terminal "echo 'Installing $1 from AUR...'; yay -S --noconfirm $2 && setsid gtk-launch $3"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
show_learn_menu() {
|
show_learn_menu() {
|
||||||
@@ -85,49 +58,58 @@ show_learn_menu() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_trigger_menu() {
|
show_style_menu() {
|
||||||
case $(menu "Trigger" " Capture\n Share\n Toggle") in
|
case $(menu "Style" " Theme\n Font\n Background\n Screensaver\n About") in
|
||||||
*Capture*) show_capture_menu ;;
|
*Theme*) show_theme_menu ;;
|
||||||
*Share*) show_share_menu ;;
|
*Font*) show_font_menu ;;
|
||||||
*Toggle*) show_toggle_menu ;;
|
*Background*) omarchy-theme-bg-next ;;
|
||||||
|
*Screensaver*) edit_in_nvim ~/.config/omarchy/branding/screensaver.txt ;;
|
||||||
|
*About*) edit_in_nvim ~/.config/omarchy/branding/about.txt ;;
|
||||||
*) show_main_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
show_theme_menu() {
|
||||||
|
theme=$(menu "Theme" "$(omarchy-theme-list)" "" "$(omarchy-theme-current)")
|
||||||
|
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
|
||||||
|
show_main_menu
|
||||||
|
else
|
||||||
|
omarchy-theme-set "$theme"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
show_font_menu() {
|
||||||
|
theme=$(menu "Font" "$(omarchy-font-list)" "-w 350" "$(omarchy-font-current)")
|
||||||
|
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
|
||||||
|
show_main_menu
|
||||||
|
else
|
||||||
|
omarchy-font-set "$theme"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
show_capture_menu() {
|
show_capture_menu() {
|
||||||
case $(menu "Capture" " Screenshot\n Screenrecord\n Color") in
|
case $(menu "Capture" " Screenshot\n Screenrecord\n Color") in
|
||||||
*Screenshot*) show_screenshot_menu ;;
|
*Screenshot*) show_screenshot_menu ;;
|
||||||
*Screenrecord*) show_screenrecord_menu ;;
|
*Screenrecord*) show_screenrecord_menu ;;
|
||||||
*Color*) pkill hyprpicker || hyprpicker -a ;;
|
*Color*) pkill hyprpicker || hyprpicker -a ;;
|
||||||
*) show_trigger_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_screenshot_menu() {
|
show_screenshot_menu() {
|
||||||
case $(menu "Screenshot" " Snap with Editing\n Straight to Clipboard") in
|
case $(menu "Screenshot" " Region\n Window\n Display") in
|
||||||
*Editing*) omarchy-cmd-screenshot smart ;;
|
*Region*) omarchy-cmd-screenshot ;;
|
||||||
*Clipboard*) omarchy-cmd-screenshot smart clipboard ;;
|
*Window*) omarchy-cmd-screenshot window ;;
|
||||||
|
*Display*) omarchy-cmd-screenshot output ;;
|
||||||
*) show_capture_menu ;;
|
*) show_capture_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_screenrecord_menu() {
|
show_screenrecord_menu() {
|
||||||
case $(menu "Screenrecord" " Region\n Region + Audio\n Display\n Display + Audio\n Display + Webcam") in
|
case $(menu "Screenrecord" " Region\n Display") in
|
||||||
*"Region + Audio"*) omarchy-cmd-screenrecord region --with-audio ;;
|
|
||||||
*Region*) omarchy-cmd-screenrecord ;;
|
*Region*) omarchy-cmd-screenrecord ;;
|
||||||
*"Display + Audio"*) omarchy-cmd-screenrecord output --with-audio ;;
|
|
||||||
*"Display + Webcam"*) omarchy-cmd-screenrecord output --with-audio --with-webcam ;;
|
|
||||||
*Display*) omarchy-cmd-screenrecord output ;;
|
*Display*) omarchy-cmd-screenrecord output ;;
|
||||||
*) back_to show_capture_menu ;;
|
*) show_capture_menu ;;
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
show_share_menu() {
|
|
||||||
case $(menu "Share" " Clipboard\n File \n Folder") in
|
|
||||||
*Clipboard*) terminal bash -c "omarchy-cmd-share clipboard" ;;
|
|
||||||
*File*) terminal bash -c "omarchy-cmd-share file" ;;
|
|
||||||
*Folder*) terminal bash -c "omarchy-cmd-share folder" ;;
|
|
||||||
*) back_to show_trigger_menu ;;
|
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,64 +119,27 @@ show_toggle_menu() {
|
|||||||
*Nightlight*) omarchy-toggle-nightlight ;;
|
*Nightlight*) omarchy-toggle-nightlight ;;
|
||||||
*Idle*) omarchy-toggle-idle ;;
|
*Idle*) omarchy-toggle-idle ;;
|
||||||
*Bar*) omarchy-toggle-waybar ;;
|
*Bar*) omarchy-toggle-waybar ;;
|
||||||
*) show_trigger_menu ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
show_style_menu() {
|
|
||||||
case $(menu "Style" " Theme\n Font\n Background\n Hyprland\n Screensaver\n About") in
|
|
||||||
*Theme*) show_theme_menu ;;
|
|
||||||
*Font*) show_font_menu ;;
|
|
||||||
*Background*) omarchy-theme-bg-next ;;
|
|
||||||
*Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;;
|
|
||||||
*Screensaver*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;;
|
|
||||||
*About*) open_in_editor ~/.config/omarchy/branding/about.txt ;;
|
|
||||||
*) show_main_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_theme_menu() {
|
|
||||||
theme=$(menu "Theme" "$(omarchy-theme-list)" "" "$(omarchy-theme-current)")
|
|
||||||
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
|
|
||||||
back_to show_style_menu
|
|
||||||
else
|
|
||||||
omarchy-theme-set "$theme"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
show_font_menu() {
|
|
||||||
theme=$(menu "Font" "$(omarchy-font-list)" "--width 350" "$(omarchy-font-current)")
|
|
||||||
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
|
|
||||||
back_to show_style_menu
|
|
||||||
else
|
|
||||||
omarchy-font-set "$theme"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
show_setup_menu() {
|
show_setup_menu() {
|
||||||
local options=" Audio\n Wifi\n Bluetooth\n Power Profile\n Monitors"
|
local options=" Audio\n Wifi\n Bluetooth\n Power Profile\n Monitors"
|
||||||
[ -f ~/.config/hypr/bindings.conf ] && options="$options\n Keybindings"
|
[ -f ~/.config/hypr/bindings.conf ] && options="$options\n Keybindings"
|
||||||
[ -f ~/.config/hypr/input.conf ] && options="$options\n Input"
|
[ -f ~/.config/hypr/input.conf ] && options="$options\n Input"
|
||||||
options="$options\n Defaults\n DNS\n Security\n Config"
|
options="$options\n Config\n Fingerprint\n Fido2"
|
||||||
|
|
||||||
case $(menu "Setup" "$options") in
|
case $(menu "Setup" "$options") in
|
||||||
*Audio*) xdg-terminal-exec --app-id=com.omarchy.Wiremix -e wiremix ;;
|
*Audio*) alacritty --class=Wiremix -e wiremix ;;
|
||||||
*Wifi*)
|
*Wifi*) alacritty --class=Impala -e bash -c "rfkill unblock wifi; impala" ;;
|
||||||
rfkill unblock wifi
|
*Bluetooth*) blueberry ;;
|
||||||
omarchy-launch-wifi
|
|
||||||
;;
|
|
||||||
*Bluetooth*)
|
|
||||||
rfkill unblock bluetooth
|
|
||||||
blueberry
|
|
||||||
;;
|
|
||||||
*Power*) show_setup_power_menu ;;
|
*Power*) show_setup_power_menu ;;
|
||||||
*Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;;
|
*Monitors*) edit_in_nvim ~/.config/hypr/monitors.conf ;;
|
||||||
*Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;;
|
*Keybindings*) edit_in_nvim ~/.config/hypr/bindings.conf ;;
|
||||||
*Input*) open_in_editor ~/.config/hypr/input.conf ;;
|
*Input*) edit_in_nvim ~/.config/hypr/input.conf ;;
|
||||||
*Defaults*) open_in_editor ~/.config/uwsm/default ;;
|
|
||||||
*DNS*) present_terminal omarchy-setup-dns ;;
|
|
||||||
*Security*) show_setup_security_menu ;;
|
|
||||||
*Config*) show_setup_config_menu ;;
|
*Config*) show_setup_config_menu ;;
|
||||||
|
*Fingerprint*) present_terminal omarchy-setup-fingerprint ;;
|
||||||
|
*Fido2*) present_terminal omarchy-setup-fido2 ;;
|
||||||
*) show_main_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
@@ -203,7 +148,7 @@ show_setup_power_menu() {
|
|||||||
profile=$(menu "Power Profile" "$(omarchy-powerprofiles-list)" "" "$(powerprofilesctl get)")
|
profile=$(menu "Power Profile" "$(omarchy-powerprofiles-list)" "" "$(powerprofilesctl get)")
|
||||||
|
|
||||||
if [[ "$profile" == "CNCLD" || -z "$profile" ]]; then
|
if [[ "$profile" == "CNCLD" || -z "$profile" ]]; then
|
||||||
back_to show_setup_menu
|
show_main_menu
|
||||||
else
|
else
|
||||||
powerprofilesctl set "$profile"
|
powerprofilesctl set "$profile"
|
||||||
fi
|
fi
|
||||||
@@ -211,99 +156,69 @@ show_setup_power_menu() {
|
|||||||
|
|
||||||
show_setup_config_menu() {
|
show_setup_config_menu() {
|
||||||
case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n Walker\n Waybar\n XCompose") in
|
case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n Walker\n Waybar\n XCompose") in
|
||||||
*Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;;
|
*Hyprland*) edit_in_nvim ~/.config/hypr/hyprland.conf ;;
|
||||||
*Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;;
|
*Hypridle*) edit_in_nvim ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;;
|
||||||
*Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;;
|
*Hyprlock*) edit_in_nvim ~/.config/hypr/hyprlock.conf ;;
|
||||||
*Hyprsunset*) open_in_editor ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;;
|
*Hyprsunset*) edit_in_nvim ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;;
|
||||||
*Swayosd*) open_in_editor ~/.config/swayosd/config.toml && omarchy-restart-swayosd ;;
|
*Swayosd*) edit_in_nvim ~/.config/swayosd/config.toml && omarchy-restart-swayosd ;;
|
||||||
*Walker*) open_in_editor ~/.config/walker/config.toml && omarchy-restart-walker ;;
|
*Walker*) edit_in_nvim ~/.config/walker/config.toml && omarchy-restart-walker ;;
|
||||||
*Waybar*) open_in_editor ~/.config/waybar/config.jsonc && omarchy-restart-waybar ;;
|
*Waybar*) edit_in_nvim ~/.config/waybar/config.jsonc && omarchy-restart-waybar ;;
|
||||||
*XCompose*) open_in_editor ~/.XCompose && omarchy-restart-xcompose ;;
|
*XCompose*) edit_in_nvim ~/.XCompose && omarchy-restart-xcompose ;;
|
||||||
*) show_main_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_setup_security_menu() {
|
|
||||||
case $(menu "Setup" " Fingerprint\n Fido2") in
|
|
||||||
*Fingerprint*) present_terminal omarchy-setup-fingerprint ;;
|
|
||||||
*Fido2*) present_terminal omarchy-setup-fido2 ;;
|
|
||||||
*) show_setup_menu ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
show_install_menu() {
|
show_install_menu() {
|
||||||
case $(menu "Install" " Package\n AUR\n Web App\n TUI\n Service\n Style\n Development\n Editor\n Terminal\n AI\n Windows\n Gaming") in
|
case $(menu "Install" " Package\n Web App\n TUI\n Service\n Style\n Development\n Editor\n AI\n Gaming") in
|
||||||
*Package*) terminal omarchy-pkg-install ;;
|
*Package*) terminal omarchy-pkg-install ;;
|
||||||
*AUR*) terminal omarchy-pkg-aur-install ;;
|
|
||||||
*Web*) present_terminal omarchy-webapp-install ;;
|
*Web*) present_terminal omarchy-webapp-install ;;
|
||||||
*TUI*) present_terminal omarchy-tui-install ;;
|
*TUI*) present_terminal omarchy-tui-install ;;
|
||||||
*Service*) show_install_service_menu ;;
|
*Service*) show_install_service_menu ;;
|
||||||
*Style*) show_install_style_menu ;;
|
*Style*) show_install_style_menu ;;
|
||||||
*Development*) show_install_development_menu ;;
|
*Development*) show_install_development_menu ;;
|
||||||
*Editor*) show_install_editor_menu ;;
|
*Editor*) show_install_editor_menu ;;
|
||||||
*Terminal*) show_install_terminal_menu ;;
|
|
||||||
*AI*) show_install_ai_menu ;;
|
*AI*) show_install_ai_menu ;;
|
||||||
*Windows*) present_terminal "omarchy-windows-vm install" ;;
|
|
||||||
*Gaming*) show_install_gaming_menu ;;
|
*Gaming*) show_install_gaming_menu ;;
|
||||||
*) show_main_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_install_service_menu() {
|
show_install_service_menu() {
|
||||||
case $(menu "Install" " Dropbox\n Tailscale\n Bitwarden\n Chromium Account") in
|
case $(menu "Install" " Firewall\n Dropbox\n Tailscale") in
|
||||||
|
*Firewall*) present_terminal omarchy-install-firewall ;;
|
||||||
*Dropbox*) present_terminal omarchy-install-dropbox ;;
|
*Dropbox*) present_terminal omarchy-install-dropbox ;;
|
||||||
*Tailscale*) present_terminal omarchy-install-tailscale ;;
|
*Tailscale*) present_terminal omarchy-install-tailscale ;;
|
||||||
*Bitwarden*) install_and_launch "Bitwarden" "bitwarden bitwarden-cli" "bitwarden" ;;
|
|
||||||
*Chromium*) present_terminal omarchy-install-chromium-google-account ;;
|
|
||||||
*) show_install_menu ;;
|
*) show_install_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_install_editor_menu() {
|
show_install_editor_menu() {
|
||||||
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in
|
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix") in
|
||||||
*VSCode*) present_terminal omarchy-install-vscode ;;
|
*VSCode*) install_and_launch "VSCode" "visual-studio-code-bin" "code" ;;
|
||||||
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
|
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
|
||||||
*Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;;
|
*Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;;
|
||||||
*Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
|
*Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
|
||||||
*Helix*) install "Helix" "helix" ;;
|
*Helix*) install "Helix" "helix" ;;
|
||||||
*Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;;
|
|
||||||
*) show_install_menu ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
show_install_terminal_menu() {
|
|
||||||
case $(menu "Install" " Alacritty\n Ghostty\n Kitty") in
|
|
||||||
*Alacritty*) install_terminal "alacritty" ;;
|
|
||||||
*Ghostty*) install_terminal "ghostty" ;;
|
|
||||||
*Kitty*) install_terminal "kitty" ;;
|
|
||||||
*) show_install_menu ;;
|
*) show_install_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_install_ai_menu() {
|
show_install_ai_menu() {
|
||||||
ollama_pkg=$(
|
case $(menu "Install" " Claude Code\n Gemini\n LM Studio\n Ollama\n Crush\n opencode") in
|
||||||
(command -v nvidia-smi &>/dev/null && echo ollama-cuda) ||
|
|
||||||
(command -v rocminfo &>/dev/null && echo ollama-rocm) ||
|
|
||||||
echo ollama
|
|
||||||
)
|
|
||||||
|
|
||||||
case $(menu "Install" " Claude Code\n Cursor CLI\n Gemini\n OpenAI Codex\n LM Studio\n Ollama\n Crush\n opencode") in
|
|
||||||
*Claude*) install "Claude Code" "claude-code" ;;
|
*Claude*) install "Claude Code" "claude-code" ;;
|
||||||
*Cursor*) install "Cursor CLI" "cursor-cli" ;;
|
*Gemini*) install "Gemini" "gemini-cli-bin" ;;
|
||||||
*OpenAI*) install "OpenAI Codex" "openai-codex-bin" ;;
|
|
||||||
*Gemini*) install "Gemini" "gemini-cli" ;;
|
|
||||||
*Studio*) install "LM Studio" "lmstudio" ;;
|
*Studio*) install "LM Studio" "lmstudio" ;;
|
||||||
*Ollama*) install "Ollama" $ollama_pkg ;;
|
*Ollama*) install "Ollama" "ollama" ;;
|
||||||
*Crush*) install "Crush" "crush-bin" ;;
|
*Crush*) install "Crush" "crush-bin" ;;
|
||||||
*opencode*) install "opencode" "opencode" ;;
|
*opencode*) install "opencode" "opencode-bin" ;;
|
||||||
*) show_install_menu ;;
|
*) show_install_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_install_gaming_menu() {
|
show_install_gaming_menu() {
|
||||||
case $(menu "Install" " Steam\n RetroArch [AUR]\n Minecraft") in
|
case $(menu "Install" " Steam\n RetroArch\n Minecraft") in
|
||||||
*Steam*) present_terminal omarchy-install-steam ;;
|
*Steam*) present_terminal omarchy-install-steam ;;
|
||||||
*RetroArch*) aur_install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;;
|
*RetroArch*) install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;;
|
||||||
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
|
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
|
||||||
*) show_install_menu ;;
|
*) show_install_menu ;;
|
||||||
esac
|
esac
|
||||||
@@ -319,7 +234,7 @@ show_install_style_menu() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
show_install_font_menu() {
|
show_install_font_menu() {
|
||||||
case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "--width 350") in
|
case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "-w 350") in
|
||||||
*Meslo*) install_font "Meslo LG Mono" "ttf-meslo-nerd" "MesloLGL Nerd Font" ;;
|
*Meslo*) install_font "Meslo LG Mono" "ttf-meslo-nerd" "MesloLGL Nerd Font" ;;
|
||||||
*Fira*) install_font "Fira Code" "ttf-firacode-nerd" "FiraCode Nerd Font" ;;
|
*Fira*) install_font "Fira Code" "ttf-firacode-nerd" "FiraCode Nerd Font" ;;
|
||||||
*Victor*) install_font "Victor Code" "ttf-victor-mono-nerd" "VictorMono Nerd Font" ;;
|
*Victor*) install_font "Victor Code" "ttf-victor-mono-nerd" "VictorMono Nerd Font" ;;
|
||||||
@@ -329,7 +244,7 @@ show_install_font_menu() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
show_install_development_menu() {
|
show_install_development_menu() {
|
||||||
case $(menu "Install" " Ruby on Rails\n Docker DB\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure") in
|
case $(menu "Install" " Ruby on Rails\n Docker DB\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml") in
|
||||||
*Rails*) present_terminal "omarchy-install-dev-env ruby" ;;
|
*Rails*) present_terminal "omarchy-install-dev-env ruby" ;;
|
||||||
*Docker*) present_terminal omarchy-install-docker-dbs ;;
|
*Docker*) present_terminal omarchy-install-docker-dbs ;;
|
||||||
*JavaScript*) show_install_javascript_menu ;;
|
*JavaScript*) show_install_javascript_menu ;;
|
||||||
@@ -342,7 +257,6 @@ show_install_development_menu() {
|
|||||||
*Java*) present_terminal "omarchy-install-dev-env java" ;;
|
*Java*) present_terminal "omarchy-install-dev-env java" ;;
|
||||||
*NET*) present_terminal "omarchy-install-dev-env dotnet" ;;
|
*NET*) present_terminal "omarchy-install-dev-env dotnet" ;;
|
||||||
*OCaml*) present_terminal "omarchy-install-dev-env ocaml" ;;
|
*OCaml*) present_terminal "omarchy-install-dev-env ocaml" ;;
|
||||||
*Clojure*) present_terminal "omarchy-install-dev-env clojure" ;;
|
|
||||||
*) show_install_menu ;;
|
*) show_install_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
@@ -374,12 +288,11 @@ show_install_elixir_menu() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
show_remove_menu() {
|
show_remove_menu() {
|
||||||
case $(menu "Remove" " Package\n Web App\n TUI\n Theme\n Windows\n Fingerprint\n Fido2") in
|
case $(menu "Remove" " Package\n Web App\n TUI\n Theme\n Fingerprint\n Fido2") in
|
||||||
*Package*) terminal omarchy-pkg-remove ;;
|
*Package*) terminal omarchy-pkg-remove ;;
|
||||||
*Web*) present_terminal omarchy-webapp-remove ;;
|
*Web*) present_terminal omarchy-webapp-remove ;;
|
||||||
*TUI*) present_terminal omarchy-tui-remove ;;
|
*TUI*) present_terminal omarchy-tui-remove ;;
|
||||||
*Theme*) present_terminal omarchy-theme-remove ;;
|
*Theme*) present_terminal omarchy-theme-remove ;;
|
||||||
*Windows*) present_terminal "omarchy-windows-vm remove" ;;
|
|
||||||
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;;
|
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;;
|
||||||
*Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;;
|
*Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;;
|
||||||
*) show_main_menu ;;
|
*) show_main_menu ;;
|
||||||
@@ -387,16 +300,12 @@ show_remove_menu() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
show_update_menu() {
|
show_update_menu() {
|
||||||
case $(menu "Update" " Omarchy\n Config\n Extra Themes\n Process\n Hardware\n Firmware\n Password\n Timezone\n Time") in
|
case $(menu "Update" " Omarchy\n Config\n Themes\n Process\n Timezone") in
|
||||||
*Omarchy*) present_terminal omarchy-update ;;
|
*Omarchy*) present_terminal omarchy-update ;;
|
||||||
*Config*) show_update_config_menu ;;
|
*Config*) show_update_config_menu ;;
|
||||||
*Themes*) present_terminal omarchy-theme-update ;;
|
*Themes*) present_terminal omarchy-theme-update ;;
|
||||||
*Process*) show_update_process_menu ;;
|
*Process*) show_update_process_menu ;;
|
||||||
*Hardware*) show_update_hardware_menu ;;
|
*Timezone*) omarchy-cmd-tzupdate ;;
|
||||||
*Firmware*) present_terminal omarchy-update-firmware ;;
|
|
||||||
*Timezone*) present_terminal omarchy-tz-select ;;
|
|
||||||
*Time*) present_terminal omarchy-update-time ;;
|
|
||||||
*Password*) show_update_password_menu ;;
|
|
||||||
*) show_main_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
@@ -408,7 +317,7 @@ show_update_process_menu() {
|
|||||||
*Swayosd*) omarchy-restart-swayosd ;;
|
*Swayosd*) omarchy-restart-swayosd ;;
|
||||||
*Walker*) omarchy-restart-walker ;;
|
*Walker*) omarchy-restart-walker ;;
|
||||||
*Waybar*) omarchy-restart-waybar ;;
|
*Waybar*) omarchy-restart-waybar ;;
|
||||||
*) show_update_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -422,64 +331,46 @@ show_update_config_menu() {
|
|||||||
*Swayosd*) present_terminal omarchy-refresh-swayosd ;;
|
*Swayosd*) present_terminal omarchy-refresh-swayosd ;;
|
||||||
*Walker*) present_terminal omarchy-refresh-walker ;;
|
*Walker*) present_terminal omarchy-refresh-walker ;;
|
||||||
*Waybar*) present_terminal omarchy-refresh-waybar ;;
|
*Waybar*) present_terminal omarchy-refresh-waybar ;;
|
||||||
*) show_update_menu ;;
|
*) show_main_menu ;;
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
show_update_hardware_menu() {
|
|
||||||
case $(menu "Restart" " Audio\n Wi-Fi\n Bluetooth") in
|
|
||||||
*Audio*) present_terminal omarchy-restart-pipewire ;;
|
|
||||||
*Wi-Fi*) present_terminal omarchy-restart-wifi ;;
|
|
||||||
*Bluetooth*) present_terminal omarchy-restart-bluetooth ;;
|
|
||||||
*) show_update_menu ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
show_update_password_menu() {
|
|
||||||
case $(menu "Update Password" " Drive Encryption\n User") in
|
|
||||||
*Drive*) present_terminal omarchy-drive-set-password ;;
|
|
||||||
*User*) present_terminal passwd ;;
|
|
||||||
*) show_update_menu ;;
|
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_system_menu() {
|
show_system_menu() {
|
||||||
case $(menu "System" " Lock\n Screensaver\n Suspend\n Restart\n Shutdown") in
|
case $(menu "System" " Lock\n Screensaver\n Suspend\n Relaunch\n Restart\n Shutdown") in
|
||||||
*Lock*) omarchy-lock-screen ;;
|
*Lock*) omarchy-lock-screen ;;
|
||||||
*Screensaver*) omarchy-launch-screensaver force ;;
|
*Screensaver*) omarchy-launch-screensaver force ;;
|
||||||
*Suspend*) systemctl suspend ;;
|
*Suspend*) systemctl suspend ;;
|
||||||
*Restart*) omarchy-state clear re*-required && systemctl reboot --no-wall ;;
|
*Relaunch*) uwsm stop ;;
|
||||||
*Shutdown*) omarchy-state clear re*-required && systemctl poweroff --no-wall ;;
|
*Restart*) systemctl reboot ;;
|
||||||
*) back_to show_main_menu ;;
|
*Shutdown*) systemctl poweroff ;;
|
||||||
|
*) show_main_menu ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
show_main_menu() {
|
show_main_menu() {
|
||||||
go_to_menu "$(menu "Go" " Apps\n Learn\n Trigger\n Style\n Setup\n Install\n Remove\n Update\n About\n System")"
|
go_to_menu "$(menu "Go" " Apps\n Learn\n Capture\n Toggle\n Style\n Setup\n Install\n Remove\n Update\n About\n System")"
|
||||||
}
|
}
|
||||||
|
|
||||||
go_to_menu() {
|
go_to_menu() {
|
||||||
case "${1,,}" in
|
case "${1,,}" in
|
||||||
*apps*) walker -p "Launch…" ;;
|
*apps*) walker -p "Launch…" ;;
|
||||||
*learn*) show_learn_menu ;;
|
*learn*) show_learn_menu ;;
|
||||||
*trigger*) show_trigger_menu ;;
|
|
||||||
*share*) show_share_menu ;;
|
|
||||||
*style*) show_style_menu ;;
|
*style*) show_style_menu ;;
|
||||||
*theme*) show_theme_menu ;;
|
*theme*) show_theme_menu ;;
|
||||||
|
*capture*) show_capture_menu ;;
|
||||||
*screenshot*) show_screenshot_menu ;;
|
*screenshot*) show_screenshot_menu ;;
|
||||||
*screenrecord*) show_screenrecord_menu ;;
|
*screenrecord*) show_screenrecord_menu ;;
|
||||||
|
*toggle*) show_toggle_menu ;;
|
||||||
*setup*) show_setup_menu ;;
|
*setup*) show_setup_menu ;;
|
||||||
*power*) show_setup_power_menu ;;
|
|
||||||
*install*) show_install_menu ;;
|
*install*) show_install_menu ;;
|
||||||
*remove*) show_remove_menu ;;
|
*remove*) show_remove_menu ;;
|
||||||
*update*) show_update_menu ;;
|
*update*) show_update_menu ;;
|
||||||
*about*) omarchy-launch-about ;;
|
|
||||||
*system*) show_system_menu ;;
|
*system*) show_system_menu ;;
|
||||||
|
*about*) terminal bash -c 'fastfetch; read -n 1 -s' ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ -n "$1" ]]; then
|
if [[ -n "$1" ]]; then
|
||||||
BACK_TO_EXIT=true
|
|
||||||
go_to_menu "$1"
|
go_to_menu "$1"
|
||||||
else
|
else
|
||||||
show_main_menu
|
show_main_menu
|
||||||
|
|||||||
@@ -3,80 +3,6 @@
|
|||||||
# A script to display Hyprland keybindings defined in your configuration
|
# A script to display Hyprland keybindings defined in your configuration
|
||||||
# using walker for an interactive search menu.
|
# using walker for an interactive search menu.
|
||||||
|
|
||||||
declare -A KEYCODE_SYM_MAP
|
|
||||||
|
|
||||||
build_keymap_cache() {
|
|
||||||
local keymap
|
|
||||||
keymap="$(xkbcli compile-keymap)" || {
|
|
||||||
echo "Failed to compile keymap" >&2
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
while IFS=, read -r code sym; do
|
|
||||||
[[ -z "$code" || -z "$sym" ]] && continue
|
|
||||||
KEYCODE_SYM_MAP["$code"]="$sym"
|
|
||||||
done < <(
|
|
||||||
awk '
|
|
||||||
BEGIN { sec = "" }
|
|
||||||
/xkb_keycodes/ { sec = "codes"; next }
|
|
||||||
/xkb_symbols/ { sec = "syms"; next }
|
|
||||||
sec == "codes" {
|
|
||||||
if (match($0, /<([A-Za-z0-9_]+)>\s*=\s*([0-9]+)\s*;/, m)) code_by_name[m[1]] = m[2]
|
|
||||||
}
|
|
||||||
sec == "syms" {
|
|
||||||
if (match($0, /key\s*<([A-Za-z0-9_]+)>\s*\{\s*\[\s*([^, \]]+)/, m)) sym_by_name[m[1]] = m[2]
|
|
||||||
}
|
|
||||||
END {
|
|
||||||
for (k in code_by_name) {
|
|
||||||
c = code_by_name[k]
|
|
||||||
s = sym_by_name[k]
|
|
||||||
if (c != "" && s != "" && s != "NoSymbol") print c "," s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
' <<<"$keymap"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
lookup_keycode_cached() {
|
|
||||||
printf '%s\n' "${KEYCODE_SYM_MAP[$1]}"
|
|
||||||
}
|
|
||||||
|
|
||||||
parse_keycodes() {
|
|
||||||
local start end elapsed
|
|
||||||
[[ "${DEBUG:-0}" == "1" ]] && start=$(date +%s.%N)
|
|
||||||
while IFS= read -r line; do
|
|
||||||
if [[ "$line" =~ code:([0-9]+) ]]; then
|
|
||||||
code="${BASH_REMATCH[1]}"
|
|
||||||
symbol=$(lookup_keycode_cached "$code" "$XKB_KEYMAP_CACHE")
|
|
||||||
echo "${line/code:${code}/$symbol}"
|
|
||||||
elif [[ "$line" =~ mouse:([0-9]+) ]]; then
|
|
||||||
code="${BASH_REMATCH[1]}"
|
|
||||||
|
|
||||||
case "$code" in
|
|
||||||
272) symbol="LEFT MOUSE BUTTON" ;;
|
|
||||||
273) symbol="RIGHT MOUSE BUTTON" ;;
|
|
||||||
274) symbol="MIDDLE MOUSE BUTTON" ;;
|
|
||||||
*) symbol="mouse:${code}" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "${line/mouse:${code}/$symbol}"
|
|
||||||
else
|
|
||||||
echo "$line"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ "$DEBUG" == "1" ]]; then
|
|
||||||
end=$(date +%s.%N)
|
|
||||||
# fall back to awk if bc is missing
|
|
||||||
if command -v bc >/dev/null 2>&1; then
|
|
||||||
elapsed=$(echo "$end - $start" | bc)
|
|
||||||
else
|
|
||||||
elapsed=$(awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f", (e - s)}')
|
|
||||||
fi
|
|
||||||
echo "[DEBUG] parse_keycodes elapsed: ${elapsed}s" >&2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fetch dynamic keybindings from Hyprland
|
# Fetch dynamic keybindings from Hyprland
|
||||||
#
|
#
|
||||||
# Also do some pre-processing:
|
# Also do some pre-processing:
|
||||||
@@ -85,35 +11,30 @@ parse_keycodes() {
|
|||||||
# - Map numeric modifier key mask to a textual rendition
|
# - Map numeric modifier key mask to a textual rendition
|
||||||
# - Output comma-separated values that the parser can understand
|
# - Output comma-separated values that the parser can understand
|
||||||
dynamic_bindings() {
|
dynamic_bindings() {
|
||||||
hyprctl -j binds |
|
hyprctl -j binds | \
|
||||||
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' |
|
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' | \
|
||||||
sed -r \
|
sed -r \
|
||||||
-e 's/null//' \
|
-e 's/null//' \
|
||||||
-e 's,uwsm app -- ,,' \
|
-e 's,~/.local/share/omarchy/bin/,,' \
|
||||||
-e 's,uwsm-app -- ,,' \
|
-e 's,uwsm app -- ,,' \
|
||||||
-e 's/@0//' \
|
-e 's/@0//' \
|
||||||
-e 's/,@/,code:/' \
|
-e 's/,@/,code:/' \
|
||||||
-e 's/^0,/,/' \
|
-e 's/^0,/,/' \
|
||||||
-e 's/^1,/SHIFT,/' \
|
-e 's/^1,/SHIFT,/' \
|
||||||
-e 's/^4,/CTRL,/' \
|
-e 's/^4,/CTRL,/' \
|
||||||
-e 's/^5,/SHIFT CTRL,/' \
|
-e 's/^5,/SHIFT CTRL,/' \
|
||||||
-e 's/^8,/ALT,/' \
|
-e 's/^8,/ALT,/' \
|
||||||
-e 's/^9,/SHIFT ALT,/' \
|
-e 's/^9,/SHIFT ALT,/' \
|
||||||
-e 's/^12,/CTRL ALT,/' \
|
-e 's/^12,/CTRL ALT,/' \
|
||||||
-e 's/^13,/SHIFT CTRL ALT,/' \
|
-e 's/^13,/SHIFT CTRL ALT,/' \
|
||||||
-e 's/^64,/SUPER,/' \
|
-e 's/^64,/SUPER,/' \
|
||||||
-e 's/^65,/SUPER SHIFT,/' \
|
-e 's/^65,/SUPER SHIFT,/' \
|
||||||
-e 's/^68,/SUPER CTRL,/' \
|
-e 's/^68,/SUPER CTRL,/' \
|
||||||
-e 's/^69,/SUPER SHIFT CTRL,/' \
|
-e 's/^69,/SUPER SHIFT CTRL,/' \
|
||||||
-e 's/^72,/SUPER ALT,/' \
|
-e 's/^72,/SUPER ALT,/' \
|
||||||
-e 's/^73,/SUPER SHIFT ALT,/' \
|
-e 's/^73,/SUPER SHIFT ALT,/' \
|
||||||
-e 's/^76,/SUPER CTRL ALT,/' \
|
-e 's/^76,/SUPER CTRL ALT,/' \
|
||||||
-e 's/^77,/SUPER SHIFT CTRL ALT,/'
|
-e 's/^77,/SUPER SHIFT CTRL ALT,/'
|
||||||
}
|
|
||||||
|
|
||||||
# Hardcoded bindings, like the copy-url extension and such
|
|
||||||
static_bindings() {
|
|
||||||
echo "SHIFT ALT,L,Copy URL from Web App,extension,copy-url"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Parse and format keybindings
|
# Parse and format keybindings
|
||||||
@@ -162,67 +83,7 @@ parse_bindings() {
|
|||||||
}'
|
}'
|
||||||
}
|
}
|
||||||
|
|
||||||
prioritize_entries() {
|
dynamic_bindings | \
|
||||||
awk '
|
sort -u | \
|
||||||
{
|
parse_bindings | \
|
||||||
line = $0
|
walker --dmenu --theme keybindings -p 'Keybindings'
|
||||||
prio = 50
|
|
||||||
if (match(line, /Terminal/)) prio = 0
|
|
||||||
if (match(line, /Browser/) && !match(line, /Browser[[:space:]]*\(/)) prio = 1
|
|
||||||
if (match(line, /File manager/)) prio = 2
|
|
||||||
if (match(line, /Launch apps/)) prio = 3
|
|
||||||
if (match(line, /Omarchy menu/)) prio = 4
|
|
||||||
if (match(line, /System menu/)) prio = 5
|
|
||||||
if (match(line, /Theme menu/)) prio = 6
|
|
||||||
if (match(line, /Full screen/)) prio = 7
|
|
||||||
if (match(line, /Close window/)) prio = 8
|
|
||||||
if (match(line, /Toggle window floating/)) prio = 9
|
|
||||||
if (match(line, /Toggle window split/)) prio = 10
|
|
||||||
if (match(line, /Universal/)) prio = 11
|
|
||||||
if (match(line, /Clipboard/)) prio = 12
|
|
||||||
if (match(line, /Emoji picker/)) prio = 13
|
|
||||||
if (match(line, /Color picker/)) prio = 14
|
|
||||||
if (match(line, /Screenshot/)) prio = 15
|
|
||||||
if (match(line, /Screenrecording/)) prio = 16
|
|
||||||
if (match(line, /(Switch|Next|Former|Previous).*workspace/)) prio = 17
|
|
||||||
if (match(line, /Move window to workspace/)) prio = 18
|
|
||||||
if (match(line, /Swap window/)) prio = 19
|
|
||||||
if (match(line, /Move window focus/)) prio = 20
|
|
||||||
if (match(line, /Move window$/)) prio = 21
|
|
||||||
if (match(line, /Resize window/)) prio = 22
|
|
||||||
if (match(line, /Expand window/)) prio = 23
|
|
||||||
if (match(line, /Shrink window/)) prio = 24
|
|
||||||
if (match(line, /scratchpad/)) prio = 25
|
|
||||||
if (match(line, /notification/)) prio = 26
|
|
||||||
if (match(line, /Toggle window transparency/)) prio = 27
|
|
||||||
if (match(line, /Toggle workspace gaps/)) prio = 28
|
|
||||||
if (match(line, /Toggle nightlight/)) prio = 29
|
|
||||||
if (match(line, /group/)) prio = 94
|
|
||||||
if (match(line, /Scroll active workspace/)) prio = 95
|
|
||||||
if (match(line, /Cycle to/)) prio = 96
|
|
||||||
if (match(line, /Reveal active/)) prio = 97
|
|
||||||
if (match(line, /Apple Display/)) prio = 98
|
|
||||||
if (match(line, /XF86/)) prio = 99
|
|
||||||
|
|
||||||
# print "priority<TAB>line"
|
|
||||||
printf "%d\t%s\n", prio, line
|
|
||||||
}' |
|
|
||||||
sort -k1,1n -k2,2 |
|
|
||||||
cut -f2-
|
|
||||||
}
|
|
||||||
|
|
||||||
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
|
|
||||||
menu_height=$((monitor_height * 40 / 100))
|
|
||||||
|
|
||||||
build_keymap_cache
|
|
||||||
|
|
||||||
{
|
|
||||||
dynamic_bindings
|
|
||||||
static_bindings
|
|
||||||
} |
|
|
||||||
sort -u |
|
|
||||||
parse_keycodes |
|
|
||||||
parse_bindings |
|
|
||||||
prioritize_entries |
|
|
||||||
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height"
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +1,18 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
# Where we store an empty file for each migration that has already been performed.
|
# Where we store an empty file for each migration that has already been performed.
|
||||||
STATE_DIR="$HOME/.local/state/omarchy/migrations"
|
STATE_DIR="$HOME/.local/state/omarchy/migrations"
|
||||||
mkdir -p "$STATE_DIR"
|
mkdir -p "$STATE_DIR"
|
||||||
|
|
||||||
# Skipped migrations are tracked separately
|
|
||||||
mkdir -p "$STATE_DIR/skipped"
|
|
||||||
|
|
||||||
# Run any pending migrations
|
# Run any pending migrations
|
||||||
for file in /usr/share/omarchy/migrations/*.sh; do
|
for file in ~/.local/share/omarchy/migrations/*.sh; do
|
||||||
filename=$(basename "$file")
|
filename=$(basename "$file")
|
||||||
|
|
||||||
if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then
|
if [[ ! -f "$STATE_DIR/$filename" ]]; then
|
||||||
echo -e "\e[32m\nRunning migration (${filename%.sh})\e[0m"
|
echo -e "\e[32m\nRunning migration (${filename%.sh})\e[0m"
|
||||||
|
source $file
|
||||||
if bash $file; then
|
touch "$STATE_DIR/$filename"
|
||||||
touch "$STATE_DIR/$filename"
|
|
||||||
else
|
|
||||||
if gum confirm "Migration ${filename%.sh} failed. Skip and continue?"; then
|
|
||||||
touch "$STATE_DIR/skipped/$filename"
|
|
||||||
else
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
|
||||||
echo "Usage: omarchy-notification-dismiss <summary>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Find the first notification whose 'summary' matches the regex in $1
|
|
||||||
notification_id=$(makoctl list | grep -F "$1" | head -n1 | sed -E 's/^Notification ([0-9]+):.*/\1/')
|
|
||||||
|
|
||||||
if [[ -n $notification_id ]]; then
|
|
||||||
makoctl dismiss -n $notification_id
|
|
||||||
fi
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if omarchy-pkg-missing "$@"; then
|
|
||||||
sudo pacman -S --noconfirm --needed "$@" || exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
for pkg in "$@"; do
|
|
||||||
# Secondary check to handle states where pacman doesn't actually register an error
|
|
||||||
if ! pacman -Q "$pkg" &>/dev/null; then
|
|
||||||
echo -e "\033[31mError: Package '$pkg' did not install\033[0m" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
curl -sf --connect-timeout 30 --retry 3 --retry-delay 3 -A "omarchy-update" \
|
|
||||||
"https://aur.archlinux.org/rpc/?v=5&type=info&arg=base" >/dev/null
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
fzf_args=(
|
|
||||||
--multi
|
|
||||||
--preview 'yay -Siia {1}'
|
|
||||||
--preview-label='alt-p: toggle description, alt-b/B: toggle PKGBUILD, alt-j/k: scroll, tab: multi-select'
|
|
||||||
--preview-label-pos='bottom'
|
|
||||||
--preview-window 'down:65%:wrap'
|
|
||||||
--bind 'alt-p:toggle-preview'
|
|
||||||
--bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up'
|
|
||||||
--bind 'alt-k:preview-up,alt-j:preview-down'
|
|
||||||
--bind 'alt-b:change-preview:yay -Gpa {1} | tail -n +5'
|
|
||||||
--bind 'alt-B:change-preview:yay -Siia {1}'
|
|
||||||
--color 'pointer:green,marker:green'
|
|
||||||
)
|
|
||||||
|
|
||||||
pkg_names=$(yay -Slqa | fzf "${fzf_args[@]}")
|
|
||||||
|
|
||||||
if [[ -n "$pkg_names" ]]; then
|
|
||||||
# Convert newline-separated selections to space-separated for yay
|
|
||||||
echo "$pkg_names" | tr '\n' ' ' | xargs yay -S --noconfirm
|
|
||||||
sudo updatedb
|
|
||||||
omarchy-show-done
|
|
||||||
fi
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
for pkg in "$@"; do
|
|
||||||
if pacman -Q "$pkg" &>/dev/null; then
|
|
||||||
sudo pacman -Rns --noconfirm "$pkg"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
IGNORED_PACKAGES_FILE="$OMARCHY_PATH/install/packages.ignored"
|
|
||||||
|
|
||||||
if [[ -f $IGNORED_PACKAGES_FILE ]]; then
|
|
||||||
tr '\r\n' ',' <"$IGNORED_PACKAGES_FILE" | sed 's/,$//'
|
|
||||||
fi
|
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
fzf_args=(
|
fzf_args=(
|
||||||
--multi
|
--multi
|
||||||
--preview 'pacman -Sii {1}'
|
--preview 'yay -Sii {1}'
|
||||||
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select'
|
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
|
||||||
--preview-label-pos='bottom'
|
--preview-label-pos='bottom'
|
||||||
--preview-window 'down:65%:wrap'
|
--preview-window 'down:65%:wrap'
|
||||||
--bind 'alt-p:toggle-preview'
|
--bind 'alt-p:toggle-preview'
|
||||||
@@ -12,10 +14,11 @@ fzf_args=(
|
|||||||
--color 'pointer:green,marker:green'
|
--color 'pointer:green,marker:green'
|
||||||
)
|
)
|
||||||
|
|
||||||
pkg_names=$(pacman -Slq | fzf "${fzf_args[@]}")
|
pkg_names=$(yay -Slq | fzf "${fzf_args[@]}")
|
||||||
|
|
||||||
if [[ -n "$pkg_names" ]]; then
|
if [[ -n "$pkg_names" ]]; then
|
||||||
# Convert newline-separated selections to space-separated for yay
|
# Convert newline-separated selections to space-separated for yay
|
||||||
echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -S --noconfirm
|
echo "$pkg_names" | tr '\n' ' ' | xargs yay -Sy --noconfirm
|
||||||
|
sudo updatedb
|
||||||
omarchy-show-done
|
omarchy-show-done
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
for pkg in "$@"; do
|
|
||||||
if ! pacman -Q "$pkg" &>/dev/null; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
PINNED_PACKAGES_FILE="$OMARCHY_PATH/install/packages.pinned"
|
|
||||||
|
|
||||||
if [[ -f $PINNED_PACKAGES_FILE ]]; then
|
|
||||||
tr '\r\n' ',' <"$PINNED_PACKAGES_FILE" | sed 's/,$//'
|
|
||||||
fi
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
for pkg in "$@"; do
|
|
||||||
pacman -Q "$pkg" &>/dev/null || exit 1
|
|
||||||
done
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
fzf_args=(
|
fzf_args=(
|
||||||
--multi
|
--multi
|
||||||
--preview 'yay -Qi {1}'
|
--preview 'yay -Qi {1}'
|
||||||
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select'
|
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
|
||||||
--preview-label-pos='bottom'
|
--preview-label-pos='bottom'
|
||||||
--preview-window 'down:65%:wrap'
|
--preview-window 'down:65%:wrap'
|
||||||
--bind 'alt-p:toggle-preview'
|
--bind 'alt-p:toggle-preview'
|
||||||
@@ -16,6 +16,7 @@ pkg_names=$(yay -Qqe | fzf "${fzf_args[@]}")
|
|||||||
|
|
||||||
if [[ -n "$pkg_names" ]]; then
|
if [[ -n "$pkg_names" ]]; then
|
||||||
# Convert newline-separated selections to space-separated for yay
|
# Convert newline-separated selections to space-separated for yay
|
||||||
echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -Rns --noconfirm
|
echo "$pkg_names" | tr '\n' ' ' | xargs yay -Rns --noconfirm
|
||||||
|
sudo updatedb
|
||||||
omarchy-show-done
|
omarchy-show-done
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -2,12 +2,17 @@
|
|||||||
|
|
||||||
# Copy and sync icon files
|
# Copy and sync icon files
|
||||||
mkdir -p ~/.local/share/icons/hicolor/48x48/apps/
|
mkdir -p ~/.local/share/icons/hicolor/48x48/apps/
|
||||||
cp /usr/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
|
cp ~/.local/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
|
||||||
gtk-update-icon-cache ~/.local/share/icons/hicolor &>/dev/null
|
gtk-update-icon-cache ~/.local/share/icons/hicolor &>/dev/null
|
||||||
|
|
||||||
# Copy .desktop declarations
|
# Copy .desktop declarations
|
||||||
mkdir -p ~/.local/share/applications
|
mkdir -p ~/.local/share/applications
|
||||||
cp /usr/share/omarchy/applications/*.desktop ~/.local/share/applications/
|
cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/
|
||||||
cp /usr/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
|
cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
|
||||||
|
|
||||||
|
# Only copy xtras if user is not in bare mode
|
||||||
|
if [[ ! -f ~/.local/state/omarchy/bare.mode ]] && [ -z "$OMARCHY_BARE" ]; then
|
||||||
|
cp ~/.local/share/omarchy/applications/xtras/*.desktop ~/.local/share/applications/
|
||||||
|
fi
|
||||||
|
|
||||||
update-desktop-database ~/.local/share/applications
|
update-desktop-database ~/.local/share/applications
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# This script deploys /etc/skel/.config/X/Y/Z -> ~/.config/X/Y/Z
|
# This script deploys ~/.local/share/omarchy/config/X/Y/Z -> ~/.config/X/Y/Z
|
||||||
config_file=$1
|
config_file=$1
|
||||||
|
|
||||||
if [[ -z "$config_file" ]]; then
|
if [[ -z "$config_file" ]]; then
|
||||||
@@ -8,7 +8,7 @@ if [[ -z "$config_file" ]]; then
|
|||||||
Usage: $0 [config_file]
|
Usage: $0 [config_file]
|
||||||
|
|
||||||
Must provide a file path from the .config directory to be refreshed.
|
Must provide a file path from the .config directory to be refreshed.
|
||||||
To copy /etc/skel/.config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
|
To copy ~/.local/share/omarchy/config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
|
||||||
|
|
||||||
$0 hypr/hyprlock.conf
|
$0 hypr/hyprlock.conf
|
||||||
USAGE
|
USAGE
|
||||||
@@ -17,7 +17,7 @@ fi
|
|||||||
|
|
||||||
# Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951)
|
# Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951)
|
||||||
user_config_file="${HOME}/.config/$config_file"
|
user_config_file="${HOME}/.config/$config_file"
|
||||||
default_config_file="/etc/skel/.config/$config_file"
|
default_config_file="${HOME}/.local/share/omarchy/config/$config_file"
|
||||||
backup_config_file="$user_config_file.bak.$(date +%s)"
|
backup_config_file="$user_config_file.bak.$(date +%s)"
|
||||||
|
|
||||||
if [[ -f "$user_config_file" ]]; then
|
if [[ -f "$user_config_file" ]]; then
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
omarchy-refresh-config fastfetch/config.jsonc
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -f /boot/EFI/linux/omarchy_linux.efi ]] && [[ -f /boot/EFI/linux/$(cat /etc/machine-id)_linux.efi ]]; then
|
|
||||||
echo "Cleanup extra UKI"
|
|
||||||
sudo rm -f /boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi
|
|
||||||
fi
|
|
||||||
echo "Resetting limine config"
|
|
||||||
|
|
||||||
sudo mv /boot/limine.conf /boot/limine.conf.bak
|
|
||||||
|
|
||||||
sudo tee /boot/limine.conf <<EOF >/dev/null
|
|
||||||
### Read more at config document: https://github.com/limine-bootloader/limine/blob/trunk/CONFIG.md
|
|
||||||
#timeout: 3
|
|
||||||
default_entry: 2
|
|
||||||
interface_branding: Omarchy Bootloader
|
|
||||||
interface_branding_color: 2
|
|
||||||
hash_mismatch_panic: no
|
|
||||||
|
|
||||||
term_background: 1a1b26
|
|
||||||
backdrop: 1a1b26
|
|
||||||
|
|
||||||
# Terminal colors (Tokyo Night palette)
|
|
||||||
term_palette: 15161e;f7768e;9ece6a;e0af68;7aa2f7;bb9af7;7dcfff;a9b1d6
|
|
||||||
term_palette_bright: 414868;f7768e;9ece6a;e0af68;7aa2f7;bb9af7;7dcfff;c0caf5
|
|
||||||
|
|
||||||
# Text colors
|
|
||||||
term_foreground: c0caf5
|
|
||||||
term_foreground_bright: c0caf5
|
|
||||||
term_background_bright: 24283b
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo limine-update
|
|
||||||
sudo limine-snapper-sync
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
sudo cp -f /usr/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist
|
|
||||||
@@ -1,10 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
sudo cp /usr/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
|
if [[ "$1" == "-y" ]] || gum confirm "Refresh Plymouth theme? This will replace your current startup screen with Omarchy defaults."; then
|
||||||
sudo plymouth-set-default-theme omarchy
|
sudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
|
||||||
|
sudo plymouth-set-default-theme -R omarchy
|
||||||
if command -v limine-mkinitcpio &>/dev/null; then
|
|
||||||
sudo limine-mkinitcpio
|
|
||||||
else
|
|
||||||
sudo mkinitcpio -P
|
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
omarchy-refresh-config walker/config.toml
|
omarchy-refresh-config walker/config.toml
|
||||||
omarchy-refresh-config elephant/calc.toml
|
|
||||||
omarchy-refresh-config elephant/desktopapplications.toml
|
|
||||||
omarchy-restart-walker
|
omarchy-restart-walker
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [ "$EUID" -eq 0 ]; then
|
|
||||||
echo "Error: This script should not be run as root"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "This will reinstall all the default Omarchy packages and reset all default configs.\nWarning: All changes to configs will be lost.\n"
|
|
||||||
|
|
||||||
if gum confirm "Are you sure you want to reinstall and lose all config changes?"; then
|
|
||||||
echo "Reinstalling Omarchy Package"
|
|
||||||
sudo pacman -Syu --noconfirm --needed omarchy
|
|
||||||
|
|
||||||
echo "Reinstalling missing Omarchy packages"
|
|
||||||
mapfile -t packages < <(grep -v '^#' "$OMARCHY_PATH/install/omarchy-base.packages" | grep -v '^$')
|
|
||||||
sudo pacman -Syu --noconfirm --needed "${packages[@]}"
|
|
||||||
|
|
||||||
echo "Resetting all Omarchy configs"
|
|
||||||
cp -R /etc/skel/.config/* ~/.config/
|
|
||||||
|
|
||||||
$(bash $OMARCHY_PATH/install/config/theme.sh)
|
|
||||||
$(bash $OMARCHY_PATH/install/config/git.sh)
|
|
||||||
|
|
||||||
omarchy-refresh-limine
|
|
||||||
omarchy-refresh-plymouth
|
|
||||||
omarchy-nvim-setup
|
|
||||||
fi
|
|
||||||