Power menu
This commit is contained in:
@@ -1,21 +1,23 @@
|
|||||||
.powermenu-box {
|
.pm-overlay {
|
||||||
padding: 3rem 2.5rem;
|
background-color: rgba(0, 0, 0, 0.55);
|
||||||
margin: 0;
|
}
|
||||||
|
|
||||||
.powermenu-entry {
|
.pm-win {
|
||||||
margin: 0 0.5rem;
|
padding: $popup-scale * 10pt;
|
||||||
|
font-size: $popup-scale * $panel-font-size;
|
||||||
|
}
|
||||||
|
|
||||||
.powermenu-button {
|
.pm-btn {
|
||||||
|
@include background-base2;
|
||||||
|
@include border-radius;
|
||||||
|
padding: $popup-scale * 20pt $popup-scale * 16pt;
|
||||||
|
margin: $popup-scale * 6px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
@include background-active;
|
@include background-active;
|
||||||
border-radius: 1rem;
|
.pm-icon, .pm-label { color: $base01; }
|
||||||
transition: 0.3s;
|
|
||||||
padding: 3.25rem 4rem;
|
|
||||||
|
|
||||||
&:hover { background-color: $base03; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.powermenu-icon {
|
|
||||||
font-size: 4rem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.pm-icon { font-size: 2.4em; @include color-body; }
|
||||||
|
.pm-label { font-size: 0.70em; margin-top: $popup-scale * 5pt; @include color-body; }
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
:onhover "${EWW_CMD} update date_rev=true"
|
:onhover "${EWW_CMD} update date_rev=true"
|
||||||
:onhoverlost "${EWW_CMD} update date_rev=false"
|
:onhoverlost "${EWW_CMD} update date_rev=false"
|
||||||
:onclick "(sleep 0.1 && scripts/panel-toggle clock)"
|
:onclick "(sleep 0.1 && scripts/panel-toggle clock)"
|
||||||
:onrightclick "(sleep 0.1 && eww-open-on-current-screen powermenu --toggle)"
|
:onrightclick "(sleep 0.1 && scripts/powermenu-toggle)"
|
||||||
(box
|
(box
|
||||||
:class "datetime"
|
:class "datetime"
|
||||||
(overlay
|
(overlay
|
||||||
|
|||||||
@@ -1,30 +1,18 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
PANEL="$1"
|
PANEL="$1"
|
||||||
|
|
||||||
# Drop concurrent invocations, but recover from stale locks (dead processes)
|
# Atomic lock: flock acquires exclusively or exits immediately.
|
||||||
LOCK="/tmp/eww_panel_toggle.lock"
|
# Released automatically when the process exits (no trap needed).
|
||||||
if [ -f "$LOCK" ] && kill -0 "$(cat "$LOCK" 2>/dev/null)" 2>/dev/null; then
|
exec 9>"/tmp/eww_panel_toggle.lock"
|
||||||
exit 0
|
flock -n 9 || exit 0
|
||||||
fi
|
|
||||||
echo $$ > "$LOCK"
|
|
||||||
trap 'rm -f "$LOCK"' EXIT
|
|
||||||
|
|
||||||
CURRENT=$(eww get active-panel 2>/dev/null | tr -d '"')
|
CURRENT=$(eww get active-panel 2>/dev/null | tr -d '"')
|
||||||
|
|
||||||
open_popup() {
|
|
||||||
local screen
|
|
||||||
screen=$(hyprctl monitors -j 2>/dev/null | jq -r '.[] | select(.focused == true) | .name' | head -n1)
|
|
||||||
if [ -n "$screen" ]; then
|
|
||||||
eww open popup --screen "$screen"
|
|
||||||
else
|
|
||||||
eww open popup
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "$CURRENT" = "$PANEL" ]; then
|
if [ "$CURRENT" = "$PANEL" ]; then
|
||||||
eww update active-panel=""
|
eww update active-panel=""
|
||||||
eww close popup 2>/dev/null
|
eww close popup 2>/dev/null
|
||||||
else
|
else
|
||||||
eww update active-panel="$PANEL"
|
eww update active-panel="$PANEL"
|
||||||
open_popup
|
eww close popup 2>/dev/null
|
||||||
|
eww-open-on-current-screen popup
|
||||||
fi
|
fi
|
||||||
|
|||||||
4
modules/home/wayland/apps/eww/bar/scripts/powermenu-toggle
Executable file
4
modules/home/wayland/apps/eww/bar/scripts/powermenu-toggle
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
eww close popup 2>/dev/null
|
||||||
|
eww update active-panel=""
|
||||||
|
eww-open-on-current-screen powermenu --toggle
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
function get_time_ms {
|
|
||||||
date -u +%s%3N
|
|
||||||
}
|
|
||||||
|
|
||||||
icons=("" "" "")
|
|
||||||
|
|
||||||
gen_output() {
|
|
||||||
icon="${icons[$(awk -v n="$(brillo)" 'BEGIN{print int(n/34)}')]}"
|
|
||||||
prcnt=$(brillo | xargs printf "%.*f\n" "0")
|
|
||||||
echo '{"percent": '$prcnt', "icon": "'$icon'"}'
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ $(brillo 2>/dev/stdout 1>/dev/null | head -n1 | awk '{print $1}') == "No" ]]; then
|
|
||||||
echo '{"percent": 100, "icon": ""}'
|
|
||||||
elif [ "$1" = "" ]; then
|
|
||||||
# initial
|
|
||||||
last_time=$(get_time_ms)
|
|
||||||
gen_output
|
|
||||||
|
|
||||||
udevadm monitor | rg --line-buffered "backlight" | while read -r _; do
|
|
||||||
current_time=$(get_time_ms)
|
|
||||||
delta=$((current_time - last_time))
|
|
||||||
if [[ $delta -gt 50 ]]; then
|
|
||||||
gen_output
|
|
||||||
last_time=$(get_time_ms)
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
icon() {
|
|
||||||
[ "$STATUS" = "no" ] && echo "" || echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle() {
|
|
||||||
if [ "$STATUS" = "no" ]; then
|
|
||||||
rfkill block all
|
|
||||||
else
|
|
||||||
rfkill unblock all
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "$1" = "toggle" ]; then
|
|
||||||
toggle
|
|
||||||
else
|
|
||||||
icon
|
|
||||||
rfkill event | while read -r _; do
|
|
||||||
STATUS="$(rfkill list | sed -n 2p | awk '{print $3}')"
|
|
||||||
icon
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
icon() {
|
|
||||||
[ "$STATUS" = "no" ] && echo "" || echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle() {
|
|
||||||
if [ "$STATUS" = "no" ]; then
|
|
||||||
echo ""
|
|
||||||
else
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "$1" = "toggle" ]; then
|
|
||||||
toggle
|
|
||||||
icon
|
|
||||||
else
|
|
||||||
icon
|
|
||||||
fi
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
function get_time_ms {
|
|
||||||
date -u +%s%3N
|
|
||||||
}
|
|
||||||
|
|
||||||
volicons=("" "" "")
|
|
||||||
|
|
||||||
vol() {
|
|
||||||
wpctl get-volume @DEFAULT_AUDIO_"$1"@ | awk '{print int($2*100)}'
|
|
||||||
}
|
|
||||||
ismuted() {
|
|
||||||
wpctl get-volume @DEFAULT_AUDIO_"$1"@ | rg -qi muted
|
|
||||||
echo -n $?
|
|
||||||
}
|
|
||||||
setvol() {
|
|
||||||
wpctl set-volume @DEFAULT_AUDIO_"$1"@ "$(awk -v n="$2" 'BEGIN{print (n / 100)}')"
|
|
||||||
}
|
|
||||||
setmute() {
|
|
||||||
wpctl set-mute @DEFAULT_AUDIO_"$1"@ toggle
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_output() {
|
|
||||||
percent="$(vol "SINK")"
|
|
||||||
lvl=$(awk -v n="$percent" 'BEGIN{print int(n/34)}')
|
|
||||||
ismuted=$(ismuted "SINK")
|
|
||||||
|
|
||||||
if [ "$ismuted" = 1 ]; then
|
|
||||||
icon="${volicons[$lvl]}"
|
|
||||||
else
|
|
||||||
icon=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo '{"icon": "'$icon'", "percent": '$(vol "SINK")', "microphone": '$(vol "SOURCE")'}'
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "$1" = "mute" ]; then
|
|
||||||
if [ "$2" != "SOURCE" ] && [ "$2" != "SINK" ]; then
|
|
||||||
echo "Can only mute SINK or SOURCE"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
setmute "$2"
|
|
||||||
elif [ "$1" = "setvol" ]; then
|
|
||||||
if [ "$2" != "SOURCE" ] && [ "$2" != "SINK" ]; then
|
|
||||||
echo "Can only set volume for SINK or SOURCE"
|
|
||||||
exit 1
|
|
||||||
elif [ "$3" -lt 0 ] || [ "$3" -gt 100 ]; then
|
|
||||||
echo "Volume must be between 0 and 100"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
setvol "$2" "$3"
|
|
||||||
else
|
|
||||||
last_time=$(get_time_ms)
|
|
||||||
gen_output
|
|
||||||
|
|
||||||
pw-cli -m 2>/dev/null | rg --line-buffered "PipeWire:Interface:Client" | while read -r event; do
|
|
||||||
current_time=$(get_time_ms)
|
|
||||||
delta=$((current_time - last_time))
|
|
||||||
if [[ $delta -gt 50 ]]; then
|
|
||||||
gen_output
|
|
||||||
last_time=$(get_time_ms)
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
@@ -1,37 +1,28 @@
|
|||||||
(defwidget powermenu_entry [label icon onclick]
|
|
||||||
(box :orientation "v" :space-evenly false :class "powermenu-entry"
|
(defwidget pm-btn [icon label onclick]
|
||||||
(button :class "powermenu-button" :onclick {onclick}
|
(button :class "pm-btn" :onclick onclick
|
||||||
:tooltip "${label}"
|
(box :orientation "v" :space-evenly false :halign "center" :valign "center"
|
||||||
(label :class "powermenu-icon" :text {icon})
|
(label :class "pm-icon" :text icon)
|
||||||
)
|
(label :class "pm-label" :text label))))
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
(defwidget powermenu []
|
(defwidget powermenu []
|
||||||
(box :orientation "h" :space-evenly true :valign "center" :halign "center" :class "powermenu-box"
|
(box :hexpand true :vexpand true :class "pm-overlay"
|
||||||
(powermenu_entry :label "Power off"
|
(box :halign "center" :valign "center"
|
||||||
:icon ""
|
(eventbox :class "winevent"
|
||||||
|
(box :class "wininner pm-win"
|
||||||
|
(box :orientation "h" :space-evenly true
|
||||||
|
(pm-btn :icon "" :label "Power off"
|
||||||
:onclick "systemctl poweroff")
|
:onclick "systemctl poweroff")
|
||||||
(powermenu_entry :label "Reboot"
|
(pm-btn :icon "" :label "Reboot"
|
||||||
:icon ""
|
|
||||||
:onclick "systemctl reboot")
|
:onclick "systemctl reboot")
|
||||||
(powermenu_entry :label "Lock"
|
(pm-btn :icon "" :label "Lock"
|
||||||
:icon ""
|
|
||||||
:onclick "sleep 0.1 && gtklock & eww close powermenu &")
|
:onclick "sleep 0.1 && gtklock & eww close powermenu &")
|
||||||
|
(pm-btn :icon "" :label "Suspend"
|
||||||
(powermenu_entry :label "Suspend"
|
|
||||||
:icon ""
|
|
||||||
:onclick "sleep 0.1 && gtklock & systemctl suspend & eww close powermenu &")
|
:onclick "sleep 0.1 && gtklock & systemctl suspend & eww close powermenu &")
|
||||||
|
(pm-btn :icon "" :label "Sign out"
|
||||||
(powermenu_entry :label "Sign out"
|
|
||||||
:icon ""
|
|
||||||
:onclick "hyprctl eval \"hl.dispatch(hl.dsp.exit())\"")
|
:onclick "hyprctl eval \"hl.dispatch(hl.dsp.exit())\"")
|
||||||
|
(pm-btn :icon "" :label "Cancel"
|
||||||
(powermenu_entry :label "Cancel"
|
:onclick "eww close powermenu")))))))
|
||||||
:icon ""
|
|
||||||
:onclick "eww close powermenu")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
(defwindow powermenu
|
(defwindow powermenu
|
||||||
:monitor 0
|
:monitor 0
|
||||||
@@ -41,5 +32,4 @@
|
|||||||
:width "120%"
|
:width "120%"
|
||||||
:height "120%")
|
:height "120%")
|
||||||
:namespace "eww-blur"
|
:namespace "eww-blur"
|
||||||
(powermenu)
|
(powermenu))
|
||||||
)
|
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ let
|
|||||||
scripts = {
|
scripts = {
|
||||||
"scripts/brightness" = mkScript "brightness" ./bar/scripts/brightness [ pkgs.brightnessctl ];
|
"scripts/brightness" = mkScript "brightness" ./bar/scripts/brightness [ pkgs.brightnessctl ];
|
||||||
"scripts/nightlight" = mkScript "nightlight" ./bar/scripts/nightlight [ pkgs.wlsunset ];
|
"scripts/nightlight" = mkScript "nightlight" ./bar/scripts/nightlight [ pkgs.wlsunset ];
|
||||||
"scripts/panel-toggle" = mkScript "panel-toggle" ./bar/scripts/panel-toggle [ pkgs.eww pkgs.jq ];
|
"scripts/panel-toggle" = mkScript "panel-toggle" ./bar/scripts/panel-toggle [ pkgs.eww pkgs.util-linux openOnCurrentScreen ];
|
||||||
|
"scripts/powermenu-toggle" = mkScript "powermenu-toggle" ./bar/scripts/powermenu-toggle [ pkgs.eww openOnCurrentScreen ];
|
||||||
"scripts/power-save" = mkScript "power-save" ./bar/scripts/power-save [ pkgs.eww ];
|
"scripts/power-save" = mkScript "power-save" ./bar/scripts/power-save [ pkgs.eww ];
|
||||||
"scripts/radio" = mkScript "radio" ./bar/scripts/radio [ pkgs.eww pkgs.jq pkgs.curl pkgs.mpv pkgs.playerctl ];
|
"scripts/radio" = mkScript "radio" ./bar/scripts/radio [ pkgs.eww pkgs.jq pkgs.curl pkgs.mpv pkgs.playerctl ];
|
||||||
"scripts/color-pick" = mkScript "color-pick" ./bar/scripts/color-pick [ pkgs.eww pkgs.hyprpicker ];
|
"scripts/color-pick" = mkScript "color-pick" ./bar/scripts/color-pick [ pkgs.eww pkgs.hyprpicker ];
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ in {
|
|||||||
layer_rule = [ {
|
layer_rule = [ {
|
||||||
match.namespace = "^eww%-blur$";
|
match.namespace = "^eww%-blur$";
|
||||||
blur = true;
|
blur = true;
|
||||||
ignore_alpha = 0.5;
|
ignore_alpha = 0.0;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
bind = [
|
bind = [
|
||||||
|
|||||||
Reference in New Issue
Block a user