From 16690836d6af7a7903c2b09d5f46c277394ffd4d Mon Sep 17 00:00:00 2001 From: devaine Date: Tue, 29 Jul 2025 15:05:52 -0500 Subject: [PATCH] refactor: refactored battery bash scripts into a C++ daemon --- {notifs => archived/battery-scripts}/battery | 4 +- archived/battery-scripts/battery-daemon | 5 + .../battery-scripts}/battery-status | 0 .../battery-scripts}/charge-status | 0 daemons/battery-daemon | Bin 68 -> 46424 bytes daemons/battery-daemon.cpp | 173 ++++++++++++++++++ notifs/brightness | 9 + notifs/info | 15 ++ notifs/volume | 8 + notifs/window | 3 + 10 files changed, 215 insertions(+), 2 deletions(-) rename {notifs => archived/battery-scripts}/battery (96%) create mode 100644 archived/battery-scripts/battery-daemon rename {notifs => archived/battery-scripts}/battery-status (100%) rename {notifs => archived/battery-scripts}/charge-status (100%) mode change 100644 => 100755 daemons/battery-daemon create mode 100644 daemons/battery-daemon.cpp create mode 100755 notifs/info create mode 100755 notifs/window diff --git a/notifs/battery b/archived/battery-scripts/battery similarity index 96% rename from notifs/battery rename to archived/battery-scripts/battery index cebbcca..98398e8 100755 --- a/notifs/battery +++ b/archived/battery-scripts/battery @@ -25,7 +25,7 @@ battery-full() { } battery-low() { - notify-send "Low Battery" "${BAT_PERCENT}% of battery remaining." -u critical -i "battery-caution" -r 9991 + notify-send "Low Battery" "${BAT_PERCENT}% of battery remaining." -u critical -i "battery-caution" -r 9991 -t 5000 touch $LOW_BAT_FILE rm -rf $FULL_BAT_FILE } @@ -67,7 +67,7 @@ elif [ "$BAT_PERCENT" -le $WARNING_PERCENT ] && [ "$DISCHARGING_COUNT" -eq 1 ] & # If LOW_BAT_FILE Exists, Spam Until It's Charging elif [ "$BAT_PERCENT" -le $WARNING_PERCENT ] && [ "$DISCHARGING_COUNT" -eq 1 ] && [ -f $LOW_BAT_FILE ]; then - notify-send "Low Battery" "${BAT_PERCENT}% of battery remaining." -u critical -i "battery-caution" -r 9991 + notify-send "Low Battery" "${BAT_PERCENT}% of battery remaining." -u critical -i "battery-caution" -r 9991 -t 5000 fi # Debug commands diff --git a/archived/battery-scripts/battery-daemon b/archived/battery-scripts/battery-daemon new file mode 100644 index 0000000..ea05e40 --- /dev/null +++ b/archived/battery-scripts/battery-daemon @@ -0,0 +1,5 @@ +#!/bin/bash +while true; do + ~/.scripts/notifs/battery + sleep 1 +done diff --git a/notifs/battery-status b/archived/battery-scripts/battery-status similarity index 100% rename from notifs/battery-status rename to archived/battery-scripts/battery-status diff --git a/notifs/charge-status b/archived/battery-scripts/charge-status similarity index 100% rename from notifs/charge-status rename to archived/battery-scripts/charge-status diff --git a/daemons/battery-daemon b/daemons/battery-daemon old mode 100644 new mode 100755 index ea05e4057260dd3576e9392d8b597bd816e916ed..3ef384b6e77654bc16e11d20a576bcf9f3f75d8e GIT binary patch literal 46424 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 literal 68 zcmY#Z)KALH(@#n)&fqG~$jnJqC@CsUwN^;U=i;o>*DFpg$}A`;*3Zi?$xJH-Dk~{T WEvn?=EY3+yEl@DzO3BYl +#include +#include +#include +#include // pid_t data type +#include +#include // For fork(); + +using namespace std; + +// If another instance of this program is running... +const char *lockFilePath = "/tmp/bat-daemon-run"; + +// Checks if the file exists. (Another instance is running) +bool isRunning() { + ifstream lockFile(lockFilePath); + return lockFile.good(); +} + +// Creates file w/ PID +void createLockFile() { + ofstream lockFile(lockFilePath); + lockFile << getpid(); +} + +// Removes file. +void removeLockFile() { remove(lockFilePath); } + +void send_notifs_warn(const int &percent) { + // Formulate command + string command = + "notify-send 'Low Battery' '" + to_string(percent) + + "% of battery remaining.' -u critical -i 'battery-caution' -t 5000"; + + // Execute command as a C-String (same contents, but compatible with C++ code) + // "Returns a pointer to an array that contains the contents of the variable" + system(command.c_str()); +} + +void send_notifs_charge(const int &percent, const int status) { + string command; + + switch (status) { + case 1: + command = "notify-send 'Charging' 'Charging battery at " + + to_string(percent) + + "%' -u low -i 'battery-level-50-charging-symbolic' -t 5000"; + break; + + case 0: + command = "notify-send 'Discharging' '" + to_string(percent) + + "% remaining' -u low -i 'battery-level-70-symbolic' -t 5000"; + break; + } + + system(command.c_str()); +} + +void send_notifs_full() { + string command = "notify-send 'Battery Full' 'Battery is fully charged!' -i " + "'battery-full-charged' -t 5000"; + system(command.c_str()); +} + +// Turn program into a daemon. +void daemonize() { + pid_t pid = fork(); + + // if forking fails, exit. + if (pid < 0) { + exit(EXIT_FAILURE); + } + + if (pid > 0) { + exit(EXIT_SUCCESS); + } + + // New session: if fails, exit. + // - New process becomes the leader + if (setsid() < 0) { + exit(EXIT_FAILURE); + } + + // Change directory to root + chdir("/"); + + // Redirects all streams to /dev/null + freopen("/dev/null", "r", stdin); + freopen("/dev/null", "w", stdout); + freopen("/dev/null", "w", stderr); +} + +// Checks battery info. (Charging, Discharging, etc.) +void battery() { + int OLD_BAT_PERCENT = 100; // Maxing out to prevent bugs + int CHARGE = 0; // 1 = Charging, 0 = Discharging + int BAT_FULL = 0; // 1 = Full, 0 = Not Full + while (true) { + int BAT_WARN = 36; + // Read and Grab File Info: + + // ifstream (input file stream) class: operates on files (I/O) + ifstream BAT_STATUS_FILE("/sys/class/power_supply/BAT0/status"); + string BAT_STATUS; + + ifstream BAT_PERCENT_FILE("/sys/class/power_supply/BAT0/capacity"); + int BAT_PERCENT; + + // If it can't extract info, exit. + if (!(BAT_PERCENT_FILE >> BAT_PERCENT) || + !(BAT_STATUS_FILE >> BAT_STATUS)) { + exit(EXIT_FAILURE); + } + + // Timing: + // timeval = Time Value accurate from microseconds to years. + struct timeval tv; + + // Set intervals: 0sec + 100 milsec. + tv.tv_sec = 0; + tv.tv_usec = 100000; + + if (BAT_PERCENT <= BAT_WARN) { + if ((BAT_PERCENT < OLD_BAT_PERCENT) && (BAT_STATUS == "Discharging")) { + CHARGE = 0; + OLD_BAT_PERCENT = BAT_PERCENT; + send_notifs_warn(BAT_PERCENT); + } + } + + if (BAT_STATUS == "Charging") { + if ((BAT_PERCENT < 99) && (CHARGE == 0)) { + CHARGE = 1; + OLD_BAT_PERCENT = BAT_PERCENT; + BAT_FULL = 0; + send_notifs_charge(BAT_PERCENT, CHARGE); + } + + if (BAT_PERCENT >= 99 && BAT_FULL == 0) { + BAT_FULL = 1; + CHARGE = 1; + send_notifs_full(); + } + } + + if (BAT_STATUS == "Discharging" && CHARGE == 1) { + CHARGE = 0; + send_notifs_charge(BAT_PERCENT, CHARGE); + + if (BAT_PERCENT < 99) { + BAT_FULL = 0; + } + } + + select(0, NULL, NULL, NULL, &tv); + } +} + +// Initializer +int main() { + if (isRunning()) { + cout << "Another process already exists!" << endl; + return 1; + } + + createLockFile(); + + daemonize(); + battery(); + + removeLockFile(); + return 0; +} diff --git a/notifs/brightness b/notifs/brightness index cec2e0b..86c26f5 100755 --- a/notifs/brightness +++ b/notifs/brightness @@ -11,6 +11,10 @@ bright_dec() { } +keybind-func() { + echo "$CURRENT_BRIGHTNESS" +} + while test $# -gt 0; do case "$1" in inc) @@ -20,5 +24,10 @@ while test $# -gt 0; do dec) bright_dec && exit 0 ;; + + keybind) + keybind-func && exit 0 + ;; + esac done diff --git a/notifs/info b/notifs/info new file mode 100755 index 0000000..6376149 --- /dev/null +++ b/notifs/info @@ -0,0 +1,15 @@ +#!/bin/bash + +# Enter scripts directory +cd ~/.scripts/notifs || exit + +# Constants +CURRENT_VOL=$(./volume keybind | grep -o '^[^ ]*') +CURRENT_MIC_VOL=$(./volume keybind | awk '{ print $2 }') +BRIGHTNESS=$(./brightness keybind) + +# Variables for display, basically multiplies floats to integers +DISPLAY_VOL=$(awk '{ print $1 * $2 }' <<<"${CURRENT_VOL} 100") +DISPLAY_MIC_VOL=$(awk '{ print $1 * $2 }' <<<"${CURRENT_MIC_VOL} 100") + +dunstify "All other info:" "Brightness: $BRIGHTNESS%\nCurrent Volume: $DISPLAY_VOL%\nCurrent Mic. Volume: $DISPLAY_MIC_VOL%" diff --git a/notifs/volume b/notifs/volume index 9202784..2db2103 100755 --- a/notifs/volume +++ b/notifs/volume @@ -92,6 +92,10 @@ mic_mute_toggle() { fi } +keybind-func() { + echo "$CURRENT_VOL" "$CURRENT_MIC_VOL" +} + while test $# -gt 0; do case "$1" in inc) @@ -118,5 +122,9 @@ while test $# -gt 0; do mic_mute_toggle && exit 0 ;; + keybind) + keybind-func && exit 0 + ;; + esac done diff --git a/notifs/window b/notifs/window new file mode 100755 index 0000000..823ea72 --- /dev/null +++ b/notifs/window @@ -0,0 +1,3 @@ +#!/bin/bash +dunstify "Switching Window" "Current Window: $1" -t 1000 -r 5000 +swaymsg workspace number "$1"