From 92811eb6050c2f2971c6ab8998b18d448ded35a0 Mon Sep 17 00:00:00 2001 From: subh Date: Sat, 4 Apr 2026 10:34:46 +0530 Subject: Departure from catppuccin to gruvbox --- .vim/.netrwhist | 22 +- .vim/colors.vim | 34 +- .vim/options.vim | 2 + .vim/plugins.vim | 2 +- foot/foot.ini | 63 +++ hyprland/hyprland.conf | 23 +- hyprland/keybinds.conf | 4 +- hyprlock/Fonts/JetBrains/JetBrains Mono Nerd.ttf | Bin 979356 -> 0 bytes .../Fonts/SF Pro Display/SF Pro Display Bold.otf | Bin 3203404 -> 0 bytes .../SF Pro Display/SF Pro Display Regular.otf | Bin 3123592 -> 0 bytes hyprlock/Scripts/songdetail.sh | 4 +- hyprlock/berserk.png | Bin 4454142 -> 8464979 bytes hyprlock/cat.jpg | Bin 0 -> 47798 bytes hyprlock/cat.png | Bin 335725 -> 0 bytes hyprlock/hyprlock.conf | 20 +- hyprlock/hyprlock.png | Bin 22358833 -> 0 bytes hyprlock/vivek.png | Bin 200401 -> 0 bytes kitty/kitty.conf | 39 -- quickshell/mpd/shell.qml | 22 +- quickshell/mpd/shell.qml.bak | 470 ++++++++++++++++++++ quickshell/shell.qml | 33 +- quickshell/shell.qml.bak | 488 +++++++++++++++++++++ scripts/mount-usb.sh | 2 +- vim/plugged/gruvbox-material | 1 + vim/plugged/tokyonight-vim | 1 - 25 files changed, 1118 insertions(+), 112 deletions(-) create mode 100644 foot/foot.ini delete mode 100644 hyprlock/Fonts/JetBrains/JetBrains Mono Nerd.ttf delete mode 100755 hyprlock/Fonts/SF Pro Display/SF Pro Display Bold.otf delete mode 100755 hyprlock/Fonts/SF Pro Display/SF Pro Display Regular.otf create mode 100644 hyprlock/cat.jpg delete mode 100644 hyprlock/cat.png delete mode 100644 hyprlock/hyprlock.png delete mode 100644 hyprlock/vivek.png delete mode 100644 kitty/kitty.conf create mode 100644 quickshell/mpd/shell.qml.bak create mode 100644 quickshell/shell.qml.bak create mode 160000 vim/plugged/gruvbox-material delete mode 160000 vim/plugged/tokyonight-vim 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 @@ -204,6 +205,20 @@ windowrule { center = on } +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 Binary files a/hyprlock/Fonts/JetBrains/JetBrains Mono Nerd.ttf and /dev/null 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 Binary files a/hyprlock/Fonts/SF Pro Display/SF Pro Display Bold.otf and /dev/null 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 Binary files a/hyprlock/Fonts/SF Pro Display/SF Pro Display Regular.otf and /dev/null 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 Binary files a/hyprlock/berserk.png and b/hyprlock/berserk.png differ diff --git a/hyprlock/cat.jpg b/hyprlock/cat.jpg new file mode 100644 index 0000000..b5f3c5d Binary files /dev/null and b/hyprlock/cat.jpg differ diff --git a/hyprlock/cat.png b/hyprlock/cat.png deleted file mode 100644 index 0216f9a..0000000 Binary files a/hyprlock/cat.png and /dev/null 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 "$(date +"%I:%M")" 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 = ๐Ÿ”’ Enter Pass 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 Binary files a/hyprlock/hyprlock.png and /dev/null differ diff --git a/hyprlock/vivek.png b/hyprlock/vivek.png deleted file mode 100644 index 5b9be9a..0000000 Binary files a/hyprlock/vivek.png and /dev/null 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 index 0000000..afb275d --- /dev/null +++ b/vim/plugged/gruvbox-material @@ -0,0 +1 @@ +Subproject commit afb275d8e6dc379762d122bd24e1773fc057abf3 diff --git a/vim/plugged/tokyonight-vim b/vim/plugged/tokyonight-vim deleted file mode 160000 index 4e82e0f..0000000 --- a/vim/plugged/tokyonight-vim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4e82e0f0452a6ce8f387828ec71013015515035a -- cgit v1.2.3