summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsubh <subh@subh.space>2026-04-04 10:34:46 +0530
committersubh <subh@subh.space>2026-04-04 10:34:46 +0530
commit92811eb6050c2f2971c6ab8998b18d448ded35a0 (patch)
tree356e3fecdf88cb6728f6df5222733e1aa8547ec2
parent314d760de1922128124f2a9be0494fd4f6f7effb (diff)
Departure from catppuccin to gruvboxmain
-rw-r--r--.vim/.netrwhist22
-rw-r--r--.vim/colors.vim34
-rw-r--r--.vim/options.vim2
-rw-r--r--.vim/plugins.vim2
-rw-r--r--foot/foot.ini63
-rw-r--r--hyprland/hyprland.conf23
-rw-r--r--hyprland/keybinds.conf4
-rw-r--r--hyprlock/Fonts/JetBrains/JetBrains Mono Nerd.ttfbin979356 -> 0 bytes
-rwxr-xr-xhyprlock/Fonts/SF Pro Display/SF Pro Display Bold.otfbin3203404 -> 0 bytes
-rwxr-xr-xhyprlock/Fonts/SF Pro Display/SF Pro Display Regular.otfbin3123592 -> 0 bytes
-rwxr-xr-xhyprlock/Scripts/songdetail.sh4
-rw-r--r--hyprlock/berserk.pngbin4454142 -> 8464979 bytes
-rw-r--r--hyprlock/cat.jpgbin0 -> 47798 bytes
-rw-r--r--hyprlock/cat.pngbin335725 -> 0 bytes
-rw-r--r--hyprlock/hyprlock.conf20
-rw-r--r--hyprlock/hyprlock.pngbin22358833 -> 0 bytes
-rw-r--r--hyprlock/vivek.pngbin200401 -> 0 bytes
-rw-r--r--kitty/kitty.conf39
-rw-r--r--quickshell/mpd/shell.qml22
-rw-r--r--quickshell/mpd/shell.qml.bak470
-rw-r--r--quickshell/shell.qml33
-rw-r--r--quickshell/shell.qml.bak488
-rwxr-xr-xscripts/mount-usb.sh2
m---------vim/plugged/gruvbox-material0
m---------vim/plugged/tokyonight-vim0
25 files changed, 1117 insertions, 111 deletions
diff --git a/.vim/.netrwhist b/.vim/.netrwhist
index 6c48a00..8ff5dc6 100644
--- a/.vim/.netrwhist
+++ b/.vim/.netrwhist
@@ -1,12 +1,12 @@
let g:netrw_dirhistmax =10
-let g:netrw_dirhistcnt =6
-let g:netrw_dirhist_6='/home/subh/.config'
-let g:netrw_dirhist_5='/home/subh/.config/hyprlock'
-let g:netrw_dirhist_4='/opt/FakeSMTP'
-let g:netrw_dirhist_3='/home'
-let g:netrw_dirhist_2='/home/subh'
-let g:netrw_dirhist_1='/home/subh/HTB/sentinel/www/orientation-and-training'
-let g:netrw_dirhist_0='/home/subh/HTB/sentinel/www/it-services-and-support'
-let g:netrw_dirhist_9='/opt/MCP/blobs/mcp-source/kubectl_mcp_tool/cli'
-let g:netrw_dirhist_8='/opt/MCP/blobs/mcp-source/kubectl_mcp_tool'
-let g:netrw_dirhist_7='/opt/offensive-cloud/signedBlob-PrivEsc'
+let g:netrw_dirhistcnt =0
+let g:netrw_dirhist_0='/home/subh/.vim'
+let g:netrw_dirhist_9='/home/subh/synced'
+let g:netrw_dirhist_8='/home/subh'
+let g:netrw_dirhist_7='/home/subh/synced'
+let g:netrw_dirhist_6='/opt/music-cli'
+let g:netrw_dirhist_5='/opt/dotfiles/scripts'
+let g:netrw_dirhist_4='/opt/dotfiles/quickshell/mpd'
+let g:netrw_dirhist_3='/opt/offensive-cloud'
+let g:netrw_dirhist_2='/home/subh/.config/yazi'
+let g:netrw_dirhist_1='/home/subh'
diff --git a/.vim/colors.vim b/.vim/colors.vim
index 50ecc2c..e365942 100644
--- a/.vim/colors.vim
+++ b/.vim/colors.vim
@@ -1,23 +1,31 @@
set termguicolors
set laststatus=2
-" 1. Load your existing tokyonight theme
-let g:tokyonight_enable_italic = 1
-let g:lightline = {'colorscheme' : 'tokyonight'}
+" 1. Gruvbox Material Configuration
+let g:gruvbox_material_background = 'hard'
+let g:gruvbox_material_enable_italic = 1
+let g:gruvbox_material_better_performance = 1
-" Try to load tokyonight; if it fails, it won't crash your vim
-silent! colorscheme tokyonight
+" Match the lightline theme to Gruvbox
+let g:lightline = {'colorscheme' : 'gruvbox_material'}
-" 2. THE BLACKOUT OVERRIDE
-" This removes the theme's background so it uses Ghostty's #000000
+" Load the colorscheme
+silent! colorscheme gruvbox-material
+
+" 2. THE TRANSPARENCY OVERRIDE
+" This ensures Vim doesn't paint a solid box over your wallpaper
function! TransparencyOverride()
- highlight Normal guibg=NONE ctermbg=NONE
- highlight NonText guibg=NONE ctermbg=NONE
- highlight NormalNC guibg=NONE ctermbg=NONE
- highlight SignColumn guibg=NONE ctermbg=NONE
- highlight EndOfBuffer guibg=NONE ctermbg=NONE
+ highlight Normal guibg=NONE ctermbg=NONE
+ highlight NonText guibg=NONE ctermbg=NONE
+ highlight NormalNC guibg=NONE ctermbg=NONE
+ highlight SignColumn guibg=NONE ctermbg=NONE
+ highlight EndOfBuffer guibg=NONE ctermbg=NONE
+ " Also clear the line numbers and fold columns for a cleaner look
+ highlight LineNr guibg=NONE ctermbg=NONE
+ highlight CursorLineNr guibg=NONE ctermbg=NONE
+ highlight FoldColumn guibg=NONE ctermbg=NONE
endfunction
-" Apply the override immediately and whenever a colorscheme is loaded
+" Apply the override
autocmd ColorScheme * call TransparencyOverride()
call TransparencyOverride()
diff --git a/.vim/options.vim b/.vim/options.vim
index 7be00bd..48f9fe5 100644
--- a/.vim/options.vim
+++ b/.vim/options.vim
@@ -1,5 +1,7 @@
set number
set relativenumber
+set path+=**
+set wildmenu
filetype plugin indent on
set expandtab
diff --git a/.vim/plugins.vim b/.vim/plugins.vim
index a59933f..4b26afd 100644
--- a/.vim/plugins.vim
+++ b/.vim/plugins.vim
@@ -15,7 +15,7 @@ function! s:ensure(repo)
execute 'set runtimepath+=' . fnameescape(path)
endfunction
-call s:ensure('ghifarit53/tokyonight-vim')
+call s:ensure('sainnhe/gruvbox-material')
call s:ensure('junegunn/fzf')
call s:ensure('junegunn/fzf.vim')
call s:ensure('itchyny/lightline.vim')
diff --git a/foot/foot.ini b/foot/foot.ini
new file mode 100644
index 0000000..e9287de
--- /dev/null
+++ b/foot/foot.ini
@@ -0,0 +1,63 @@
+# Luke Smith-style foot config
+# ~/.config/foot/foot.ini
+# Transparency is handled by Hyprland โ€” see windowrulev2 below
+
+[main]
+term=foot
+font=Iosevka Nerdfont Propo:size=13
+font-bold=Iosevka Nerdfont Propo:weight=Bold:size=13
+dpi-aware=yes
+pad=8x8
+shell=/bin/zsh
+
+[scrollback]
+lines=10000
+indicator-position=none
+
+[mouse]
+hide-when-typing=yes
+
+[cursor]
+style=block
+blink=no
+
+[colors-dark]
+background=1d2021
+foreground=ebdbb2
+
+# Cursor colors live here now, not in [cursor]
+
+regular0=282828
+regular1=cc241d
+regular2=98971a
+regular3=d79921
+regular4=458588
+regular5=b16286
+regular6=689d6a
+regular7=a89984
+
+bright0=928374
+bright1=fb4934
+bright2=b8bb26
+bright3=fabd2f
+bright4=83a598
+bright5=d3869b
+bright6=8ec07c
+bright7=ebdbb2
+
+selection-foreground=ebdbb2
+selection-background=504945
+
+[key-bindings]
+scrollback-up-page=Shift+Page_Up
+scrollback-down-page=Shift+Page_Down
+spawn-terminal=Control+Shift+n
+search-start=Control+Shift+f
+clipboard-copy=Control+Shift+c
+clipboard-paste=Control+Shift+v
+
+[search-bindings]
+find-prev=Shift+Return
+find-next=Control+n
+cursor-left=Left
+cursor-right=Right
diff --git a/hyprland/hyprland.conf b/hyprland/hyprland.conf
index 7193445..6d3e2c1 100644
--- a/hyprland/hyprland.conf
+++ b/hyprland/hyprland.conf
@@ -9,8 +9,8 @@ monitor=HDMI-A-3,1920x1080@180,auto,1.0
# See https://wiki.hyprland.org/Configuring/Keywords/
# Set programs that you use
-$terminal = kitty
-$fileManager = pcmanfm
+$terminal = foot
+$fileManager = nemo
$menu = rofi -show drun -drun-reload-desktop-cache
$reload_qs = pkill qs 2>&1; qs &
$snip = hyprshot -m region --raw | satty --filename -
@@ -33,6 +33,7 @@ $CONFIG = /home/subh/.config
# exec-once = $terminal
# exec-once = nm-applet &
exec-once = qs &
+exec-once = foot --server
exec-once = dunst 2>/dev/null &
exec-once = awww-daemon & awww img $HOME/wallpapers/Arcade_decay_red.png
exec-once = swayidle -w before-sleep '/opt/scripts/lock.sh' &
@@ -62,7 +63,7 @@ env = QT_QPA_PLATFORMTHEME,qt6ct
# https://wiki.hyprland.org/Configuring/Variables/#general
general {
gaps_in = 5
- gaps_out = 5
+ gaps_out = 20
border_size = 1
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
@@ -205,6 +206,20 @@ windowrule {
}
windowrule {
+ name = foot
+ match:class = ^(foot)$
+ opacity = 0.85
+}
+
+windowrule {
+ name = floatpattern
+ match:class = (?i).*floatpattern.*
+
+ float = on
+ size = 600 100
+ center = on
+}
+windowrule {
name = yazi-float
match:class = (?i).*yazi-term.*
@@ -222,5 +237,5 @@ windowrule {
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
#windowrulev2 = suppressevent maximize, class:^(firefox|code|jetbrains-.*|electron)$
-windowrule = border_color rgb(f38ba8) rgb(313244), match:class (librewolf|discord|sublime_text|org.keepassxc.KeePassXC|burp-StartBurp|kitty)
+windowrule = border_color rgb(f38ba8) rgb(313244), match:class (librewolf|discord|sublime_text|org.keepassxc.KeePassXC|burp-StartBurp|foot)
windowrule = suppress_event maximize, match:class .* # You'll probably like this.
diff --git a/hyprland/keybinds.conf b/hyprland/keybinds.conf
index 3d455df..fbc00fb 100644
--- a/hyprland/keybinds.conf
+++ b/hyprland/keybinds.conf
@@ -38,8 +38,8 @@ bind = $mainMod, equal, exec, pactl set-sink-volume @DEFAULT_SINK@ +5% && notify
bind = $mainMod, minus, exec, pactl set-sink-volume @DEFAULT_SINK@ -5% && notify-send "Volume Status" "Current Volume: $(pactl --format json get-sink-volume @DEFAULT_SINK@ | jq -r '.volume."front-left"."value_percent"')"
bind = $mainMod SHIFT, equal, exec, mpc volume +5 && notify-send -i "audio-volume-high" -a "MPD" "MPD Volume" "$(mpc volume)"
bind = $mainMod SHIFT, minus, exec, mpc volume -5 && notify-send -i "audio-volume-low" -a "MPD" "MPD Volume" "$(mpc volume)"
-bind = Ctrl, M, exec, kitty --class rmpc-term rmpc
-bind = Ctrl|Shift, F, exec, kitty --class yazi-term yazi
+bind = Ctrl, M, exec, foot -a rmpc-term rmpc
+bind = Ctrl|Shift, F, exec, foot -a yazi-term yazi
# Move focus with mainMod + arrow keys
bind = $mainMod, h, movefocus, l
diff --git a/hyprlock/Fonts/JetBrains/JetBrains Mono Nerd.ttf b/hyprlock/Fonts/JetBrains/JetBrains Mono Nerd.ttf
deleted file mode 100644
index f9f0185..0000000
--- a/hyprlock/Fonts/JetBrains/JetBrains Mono Nerd.ttf
+++ /dev/null
Binary files differ
diff --git a/hyprlock/Fonts/SF Pro Display/SF Pro Display Bold.otf b/hyprlock/Fonts/SF Pro Display/SF Pro Display Bold.otf
deleted file mode 100755
index ee79a7f..0000000
--- a/hyprlock/Fonts/SF Pro Display/SF Pro Display Bold.otf
+++ /dev/null
Binary files differ
diff --git a/hyprlock/Fonts/SF Pro Display/SF Pro Display Regular.otf b/hyprlock/Fonts/SF Pro Display/SF Pro Display Regular.otf
deleted file mode 100755
index 120603c..0000000
--- a/hyprlock/Fonts/SF Pro Display/SF Pro Display Regular.otf
+++ /dev/null
Binary files differ
diff --git a/hyprlock/Scripts/songdetail.sh b/hyprlock/Scripts/songdetail.sh
index 51745e6..f259d92 100755
--- a/hyprlock/Scripts/songdetail.sh
+++ b/hyprlock/Scripts/songdetail.sh
@@ -1,5 +1,5 @@
#!/bin/bash
-song_info=$(playerctl metadata --format '{{title}} ๏†ผ {{artist}}')
+song_info=$(mpc status --format "%title% - %artist%" | head -n1)
-echo "$song_info"
+echo "๐ŸŽต $song_info"
diff --git a/hyprlock/berserk.png b/hyprlock/berserk.png
index 651e3ac..4b1e9c1 100644
--- a/hyprlock/berserk.png
+++ b/hyprlock/berserk.png
Binary files differ
diff --git a/hyprlock/cat.jpg b/hyprlock/cat.jpg
new file mode 100644
index 0000000..b5f3c5d
--- /dev/null
+++ b/hyprlock/cat.jpg
Binary files differ
diff --git a/hyprlock/cat.png b/hyprlock/cat.png
deleted file mode 100644
index 0216f9a..0000000
--- a/hyprlock/cat.png
+++ /dev/null
Binary files differ
diff --git a/hyprlock/hyprlock.conf b/hyprlock/hyprlock.conf
index d2c2a12..5995a00 100644
--- a/hyprlock/hyprlock.conf
+++ b/hyprlock/hyprlock.conf
@@ -19,10 +19,10 @@ general {
# GREETINGS
label {
monitor =
- text = cmd[update:1000] $(date +%H); if ((h<12)); then echo "Good morning!"; elif ((h<17)); then echo "Good afternoon!"; else echo "Good evening!"; fi
+ text = cmd[update:1000] if [ $(date +%H) -lt 12 ]; then echo "Good Morning!"; elif [ $(date +%H) -lt 17 ]; then echo "Good Afternoon!"; else echo "Good Night!"; fi
color = rgba(216, 222, 233, .75)
font_size = 55
- font_family = SF Pro Display Bold
+ font_family = Iosevka Nerdfont Propo
position = 150, 320
halign = left
valign = center
@@ -34,7 +34,7 @@ label {
text = cmd[update:1000] echo "<span>$(date +"%I:%M")</span>"
color = rgba(216, 222, 233, .75)
font_size = 40
- font_family = SF Pro Display Bold
+ font_family = Iosevka Nerdfont Propo
position = 150, 240
halign = left
valign = center
@@ -43,10 +43,10 @@ label {
# Day-Month-Date
label {
monitor =
- text = cmd[update:1000] echo -e "$(date +"%A, %B %d")"
+ text = cmd[update:1000] date +"%A, %B %d"
color = rgba(216, 222, 233, .75)
font_size = 19
- font_family = SF Pro Display Bold
+ font_family = Iosevka Nerdfont Propo
position = 150, 175
halign = left
valign = center
@@ -55,7 +55,7 @@ label {
# Profie-Photo
image {
monitor =
- path = ~/.config/hyprlock/cat.png
+ path = ~/.config/hyprlock/cat.jpg
border_size = 2
border_color = rgba(255, 255, 255, .75)
size = 95
@@ -94,7 +94,7 @@ label {
dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = true
font_size = 16
- font_family = SF Pro Display Bold
+ font_family = Iosevka Nerdfont Propo
position = 275, -140
halign = left
valign = center
@@ -112,7 +112,7 @@ input-field {
inner_color = rgba(255, 255, 255, 0.1)
font_color = rgb(200, 200, 200)
fade_on_empty = false
- font_family = SF Pro Display Bold
+ font_family = Iosevka NerdFont Propo
placeholder_text = <i><span foreground="##ffffff99">๐Ÿ”’ Enter Pass</span></i>
hide_input = false
position = 160, -220
@@ -123,10 +123,10 @@ input-field {
# CURRENT SONG
label {
monitor =
- text = cmd[update:1000] echo "$(~/.config/hypr/Style-1/Scripts/songdetail.sh)"
+ text = cmd[update:1000] echo "$(~/.config/hyprlock/Scripts/songdetail.sh)"
color = rgba(255, 255, 255, 0.65)
font_size = 14
- font_family = JetBrains Mono Nerd, SF Pro Display Bold
+ font_family = Iosevka NerdFont Propo
position = 210, 45
halign = left
valign = bottom
diff --git a/hyprlock/hyprlock.png b/hyprlock/hyprlock.png
deleted file mode 100644
index d97b4bb..0000000
--- a/hyprlock/hyprlock.png
+++ /dev/null
Binary files differ
diff --git a/hyprlock/vivek.png b/hyprlock/vivek.png
deleted file mode 100644
index 5b9be9a..0000000
--- a/hyprlock/vivek.png
+++ /dev/null
Binary files differ
diff --git a/kitty/kitty.conf b/kitty/kitty.conf
deleted file mode 100644
index 9158d80..0000000
--- a/kitty/kitty.conf
+++ /dev/null
@@ -1,39 +0,0 @@
-confirm_os_window_close 0
-font_family IosevkaNerdFontPropo-Regular
-bold_font IosevkaNerdFontPropo-Bold
-italic_font IosevkaNerdFontPropo-Italic
-bold_italic_font IosevkaNerdFontPropo-BoldItalic
-font_size 13.0
-
-# --- Blackened Catppuccin Theme ---
-# Syntax Palette
-color0 #45475a
-color1 #f38ba8
-color2 #a6e3a1
-color3 #f9e2af
-color4 #89b4fa
-color5 #f5c2e7
-color6 #94e2d5
-color7 #a6adc8
-color8 #585b70
-color9 #f38ba8
-color10 #a6e3a1
-color11 #f9e2af
-color12 #89b4fa
-color13 #f5c2e7
-color14 #94e2d5
-color15 #bac2de
-
-# True Black Background
-background #000000
-foreground #cdd6f4
-
-# Cursor & Selection
-cursor #f5e0dc
-cursor_text_color #000000
-selection_background #313244
-selection_foreground #cdd6f4
-
-# Splits
-active_border_color #f38ba8
-inactive_border_color #313244
diff --git a/quickshell/mpd/shell.qml b/quickshell/mpd/shell.qml
index 04a74b8..d45f127 100644
--- a/quickshell/mpd/shell.qml
+++ b/quickshell/mpd/shell.qml
@@ -3,15 +3,15 @@ import Quickshell.Io
import QtQuick
import QtQuick.Layouts
ShellRoot {
- property color colBg: "#000000"
- property color colFg: "#ffffff"
- property color colMuted: "#313244"
- property color colCyan: "#89dceb"
- property color colPurple: "#cba6f7"
- property color colRed: "#f38ba8"
- property color colYellow: "#f9e2af"
- property color colBlue: "#89b4fa"
- property color colGreen: "#A3BE8C"
+ property color colBg: "#1d2021" // Gruvbox Background (Hard)
+ property color colFg: "#ebdbb2" // Gruvbox Foreground
+ property color colMuted: "#928374" // Gruvbox Gray (Muted)
+ property color colCyan: "#8ec07c" // Gruvbox Aqua/Cyan
+ property color colPurple: "#d3869b" // Gruvbox Purple
+ property color colRed: "#fb4934" // Gruvbox Red (Bright)
+ property color colYellow: "#fabd2f" // Gruvbox Yellow (Bright)
+ property color colBlue: "#83a598" // Gruvbox Blue
+ property color colGreen: "#b8bb26" // Gruvbox Green
property string fontFamily: "Iosevka NerdFont Propo"
property int fontSize: 16
property string mpd_title: ""
@@ -286,7 +286,7 @@ ShellRoot {
width: parent.width * mpd_progress
height: parent.height
radius: 2
- color: isPlaying ? colCyan : colYellow
+ color: isPlaying ? colRed : colYellow
Behavior on width {
enabled: !isSeeking
NumberAnimation { duration: 950; easing.type: Easing.Linear }
@@ -506,7 +506,7 @@ ShellRoot {
id: progressFill
width: progressTrack.width * mpd_progress
height: parent.height; radius: 2
- color: isPlaying ? colCyan : colYellow
+ color: isPlaying ? colRed : colYellow
Behavior on width {
enabled: !isSeeking
NumberAnimation { duration: 950; easing.type: Easing.Linear }
diff --git a/quickshell/mpd/shell.qml.bak b/quickshell/mpd/shell.qml.bak
new file mode 100644
index 0000000..be04cf0
--- /dev/null
+++ b/quickshell/mpd/shell.qml.bak
@@ -0,0 +1,470 @@
+import Quickshell
+import Quickshell.Io
+import QtQuick
+import QtQuick.Layouts
+ShellRoot {
+
+ property color colBg: "#000000"
+ property color colFg: "#ffffff"
+ property color colMuted: "#313244"
+ property color colCyan: "#89dceb"
+ property color colPurple: "#cba6f7"
+ property color colRed: "#f38ba8"
+ property color colYellow: "#f9e2af"
+ property color colBlue: "#89b4fa"
+ property color colGreen: "#A3BE8C"
+ property string fontFamily: "Iosevka Nerd Font Propo"
+ property int fontSize: 16
+
+
+ property string mpd_title: ""
+ property string mpd_artist: ""
+ property string mpd_elapsed: "0:00"
+ property string mpd_duration: "0:00"
+ property string mpd_file: ""
+ property real mpd_progress: 0.0
+ property bool isPlaying: false
+ property bool isPaused: false
+ property bool isActive: isPlaying || isPaused
+ property bool isSeeking: false
+ property bool cardVisible: false
+ property string artPath: "/tmp/mpdrop_art.png"
+ property string artCache: ""
+
+ function timeToSecs(t) {
+ var p = t.split(":")
+ if (p.length === 2) return parseInt(p[0]) * 60 + parseInt(p[1])
+ if (p.length === 3) return parseInt(p[0]) * 3600 + parseInt(p[1]) * 60 + parseInt(p[2])
+ return 0
+ }
+
+ // Art Extractor
+
+ Process {
+ id: artProc
+ property string filePath: ""
+ command: ["sh", "-c", "ffmpeg -i \"" + Qt.musicFolder + filePath + "\" -an -vcodec copy /tm/mdrop_art.png -y 2>/dev/null"]
+ running: false
+ onExited: {
+ artCache = ""
+ artCache = artPath
+ }
+ }
+
+ // File Path Folder
+ Process {
+ id: fileProc
+ command: ["mpc", "--format", "%file%", "current"]
+ stdout: StdioCollector {
+ onStreamFinished: {
+ var f = this.text.trim()
+ if (f !== "" && f !== mpd_file) {
+ mpd_file = f
+ artProc.filePath = f
+ artProc.running = false
+ artProc.running = true
+ }
+ }
+ }
+ }
+
+ // Idle Watcher
+
+ Process {
+ id: idleProc
+ command: ["mpc", "idlewait"]
+ running: true
+ onExited: {
+ statusProc.running = true
+ }
+ }
+
+ // Status Fetcher
+ Process {
+ id: statusProc
+ command: ["mpc", "status", "--format", "%title%||%artist||%duration%"]
+ stdout: StdioCollector {
+ onStreamFinished: {
+ var lines = this.text.trim().split("\n")
+ if (lines.length >= 2) {
+ var meta = lines[0].split("||")
+ var newTitle = meta[0] || "Unknown"
+
+ if (newTitle !== mpd_title) fileProc.running = true
+
+ mpd_title = newTitle
+ mpd_artist = meta[1] || ""
+ mpd_duration = meta[2] || "0:00"
+
+ var sl = lines[1]
+ isPlaying = sl.indexOf("[playing]") !== -1
+ isPaused = sl.indexOf("[paused]") !== -1
+
+ var tm = sl.match(/(\d+:\d+)\/(\d+:\d+)/)
+ if (tm) {
+ mpd_elapsed = tm[1]
+ var total = timeToSecs(tm[2])
+ if (!isSeeking) {
+ mpd_progress = total > 0 ? timeToSecs(tm[1]) / total : 0
+ }
+
+
+ }
+ else {
+ mpd_title = ""; mpd_artist = ""
+ mpd_elapsed = "0:00"; mpd_duration = "0:00"
+ mpd_progress = 0; isPlaying = false; isPaused = false
+ }
+ }
+ }
+ }
+ onExited: idleProc.running = true
+}
+ property real progressPerSecond: {
+ var total = timeToSecs(mpd_duration)
+ return total > 0 ? 1.0 / total : 0
+ }
+
+ Timer {
+ id: progressTimer
+ interval: 1000
+ running: isPlaying && !isSeeking
+ repeat: true
+ onTriggered: {
+ mpd_progress = Math.min(1.0, mpd_progress + progressPerSecond)
+ var elapsed = Math.round(mpd_progress * timeToSecs(mpd_duration))
+ var m = Math.floor(elapsed / 60)
+ var s = elapsed % 60
+ mpd_elapsed = m + ":" + (s < 10 ? "0" + s : s)
+ }
+ }
+
+
+ Timer {
+ id: seekResetTimer
+ interval: 1100
+ repeat: false
+ onTriggered: isSeeking = false
+ }
+
+ // Control process
+ Process {
+ id: ctrlProc
+ property var args: ["toggle"]
+ command: ["mpc"].concat(args)
+ running: false
+ onExited: statusProc.running = true
+ }
+
+ // Hover Card
+ PanelWindow {
+ visible: cardVisible && isActive
+ screen: Quickshell.screens[0]
+ exclusionMode: ExclusionMode.Ignore
+ anchors { bottom: true; left: true }
+ implicitWidth: 280
+ implicitHeight: 320
+ color: "transparent"
+
+ Rectangle {
+ anchors.fill: parent
+ anchors.margin: 12
+ radius: 12
+ color: colBg
+ border.color: colMuted
+ border.width: 1
+
+ opacity: cardVisible ? 1 : 0
+ Behavior on opacity { NumberAnimation { duration: 200 } }
+
+ Column {
+ anchors.fill: parent
+ anchors.margin: 12
+ spacing: 10
+
+ // Album Art
+ Rectangle {
+ width: parent.width
+ height: parent.width
+ radius: 8
+ color: colMuted
+ clip: true
+
+
+ Image {
+ id: artImage
+ anchors.fill: parent
+ source: artCache !== "" ? "file://" + artCache : ""
+ fillMode: Image.PreserveAspectCrop
+ cache: false
+ smooth: true
+
+ //Placeholder for when no art
+ Text {
+ anchors.centerIn: parent
+ text: "๐Ÿ˜ผ"
+ font.pixelSize: 48
+ font.family: fontFamily
+ color: colMuted
+ visible: artImage.status !== Image.Ready
+ }
+ }
+ }
+
+ // Title
+ Text {
+ text: mpd_title
+ color: colFg
+ font.pixelSize: 13
+ font.family: fontFamily
+ font.bold: true
+ elide: Text.ElideRight
+ width: parent.width
+ }
+
+ // Artist
+ Text {
+ text: mpd_artist
+ color: colMuted
+ font.pixelSize: 12
+ font.family: fontFamily
+ elide: Text.ElideRight
+ width: parent.width
+ visible: mpd_artist !== ""
+ }
+
+ // Progress Bar
+ Rectangle {
+ width: parent.width
+ height: 3
+ radius: 2
+ color: colMuted
+
+ Rectangle: {
+ width: parent.width * mpd_progress
+ height: parent.height
+ radius: 2
+ color: isPlaying ? colCyan : colYellow
+ Behavior on width {
+ enabled: !isSeeking
+ NumberAnimation { duration: 950; easing.type: Easing.Linear }
+ }
+
+ }
+ }
+
+ // Time
+ RowLayout {
+ width: parent.width
+ Text {
+ text: mpd_elapsed
+ color: colFg
+ font.pixelSize: 11
+ font.family: fontFamily
+ }
+ Item { Layout.fillWidth: true }
+ Text {
+ text: mpd_duration
+ color: colMuted
+ font.pixelSize: 11
+ font.family: fontFamily
+ }
+
+ }
+ }
+ }
+ }
+
+ // โ”€โ”€ The bar โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ PanelWindow {
+ id: mainBar
+ visible: isActive
+ screen: Quickshell.screens[0]
+ exclusionMode: PanelWindow
+ anchors { bottom: true; left: true; right: true }
+ implicitHeight: 36
+ color: colBg
+
+ // hover Detection
+ HoverHandler {
+ id: barHover
+ onHoveredChanged: cardVisible = barHover.hovered
+ }
+
+
+
+ Rectangle {
+ anchors.fill: parent
+ color: colBg
+ Rectangle {
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ height: 1
+ color: colMuted
+ }
+ RowLayout {
+ anchors.fill: parent
+ anchors.leftMargin: 8
+ anchors.rightMargin: 8
+ spacing: 0
+ // โ”€โ”€ Music icon โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Text {
+ text: isPaused ? "๓ฐŽŠ" : "๓ฐŽˆ"
+ color: isPaused ? colYellow : colCyan
+ font.pixelSize: fontSize
+ font.family: fontFamily
+ font.bold: true
+ Behavior on color { ColorAnimation { duration: 200 } }
+ }
+ Item { width: 8 }
+ // โ”€โ”€ Title โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Text {
+ text: mpd_title || "Unknown"
+ color: colPurple
+ font.pixelSize: fontSize
+ font.family: fontFamily
+ font.bold: true
+ elide: Text.ElideRight
+ Layout.maximumWidth: 220
+ }
+ // โ”€โ”€ Separator + Artist โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Rectangle {
+ Layout.preferredWidth: 1; Layout.preferredHeight: 16
+ Layout.leftMargin: 8; Layout.rightMargin: 8
+ color: colMuted
+ visible: mpd_artist !== ""
+ }
+ Text {
+ text: mpd_artist
+ color: colCyan
+ font.pixelSize: fontSize
+ font.family: fontFamily
+ font.bold: true
+ elide: Text.ElideRight
+ Layout.maximumWidth: 180
+ visible: mpd_artist !== ""
+ }
+ // โ”€โ”€ Separator โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Rectangle {
+ Layout.preferredWidth: 1; Layout.preferredHeight: 16
+ Layout.leftMargin: 8; Layout.rightMargin: 8
+ color: colMuted
+ }
+ // โ”€โ”€ Prev โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Text {
+ text: "๓ฐ’ฎ"
+ color: prevH.containsMouse ? colCyan : colFg
+ font.pixelSize: fontSize
+ font.family: fontFamily
+ font.bold: true
+ Layout.rightMargin: 10
+ HoverHandler { id: prevH }
+ TapHandler { onTapped: { if (!ctrlProc.running) { ctrlProc.args = ["prev"]; ctrlProc.running = true } } }
+ Behavior on color { ColorAnimation { duration: 100 } }
+ }
+ // โ”€โ”€ Play / Pause โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Text {
+ text: isPlaying ? "๓ฐค" : "๓ฐŠ"
+ color: playH.containsMouse ? colPurple : colCyan
+ font.pixelSize: fontSize + 2
+ font.family: fontFamily
+ font.bold: true
+ Layout.rightMargin: 10
+ HoverHandler { id: playH }
+ TapHandler { onTapped: { if (!ctrlProc.running) { ctrlProc.args = ["toggle"]; ctrlProc.running = true } } }
+ Behavior on color { ColorAnimation { duration: 100 } }
+ }
+ // โ”€โ”€ Next โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Text {
+ text: "๓ฐ’ญ"
+ color: nextH.containsMouse ? colCyan : colFg
+ font.pixelSize: fontSize
+ font.family: fontFamily
+ font.bold: true
+ Layout.rightMargin: 10
+ HoverHandler { id: nextH }
+ TapHandler { onTapped: { if (!ctrlProc.running) { ctrlProc.args = ["next"]; ctrlProc.running = true } } }
+ Behavior on color { ColorAnimation { duration: 100 } }
+ }
+ // โ”€โ”€ Stop โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Text {
+ text: "๓ฐ“›"
+ color: stopH.containsMouse ? colRed : colMuted
+ font.pixelSize: fontSize
+ font.family: fontFamily
+ font.bold: true
+ HoverHandler { id: stopH }
+ TapHandler { onTapped: { if (!ctrlProc.running) { ctrlProc.args = ["stop"]; ctrlProc.running = true } } }
+ Behavior on color { ColorAnimation { duration: 100 } }
+ }
+ // โ”€โ”€ Separator โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Rectangle {
+ Layout.preferredWidth: 1; Layout.preferredHeight: 16
+ Layout.leftMargin: 8; Layout.rightMargin: 8
+ color: colMuted
+ }
+ // โ”€โ”€ Elapsed โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Text {
+ text: mpd_elapsed
+ color: colFg
+ font.pixelSize: fontSize
+ font.family: fontFamily
+ font.bold: true
+ Layout.rightMargin: 8
+ }
+ // โ”€โ”€ Progress bar โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Rectangle {
+ id: progressTrack
+ Layout.fillWidth: true
+ height: 4
+ radius: 2
+ color: colMuted
+
+ // Fill
+ Rectangle {
+ id: progressFill
+ width: progressTrack.width * mpd_progress
+ height: parent.height
+ radius: 2
+ color: isPlaying ? colCyan : colYellow
+ Behavior on width {
+ enabled: !isSeeking
+ NumberAnimation { duration: 950; easing.type: Easing.Linear }
+ }
+ Behavior on color { ColorAnimation { duration: 300 } }
+ }
+
+ // Seek โ€” child of progressTrack so parent.width works
+ MouseArea {
+ anchors.fill: parent
+ anchors.topMargin: -6
+ anchors.bottomMargin: -6
+ cursorShape: Qt.PointingHandCursor
+ onClicked: (mouse) => {
+ if (!ctrlProc.running) {
+ var pct = Math.max(0, Math.min(1, mouse.x / progressTrack.width))
+ var pctInt = Math.round(pct * 100)
+ isSeeking = true
+ mpd_progress = pct
+ ctrlProc.args = ["seek", pctInt + "%"]
+ ctrlProc.running = true
+ seekResetTimer.restart()
+ }
+ }
+ }
+ }
+ // โ”€โ”€ Duration โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
+ Text {
+ text: mpd_duration
+ color: colMuted
+ font.pixelSize: fontSize
+ font.family: fontFamily
+ font.bold: true
+ Layout.leftMargin: 8
+ }
+ Item { width: 8 }
+ }
+ }
+ }
+}
diff --git a/quickshell/shell.qml b/quickshell/shell.qml
index 313827c..c2b76a0 100644
--- a/quickshell/shell.qml
+++ b/quickshell/shell.qml
@@ -8,18 +8,18 @@ import QtQuick.Layouts
ShellRoot {
id: root
- // --- BLACKOUT THEME COLORS ---
- property color colBg: "#000000" // True Black to match Ghostty
- property color colFg: "#ffffff" // Pure White to match Oh-My-Posh
- property color colMuted: "#313244" // Dark Grey (Surface1)
- property color colCyan: "#89dceb" // Catppuccin Sky
- property color colPurple: "#cba6f7" // Catppuccin Mauve
- property color colRed: "#f38ba8" // Catppuccin Red
- property color colYellow: "#f9e2af" // Catppuccin Yellow
- property color colBlue: "#89b4fa" // Catppuccin Blue
- property color colGreen: "#A3BE8C"
+ property color colBg: "#1d2021" // Gruvbox Background (Hard)
+ property color colFg: "#ebdbb2" // Gruvbox Foreground
+ property color colMuted: "#928374" // Gruvbox Gray (Muted)
+ property color colCyan: "#8ec07c" // Gruvbox Aqua/Cyan
+ property color colPurple: "#d3869b" // Gruvbox Purple
+ property color colRed: "#fb4934" // Gruvbox Red (Bright)
+ property color colYellow: "#fabd2f" // Gruvbox Yellow (Bright)
+ property color colBlue: "#83a598" // Gruvbox Blue
+ property color colGreen: "#b8bb26" // Gruvbox Green
// Font
- property string fontFamily: "Iosevka Nerd Font Propo"
+
+ property string fontFamily: "Iosevka Nerdfont Propo"
property int fontSize: 16
// System info properties
@@ -35,12 +35,11 @@ ShellRoot {
property int cpuTempInt: parseInt(cpuTemp, 10)
property string upTime: "0"
- property color tempColor: {
- if (cpuTempInt < 50 ) return "#a6e3a1" // Green
- else if (cpuTempInt < 70) return "#f9e2af" // Yellow
- else return "#f38ba8" // Red
- }
-
+ property color tempColor: {
+ if (cpuTempInt < 50 ) return "#b8bb26" // Gruvbox Green
+ else if (cpuTempInt < 70) return "#fabd2f" // Gruvbox Yellow
+ else return "#fb4934" // Gruvbox Red
+ }
property int notificationCount: 0
property var lastCpuIdle: 0
diff --git a/quickshell/shell.qml.bak b/quickshell/shell.qml.bak
new file mode 100644
index 0000000..313827c
--- /dev/null
+++ b/quickshell/shell.qml.bak
@@ -0,0 +1,488 @@
+import Quickshell
+import Quickshell.Wayland
+import Quickshell.Io
+import Quickshell.Hyprland
+import QtQuick
+import QtQuick.Layouts
+
+ShellRoot {
+ id: root
+
+ // --- BLACKOUT THEME COLORS ---
+ property color colBg: "#000000" // True Black to match Ghostty
+ property color colFg: "#ffffff" // Pure White to match Oh-My-Posh
+ property color colMuted: "#313244" // Dark Grey (Surface1)
+ property color colCyan: "#89dceb" // Catppuccin Sky
+ property color colPurple: "#cba6f7" // Catppuccin Mauve
+ property color colRed: "#f38ba8" // Catppuccin Red
+ property color colYellow: "#f9e2af" // Catppuccin Yellow
+ property color colBlue: "#89b4fa" // Catppuccin Blue
+ property color colGreen: "#A3BE8C"
+ // Font
+ property string fontFamily: "Iosevka Nerd Font Propo"
+ property int fontSize: 16
+
+ // System info properties
+ property string kernelVersion: "Arch"
+ property string powerProfile: ""
+ property int cpuUsage: 0
+ property string memUsage: ""
+ property string diskUsage: ""
+ property int volumeLevel: 0
+ property string activeWindow: "Window"
+ property string currentLayout: "Tile"
+ property string cpuTemp: "0"
+ property int cpuTempInt: parseInt(cpuTemp, 10)
+ property string upTime: "0"
+
+ property color tempColor: {
+ if (cpuTempInt < 50 ) return "#a6e3a1" // Green
+ else if (cpuTempInt < 70) return "#f9e2af" // Yellow
+ else return "#f38ba8" // Red
+ }
+
+ property int notificationCount: 0
+
+ property var lastCpuIdle: 0
+ property var lastCpuTotal: 0
+
+ property string weatherIcon: "๎Œฝ "
+ property string weatherTemp: "--ยฐC"
+ property string weatherPrecip: "--%"
+ property string weatherWind: "--kph"
+ property string netConnection: ""
+
+
+ Process {
+ id: connectionProc
+ command: ["sh", "-c", "sed 's/dormant/๓ฐคฏ /;s/down/๓ฐคญ /;s/up/๓ฐคจ /' /sys/class/net/wlp8s0/operstate"]
+ stdout: SplitParser {
+ onRead: data => { if (data) netConnection = data.trim() }
+ }
+ Component.onCompleted: running = true
+ }
+ // System UpTime
+ Process {
+ id: upTimeProc
+ command: ["sh", "-c", "uptime|awk '{gsub(\",\",\"\");print $3}'"]
+ // command: ["sh", "-c", "uptime"]
+ stdout: SplitParser {
+ onRead: data => { if (data) upTime = data.trim() }
+ }
+ Component.onCompleted: running = true
+ }
+
+
+
+ // CPU usage
+ Process {
+ id: cpuProc
+ command: ["sh", "-c", "head -1 /proc/stat"]
+ stdout: SplitParser {
+ onRead: data => {
+ if (!data) return
+ var parts = data.trim().split(/\s+/)
+ var user = parseInt(parts[1]) || 0
+ var nice = parseInt(parts[2]) || 0
+ var system = parseInt(parts[3]) || 0
+ var idle = parseInt(parts[4]) || 0
+ var iowait = parseInt(parts[5]) || 0
+ var irq = parseInt(parts[6]) || 0
+ var softirq = parseInt(parts[7]) || 0
+ var total = user + nice + system + idle + iowait + irq + softirq
+ var idleTime = idle + iowait
+ if (lastCpuTotal > 0) {
+ var totalDiff = total - lastCpuTotal
+ var idleDiff = idleTime - lastCpuIdle
+ if (totalDiff > 0) cpuUsage = Math.round(100 * (totalDiff - idleDiff) / totalDiff)
+ }
+ lastCpuTotal = total
+ lastCpuIdle = idleTime
+ }
+ }
+ Component.onCompleted: running = true
+ }
+
+ // Notification monitor
+ Process {
+ id: notifListener
+ command: ["sh", "-c", "dbus-monitor \"interface='org.freedesktop.Notifications',member='Notify'\" \"interface='org.freedesktop.Notifications',member='NotificationClosed'\""]
+ running: true
+ stdout: SplitParser {
+ onRead: data => {
+ countPoller.running = true
+ }
+ }
+}
+ // Notification Updater
+ Process {
+ id: countPoller
+ command: ["sh", "-c", "dunstctl count | awk -F : '/History/ {print $2}'"]
+ stdout: SplitParser {
+ onRead: data => {
+ if (data) notificationCount = parseInt(data.trim())
+ }
+ }
+}
+ // show notification history
+ Process {
+ id: showHistoryProc
+ command: ["sh", "-c", "count=$(dunstctl count history); for i in $(seq 1 $count); do dunstctl history-pop; done"]
+ }
+
+ // clear notifications
+ Process {
+ id: clearAllProc
+ command: ["dunstctl", "history-clear"]
+ onExited: {
+ countPoller.running = true;
+ }
+ }
+
+ // Memory usage
+ Process {
+ id: memProc
+ command: ["sh", "-c", "free -h | grep Mem"]
+ stdout: SplitParser {
+ onRead: data => {
+ if (!data) return
+ var parts = data.trim().split(/\s+/)
+ var used = parts[2] || "0"
+ memUsage = used
+ }
+ }
+ Component.onCompleted: running = true
+ }
+
+ // Weather
+ Process {
+ id: weatherProc
+ // Call your python script directly
+ command: ["python3", "/opt/scripts/weather.py"]
+
+ stdout: SplitParser {
+ onRead: data => {
+ if (!data || data.trim() === "") return
+ var parts = data.trim().split(/\s+/)
+ if (parts.length >= 4) {
+ weatherIcon = parts[0]
+ weatherTemp = parts[1]
+ weatherPrecip = parts[2] + " " + parts[3]
+ weatherWind = parts[4] + " " + parts[5]
+ }
+ }
+
+ }
+ Component.onCompleted: running = true
+}
+ // Disk usage
+ Process {
+ id: diskProc
+ command: ["sh", "-c", "df -h / | tail -1"]
+ stdout: SplitParser {
+ onRead: data => {
+ if (!data) return
+ var parts = data.trim().split(/\s+/)
+ var StrInGB = parts[2] || "0G"
+ diskUsage = StrInGB
+ }
+ }
+ Component.onCompleted: running = true
+ }
+
+ // Volume level
+ Process {
+ id: volProc
+ command: ["wpctl", "get-volume", "@DEFAULT_AUDIO_SINK@"]
+ stdout: SplitParser {
+ onRead: data => {
+ if (!data) return
+ var match = data.match(/Volume:\s*([\d.]+)/)
+ if (match) volumeLevel = Math.round(parseFloat(match[1]) * 100)
+ }
+ }
+ Component.onCompleted: running = true
+ }
+
+ // Active window title
+ Process {
+ id: windowProc
+ command: ["sh", "-c", "hyprctl activewindow -j | jq -r '.title // empty'"]
+ stdout: SplitParser {
+ onRead: data => { if (data && data.trim()) activeWindow = data.trim() }
+ }
+ Component.onCompleted: running = true
+ }
+
+ // Current layout
+ Process {
+ id: layoutProc
+ command: ["sh", "-c", "hyprctl activewindow -j | jq -r 'if .floating then \"Floating\" elif .fullscreen == 1 then \"Fullscreen\" else \"Tiled\" end'"]
+ stdout: SplitParser {
+ onRead: data => { if (data && data.trim()) currentLayout = data.trim() }
+ }
+ Component.onCompleted: running = true
+ }
+
+ // CPU Temp
+ Process {
+ id: cpuTempProc
+ command: ["sh", "-c", "sensors | awk '/Tctl:/ {print $2}'"]
+ stdout: SplitParser {
+ onRead: data => { if (data && data.length > 0) cpuTemp = data.trim() }
+ }
+ }
+
+ // Timers
+
+ Timer {
+ interval: 5000; running: true; repeat: true
+ onTriggered: {
+ connectionProc.running = true
+ }
+ }
+ // UpTime Timer
+ Timer {
+ interval: 60000; running: true; repeat: true
+ onTriggered: {
+ upTimeProc.running = true
+ }
+ }
+ // SysEssentials Timer
+ Timer {
+ interval: 2000; running: true; repeat: true
+ onTriggered: {
+ cpuProc.running = true; memProc.running = true; diskProc.running = true
+ volProc.running = true; cpuTempProc.running = true; powerProfileProc.running = true
+ }
+ }
+ // Weather Timer
+ Timer {
+ interval: 3600000; running: true; repeat: true; onTriggered: {
+ console.log("Weather fetched at: " + new Date().toString())
+ weatherProc.running = true
+ }
+ }
+
+ Connections {
+ target: Hyprland
+ function onRawEvent(event) { windowProc.running = true; layoutProc.running = true }
+ }
+
+ Timer {
+ interval: 200; running: true; repeat: true
+ onTriggered: { windowProc.running = true; layoutProc.running = true }
+ }
+
+ Variants {
+ model: Quickshell.screens
+ PanelWindow {
+ property var modelData
+ screen: modelData
+ anchors { top: true; left: true; right: true }
+ implicitHeight: 30
+ color: root.colBg
+
+ Rectangle {
+ anchors.fill: parent
+ color: root.colBg
+
+ RowLayout {
+ anchors.fill: parent; spacing: 0
+ Item { width: 8 }
+
+ // Arch Icon
+ Rectangle {
+ Layout.preferredWidth: 24; Layout.preferredHeight: 24; color: "transparent"
+ Image {
+ anchors.fill: parent
+ source: "file:///home/subh/.config/quickshell/icons/arch.png"
+ fillMode: Image.PreserveAspectFit
+ }
+ }
+
+ Item { width: 8 }
+
+ // Workspaces
+ Repeater {
+ model: 9
+ Rectangle {
+ Layout.preferredWidth: 20; Layout.preferredHeight: parent.height; color: "transparent"
+ property var workspace: Hyprland.workspaces.values.find(ws => ws.id === index + 1) ?? null
+ property bool isActive: Hyprland.focusedWorkspace?.id === (index + 1)
+ property bool hasWindows: workspace !== null
+
+ Text {
+ text: index + 1
+ color: parent.isActive ? root.colCyan : (parent.hasWindows ? root.colFg : root.colMuted)
+ font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true
+ anchors.centerIn: parent
+ }
+ Rectangle {
+ width: 20; height: 3
+ color: parent.isActive ? root.colPurple : "transparent"
+ anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: parent.bottom
+ }
+ MouseArea {
+ anchors.fill: parent
+ onClicked: Hyprland.dispatch("workspace " + (index + 1))
+ }
+ }
+ }
+
+ // Separator
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.leftMargin: 8; Layout.rightMargin: 8; color: root.colMuted }
+
+ // Layout
+ Text { text: currentLayout; color: root.colFg; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true }
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.leftMargin: 8; Layout.rightMargin: 8; color: root.colMuted }
+ Text { text: "๓ฐฆ– " + upTime; color: root.colCyan; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true }
+
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.leftMargin: 8; Layout.rightMargin: 8; color: root.colMuted }
+
+ // Window Title
+ Text {
+ text: activeWindow; color: root.colPurple; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true
+ Layout.fillWidth: true; Layout.leftMargin: 8; elide: Text.ElideRight; maximumLineCount: 1
+ }
+ RowLayout {
+ id: weatherRow
+ spacing: 10
+
+ Text {
+ text: weatherIcon
+ color: root.colYellow
+ font.pixelSize: 18
+ font.family: root.fontFamily
+ font.bold: true
+ }
+
+ Text {
+ text: weatherTemp
+ font.family: root.fontFamily
+ font.pixelSize: root.fontSize
+ color: root.colYellow
+ font.bold: true
+ }
+
+ Text {
+ text: weatherPrecip
+ font.family: root.fontFamily
+ font.pixelSize: root.fontSize
+ color: root.colGreen
+ font.bold: true
+ }
+
+ Text {
+ text: weatherWind
+ font.family: root.fontFamily
+ font.pixelSize: root.fontSize
+ color: root.colBlue
+ font.bold: true
+ Layout.rightMargin: 8
+ }
+
+ }
+
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted }
+
+ Text { text: "๏‹‡ " + cpuTemp; color: tempColor; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 }
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted }
+
+ Text { text: "๏’ผ " + cpuUsage + "%"; color: root.colPurple; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 }
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted }
+
+ Text { text: "๎ŠŒ " + memUsage; color: root.colCyan; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 }
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted }
+
+ Text { text: "๏ƒ‡ " + diskUsage; color: root.colBlue; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 }
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted }
+
+ Text { text: netConnection; color: root.colBlue; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 4 }
+ // netspeed
+ RowLayout {
+ id: netSpeedRow
+ visible: root.netConnection == "๓ฐคจ"
+ spacing: 0
+
+ Rectangle {
+ Layout.preferredWidth: 1; Layout.preferredHeight: 16
+ Layout.leftMargin: 8; Layout.rightMargin: 8
+ color: root.colMuted
+ }
+ Text {
+ id: netSpeed
+ color: root.colRed
+ font.pixelSize: 15
+ font.family: root.fontFamily
+ font.bold: true
+ Layout.rightMargin: 8
+
+ Process {
+ id: netProc
+ command: ["bash", "/opt/scripts/netspeed.sh", "wlp8s0"]
+ running: root.netConnection == "๓ฐคจ"
+ stdout: SplitParser {
+ onRead: data => netSpeed.text = data.trim()
+ }
+ }
+ }
+ }
+
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted }
+ Text { text: "๏€จ " + volumeLevel + "%"; color: root.colPurple; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 }
+ Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted }
+
+
+ // Clock
+ Text {
+ id: clockText
+ text: Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm")
+ color: root.colFg
+ font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8
+ Timer {
+ interval: 1000; running: true; repeat: true
+ onTriggered: clockText.text = Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm:ss")
+ }
+ }
+
+ RowLayout {
+ id: notifRow
+ visible: root.notificationCount > 0
+ spacing: 0
+
+ Rectangle {
+ Layout.preferredWidth: 1; Layout.preferredHeight: 16
+ Layout.leftMargin: 8; Layout.rightMargin: 8
+ color: root.colMuted
+ }
+
+ Text {
+ text: "๓ฐ‚š " + root.notificationCount
+ color: root.colYellow
+ font.pixelSize: root.fontSize
+ font.family: root.fontFamily
+ font.bold: true
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
+ onClicked: (mouse) => {
+ if (mouse.button === Qt.RightButton) {
+ clearAllProc.running = true;
+ } else {
+ showHistoryProc.running = true;
+ }
+ }
+ }
+ }
+ }
+
+ Item { width: 8 }
+ }
+ }
+ }
+ }
+}
diff --git a/scripts/mount-usb.sh b/scripts/mount-usb.sh
index ae53a14..1565b90 100755
--- a/scripts/mount-usb.sh
+++ b/scripts/mount-usb.sh
@@ -71,7 +71,7 @@ case "$chosen" in
MAPPER="$usb$num"
- ${TERMINAL:-st} -n floatpattern -g 60x1 -e sudo cryptsetup open "$chosen" "$MAPPER"
+ ${TERMINAL:-foot} -a floatpattern -w 60x3 sh -c "pass=\$(systemd-ask-password 'Enter Passphrase:'); echo \$pass | sudo cryptsetup open '$chosen' '$MAPPER'"
if ! test -b "/dev/mapper/$MAPPER"; then
notify-send "โŒ Decryption Failed" "Could not open $chosen"
diff --git a/vim/plugged/gruvbox-material b/vim/plugged/gruvbox-material
new file mode 160000
+Subproject afb275d8e6dc379762d122bd24e1773fc057abf
diff --git a/vim/plugged/tokyonight-vim b/vim/plugged/tokyonight-vim
deleted file mode 160000
-Subproject 4e82e0f0452a6ce8f387828ec71013015515035