Compare commits

...

20 Commits

Author SHA1 Message Date
85509d556c wip: hyprpaper_single.sh 2024-12-23 17:35:13 +03:00
9fd1a31bdb verify effects and do error reporting
sometimes GTK and gsettings can go crazy, untrackably.
more error messages i get, the better.
2024-10-31 10:48:58 +03:00
a6bc546570 should've checked before committing 2024-10-22 17:58:01 +03:00
7e300fc04e this'll work better ig 2024-10-22 17:52:52 +03:00
0602eb1bf7 update background logic
backgrounds saved for light/dark modes are now stored as the absolute
path, so config keys chore.bg_dark and chore.bg_light now contain the
string of absolute path to image files.

in addition to this update, swww_single chore now copies the current
background image to the location of chore.current_bg, which can be used
to directly access the image of the current background.
2024-10-22 16:58:40 +03:00
02fcdf794b pass $mode to reload, find real path even when sourcing 2024-10-10 10:20:47 +03:00
245dc99887 state man. API && modularisation
- adds functions
  - util_create_state
  - util_read_state
  - util_write_state
  - util_delete_state
for state management API. see docs/about_states.md for details.

- moves functions from _reve.sh to _reve_utils.sh to prevent circular
imports.
2024-10-09 20:01:30 +03:00
dd663f47a0 small typo fixed 2024-10-02 22:23:38 +03:00
49c80b4b3d improved dm logic, bug fix for mode subcommand 2024-10-02 22:18:38 +03:00
8f5225cb23 add mode chore nvim_theme, update example mode chore 2024-10-02 21:53:18 +03:00
e4917fddec small typo 2024-10-02 21:46:54 +03:00
967f3c50e4 update and chores subcommands added
+ update all chores from upstream
+ list, add and remove chores
2024-10-02 21:46:02 +03:00
b6bac4bbdc formatting <<< moving 2 spaces to left <<< 2024-10-02 17:46:46 +03:00
913cd0d65e updated mode chores & nemo utility for comp. 2024-10-02 17:39:14 +03:00
c356b1765b simplified and refactored chore/single chore workflow 2024-10-02 17:14:59 +03:00
6c8d80f1a8 don't rename pos. vars to local when not needed 2024-10-02 16:02:23 +03:00
c22bf5a0f8 + force mode for chore, new pos. arg: poll 2024-09-23 17:12:43 +03:00
b85c9d4df2 lost real diff because of autoformatter 2024-09-23 17:09:57 +03:00
cb1b26770a config subcommand impl.
+ _reve/util_read_config {config_key}
+ _reve/util_write_config {config_key} {value}
+ _reve/util_delete_config {config_key}
+ let shellcheck know what we're sourcing
2024-08-26 22:16:37 +03:00
b7e29e8c35 flattened, simplified command/subcommand ux
+ handle devenv for _reve
+ detailed help message, better formatting
- remove dependency getopt
2024-08-26 21:32:16 +03:00
20 changed files with 717 additions and 281 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
testbench.sh

1
.shellcheckrc Normal file
View File

@@ -0,0 +1 @@
external-sources=true

View File

