mirror of
https://github.com/eRgo35/dwm.git
synced 2026-02-04 11:36:11 +01:00
Compare commits
26 Commits
697d8236b2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f02c5dbc0b | |||
| ab9f2e41a5 | |||
| 7b365e95a7 | |||
| d400b7b0e9 | |||
| e965863d95 | |||
| 66fa978463 | |||
| e63c8cbfd4 | |||
| 7b00729d64 | |||
| 802582ceec | |||
| 2e00516fd0 | |||
| 26303b95e9 | |||
| cc72b2eff6 | |||
| dfc7fb0e2e | |||
| 688c3654cd | |||
| 7d75c147d7 | |||
| 3c8140601d | |||
| e528e0865f | |||
| 2c83076d18 | |||
| dc05a9f0df | |||
| 24eb4817db | |||
| b158739c63 | |||
| 97dd5ae052 | |||
| ccb50b0234 | |||
| 261eac2d36 | |||
| 2827b6f7f9 | |||
| 4e172607d5 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -4,3 +4,5 @@ dwm-msg
|
||||
config.h
|
||||
patches.h
|
||||
.legacy/
|
||||
.direnv/
|
||||
result
|
||||
|
||||
245
bar.sh
Normal file
245
bar.sh
Normal file
@@ -0,0 +1,245 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Global variables for theme tracking
|
||||
CURRENT_THEME=""
|
||||
THEME_FILE="$HOME/.current_theme"
|
||||
LAST_MTIME=0
|
||||
|
||||
# Function to read current theme from file
|
||||
get_current_theme() {
|
||||
if [ -f "$THEME_FILE" ]; then
|
||||
cat "$THEME_FILE" 2>/dev/null || echo "dark"
|
||||
else
|
||||
echo "dark" # default to dark theme
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to check if theme file has been modified
|
||||
theme_file_changed() {
|
||||
if [ -f "$THEME_FILE" ]; then
|
||||
local current_mtime=$(stat -c %Y "$THEME_FILE" 2>/dev/null || echo 0)
|
||||
if [ "$current_mtime" -gt "$LAST_MTIME" ]; then
|
||||
LAST_MTIME="$current_mtime"
|
||||
return 0 # File was modified
|
||||
fi
|
||||
fi
|
||||
return 1 # No change
|
||||
}
|
||||
|
||||
# Function to update theme if changed
|
||||
update_theme_if_changed() {
|
||||
if theme_file_changed; then
|
||||
local new_theme=$(get_current_theme)
|
||||
if [ "$new_theme" != "$CURRENT_THEME" ]; then
|
||||
CURRENT_THEME="$new_theme"
|
||||
set_colors
|
||||
echo "Bar theme changed to: $CURRENT_THEME" >&2
|
||||
return 0 # Theme was updated
|
||||
fi
|
||||
fi
|
||||
return 1 # No update
|
||||
}
|
||||
|
||||
# Function to set color palette based on theme
|
||||
set_colors() {
|
||||
if [ "$CURRENT_THEME" = "light" ]; then
|
||||
# Rosé Pine Dawn (light) color palette
|
||||
BASE=#faf4ed
|
||||
SURFACE=#fffaf3
|
||||
OVERLAY=#f2e9e1
|
||||
|
||||
MUTED=#9893a5
|
||||
SUBTLE=#797593
|
||||
TEXT=#575279
|
||||
|
||||
LOVE=#b4637a
|
||||
GOLD=#ea9d34
|
||||
ROSE=#d7827e
|
||||
PINE=#286983
|
||||
FOAM=#56949f
|
||||
IRIS=#907aa9
|
||||
|
||||
HIGHLIGHT_LOW=#f4ede8
|
||||
HIGHLIGHT_MED=#dfdad9
|
||||
HIGHLIGHT_HIGH=#cecacd
|
||||
else
|
||||
# Rosé Pine (dark) color palette - default
|
||||
BASE=#191724
|
||||
SURFACE=#1f1d2e
|
||||
OVERLAY=#26233a
|
||||
|
||||
MUTED=#6e6a86
|
||||
SUBTLE=#908caa
|
||||
TEXT=#e0def4
|
||||
|
||||
LOVE=#eb6f92
|
||||
GOLD=#f6c177
|
||||
ROSE=#ebbcba
|
||||
PINE=#31748f
|
||||
FOAM=#9ccfd8
|
||||
IRIS=#c4a7e7
|
||||
|
||||
HIGHLIGHT_LOW=#21202e
|
||||
HIGHLIGHT_MED=#403d52
|
||||
HIGHLIGHT_HIGH=#524f67
|
||||
fi
|
||||
}
|
||||
|
||||
# Initialize theme
|
||||
CURRENT_THEME=$(get_current_theme)
|
||||
if [ -f "$THEME_FILE" ]; then
|
||||
LAST_MTIME=$(stat -c %Y "$THEME_FILE" 2>/dev/null || echo 0)
|
||||
fi
|
||||
set_colors
|
||||
echo "Bar started with theme: $CURRENT_THEME" >&2
|
||||
|
||||
# Function to get CPU usage
|
||||
get_cpu_usage() {
|
||||
cpu_usage=$(awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print int(($2+$4-u1) * 100 / (t-t1)); }' \
|
||||
<(grep 'cpu ' /proc/stat) <(sleep 1; grep 'cpu ' /proc/stat))
|
||||
|
||||
echo "^c$FOAM^CPU: $cpu_usage%"
|
||||
}
|
||||
|
||||
# Function to get memory usage
|
||||
get_memory_usage() {
|
||||
# Extract used and total memory in kilobytes
|
||||
mem_info=$(free -k | awk '/^Mem:/ {print $3, $2}')
|
||||
used_mem=$(echo $mem_info | awk '{print $1}')
|
||||
total_mem=$(echo $mem_info | awk '{print $2}')
|
||||
|
||||
# Calculate memory usage percentage
|
||||
mem_percent=$(awk "BEGIN {printf \"%.0f%%\", ($used_mem / $total_mem) * 100}")
|
||||
|
||||
# Output the result with color
|
||||
echo "^c$IRIS^MEM: $mem_percent"
|
||||
}
|
||||
|
||||
# Function to get volume level
|
||||
get_volume() {
|
||||
# Get the default sink (output device) and its volume/mute status
|
||||
default_sink=$(pactl get-default-sink)
|
||||
volume=$(pactl get-sink-volume $default_sink | grep -o '[0-9]*%' | head -1)
|
||||
is_muted=$(pactl get-sink-mute $default_sink | grep -o 'yes\|no')
|
||||
|
||||
# Replace "yes" with "MUT" and "no" with the volume level
|
||||
if [ "$is_muted" = "yes" ]; then
|
||||
volume="MUT"
|
||||
fi
|
||||
|
||||
# Get the default source (input device) and its volume/mute status
|
||||
default_source=$(pactl get-default-source)
|
||||
mic_level=$(pactl get-source-volume $default_source | grep -o '[0-9]*%' | head -1)
|
||||
is_mic_muted=$(pactl get-source-mute $default_source | grep -o 'yes\|no')
|
||||
|
||||
# Replace "yes" with "MUT" and "no" with the microphone level
|
||||
if [ "$is_mic_muted" = "yes" ]; then
|
||||
mic_level="MUT"
|
||||
fi
|
||||
|
||||
# Output the results with colors
|
||||
echo "^c$PINE^VOL: $volume MIC: $mic_level"
|
||||
}
|
||||
|
||||
# Function to get brightness percentage
|
||||
get_brightness() {
|
||||
# Get the current brightness level (adjust path if needed)
|
||||
brightness=$(cat /sys/class/backlight/intel_backlight/brightness)
|
||||
max_brightness=$(cat /sys/class/backlight/intel_backlight/max_brightness)
|
||||
|
||||
# Calculate brightness percentage
|
||||
brightness_percent=$(awk "BEGIN {printf \"%.0f%%\", ($brightness / $max_brightness) * 100}")
|
||||
|
||||
# Output the result with color
|
||||
echo "^c$ROSE^BRT: $brightness_percent"
|
||||
}
|
||||
|
||||
# Function to get weighted average battery level
|
||||
get_battery_level() {
|
||||
BAT_PATHS=(/sys/class/power_supply/BAT*)
|
||||
|
||||
total_now=0
|
||||
total_full=0
|
||||
|
||||
for BAT in "${BAT_PATHS[@]}"; do
|
||||
if [[ -f "$BAT/energy_now" && -f "$BAT/energy_full" ]]; then
|
||||
now=$(<"$BAT/energy_now")
|
||||
full=$(<"$BAT/energy_full")
|
||||
elif [[ -f "$BAT/charge_now" && -f "$BAT/charge_full" ]]; then
|
||||
now=$(<"$BAT/charge_now")
|
||||
full=$(<"$BAT/charge_full")
|
||||
else
|
||||
continue
|
||||
fi
|
||||
|
||||
total_now=$((total_now + now))
|
||||
total_full=$((total_full + full))
|
||||
done
|
||||
|
||||
if [[ $total_full -eq 0 ]]; then
|
||||
percent=0
|
||||
else
|
||||
percent=$((100 * total_now / total_full))
|
||||
fi
|
||||
|
||||
if (( percent < 15 )); then
|
||||
echo "^c$TEXT^^b$LOVE^BAT: $percent%^b$BASE^"
|
||||
else
|
||||
echo "^c$LOVE^BAT: $percent%"
|
||||
fi
|
||||
# Get battery levels (adjust paths if needed)
|
||||
# battery0_level=$(cat /sys/class/power_supply/BAT0/capacity)
|
||||
# battery1_level=$(cat /sys/class/power_supply/BAT1/capacity)
|
||||
|
||||
# battery0_energy_full=$(cat /sys/class/power_supply/BAT0/energy_full)
|
||||
# battery1_energy_full=$(cat /sys/class/power_supply/BAT1/energy_full)
|
||||
|
||||
# Calculate weights based on energy capacity
|
||||
# weight0=$(awk "BEGIN {printf \"%.2f\", $battery0_energy_full / ($battery0_energy_full + $battery1_energy_full)}")
|
||||
# weight1=$(awk "BEGIN {printf \"%.2f\", $battery1_energy_full / ($battery0_energy_full + $battery1_energy_full)}")
|
||||
|
||||
# Calculate weighted average
|
||||
# weighted_avg=$(awk "BEGIN {printf \"%.0f%%\", ($battery0_level * $weight0 + $battery1_level * $weight1)}")
|
||||
# battery0_level=$(cat /sys/class/power_supply/BAT0/capacity)
|
||||
# echo "^c$LOVE^BAT: $battery0_level%"
|
||||
|
||||
# Output the result with color
|
||||
# echo "^c$LOVE^BAT: $weighted_avg"
|
||||
}
|
||||
|
||||
# Function to get date and time in American 12-hour format
|
||||
get_datetime() {
|
||||
datetime=$(date +"%a %d %b %I:%M %p")
|
||||
echo "^c$GOLD^$datetime"
|
||||
}
|
||||
|
||||
# Function to detect if the system is a laptop
|
||||
is_laptop() {
|
||||
# Check if battery and brightness files exist
|
||||
if [ -d /sys/class/power_supply/BAT0 ] && [ -d /sys/class/backlight/intel_backlight ]; then
|
||||
return 0 # Laptop
|
||||
else
|
||||
return 1 # PC
|
||||
fi
|
||||
}
|
||||
|
||||
# Main loop to update xsetroot
|
||||
while true; do
|
||||
# Check for theme changes on every iteration
|
||||
update_theme_if_changed
|
||||
|
||||
# Combine all status components
|
||||
if is_laptop; then
|
||||
# Include battery and brightness for laptops
|
||||
status="$(get_volume) ^c$TEXT^| $(get_cpu_usage) ^c$TEXT^| $(get_memory_usage) ^c$TEXT^| $(get_brightness) ^c$TEXT^| $(get_battery_level) ^c$TEXT^| $(get_datetime)"
|
||||
else
|
||||
# Exclude battery and brightness for PCs
|
||||
status="$(get_volume) ^c$TEXT^| $(get_cpu_usage) ^c$TEXT^| $(get_memory_usage) ^c$TEXT^| $(get_datetime)"
|
||||
fi
|
||||
|
||||
# Update the root window name with a darker background
|
||||
xsetroot -name "$status"
|
||||
|
||||
# Sleep for 250 milis before updating
|
||||
sleep 0.25
|
||||
done
|
||||
3115
config.def.h
3115
config.def.h
File diff suppressed because it is too large
Load Diff
23
flake.lock
generated
Normal file
23
flake.lock
generated
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 0,
|
||||
"narHash": "sha256-4EVBRhOjMDuGtMaofAIqzJbg4Ql7Ai0PSeuVZTHjyKQ=",
|
||||
"path": "/nix/store/8fwsiv0hd7nw1brkvka0jf1frk3m7qkr-source",
|
||||
"type": "path"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
48
flake.nix
Normal file
48
flake.nix
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
outputs = { self, nixpkgs }: let
|
||||
system = "x86_64-linux";
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
in {
|
||||
packages.${system}.dwm = pkgs.stdenv.mkDerivation rec {
|
||||
pname = "dwm";
|
||||
version = "custom";
|
||||
src = ./.;
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
xorg.libX11
|
||||
xorg.libXft
|
||||
xorg.libXinerama
|
||||
];
|
||||
|
||||
makeFlags = [ "CC=${pkgs.gcc}/bin/cc" ];
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
cp dwm $out/bin/
|
||||
'';
|
||||
|
||||
meta = with pkgs.lib; {
|
||||
description = "Dynamic Window Manager";
|
||||
license = licenses.mit;
|
||||
maintainers = [ ];
|
||||
};
|
||||
};
|
||||
|
||||
defaultPackage.${system} = self.packages.${system}.dwm;
|
||||
|
||||
devShells.${system}.default = pkgs.mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
gnumake
|
||||
gcc
|
||||
xorg.libX11
|
||||
xorg.libX11.dev
|
||||
xorg.libXft
|
||||
xorg.libXinerama
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
echo "Development shell for dwm ready."
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
0
patch/dwmc
Executable file → Normal file
0
patch/dwmc
Executable file → Normal file
0
patch/layoutmenu.sh
Executable file → Normal file
0
patch/layoutmenu.sh
Executable file → Normal file
971
patches.def.h
971
patches.def.h
File diff suppressed because it is too large
Load Diff
4
rebuild.sh
Normal file
4
rebuild.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
rm -f config.h patches.h
|
||||
make clean && make && sudo make install
|
||||
Reference in New Issue
Block a user