diff --git a/eww/eww.scss b/eww/eww.scss deleted file mode 100644 index 7dad207..0000000 --- a/eww/eww.scss +++ /dev/null @@ -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); -} \ No newline at end of file diff --git a/eww/eww.yuck b/eww/eww.yuck deleted file mode 100644 index fa7acf3..0000000 --- a/eww/eww.yuck +++ /dev/null @@ -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" ? "󰅖" : "󰒓"})) - - )) \ No newline at end of file diff --git a/eww/scripts/get-active-window.sh b/eww/scripts/get-active-window.sh deleted file mode 100755 index 8c4be3b..0000000 --- a/eww/scripts/get-active-window.sh +++ /dev/null @@ -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 \ No newline at end of file diff --git a/eww/scripts/get-network.sh b/eww/scripts/get-network.sh deleted file mode 100644 index 379fe2b..0000000 --- a/eww/scripts/get-network.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -# Outputs one of: -# offline -# wifi:% -# eth: - -# 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" diff --git a/eww/scripts/get-sinks.sh b/eww/scripts/get-sinks.sh deleted file mode 100755 index 933bcbc..0000000 --- a/eww/scripts/get-sinks.sh +++ /dev/null @@ -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 '.' \ No newline at end of file diff --git a/eww/scripts/get-theme.sh b/eww/scripts/get-theme.sh deleted file mode 100644 index ce49370..0000000 --- a/eww/scripts/get-theme.sh +++ /dev/null @@ -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 diff --git a/eww/scripts/get-volume.sh b/eww/scripts/get-volume.sh deleted file mode 100644 index ee6c9bc..0000000 --- a/eww/scripts/get-volume.sh +++ /dev/null @@ -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}" diff --git a/eww/scripts/get-workspace-icons.sh b/eww/scripts/get-workspace-icons.sh deleted file mode 100644 index 375b79c..0000000 --- a/eww/scripts/get-workspace-icons.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash -# get-workspace-icons.sh - -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 \ No newline at end of file diff --git a/eww/scripts/get-workspaces.py b/eww/scripts/get-workspaces.py deleted file mode 100644 index 8d926f9..0000000 --- a/eww/scripts/get-workspaces.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/eww/scripts/get-workspaces.sh b/eww/scripts/get-workspaces.sh deleted file mode 100755 index 0d2dc4f..0000000 --- a/eww/scripts/get-workspaces.sh +++ /dev/null @@ -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 \ No newline at end of file diff --git a/eww/scripts/launch.sh b/eww/scripts/launch.sh deleted file mode 100644 index e8bd5e7..0000000 --- a/eww/scripts/launch.sh +++ /dev/null @@ -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)"') \ No newline at end of file diff --git a/eww/scripts/toggle-mixer.sh b/eww/scripts/toggle-mixer.sh deleted file mode 100755 index 814211a..0000000 --- a/eww/scripts/toggle-mixer.sh +++ /dev/null @@ -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 \ No newline at end of file diff --git a/hypr/2d-nav.sh b/hypr/2d-nav.sh deleted file mode 100644 index 93d3abe..0000000 --- a/hypr/2d-nav.sh +++ /dev/null @@ -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 \ No newline at end of file diff --git a/hypr/depencies-check.sh b/hypr/depencies-check.sh index aaa311e..15881ea 100644 --- a/hypr/depencies-check.sh +++ b/hypr/depencies-check.sh @@ -14,7 +14,6 @@ DEPS=( wofi thunar fastfetch - waybar jq python-gobject # arch ) diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf index 8b3aba7..32601c2 100644 --- a/hypr/hyprland.conf +++ b/hypr/hyprland.conf @@ -59,10 +59,10 @@ env = HYPRCURSOR_SIZE,24 # https://wiki.hypr.land/Configuring/Variables/#general general { - gaps_in = 5 - gaps_out = 10 + gaps_in = 0 + gaps_out = 0 - border_size = 2 + border_size = 0 # https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg @@ -79,8 +79,8 @@ general { # https://wiki.hypr.land/Configuring/Variables/#decoration decoration { - rounding = 4 - rounding_power = 2 + rounding = 0 + rounding_power = 0 # Change transparency of focused and unfocused windows active_opacity = 1.0 @@ -88,7 +88,7 @@ decoration { shadow { enabled = true - range = 4 + range = 0 render_power = 3 color = rgba(1a1a1aee) } @@ -96,7 +96,7 @@ decoration { # https://wiki.hypr.land/Configuring/Variables/#blur blur { enabled = true - size = 3 + size = 0 passes = 1 vibrancy = 0.1696 @@ -160,8 +160,9 @@ misc { # https://wiki.hypr.land/Configuring/Variables/#input input { kb_layout = us,dk + kb_variant = , + kb_options = grp:alt_shift_toggle } - # See https://wiki.hypr.land/Configuring/Gestures 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, R, exec, sh -c '~/.config/hypr/reload.sh' 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, J, togglesplit, # dwindle @@ -227,19 +230,6 @@ bind = SUPER SHIFT, left, movetoworkspacesilent, e-1 bind = SUPER ALT, right, movefocus, r 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) bind = $mainMod, S, exec, grim -g "$(slurp)" - | wl-copy @@ -316,21 +306,21 @@ windowrule { } # env stuff -#exec-once = waybar --style ~/.config/waybar/style.css -exec-once = bash ~/.config/eww/scripts/launch.sh +exec-once = quickshell exec-once = hyprpaper exec-once = ~/.config/hypr/theme-cycle.sh #rules +windowrulev = nodecorate, class:.* windowrule { - name = firefox-to-ws2 + name = firefox-to-ws1 match:class = ^(firefox)$ workspace = 1 silent } windowrule { name = code-to-ws2 - match:class = ^(code)$ + match:class = ^(code-oss)$ workspace = 2 silent } @@ -341,9 +331,9 @@ windowrule { } windowrule { - name = vesktop-to-ws4 + name = vesktop-to-ws9 match:class = ^(vesktop)$ - workspace = 4 silent + workspace = 9 silent } @@ -353,11 +343,6 @@ windowrule { workspace = 5 silent } -windowrule { - name = firefox-to-ws10 - match:class = ^(firefox)$ - workspace = 10 silent -} windowrule { name = eww-volume-float @@ -365,11 +350,19 @@ windowrule { float = yes } +windowrule { + name = wofi=thing + match:class = ^(wofi)$ + float = yes + move = 50% 36 +} + + #launch apps -exec-once = [workspace 1 silent] firefox -exec-once = [workspace 10 silent] firefox --new-instance +exec-once = firefox exec-once = code -exec-once = vesktop +exec-once = xwaylandvideobridge +exec-once = vesktop --enable-features=UseOzonePlatform --ozone-platform=wayland exec-once = steam exec-once = spotify diff --git a/hypr/reload.sh b/hypr/reload.sh index e7675c7..55460bb 100755 --- a/hypr/reload.sh +++ b/hypr/reload.sh @@ -1,6 +1,6 @@ #!/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 pkill hyprpaper 2>/dev/null diff --git a/quickshell/ClockWidget.qml b/quickshell/ClockWidget.qml new file mode 100644 index 0000000..eb84212 --- /dev/null +++ b/quickshell/ClockWidget.qml @@ -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 + } +} diff --git a/quickshell/CpuWidget.qml b/quickshell/CpuWidget.qml new file mode 100644 index 0000000..41fee0b --- /dev/null +++ b/quickshell/CpuWidget.qml @@ -0,0 +1,8 @@ +import QtQuick +import Quickshell.Io + +// eww cpu-widget +StatPill { + property string cpuUsage: "" + text: cpuUsage + "%" +} diff --git a/quickshell/LogoutMenu.qml b/quickshell/LogoutMenu.qml new file mode 100644 index 0000000..11a816a --- /dev/null +++ b/quickshell/LogoutMenu.qml @@ -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) + } +} diff --git a/quickshell/MemWidget.qml b/quickshell/MemWidget.qml new file mode 100644 index 0000000..5e3d717 --- /dev/null +++ b/quickshell/MemWidget.qml @@ -0,0 +1,7 @@ +import QtQuick + +// eww mem-widget +StatPill { + property string memUsed: "" + text: memUsed + "G" +} diff --git a/quickshell/NetworkWidget.qml b/quickshell/NetworkWidget.qml new file mode 100644 index 0000000..4c8a8d7 --- /dev/null +++ b/quickshell/NetworkWidget.qml @@ -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 + } +} diff --git a/quickshell/PowerBtn.qml b/quickshell/PowerBtn.qml new file mode 100644 index 0000000..829d7d6 --- /dev/null +++ b/quickshell/PowerBtn.qml @@ -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 + } +} diff --git a/quickshell/SettingsBtn.qml b/quickshell/SettingsBtn.qml new file mode 100644 index 0000000..8460d5e --- /dev/null +++ b/quickshell/SettingsBtn.qml @@ -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) + } +} diff --git a/quickshell/SettingsMenu.qml b/quickshell/SettingsMenu.qml new file mode 100644 index 0000000..d7dab93 --- /dev/null +++ b/quickshell/SettingsMenu.qml @@ -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 + } + } + } + } + } + } +} diff --git a/quickshell/StatPill.qml b/quickshell/StatPill.qml new file mode 100644 index 0000000..25f99f6 --- /dev/null +++ b/quickshell/StatPill.qml @@ -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 + } +} diff --git a/quickshell/ThemeWidget.qml b/quickshell/ThemeWidget.qml new file mode 100644 index 0000000..71df95d --- /dev/null +++ b/quickshell/ThemeWidget.qml @@ -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) + } +} diff --git a/quickshell/VolumeWidget.qml b/quickshell/VolumeWidget.qml new file mode 100644 index 0000000..1d075ec --- /dev/null +++ b/quickshell/VolumeWidget.qml @@ -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 + } +} diff --git a/quickshell/WorkspacesWidget.qml b/quickshell/WorkspacesWidget.qml new file mode 100644 index 0000000..d471933 --- /dev/null +++ b/quickshell/WorkspacesWidget.qml @@ -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) + } + } + } + } + } +} diff --git a/quickshell/shell.qml b/quickshell/shell.qml new file mode 100644 index 0000000..afe203b --- /dev/null +++ b/quickshell/shell.qml @@ -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 } + } + } + } + } + } +} diff --git a/waybar/config.jsonc b/waybar/config.jsonc deleted file mode 100644 index 6446a96..0000000 --- a/waybar/config.jsonc +++ /dev/null @@ -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": "{:%Y %B}\n{calendar}" - }, - "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": "{:%Y %B}\n{calendar}" - }, - "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 - } - } - -] - diff --git a/waybar/style.css b/waybar/style.css deleted file mode 120000 index 1e1cd45..0000000 --- a/waybar/style.css +++ /dev/null @@ -1 +0,0 @@ -/home/sam42/.config/waybar/themes/night.css \ No newline at end of file diff --git a/waybar/switch-theme.sh b/waybar/switch-theme.sh deleted file mode 100755 index d20c2cd..0000000 --- a/waybar/switch-theme.sh +++ /dev/null @@ -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 " - 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" \ No newline at end of file diff --git a/waybar/themes/day.css b/waybar/themes/day.css deleted file mode 100644 index add0918..0000000 --- a/waybar/themes/day.css +++ /dev/null @@ -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; -} \ No newline at end of file diff --git a/waybar/themes/night.css b/waybar/themes/night.css deleted file mode 100644 index 1a1cc15..0000000 --- a/waybar/themes/night.css +++ /dev/null @@ -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; -} diff --git a/waybar/themes/style.css.old b/waybar/themes/style.css.old deleted file mode 100644 index 9c4fabf..0000000 --- a/waybar/themes/style.css.old +++ /dev/null @@ -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); -} \ No newline at end of file diff --git a/wofi/style.css b/wofi/style.css deleted file mode 100644 index 634543f..0000000 --- a/wofi/style.css +++ /dev/null @@ -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; -}