removed eww and waybar added quickshell
This commit is contained in:
190
eww/eww.scss
190
eww/eww.scss
@@ -1,190 +0,0 @@
|
|||||||
// ─────────────────────────────────────────────
|
|
||||||
// Palette — tweak these to match your theme
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
$bg: rgba(0, 0, 0, 0.35);
|
|
||||||
$bg-surface: rgba(0, 0, 0, 0.35);
|
|
||||||
$border: rgba(255, 255, 255, 0);
|
|
||||||
$text: #cdd6f4;
|
|
||||||
$subtext: #6c7086;
|
|
||||||
$accent: #89b4fa;
|
|
||||||
$accent2: #cba6f7;
|
|
||||||
$green: #a6e3a1;
|
|
||||||
$yellow: #f9e2af;
|
|
||||||
$red: #f38ba8;
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Reset / Base
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
* {
|
|
||||||
all: unset;
|
|
||||||
font-family: "JetBrains Mono", "Iosevka", monospace;
|
|
||||||
font-size: 12px;
|
|
||||||
color: $text;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Window margin (replaces calc() in geometry)
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
.eww-bar {
|
|
||||||
margin: 0 0 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Bar root
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
.bar-left{
|
|
||||||
background: transparent;
|
|
||||||
padding: 0 10px;
|
|
||||||
min-height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bar-right, .bar-center {
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 0 10px;
|
|
||||||
min-height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bar-left { border-radius: 8px 8px 8px 8px; }
|
|
||||||
.bar-center { border-radius: 8px; }
|
|
||||||
.bar-right { border-radius: 8px 8px 8px 8px; }
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Workspaces
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
|
|
||||||
.workspace-btn {
|
|
||||||
min-width: 32px;
|
|
||||||
padding: 2px 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
border-radius: 8px;
|
|
||||||
color: $subtext;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 11px;
|
|
||||||
transition: all 200ms ease;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: rgba(137, 180, 250, 0.12);
|
|
||||||
color: $accent;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
background: rgba(90, 148, 22, 0.85);
|
|
||||||
color: $accent;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.urgent {
|
|
||||||
background: rgba(207, 42, 89, 0.732);
|
|
||||||
color: $red;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Window title
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
.window-title {
|
|
||||||
padding: 0px 8px;
|
|
||||||
color: $subtext;
|
|
||||||
background: $bg;
|
|
||||||
border-radius: 8px;
|
|
||||||
|
|
||||||
.window-icon {
|
|
||||||
font-size: 11px;
|
|
||||||
color: $accent2;
|
|
||||||
margin-right: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-text {
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Clock
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
.clock {
|
|
||||||
padding: 0px 16px;
|
|
||||||
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
border-radius: 8px;
|
|
||||||
|
|
||||||
.clock-time {
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 12px;
|
|
||||||
color: $text;
|
|
||||||
letter-spacing: 0.04em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clock-sep {
|
|
||||||
color: $border;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clock-date {
|
|
||||||
font-size: 11px;
|
|
||||||
color: $subtext;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Center buttons (logout / settings)
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
.center-btn {
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
border-radius: 8px;
|
|
||||||
color: $subtext;
|
|
||||||
font-size: 13px;
|
|
||||||
padding: 0px 16px;
|
|
||||||
transition: all 150ms ease;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: $accent;
|
|
||||||
background: rgba(137, 180, 250, 0.10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Stat pills (cpu / mem / battery / network / volume)
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
.stat-pill {
|
|
||||||
background: $bg-surface;
|
|
||||||
border-radius: 6px;
|
|
||||||
border: 1px solid $border;
|
|
||||||
padding: 2px 8px;
|
|
||||||
color: $text;
|
|
||||||
|
|
||||||
.stat-icon {
|
|
||||||
font-size: 12px;
|
|
||||||
color: $accent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stat-value {
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.clickable {
|
|
||||||
transition: background 150ms ease;
|
|
||||||
&:hover {
|
|
||||||
background: rgba(137, 180, 250, 0.14);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.charging .stat-icon { color: $green; }
|
|
||||||
&.warning .stat-icon { color: $yellow; }
|
|
||||||
&.critical .stat-icon { color: $red; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
// Theme toggle
|
|
||||||
// ─────────────────────────────────────────────
|
|
||||||
.theme-btn {
|
|
||||||
.theme-icon {
|
|
||||||
font-size: 13px;
|
|
||||||
color: $accent2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.center-btn.active {
|
|
||||||
background: rgba(90, 148, 22, 0.85);
|
|
||||||
}
|
|
||||||
311
eww/eww.yuck
311
eww/eww.yuck
@@ -1,311 +0,0 @@
|
|||||||
;;; ─────────────────────────────────────────────
|
|
||||||
;;; Variables
|
|
||||||
;;; ─────────────────────────────────────────────
|
|
||||||
|
|
||||||
(deflisten workspaces-dp2
|
|
||||||
:initial "[]"
|
|
||||||
"python3 ~/.config/eww/scripts/get-workspaces.py DP-2")
|
|
||||||
|
|
||||||
(deflisten workspaces-hdmi
|
|
||||||
:initial "[]"
|
|
||||||
"python3 ~/.config/eww/scripts/get-workspaces.py HDMI-A-1")
|
|
||||||
|
|
||||||
(deflisten active-window-dp2
|
|
||||||
:initial ""
|
|
||||||
"bash ~/.config/eww/scripts/get-active-window.sh DP-2")
|
|
||||||
|
|
||||||
(deflisten active-window-hdmi
|
|
||||||
:initial ""
|
|
||||||
"bash ~/.config/eww/scripts/get-active-window.sh HDMI-A-1")
|
|
||||||
|
|
||||||
(defpoll clock-time
|
|
||||||
:interval "1s"
|
|
||||||
"date '+%H:%M:%S'")
|
|
||||||
|
|
||||||
(defpoll clock-date
|
|
||||||
:interval "1s"
|
|
||||||
"date '+%A, %B %d %Y'")
|
|
||||||
|
|
||||||
(defpoll cpu-usage
|
|
||||||
:interval "2s"
|
|
||||||
"top -bn1 | grep 'Cpu(s)' | awk '{print int($2+$4)}'")
|
|
||||||
|
|
||||||
(defpoll mem-used
|
|
||||||
:interval "2s"
|
|
||||||
"free -g --si | awk '/Mem:/{printf \"%.1f\", $3}'")
|
|
||||||
|
|
||||||
(defpoll network-info
|
|
||||||
:interval "5s"
|
|
||||||
"bash ~/.config/eww/scripts/get-network.sh")
|
|
||||||
|
|
||||||
(defpoll volume-info
|
|
||||||
:interval "1s"
|
|
||||||
"bash ~/.config/eww/scripts/get-volume.sh")
|
|
||||||
|
|
||||||
(defpoll theme-info
|
|
||||||
:interval "2s"
|
|
||||||
"bash ~/.config/eww/scripts/get-theme.sh")
|
|
||||||
|
|
||||||
;;; ─────────────────────────────────────────────
|
|
||||||
;;; Helper Widgets
|
|
||||||
;;; ─────────────────────────────────────────────
|
|
||||||
|
|
||||||
(defwidget workspace-btn [id label active urgent output icons pxwidth]
|
|
||||||
(box
|
|
||||||
:orientation "h"
|
|
||||||
:width pxwidth
|
|
||||||
(button
|
|
||||||
:class {active ? "workspace-btn active" : urgent ? "workspace-btn urgent" : "workspace-btn"}
|
|
||||||
:onclick "hyprctl dispatch workspace ${id}"
|
|
||||||
:hexpand true
|
|
||||||
(box
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 3
|
|
||||||
:halign "center"
|
|
||||||
:valign "center"
|
|
||||||
(label :text label :class "ws-label")
|
|
||||||
(for icon in icons
|
|
||||||
(image
|
|
||||||
:path icon
|
|
||||||
:image-width 16
|
|
||||||
:image-height 16))))))
|
|
||||||
|
|
||||||
|
|
||||||
(defwidget workspaces-widget [workspaces]
|
|
||||||
(box
|
|
||||||
:class "workspaces"
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 2
|
|
||||||
(for ws in workspaces
|
|
||||||
(workspace-btn
|
|
||||||
:id {ws.id}
|
|
||||||
:label {ws.label}
|
|
||||||
:active {ws.active}
|
|
||||||
:urgent {ws.urgent}
|
|
||||||
:output {ws.output}
|
|
||||||
:icons {ws.icons}
|
|
||||||
:pxwidth {ws.pxwidth}))))
|
|
||||||
|
|
||||||
;;; add this with your variables
|
|
||||||
(defvar clock-show-date false)
|
|
||||||
|
|
||||||
;;; replace your clock-widget
|
|
||||||
(defwidget clock-widget []
|
|
||||||
(button
|
|
||||||
:class "clock"
|
|
||||||
:onclick "eww update clock-show-date=${clock-show-date == 'true' ? 'false' : 'true'}"
|
|
||||||
(label
|
|
||||||
:class "clock-time"
|
|
||||||
:text {clock-show-date == "true" ? clock-date : clock-time})))
|
|
||||||
|
|
||||||
(defwidget cpu-widget []
|
|
||||||
(box
|
|
||||||
:class "stat-pill"
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 4
|
|
||||||
(label :text "${cpu-usage}%" :class "stat-value")))
|
|
||||||
|
|
||||||
(defwidget mem-widget []
|
|
||||||
(box
|
|
||||||
:class "stat-pill"
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 4
|
|
||||||
(label :text "${mem-used}G" :class "stat-value")))
|
|
||||||
|
|
||||||
(defwidget network-widget []
|
|
||||||
(box
|
|
||||||
:class "stat-pill"
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 4
|
|
||||||
(label :text {network-info == "offline" ? "Offline" :
|
|
||||||
network-info =~ "^wifi:.*" ? "${network-info}" :
|
|
||||||
"${network-info}"}
|
|
||||||
:class "stat-value"
|
|
||||||
:limit-width 20)))
|
|
||||||
|
|
||||||
(defwidget volume-widget [on-click]
|
|
||||||
(button
|
|
||||||
:class "stat-pill clickable"
|
|
||||||
:onclick on-click
|
|
||||||
(box
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 4
|
|
||||||
(label
|
|
||||||
:text {volume-info =~ "^muted.*" ? "" :
|
|
||||||
volume-info =~ "^[0-9]" && volume-info < "34" ? "" :
|
|
||||||
volume-info =~ "^[0-9]" && volume-info < "67" ? "" : ""}
|
|
||||||
:class "stat-icon")
|
|
||||||
(label
|
|
||||||
:text {volume-info =~ "^muted.*" ? "Muted" : "${volume-info}%"}
|
|
||||||
:class "stat-value"))))
|
|
||||||
|
|
||||||
(defwidget theme-widget []
|
|
||||||
(button
|
|
||||||
:class "stat-pill clickable theme-btn"
|
|
||||||
:onclick "bash $HOME/.config/hypr/theme-cycle.sh next"
|
|
||||||
:onrightclick "bash $HOME/.config/hypr/theme-cycle.sh auto"
|
|
||||||
(label :text theme-info :class "theme-icon")))
|
|
||||||
|
|
||||||
(defwidget logout-btn []
|
|
||||||
(button
|
|
||||||
:class "center-btn"
|
|
||||||
:onclick "your-logout-command"
|
|
||||||
(label :text "")))
|
|
||||||
|
|
||||||
(defwidget settings-btn []
|
|
||||||
(button
|
|
||||||
:class "center-btn"
|
|
||||||
:onclick "your-settings-command"
|
|
||||||
(label :text "")))
|
|
||||||
|
|
||||||
;;; ─────────────────────────────────────────────
|
|
||||||
;;; Bar for DP-2 (workspaces 1–5)
|
|
||||||
;;; ─────────────────────────────────────────────
|
|
||||||
|
|
||||||
(defwidget bar-dp2 []
|
|
||||||
(centerbox
|
|
||||||
:orientation "h"
|
|
||||||
(box :class "bar-left" :orientation "h" :spacing 8 :space-evenly false :halign "start"
|
|
||||||
(workspaces-widget :workspaces workspaces-dp2))
|
|
||||||
(box :class "bar-center" :orientation "h" :spacing 12 :space-evenly false
|
|
||||||
|
|
||||||
(clock-widget)
|
|
||||||
)
|
|
||||||
(box :class "bar-right" :orientation "h" :spacing 8 :space-evenly false :halign "end"
|
|
||||||
(settings-menu)
|
|
||||||
(logout-menu)
|
|
||||||
(cpu-widget)
|
|
||||||
(mem-widget))))
|
|
||||||
|
|
||||||
(defwindow bar-dp2
|
|
||||||
:monitor 0
|
|
||||||
:geometry (geometry
|
|
||||||
:x "10px"
|
|
||||||
:y "8px"
|
|
||||||
:width "1920px"
|
|
||||||
:height "24px"
|
|
||||||
:anchor "top center")
|
|
||||||
:exclusive true
|
|
||||||
:layer "top"
|
|
||||||
:namespace "eww-bar"
|
|
||||||
(bar-dp2))
|
|
||||||
|
|
||||||
;;; ─────────────────────────────────────────────
|
|
||||||
;;; Bar for HDMI-A-1 (workspaces 6–10)
|
|
||||||
;;; ─────────────────────────────────────────────
|
|
||||||
|
|
||||||
(defwidget bar-hdmi []
|
|
||||||
(centerbox
|
|
||||||
:orientation "h"
|
|
||||||
(box :class "bar-left" :orientation "h" :spacing 8 :space-evenly false
|
|
||||||
(workspaces-widget :workspaces workspaces-hdmi))
|
|
||||||
(box :class "bar-center" :orientation "h" :spacing 12 :space-evenly false
|
|
||||||
(logout-btn)
|
|
||||||
(clock-widget))
|
|
||||||
(box :class "bar-right" :orientation "h" :spacing 2 :space-evenly false :halign "end"
|
|
||||||
(settings-btn)
|
|
||||||
(cpu-widget)
|
|
||||||
(mem-widget))))
|
|
||||||
|
|
||||||
(defwindow bar-hdmi
|
|
||||||
:monitor 1
|
|
||||||
:geometry (geometry
|
|
||||||
:x "10px"
|
|
||||||
:y "8px"
|
|
||||||
:width "1920px"
|
|
||||||
:height "24px"
|
|
||||||
:anchor "top center")
|
|
||||||
:exclusive true
|
|
||||||
:layer "top"
|
|
||||||
:namespace "eww-bar"
|
|
||||||
(bar-hdmi))
|
|
||||||
|
|
||||||
|
|
||||||
(defvar logout-menu-open false)
|
|
||||||
(defvar settings-menu-open false)
|
|
||||||
|
|
||||||
(defwidget logout-menu []
|
|
||||||
(box
|
|
||||||
:class "center-menu-wrap"
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 4
|
|
||||||
:space-evenly false
|
|
||||||
|
|
||||||
(revealer
|
|
||||||
:reveal {logout-menu-open == "true"}
|
|
||||||
:transition "slideright"
|
|
||||||
:duration "200ms"
|
|
||||||
(box
|
|
||||||
:class "center-menu"
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 4
|
|
||||||
:space-evenly false
|
|
||||||
|
|
||||||
(button
|
|
||||||
:class "center-btn"
|
|
||||||
:tooltip "Lock"
|
|
||||||
:onclick "eww update logout-menu-open=false && hyprlock"
|
|
||||||
(label :text ""))
|
|
||||||
|
|
||||||
(button
|
|
||||||
:class "center-btn"
|
|
||||||
:tooltip "Reboot"
|
|
||||||
:onclick "eww update logout-menu-open=false && systemctl reboot"
|
|
||||||
(label :text ""))
|
|
||||||
|
|
||||||
(button
|
|
||||||
:class "center-btn"
|
|
||||||
:tooltip "Shutdown"
|
|
||||||
:onclick "eww update logout-menu-open=false && systemctl poweroff"
|
|
||||||
(label :text ""))
|
|
||||||
|
|
||||||
(button
|
|
||||||
:class "center-btn"
|
|
||||||
:tooltip "Logout"
|
|
||||||
:onclick "eww update logout-menu-open=false && hyprctl dispatch exit"
|
|
||||||
(label :text ""))))
|
|
||||||
(button
|
|
||||||
:class "center-btn"
|
|
||||||
:onclick "eww update logout-menu-open=${logout-menu-open == 'true' ? 'false' : 'true'} && eww update settings-menu-open=false"
|
|
||||||
(label :text {logout-menu-open == "true" ? "" : ""}))
|
|
||||||
|
|
||||||
))
|
|
||||||
|
|
||||||
(defwidget settings-menu []
|
|
||||||
(box
|
|
||||||
:class "center-menu-wrap"
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 4
|
|
||||||
:space-evenly false
|
|
||||||
|
|
||||||
(revealer
|
|
||||||
:reveal {settings-menu-open == "true"}
|
|
||||||
:transition "slideright"
|
|
||||||
:duration "200ms"
|
|
||||||
(box
|
|
||||||
:class "center-menu"
|
|
||||||
:orientation "h"
|
|
||||||
:spacing 4
|
|
||||||
:space-evenly false
|
|
||||||
|
|
||||||
|
|
||||||
(theme-widget)
|
|
||||||
|
|
||||||
(volume-widget :on-click "bash ~/.config/eww/scripts/toggle-mixer.sh")
|
|
||||||
|
|
||||||
(network-widget)
|
|
||||||
|
|
||||||
(button
|
|
||||||
:class "center-btn"
|
|
||||||
:tooltip "Displays"
|
|
||||||
:onclick "eww update settings-menu-open=false && wdisplays"
|
|
||||||
(label :text ""))
|
|
||||||
|
|
||||||
))
|
|
||||||
|
|
||||||
(button
|
|
||||||
:class {settings-menu-open == "true" ? "center-btn active" : "center-btn"}
|
|
||||||
:onclick "eww update settings-menu-open=${settings-menu-open == 'true' ? 'false' : 'true'} && eww update logout-menu-open=false"
|
|
||||||
(label :text {settings-menu-open == "true" ? "" : ""}))
|
|
||||||
|
|
||||||
))
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
OUTPUT="${1:-DP-2}"
|
|
||||||
|
|
||||||
get_socket() {
|
|
||||||
local runtime="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
|
|
||||||
local sig
|
|
||||||
sig=$(ls "$runtime/hypr/" 2>/dev/null | head -n1)
|
|
||||||
echo "$runtime/hypr/$sig/.socket2.sock"
|
|
||||||
}
|
|
||||||
|
|
||||||
emit() {
|
|
||||||
local monitor_ws title
|
|
||||||
|
|
||||||
monitor_ws=$(hyprctl monitors -j 2>/dev/null \
|
|
||||||
| jq -r ".[] | select(.name==\"$OUTPUT\") | .activeWorkspace.id")
|
|
||||||
|
|
||||||
title=$(hyprctl clients -j 2>/dev/null \
|
|
||||||
| jq -r ".[] | select(.workspace.id==$monitor_ws and .focusHistoryID==0) | .title" \
|
|
||||||
| head -n1)
|
|
||||||
|
|
||||||
printf '%s\n' "${title:-}"
|
|
||||||
}
|
|
||||||
|
|
||||||
emit
|
|
||||||
|
|
||||||
SOCKET=$(get_socket)
|
|
||||||
|
|
||||||
socat -u "UNIX-CONNECT:$SOCKET" - \
|
|
||||||
| stdbuf -oL grep -E "^(activewindow|focusedmon|workspace|closewindow)>" \
|
|
||||||
| while IFS= read -r _; do
|
|
||||||
sleep 0.05
|
|
||||||
emit
|
|
||||||
done
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Outputs one of:
|
|
||||||
# offline
|
|
||||||
# wifi:<signal>%
|
|
||||||
# eth:<ip>
|
|
||||||
|
|
||||||
# Check ethernet first
|
|
||||||
ETH=$(ip -o link show | awk '$9=="UP" && $2!="lo:" {print $2}' | grep -v "^wl" | head -1 | tr -d ':')
|
|
||||||
if [[ -n "$ETH" ]]; then
|
|
||||||
IP=$(ip -4 addr show "$ETH" 2>/dev/null | awk '/inet /{print $2}' | cut -d/ -f1 | head -1)
|
|
||||||
if [[ -n "$IP" ]]; then
|
|
||||||
echo "eth:${IP}"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check wifi
|
|
||||||
WIFI=$(ip -o link show | awk '$9=="UP" && $2~/^wl/ {print $2}' | tr -d ':' | head -1)
|
|
||||||
if [[ -n "$WIFI" ]]; then
|
|
||||||
SIGNAL=$(awk "/${WIFI}/{print int(\$3*100/70)}" /proc/net/wireless 2>/dev/null | head -1)
|
|
||||||
[[ -z "$SIGNAL" ]] && SIGNAL="?"
|
|
||||||
echo "wifi:${SIGNAL}%"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "offline"
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Get all sink inputs as JSON array for eww
|
|
||||||
pactl list sink-inputs | awk '
|
|
||||||
/^Sink Input/ { id=substr($3,2,length($3)-1) }
|
|
||||||
/application.name/ { gsub(/"/,"",$3); name=$3 }
|
|
||||||
/Volume:.*%/ {
|
|
||||||
match($0, /[0-9]+%/)
|
|
||||||
vol=substr($0,RSTART,RLENGTH-1)
|
|
||||||
printf "{\"id\":\"%s\",\"name\":\"%s\",\"volume\":\"%s\"}\n", id, name, vol
|
|
||||||
name=""; vol=""
|
|
||||||
}' | jq -s '.'
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Wraps your existing theme-cycle.sh to extract a display icon for eww.
|
|
||||||
# theme-cycle.sh status returns JSON like: {"text":"...","class":"...","tooltip":"..."}
|
|
||||||
# We parse the "text" field and emit it directly.
|
|
||||||
|
|
||||||
RAW=$(bash "$HOME/.config/hypr/theme-cycle.sh" status 2>/dev/null)
|
|
||||||
|
|
||||||
# If it's JSON, extract text field
|
|
||||||
if echo "$RAW" | jq -e . >/dev/null 2>&1; then
|
|
||||||
echo "$RAW" | jq -r '.text // ""'
|
|
||||||
else
|
|
||||||
# Plain text fallback
|
|
||||||
echo "${RAW:-}"
|
|
||||||
fi
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Outputs either:
|
|
||||||
# muted
|
|
||||||
# <0-100> (integer volume)
|
|
||||||
|
|
||||||
SINK=$(pactl get-default-sink 2>/dev/null)
|
|
||||||
if [[ -z "$SINK" ]]; then
|
|
||||||
echo "muted"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
INFO=$(pactl get-sink-volume "$SINK" 2>/dev/null)
|
|
||||||
MUTED=$(pactl get-sink-mute "$SINK" 2>/dev/null | awk '{print $2}')
|
|
||||||
|
|
||||||
if [[ "$MUTED" == "yes" ]]; then
|
|
||||||
echo "muted"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
VOL=$(echo "$INFO" | grep -oP '\d+(?=%)' | head -1)
|
|
||||||
echo "${VOL:-0}"
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# get-workspace-icons.sh <workspace_id>
|
|
||||||
|
|
||||||
WORKSPACE=${1:-1}
|
|
||||||
|
|
||||||
# Get app classes on the workspace
|
|
||||||
CLASSES=$(hyprctl clients -j | jq -r \
|
|
||||||
"[.[] | select(.workspace.id == $WORKSPACE) | .class] | unique[]")
|
|
||||||
|
|
||||||
for class in $CLASSES; do
|
|
||||||
echo "=== $class ==="
|
|
||||||
|
|
||||||
# Find matching .desktop file (case-insensitive)
|
|
||||||
DESKTOP=$(find /usr/share/applications ~/.local/share/applications \
|
|
||||||
-name "*.desktop" 2>/dev/null | \
|
|
||||||
xargs grep -li "^Name.*=$class\|^Exec.*$class\|^\[Desktop Entry\]" 2>/dev/null | \
|
|
||||||
head -1)
|
|
||||||
|
|
||||||
if [[ -n "$DESKTOP" ]]; then
|
|
||||||
ICON_NAME=$(grep "^Icon=" "$DESKTOP" | cut -d= -f2)
|
|
||||||
echo " Icon name: $ICON_NAME"
|
|
||||||
|
|
||||||
# Find actual icon file
|
|
||||||
ICON_FILE=$(find /usr/share/icons ~/.local/share/icons /usr/share/pixmaps \
|
|
||||||
-name "${ICON_NAME}.*" \( -name "*.png" -o -name "*.svg" \) \
|
|
||||||
2>/dev/null | sort | tail -1)
|
|
||||||
|
|
||||||
echo " Icon file: ${ICON_FILE:-not found}"
|
|
||||||
else
|
|
||||||
echo " .desktop file not found"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import subprocess, json, os, socket
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
OUTPUT = None # set via argv, e.g. "DP-2"
|
|
||||||
|
|
||||||
def get_icon(cls: str) -> str | None:
|
|
||||||
theme = Gtk.IconTheme.get_default()
|
|
||||||
for name in [cls, cls.lower(), cls.lower().rstrip("0123456789")]:
|
|
||||||
info = theme.lookup_icon(name, 16, 0)
|
|
||||||
if info:
|
|
||||||
return info.get_filename()
|
|
||||||
return None
|
|
||||||
# Define which workspace IDs belong to each monitor
|
|
||||||
MONITOR_WORKSPACES = {
|
|
||||||
"DP-2": [1, 2, 3, 4, 5],
|
|
||||||
"HDMI-A-1": [6, 7, 8, 9, 10],
|
|
||||||
}
|
|
||||||
|
|
||||||
def build():
|
|
||||||
clients = json.loads(subprocess.check_output(["hyprctl", "clients", "-j"]))
|
|
||||||
workspaces = json.loads(subprocess.check_output(["hyprctl", "workspaces", "-j"]))
|
|
||||||
active = json.loads(subprocess.check_output(["hyprctl", "activeworkspace", "-j"]))
|
|
||||||
|
|
||||||
# existing workspace IDs on this monitor (Hyprland only lists non-empty ones)
|
|
||||||
existing = {w["id"] for w in workspaces if w["monitor"] == OUTPUT}
|
|
||||||
|
|
||||||
# all IDs we want to show, including empty ones
|
|
||||||
all_ids = sorted(set(MONITOR_WORKSPACES.get(OUTPUT, [])) | existing)
|
|
||||||
|
|
||||||
# build icon map
|
|
||||||
amount = {}
|
|
||||||
icons: dict[int, list[str]] = {}
|
|
||||||
for c in clients:
|
|
||||||
wid = c["workspace"]["id"]
|
|
||||||
cls = c.get("class") or c.get("initialClass", "")
|
|
||||||
path = get_icon(cls)
|
|
||||||
if path and path not in icons.get(wid, []):
|
|
||||||
icons.setdefault(wid, []).append(path)
|
|
||||||
amount[c["workspace"]["id"]] =+ 1
|
|
||||||
|
|
||||||
result = []
|
|
||||||
for wid in all_ids:
|
|
||||||
result.append({
|
|
||||||
"id": wid,
|
|
||||||
"label": str(wid),
|
|
||||||
"active": wid == active["id"],
|
|
||||||
"urgent": any(c.get("urgent") and c["workspace"]["id"] == wid for c in clients),
|
|
||||||
"output": OUTPUT,
|
|
||||||
"icons": icons.get(wid, []),
|
|
||||||
"pxwidth": 32 + len(icons.get(wid, [])) * 20,
|
|
||||||
})
|
|
||||||
|
|
||||||
print(json.dumps(result), flush=True)
|
|
||||||
|
|
||||||
def watch():
|
|
||||||
xdg = os.environ.get("XDG_RUNTIME_DIR", f"/run/user/{os.getuid()}")
|
|
||||||
sig = os.environ.get("HYPRLAND_INSTANCE_SIGNATURE", "")
|
|
||||||
sock = f"{xdg}/hypr/{sig}/.socket2.sock"
|
|
||||||
|
|
||||||
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
|
|
||||||
s.connect(sock)
|
|
||||||
buf = ""
|
|
||||||
while True:
|
|
||||||
buf += s.recv(4096).decode()
|
|
||||||
while "\n" in buf:
|
|
||||||
line, buf = buf.split("\n", 1)
|
|
||||||
ev = line.split(">>")[0]
|
|
||||||
if ev in {"workspace", "openwindow", "closewindow",
|
|
||||||
"movewindow", "urgent", "focusedmon", "activelayout"}:
|
|
||||||
build()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import sys
|
|
||||||
OUTPUT = sys.argv[1] if len(sys.argv) > 1 else None
|
|
||||||
build()
|
|
||||||
watch()
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
OUTPUT="${1:-DP-2}"
|
|
||||||
|
|
||||||
if [[ "$OUTPUT" == "DP-2" ]]; then
|
|
||||||
IDS=(1 2 3 4 5)
|
|
||||||
else
|
|
||||||
IDS=(6 7 8 9 10)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# find the socket dynamically instead of relying on env var
|
|
||||||
get_socket() {
|
|
||||||
local runtime="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
|
|
||||||
local sig
|
|
||||||
sig=$(ls "$runtime/hypr/" 2>/dev/null | head -n1)
|
|
||||||
echo "$runtime/hypr/$sig/.socket2.sock"
|
|
||||||
}
|
|
||||||
|
|
||||||
emit() {
|
|
||||||
local active urgent_ids json
|
|
||||||
|
|
||||||
active=$(hyprctl activeworkspace -j 2>/dev/null | jq -r '.id')
|
|
||||||
urgent_ids=$(hyprctl clients -j 2>/dev/null \
|
|
||||||
| jq -r '[.[] | select(.urgent==true) | .workspace.id] | unique | .[]')
|
|
||||||
|
|
||||||
json=$(for id in "${IDS[@]}"; do
|
|
||||||
is_active=false
|
|
||||||
is_urgent=false
|
|
||||||
[[ "$id" == "$active" ]] && is_active=true
|
|
||||||
grep -qx "$id" <<< "$urgent_ids" && is_urgent=true
|
|
||||||
printf '{"id":%s,"label":"%s","active":%s,"urgent":%s,"output":"%s"}\n' \
|
|
||||||
"$id" "$id" "$is_active" "$is_urgent" "$OUTPUT"
|
|
||||||
done | jq -sc '.')
|
|
||||||
|
|
||||||
printf '%s\n' "$json"
|
|
||||||
}
|
|
||||||
|
|
||||||
emit
|
|
||||||
|
|
||||||
SOCKET=$(get_socket)
|
|
||||||
echo "Using socket: $SOCKET" >&2
|
|
||||||
|
|
||||||
socat -u "UNIX-CONNECT:$SOCKET" - \
|
|
||||||
| stdbuf -oL grep -E "^(workspace|focusedmon|activewindow|urgent|createworkspace|destroyworkspace)>" \
|
|
||||||
| while IFS= read -r _; do
|
|
||||||
sleep 0.05
|
|
||||||
emit
|
|
||||||
done
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
EWW="eww -c $HOME/.config/eww"
|
|
||||||
$EWW kill 2>/dev/null
|
|
||||||
sleep 0.5
|
|
||||||
|
|
||||||
declare -A BAR_MAP=(
|
|
||||||
["DP-2"]="bar-dp2"
|
|
||||||
["HDMI-A-1"]="bar-hdmi"
|
|
||||||
)
|
|
||||||
|
|
||||||
while IFS= read -r line; do
|
|
||||||
id=$(echo "$line" | awk '{print $1}')
|
|
||||||
name=$(echo "$line" | awk '{print $2}')
|
|
||||||
bar_name="${BAR_MAP[$name]}"
|
|
||||||
if [[ -z "$bar_name" ]]; then
|
|
||||||
echo "Warning: no bar mapped for monitor '$name'"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
echo "Opening $bar_name on $name (index $id)"
|
|
||||||
$EWW open "$bar_name"
|
|
||||||
done < <(hyprctl monitors -j | jq -r '.[] | "\(.id) \(.name)"')
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
if eww active-windows | grep -q "volume-mixer"; then
|
|
||||||
eww close volume-mixer
|
|
||||||
else
|
|
||||||
eww open volume-mixer
|
|
||||||
fi
|
|
||||||
131
hypr/2d-nav.sh
131
hypr/2d-nav.sh
@@ -1,131 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# ~/.config/hypr/2d-nav.sh
|
|
||||||
# 2D workspace navigation for Hyprland
|
|
||||||
# Workspaces are named "X" (base row) or "X-Y" (sub-row, Y >= 1)
|
|
||||||
# Usage: 2d-nav.sh [left|right|up|down|move-left|move-right|move-up|move-down]
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
ACTION="${1:-}"
|
|
||||||
|
|
||||||
# --- Parse current workspace ---
|
|
||||||
# Returns e.g. "3" or "3-2"
|
|
||||||
get_current_ws() {
|
|
||||||
hyprctl activeworkspace -j | jq -r '.name'
|
|
||||||
}
|
|
||||||
|
|
||||||
# Split "X-Y" into X and Y parts
|
|
||||||
parse_ws() {
|
|
||||||
local name="$1"
|
|
||||||
if [[ "$name" =~ ^([0-9]+)-([0-9]+)$ ]]; then
|
|
||||||
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}"
|
|
||||||
elif [[ "$name" =~ ^([0-9]+)$ ]]; then
|
|
||||||
echo "${BASH_REMATCH[1]} 0"
|
|
||||||
else
|
|
||||||
# Named/special workspace we don't manage — bail
|
|
||||||
echo "0 0"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
make_ws_name() {
|
|
||||||
local x="$1" y="$2"
|
|
||||||
if [[ "$y" -eq 0 ]]; then
|
|
||||||
echo "$x"
|
|
||||||
else
|
|
||||||
echo "${x}-${y}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if a named workspace currently exists (has at least one window OR is active)
|
|
||||||
ws_exists() {
|
|
||||||
local name="$1"
|
|
||||||
hyprctl workspaces -j | jq -e --arg n "$name" '.[] | select(.name == $n)' > /dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Navigate to workspace (creates it on demand if going up; smart-back if going down)
|
|
||||||
go_to_ws() {
|
|
||||||
local name="$1"
|
|
||||||
hyprctl dispatch workspace "name:${name}"
|
|
||||||
}
|
|
||||||
|
|
||||||
move_window_to_ws() {
|
|
||||||
local name="$1"
|
|
||||||
hyprctl dispatch movetoworkspace "name:${name}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# --- Main logic ---
|
|
||||||
current=$(get_current_ws)
|
|
||||||
read -r cx cy <<< "$(parse_ws "$current")"
|
|
||||||
|
|
||||||
# Min/max for X axis (your config has 1-5 on DP-2, 6-10 on HDMI-A-1)
|
|
||||||
# But for 2D nav we treat X as free-range 1..10
|
|
||||||
X_MIN=1
|
|
||||||
X_MAX=10
|
|
||||||
Y_MIN=0
|
|
||||||
Y_MAX=9 # Reasonable cap for sub-workspaces
|
|
||||||
|
|
||||||
case "$ACTION" in
|
|
||||||
right)
|
|
||||||
nx=$(( cx < X_MAX ? cx + 1 : cx ))
|
|
||||||
# When moving right, land on base row of target X (Y=0)
|
|
||||||
target=$(make_ws_name "$nx" 0)
|
|
||||||
go_to_ws "$target"
|
|
||||||
;;
|
|
||||||
left)
|
|
||||||
nx=$(( cx > X_MIN ? cx - 1 : cx ))
|
|
||||||
target=$(make_ws_name "$nx" 0)
|
|
||||||
go_to_ws "$target"
|
|
||||||
;;
|
|
||||||
up)
|
|
||||||
ny=$(( cy < Y_MAX ? cy + 1 : cy ))
|
|
||||||
target=$(make_ws_name "$cx" "$ny")
|
|
||||||
go_to_ws "$target"
|
|
||||||
;;
|
|
||||||
down)
|
|
||||||
if [[ "$cy" -gt 0 ]]; then
|
|
||||||
ny=$(( cy - 1 ))
|
|
||||||
# If the workspace below doesn't exist, fall back to base (Y=0), not Y=(cy-1)
|
|
||||||
target=$(make_ws_name "$cx" "$ny")
|
|
||||||
if [[ "$ny" -gt 0 ]] && ! ws_exists "$target"; then
|
|
||||||
target=$(make_ws_name "$cx" 0)
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
target=$(make_ws_name "$cx" 0)
|
|
||||||
fi
|
|
||||||
go_to_ws "$target"
|
|
||||||
;;
|
|
||||||
|
|
||||||
# --- Move window variants ---
|
|
||||||
move-right)
|
|
||||||
nx=$(( cx < X_MAX ? cx + 1 : cx ))
|
|
||||||
target=$(make_ws_name "$nx" 0)
|
|
||||||
move_window_to_ws "$target"
|
|
||||||
;;
|
|
||||||
move-left)
|
|
||||||
nx=$(( cx > X_MIN ? cx - 1 : cx ))
|
|
||||||
target=$(make_ws_name "$nx" 0)
|
|
||||||
move_window_to_ws "$target"
|
|
||||||
;;
|
|
||||||
move-up)
|
|
||||||
ny=$(( cy < Y_MAX ? cy + 1 : cy ))
|
|
||||||
target=$(make_ws_name "$cx" "$ny")
|
|
||||||
move_window_to_ws "$target"
|
|
||||||
;;
|
|
||||||
move-down)
|
|
||||||
if [[ "$cy" -gt 0 ]]; then
|
|
||||||
ny=$(( cy - 1 ))
|
|
||||||
target=$(make_ws_name "$cx" "$ny")
|
|
||||||
if [[ "$ny" -gt 0 ]] && ! ws_exists "$target"; then
|
|
||||||
target=$(make_ws_name "$cx" 0)
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
target=$(make_ws_name "$cx" 0)
|
|
||||||
fi
|
|
||||||
move_window_to_ws "$target"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Usage: $0 [left|right|up|down|move-left|move-right|move-up|move-down]" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@@ -14,7 +14,6 @@ DEPS=(
|
|||||||
wofi
|
wofi
|
||||||
thunar
|
thunar
|
||||||
fastfetch
|
fastfetch
|
||||||
waybar
|
|
||||||
jq
|
jq
|
||||||
python-gobject # arch
|
python-gobject # arch
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -59,10 +59,10 @@ env = HYPRCURSOR_SIZE,24
|
|||||||
|
|
||||||
# https://wiki.hypr.land/Configuring/Variables/#general
|
# https://wiki.hypr.land/Configuring/Variables/#general
|
||||||
general {
|
general {
|
||||||
gaps_in = 5
|
gaps_in = 0
|
||||||
gaps_out = 10
|
gaps_out = 0
|
||||||
|
|
||||||
border_size = 2
|
border_size = 0
|
||||||
|
|
||||||
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
|
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
|
||||||
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
|
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
|
||||||
@@ -79,8 +79,8 @@ general {
|
|||||||
|
|
||||||
# https://wiki.hypr.land/Configuring/Variables/#decoration
|
# https://wiki.hypr.land/Configuring/Variables/#decoration
|
||||||
decoration {
|
decoration {
|
||||||
rounding = 4
|
rounding = 0
|
||||||
rounding_power = 2
|
rounding_power = 0
|
||||||
|
|
||||||
# Change transparency of focused and unfocused windows
|
# Change transparency of focused and unfocused windows
|
||||||
active_opacity = 1.0
|
active_opacity = 1.0
|
||||||
@@ -88,7 +88,7 @@ decoration {
|
|||||||
|
|
||||||
shadow {
|
shadow {
|
||||||
enabled = true
|
enabled = true
|
||||||
range = 4
|
range = 0
|
||||||
render_power = 3
|
render_power = 3
|
||||||
color = rgba(1a1a1aee)
|
color = rgba(1a1a1aee)
|
||||||
}
|
}
|
||||||
@@ -96,7 +96,7 @@ decoration {
|
|||||||
# https://wiki.hypr.land/Configuring/Variables/#blur
|
# https://wiki.hypr.land/Configuring/Variables/#blur
|
||||||
blur {
|
blur {
|
||||||
enabled = true
|
enabled = true
|
||||||
size = 3
|
size = 0
|
||||||
passes = 1
|
passes = 1
|
||||||
|
|
||||||
vibrancy = 0.1696
|
vibrancy = 0.1696
|
||||||
@@ -160,8 +160,9 @@ misc {
|
|||||||
# https://wiki.hypr.land/Configuring/Variables/#input
|
# https://wiki.hypr.land/Configuring/Variables/#input
|
||||||
input {
|
input {
|
||||||
kb_layout = us,dk
|
kb_layout = us,dk
|
||||||
|
kb_variant = ,
|
||||||
|
kb_options = grp:alt_shift_toggle
|
||||||
}
|
}
|
||||||
|
|
||||||
# See https://wiki.hypr.land/Configuring/Gestures
|
# See https://wiki.hypr.land/Configuring/Gestures
|
||||||
gesture = 3, horizontal, workspace
|
gesture = 3, horizontal, workspace
|
||||||
|
|
||||||
@@ -186,7 +187,9 @@ bind = $mainMod, W, killactive,
|
|||||||
bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
|
bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
|
||||||
bind = $mainMod, R, exec, sh -c '~/.config/hypr/reload.sh'
|
bind = $mainMod, R, exec, sh -c '~/.config/hypr/reload.sh'
|
||||||
bind = $mainMod, V, togglefloating,
|
bind = $mainMod, V, togglefloating,
|
||||||
bind = $mainMod, space, exec, $menu
|
#bind = $mainMod, space, exec, $menu
|
||||||
|
bind = SUPER, SPACE, exec, $menu
|
||||||
|
bind = $mainMod, F, exec, $fileManager
|
||||||
bind = $mainMod, P, pseudo, # dwindle
|
bind = $mainMod, P, pseudo, # dwindle
|
||||||
bind = $mainMod, J, togglesplit, # dwindle
|
bind = $mainMod, J, togglesplit, # dwindle
|
||||||
|
|
||||||
@@ -227,19 +230,6 @@ bind = SUPER SHIFT, left, movetoworkspacesilent, e-1
|
|||||||
bind = SUPER ALT, right, movefocus, r
|
bind = SUPER ALT, right, movefocus, r
|
||||||
bind = SUPER ALT, left, movefocus, l
|
bind = SUPER ALT, left, movefocus, l
|
||||||
|
|
||||||
# Navigate workspaces (2D)
|
|
||||||
#bind = SUPER, right, exec, ~/.config/hypr/2d-nav.sh right && pkill -SIGRTMIN+8 waybar
|
|
||||||
#bind = SUPER, left, exec, ~/.config/hypr/2d-nav.sh left && pkill -SIGRTMIN+8 waybar
|
|
||||||
#bind = SUPER, up, exec, ~/.config/hypr/2d-nav.sh up && pkill -SIGRTMIN+8 waybar
|
|
||||||
#bind = SUPER, down, exec, ~/.config/hypr/2d-nav.sh down && pkill -SIGRTMIN+8 waybar
|
|
||||||
|
|
||||||
# Move window to workspace (2D)
|
|
||||||
#bind = SUPER SHIFT, right, exec, ~/.config/hypr/2d-nav.sh move-right && pkill -SIGRTMIN+8 waybar
|
|
||||||
#bind = SUPER SHIFT, left, exec, ~/.config/hypr/2d-nav.sh move-left && pkill -SIGRTMIN+8 waybar
|
|
||||||
#bind = SUPER SHIFT, up, exec, ~/.config/hypr/2d-nav.sh move-up && pkill -SIGRTMIN+8 waybar
|
|
||||||
#bind = SUPER SHIFT, down, exec, ~/.config/hypr/2d-nav.sh move-down && pkill -SIGRTMIN+8 waybar
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Example special workspace (scratchpad)
|
# Example special workspace (scratchpad)
|
||||||
bind = $mainMod, S, exec, grim -g "$(slurp)" - | wl-copy
|
bind = $mainMod, S, exec, grim -g "$(slurp)" - | wl-copy
|
||||||
@@ -316,21 +306,21 @@ windowrule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# env stuff
|
# env stuff
|
||||||
#exec-once = waybar --style ~/.config/waybar/style.css
|
exec-once = quickshell
|
||||||
exec-once = bash ~/.config/eww/scripts/launch.sh
|
|
||||||
exec-once = hyprpaper
|
exec-once = hyprpaper
|
||||||
exec-once = ~/.config/hypr/theme-cycle.sh
|
exec-once = ~/.config/hypr/theme-cycle.sh
|
||||||
|
|
||||||
#rules
|
#rules
|
||||||
|
windowrulev = nodecorate, class:.*
|
||||||
windowrule {
|
windowrule {
|
||||||
name = firefox-to-ws2
|
name = firefox-to-ws1
|
||||||
match:class = ^(firefox)$
|
match:class = ^(firefox)$
|
||||||
workspace = 1 silent
|
workspace = 1 silent
|
||||||
}
|
}
|
||||||
|
|
||||||
windowrule {
|
windowrule {
|
||||||
name = code-to-ws2
|
name = code-to-ws2
|
||||||
match:class = ^(code)$
|
match:class = ^(code-oss)$
|
||||||
workspace = 2 silent
|
workspace = 2 silent
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,9 +331,9 @@ windowrule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
windowrule {
|
windowrule {
|
||||||
name = vesktop-to-ws4
|
name = vesktop-to-ws9
|
||||||
match:class = ^(vesktop)$
|
match:class = ^(vesktop)$
|
||||||
workspace = 4 silent
|
workspace = 9 silent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -353,11 +343,6 @@ windowrule {
|
|||||||
workspace = 5 silent
|
workspace = 5 silent
|
||||||
}
|
}
|
||||||
|
|
||||||
windowrule {
|
|
||||||
name = firefox-to-ws10
|
|
||||||
match:class = ^(firefox)$
|
|
||||||
workspace = 10 silent
|
|
||||||
}
|
|
||||||
|
|
||||||
windowrule {
|
windowrule {
|
||||||
name = eww-volume-float
|
name = eww-volume-float
|
||||||
@@ -365,11 +350,19 @@ windowrule {
|
|||||||
float = yes
|
float = yes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
windowrule {
|
||||||
|
name = wofi=thing
|
||||||
|
match:class = ^(wofi)$
|
||||||
|
float = yes
|
||||||
|
move = 50% 36
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#launch apps
|
#launch apps
|
||||||
exec-once = [workspace 1 silent] firefox
|
exec-once = firefox
|
||||||
exec-once = [workspace 10 silent] firefox --new-instance
|
|
||||||
exec-once = code
|
exec-once = code
|
||||||
exec-once = vesktop
|
exec-once = xwaylandvideobridge
|
||||||
|
exec-once = vesktop --enable-features=UseOzonePlatform --ozone-platform=wayland
|
||||||
exec-once = steam
|
exec-once = steam
|
||||||
exec-once = spotify
|
exec-once = spotify
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
pgrep -x eww >/dev/null && eww kill; bash ~/.config/eww/scripts/launch.sh
|
pgrep -x quickshell >/dev/null && quickshell kill; quickshell
|
||||||
|
|
||||||
# Restart hyprpaper
|
# Restart hyprpaper
|
||||||
pkill hyprpaper 2>/dev/null
|
pkill hyprpaper 2>/dev/null
|
||||||
|
|||||||
29
quickshell/ClockWidget.qml
Normal file
29
quickshell/ClockWidget.qml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
// Mirrors eww clock-widget: click to toggle time ↔ date
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
property string clockTime: ""
|
||||||
|
property string clockDate: ""
|
||||||
|
|
||||||
|
property bool showDate: false
|
||||||
|
|
||||||
|
implicitWidth: lbl.implicitWidth + 16
|
||||||
|
implicitHeight: 22
|
||||||
|
radius: 4
|
||||||
|
color: "#313244"
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: lbl
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: root.showDate ? root.clockDate : root.clockTime
|
||||||
|
color: "#cdd6f4"
|
||||||
|
font.pixelSize: 12
|
||||||
|
font.family: "monospace"
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: root.showDate = !root.showDate
|
||||||
|
}
|
||||||
|
}
|
||||||
8
quickshell/CpuWidget.qml
Normal file
8
quickshell/CpuWidget.qml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import QtQuick
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
// eww cpu-widget
|
||||||
|
StatPill {
|
||||||
|
property string cpuUsage: ""
|
||||||
|
text: cpuUsage + "%"
|
||||||
|
}
|
||||||
71
quickshell/LogoutMenu.qml
Normal file
71
quickshell/LogoutMenu.qml
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
// Mirrors eww logout-menu
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
property bool open: false
|
||||||
|
|
||||||
|
implicitHeight: 26
|
||||||
|
implicitWidth: lrow.implicitWidth
|
||||||
|
|
||||||
|
Row {
|
||||||
|
id: lrow
|
||||||
|
spacing: 4
|
||||||
|
layoutDirection: Qt.RightToLeft
|
||||||
|
|
||||||
|
// Toggle btn
|
||||||
|
Rectangle {
|
||||||
|
width: 26; height: 26; radius: 13
|
||||||
|
color: root.open ? "#89b4fa" : "#313244"
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: root.open ? "" : ""
|
||||||
|
color: root.open ? "#1e1e2e" : "#cdd6f4"
|
||||||
|
font.pixelSize: 14
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: root.open = !root.open
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Revealed actions
|
||||||
|
Item {
|
||||||
|
id: menuReveal
|
||||||
|
width: root.open ? actionRow.implicitWidth + 8 : 0
|
||||||
|
height: 26
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
|
||||||
|
|
||||||
|
Row {
|
||||||
|
id: actionRow
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
spacing: 4
|
||||||
|
x: 4
|
||||||
|
|
||||||
|
// Lock
|
||||||
|
PowerBtn { icon: ""; onActivated: run(["hyprlock"]) }
|
||||||
|
// Reboot
|
||||||
|
PowerBtn { icon: ""; onActivated: run(["systemctl","reboot"]) }
|
||||||
|
// Power off
|
||||||
|
PowerBtn { icon: ""; onActivated: run(["systemctl","poweroff"]) }
|
||||||
|
// Logout (exit Hyprland)
|
||||||
|
PowerBtn { icon: ""; onActivated: run(["hyprctl","dispatch","exit"]) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function run(cmd) {
|
||||||
|
root.open = false
|
||||||
|
Qt.createQmlObject(
|
||||||
|
'import Quickshell.Io; Process { command: ' +
|
||||||
|
JSON.stringify(cmd) + '; running: true }',
|
||||||
|
root)
|
||||||
|
}
|
||||||
|
}
|
||||||
7
quickshell/MemWidget.qml
Normal file
7
quickshell/MemWidget.qml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
// eww mem-widget
|
||||||
|
StatPill {
|
||||||
|
property string memUsed: ""
|
||||||
|
text: memUsed + "G"
|
||||||
|
}
|
||||||
12
quickshell/NetworkWidget.qml
Normal file
12
quickshell/NetworkWidget.qml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
// eww network-widget
|
||||||
|
StatPill {
|
||||||
|
property string networkInfo: ""
|
||||||
|
|
||||||
|
text: {
|
||||||
|
if (networkInfo === "offline") return "Offline"
|
||||||
|
if (networkInfo.startsWith("wifi:")) return networkInfo
|
||||||
|
return networkInfo
|
||||||
|
}
|
||||||
|
}
|
||||||
28
quickshell/PowerBtn.qml
Normal file
28
quickshell/PowerBtn.qml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
// Reusable icon button for LogoutMenu actions (eww center-btn)
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
property string icon: ""
|
||||||
|
signal activated()
|
||||||
|
|
||||||
|
width: 26; height: 26; radius: 13
|
||||||
|
color: ma.containsMouse ? "#f38ba8" : "#313244"
|
||||||
|
|
||||||
|
Behavior on color { ColorAnimation { duration: 120 } }
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: root.icon
|
||||||
|
color: "#cdd6f4"
|
||||||
|
font.pixelSize: 13
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: ma
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
onClicked: root.activated()
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
13
quickshell/SettingsBtn.qml
Normal file
13
quickshell/SettingsBtn.qml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import QtQuick
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
// Simple settings icon button used on HDMI bar (eww settings-btn)
|
||||||
|
StatPill {
|
||||||
|
text: ""
|
||||||
|
clickable: true
|
||||||
|
onClicked: {
|
||||||
|
Qt.createQmlObject(
|
||||||
|
'import Quickshell.Io; Process { command: ["your-settings-command"]; running: true }',
|
||||||
|
parent)
|
||||||
|
}
|
||||||
|
}
|
||||||
100
quickshell/SettingsMenu.qml
Normal file
100
quickshell/SettingsMenu.qml
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
// Mirrors eww settings-menu (revealer + toggle button)
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
property string volumeInfo: ""
|
||||||
|
property string networkInfo: ""
|
||||||
|
property string themeInfo: ""
|
||||||
|
|
||||||
|
// exposed so LogoutMenu can close us
|
||||||
|
property bool open: false
|
||||||
|
|
||||||
|
implicitHeight: 26
|
||||||
|
implicitWidth: row.implicitWidth
|
||||||
|
|
||||||
|
Row {
|
||||||
|
id: row
|
||||||
|
spacing: 4
|
||||||
|
layoutDirection: Qt.RightToLeft // toggle btn on the right, menu slides left
|
||||||
|
|
||||||
|
// Toggle button (eww center-btn)
|
||||||
|
Rectangle {
|
||||||
|
width: 26; height: 26; radius: 13
|
||||||
|
color: root.open ? "#89b4fa" : "#313244"
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: root.open ? "" : ""
|
||||||
|
color: root.open ? "#1e1e2e" : "#cdd6f4"
|
||||||
|
font.pixelSize: 14
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: root.open = !root.open
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Revealed menu (slides in from right)
|
||||||
|
Item {
|
||||||
|
width: menuRow.implicitWidth + 8
|
||||||
|
height: 26
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
// animate width for slide effect (like :transition slideright)
|
||||||
|
Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
|
||||||
|
// Collapsed when closed
|
||||||
|
states: State {
|
||||||
|
name: "hidden"
|
||||||
|
when: !root.open
|
||||||
|
PropertyChanges { target: menuReveal; width: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: menuReveal
|
||||||
|
width: root.open ? menuRow.implicitWidth + 8 : 0
|
||||||
|
height: 26
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
|
||||||
|
|
||||||
|
Row {
|
||||||
|
id: menuRow
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
spacing: 4
|
||||||
|
x: 4
|
||||||
|
|
||||||
|
ThemeWidget { themeInfo: root.themeInfo }
|
||||||
|
VolumeWidget { volumeInfo: root.volumeInfo }
|
||||||
|
NetworkWidget { networkInfo: root.networkInfo }
|
||||||
|
|
||||||
|
// wdisplays button
|
||||||
|
Rectangle {
|
||||||
|
width: 30; height: 22; radius: 11
|
||||||
|
color: "#313244"
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: ""
|
||||||
|
color: "#cdd6f4"
|
||||||
|
font.pixelSize: 13
|
||||||
|
}
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
root.open = false
|
||||||
|
Qt.createQmlObject(
|
||||||
|
'import Quickshell.Io; Process { command: ["wdisplays"]; running: true }',
|
||||||
|
root)
|
||||||
|
}
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
34
quickshell/StatPill.qml
Normal file
34
quickshell/StatPill.qml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
// Generic stat pill – matches eww stat-pill
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
property string text: ""
|
||||||
|
property bool clickable: false
|
||||||
|
signal clicked()
|
||||||
|
signal rightClicked()
|
||||||
|
|
||||||
|
implicitWidth: lbl.implicitWidth + 16
|
||||||
|
implicitHeight: 22
|
||||||
|
radius: 11 // fully rounded pill
|
||||||
|
color: "#313244"
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: lbl
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: root.text
|
||||||
|
color: "#cdd6f4"
|
||||||
|
font.pixelSize: 12
|
||||||
|
font.family: "monospace"
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||||
|
onClicked: (mouse) => {
|
||||||
|
if (mouse.button === Qt.RightButton) root.rightClicked()
|
||||||
|
else root.clicked()
|
||||||
|
}
|
||||||
|
cursorShape: root.clickable ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
19
quickshell/ThemeWidget.qml
Normal file
19
quickshell/ThemeWidget.qml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import QtQuick
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
// eww theme-widget
|
||||||
|
StatPill {
|
||||||
|
property string themeInfo: ""
|
||||||
|
text: themeInfo
|
||||||
|
clickable: true
|
||||||
|
|
||||||
|
onClicked: launchTheme("next")
|
||||||
|
onRightClicked: launchTheme("auto")
|
||||||
|
|
||||||
|
function launchTheme(mode) {
|
||||||
|
Qt.createQmlObject(
|
||||||
|
'import Quickshell.Io; Process { command: ["bash","' +
|
||||||
|
Qt.resolvedUrl("../hypr/theme-cycle.sh") +
|
||||||
|
'","' + mode + '"]; running: true }', parent)
|
||||||
|
}
|
||||||
|
}
|
||||||
50
quickshell/VolumeWidget.qml
Normal file
50
quickshell/VolumeWidget.qml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
import QtQuick
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
// eww volume-widget
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
property string volumeInfo: ""
|
||||||
|
|
||||||
|
readonly property bool muted: volumeInfo.startsWith("muted")
|
||||||
|
readonly property int level: parseInt(volumeInfo) || 0
|
||||||
|
|
||||||
|
readonly property string icon:
|
||||||
|
muted ? "" :
|
||||||
|
level < 34 ? "" :
|
||||||
|
level < 67 ? "" : ""
|
||||||
|
|
||||||
|
implicitWidth: row.implicitWidth + 16
|
||||||
|
implicitHeight: 22
|
||||||
|
radius: 11
|
||||||
|
color: "#313244"
|
||||||
|
|
||||||
|
Row {
|
||||||
|
id: row
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 4
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: root.icon
|
||||||
|
color: "#cdd6f4"
|
||||||
|
font.pixelSize: 13
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: root.muted ? "Muted" : root.level + "%"
|
||||||
|
color: "#cdd6f4"
|
||||||
|
font.pixelSize: 12
|
||||||
|
font.family: "monospace"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
Qt.createQmlObject(
|
||||||
|
'import Quickshell.Io; Process { command: ["bash","' +
|
||||||
|
Qt.resolvedUrl("scripts/toggle-mixer.sh") +
|
||||||
|
'"]; running: true }', root)
|
||||||
|
}
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
65
quickshell/WorkspacesWidget.qml
Normal file
65
quickshell/WorkspacesWidget.qml
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import Quickshell
|
||||||
|
import Quickshell.Io
|
||||||
|
import Quickshell.Hyprland
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
// Mirrors eww workspaces-widget / workspace-btn
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
property var workspaces: []
|
||||||
|
|
||||||
|
implicitHeight: row.implicitHeight
|
||||||
|
implicitWidth: row.implicitWidth
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: row
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: root.workspaces
|
||||||
|
|
||||||
|
// workspace-btn equivalent
|
||||||
|
Rectangle {
|
||||||
|
id: wsBtn
|
||||||
|
required property var modelData
|
||||||
|
|
||||||
|
readonly property bool active: modelData.active ?? false
|
||||||
|
readonly property bool urgent: modelData.urgent ?? false
|
||||||
|
readonly property bool empty: modelData.empty ?? false
|
||||||
|
|
||||||
|
implicitWidth: Math.max(label.implicitWidth + 16,
|
||||||
|
modelData.pxwidth ?? 28)
|
||||||
|
implicitHeight: 22
|
||||||
|
radius: 4
|
||||||
|
|
||||||
|
color: active ? "#89b4fa" // blue active
|
||||||
|
: urgent ? "#f38ba8" // red urgent
|
||||||
|
: empty ? "transparent" // ghost empty
|
||||||
|
: "#313244" // normal
|
||||||
|
|
||||||
|
border.color: empty && !active ? "#585b70" : "transparent"
|
||||||
|
border.width: empty && !active ? 1 : 0
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: label
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: wsBtn.modelData.label ?? ""
|
||||||
|
color: wsBtn.active ? "#1e1e2e" : "#cdd6f4"
|
||||||
|
font.pixelSize: 12
|
||||||
|
font.family: "monospace"
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
var proc = Qt.createQmlObject(
|
||||||
|
'import Quickshell.Io; Process { command: ["hyprctl","dispatch","workspace","' +
|
||||||
|
wsBtn.modelData.id + '"]; running: true }',
|
||||||
|
wsBtn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
247
quickshell/shell.qml
Normal file
247
quickshell/shell.qml
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
import Quickshell
|
||||||
|
import Quickshell.Io
|
||||||
|
import Quickshell.Wayland
|
||||||
|
import Quickshell.Hyprland
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────
|
||||||
|
// Shell root – spawns one bar per screen
|
||||||
|
// ─────────────────────────────────────────────
|
||||||
|
ShellRoot {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
// ── Global polled data ───────────────────
|
||||||
|
property string clockTime: ""
|
||||||
|
property string clockDate: ""
|
||||||
|
property string cpuUsage: ""
|
||||||
|
property string memUsed: ""
|
||||||
|
property string networkInfo: ""
|
||||||
|
property string volumeInfo: ""
|
||||||
|
property string themeInfo: ""
|
||||||
|
|
||||||
|
// Clock – every second
|
||||||
|
Process {
|
||||||
|
id: clockTimeProc
|
||||||
|
command: ["date", "+%H:%M:%S"]
|
||||||
|
running: true
|
||||||
|
stdout: StdioCollector { onStreamFinished: clockTime = this.text.trim() }
|
||||||
|
}
|
||||||
|
Timer {
|
||||||
|
interval: 1000; running: true; repeat: true
|
||||||
|
onTriggered: clockTimeProc.running = true
|
||||||
|
}
|
||||||
|
|
||||||
|
Process {
|
||||||
|
id: clockDateProc
|
||||||
|
command: ["date", "+%A, %B %d %Y"]
|
||||||
|
running: true
|
||||||
|
stdout: StdioCollector { onStreamFinished: clockDate = this.text.trim() }
|
||||||
|
}
|
||||||
|
Timer {
|
||||||
|
interval: 1000; running: true; repeat: true
|
||||||
|
onTriggered: clockDateProc.running = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// CPU – every 2 s
|
||||||
|
Process {
|
||||||
|
id: cpuProc
|
||||||
|
command: ["bash", "-c", "top -bn1 | grep 'Cpu(s)' | awk '{print int($2+$4)}'"]
|
||||||
|
running: true
|
||||||
|
stdout: StdioCollector { onStreamFinished: cpuUsage = this.text.trim() }
|
||||||
|
}
|
||||||
|
Timer {
|
||||||
|
interval: 2000; running: true; repeat: true
|
||||||
|
onTriggered: cpuProc.running = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Memory – every 2 s
|
||||||
|
Process {
|
||||||
|
id: memProc
|
||||||
|
command: ["bash", "-c", "free -g --si | awk '/Mem:/{printf \"%.1f\", $3}'"]
|
||||||
|
running: true
|
||||||
|
stdout: StdioCollector { onStreamFinished: memUsed = this.text.trim() }
|
||||||
|
}
|
||||||
|
Timer {
|
||||||
|
interval: 2000; running: true; repeat: true
|
||||||
|
onTriggered: memProc.running = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Network – every 5 s
|
||||||
|
Process {
|
||||||
|
id: netProc
|
||||||
|
command: ["bash", Qt.resolvedUrl("scripts/get-network.sh")]
|
||||||
|
running: true
|
||||||
|
stdout: StdioCollector { onStreamFinished: networkInfo = this.text.trim() }
|
||||||
|
}
|
||||||
|
Timer {
|
||||||
|
interval: 5000; running: true; repeat: true
|
||||||
|
onTriggered: netProc.running = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volume – every 1 s
|
||||||
|
Process {
|
||||||
|
id: volProc
|
||||||
|
command: ["bash", Qt.resolvedUrl("scripts/get-volume.sh")]
|
||||||
|
running: true
|
||||||
|
stdout: StdioCollector { onStreamFinished: volumeInfo = this.text.trim() }
|
||||||
|
}
|
||||||
|
Timer {
|
||||||
|
interval: 1000; running: true; repeat: true
|
||||||
|
onTriggered: volProc.running = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Theme – every 2 s
|
||||||
|
Process {
|
||||||
|
id: themeProc
|
||||||
|
command: ["bash", Qt.resolvedUrl("scripts/get-theme.sh")]
|
||||||
|
running: true
|
||||||
|
stdout: StdioCollector { onStreamFinished: themeInfo = this.text.trim() }
|
||||||
|
}
|
||||||
|
Timer {
|
||||||
|
interval: 2000; running: true; repeat: true
|
||||||
|
onTriggered: themeProc.running = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── One bar per screen ───────────────────
|
||||||
|
Variants {
|
||||||
|
model: Quickshell.screens
|
||||||
|
|
||||||
|
|
||||||
|
PanelWindow {
|
||||||
|
id: bar
|
||||||
|
required property var modelData
|
||||||
|
screen: modelData
|
||||||
|
|
||||||
|
color: '#1c1d20'
|
||||||
|
|
||||||
|
anchors { top: true; left: true; right: true }
|
||||||
|
implicitHeight: 30
|
||||||
|
exclusiveZone: implicitHeight // reserve space (replaces :exclusive true)
|
||||||
|
|
||||||
|
|
||||||
|
// Which screen slot is this? (0 = primary → ws 1–5, 1 = secondary → ws 6–10)
|
||||||
|
property int screenIndex: {
|
||||||
|
var screens = Quickshell.screens
|
||||||
|
for (var i = 0; i < screens.length; i++) {
|
||||||
|
if (screens[i] === modelData) return i
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// The 5 workspace IDs that belong to this bar
|
||||||
|
readonly property int wsFirst: screenIndex === 0 ? 1 : 6
|
||||||
|
readonly property int wsLast: screenIndex === 0 ? 5 : 10
|
||||||
|
|
||||||
|
// ── Bar layout (centerbox equivalent) ──
|
||||||
|
RowLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
spacing: 0
|
||||||
|
anchors.leftMargin: 8
|
||||||
|
anchors.rightMargin: 8
|
||||||
|
|
||||||
|
// LEFT – workspaces (native Hyprland model, filtered per screen)
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
Row {
|
||||||
|
anchors { left: parent.left; verticalCenter: parent.verticalCenter }
|
||||||
|
spacing: 4
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
// Always show slots wsFirst..wsLast, even if Hyprland
|
||||||
|
// hasn't created the workspace yet (shows as empty).
|
||||||
|
model: bar.wsLast - bar.wsFirst + 1
|
||||||
|
|
||||||
|
delegate: Rectangle {
|
||||||
|
required property int index
|
||||||
|
readonly property int wsId: bar.wsFirst + index
|
||||||
|
|
||||||
|
// Look up live workspace from Hyprland
|
||||||
|
readonly property HyprlandWorkspace liveWs: {
|
||||||
|
for (var i = 0; i < Hyprland.workspaces.values.length; i++) {
|
||||||
|
if (Hyprland.workspaces.values[i].id === wsId)
|
||||||
|
return Hyprland.workspaces.values[i]
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly property bool active: Hyprland.focusedMonitor !== null
|
||||||
|
&& Hyprland.focusedMonitor.activeWorkspace !== null
|
||||||
|
&& Hyprland.focusedMonitor.activeWorkspace.id === wsId
|
||||||
|
&& Hyprland.focusedMonitor.name === bar.modelData.name
|
||||||
|
|
||||||
|
readonly property bool occupied: liveWs !== null
|
||||||
|
&& liveWs.windowCount > 0
|
||||||
|
|
||||||
|
implicitWidth: 22
|
||||||
|
implicitHeight: 22
|
||||||
|
radius: 4
|
||||||
|
|
||||||
|
color: active ? "#89b4fa" // focused
|
||||||
|
: occupied ? "#313244" // has windows
|
||||||
|
: "transparent" // empty
|
||||||
|
|
||||||
|
border.color: active ? "transparent" : "#585b70"
|
||||||
|
border.width: active ? 0 : 1
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: wsId
|
||||||
|
color: active ? "#1e1e2e" : "#cdd6f4"
|
||||||
|
font.pixelSize: 11
|
||||||
|
font.family: "monospace"
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
onClicked: Hyprland.dispatch("workspace " + wsId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CENTER – clock
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
ClockWidget {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
clockTime: root.clockTime
|
||||||
|
clockDate: root.clockDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RIGHT – stats + menus
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
anchors { right: parent.right; verticalCenter: parent.verticalCenter }
|
||||||
|
spacing: 2
|
||||||
|
|
||||||
|
// Primary screen (0) gets full menus; secondary gets stats only
|
||||||
|
SettingsMenu {
|
||||||
|
visible: bar.screenIndex === 0
|
||||||
|
volumeInfo: root.volumeInfo
|
||||||
|
networkInfo: root.networkInfo
|
||||||
|
themeInfo: root.themeInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
LogoutMenu {
|
||||||
|
visible: bar.screenIndex === 0
|
||||||
|
}
|
||||||
|
|
||||||
|
CpuWidget { cpuUsage: root.cpuUsage }
|
||||||
|
MemWidget { memUsed: root.memUsed }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"layer": "top",
|
|
||||||
"output": "DP-2",
|
|
||||||
"position": "top",
|
|
||||||
"height": 24,
|
|
||||||
"spacing": 4,
|
|
||||||
"margin-top": 8,
|
|
||||||
"margin-left": 10,
|
|
||||||
"margin-right": 10,
|
|
||||||
"modules-left": ["hyprland/workspaces", "hyprland/window"],
|
|
||||||
"modules-center": ["custom/logout","clock", "custom/settings"],
|
|
||||||
"modules-right": ["custom/theme", "pulseaudio", "network", "cpu", "memory", "battery", "tray"],
|
|
||||||
"hyprland/workspaces": {
|
|
||||||
"format": "{icon}",
|
|
||||||
"on-click": "activate",
|
|
||||||
"all-outputs": false,
|
|
||||||
"active-only": false,
|
|
||||||
"persistent-workspaces": {
|
|
||||||
"DP-2": [1, 2, 3, 4, 5]
|
|
||||||
},
|
|
||||||
"format-icons": {
|
|
||||||
"1": "1", "2": "2", "3": "3", "4": "4", "5": "5",
|
|
||||||
"urgent": "", "default": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hyprland/window": { "format": " {}", "max-length": 20, "separate-outputs": true },
|
|
||||||
"clock": {
|
|
||||||
"interval": 1,
|
|
||||||
"format": "{:%H:%M:%S}",
|
|
||||||
"format-alt": "{:%H:%M, %A, %B %d %Y}",
|
|
||||||
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
|
|
||||||
},
|
|
||||||
"cpu": { "format": "{usage}%", "tooltip": true, "interval": 2 },
|
|
||||||
"memory": { "format": "{used:0.1f}G", "interval": 2 },
|
|
||||||
"battery": {
|
|
||||||
"states": { "warning": 30, "critical": 15 },
|
|
||||||
"format": "{icon} {capacity}%",
|
|
||||||
"format-charging": "{capacity}%",
|
|
||||||
"format-plugged": "{capacity}%",
|
|
||||||
"format-icons": ["", "", "", "", ""]
|
|
||||||
},
|
|
||||||
"network": {
|
|
||||||
"format-wifi": "{signalStrength}%",
|
|
||||||
"format-ethernet": "{ipaddr}",
|
|
||||||
"format-disconnected": " Offline",
|
|
||||||
"tooltip-format": "{essid} — {ipaddr}\n{bandwidthUpBits} up {bandwidthDownBits} down",
|
|
||||||
"interval": 5
|
|
||||||
},
|
|
||||||
"pulseaudio": {
|
|
||||||
"format": "{icon} {volume}%",
|
|
||||||
"format-muted": " Muted",
|
|
||||||
"format-icons": { "headphone": "", "default": ["", "", ""] },
|
|
||||||
"on-click": "~/.config/eww/scripts/toggle-mixer.sh"
|
|
||||||
},
|
|
||||||
"custom/settings": {
|
|
||||||
"format": "",
|
|
||||||
"on-click": "your-settings-command"
|
|
||||||
},
|
|
||||||
"custom/logout": {
|
|
||||||
"format": "",
|
|
||||||
"on-click": "your-logout-command"
|
|
||||||
},
|
|
||||||
|
|
||||||
"custom/theme": {
|
|
||||||
"exec": "$HOME/.config/hypr/theme-cycle.sh status",
|
|
||||||
"exec-on-event": true,
|
|
||||||
"return-type": "json",
|
|
||||||
"interval": 2,
|
|
||||||
"on-click": "$HOME/.config/hypr/theme-cycle.sh next",
|
|
||||||
"on-click-right": "$HOME/.config/hypr/theme-cycle.sh auto",
|
|
||||||
"on-scroll-up": "$HOME/.config/hypr/theme-cycle.sh day",
|
|
||||||
"on-scroll-down": "$HOME/.config/hypr/wallthemepaper-cycle.sh night"
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"tray": { "spacing": 8, "icon-size": 16 },
|
|
||||||
|
|
||||||
"custom/2d-workspaces": {
|
|
||||||
"exec": "~/.config/hypr/2d-workspaces.sh",
|
|
||||||
"return-type": "json",
|
|
||||||
"interval": "once",
|
|
||||||
"restart-interval": 1,
|
|
||||||
"signal": 8
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"layer": "top",
|
|
||||||
"output": "HDMI-A-1",
|
|
||||||
"position": "top",
|
|
||||||
"height": 24,
|
|
||||||
"spacing": 4,
|
|
||||||
"margin-top": 8,
|
|
||||||
"margin-left": 10,
|
|
||||||
"margin-right": 10,
|
|
||||||
"modules-left": ["hyprland/workspaces", "hyprland/window"],
|
|
||||||
"modules-center": ["custom/logout","clock", "custom/settings"],
|
|
||||||
"modules-right": ["custom/theme", "pulseaudio", "network", "cpu", "memory", "battery", "tray"],
|
|
||||||
"hyprland/workspaces": {
|
|
||||||
"format": "{icon}",
|
|
||||||
"on-click": "activate",
|
|
||||||
"all-outputs": false,
|
|
||||||
"active-only": false,
|
|
||||||
"persistent-workspaces": {
|
|
||||||
"HDMI-A-1": [6, 7, 8, 9, 10]
|
|
||||||
},
|
|
||||||
"format-icons": {
|
|
||||||
"6": "6", "7": "7", "8": "8", "9": "9", "10": "10",
|
|
||||||
"urgent": "", "default": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hyprland/window": { "format": " {}", "max-length": 50, "separate-outputs": true },
|
|
||||||
"clock": {
|
|
||||||
"interval": 1,
|
|
||||||
"format": "{:%H:%M:%S}",
|
|
||||||
"format-alt": "{:%H:%M, %A, %B %d %Y}",
|
|
||||||
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
|
|
||||||
},
|
|
||||||
"cpu": { "format": "{usage}%", "tooltip": true, "interval": 2 },
|
|
||||||
"memory": { "format": "{used:0.1f}G", "interval": 2 },
|
|
||||||
"battery": {
|
|
||||||
"states": { "warning": 30, "critical": 15 },
|
|
||||||
"format": "{icon} {capacity}%",
|
|
||||||
"format-charging": "{capacity}%",
|
|
||||||
"format-plugged": "{capacity}%",
|
|
||||||
"format-icons": ["", "", "", "", ""]
|
|
||||||
},
|
|
||||||
"network": {
|
|
||||||
"format-wifi": "{signalStrength}%",
|
|
||||||
"format-ethernet": " {ipaddr}",
|
|
||||||
"format-disconnected": " Offline",
|
|
||||||
"tooltip-format": "{essid} — {ipaddr}\n{bandwidthUpBits} up {bandwidthDownBits} down",
|
|
||||||
"interval": 5
|
|
||||||
},
|
|
||||||
"pulseaudio": {
|
|
||||||
"format": "{icon} {volume}%",
|
|
||||||
"format-muted": " Muted",
|
|
||||||
"format-icons": { "headphone": "", "default": ["", "", ""] },
|
|
||||||
"on-click": "pavucontrol"
|
|
||||||
},
|
|
||||||
|
|
||||||
"custom/settings": {
|
|
||||||
"format": "",
|
|
||||||
"on-click": "your-settings-command"
|
|
||||||
},
|
|
||||||
"custom/logout": {
|
|
||||||
"format": "",
|
|
||||||
"on-click": "your-logout-command"
|
|
||||||
},
|
|
||||||
|
|
||||||
"custom/theme": {
|
|
||||||
"exec": "$HOME/.config/hypr/theme-cycle.sh status",
|
|
||||||
"exec-on-event": true,
|
|
||||||
"return-type": "json",
|
|
||||||
"interval": 2,
|
|
||||||
"on-click": "$HOME/.config/hypr/theme-cycle.sh next",
|
|
||||||
"on-click-right": "$HOME/.config/hypr/theme-cycle.sh auto",
|
|
||||||
"on-scroll-up": "$HOME/.config/hypr/theme-cycle.sh day",
|
|
||||||
"on-scroll-down": "$HOME/.config/hypr/wallthemepaper-cycle.sh night"
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"tray": { "spacing": 8, "icon-size": 16 },
|
|
||||||
|
|
||||||
"custom/2d-workspaces": {
|
|
||||||
"exec": "~/.config/hypr/2d-workspaces.sh",
|
|
||||||
"return-type": "json",
|
|
||||||
"interval": "once",
|
|
||||||
"restart-interval": 1,
|
|
||||||
"signal": 8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/home/sam42/.config/waybar/themes/night.css
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# ~/.config/waybar/switch-theme.sh
|
|
||||||
|
|
||||||
THEME_DIR="$HOME/.config/waybar/themes"
|
|
||||||
STYLE="$HOME/.config/waybar/style.css"
|
|
||||||
THEME="$1" # e.g. dark, light, catppuccin
|
|
||||||
|
|
||||||
if [ -z "$THEME" ]; then
|
|
||||||
echo "Usage: switch-theme.sh <theme-name>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "$THEME_DIR/$THEME.css" ]; then
|
|
||||||
echo "Theme '$THEME' not found in $THEME_DIR"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
ln -sf "$THEME_DIR/$THEME.css" "$STYLE"
|
|
||||||
pkill -SIGUSR2 waybar
|
|
||||||
echo "Switched to $THEME"
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
/* ── Global ─────────────────────────────────────────── */
|
|
||||||
/*
|
|
||||||
Theme: Arch Bliss
|
|
||||||
Inspired by the rolling green hills and blue sky of the wallpaper.
|
|
||||||
Palette:
|
|
||||||
Sky deep: #2a6db5 (upper sky blue)
|
|
||||||
Sky mid: #5b9fd6 (horizon blue)
|
|
||||||
Sky light: #a8cef0 (pale sky)
|
|
||||||
Grass dark: #3a6b0e (shadow grass)
|
|
||||||
Grass mid: #5a9416 (mid grass)
|
|
||||||
Grass light: #7dbe1e (bright grass highlight)
|
|
||||||
Hill muted: #4a7a12 (rolling hills mid)
|
|
||||||
White: #f0f4f8 (Arch logo white)
|
|
||||||
Muted: #8bafc8 (distant hill / muted text)
|
|
||||||
Urgent: #c0392b (red for warnings)
|
|
||||||
*/
|
|
||||||
|
|
||||||
* {
|
|
||||||
font-family: "JetBrainsMono Nerd Font", "Noto Sans", monospace;
|
|
||||||
font-size: 13px;
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar {
|
|
||||||
background: rgba(255, 255, 255, 0);
|
|
||||||
color: #f0f4f8;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Workspaces ─────────────────────────────────────── */
|
|
||||||
#workspaces {
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 2px 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button {
|
|
||||||
padding: 2px 8px;
|
|
||||||
color: #ffffff;
|
|
||||||
background: transparent;
|
|
||||||
border-radius: 6px;
|
|
||||||
font-size: 15px;
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button:hover {
|
|
||||||
background: rgba(168, 206, 240, 0.18);
|
|
||||||
color: #f0f4f8;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.active {
|
|
||||||
background: rgba(90, 148, 22, 0.85);
|
|
||||||
color: #f0f4f8;
|
|
||||||
box-shadow: 0 0 6px rgba(125, 190, 30, 0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.urgent {
|
|
||||||
color: #c0392b;
|
|
||||||
background: rgba(192, 57, 43, 0.18);
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.empty {
|
|
||||||
color: #5b7a99;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Window title ───────────────────────────────────── */
|
|
||||||
#window {
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
color: #ffffff;
|
|
||||||
padding: 0 10px;
|
|
||||||
font-style: italic;
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Clock ──────────────────────────────────────────── */
|
|
||||||
#clock {
|
|
||||||
color: #ffffff;
|
|
||||||
padding: 1px 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Right modules shared style ─────────────────────── */
|
|
||||||
#cpu,
|
|
||||||
#memory,
|
|
||||||
#network,
|
|
||||||
#pulseaudio {
|
|
||||||
padding: 2px 10px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── CPU ────────────────────────────────────────────── */
|
|
||||||
#cpu { color: #bfff5e; } /* bright grass green */
|
|
||||||
#cpu.warning { color: #ffe943; } /* warm amber */
|
|
||||||
#cpu.critical { color: #ff6250; } /* red */
|
|
||||||
|
|
||||||
/* ── Memory ─────────────────────────────────────────── */
|
|
||||||
#memory { color: #7dc2ff; } /* sky mid-blue */
|
|
||||||
|
|
||||||
|
|
||||||
/* ── Tray ───────────────────────────────────────────── */
|
|
||||||
#tray {
|
|
||||||
padding: 2px 8px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tray > .passive { -gtk-icon-effect: dim; }
|
|
||||||
#tray > .needs-attention {
|
|
||||||
-gtk-icon-effect: highlight;
|
|
||||||
background-color: rgba(192, 57, 43, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Custom 2D Workspaces ───────────────────────────── */
|
|
||||||
#custom-2d-workspaces {
|
|
||||||
font-size: 13px;
|
|
||||||
font-weight: bold;
|
|
||||||
padding: 0 12px;
|
|
||||||
border-radius: 6px;
|
|
||||||
transition: all 0.15s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Base row — sky blue */
|
|
||||||
#custom-2d-workspaces.base {
|
|
||||||
color: #a8cef0;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sub-workspace — grass green tint */
|
|
||||||
#custom-2d-workspaces.sub {
|
|
||||||
color: #7dbe1e;
|
|
||||||
background: rgba(255, 255, 255, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-theme, #custom-settings, #custom-logout {
|
|
||||||
color: #ffffff;
|
|
||||||
padding: 1px 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-theme.day {
|
|
||||||
color: #f9e2af;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-theme.night {
|
|
||||||
color: #89b4fa;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-theme.auto {
|
|
||||||
color: #a6e3a1;
|
|
||||||
}
|
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
* {
|
|
||||||
font-family: "JetBrainsMono Nerd Font", "Noto Sans", monospace;
|
|
||||||
font-size: 13px;
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar {
|
|
||||||
background: rgba(255, 255, 255, 0);
|
|
||||||
color: #f0f4f8;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Workspaces ─────────────────────────────────────── */
|
|
||||||
#workspaces {
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 2px 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button {
|
|
||||||
padding: 2px 8px;
|
|
||||||
color: #ffffff;
|
|
||||||
background: transparent;
|
|
||||||
border-radius: 6px;
|
|
||||||
font-size: 15px;
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button:hover {
|
|
||||||
background: rgba(168, 206, 240, 0.18);
|
|
||||||
color: #f0f4f8;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.active {
|
|
||||||
background: rgb(167, 124, 215);
|
|
||||||
color: #000000;
|
|
||||||
box-shadow: 0 0 6px rgba(62, 15, 65, 0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.urgent {
|
|
||||||
color: #c0392b;
|
|
||||||
background: rgba(192, 57, 43, 0.18);
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.empty {
|
|
||||||
color: #5b7a99;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Window title ───────────────────────────────────── */
|
|
||||||
#window {
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
color: #ffffff;
|
|
||||||
padding: 0 10px;
|
|
||||||
font-style: italic;
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Clock ──────────────────────────────────────────── */
|
|
||||||
#clock {
|
|
||||||
color: #ffffff;
|
|
||||||
padding: 1px 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-wallpaper-mode{
|
|
||||||
color: #ffffff;
|
|
||||||
padding: 1px 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Right modules shared style ─────────────────────── */
|
|
||||||
#cpu,
|
|
||||||
#memory,
|
|
||||||
#network,
|
|
||||||
#pulseaudio {
|
|
||||||
padding: 2px 10px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── CPU ────────────────────────────────────────────── */
|
|
||||||
#cpu { color: #9ed649; } /* bright grass green */
|
|
||||||
#cpu.warning { color: #e5b25b; } /* warm amber */
|
|
||||||
#cpu.critical { color: #e04534; } /* red */
|
|
||||||
|
|
||||||
/* ── Memory ─────────────────────────────────────────── */
|
|
||||||
#memory { color: #7db9ec; } /* sky mid-blue */
|
|
||||||
|
|
||||||
|
|
||||||
/* ── Tray ───────────────────────────────────────────── */
|
|
||||||
#tray {
|
|
||||||
padding: 2px 8px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tray > .passive { -gtk-icon-effect: dim; }
|
|
||||||
#tray > .needs-attention {
|
|
||||||
-gtk-icon-effect: highlight;
|
|
||||||
background-color: rgba(192, 57, 43, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Custom 2D Workspaces ───────────────────────────── */
|
|
||||||
#custom-2d-workspaces {
|
|
||||||
font-size: 13px;
|
|
||||||
font-weight: bold;
|
|
||||||
padding: 0 12px;
|
|
||||||
border-radius: 6px;
|
|
||||||
transition: all 0.15s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Base row — sky blue */
|
|
||||||
#custom-2d-workspaces.base {
|
|
||||||
color: #a8cef0;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sub-workspace — grass green tint */
|
|
||||||
#custom-2d-workspaces.sub {
|
|
||||||
color: #7dbe1e;
|
|
||||||
background: rgba(255, 255, 255, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-theme, #custom-settings, #custom-logout {
|
|
||||||
color: #ffffff;
|
|
||||||
padding: 1px 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(0, 0, 0, 0.35);
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-theme.day {
|
|
||||||
color: #f9e2af;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-theme.night {
|
|
||||||
color: #89b4fa;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-theme.auto {
|
|
||||||
color: #a6e3a1;
|
|
||||||
}
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
/* ── Global ─────────────────────────────────────────── */
|
|
||||||
* {
|
|
||||||
font-family: "JetBrainsMono Nerd Font", "Noto Sans", monospace;
|
|
||||||
font-size: 13px;
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar {
|
|
||||||
background: rgba(17, 17, 27, 0);
|
|
||||||
color: #cdd6f4;
|
|
||||||
/*border-bottom: 2px solid rgba(137, 180, 250, 0.25);*/
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Workspaces ─────────────────────────────────────── */
|
|
||||||
#workspaces {
|
|
||||||
background: rgba(30, 30, 46, 0.85);
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 2px 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button {
|
|
||||||
padding: 2px 8px;
|
|
||||||
color: #6c7086;
|
|
||||||
background: transparent;
|
|
||||||
border-radius: 6px;
|
|
||||||
font-size: 15px;
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button:hover {
|
|
||||||
background: rgba(137, 180, 250, 0.15);
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.active {
|
|
||||||
background: rgb(167, 124, 215);
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.urgent {
|
|
||||||
color: #f38ba8;
|
|
||||||
background: rgba(243, 139, 168, 0.15);
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.empty {
|
|
||||||
color: #6c7086;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Window title ───────────────────────────────────── */
|
|
||||||
#window {
|
|
||||||
color: #ffffff;
|
|
||||||
padding: 0 10px;
|
|
||||||
font-style: italic;
|
|
||||||
border: 2px solid rgba(30, 30, 46, 0.85);
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Clock ──────────────────────────────────────────── */
|
|
||||||
#clock {
|
|
||||||
color: #cba6f7;
|
|
||||||
padding: 1px 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(30, 30, 46, 0.85);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Right modules shared style ─────────────────────── */
|
|
||||||
#cpu,
|
|
||||||
#memory,
|
|
||||||
#battery,
|
|
||||||
#network,
|
|
||||||
#pulseaudio {
|
|
||||||
padding: 2px 10px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(30, 30, 46, 0.85);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── CPU ────────────────────────────────────────────── */
|
|
||||||
#cpu { color: #a6e3a1; }
|
|
||||||
#cpu.warning { color: #fab387; }
|
|
||||||
#cpu.critical { color: #f38ba8; }
|
|
||||||
|
|
||||||
/* ── Memory ─────────────────────────────────────────── */
|
|
||||||
#memory { color: #89dceb; }
|
|
||||||
|
|
||||||
/* ── Battery ────────────────────────────────────────── */
|
|
||||||
#battery { color: #a6e3a1; }
|
|
||||||
#battery.warning { color: #fab387; }
|
|
||||||
#battery.critical { color: #f38ba8; animation: blink 1s linear infinite; }
|
|
||||||
#battery.charging { color: #a6e3a1; }
|
|
||||||
|
|
||||||
@keyframes blink {
|
|
||||||
to { color: transparent; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Network ────────────────────────────────────────── */
|
|
||||||
#network { color: #89b4fa; }
|
|
||||||
#network.disconnected { color: #6c7086; }
|
|
||||||
|
|
||||||
/* ── Audio ──────────────────────────────────────────── */
|
|
||||||
#pulseaudio { color: #f5c2e7; }
|
|
||||||
#pulseaudio.muted { color: #6c7086; }
|
|
||||||
|
|
||||||
/* ── Tray ───────────────────────────────────────────── */
|
|
||||||
#tray {
|
|
||||||
padding: 2px 8px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: rgba(30, 30, 46, 0.85);
|
|
||||||
}
|
|
||||||
|
|
||||||
#tray > .passive { -gtk-icon-effect: dim; }
|
|
||||||
#tray > .needs-attention {
|
|
||||||
-gtk-icon-effect: highlight;
|
|
||||||
background-color: rgba(243, 139, 168, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* --- waybar style.css --- */
|
|
||||||
|
|
||||||
#custom-2d-workspaces {
|
|
||||||
font-size: 13px;
|
|
||||||
font-weight: bold;
|
|
||||||
padding: 0 12px;
|
|
||||||
border-radius: 6px;
|
|
||||||
transition: all 0.15s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Base row — normal blue */
|
|
||||||
#custom-2d-workspaces.base {
|
|
||||||
color: #89b4fa;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sub-workspace — green tint so you know you're "deeper" */
|
|
||||||
#custom-2d-workspaces.sub {
|
|
||||||
color: #a6e3a1;
|
|
||||||
background: rgba(166, 227, 161, 0.12);
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
window {
|
|
||||||
margin: 0px;
|
|
||||||
border: 1px solid #bd93f9;
|
|
||||||
background-color: #282a36;
|
|
||||||
}
|
|
||||||
|
|
||||||
#input {
|
|
||||||
margin: 5px;
|
|
||||||
border: none;
|
|
||||||
color: #f8f8f2;
|
|
||||||
background-color: #44475a;
|
|
||||||
}
|
|
||||||
|
|
||||||
#inner-box {
|
|
||||||
margin: 5px;
|
|
||||||
border: none;
|
|
||||||
background-color: #282a36;
|
|
||||||
}
|
|
||||||
|
|
||||||
#outer-box {
|
|
||||||
margin: 5px;
|
|
||||||
border: none;
|
|
||||||
background-color: #282a36;
|
|
||||||
}
|
|
||||||
|
|
||||||
#scroll {
|
|
||||||
margin: 0px;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#text {
|
|
||||||
margin: 5px;
|
|
||||||
border: none;
|
|
||||||
color: #f8f8f2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#entry.activatable #text {
|
|
||||||
color: #282a36;
|
|
||||||
}
|
|
||||||
|
|
||||||
#entry > * {
|
|
||||||
color: #f8f8f2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#entry:selected {
|
|
||||||
background-color: #44475a;
|
|
||||||
}
|
|
||||||
|
|
||||||
#entry:selected #text {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user