@@ -3,13 +3,80 @@
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
util_readf () {
local filename=$1
# VERY CRITICAL: change this if install.sh is updated
reve_installation="$HOME/.local/bin/reve"
reve_config="$HOME/.config/reve"
if [[ -f "$filename" ]]; then
cat "$filename"
else
echo "[reve] [E] util_readf: File not found: $filename" >&2
return 1
fi
_current_dir=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
# shellcheck source=_reve_states.sh
source "$_current_dir/_reve_states" >&/dev/null
(($? == 1)) && source "$_current_dir/_reve_states.sh"
# shellcheck source=_reve_utils.sh
source "$_current_dir/_reve_utils" >&/dev/null
(($? == 1)) && source "$_current_dir/_reve_utils.sh"
util_where_config() {
local config_key=$1
pre_removed_key=${config_key/#base./}
config_path=$(echo "$pre_removed_key" | sed 's/\./\//g')
echo "$reve_config/$config_path"
}
util_read_config() {
local fp_config
fp_config=$(util_where_config "$1")
util_readf "$fp_config"
return $?
}
util_write_config() {
local fp_config new_value=$2
fp_config=$(util_where_config "$1")
mkdir -p "$(dirname "$fp_config")"
echo "$new_value" >"$fp_config"
}
util_delete_config() {
local config_key=$1
pre_removed_key=${config_key/#base./}
config_path=$(echo "$pre_removed_key" | sed 's/\./\//g')
rm "$reve_config/$config_path"
dir=$(dirname "$reve_config/$config_path")
[ -z "$(ls -A "$dir")" ] && rm -r "$dir"
}
util_run_chore() {
local chore_path="$reve_installation/chores/$1"
if [ -x "$chore_path.sh" ]; then
error I "util_run_chore" "Running chore: $(basename "$1")"
REVE_FOLDER="$reve_config" RV_CURRENT_MODE=$2 bash "$chore_path.sh"
else
error E "util_run_chore" "$chore_path is not executable"
fi
}
util_run_utility() {
local utility_path="$reve_installation/utility/$1"
if [ -x "$utility_path.sh" ]; then
error I "util_run_utility" "Running utility script: $(basename "$1")"
bash "$utility_path.sh"
else
error E "util_run_utility" "$utility_path is not executable"
fi
}
reload() {
util_run_chore "$1" "$2"
}
reload_util() {
util_run_utility "$1"
}
util_toggle_dm() {
if [[ $(util_read_config base.desktop_mode) == "dark" ]]; then
util_write_config base.desktop_mode light
else
util_write_config base.desktop_mode dark
fi
}

99
_reve_states.sh Normal file
View File

@@ -0,0 +1,99 @@
#!/usr/bin/env bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# reve internal: _reve_states
# defines state management API
_current_dir=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
# shellcheck source=_reve_utils.sh
source "$_current_dir/_reve_utils" >&/dev/null
(($? == 1)) && source "$_current_dir/_reve_utils.sh"
REVE_STATE_REPO="$HOME/.local/bin/reve/states"
__util_pathto_state() {
# args: $1 -- state key
# args: $2 -- state type
local key=$1 type=$2
pre_removed_key=${key/#base./}
state_path="$(echo "$pre_removed_key" | sed 's/\./\//g')$type"
echo "$state_path"
}
__util_find_state() {
# args: $1 -- state key
# returns: 1 if state key not in map
# 2 if map is corrupted
local key=$1
type=$(awk -F'=' -v key="$key" '$1 == key {print $2}' "$REVE_STATE_REPO/map")
case "$type" in
prs | persistent) type="" ;;
tmp | temporary) type=".tmp" ;;
"")
error E states "state referenced by key '$key' doesn't exist"
return 1
;;
*)
error E states "state map '$REVE_STATE_REPO/map' is corrupted"
return 2
;;
esac
__util_pathto_state "$1" "$type"
}
util_create_state() {
local type=$1 key=$2 value=$3
if [ "$type" != "tmp" ] && [ "$type" != "prs" ]; then
error E util_create_state "can't create state with type '$type'"
return
fi
if ! __util_find_state "$key"; then
echo "$value" >"$(__util_pathto_state "$key" "$type")"
echo "$key=$value" >"$REVE_STATE_REPO/map"
fi
}
util_write_state() {
local key=$1 value=$2
_path=$(__util_find_state "$key")
if $? -eq 0; then
echo "$value" >"$_path"
fi
}
util_read_state() {
local key=$1
_path=$(__util_find_state "$key")
if $? -eq 0; then
cat "$_path"
fi
}
util_delete_state() {
local key=$1
_path=$(__util_find_state "$key")
if $? -eq 0; then
rm "$_path"
awk -F '=' -v key="$key" '$1 != key' "$REVE_STATE_REPO/map" >"$REVE_STATE_REPO/map.tmp"
mv "$REVE_STATE_REPO/map.tmp" "$REVE_STATE_REPO/map"
_dir=$(dirname "$_path")
[ -z "$(ls -A "$_dir")" ] && rm -r "$_dir"
fi
}
util_deleteall_temp() {
awk -F'=' '$2 == "tmp" { print $1 }' data.txt | while read -r key; do
util_delete_state "$key"
done
}

29
_reve_utils.sh Normal file
View File

@@ -0,0 +1,29 @@
#!/usr/bin/env bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# reve internal: _reve_utils
# defines utility functions
# VERY CRITICAL: change this if install.sh is updated
reve_installation="$HOME/.local/bin/reve"
util_readf() {
local filename=$1
if [[ -f "$filename" ]]; then
cat "$filename"
else
error E "util_readf" "File not found: $filename"
return 1
fi
}
error() {
local level=$1 location=$2 cause=$3
message="[reve] [$level] [$location] $cause"
echo "$message"
now=$(date -Iminutes)
echo "${now::-6} $message" >>"$reve_installation/reve.log"
}

27
chores/misc/asus_kbd_light.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# chore script
# type misc
# name asus_kbd_light.sh
# desc ...
# vars ...
# reload ...
reve_folder="$HOME/.config/reve"
reve_desktop_mode="$reve_folder/desktop_mode"
source "$( reve -w )/_reve"
current_mode=$( util_readf "$reve_desktop_mode" )
if [ "$current_mode" == "light" ]; then
exit 0
fi
hex_dominant_color=$( magick "$reve_folder/chore/bg_dark" -resize 1x1\! -format "%[hex:p{0,0}]" info: )
asusctl led-mode static -c "$hex_dominant_color"
asusctl --kbd-bright med

