Compare commits

...

18 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
18 changed files with 697 additions and 325 deletions

View File

@@ -7,38 +7,76 @@
reve_installation="$HOME/.local/bin/reve"
reve_config="$HOME/.config/reve"
util_readf () {
local filename=$1
_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"
if [[ -f "$filename" ]]; then
cat "$filename"
else
echo "[reve] [E] util_readf: File not found: $filename" >&2
return 1
fi
}
util_read_config () {
util_where_config() {
local config_key=$1
pre_removed_key=${config_key/#base./}
config_path=$( echo "$pre_removed_key" | sed 's/\./\//g' )
util_readf "$reve_config/$config_path"
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 config_key=$1 new_value=$2
pre_removed_key=${config_key/#base./}
config_path=$( echo "$pre_removed_key" | sed 's/\./\//g' )
mkdir -p "$( dirname "$reve_config/$config_path" )"
echo "$new_value" > "$reve_config/$config_path"
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 () {
util_delete_config() {
local config_key=$1
pre_removed_key=${config_key/#base./}
config_path=$( echo "$pre_removed_key" | sed 's/\./\//g' )
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"
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
# 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

@@ -8,38 +8,23 @@
# 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
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,4 +1,4 @@
#!/usr/bin/env bash
#!/bin/bash
# reve desktop environment framework
# Yigid BALABAN <fyb@fybx.dev> 2024
@@ -8,11 +8,11 @@
# 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,17 +11,21 @@ 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 "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."
@@ -31,7 +35,7 @@ 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 "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."

280
reve.sh
View File

@@ -3,40 +3,44 @@
# 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=""
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"
# 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
(($? == 1)) && source "$rt_script_dir/_reve.sh" # looks like we're in dev environment
util_help () {
util_help() {
local command="$1"
case $command in
reve|'')
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"
@@ -47,162 +51,262 @@ util_help () {
update)
echo "=> Usage: reve update [chore names...] updates chores from upstream"
echo "== Details =="
echo "Updates all chores present on your configuration if nothing is given. The"
echo "chore names must be space delimited."
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"
}
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 () {
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" )
_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"
echo "$_reve_completions" >>"$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
fi
set_desktop_mode() {
local previous_mode num_day num_night current_time
previous_mode=$(util_read_config base.desktop_mode)
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 [[ -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
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
}
prepare () {
util_mkdirs
set_desktop_mode
rt_has_mode_changed="$?"
}
# Called when the mode (the default state, is either dark or light) changes
chores_mode () {
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
util_run_chore "mode/$(basename "${file%.sh}")" $rt_current_mode
done
}
sub_config () {
local config_key=$2
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
}
sub_update() {
local repo_dir="$reve_installation/.reve_repo"
local repo_url="https://git.fybx.dev/fyb/reve.git"
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
}
sub_config() {
case "$1" in
get)
util_read_config "$config_key"
util_read_config "$2"
;;
set)
util_write_config "$config_key" "$3"
util_write_config "$2" "$3"
;;
rm|delete)
util_delete_config "$config_key"
rm | delete)
util_delete_config "$2"
;;
"")
util_help config
;;
*)
echo "[reve] [E] in subcommand config: '$1' is not a valid command"
echo "reve: in subcommand config: '$1' is not a valid command"
;;
esac
}
main () {
if (( rt_has_mode_changed == 1 )) || [[ "$in_reason" == "chores_mode" ]]; then
chores_mode
fi
main() {
mkdir -p "$reve_folder"
if [[ "$in_chore_name" != "" ]]; then
util_run_single_chore "$in_chore_name"
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
config)
sub_config "$2" "$3" "$4"
exit 0
;;
update)
sub_update
update)
sub_update "${@:2}"
exit 0
;;
help)
chores)
sub_chores "$2" "$3"
exit 0
;;
help)
util_help "$2"
exit 0
;;
where)
dirname "$( which reve )"
where)
dirname "$(which reve)"
exit 0
;;
shell-completion)
shell-completion)
in_shell_comp="$2"
f_shell_completion
exit 0
;;
mode)
state)
if [ "$2" == "clean" ]; then
util_deleteall_temp
fi
;;
mode)
in_desktop_mode="$2"
;;
reason)
reason)
in_reason="$2"
;;
chore)
chore)
in_chore_name="$2"
;;
*)
echo "Invalid command or subcommand: $1"
poll) ;;
"")
util_help "$2"
exit 0
;;
*)
echo "reve: invalid command or subcommand: $1"
exit 1
;;
esac
prepare
main
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"