From 85dde2e9aa320deb953f9da5713c5d33f8b200c6 Mon Sep 17 00:00:00 2001 From: matt1432 Date: Sun, 28 May 2023 18:05:51 -0400 Subject: [PATCH] add eww config --- dolphinrc | 21 ++ eww/README.md | 3 + eww/actions/actions.scss | 159 ++++++++++++++ eww/actions/actions.yuck | 209 ++++++++++++++++++ eww/assets/default-pfp.png | Bin 0 -> 9138 bytes eww/assets/fallback.png | Bin 0 -> 59285 bytes eww/colors.scss | 31 +++ eww/dashboard/dashboard.scss | 305 +++++++++++++++++++++++++++ eww/dashboard/dashboard.yuck | 385 ++++++++++++++++++++++++++++++++++ eww/date/date.scss | 71 +++++++ eww/date/date.yuck | 57 +++++ eww/eww.scss | 9 + eww/eww.yuck | 5 + eww/powermenu/powermenu.scss | 27 +++ eww/powermenu/powermenu.yuck | 56 +++++ eww/scripts/bluetooth | 35 ++++ eww/scripts/brightness.sh | 50 +++++ eww/scripts/cpu.sh | 2 + eww/scripts/disk.sh | 3 + eww/scripts/exec | 4 + eww/scripts/mic | 64 ++++++ eww/scripts/music/control.sh | 13 ++ eww/scripts/music/songart.sh | 45 ++++ eww/scripts/music/songdata.sh | 36 ++++ eww/scripts/network.sh | 101 +++++++++ eww/scripts/pfp.sh | 12 ++ eww/scripts/ram.sh | 42 ++++ eww/scripts/redshift | 70 +++++++ eww/scripts/screensht | 34 +++ eww/scripts/temp.sh | 39 ++++ eww/scripts/user.sh | 8 + eww/scripts/volume.sh | 93 ++++++++ eww/scripts/volume.sh.bak | 77 +++++++ eww/variables.yuck | 46 ++++ 34 files changed, 2112 insertions(+) create mode 100644 dolphinrc create mode 100644 eww/README.md create mode 100644 eww/actions/actions.scss create mode 100644 eww/actions/actions.yuck create mode 100644 eww/assets/default-pfp.png create mode 100644 eww/assets/fallback.png create mode 100644 eww/colors.scss create mode 100644 eww/dashboard/dashboard.scss create mode 100644 eww/dashboard/dashboard.yuck create mode 100644 eww/date/date.scss create mode 100644 eww/date/date.yuck create mode 100644 eww/eww.scss create mode 100644 eww/eww.yuck create mode 100644 eww/powermenu/powermenu.scss create mode 100644 eww/powermenu/powermenu.yuck create mode 100755 eww/scripts/bluetooth create mode 100755 eww/scripts/brightness.sh create mode 100755 eww/scripts/cpu.sh create mode 100755 eww/scripts/disk.sh create mode 100755 eww/scripts/exec create mode 100755 eww/scripts/mic create mode 100755 eww/scripts/music/control.sh create mode 100755 eww/scripts/music/songart.sh create mode 100755 eww/scripts/music/songdata.sh create mode 100755 eww/scripts/network.sh create mode 100755 eww/scripts/pfp.sh create mode 100755 eww/scripts/ram.sh create mode 100755 eww/scripts/redshift create mode 100755 eww/scripts/screensht create mode 100755 eww/scripts/temp.sh create mode 100755 eww/scripts/user.sh create mode 100755 eww/scripts/volume.sh create mode 100755 eww/scripts/volume.sh.bak create mode 100644 eww/variables.yuck diff --git a/dolphinrc b/dolphinrc new file mode 100644 index 00000000..349b1d41 --- /dev/null +++ b/dolphinrc @@ -0,0 +1,21 @@ +[$Version] +update_info=dolphin_detailsmodesettings.upd:rename-leading-padding + +[General] +Version=202 +ViewPropsTimestamp=2023,5,12,19,59,9.33 + +[Icons] +Theme=Adwaita:dark + +[KFileDialog Settings] +Places Icons Auto-resize=false +Places Icons Static Size=22 + +[KPropertiesDialog] +1920x1200 screen: Height=567 +1920x1200 screen: Width=604 + +[MainWindow] +MenuBar=Disabled +ToolBarsMovable=Disabled diff --git a/eww/README.md b/eww/README.md new file mode 100644 index 00000000..e17e49ea --- /dev/null +++ b/eww/README.md @@ -0,0 +1,3 @@ +credits: https://github.com/AlphaTechnolog/dotfiles/tree/openbox + +it has been slightly modified diff --git a/eww/actions/actions.scss b/eww/actions/actions.scss new file mode 100644 index 00000000..b3a9047a --- /dev/null +++ b/eww/actions/actions.scss @@ -0,0 +1,159 @@ +.actions { + background-color: $bg; + color: $fg; + //font-family: Product Sans; + font-family: Ubuntu Mono; + border-radius: 30px; + border: 5px solid $contrastbg; + padding: 10px 18px; +} + +.controlsbox { + background-color: $contrastbg; + border-radius: 7px; + padding: 7px 12px; + + .vol-slider { + .vol-label { + min-width: 25px; /* Set the width according to your icons */ + font-size: 26px; + font-family: Iosevka Nerd Font; + margin-right: 15px; + color: $blue; + } + & scale trough { + all: unset; + border-radius: 10px; + background-color: $black; + border: none; + min-height: 16px; + min-width: 250px; + margin-left: 3px; + & highlight { + all: unset; + background: linear-gradient(to right, $blue, $cyan); + color: #000000; + border-radius: 10px; + } + } + } + + .br-slider { + .br-label { + min-width: 25px; /* Set the width according to your icons */ + font-size: 26px; + font-family: Iosevka Nerd Font; + margin-right: 15px; + color: $yellow; + } + & scale trough { + all: unset; + border-radius: 10px; + background-color: $black; + border: none; + min-height: 16px; + min-width: 250px; + margin-left: 3px; + & highlight { + all: unset; + background: linear-gradient(to right, $red, $yellow); + color: #000000; + border-radius: 10px; + } + } + } +} + +.userinfobox { + .time { + font-size: 42px; + } + .pfp { + background-position: center; + background-size: cover; + background-repeat: no-repeat; + border-radius: 50px; + min-width: 30px; + min-height: 30px; + } + .daybox { + margin-top: 8px; + font-size: 14px; + } + .username { + //font-family: Product Sans; + font-family: Ubuntu Mono; + } + .useractions { + .logout { + background-color: $black; + font-family: Iosevka Nerd Font; + font-size: 18px; + padding: 6px 12px 6px 6px; + border-radius: 4px; + transition: all ease .2s; + &:hover { background-color: $dimblack; } + &:active { background-color: $black; } + } + } +} + +.sysbuttonsbox { + .block-container { + .block { + background-color: $contrastbg; + padding: 0px 6px; + border-radius: 50px; + transition: all ease .2s; + color: $fg; + &:hover { background-color: $bgSecondary; } + &:active { background-color: $contrastbg; } + &.active { + background-color: $black; + &:hover { background-color: $dimblack; } + &:active { background-color: $black; } + .sepbox .sep { + background-color: $lightblack; + } + } + .iconbox .icon { + font-family: Iosevka Nerd Font; + padding: 7px 14px 7px 14px; + font-size: 20px; + min-width: 20px; + } + .sepbox .sep { + background-color: $black; + margin: 0px 4px; + padding: 0px 1px; + } + .chevronbox { + font-family: Iosevka Nerd Font; + padding: 0px 12px; + } + } + .label { + font-family: Product Sans; + font-size: 14px; + } + } +} + +.poweractionsbox { + .info { + font-size: 26px; + } + .buttons { + font-family: Iosevka Nerd Font; + font-size: 22px; + button { + padding: 1px 9px 1px 9px; + background-color: $bgSecondary; + border-radius: 5px; + transition: all ease .2s; + &:hover { background-color: $black; } + &:active { background-color: $bg; } + &.do-logout { color: $yellow; } + } + } +} diff --git a/eww/actions/actions.yuck b/eww/actions/actions.yuck new file mode 100644 index 00000000..59e7ee4f --- /dev/null +++ b/eww/actions/actions.yuck @@ -0,0 +1,209 @@ +(defwidget sysblock [icon onclick active label] + (box :class "block-container" + :orientation "v" + :space-evenly false + :spacing 5 + (button :class "block ${active ? 'active' : ''}" :onclick "${onclick}" + (box :orientation "h" + :space-evenly false + (box :class "iconbox" + :halign "start" + :space-evenly true + :orientation "h" + (label :text "${icon}" :class "icon") + ) + (box :class "sepbox" + :halign "center" + :space-evenly true + :orientation "h" + (box :class "sep") + ) + (box :class "chevronbox" + :halign "end" + :space-evenly true + :orientation "h" + (label :text "") + ) + ) + ) + (label :halign "center" :text "${label}" :class "label") + ) +) + +(defwidget sysbuttons [] + (box :class "sysbuttonsbox" + :orientation "v" + :space-evenly false + :spacing 20 + (box :class "firstrow" + :orientation "h" + :space-evenly true + (box :halign "start" + :orientation "h" + :space-evenly true + (sysblock :icon "${network_icon}" + :onclick "~/.config/eww/scripts/network.sh toggle" + :active "${network_status == 'Connected' ? true : false}" + :label "${network_ssid}") + ) + (box :halign "center" + :orientation "h" + :space-evenly true + (sysblock :icon "${bluetooth_state == 'on' ? '' : ''}" + :onclick "~/.config/eww/scripts/bluetooth toggle" + :active "${bluetooth_state == 'on' ? true : false}" + :label "Bluetooth") + ) + (box :halign "end" + :orientation "h" + :space-evenly true + (sysblock :icon "${network_radio == 'on' ? '' : ''}" + :onclick "~/.config/eww/scripts/network.sh toggle-radio" + :active "${network_radio == 'on' ? false : true}" + :label "Airplane") + ) + ) + (box :class "lastrow" + :orientation "h" + :space-evenly true + (box :halign "start" + :orientation "h" + :space-evenly true + (sysblock :icon "${redshift_state == 'on' ? '' : ''}" + :onclick "~/.config/eww/scripts/redshift toggle" + :active "${redshift_state == 'on' ? true : false}" + :label "Night Light") + ) + (box :halign "center" + :orientation "h" + :space-evenly true + (sysblock :icon "${volume_icon}" + :onclick "~/.config/eww/scripts/volume.sh toggle-muted" + :active "${is_muted == 'yes' ? false : true}" + :label "Volume") + ) + (box :halign "end" + :orientation "h" + :space-evenly true + (sysblock :icon "${mic_status == 'yes' ? '' : ''}" + :onclick "~/.config/eww/scripts/mic toggle" + :active "${mic_status == 'yes' ? true : false}" + :label "Micro") + ) + ) + ) +) + +(defwidget controls [] + (box :class "controlsbox" + :orientation "v" + :space-evenly false + :spacing 10 + (box :orientation "h" + :space-evenly "false" + :class "vol-slider" + (box :class "vol-label" + volume_icon + ) + (scale :value volume_value + :onchange "~/.config/eww/scripts/volume.sh set {}" + :min 0 + :max 101) + ) + (box :orientation "h" + :space-evenly "false" + :class "br-slider" + (box :class "br-label" + br_icon + ) + (scale :value br + :onchange "~/.config/eww/scripts/brightness.sh set {}" + :min 0 + :max 101) + ) + ) +) + +(defwidget user [] + (box :class "userinfobox" + :orientation "h" + :space-evenly false + (box :class "info" + :space-evenly false + :orientation "h" + :halign "start" + :valign "center" + :spacing 10 + (label :text "${lithour}:${litmin}" :class "time") + (box :class "daybox" + :orientation "v" + :space-evenly false + (label :text "${shortday}" :halign "start") + (label :text "${weekday}" :halign "start") + ) + ) + (box :orientation "h" + :space-evenly false + :halign "end" + :valign "center" + :hexpand true + (box :class "pfp" + :style "background-image: url('${pfp}');") + ) + ) +) + +(defwidget poweractions [] + (box :class "poweractionsbox" + :orientation "h" + :space-evenly true + (box :class "buttons-container" + :space-evenly true + :halign "end" + :orientation "h" + (box :class "buttons" + :orientation "h" + :space-evenly true + :spacing 10 + (button :class "do-logout" + :onclick "eww open powermenu && eww open powermenu-closer && eww close actions && eww close actions-closer" + :tooltip "Logout" + :halign "end" + "" + ) + ) + ) + ) +) + +(defwidget actions [] + (box :class "actions" + :orientation "v" + :space-evenly false + :spacing 20 + (user) + (sysbuttons) + (controls) + (poweractions) + ) +) + +(defwindow actions + :monitor "0" + :geometry (geometry :x "10px" + :y "4px" + :width "320px" ; this isn't respected btw, so it's auto-adjusted by eww lol. + :height "10px" ; automatically generated by eww. + :anchor "top right") + +(actions)) + +(defwidget closer [window] + (eventbox :onclick "eww close ${window} && eww close ${window}-closer")) + +(defwindow actions-closer + :monitor 0 + :geometry (geometry :width "100%" :height "100%") + :stacking "fg" + :focusable false + (closer :window "actions")) diff --git a/eww/assets/default-pfp.png b/eww/assets/default-pfp.png new file mode 100644 index 0000000000000000000000000000000000000000..3d864927ab707674f71288487b58ecfee212e68e GIT binary patch literal 9138 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 literal 0 HcmV?d00001 diff --git a/eww/assets/fallback.png b/eww/assets/fallback.png new file mode 100644 index 0000000000000000000000000000000000000000..1dae900d22b6284f7be4e6b797d3e90ff9e8421e GIT binary patch literal 59285 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 literal 0 HcmV?d00001 diff --git a/eww/colors.scss b/eww/colors.scss new file mode 100644 index 00000000..276d10e0 --- /dev/null +++ b/eww/colors.scss @@ -0,0 +1,31 @@ +$darkbg: #0b0d16; +$bg: rgb(24, 27, 35); //rgba(69, 71, 90, 0.3); #0d0f18; +$contrastbg: #0f111a; +$bgSecondary: #11131c; +$bgSecondaryAlt: #a5b6cf; +$fg: #a5b6cf; +$fgDim: #a5b6cf; +$watermelon: #dd6777; + +// Aliases +$background: $bg; +$backgroundSecondary: $bgSecondary; +$backgroundSecondaryAlt: $bgSecondaryAlt; +$foreground: $fg; +$foregroundDim: $fgDim; + +$black: #151720; +$dimblack: #1a1c25; +$lightblack: #262831; +$red: #dd6777; +$blue: #86aaec; +$cyan: #93cee9; +$blue-desaturated: #93cee9; +$magenta: #c296eb; +$purple: #c296eb; +$green: #90ceaa; +$aquamarine: #90ceaa; +$yellow: #ecd3a0; +$accent: $blue; +$javacafeMagenta: #c296eb; +$javacafeBlue: #86aaec; diff --git a/eww/dashboard/dashboard.scss b/eww/dashboard/dashboard.scss new file mode 100644 index 00000000..5263e24e --- /dev/null +++ b/eww/dashboard/dashboard.scss @@ -0,0 +1,305 @@ +.dashboardbox { + background-color: $black; + color: $fg; +} + +.headerbox { + padding: 8px 10px 6px; + .userbox { + .pfp { + background-position: center; + background-repeat: no-repeat; + background-size: cover; + min-height: 32px; + min-width: 32px; + border-radius: 50px; + } + .pcname { + font-family: Product Sans; + .sep { + color: $blue; + } + } + } + .searchbox { + .searchinput { + background-color: $bg; + padding: 5px 0px; + border-radius: 50px; + transition: all ease .2s; + &:hover { background-color: $bgSecondary; } + &:active { background-color: $contrastbg; } + .searchinput-content { + padding: 0px 200px 0px 10px; + font-family: Product Sans; + .icon { + font-family: Iosevka Nerd Font; + color: $blue; + margin-right: 12px; + } + .placeholder { + color: $lightblack; + } + } + } + } +} + +.content-container { + .contentbox { + background-color: $bg; + border-top-left-radius: 12px; + border-top-right-radius: 12px; + padding: 25px; + + .firstcol { + .usercard { + background-color: $black; + border-radius: 12px; + padding: 10px; + .user-content { + font-family: Product Sans; + .pfp { + background-size: cover; + background-position: center; + background-repeat: no-repeat; + min-height: 64px; + min-width: 64px; + border-radius: 50px; + } + .username { + font-weight: bolder; + font-size: 20px; + } + .uptime { + font-size: 12px; + } + } + .user-powerbuttons { + button { + background-color: $dimblack; + border-radius: 7px; + padding: 2px 10px 2px 7px; + font-family: Iosevka Nerd Font; + font-size: 16px; + transition: all ease .2s; + &:hover { background-color: $lightblack; } + &:active { background-color: $dimblack; } + } + .poweroff { color: $red; } + .reboot { color: $magenta; } + } + } + .controlscard { + background-color: $black; + padding: 10px; + border-radius: 12px; + .control-container { + .control-item { + transition: all ease .2s; + border-radius: 50px; + + background-color: $dimblack; + color: $blue; + + &:hover { background-color: $lightblack; } + &:active { background-color: $dimblack; } + + &.active { + background: $blue; + color: $bg; + } + + .control-icon { + font-family: Iosevka Nerd Font; + font-size: 14px; + } + + // solving nerd fonts alignment issues + &.network { padding: 9px 19px 9px 10px; } + &.network-disconnected { padding: 9px 18px 9px 11px; } + &.airplane { padding: 9px 17px 9px 12px; } + &.volume { padding: 9px 18px 9px 11px; } + &.volume-muted { padding: 9px 17px 9px 12px; } + &.mic { padding: 9px 16px 9px 13px; } + &.mic-on { padding: 9px 15px 9px 14px; } + &.redshift { padding: 9px 18px 9px 11px; } + &.redshift-on { padding: 9px 17px 9px 12px; } + &.bluetooth { padding: 9px 16px 9px 13px; } + &.bluetooth-on { padding: 9px 15px 9px 14px; } + &.fullscreensht { padding: 9px 17px 9px 12px; } + &.areascreensht { padding: 9px 17px 9px 12px; } + } + } + } + .slidersbox { + .vol-slider { + .vol-label { + font-size: 16px; + font-family: Iosevka Nerd Font; + color: $bg; + margin-left: 10px; + } + & scale trough { + all: unset; + border-radius: 10px; + background-color: $black; + border: none; + min-height: 25px; + min-width: 245px; + margin-left: 3px; + & highlight { + all: unset; + background: $blue; + color: #000000; + border-radius: 10px; + } + } + } + .br-slider { + .br-label { + font-size: 16px; + font-family: Iosevka Nerd Font; + color: $bg; + margin-left: 10px; + } + & scale trough { + all: unset; + border-radius: 100px; + background-color: $black; + border: none; + min-height: 25px; + min-width: 245px; + margin-left: 3px; + & highlight { + all: unset; + background: $blue; + color: #000000; + border-radius: 10px; + } + } + } + .mic-slider { + .mic-label { + font-size: 16px; + font-family: Iosevka Nerd Font; + color: $bg; + margin-left: 10px; + } + & scale trough { + all: unset; + border-radius: 100px; + background-color: $black; + border: none; + min-height: 25px; + min-width: 245px; + margin-left: 3px; + & highlight { + all: unset; + background: $blue; + color: #000000; + border-radius: 10px; + } + } + } + } + } + .lastcol { + .musicbox { + background-color: $black; + border-radius: 12px; + .firstrow { + padding: 10px; + .picbox { + background-size: cover; + background-repeat: no-repeat; + background-position: center; + min-width: 64px; + min-height: 64px; + border-radius: 10px; + } + .info { + font-family: Product Sans; + .music-title { + font-weight: bolder; + } + .music-artist { + color: $lightblack; + } + } + } + .lastrow { + padding: 10px 0px; + background-color: $dimblack; + border-bottom-right-radius: 12px; + border-bottom-left-radius: 12px; + .controls-container { + font-size: 16px; + font-family: Iosevka Nerd Font; + button { + transition: all ease .2s; + border-radius: 7px; + &:hover { background-color: $lightblack; } + &:active { background-color: transparent; } + &.previousbutton, &.nextbutton { padding: 1px 11px 1px 10px; } + &.pausebutton { + font-size: 20px; + padding: 1px 12px 1px 9px; + &.playing { + padding: 1px 14px 1px 7px; + } + } + } + } + } + } + .chart-container { + background-color: $black; + border-radius: 12px; + .header { + padding: 5px 10px; + font-family: Product Sans; + font-size: 14px; + color: $lightblack; + } + .body .container { + padding: 10px; + .chart-container { + background-color: $lightblack; + border-radius: 3em; + .chart { + color: $blue; + label { + padding: 1em; + font-size: 23px; + } + } + .chart-icon { + background-color: $black; + border-radius: 3em; + padding: 12px 5px; + margin: 0.5em; + font-family: Iosevka Nerd Font; + // nf alignment issues (again). + &.cpu { padding: 12px 9px 12px 4px; } + &.ram { padding: 12px 8px 12px 5px; } + &.temp { padding: 13px 9px 12px 3px; } + &.disk { padding: 13px 8px 12px 4px; } + } + } + } + } + } + } + .footer { + background-color: $bg; + padding: 10px 0px; + font-family: Product Sans; + .protipbox { + .icon { + font-family: Iosevka Nerd Font; + color: $yellow; + } + } + } +} diff --git a/eww/dashboard/dashboard.yuck b/eww/dashboard/dashboard.yuck new file mode 100644 index 00000000..749c30ab --- /dev/null +++ b/eww/dashboard/dashboard.yuck @@ -0,0 +1,385 @@ +(defwidget header [] + (box :class "headerbox" + :orientation "h" + :space-evenly false + (box :class "userbox" + :orientation "h" + :space-evenly false + :halign "start" + :valign "center" + :spacing 10 + (box :class "pfp" + :style "background-image: url('${pfp}');") + (box :class "pcname" + :orientation "h" + :space-evenly false + (label :text "${rawuser}" :class "username") + (label :text "@" :class "sep") + (label :text "${hostname}" :class "hostname") + ) + ) + (box :class "searchbox" + :orientation "h" + :space-evenly true + :halign "end" + :hexpand true + :valign "center" + (button :class "searchinput" + :onclick "~/.config/eww/scripts/exec rofi -show drun" + (box :class "searchinput-content" + :orientation "h" + :space-evenly false + :hexpand true + :halign "start" + :valign "center" + :vexpand true + (label :text "" :class "icon") + (label :text "Search Applications" :class "placeholder") + ) + ) + ) + ) +) + +(defwidget usercard [] + (box :class "usercard" + :orientation "v" + :space-evenly false + (box :class "user-content" + :orientation "h" + :space-evenly false + :vexpand true + :spacing 15 + (box :class "pfp" + :style "background-image: url('${pfp}');") + (box :class "info" + :hexpand true + :vexpand true + :valign "center" + :halign "start" + :orientation "v" + :space-evenly false + :spacing 3 + (label :text "${username}" :class "username" :halign "start") + (label :text "${uptime}" :class "uptime" :halign "start") + ) + ) + (box :class "user-powerbuttons" + :orientation "h" + :space-evenly false + :hexpand true + :halign "end" + :valign "end" + :spacing 5 + (button :class "reboot" + :onclick "doas poweroff" + "勒" + ) + (button :class "poweroff" + :onclick "doas poweroff" + "襤" + ) + ) + ) +) + +(defwidget control [name icon tooltip onclick active] + (box :class "control-container" + :orientation "h" + :hexpand true + :valign "center" + :space-evenly true + (button :class "control-item ${name} ${active ? 'active' : ''}" + :orientation "h" + :space-evenly true + :halign "center" + :hexpand false + :valign "center" + :onclick "${onclick}" + :tooltip "${tooltip}" + (label :text "${icon}" :class "control-icon") + ) + ) +) + +(defwidget quicksettings [] + (box :class "controlscard" + :orientation "v" + :space-evenly false + :spacing 20 + (box :class "firstrow" + :orientation "h" + :space-evenly true + (control :name "network${network_status == 'Connected' ? '' : '-disconnected'}" + :icon "${network_icon}" + :tooltip "Toggle network" + :active "${network_status == 'Connected' ? 'true' : 'false'}" + :onclick "~/.config/eww/scripts/network.sh toggle") + + (control :name "airplane" + :icon "${network_radio == 'on' ? '' : ''}" + :tooltip "Airplane Mode" + :active "${network_radio == 'on' ? false : true}" + :onclick "~/.config/eww/scripts/network.sh toggle-radio") + + (control :name "volume${is_muted == 'yes' ? '-muted' : ''}" + :icon "${volume_icon}" + :tooltip "Toggle muted" + :active "${is_muted == 'yes' ? false : true}" + :onclick "~/.config/eww/scripts/volume.sh toggle-muted") + + (control :name "mic${mic_status == 'yes' ? '-on' : ''}" + :icon "${mic_status == 'yes' ? '' : ''}" + :tooltip "Toggle microphone" + :active "${mic_status == 'yes' ? true : false}" + :onclick "~/.config/eww/scripts/mic toggle") + ) + (box :class "lastrow" + :orientation "h" + :space-evenly true + (control :name "redshift${redshift_state == 'on' ? '-on' : ''}" + :icon "${redshift_state == 'on' ? '' : ''}" + :tooltip "Toggle night light" + :active "${redshift_state == 'on' ? true : false}" + :onclick "~/.config/eww/scripts/redshift toggle") + + (control :name "bluetooth${bluetooth_state == 'on' ? '-on' : ''}" + :icon "${bluetooth_state == 'on' ? '' : ''}" + :tooltip "Toggle bluetooth" + :active "${bluetooth_state == 'on' ? true : false}" + :onclick "~/.config/eww/scripts/bluetooth toggle") + + (control :name "fullscreensht" + :icon "" + :tooltip "Take a full screenshot" + :active false + :onclick "~/.config/eww/scripts/screensht full") + + (control :name "areascreensht" + :icon "" + :tooltip "Take a screenshot of a selected area" + :active false + :onclick "~/.config/eww/scripts/screensht area") + ) + ) +) + +(defwidget sliders [] + (box :class "slidersbox" + :orientation "v" + :space-evenly false + :spacing 25 + (box :orientation "h" + :space-evenly "false" + :class "vol-slider" + (overlay + (scale :value volume_value + :onchange "~/.config/eww/scripts/volume.sh set {}" + :min 0 + :max 101) + (label :class "vol-label" + :text "${volume_icon} " + :valign "top" + :halign "start") + ) + ) + (box :orientation "h" + :space-evenly "false" + :class "br-slider" + (overlay + (scale :value br + :onchange "~/.config/eww/scripts/brightness.sh set {}" + :min 0 + :max 101) + (label :class "br-label" + :text "${br_icon} " + :valign "top" + :halign "start") + ) + ) + (box :orientation "h" + :space-evenly "false" + :class "mic-slider" + (overlay + (scale :value mic + :onchange "~/.config/eww/scripts/mic set {}" + :min 0 + :max 101) + (label :class "mic-label" + :text "${mic_status == 'yes' ? '' : ''} " + :valign "top" + :halign "start") + ) + ) + ) +) + +(defwidget music [] + (box :class "musicbox" + :orientation "v" + :space-evenly false + (box :class "firstrow" + :orientation "h" + :space-evenly false + :vexpand true + (box :class "picbox" + :orientation "v" + :space-evenly true + :style "background-image: url('${music_url}');" + music_pic + ) + (box :class "info" + :space-evenly false + :hexpand true + :valign "center" + :orientation "v" + :spacing 5 + (label :text "${music_title}" :class "music-title") + (label :text "${music_artist}" :class "music-artist") + ) + ) + (box :class "lastrow" + :orientation "h" + :space-evenly true + (box :class "controls-container" + :orientation "h" + :space-evenly true + (button :onclick "~/.config/eww/scripts/music/control.sh prev" + :class "previousbutton" + :halign "center" + "玲" + ) + (button :onclick "~/.config/eww/scripts/music/control.sh play-pause" + :class "pausebutton ${music_status == 'Playing' ? 'playing' : ''}" + :halign "center" + "${music_status == 'Playing' ? '' : ''}" + ) + (button :onclick "~/.config/eww/scripts/music/control.sh next" + :class "nextbutton" + :halign "center" + "怜" + ) + ) + ) + ) +) + +(defwidget chart [label value icon icon-class] + (box :class "chart-container" + :orientation "v" + :space-evenly false + (box :class "header" + :space-evenly true + :orientation "v" + (label :text "${label}" :class "label" :halign "start") + ) + (box :class "body" + :space-evenly true + :orientation "h" + (box :class "container" + :space-evenly true + :halign "center" + :hexpand true + :orientation "h" + (box :class "chart-container" :space-evenly false + (overlay + (circular-progress :value value + :thickness 50 + :class "chart" + :start-at 75 + (label :text "L") + ) + (label :text "${icon}" :class "chart-icon ${icon-class}") + ) + ) + ) + ) + ) +) + +(defwidget charts [] + (box :class "chartsbox" + :orientation "v" + :space-evenly false + :spacing 25 + (box :class "firstrow" + :orientation "h" + :space-evenly true + :spacing 25 + (chart :label "Cpu" :icon "" :icon-class "cpu" :value cpu) + (chart :label "Ram" :icon "" :icon-class "ram" :value ram) + ) + (box :class "lastrow" + :orientation "h" + :space-evenly true + :spacing 25 + (chart :label "Temp" :icon "" :icon-class "temp" :value temp) + (chart :label "Disk" :icon "" :icon-class "disk" :value disk) + ) + ) +) + +(defwidget footer [] + (box :class "footer" + :space-evenly true + :orientation "h" + :valign "end" + (box :class "protipbox" + :orientation "h" + :space-evenly false + :halign "center" + :spacing 15 + (label :text "ﯦ " :class "icon") + (label :text "Press the menu icon again to close this popup." :class "placeholder") + ) + ) +) + +(defwidget content [] + (box :class "content-container" + :orientation "v" + :space-evenly false + (box :class "contentbox" + :orientation "h" + :space-evenly true + :spacing 25 + :vexpand true + (box :class "firstcol" + :orientation "v" + :space-evenly false + :spacing 25 + (usercard) + (quicksettings) + (sliders) + ) + (box :class "lastcol" + :orientation "v" + :space-evenly false + :spacing 25 + (music) + (charts) + ) + ) + (footer) + ) +) + +(defwidget dashboard [] + (box :class "dashboardbox" + :orientation "v" + :space-evenly false + (header) + (content) + ) +) + +(defwindow dashboard + :monitor 0 + :geometry (geometry :x "6px" + :y "-44px" + :width "10px" ; automatically adjusted by eww + :height "10px" ; automatically adjusted by eww + :anchor "bottom center") + :type "dock" + :wm-ignore false +(dashboard)) diff --git a/eww/date/date.scss b/eww/date/date.scss new file mode 100644 index 00000000..991cc169 --- /dev/null +++ b/eww/date/date.scss @@ -0,0 +1,71 @@ +.date { + background-color: $bg; + color: $fg; + border-radius: 4px; +} + +.timebox { + margin: 30px 0px; + .time-container { + .content { + font-family: Product Sans; + font-weight: bolder; + font-size: 60px; + } + .divider { + margin: 8px 15px; + padding: 0px 1px; + background: linear-gradient($red, $magenta, $blue, $cyan); + } + } + .date-container { + font-family: Product Sans; + margin-top: 2px; + } +} + +.cal-box { + font-family: Product Sans; + background-color: $bg; + border-radius: 4px; + padding: 0 1rem .2rem; + color: $fg; + background-color: $contrastbg; + margin: 0px 12px 12px 12px; + + .cal { + background-color: inherit; + padding: .5rem .10rem 0rem; + margin-left: 10px; + + & > * { + border: solid 0px transparent; + } + + &.highlight { + padding: 10rem; + } + } +} + +calendar:selected { + color: $cyan; +} + +calendar.header { + color: $cyan; + font-weight: bold; +} + +calendar.button { + color: $cyan; +} + +calendar.highlight { + color: $green; + font-weight: bold; +} + +calendar:indeterminate { + color: $lightblack; +} \ No newline at end of file diff --git a/eww/date/date.yuck b/eww/date/date.yuck new file mode 100644 index 00000000..1617ea04 --- /dev/null +++ b/eww/date/date.yuck @@ -0,0 +1,57 @@ +(defwidget divider [] + (box :class "divider" + :orientation "v" + :space-evenly true) +) + +(defwidget time [] + (box :class "timebox" + :orientation "v" + :space-evenly false + (box :class "time-container" + :orientation "h" + :space-evenly false + :halign "center" + :valign "center" + (label :text "${lithour}" :class "content") + (divider) + (label :text "${litmin}" :class "content") + ) + (box :class "date-container" + :orientation "h" + :space-evenly true + :halign "center" + (label :text "${completeday}") + ) + ) +) + +(defwidget cal [] + (box :class "cal-box" + :orientation "v" + :space-evenly false + (calendar :class "cal" + :day calendar_day + :month calendar_month + :year calendar_year) + ) +) + +(defwidget date [] + (box :class "date" + :orientation "v" + :space-evenly false + (time) + (cal) + ) +) + +(defwindow date + :monitor 0 + :geometry (geometry :x "6px" + :y "-44px" + :width "0px" ; automatically generated + :height "0px" ; automatically generated + :anchor "left bottom") + :wm-ignore true +(date)) diff --git a/eww/eww.scss b/eww/eww.scss new file mode 100644 index 00000000..0a4190be --- /dev/null +++ b/eww/eww.scss @@ -0,0 +1,9 @@ +* { + all: unset; +} + +@import "colors.scss"; +@import "date/date.scss"; +@import "actions/actions.scss"; +@import "powermenu/powermenu.scss"; +@import "dashboard/dashboard.scss"; diff --git a/eww/eww.yuck b/eww/eww.yuck new file mode 100644 index 00000000..88a0dfed --- /dev/null +++ b/eww/eww.yuck @@ -0,0 +1,5 @@ +(include "variables.yuck") +(include "date/date.yuck") +(include "actions/actions.yuck") +(include "powermenu/powermenu.yuck") +(include "dashboard/dashboard.yuck") diff --git a/eww/powermenu/powermenu.scss b/eww/powermenu/powermenu.scss new file mode 100644 index 00000000..9f258927 --- /dev/null +++ b/eww/powermenu/powermenu.scss @@ -0,0 +1,27 @@ +.powermenu { + background-color: $bg; + color: $fg; + padding: 20px; + font-family: Iosevka Nerd Font; + font-size: 70px; + border-radius: 30px; + border: 5px solid $contrastbg; + button { + border-radius: 12px; + min-width: 80px; + transition: all ease .2s; + &:hover { background-color: $bgSecondary; } + &:active { background-color: $bg; } + .content { + border-radius: 4px; + padding: 0px 15px 0px 15px; + } + } + .shutdown { color: $red; } + .reboot { color: $magenta; } + .logout { color: $yellow; } +} + +.powermenu-clickhandler { + background-color: black; +} diff --git a/eww/powermenu/powermenu.yuck b/eww/powermenu/powermenu.yuck new file mode 100644 index 00000000..2abfffa6 --- /dev/null +++ b/eww/powermenu/powermenu.yuck @@ -0,0 +1,56 @@ +(defwidget powermenu [] + (box :class "powermenu" + :orientation "h" + :space-evenly true + :spacing 20 + (button :class "shutdown" + :onclick "systemctl poweroff" + (label :text "襤" :class "content") + ) + (button :class "reboot" + :onclick "systemctl reboot" + (label :text "勒" :class "content") + ) + (button :class "logout" + :onclick "swaymsg exit" + (label :text "" :class "content") + ) + ) +) + +(defwidget powermenu-clickhandler [] + (button :class "powermenu-clickhandler" + :onclick "eww -c ~/.config/eww close powermenu powermenu-clickhandler" + "" + ) +) + +(defwindow powermenu-clickhandler + :monitor 0 + :geometry (geometry :x "0px" + :y "0px" + :width "100%" + :height "100%" + :anchor "center") + :wm-ignore true +(powermenu-clickhandler)) + +(defwindow powermenu + :monitor 0 + :geometry (geometry :x "0px" + :y "0px" + :width "500px" + :height "150px" + :anchor "center") + :wm-ignore true +(powermenu)) + +(defwidget closer [window] + (eventbox :onclick "eww close ${window} && eww close ${window}-closer")) + +(defwindow powermenu-closer + :monitor 0 + :geometry (geometry :width "100%" :height "100%") + :stacking "fg" + :focusable false + (closer :window "powermenu")) diff --git a/eww/scripts/bluetooth b/eww/scripts/bluetooth new file mode 100755 index 00000000..e735c626 --- /dev/null +++ b/eww/scripts/bluetooth @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +get_state () { + state=$(bluetoothctl show | grep 'Powered' | awk '{print $2}') + if [[ $state == "yes" ]]; then + echo on + else + echo off + fi +} + +turn_off () { + bluetoothctl power off 2>&1 > /dev/null +} + +turn_on () { + bluetoothctl power on 2>&1 > /dev/null +} + +toggle () { + state=$(get_state) + if [[ $state == "on" ]]; then + turn_off + else + turn_on + fi +} + +if [[ $1 == "state" ]]; then + get_state +fi + +if [[ $1 == "toggle" ]]; then + toggle +fi diff --git a/eww/scripts/brightness.sh b/eww/scripts/brightness.sh new file mode 100755 index 00000000..a14734c7 --- /dev/null +++ b/eww/scripts/brightness.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# @requires: brightnessctl + +percentage () { + local val=$(echo $1 | tr '%' ' ' | awk '{print $1}') + local icon1=$2 + local icon2=$3 + local icon3=$4 + local icon4=$5 + if [ "$val" -le 15 ]; then + echo $icon1 + elif [ "$val" -le 30 ]; then + echo $icon2 + elif [ "$val" -le 60 ]; then + echo $icon3 + else + echo $icon4 + fi +} + +get_brightness () { + (( br = $(brightnessctl get) * 100 / $(brightnessctl max) )) + echo $br +} + +get_percent () { + echo $(get_brightness)% +} + +get_icon () { + local br=$(get_percent) + echo $(percentage "$br" "" "" "" "") +} + +if [[ $1 == "br" ]]; then + get_brightness +fi + +if [[ $1 == "percent" ]]; then + get_percent +fi + +if [[ $1 == "icon" ]]; then + get_icon +fi + +if [[ $1 == "set" ]]; then + light -S $2 +fi \ No newline at end of file diff --git a/eww/scripts/cpu.sh b/eww/scripts/cpu.sh new file mode 100755 index 00000000..0afb9e36 --- /dev/null +++ b/eww/scripts/cpu.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}' | tr '.' ' ' | awk '{print $1}' \ No newline at end of file diff --git a/eww/scripts/disk.sh b/eww/scripts/disk.sh new file mode 100755 index 00000000..5717c074 --- /dev/null +++ b/eww/scripts/disk.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +df --output=pcent / | tail -n 1 | sed 's/%//g' | awk '{print $1}' \ No newline at end of file diff --git a/eww/scripts/exec b/eww/scripts/exec new file mode 100755 index 00000000..b821a3c9 --- /dev/null +++ b/eww/scripts/exec @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +cd ~ +${@} 2>&1 >/dev/null & diff --git a/eww/scripts/mic b/eww/scripts/mic new file mode 100755 index 00000000..8853778a --- /dev/null +++ b/eww/scripts/mic @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +# @requires: pactl + +SINK=$(pactl list short sinks | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,' | head -n 1) + +status () { + status=$(pactl get-source-mute $SINK | awk '{print $2}') + if [[ $status == 'yes' ]]; then + echo no + else + echo yes + fi +} + +set_volume () { + local max_db=65536 + local percent=$1 + + # getting the $percent% of $max_db + local value=$(jq -n ${percent}/100*${max_db} | sed 's/\./ /g' | awk '{print $1}') + + # set volume + pacmd set-source-volume $SINK $value +} + +get () { + local enabled=$(status) + if [[ $enabled == 'no' ]]; then + echo '0' + else + pacmd list short sinks | grep volume:\ front | tail -n 1 | awk '{print $5}' | sed 's/%//g' + fi +} + +percentage () { + local val=$(get) + echo "${val}%" +} + +_ () { + ${@} + exit 0 +} + +if [[ $1 == "status" ]]; then + _ status +fi + +if [[ $1 == "toggle" ]]; then + _ pactl set-source-mute $SINK toggle +fi + +if [[ $1 == "set" ]]; then + _ set_volume ${2} +fi + +if [[ $1 == "get" ]]; then + _ get +fi + +if [[ $1 == "percent" ]]; then + _ percentage +fi diff --git a/eww/scripts/music/control.sh b/eww/scripts/music/control.sh new file mode 100755 index 00000000..8f1d108c --- /dev/null +++ b/eww/scripts/music/control.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +if [[ $1 == "prev" ]]; then + playerctl previous +fi + +if [[ $1 == "play-pause" ]]; then + playerctl play-pause +fi + +if [[ $1 == "next" ]]; then + playerctl next +fi diff --git a/eww/scripts/music/songart.sh b/eww/scripts/music/songart.sh new file mode 100755 index 00000000..7ddb2fb5 --- /dev/null +++ b/eww/scripts/music/songart.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# thanks to kizu + +get_song_art () { + TMP_DIR="$HOME/.cache/eww" + TMP_COVER_PATH=$TMP_DIR/cover.png + TMP_TEMP_PATH=$TMP_DIR/temp.png + + if [[ ! -d $TMP_DIR ]]; then + mkdir -p $TMP_DIR + fi + + ART_FROM_SPOTIFY="$(playerctl -p %any,spotify metadata mpris:artUrl | sed -e 's/open.spotify.com/i.scdn.co/g')" + ART_FROM_BROWSER="$(playerctl -p %any,mpd,firefox,chromium,brave metadata mpris:artUrl | sed -e 's/file:\/\///g')" + + if [[ $(playerctl -p spotify,%any,firefox,chromium,brave,mpd metadata mpris:artUrl) ]]; then + curl -s "$ART_FROM_SPOTIFY" --output $TMP_TEMP_PATH + elif [[ -n $ART_FROM_BROWSER ]]; then + cp $ART_FROM_BROWSER $TMP_TEMP_PATH + else + cp $HOME/.config/eww/assets/fallback.png $TMP_TEMP_PATH + fi + + cp $TMP_TEMP_PATH $TMP_COVER_PATH + + # an epic effekt + # convert $TMP_TEMP_PATH -alpha set -channel A -evaluate multiply 1.0 $TMP_COVER_PATH + # convert $TMP_TEMP_PATH -gravity center +repage -alpha set -channel A \ + # -sparse-color Barycentric '%[fx:w*2/32],0 transparent %[fx:w+0.5],0 opaque' \ + # -evaluate multiply 0.45 \ + # $TMP_COVER_PATH +} + +echo_song_art_url () { + echo "$HOME/.cache/eww/cover.png" +} + +if [[ $1 == "echo" ]]; then + echo_song_art_url +fi + +if [[ $1 == "get" ]]; then + get_song_art +fi diff --git a/eww/scripts/music/songdata.sh b/eww/scripts/music/songdata.sh new file mode 100755 index 00000000..71d4b131 --- /dev/null +++ b/eww/scripts/music/songdata.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +capitalize () { + toshow="$1" + maxlen="$2" + + sufix="" + + if test $(echo $toshow | wc -c) -ge $maxlen ; then + sufix=" ..." + fi + + echo "${toshow:0:$maxlen}$sufix" +} + +withSafe () { + local txt="$1" + local safe="$2" + if [[ $txt == "" ]]; then + echo $safe + else + echo $txt + fi +} + +if [[ $1 == "title" ]]; then + capitalize "$(playerctl metadata --format "{{title}}" || echo "Nothing playing")" 18 +fi + +if [[ $1 == "artist" ]]; then + withSafe "$(capitalize "$(playerctl metadata --format "{{artist}}" || echo "No artist")" 18)" "No artist detected" +fi + +if [[ $1 == "status" ]]; then + playerctl status || echo 'Paused' +fi diff --git a/eww/scripts/network.sh b/eww/scripts/network.sh new file mode 100755 index 00000000..f8bb27a2 --- /dev/null +++ b/eww/scripts/network.sh @@ -0,0 +1,101 @@ +#!/bin/bash + +symbol() { + [ $(cat /sys/class/net/w*/operstate) = down ] && echo 睊 && exit + echo  +} + +name() { + iwgetid -r +} + +cut () { + toshow="$1" + maxlen="$2" + + sufix="" + + if test $(echo $toshow | wc -c) -ge $maxlen ; then + sufix=" ..." + fi + + echo "${toshow:0:$maxlen}$sufix" +} + +[ "$1" = "icon" ] && symbol + +if [[ $1 == "ssid" ]]; then + ssid=$(name) + if [[ "$ssid" == "" ]]; then + cut "Disconnected" 10 + else + cut "$ssid" 10 + fi +fi + +if [[ $1 == "name" || $1 == "class" ]]; then + wifiname=$(name) + if [[ $wifiname == "" ]]; then + if [[ $1 == "name" ]]; then + echo "Disconnected" + elif [[ $1 == "class" ]]; then + echo "disconnected" + fi + else + if [[ $1 == "name" ]]; then + echo "Connected to $wifiname" + elif [[ $1 == "class" ]]; then + echo "connected" + fi + fi +fi + +if [[ $1 == "status" ]]; then + name=$(name) + if [[ $name != "" ]]; then + echo "Connected" + else + echo "Disconnected" + fi +fi + +if [[ $1 == "disconnect" ]]; then + wifiname=$(nmcli d | grep wifi | sed 's/^.*wifi.*connected//g' | xargs) + nmcli con down id "${wifiname}" +fi + +if [[ $1 == "connect" ]]; then + nmcli con up ifname "$(/usr/bin/ls /sys/class/ieee80211/*/device/net/)" +fi + +if [[ $1 == "toggle" ]]; then + name=$(name) + if [[ "$name" == "" ]]; then + nmcli con up ifname "$(/usr/bin/ls /sys/class/ieee80211/*/device/net/)" + else + wifiname=$(nmcli d | grep wifi | sed 's/^.*wifi.*connected//g' | xargs) + nmcli con down id "${wifiname}" + fi +fi + +radio_status () { + radio_status=$(nmcli radio wifi) + if [[ $radio_status == "enabled" ]]; then + echo "on" + else + echo "off" + fi +} + +if [[ $1 == "radio-status" ]]; then + radio_status +fi + +if [[ $1 == "toggle-radio" ]]; then + stat=$(radio_status) + if [[ $stat == "on" ]]; then + nmcli radio wifi off + else + nmcli radio wifi on + fi +fi diff --git a/eww/scripts/pfp.sh b/eww/scripts/pfp.sh new file mode 100755 index 00000000..c2105170 --- /dev/null +++ b/eww/scripts/pfp.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +declare -a profiles_photos=("$HOME/.face.jpg" "$HOME/.face.png") + +for pfp in ${profiles_photos[@]}; do + if test -f $pfp; then + echo $pfp + exit 0 + fi +done + +echo $HOME/.config/dk/eww/assets/default-pfp.png diff --git a/eww/scripts/ram.sh b/eww/scripts/ram.sh new file mode 100755 index 00000000..a2f00652 --- /dev/null +++ b/eww/scripts/ram.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +percentage () { + local val=$(echo $1 | tr '%' ' ' | awk '{print $1}') + local icon1=$2 + local icon2=$3 + local icon3=$4 + local icon4=$5 + if [ "$val" -le 15 ]; then + echo $icon1 + elif [ "$val" -le 30 ]; then + echo $icon2 + elif [ "$val" -le 60 ]; then + echo $icon3 + else + echo $icon4 + fi +} + +get_ram () { + free -m | grep Mem | awk '{print ($3/$2)*100}' | tr '.' ' ' | awk '{print $1}' +} + +get_percent () { + echo $(get_ram)% +} + +get_class () { + local percent=$(get_percent) + echo $(percentage "$percent" "yellow" "magenta" "purple" "red") +} + +if [[ $1 == "ram" ]]; then + get_ram +fi + +if [[ $1 == "percent" ]]; then + get_percent +fi + +if [[ $1 == "class" ]]; then + get_class +fi \ No newline at end of file diff --git a/eww/scripts/redshift b/eww/scripts/redshift new file mode 100755 index 00000000..38ce6a99 --- /dev/null +++ b/eww/scripts/redshift @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +cache_file=$HOME/.cache/eww/services/redshift_state + +initial_hook () { + if [ ! -d $(dirname $cache_file) ]; then + mkdir -p $(dirname $cache_file) + fi + if [ ! -f $cache_file ]; then + echo off > $cache_file + fi +} + +get_state () { + # check if redshift is running + cat $cache_file +} + +restore () { + local state=$(get_state) + if [[ $state == "on" ]]; then + enable_redshift + else + disable_redshift + fi +} + +disable_redshift () { + redshift -x 2>&1 > /dev/null + # saving state + echo off > $cache_file +} + +enable_redshift () { + redshift -x 2>&1 > /dev/null + redshift -O 5000 2>&1 > /dev/null + # saving new state + echo on > $cache_file +} + +toggle () { + local state=$(get_state) + if [[ $state == "on" ]]; then + disable_redshift + else + enable_redshift + fi +} + +initial_hook + +if [[ $1 == "state" ]]; then + get_state +fi + +if [[ $1 == "enable" ]]; then + enable_redshift +fi + +if [[ $1 == "disable" ]]; then + disable_redshift +fi + +if [[ $1 == "toggle" ]]; then + toggle +fi + +if [[ $1 == "restore" ]]; then + restore +fi diff --git a/eww/scripts/screensht b/eww/scripts/screensht new file mode 100755 index 00000000..85de3a78 --- /dev/null +++ b/eww/scripts/screensht @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +TMP_PATH="$HOME/.cache/eww/tmp-screenshot.png" + +report () { + xclip -selection clipboard -target image/png -i $TMP_PATH + notify-send -i $TMP_PATH -a Screenshot "Screenshot" "Screenshot copied successfully" +} + +recollect () { + rm $TMP_PATH +} + +full () { + maim $TMP_PATH +} + +area () { + maim --select $TMP_PATH +} + +if [[ $1 == "full" ]]; then + full + report + recollect +fi + +if [[ $1 == "area" ]]; then + area + report + recollect +fi + +exit 0 diff --git a/eww/scripts/temp.sh b/eww/scripts/temp.sh new file mode 100755 index 00000000..92be6424 --- /dev/null +++ b/eww/scripts/temp.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# thanks to rxyhn + +path () { + local temp_path=null + for i in /sys/class/hwmon/hwmon*/temp*_input; + do + temp_path="$(echo "$(<$(dirname $i)/name): $(cat ${i%_*}_label 2>/dev/null || + echo $(basename ${i%_*})) $(readlink -f $i)");" + label="$(echo $temp_path | awk '{print $2}')" + if [ "$label" = "Package" ]; + then + echo ${temp_path} | awk '{print $5}' | tr -d ';\n' + exit; + fi + done +} + +get () { + local path=$(path) + if [[ $path == "" ]]; then + path="/sys/class/thermal/thermal_zone0/temp" + fi + + local max_temp=100 + local temp=$(cat $path) + + jq -n $(jq -n $temp/1000)/$max_temp*100 +} + +_ () { + ${@} + exit 0 +} + +if [[ $1 == "get" ]]; then + _ get +fi \ No newline at end of file diff --git a/eww/scripts/user.sh b/eww/scripts/user.sh new file mode 100755 index 00000000..29568c80 --- /dev/null +++ b/eww/scripts/user.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +name () { + username=$(whoami) + echo ${username^} +} + +name \ No newline at end of file diff --git a/eww/scripts/volume.sh b/eww/scripts/volume.sh new file mode 100755 index 00000000..9befb47f --- /dev/null +++ b/eww/scripts/volume.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# @requires: pactl + +#SINK=$(pactl list short sinks | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,' | head -n 1) +SINK="@DEFAULT_SINK@" + +percentage () { + local val=$(echo $1 | tr '%' ' ' | awk '{print $1}') + local icon1=$2 + local icon2=$3 + local icon3=$4 + local icon4=$5 + if [ "$val" -le 15 ]; then + echo $icon1 + elif [ "$val" -le 30 ]; then + echo $icon2 + elif [ "$val" -le 60 ]; then + echo $icon3 + else + echo $icon4 + fi +} + +is_muted () { + pacmd list-sinks | awk '/muted/ { print $2 }' +} + +get_percentage () { + local muted=$(is_muted) + if [[ $muted == 'yes' ]]; then + echo 0% + else + vol=$(pactl get-sink-volume @DEFAULT_SINK@ | grep Volume | awk '{print $5}' | tr % " ") + echo "${vol}%" + fi +} + +get_icon () { + local vol=$(get_percentage) + if [[ $vol == "0%" ]]; then + echo "婢" + else + echo $(percentage "$vol" "" "" "墳" "") + fi +} + +get_class () { + local vol=$(get_percentage) + if [[ $vol == "0%" ]]; then + echo "red" + else + echo $(percentage "$vol" "red" "magenta" "yellow" "blue") + fi +} + +get_vol () { + #local percent=$(get_percentage) + #echo $percent | tr -d '%' + echo $(pactl get-sink-volume @DEFAULT_SINK@ | grep Volume | awk '{print $5}' | tr % " ") +} + +if [[ $1 == "icon" ]]; then + get_icon +fi + +if [[ $1 == "class" ]]; then + get_class +fi + +if [[ $1 == "percentage" ]]; then + get_percentage +fi + +if [[ $1 == "vol" ]]; then + get_vol +fi + +if [[ $1 == "muted" ]]; then + is_muted +fi + +if [[ $1 == "toggle-muted" ]]; then + pactl set-sink-mute $SINK toggle +fi + +if [[ $1 == "set" ]]; then + val=$(echo $2 | tr '.' ' ' | awk '{print $1}') + if test $val -gt 100; then + val=100 + fi + pactl set-sink-volume $SINK $val% +fi diff --git a/eww/scripts/volume.sh.bak b/eww/scripts/volume.sh.bak new file mode 100755 index 00000000..e025a13e --- /dev/null +++ b/eww/scripts/volume.sh.bak @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +VOLUME=$(pactl get-sink-volume @DEFAULT_SINK@ | grep Volume | awk '{print $5}' | tr % " ") + +function icon { + if [[ $VOLUME -ge 66 ]]; then echo '󰕾' + elif [[ $VOLUME -ge 33 ]]; then echo '󰖀' + elif [[ $VOLUME -ge 1 ]]; then echo '󰕿' + else echo '󰝟' + fi +} + +function level { + echo $(pactl get-sink-volume @DEFAULT_SINK@ | grep Volume | awk '{print $5}' | tr % " ") +} + + +function lower { + pactl set-sink-volume @DEFAULT_SINK@ -5% + update +} + +function raise { + pactl set-sink-volume @DEFAULT_SINK@ +5% + update +} + +function update { + eww update volume="$(get)" + ~/.config/eww/scripts/osd $(icon) $(level) +} + +function type_icon { + SINK=$(pactl get-default-sink) + if [[ $SINK == *'bluez_output'* ]]; then echo "󰋋" + else echo "󰓃" + fi +} + +function mute_state { + STATE=$(pactl get-source-mute @DEFAULT_SOURCE@ | awk '{print $2}') + if [[ $STATE == 'no' ]]; then echo 'off' + else echo 'on'; fi +} + +function mute_icon { + STATE=$(mute_state) + if [[ $STATE == 'off' ]]; then echo '󰍬' + else echo '󰍭'; fi +} + +function mute_toggle { + pactl set-source-mute @DEFAULT_SOURCE@ toggle + eww update volume="$(get)" +} + +function set { + pactl set-sink-volume @DEFAULT_SINK@ $1"%" + eww update volume="$(get)" +} + +function get { + echo "{ + \"level\": \"$(level)\", + \"icon\": \"$(icon)\", + \"type_icon\": \"$(type_icon)\", + \"mute\": { + \"state\": \"$(mute_state)\", + \"icon\": \"$(mute_icon)\" + } + }" +} + +if [[ $1 == 'mute_toggle' ]]; then mute_toggle; fi +if [[ $1 == 'down' ]]; then lower; fi +if [[ $1 == 'up' ]]; then raise; fi +if [[ $1 == 'set' ]]; then set $2; fi +if [[ $1 == 'get' ]]; then get; fi diff --git a/eww/variables.yuck b/eww/variables.yuck new file mode 100644 index 00000000..1cb8c11b --- /dev/null +++ b/eww/variables.yuck @@ -0,0 +1,46 @@ +(defpoll network_status :interval "1s" "~/.config/eww/scripts/network.sh status") +(defpoll network_icon :interval "1s" "~/.config/eww/scripts/network.sh icon") +(defpoll network_radio :interval "1s" "~/.config/eww/scripts/network.sh radio-status") +(defpoll network_ssid :interval "1s" "~/.config/eww/scripts/network.sh ssid") + +(defpoll volume_icon :interval "1s" "~/.config/eww/scripts/volume.sh icon") +(defpoll volume :interval "1s" "~/.config/eww/scripts/volume.sh percentage") +(defpoll volume_value :interval "1s" "~/.config/eww/scripts/volume.sh vol") +(defpoll is_muted :interval "1s" "~/.config/eww/scripts/volume.sh muted") + +(defpoll mic :interval "1s" "~/.config/eww/scripts/mic get") +(defpoll mic_status :interval "1s" "~/.config/eww/scripts/mic status") + +(defpoll bluetooth_state :interval "1s" "~/.config/eww/scripts/bluetooth state") +(defpoll redshift_state :interval "1s" "~/.config/eww/scripts/redshift state") + +(defpoll pfp :interval "1s" "~/.config/eww/scripts/pfp.sh") +(defpoll rawuser :interval "30s" "whoami") +(defpoll username :interval "30s" "~/.config/eww/scripts/user.sh") +(defpoll hostname :interval "30s" "cat /etc/hostname") +(defpoll uptime :interval "30s" "uptime -p") + +(defpoll br_icon :interval "1s" "~/.config/eww/scripts/brightness.sh icon") +(defpoll br :interval "1s" "~/.config/eww/scripts/brightness.sh br") + +(defpoll music_pic :interval "2s" "~/.config/eww/scripts/music/songart.sh get") +(defpoll music_url :interval "2s" "~/.config/eww/scripts/music/songart.sh echo") + +(defpoll music_title :interval "1s" "~/.config/eww/scripts/music/songdata.sh title") +(defpoll music_artist :interval "1s" "~/.config/eww/scripts/music/songdata.sh artist") +(defpoll music_status :interval "1s" "~/.config/eww/scripts/music/songdata.sh status") + +(defpoll completeday :interval "1h" "date '+%A, %d %B'") +(defpoll lithour :interval "30m" "date +%H") +(defpoll litmin :interval "30s" "date +%M") +(defpoll calendar_day :interval "10h" "date '+%d'") +(defpoll calendar_month :interval "10h" "date '+%m") +(defpoll calendar_year :interval "10h" "date '+%Y'") +(defpoll date :interval "30s" "date '+%d %b, %I:%M %p'") +(defpoll shortday :interval "1h" "date '+%d %b %y'") +(defpoll weekday :interval "24h" "date +%A") + +(defpoll cpu :interval "3s" "~/.config/eww/scripts/cpu.sh") +(defpoll ram :interval "3s" "~/.config/eww/scripts/ram.sh ram") +(defpoll temp :interval "3s" "~/.config/eww/scripts/temp.sh get") +(defpoll disk :interval "3s" "~/.config/eww/scripts/disk.sh") \ No newline at end of file