View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# chore script
# type mode
# name display_brightness.sh
# desc sets display brightness depending on the desktop_mode
# vars day_level, night_level
# reload none
# shellcheck source=../../_reve.sh
source "$(reve where)/_reve"
if [ "$RV_CURRENT_MODE" == "dark" ]; then
brightnessctl set "$(util_read_config display.night_level)"
else
brightnessctl set "$(util_read_config display.day_level)"
fi

View File

@@ -9,27 +9,19 @@
# desc changes the GTK theme and color-scheme according to desktop_mode
# vars gtk_dark_theme, gtk_light_theme
reve_folder="$HOME/.config/reve"
reve_desktop_mode="$reve_folder/desktop_mode"
gtk_dark_theme="$reve_folder/chore/gtk_dark_theme"
gtk_light_theme="$reve_folder/chore/gtk_light_theme"
# shellcheck source=../../_reve.sh
source "$(reve where)/_reve"
util_readf () {
local filename=$1
key="org.gnome.desktop.interface"
target_theme="$(util_read_config chore.gtk_"$RV_CURRENT_MODE"_theme)"
target_scheme="prefer-$RV_CURRENT_MODE"
if [[ -f "$filename" ]]; then
cat "$filename"
else
echo "util_readf: File not found: $filename" >&2
return 1
fi
}
current_mode=$( util_readf "$reve_desktop_mode" )
if [[ "$current_mode" == "dark" ]]; then
gsettings set org.gnome.desktop.interface gtk-theme $( util_readf "$gtk_dark_theme" )
gsettings set org.gnome.desktop.interface color-scheme prefer-dark
else
gsettings set org.gnome.desktop.interface gtk-theme $( util_readf "$gtk_light_theme" )
gsettings set org.gnome.desktop.interface color-scheme prefer-light
if ! gsettings set "$key" gtk-theme "$target_theme" ||
[ "$(gsettings get "$key" gtk-theme | tr -d \')" != "$target_theme" ]; then
error E mode/gtk-theme "Could not set gtk-theme to: $target_theme"
fi
if ! gsettings set "$key" color-scheme "$target_scheme" ||
[ "$(gsettings get "$key" color-scheme | tr -d \')" != "$target_scheme" ]; then
error E mode/gtk-theme "Could not set color-scheme to: $target_scheme"
fi

View File

@@ -0,0 +1,35 @@
#!/usr/bin/env bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# chore script
# type mode
# name hyprpaper_single.sh
# desc changes the background depending on the desktop_mode
# vars bg_dark, bg_light
# reload none
if ! command -v hyprpaper &>/dev/null; then
echo "hyprpaper is not installed. Please install it and try again."
exit 1
fi
# shellcheck source=../../_reve.sh
source "$(reve where)/_reve"
bg="$(util_read_config chore."bg_$RV_CURRENT_MODE")"
current_bg="$(util_where_config chore.current_bg)"
# Only change if different from current
if [ "$bg" != "$(readlink -f "$current_bg")" ]; then
hyprctl hyprpaper preload "$bg"
hyprctl hyprpaper wallpaper ",${bg}"
hyprctl hyprpaper unload unused
cp "$bg" "$current_bg"
notify-send --urgency=low --expire-time=1450 --icon="$bg" \
--app-name="reve: hyprpaper_single" \
"Wallpaper changed" \
"Wallpaper changed and saved on $RV_CURRENT_MODE mode."
fi

View File

@@ -7,32 +7,14 @@
# type mode
# name kitty_theme.sh
# desc changes kitty's theme depending on desktop_mode
# vars kitty_dark_theme, kitty_light_theme
# vars kitty/dark, kitty/light
if ! command -v kitty &> /dev/null; then
echo "kitty is not installed. Please install it and try again."
exit 1
# shellcheck source=../../_reve.sh
source "$(reve where)/_reve"
if ! command -v kitty &>/dev/null; then
echo "kitty is not installed. Please install it and try again."
exit 1
fi
reve_folder="$HOME/.config/reve"
reve_desktop_mode="$reve_folder/desktop_mode"
kitty_dark_theme="$reve_folder/chore/kitty/dark"
kitty_light_theme="$reve_folder/chore/kitty/light"
util_readf () {
local filename=$1
if [[ -f "$filename" ]]; then
cat "$filename"
else
echo "util_readf: File not found: $filename" >&2
return 1
fi
}
current_mode=$( util_readf "$reve_desktop_mode" )
if [[ $current_mode == "dark" ]]; then
kitten themes --reload-in=all "$( util_readf "$kitty_dark_theme" )"
else
kitten themes --reload-in=all "$( util_readf "$kitty_light_theme" )"
fi
kitten themes --reload-in=all "$(util_read_config chore.kitty."$RV_CURRENT_MODE")"

20
chores/mode/nvim_theme.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/bin/bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# chore script
# type mode
# name nvim_theme.sh
# desc sends a signal to nvim to fetch desktop_mode
# vars none
# reload none
handle_usr1() {
return
}
trap handle_usr1 USR1
if pids=$(pgrep -f 'nvim'); then
echo "$pids" | xargs kill -USR1
fi

View File

@@ -7,20 +7,10 @@
# type mode
# name spicetify.sh
# desc changes spicetify theme depending on desktop_mode
# vars spicetify_dark_theme, spicetify_light_theme
# vars spicetify/dark, spicetify/light
reve_folder="$HOME/.config/reve"
reve_desktop_mode="$reve_folder/desktop_mode"
# shellcheck source=../../_reve.sh
source "$(reve where)/_reve"
source "$( reve -w )/_reve"
current_mode=$( util_readf "$reve_desktop_mode" )
spicetify_dark_theme=$( util_readf "$reve_folder/chore/spicetify/dark")
spicetify_light_theme=$( util_readf "$reve_folder/chore/spicetify/light")
if [[ "$current_mode" == "dark" ]]; then
spicetify -q config color_scheme "$spicetify_dark_theme"
else
spicetify -q config color_scheme "$spicetify_light_theme"
fi
spicetify -q config color_scheme "$(util_read_config chore.spicetify."$RV_CURRENT_MODE")"
spicetify -q apply

View File

@@ -4,42 +4,27 @@
# Yigid BALABAN <fyb@fybx.dev> 2024
# chore script
# type mode
# name swww_single.sh
# desc changes the background depending on the desktop_mode
# vars bg_dark, bg_light
# type mode
# name swww_single.sh
# desc changes the background depending on the desktop_mode
# vars bg_dark, bg_light
# reload asus_kbd_light.sh
if ! command -v swww &> /dev/null; then
echo "swww is not installed. Please install it and try again."
exit 1
if ! command -v swww &>/dev/null; then
echo "swww is not installed. Please install it and try again."
exit 1
fi
reve_folder="$HOME/.config/reve"
reve_desktop_mode="$reve_folder/desktop_mode"
bg_dark="$reve_folder/chore/bg_dark"
bg_light="$reve_folder/chore/bg_light"
# shellcheck source=../../_reve.sh
source "$(reve where)/_reve"
util_readf () {
local filename=$1
if [[ -f "$filename" ]]; then
cat "$filename"
else
echo "util_readf: File not found: $filename" >&2
return 1
fi
}
current_mode=$( util_readf "$reve_desktop_mode" )
types=("left" "right" "top" "bottom" "wipe" "wave" "grow" "outer")
ltypes=${#types[@]}
rindex=$((RANDOM % ltypes))
rtype=${types[rindex]}
if [[ $current_mode == "dark" ]]; then
swww img --transition-type "$rtype" --transition-pos 1,1 --transition-step 90 "$bg_dark"
notify-send --urgency=low --expire-time=1450 --icon="$bg_dark" --app-name="reve: swww_single" "Wallpaper changed" "Wallpaper changed and saved on dark mode."
else
swww img --transition-type "$rtype" --transition-pos 1,1 --transition-step 90 "$bg_light"
notify-send --urgency=low --expire-time=1450 --icon="$bg_light" --app-name="reve: swww_single" "Wallpaper changed" "Wallpaper changed and saved on light mode."
fi
bg="$(util_read_config chore."bg_$RV_CURRENT_MODE")"
swww img --transition-type "$rtype" --transition-pos 1,1 --transition-step 90 "$bg"
notify-send --urgency=low --expire-time=1450 --icon="$bg" --app-name="reve: swww_single" "Wallpaper changed" "Wallpaper changed and saved on $RV_CURRENT_MODE mode."
cp "$bg" "$(util_where_config chore.current_bg)"
reload misc/asus_kbd_light.sh

22
chores/mode/swww_slideshow.sh Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# chore script
# type mode
# name swww-based wallpaper slideshow
# desc reruns utility/swww_slideshow when mode changes
# vars swwwss.dark, swwwss.light, swwwss.folder
# reload no
# shellcheck source=../../_reve.sh
source "$(reve where)/_reve"
desktop_mode=$(util_read_config base.desktop_mode)
if [ "$desktop_mode" == "dark" ]; then
util_write_config swwwss.folder "$(util_read_config swwwss.dark)"
else
util_write_config swwwss.folder "$(util_read_config swwwss.light)"
fi

0
chores/power/laptop_disp_rr.sh Executable file
View File

26
docs/about_states.md Normal file
View File

@@ -0,0 +1,26 @@
# reve docs
"about states", revision 1
yigid balaban \<fyb@fybx.dev\>
## about states
different from configuration files, some information is temporary, and "local" to current runtime. some utilities, for example, may need a way to store and access variables. for that reason reve exposes 4 functions to work with states that can be temporary or permanent.
for this reason, states can be created/updated, deleted or read using reve.
### reve's API for states
Functions for working with states are defined in `_reve.sh`:
1. `util_create_state {type} {key} [value]`: Creates the state file. `{type}` can be `tmp` for temporary or `prs` for persistent.
1. `util_read_state {key}`: Returns the value read from file addressed by key. Will return `1` if an error occurs.
2. `util_write_state {key} {value}`: Writes the value to file addressed by key. Will **overwrite** without warning.
3. `util_delete_state {key}`: Deletes the file addressed by key. Will delete the containing folder, if the folder is empty.
### underlying implementation
- the `key`s are dot-delimited folders, subfolders and files. The last element of the key is assumed to be the file name.
- trying to read, write or delete a file that is not created will return an error.
- as a result of the rule above, writing a new state is not possible, you have to create it with an explicit type first.
- temporary states will be cleaned when the appropriate call is made (`reve state clean`)

View File

@@ -1,18 +1,18 @@
#!/usr/bin/env bash
#!/bin/bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# chore script
# type mode
# name chore_script.sh
# desc ...
# vars ...
# type mode
# name chore_script.sh
# desc ...
# vars ...
# reload ...
reve_folder="$HOME/.config/reve"
reve_desktop_mode="$reve_folder/desktop_mode"
# shellcheck source=../_reve.sh
source "$(reve where)/_reve"
source "$( reve -w )/_reve"
echo "Hello, world! Current mode is $RV_CURRENT_MODE."
current_mode=$( util_readf "$reve_desktop_mode" )
echo "Hello, world! Current mode is $current_mode."
reload mode/gtk_theme

View File

@@ -11,41 +11,45 @@ reve_installation_target="$HOME/.local/bin/reve"
echo "[1/5] Creating reve installation folder"
mkdir -p "$reve_installation_target"
echo "[2/5] Copying: reve.sh and _reve.sh"
echo "[2/5] Copying: reve.sh and other internal tools"
cp reve.sh "$reve_installation_target/reve"
cp _reve.sh "$reve_installation_target/_reve"
cp _reve_utils.sh "$reve_installation_target/_reve_utils"
cp _reve_states.sh "$reve_installation_target/_reve_states"
chmod +x "$reve_installation_target/reve"
chmod -x "$reve_installation_target/_reve"
chmod -x "$reve_installation_target/_reve_utils"
chmod -x "$reve_installation_target/_reve_states"
echo "[3/5] Adding reve to path"
if grep -q "/bin/bash" /etc/shells; then
echo "==> bash detected."
if ! grep -q "$reve_installation_target" ~/.bashrc; then
echo "export PATH=\"\$PATH:$reve_installation_target\"" >> ~/.bashrc
echo "Added $reve_installation_target to bash PATH."
else
echo "$reve_installation_target is already in bash PATH."
fi
echo "==> bash detected."
if ! grep -q "$reve_installation_target" ~/.bashrc; then
echo "export PATH=\"\$PATH:$reve_installation_target\"" >>~/.bashrc
echo "Added $reve_installation_target to bash PATH."
else
echo "$reve_installation_target is already in bash PATH."
fi
fi
if grep -q "/bin/zsh" /etc/shells; then
echo "==> zsh detected."
if ! grep -q "$reve_installation_target" ~/.zshrc; then
echo "export PATH=\"\$PATH:$reve_installation_target\"" >> ~/.zshrc
echo "Added $reve_installation_target to zsh PATH."
else
echo "$reve_installation_target is already in zsh PATH."
fi
echo "==> zsh detected."
if ! grep -q "$reve_installation_target" ~/.zshrc; then
echo "export PATH=\"\$PATH:$reve_installation_target\"" >>~/.zshrc
echo "Added $reve_installation_target to zsh PATH."
else
echo "$reve_installation_target is already in zsh PATH."
fi
fi
if grep -q "/bin/fish" /etc/shells; then
echo "==> fish detected."
if ! fish -c "echo $PATH | grep -q $reve_installation_target"; then
fish -c "fish_add_path $reve_installation_target"
echo "Added $reve_installation_target to fish PATH."
else
echo "$reve_installation_target is already in fish PATH."
fi
echo "==> fish detected."
if ! fish -c "echo $PATH | grep -q $reve_installation_target"; then
fish -c "fish_add_path $reve_installation_target"
echo "Added $reve_installation_target to fish PATH."
else
echo "$reve_installation_target is already in fish PATH."
fi
fi
echo "[4/5] Creating chores/mode folder"

413
reve.sh
View File

@@ -3,173 +3,310 @@
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# shellcheck disable=SC2086
# SC2086 is disabled here, but all user inputs must be quoted
in_desktop_mode=""
in_reason=""
in_chore_name=""
SHORTOPTS="h,m:r:c:w,"
LONGOPTS="help,mode:,reason:,chore:,where"
PARSED_OPTS=$(getopt --options $SHORTOPTS --longoptions $LONGOPTS --name "$0" -- "$@")
if [[ $? -ne 0 ]]; then
echo "Failed to parse options."
exit 1
fi
eval set -- "$PARSED_OPTS"
rt_script_dir=$(realpath "$(dirname "$0")")
rt_script_dir=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
rt_has_mode_changed=0
rt_current_mode="unset"
reve_folder="$HOME/.config/reve"
reve_desktop_mode="$reve_folder/desktop_mode"
reve_time_day="$reve_folder/time_day"
reve_time_night="$reve_folder/time_night"
reve_chores_mode="$rt_script_dir/chores/mode"
source "$rt_script_dir/_reve"
# bring reve utility functions to the context
# shellcheck source=_reve.sh
source "$rt_script_dir/_reve" >&/dev/null
(($? == 1)) && source "$rt_script_dir/_reve.sh" # looks like we're in dev environment
util_help () {
echo "Usage: $0 [options]"
echo "Options:"
echo "desktop_mode (-m, --mode): dark, light"
echo "reason (-r, --reason): time, network"
echo "chore (-c, --chore): chore_name"
echo "where (-w, --where): returns where reve's installed"
util_help() {
local command="$1"
case $command in
reve | '')
echo "=> Usage: reve [command] OR reve [subcommand] [command]"
echo "== Commands =="
echo "mode {desktop_mode} sets desktop mode, accepts 'dark' or 'light'"
echo "reason {reason} run reve with reason, accepts 'network' or 'time'"
echo "chore {chore_name} run a single chore, accepts chore name"
echo "where returns where reve's installed"
echo "poll runs reve to update desktop_mode & power_mode, and do chores"
echo "help [subcommand] shows help message"
echo "== Subcommands =="
echo "1. config gets/sets configuration values"
echo "2. update updates chores"
echo "3. chores manages installed chores"
;;
config)
echo "=> Usage"
echo "1. reve config get {config_key} get the value stored in file"
echo "2. reve config set {config_key} {value} set the value of file"
echo "3. reve config rm {config_key} delete the config file"
;;
update)
echo "=> Usage: reve update [chore names...] updates chores from upstream"
echo "== Details =="
echo "Updates all chores present on your installation if nothing is given."
echo "The chore names must be space delimited."
;;
chores)
echo "=> Usage"
echo "1. reve chores list lists all installed chores"
echo "2. reve chores add {chore_name} adds chore_name from .reve_repo"
echo "3. reve chores rm {chore_name} removes chore_name from installation"
echo "4. reve chores more lists chores available for installation"
echo "== Details =="
echo "'chore_name' must be a valid chore name like 'mode/gtk_theme', 'misc/foo'."
echo "The file extension (.sh) must be discarded."
echo "'.reve_repo' is managed by reve, and it's located in '\$reve_installation'."
;;
esac
}
util_mkdirs () {
mkdir -p "$reve_folder"
}
f_shell_completion() {
if [ "$in_shell_comp" == "fish" ]; then
cp "$rt_script_dir/completions/reve.fish" "$HOME/.config/fish/completions/reve.fish"
elif [ "$in_shell_comp" == "bash" ]; then
_reve_completions=$(util_readf "$rt_script_dir/completions/reve.bash")
util_run_single_chore () {
local chore_fullname="$reve_chores_mode/$1"
if [ -x "$chore_fullname.sh" ]; then
echo "[reve] [I] Running single chore: $chore_fullname"
bash "$chore_fullname.sh"
else
echo "[reve] [E] util_run_single_chore: $chore_fullname is not executable"
fi
}
f_shell_completion () {
if [ "$in_shell_comp" == "fish" ]; then
cp "$rt_script_dir/completions/reve.fish" "$HOME/.config/fish/completions/reve.fish"
elif [ "$in_shell_comp" == "bash" ]; then
_reve_completions=$( util_readf "$rt_script_dir/completions/reve.bash" )
if [ ! -f "$HOME/.bash_completion" ]; then
touch "$HOME/.bash_completion"
fi
if ! grep -q "_reve_completions" "$HOME/.bash_completion"; then
echo "$_reve_completions" >> "$HOME/.bash_completion"
fi
if [ -n "$BASH_SOURCE" ]; then
source "$HOME/.bash_completion"
fi
fi
}
set_desktop_mode () {
if [[ -n "$in_desktop_mode" ]]; then
echo "$in_desktop_mode" > "$reve_desktop_mode"
return 1 # since mode has changed
if [ ! -f "$HOME/.bash_completion" ]; then
touch "$HOME/.bash_completion"
fi
local current_mode="unset"
local previous_mode day_start night_start num_day num_night current_time
previous_mode=$( util_readf "$reve_desktop_mode" )
day_start=$( util_readf "$reve_time_day" )
night_start=$( util_readf "$reve_time_night" )
num_day=$( awk -F: '{print $1 * 60 + $2}' <<< "$day_start" )
num_night=$( awk -F: '{print $1 * 60 + $2}' <<< "$night_start" )
current_time=$( awk -F: '{print $1 * 60 + $2}' <<< "$(date +%H:%M)" )
if ! grep -q "_reve_completions" "$HOME/.bash_completion"; then
echo "$_reve_completions" >>"$HOME/.bash_completion"
fi
fi
}
set_desktop_mode() {
local previous_mode num_day num_night current_time
previous_mode=$(util_read_config base.desktop_mode)
if [[ -n "$in_desktop_mode" ]]; then
rt_current_mode="$in_desktop_mode"
echo "$in_desktop_mode" >"$reve_desktop_mode"
else
num_day=$(awk -F: '{print $1 * 60 + $2}' <<<"$(util_read_config base.time_day)")
num_night=$(awk -F: '{print $1 * 60 + $2}' <<<"$(util_read_config base.time_night)")
current_time=$(awk -F: '{print $1 * 60 + $2}' <<<"$(date +%H:%M)")
if ((num_night > current_time && current_time >= num_day)); then
current_mode="light"
rt_current_mode="light"
else
current_mode="dark"
rt_current_mode="dark"
fi
echo "$rt_current_mode" >"$reve_desktop_mode"
fi
echo "[reve] [I] Setting the mode: $current_mode"
echo "$current_mode" > "$reve_desktop_mode"
if [ "$current_mode" == "$previous_mode" ]; then
return 0 # since mode did not change
else
return 1
fi
}
prepare () {
util_mkdirs
set_desktop_mode
rt_has_mode_changed="$?"
echo "[reve] [I] Setting the mode: $rt_current_mode"
if [ "$rt_current_mode" == "$previous_mode" ]; then
return 0 # since mode did not change
else
return 1
fi
}
# Called when the mode (the default state, is either dark or light) changes
chores_mode () {
for file in "$reve_chores_mode"/*; do
if [ -x "$file" ]; then
echo "[reve] [I] Running chore: $( basename "$file" )"
bash "$file"
else
echo "[reve] [E] chores_mode: $file is not executable"
fi
chores_mode() {
for file in "$reve_chores_mode"/*; do
util_run_chore "mode/$(basename "${file%.sh}")" $rt_current_mode
done
}
util_handle_pos() {
# args: $@ -- handles positionals
# returns: 'light' or 'dark' depending on positionals or $rt_current_mode
local forced_mode=$rt_current_mode
for arg in "$@"; do
if [[ "$arg" == "-d" || "$arg" == "--dark" ]]; then
forced_mode="dark"
elif [[ "$arg" == "-l" || "$arg" == "--light" ]]; then
forced_mode="light"
fi
done
echo $forced_mode
}
f_get_available_chores() {
c_ins=0
c_ble=0
while IFS= read -r file; do
file=${file#"$reve_installation/.reve_repo/chores/"} && file=${file%.sh}
if [ -f "$reve_installation/chores/$file.sh" ]; then
echo "$file"
((c_ins++))
else
echo "$file"
((c_ble++))
fi
done < <(find "$reve_installation/.reve_repo/chores" -type f -name "*.sh")
error I f_get_available_chores "$c_ins installed, $c_ble available"
}
f_add_chore() {
# args: $1 -- chore_name
# returns: 1 if error, otherwise 0
src_file="$reve_installation/.reve_repo/chores/$1.sh"
if [ -f "$src_file" ]; then
cp "$src_file" "$reve_installation/chores/$1.sh"
else
error E f_add_chore "there's no chore named '$1' in upstream"
return 1
fi
return 0
}
f_rm_chore() {
# args: $1 -- chore_name
# returns: 1 if error, otherwise 0
target_file="$reve_installation/chores/$1.sh"
if [ -f "$target_file" ]; then
rm "$target_file"
else
error E f_rm_chore "there's no chore named '$1' in installation"
return 1
fi
return 0
}
sub_chores() {
case $1 in
list)
echo "installed chores:"
find "$reve_installation/chores/" -type f -name "*.sh" | while read -r file; do
echo "$file" | awk -F/ '{print " -> "$(NF-1)"/"$NF}'
done
;;
more) f_get_available_chores ;;
add) f_add_chore $2 ;;
rm) f_rm_chore $2 ;;
esac
}
main () {
if (( rt_has_mode_changed == 1 )) || [[ "$in_reason" == "chores_mode" ]]; then
chores_mode
fi
sub_update() {
local repo_dir="$reve_installation/.reve_repo"
local repo_url="https://git.fybx.dev/fyb/reve.git"
if [[ "$in_chore_name" != "" ]]; then
util_run_single_chore "$in_chore_name"
fi
if [ ! -d "$repo_dir/.git" ]; then
error I reve "in sub_update, cloning repository"
git clone "$repo_url" "$repo_dir" &>/dev/null
else
error I reve "in sub_update, pulling changes"
git -C "$repo_dir" pull &>/dev/null
fi
if [ $# -eq 0 ]; then
error I sub_update "updating all chores"
count=0
find "$reve_installation/chores/" -type f -name "*.sh" | while read -r file; do
file="${file#"$reve_installation/chores/"}"
file="${file%".sh"}"
echo $file
# shellcheck disable=SC2030
f_add_chore "$file" && ((count++))
done
# shellcheck disable=SC2031
((count != 0)) && error I sub_update "copied $count files"
else
for arg in "$@"; do
f_add_chore "$arg"
done
fi
}
while true; do
case "$1" in
-h|--help)
util_help
exit 0
;;
-m|--mode)
in_desktop_mode="$2"
shift 2
;;
-r|--reason)
in_reason="$2"
shift 2
;;
-c|--chore)
in_chore_name="$2"
shift 2
;;
-w|--where)
dirname "$( which reve )"
exit 0
;;
--shell-completion)
in_shell_comp="$2"
shift 2
f_shell_completion
exit 0
;;
--)
shift
break
;;
*)
echo "Invalid option: $1"
exit 1
;;
esac
done
sub_config() {
case "$1" in
get)
util_read_config "$2"
;;
set)
util_write_config "$2" "$3"
;;
rm | delete)
util_delete_config "$2"
;;
"")
util_help config
;;
*)
echo "reve: in subcommand config: '$1' is not a valid command"
;;
esac
}
prepare
main
main() {
mkdir -p "$reve_folder"
if [[ "$in_chore_name" != "" ]]; then
forced_mode=$(util_handle_pos "$@")
util_run_chore "$in_chore_name" $forced_mode
return
fi
set_desktop_mode
rt_has_mode_changed="$?"
if ((rt_has_mode_changed == 1)) || [[ "$in_reason" == "chores_mode" ]]; then
chores_mode
fi
}
case "$1" in
config)
sub_config "$2" "$3" "$4"
exit 0
;;
update)
sub_update "${@:2}"
exit 0
;;
chores)
sub_chores "$2" "$3"
exit 0
;;
help)
util_help "$2"
exit 0
;;
where)
dirname "$(which reve)"
exit 0
;;
shell-completion)
in_shell_comp="$2"
f_shell_completion
exit 0
;;
state)
if [ "$2" == "clean" ]; then
util_deleteall_temp
fi
;;
mode)
in_desktop_mode="$2"
;;
reason)
in_reason="$2"
;;
chore)
in_chore_name="$2"
;;
poll) ;;
"")
util_help "$2"
exit 0
;;
*)
echo "reve: invalid command or subcommand: $1"
exit 1
;;
esac
main "$@"

21
utility/nemo/set_wallpaper.sh Normal file → Executable file
View File

@@ -3,20 +3,19 @@
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
# ln -s utility/nemo/set_wallpaper.sh ~/.local/share/nemo/scripts
# cp utility/nemo/set_wallpaper.sh ~/.local/share/nemo/scripts
# chmod +x ~/.local/share/nemo/scripts/set_wallpaper.sh
reve_folder="$HOME/.config/reve"
reve_desktop_mode="$reve_folder/desktop_mode"
# shellcheck source=../../_reve.sh
source "$(reve where)/_reve"
mode=$(cat "$reve_folder/desktop_mode")
first=$(echo "$NEMO_SCRIPT_SELECTED_FILE_PATHS" | head -n 1)
bgl="$reve_folder/chores/bg_light"
bgd="$reve_folder/chores/bg_dark"
mode=$(util_read_config base.desktop_mode)
if [ "$mode" = "light" ]; then
cp "$first" "$bgl"
if [ "$NEMO_SCRIPT_SELECTED_FILE_PATHS" = "" ]; then
first=$1
else
cp "$first" "$bgd"
first=$(echo "$NEMO_SCRIPT_SELECTED_FILE_PATHS" | head -n 1)
fi
bash "$HOME/scripts/utility/deskenv.sh" nobright "$mode"
util_write_config "chore.bg_$mode" "$first"
reload mode/swww_single "$mode"