✨ ags,hypr: initial code!
@@ -0,0 +1,2 @@
|
||||
node_modules/
|
||||
@girs/
|
||||
@@ -0,0 +1,13 @@
|
||||
import { Gio, monitorFile, readFile, Process } from "astal";
|
||||
import { App } from "astal/gtk3"
|
||||
|
||||
import { Bar } from "./window/Bar";
|
||||
import { runStyleHandler } from "./scripts/style-handler";
|
||||
|
||||
runStyleHandler();
|
||||
|
||||
App.start({
|
||||
main() {
|
||||
Bar(0);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
declare const SRC: string
|
||||
|
||||
declare module "inline:*" {
|
||||
const content: string
|
||||
export default content
|
||||
}
|
||||
|
||||
declare module "*.scss" {
|
||||
const content: string
|
||||
export default content
|
||||
}
|
||||
|
||||
declare module "*.blp" {
|
||||
const content: string
|
||||
export default content
|
||||
}
|
||||
|
||||
declare module "*.css" {
|
||||
const content: string
|
||||
export default content
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "astal-shell",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "astal-shell",
|
||||
"dependencies": {
|
||||
"astal": "/usr/share/astal/gjs"
|
||||
}
|
||||
},
|
||||
"../../../../usr/share/astal/gjs": {
|
||||
"name": "astal",
|
||||
"license": "LGPL-2.1"
|
||||
},
|
||||
"node_modules/astal": {
|
||||
"resolved": "../../../../usr/share/astal/gjs",
|
||||
"link": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "astal-shell",
|
||||
"dependencies": {
|
||||
"astal": "/usr/share/astal/gjs"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { readFile } from "astal";
|
||||
import { getUserDirs } from "./user";
|
||||
|
||||
export abstract class Wal {
|
||||
getColors(): JSON {
|
||||
return JSON.parse(
|
||||
readFile(`${getUserDirs().cache}/wal/colors.json`)!
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
// handles reloading stylesheet and pywal colors
|
||||
|
||||
import { readFile, monitorFile, Process, Gio } from "astal";
|
||||
import { App } from "astal/gtk3";
|
||||
import { getUserDirs } from "./user";
|
||||
|
||||
const stylePath = `${getUserDirs().state}/ags/style`
|
||||
const watchPaths = [
|
||||
"./style",
|
||||
"./style.scss"
|
||||
];
|
||||
|
||||
export function runStyleHandler(): void {
|
||||
reloadStyle();
|
||||
watch();
|
||||
}
|
||||
|
||||
export function reloadStyle(): void {
|
||||
compileStyle();
|
||||
applyStyle();
|
||||
}
|
||||
|
||||
export function compileStyle(): void {
|
||||
console.log("[LOG] Compiling sass (stylesheet)");
|
||||
Process.exec(`mkdir -p ${stylePath}`);
|
||||
Process.exec(`bash -c "sass -I ./style ./style.scss ${stylePath}/style.css"`);
|
||||
}
|
||||
|
||||
export function applyStyle(): void {
|
||||
console.log("[LOG] Applying stylesheet");
|
||||
App.reset_css();
|
||||
App.apply_css(
|
||||
readFile(`${stylePath}/style.css`)!
|
||||
);
|
||||
}
|
||||
|
||||
function watch(): void {
|
||||
// Monitor changes on stylesheet at runtime
|
||||
watchPaths.map((path: string) =>
|
||||
monitorFile(
|
||||
`${path}`,
|
||||
(file: string) => {
|
||||
console.log(`[LOG] Stylesheet ${file} file updated`)
|
||||
compileStyle();
|
||||
applyStyle();
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
// Monitor PyWal colorscheme file
|
||||
monitorFile(
|
||||
`${getUserDirs().cache}/wal/colors.scss`,
|
||||
(file: string) => {
|
||||
Process.exec(`bash -c "cp -f ${file} ./style/_wal.scss"`)
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
import { GLib } from "astal";
|
||||
|
||||
export function getUserDirs() {
|
||||
return {
|
||||
home: GLib.getenv("HOME"),
|
||||
state: GLib.getenv("XDG_STATE_HOME"),
|
||||
cache: GLib.getenv("XDG_CACHE_HOME"),
|
||||
config: GLib.getenv("XDG_CONFIG_HOME"),
|
||||
data: GLib.getenv("XDG_DATA_HOME")
|
||||
} as const;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
@use "./style/bar";
|
||||
@use "./style/wal";
|
||||
|
||||
* {
|
||||
all: unset;
|
||||
transition: 120ms linear;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 6px;
|
||||
border-radius: 12px;
|
||||
|
||||
&:hover {
|
||||
background: wal.$color1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
@use "./_wal";
|
||||
|
||||
.bar-container {
|
||||
padding: 6px;
|
||||
padding-bottom: 0px;
|
||||
.bar-centerbox > * {
|
||||
background: rgba($color: wal.$background, $alpha: .6);
|
||||
padding: 6px;
|
||||
border-radius: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
label {
|
||||
font-size: 12px;
|
||||
font-family: "Cantarell", "Noto Sans";
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.workspaces {
|
||||
& button {
|
||||
transition: 80ms linear;
|
||||
padding: 0 12px;
|
||||
background: wal.$color1;
|
||||
margin: 3px 2px;
|
||||
|
||||
&.focus {
|
||||
background: wal.$foreground;
|
||||
padding: 0 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.logo button {
|
||||
$padding-inline: 12px;
|
||||
padding-left: $padding-inline;
|
||||
padding-right: calc($padding-inline + 3.9px);
|
||||
|
||||
& label {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.cc-toggle button {
|
||||
$padding-inline: 12px;
|
||||
padding-left: $padding-inline;
|
||||
padding-right: calc($padding-inline + 2px);
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// SCSS Variables
|
||||
// Generated by 'wal'
|
||||
$wallpaper: "/home/joaov/wallpapers/Garden Kita.png";
|
||||
|
||||
// Special
|
||||
$background: #101212;
|
||||
$foreground: #c3c3c3;
|
||||
$cursor: #c3c3c3;
|
||||
|
||||
// Colors
|
||||
$color0: #101212;
|
||||
$color1: #59662a;
|
||||
$color2: #517047;
|
||||
$color3: #87863c;
|
||||
$color4: #707b48;
|
||||
$color5: #4b6266;
|
||||
$color6: #84876e;
|
||||
$color7: #8e9898;
|
||||
$color8: #596d6d;
|
||||
$color9: #778839;
|
||||
$color10: #6C965F;
|
||||
$color11: #B4B350;
|
||||
$color12: #96A460;
|
||||
$color13: #658388;
|
||||
$color14: #B0B493;
|
||||
$color15: #c3c3c3;
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/tsconfig",
|
||||
"compilerOptions": {
|
||||
"experimentalDecorators": true,
|
||||
"strict": true,
|
||||
"target": "ES2022",
|
||||
"module": "ES2022",
|
||||
"moduleResolution": "Bundler",
|
||||
"checkJs": true,
|
||||
"allowJs": true,
|
||||
"jsx": "react-jsx",
|
||||
"jsxImportSource": "astal/gtk3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
import {Process} from "astal";
|
||||
import { Box, Button } from "astal/gtk3/widget";
|
||||
|
||||
export function CCToggle() {
|
||||
return (
|
||||
<Box className={"cc-toggle"}>
|
||||
<Button onClick={() => Process.exec("eww open --toggle control-center")}
|
||||
label={""}/>
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import { Box, Button } from "astal/gtk3/widget";
|
||||
import { GLib, Variable } from "astal";
|
||||
|
||||
const dateTimeFormat = "%A %d, %H:%M"
|
||||
const time = new Variable<string>("").poll(600, () =>
|
||||
GLib.DateTime.new_now_local().format(dateTimeFormat)!);
|
||||
|
||||
export function Clock(): JSX.Element {
|
||||
return (
|
||||
<Box className={"clock"}>
|
||||
<Button label={time()} />
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { Box, Button } from "astal/gtk3/widget";
|
||||
import { Process } from "astal";
|
||||
|
||||
export function Logo() {
|
||||
return (
|
||||
<Box className={"logo"}>
|
||||
<Button onClick={ () => Process.exec("hyprctl dispatch exec anyrun") } label={""} />
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
import { Box, Label } from "astal/gtk3/widget";
|
||||
import AstalTray from "gi://AstalTray"
|
||||
|
||||
const astalTray = AstalTray.get_default();
|
||||
let items: Array<AstalTray.TrayItem> = astalTray.items;
|
||||
|
||||
const handlerId = astalTray.connect("item-added", () => {
|
||||
items = astalTray.items;
|
||||
console.log(astalTray.items);
|
||||
}) as number;
|
||||
|
||||
export function Tray() {
|
||||
return (
|
||||
<Box className={"tray"}>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import { bind } from "astal";
|
||||
import { Widget } from "astal/gtk3";
|
||||
import AstalHyprland from "gi://AstalHyprland";
|
||||
|
||||
const hyprland = AstalHyprland.get_default();
|
||||
|
||||
export function Workspaces() {
|
||||
return new Widget.Box({
|
||||
className: "workspaces",
|
||||
children: bind(hyprland, "workspaces").as((workspaces) =>
|
||||
workspaces.sort((a: AstalHyprland.Workspace, b: AstalHyprland.Workspace) =>
|
||||
a.get_id() - b.get_id())
|
||||
.map((workspace: AstalHyprland.Workspace) =>
|
||||
new Widget.Button({
|
||||
className: bind(hyprland, "focusedWorkspace").as((focusedWs: AstalHyprland.Workspace) => workspace === focusedWs ? "focus" : ""),
|
||||
onClicked: () => workspace.focus()
|
||||
} as Widget.ButtonProps)
|
||||
)
|
||||
)
|
||||
} as Widget.BoxProps);
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
import { Box, CenterBox } from "astal/gtk3/widget";
|
||||
import { Astal, Gtk } from "astal/gtk3";
|
||||
import Gdk from "gi://Gdk?version=3.0";
|
||||
|
||||
import { Clock } from "../widget/bar/Clock";
|
||||
import { Logo } from "../widget/bar/Logo";
|
||||
import { CCToggle } from "../widget/bar/CCToggle";
|
||||
//import { Tray } from "../widget/bar/Tray";
|
||||
import { Workspaces } from "../widget/bar/Workspaces";
|
||||
|
||||
export function Bar(monitor: number = 0, width: (number|undefined) = undefined, height: (number|undefined) = undefined) {
|
||||
return (
|
||||
<window className="bar" monitor={ monitor } namespace={ "top-bar" }
|
||||
anchor={ Astal.WindowAnchor.TOP } layer={ Astal.Layer.TOP }
|
||||
exclusivity={ Astal.Exclusivity.EXCLUSIVE } canFocus={ false }
|
||||
heightRequest={ height ? height : 0 }
|
||||
widthRequest={ width ? width : Gdk.Screen.get_default()?.get_monitor_geometry(monitor)?.width }>
|
||||
|
||||
<Box className={ "bar-container" } spacing={ 2 }>
|
||||
<CenterBox className={ "bar-centerbox" } expand={ true }>
|
||||
<Box className={ "widgets-left" } vertical={ false }
|
||||
homogeneous={ false } halign={ Gtk.Align.START }>
|
||||
|
||||
<Logo />
|
||||
<Workspaces />
|
||||
</Box>
|
||||
|
||||
<Box className={ "widgets-center" } halign={ Gtk.Align.CENTER }
|
||||
vertical={ false } homogeneous={ false }>
|
||||
|
||||
<Clock />
|
||||
</Box>
|
||||
|
||||
<Box className={ "widgets-right" } halign={ Gtk.Align.END }
|
||||
vertical={ false } homogeneous={ false }>
|
||||
|
||||
{/*<Tray />*/}
|
||||
<CCToggle />
|
||||
</Box>
|
||||
</CenterBox>
|
||||
</Box>
|
||||
</window>
|
||||
)
|
||||
}
|
||||
@@ -10,7 +10,7 @@ echo "######################################"
|
||||
printf "\n"
|
||||
|
||||
CONFIG_DIR="$HOME/.config"
|
||||
DOTFILES_DIRS=("hypr" "eww" "kitty" "anyrun" "wal" "fastfetch" "mako")
|
||||
DOTFILES_DIRS=("hypr" "ags" "kitty" "anyrun" "wal" "fastfetch")
|
||||
DOTFILES_BACKUP_DIR="$HOME/hyprland-dotfiles-bkp"
|
||||
|
||||
echo "Welcome to my dotfiles installation script!"
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
@import "../../.cache/wal/colors.scss";
|
||||
|
||||
@import "styles/general.scss";
|
||||
@import "styles/bar.scss";
|
||||
@import "styles/calendar.scss";
|
||||
@import "styles/control-center.scss";
|
||||
@import "styles/powermenu.scss";
|
||||
@import "styles/volume-control.scss";
|
||||
@import "styles/floating-notifications.scss";
|
||||
@@ -1,17 +0,0 @@
|
||||
; Variables
|
||||
(include "variables.yuck")
|
||||
|
||||
; Windows
|
||||
(include "windows/calendar-window.yuck")
|
||||
(include "windows/control-center.yuck")
|
||||
(include "windows/bar.yuck")
|
||||
(include "windows/powermenu.yuck")
|
||||
(include "windows/volume-control.yuck")
|
||||
(include "windows/volume-popup.yuck")
|
||||
(include "windows/floating-media.yuck")
|
||||
(include "windows/floating-notifications.yuck")
|
||||
(include "windows/hardware-monitor.yuck")
|
||||
|
||||
; Universal Widgets
|
||||
(include "widgets/big-media.yuck")
|
||||
(include "widgets/separator.yuck")
|
||||
@@ -1,12 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# output current window before event trigger to prevent issues
|
||||
hyprctl -j activewindow | jq -c | sed 's/\\[n]//g'
|
||||
|
||||
handle() {
|
||||
case $1 in
|
||||
activewindow*) hyprctl -j activewindow | jq -c | sed 's/\\[n]//g' ;;
|
||||
esac
|
||||
}
|
||||
|
||||
socat -U - UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -r line; do handle "$line"; done
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
send_notification() {
|
||||
notify-send -u normal -a "Color Picker" "$1" "$2"
|
||||
}
|
||||
|
||||
# Check if user has hyprpicker installed
|
||||
if ! [[ -f /bin/hyprpicker ]]; then
|
||||
send_notification "An error occurred" "Looks like you don't have Hyprpicker installed! Try installing it before using the Color Picker tool."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
selected_color=$(hyprpicker)
|
||||
|
||||
if ! [[ $selected_color == "" ]]; then
|
||||
wl-copy $selected_color
|
||||
send_notification "Selected Color" "The selected color is <span foreground='$selected_color'>$selected_color</span>, it was also copied to your clipboard!"
|
||||
fi
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script reloads eww configuration and updates
|
||||
# window status variables, used in eww-window.sh
|
||||
# script. Avoids issues with widgets that use status
|
||||
# variables to dinamically change their content.
|
||||
# ----------
|
||||
# Licensed under the MIT License
|
||||
# Made by retrozinndev (João Dias)
|
||||
# From https://github.com/retrozinndev/Hyprland-Dots
|
||||
|
||||
# TODO
|
||||
|
||||
open_windows=$(eww active-windows | awk -F: '{ print $1 }' | sed -e 's/ /\\[n]/g')
|
||||
echo $open_windows
|
||||
|
||||
#for window in $()
|
||||
@@ -1,104 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# arg1($1) should be one of the options listed in help command;
|
||||
# arg2($2) should be the literal window name as defined in eww configuration.
|
||||
|
||||
function help_message() {
|
||||
printf \
|
||||
"This is a helper script that helps opening/closing eww windows on
|
||||
retrozinndev's Hyprland Dots, by checking if the window is already
|
||||
open/closed before doing anything, also changes eww state variables.
|
||||
This needs a variable like window_state_WINDOWNAME to work, where
|
||||
WINDOWNAME is the literal name of the declared window inside the
|
||||
eww configuration you are using.
|
||||
|
||||
Usage:
|
||||
arg1 arg2
|
||||
./eww-window.sh [SINGLE OPTION] [WINDOW_NAME]
|
||||
|
||||
Options:
|
||||
-h, --help, help: Shows this help message;
|
||||
--open, open: Opens a window and changes its state variable to
|
||||
\"open\" if not open, or else does nothing;
|
||||
--toggle, toggle: Toggles a window. If open, the specified
|
||||
window is closed, if closed, the
|
||||
specified window is open. Same thing goes to
|
||||
the eww window state variable;
|
||||
--close, close: Closes a window and also changes its state
|
||||
variable to \"closed\" if open, or else does
|
||||
nothing.
|
||||
|
||||
|
||||
Developer: retrozinndev (João Dias), https://github.com/retrozinndev
|
||||
Issue tracker: https://github.com/retrozinndev/Hyprland-Dots/issues
|
||||
Licensed under the MIT License, as in retrozinndev's Hyprland-Dots repo."
|
||||
}
|
||||
|
||||
function send_log() {
|
||||
case "$1" in
|
||||
err*)
|
||||
tag_color="\e[31m"
|
||||
;;
|
||||
warn*)
|
||||
tag_color="\e[33m"
|
||||
;;
|
||||
*)
|
||||
tag_color="\e[34m"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo -e "[$tag_color$1\e[0m] $2"
|
||||
}
|
||||
|
||||
function check_if_empty() {
|
||||
if [[ $1 == "" ]]; then
|
||||
send_log "error" "argument \$1 is empty!"
|
||||
help_message
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function toggle_eww_window() {
|
||||
if ! [[ $(eww active-windows) =~ "$1" ]]; then
|
||||
eww open "$1"
|
||||
eww update "window_state_$1=open"
|
||||
else
|
||||
eww close "$1"
|
||||
eww update "window_state_$1=closed"
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
--help | -h | help | h)
|
||||
help_message
|
||||
;;
|
||||
|
||||
--open | open)
|
||||
check_if_empty $2 "WINDOW_NAME"
|
||||
if ! [[ $(eww active-windows) =~ "$2" ]]; then
|
||||
eww open "$2"
|
||||
eww update "window_state_$2=open"
|
||||
else
|
||||
send_log "info" "Window '$2' is already open, ignored."
|
||||
fi
|
||||
;;
|
||||
|
||||
--close | close)
|
||||
check_if_empty $2 "WINDOW_NAME"
|
||||
if [[ $(eww active-windows) =~ "$2" ]]; then
|
||||
eww close "$2"
|
||||
eww update "window_state_$2=closed"
|
||||
else
|
||||
send_log "info" "Window '$2' is already closed, ignored."
|
||||
fi
|
||||
;;
|
||||
|
||||
--toggle | toggle)
|
||||
check_if_empty $2 "WINDOW_NAME"
|
||||
toggle_eww_window $2
|
||||
;;
|
||||
*)
|
||||
send_log "error" "Action not specified or incorrect command order. Good example: \`./eww-window.sh open bar\`"
|
||||
help_message
|
||||
;;
|
||||
esac
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
sink_="@DEFAULT_AUDIO_SINK@"
|
||||
source_="@DEFAULT_AUDIO_SOURCE@"
|
||||
|
||||
print_json() {
|
||||
echo "{ \"output\": $output_vol, \"source\": $source_vol }"
|
||||
}
|
||||
|
||||
get_vol() {
|
||||
echo $(wpctl get-volume $1 | awk "{print int(\$2*100)}")
|
||||
}
|
||||
|
||||
output_vol=$(get_vol $sink_)
|
||||
source_vol=$(get_vol $source_)
|
||||
|
||||
print_json
|
||||
|
||||
# Loop
|
||||
pactl subscribe | grep --line-buffered -e "on sink" -e "on source" | while read -r; do
|
||||
|
||||
output_vol=$(get_vol $sink_)
|
||||
source_vol=$(get_vol $source_)
|
||||
|
||||
print_json
|
||||
done
|
||||
@@ -1,205 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Original code is from Alexays/Waybar repo in https://github.com/Alexays/Waybar
|
||||
# Modified by retrozinndev to work on Eww and more players.
|
||||
# Dotfiles: https://github.com/retrozinndev/Hyprland-Dots
|
||||
|
||||
import gi
|
||||
gi.require_version("Playerctl", "2.0")
|
||||
from gi.repository import Playerctl, GLib
|
||||
from gi.repository.Playerctl import Player
|
||||
import argparse
|
||||
import logging
|
||||
import sys
|
||||
import signal
|
||||
import gi
|
||||
import json
|
||||
import os
|
||||
from typing import List
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def signal_handler(sig, frame):
|
||||
logger.info("Received signal to stop, exiting")
|
||||
sys.stdout.write("\n")
|
||||
sys.stdout.flush()
|
||||
# loop.quit()
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
class PlayerManager:
|
||||
def __init__(self, selected_player=None, excluded_player=[]):
|
||||
self.manager = Playerctl.PlayerManager()
|
||||
self.loop = GLib.MainLoop()
|
||||
self.manager.connect(
|
||||
"name-appeared", lambda *args: self.on_player_appeared(*args))
|
||||
self.manager.connect(
|
||||
"player-vanished", lambda *args: self.on_player_vanished(*args))
|
||||
|
||||
signal.signal(signal.SIGINT, signal_handler)
|
||||
signal.signal(signal.SIGTERM, signal_handler)
|
||||
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
|
||||
self.selected_player = selected_player
|
||||
self.excluded_player = excluded_player.split(',') if excluded_player else []
|
||||
|
||||
self.init_players()
|
||||
|
||||
def init_players(self):
|
||||
for player in self.manager.props.player_names:
|
||||
if player.name in self.excluded_player:
|
||||
continue
|
||||
if self.selected_player is not None and self.selected_player != player.name:
|
||||
logger.debug(f"{player.name} is not the filtered player, skipping it")
|
||||
continue
|
||||
self.init_player(player)
|
||||
|
||||
def run(self):
|
||||
logger.info("Starting main loop")
|
||||
self.loop.run()
|
||||
|
||||
def init_player(self, player):
|
||||
logger.info(f"Initialize new player: {player.name}")
|
||||
player = Playerctl.Player.new_from_name(player)
|
||||
player.connect("playback-status",
|
||||
self.on_playback_status_changed, None)
|
||||
player.connect("metadata", self.on_metadata_changed, None)
|
||||
self.manager.manage_player(player)
|
||||
self.on_metadata_changed(player, player.props.metadata)
|
||||
|
||||
def get_players(self) -> List[Player]:
|
||||
return self.manager.props.players
|
||||
|
||||
def clear_output(self):
|
||||
sys.stdout.write("\n")
|
||||
sys.stdout.flush()
|
||||
|
||||
def on_playback_status_changed(self, player, status, _=None):
|
||||
logger.debug(f"Playback status changed for player {player.props.player_name}: {status}")
|
||||
self.on_metadata_changed(player, player.props.metadata)
|
||||
|
||||
def get_first_playing_player(self):
|
||||
players = self.get_players()
|
||||
logger.debug(f"Getting first playing player from {len(players)} players")
|
||||
if len(players) > 0:
|
||||
# if any are playing, show the first one that is playing
|
||||
# reverse order, so that the most recently added ones are preferred
|
||||
for player in players[::-1]:
|
||||
if player.props.status == "Playing":
|
||||
return player
|
||||
# if none are playing, show the first one
|
||||
return players[0]
|
||||
else:
|
||||
logger.debug("No players found")
|
||||
return None
|
||||
|
||||
def show_most_important_player(self):
|
||||
logger.debug("Showing most important player")
|
||||
# show the currently playing player
|
||||
# or else show the first paused player
|
||||
# or else show nothing
|
||||
current_player = self.get_first_playing_player()
|
||||
if current_player is not None:
|
||||
self.on_metadata_changed(current_player, current_player.props.metadata)
|
||||
else:
|
||||
self.clear_output()
|
||||
|
||||
def on_metadata_changed(self, player, metadata, _=None):
|
||||
logger.debug(f"Metadata changed for player {player.props.player_name}")
|
||||
player_name = player.props.player_name
|
||||
artist = player.get_artist()
|
||||
title = player.get_title()
|
||||
|
||||
track_info = ""
|
||||
if ((player_name == "spotify") and "mpris:trackid" in metadata.keys() and ":ad:" in player.props.metadata["mpris:trackid"]):
|
||||
track_info = "Advertisement"
|
||||
elif artist != None and title != None:
|
||||
track_info = f"{artist} - {title}"
|
||||
else:
|
||||
track_info = title
|
||||
|
||||
# only print output if no other player is playing
|
||||
current_playing = self.get_first_playing_player()
|
||||
if current_playing is None or current_playing.props.player_name == player.props.player_name:
|
||||
self.write_output(track_info, player)
|
||||
else:
|
||||
logger.debug(f"Other player {current_playing.props.player_name} is playing, skipping")
|
||||
|
||||
def write_output(self, text, player):
|
||||
logger.debug(f"Writing output: {text}")
|
||||
|
||||
artUrl = player.print_metadata_prop("mpris:artUrl")
|
||||
|
||||
if artUrl is not None and not artUrl.startswith("file://") and not artUrl.startswith("http://") and not artUrl.startswith("https://") and artUrl != "null":
|
||||
artUrl = f"file://{artUrl}"
|
||||
|
||||
output = {
|
||||
"status": player.props.status.lower(),
|
||||
"title": player.get_title(),
|
||||
"artist": player.get_artist(),
|
||||
"player": player.props.player_name.lower(),
|
||||
"artUrl": artUrl,
|
||||
"length": player.print_metadata_prop("mpris:length"),
|
||||
"url": player.print_metadata_prop("xesam:url")
|
||||
}
|
||||
|
||||
sys.stdout.write(json.dumps(output) + "\n")
|
||||
sys.stdout.flush()
|
||||
|
||||
def on_player_appeared(self, _, player):
|
||||
logger.info(f"Player has appeared: {player.name}")
|
||||
if player.name in self.excluded_player:
|
||||
logger.debug(
|
||||
"New player appeared, but it's in exclude player list, skipping")
|
||||
return
|
||||
if player is not None and (self.selected_player is None or player.name == self.selected_player):
|
||||
self.init_player(player)
|
||||
else:
|
||||
logger.debug(
|
||||
"New player appeared, but it's not the selected player, skipping")
|
||||
|
||||
def on_player_vanished(self, _, player):
|
||||
logger.info(f"Player {player.props.player_name} has vanished")
|
||||
self.show_most_important_player()
|
||||
|
||||
def parse_arguments():
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
# Increase verbosity with every occurrence of -v
|
||||
parser.add_argument("-v", "--verbose", action="count", default=0)
|
||||
|
||||
parser.add_argument("-x", "--exclude", "- Comma-separated list of excluded player")
|
||||
|
||||
# Define for which player we"re listening
|
||||
parser.add_argument("--player")
|
||||
|
||||
parser.add_argument("--enable-logging", action="store_true")
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main():
|
||||
arguments = parse_arguments()
|
||||
|
||||
# Initialize logging
|
||||
if arguments.enable_logging:
|
||||
logfile = os.path.join(os.path.dirname(
|
||||
os.path.realpath(__file__)), "media-player.log")
|
||||
logging.basicConfig(filename=logfile, level=logging.DEBUG,
|
||||
format="%(asctime)s %(name)s %(levelname)s:%(lineno)d %(message)s")
|
||||
|
||||
# Logging is set by default to WARN and higher.
|
||||
# With every occurrence of -v it's lowered by one
|
||||
logger.setLevel(max((3 - arguments.verbose) * 10, 0))
|
||||
|
||||
logger.info("Creating player manager")
|
||||
if arguments.player:
|
||||
logger.info(f"Filtering for player: {arguments.player}")
|
||||
if arguments.exclude:
|
||||
logger.info(f"Exclude player {arguments.exclude}")
|
||||
|
||||
player = PlayerManager(arguments.player, arguments.exclude)
|
||||
player.run()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
pidfile="$HOME/.cache/night-light.pid"
|
||||
temperature=4500 # in K
|
||||
|
||||
# run only if pid file does not exist
|
||||
if ! [[ -f $pidfile ]]; then
|
||||
touch $pidfile
|
||||
hyprsunset -t $temperature &
|
||||
_pid=$!
|
||||
echo -e $_pid > $pidfile
|
||||
wait $_pid && rm -f $pidfile
|
||||
else
|
||||
echo "There's already an instance running! Mistake? Delete \"~/.cache/night-light.pid\"."
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
lockfile=$HOME/.cache/notification-history.lock
|
||||
json_history_file=$HOME/.cache/notification-history.json
|
||||
|
||||
if ! [[ -f $lockfile ]]; then
|
||||
echo "{ \"history\": [] }" > $json_history_file
|
||||
fi
|
||||
@@ -1,73 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# A notification logger, saves notifications inside
|
||||
# a file instead of saving on memory! file is located
|
||||
# in `~/.cache/notification-history.json`.
|
||||
# -----------
|
||||
# Licensed under the MIT License
|
||||
# Made by retrozinndev (João Dias)
|
||||
# From https://github.com/retrozinndev/Hyprland-Dots
|
||||
|
||||
set -e
|
||||
|
||||
json_history_file="$HOME/.cache/notification-history.json"
|
||||
lock_file="$HOME/.cache/notification-history.lock"
|
||||
|
||||
# get max entries from mako file
|
||||
max_entries=$(cat $HOME/.config/mako/config | grep "max-history=" | awk -F= '{ print $2 }')
|
||||
|
||||
touch $json_history_file
|
||||
|
||||
function Init_history_file() {
|
||||
if [[ $(cat $json_history_file) == "" ]]; then
|
||||
echo -e "{\"history\":[]}" > $json_history_file
|
||||
fi
|
||||
}
|
||||
|
||||
function Check_history_file() {
|
||||
if ! [[ -f $json_history_file ]]; then
|
||||
touch $json_history_file
|
||||
fi
|
||||
}
|
||||
|
||||
function Treat_specials() {
|
||||
echo $@ | sed -e 's/\\[n]/\\n/g' -e 's/&/&/g'
|
||||
}
|
||||
|
||||
Check_history_file
|
||||
Init_history_file
|
||||
|
||||
json_latest_notification="$(makoctl history | jq -c '.data[][0]')"
|
||||
|
||||
while true; do
|
||||
sleep .1
|
||||
if ! [[ -f $lock_file ]]; then
|
||||
json_actual_latest="$(makoctl history | jq -c '.data[][0]')"
|
||||
if ! [[ $json_actual_latest == $json_latest_notification ]]; then
|
||||
if [[ $(echo $(Treat_specials $json_actual_latest) | jq -c '.id.data') == $(echo $(Treat_specials $json_latest_notification) | jq -c '.id.data') ]]; then
|
||||
if [[ $(echo $(Treat_specials $json_actual_latest) | jq -c '.summary.data') == $(echo $(Treat_specials $json_latest_notification) | jq -c '.summary.data') ]]; then
|
||||
continue
|
||||
else
|
||||
sh $HOME/.config/eww/scripts/notification-remove.sh $(echo $(Treat_specials $json_latest_notification) | jq -c '.id.data') &
|
||||
fi
|
||||
fi
|
||||
|
||||
Check_history_file
|
||||
Init_history_file
|
||||
json_latest_notification=$(makoctl history | jq -c '.data[][0]')
|
||||
json_first_notification=$(jq -c ".history[$(jq -c '.history | length - 1' $json_history_file)]" $json_history_file)
|
||||
|
||||
if ! [[ $(makoctl mode) =~ "dnd" ]]; then
|
||||
sh $HOME/.config/eww/scripts/notification-popup.sh "$(Treat_specials $json_latest_notification)" &
|
||||
fi
|
||||
|
||||
if [[ $(jq -c ".history | length" $json_history_file) == $max_entries ]]; then
|
||||
sh $HOME/.config/eww/scripts/notification-remove.sh $(echo $json_first_notification | jq -c '.id.data')
|
||||
fi
|
||||
|
||||
json_output=$(jq -c ".history |= [$(Treat_specials $json_latest_notification)] + ." $json_history_file)
|
||||
|
||||
echo -e "$json_output" > $json_history_file
|
||||
fi
|
||||
fi
|
||||
done
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Removes notification from popup by id provided
|
||||
# in arg1.
|
||||
# ---------
|
||||
# Licensed under the MIT License
|
||||
# Made by retrozinndev (João Dias)
|
||||
# From https://github.com/retrozinndev/Hyprland-Dots
|
||||
|
||||
|
||||
if ! [[ $1 == "" ]]; then
|
||||
json_popup_notifications=$(eww get json_popup_notifications)
|
||||
if [[ $(eww get json_popup_notifications | jq -c '.notifications | length') == 1 ]]; then
|
||||
sh $HOME/.config/eww/scripts/eww-window.sh close floating-notifications >> /dev/null
|
||||
fi
|
||||
eww update "json_popup_notifications=$(echo $json_popup_notifications | jq -c "del(.notifications[] | select(.id.data == $1))")"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "[error] Notification Id not provided!"
|
||||
exit 1
|
||||
@@ -1,51 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This scripts receives a notification from arg1,
|
||||
# in a json format, displays in eww, counting
|
||||
# down depending on notification urgency and
|
||||
# removes the notification from json.
|
||||
|
||||
# Timeout in seconds
|
||||
# When set to 0, notification will disappear
|
||||
# only when hovering it.
|
||||
timeout_low=3
|
||||
timeout_normal=6
|
||||
timeout_critical=0
|
||||
|
||||
if ! [[ $@ == "" ]]; then
|
||||
# Urgency levels:
|
||||
# Low: 0, Normal: 1, Critical: 2
|
||||
urgency=$(echo $@ | jq -c ".urgency.data")
|
||||
id=$(echo $@ | jq -c ".id.data")
|
||||
json_popup_notifications="$(eww get json_popup_notifications)"
|
||||
json_notification=$(echo $@ | jq -c '.')
|
||||
|
||||
if [[ $json_popup_notifications == "" ]]; then
|
||||
eww update "json_popup_notifications="'{"notifications":[]}' >> /dev/null
|
||||
json_popup_notifications='{"notifications":[]}'
|
||||
fi
|
||||
|
||||
eww update "json_popup_notifications=$(echo $json_popup_notifications | jq -c ".notifications |= [$json_notification] + .")" >> /dev/null
|
||||
sh $HOME/.config/eww/scripts/eww-window.sh open floating-notifications >> /dev/null
|
||||
|
||||
# Critical urgency is handled by eww, no need to count down
|
||||
case $urgency in
|
||||
0)
|
||||
sleep $timeout_low
|
||||
;;
|
||||
1)
|
||||
sleep $timeout_normal
|
||||
;;
|
||||
2) ;;
|
||||
*)
|
||||
sleep $timeout_normal
|
||||
;;
|
||||
esac
|
||||
|
||||
if ! [[ $urgency == 2 ]]; then
|
||||
sh $HOME/.config/eww/scripts/notification-popup-remove.sh "$id" &
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
exit 0
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Removes notification from history file by
|
||||
# id provided in arg1.
|
||||
# ---------
|
||||
# Licensed under the MIT License
|
||||
# Made by retrozinndev (João Dias)
|
||||
# From https://github.com/retrozinndev/Hyprland-Dots
|
||||
|
||||
json_history_file="$HOME/.cache/notification-history.json"
|
||||
lock_file="$HOME/.cache/notification-history.lock"
|
||||
|
||||
if [[ -f $HOME/.cache/notification-history.json ]] && ! [[ $1 == "" ]]; then
|
||||
touch $lock_file
|
||||
json_updated_history=$(jq -c "del(.history[] | select(.id.data == $1))" $json_history_file)
|
||||
echo -e $json_updated_history > $json_history_file
|
||||
rm -f $lock_file
|
||||
else
|
||||
echo "[error] Notification history not reachable or id not provided"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script watches notification file changes
|
||||
# and output file contents.
|
||||
# -----------
|
||||
# Licensed under the MIT License
|
||||
# Made by retrozinndev (João Dias)
|
||||
# From https://github.com/retrozinndev/Hyprland-Dots
|
||||
|
||||
set -e
|
||||
|
||||
json_history_file="$HOME/.cache/notification-history.json"
|
||||
|
||||
if ! [[ -f $json_history_file ]]; then
|
||||
echo -e "{\"history\":[]}" > $json_history_file
|
||||
fi
|
||||
|
||||
json_history="$(cat $json_history_file)"
|
||||
|
||||
echo $json_history
|
||||
|
||||
while true; do
|
||||
sleep .1
|
||||
json_newest_history=$(cat $json_history_file)
|
||||
|
||||
if ! [[ "$json_history" == "$json_newest_history" ]]; then
|
||||
json_history="$json_newest_history"
|
||||
echo $json_history
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
dest="$HOME/Recordings"
|
||||
if ! [[ $(xdg-user-dir VIDEOS) == "" ]]; then
|
||||
dest="$(xdg-user-dir VIDEOS)/Recordings"
|
||||
fi
|
||||
lock="$HOME/.cache/recording.lock"
|
||||
pidfile="$HOME/.cache/recording.pid"
|
||||
ext="mp4" # mp4,mkv...
|
||||
filename=$(date +"%Y-%m-%d-%H%M%S_rec.$ext")
|
||||
|
||||
mkdir -p $dest
|
||||
|
||||
# run only if lockfile does not exist
|
||||
if ! [[ -f $lock ]]; then
|
||||
touch $lock
|
||||
wf-recorder -f "$dest/$filename" &
|
||||
rec_pid=$!
|
||||
echo -e $rec_pid > $pidfile
|
||||
wait $rec_pid && (
|
||||
notify-send -a "Screen Recorder" "Recording Done" "The screen recording has been saved as '$dest/$filename'!"
|
||||
rm -f $lock $pidfile
|
||||
)
|
||||
else
|
||||
notify-send -a "Screen Recorder" "Recording Error" "There's already an instance running! Mistake? Delete $lock and $pidfile."
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
while true; do
|
||||
if [[ $(eww get hold_volume_popup) == true ]]; then
|
||||
sleep 4
|
||||
sh ./eww-window.sh close volume-popup
|
||||
eww update "hold_volume_popup=false"
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
@@ -1,37 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
print_workspaces_literal() {
|
||||
active_workspace_id=$(hyprctl -j activeworkspace | jq -c '.id' | xargs)
|
||||
json_workspaces=$(hyprctl -j workspaces | jq -c '.')
|
||||
existing_workspaces=$(echo $json_workspaces | jq -c '.[].id' | xargs)
|
||||
|
||||
output="
|
||||
(box :space-evenly false
|
||||
:orientation \"horizontal\""
|
||||
|
||||
for i in {1..10}; do
|
||||
output=$output"
|
||||
(button :onclick \"hyprctl dispatch workspace $i >> /dev/null \"
|
||||
:class \"\${ $active_workspace_id == $i ? 'active' : '' } $( [[ $(echo $json_workspaces | jq -c ".[$i - 1].name") =~ "special:" ]] && echo 'special' )\"
|
||||
:visible { \"$existing_workspaces\" =~ $i ? true : false }
|
||||
:tooltip \"Workspace ${i}\"
|
||||
\"\")"
|
||||
|
||||
if [ $i == 10 ]; then
|
||||
output=$output")" # closes box if last
|
||||
fi
|
||||
done
|
||||
|
||||
echo "$(echo $output | xargs -0)"
|
||||
}
|
||||
|
||||
# display workspaces on startup
|
||||
print_workspaces_literal
|
||||
|
||||
handle() {
|
||||
case $1 in
|
||||
workspace*) print_workspaces_literal;;
|
||||
esac
|
||||
}
|
||||
|
||||
socat -U - UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -r line; do handle "$line"; done
|
||||
@@ -1,270 +0,0 @@
|
||||
|
||||
.bar {
|
||||
background: transparent;
|
||||
padding: 4px;
|
||||
padding-bottom: 0;
|
||||
|
||||
& label {
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
|
||||
/* Styles .widgets-[left/center/right] */
|
||||
.widgets-left,
|
||||
.widgets-center,
|
||||
.widgets-right {
|
||||
background: rgba($background, 0.6);
|
||||
border-radius: 18px;
|
||||
padding: 6px;
|
||||
|
||||
& > * {
|
||||
margin: 0 3px;
|
||||
border-radius: 12px;
|
||||
&.button {
|
||||
margin: 0;
|
||||
& > box {
|
||||
margin: 0 3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& > *:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
& > *:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
& > *:only-child {
|
||||
margin: 0 0px;
|
||||
}
|
||||
}
|
||||
|
||||
// Styles the literal script for workspace indicators
|
||||
.workspaces {
|
||||
border-radius: 50%;
|
||||
|
||||
& button {
|
||||
border-radius: 16px;
|
||||
margin: 0 2px;
|
||||
padding: 5px 12px;
|
||||
background: lighten($color: $color1, $amount: 10);
|
||||
|
||||
&:not(.active):hover {
|
||||
box-shadow: inset 0 0 0 50px rgba($color: $foreground, $alpha: .5);
|
||||
}
|
||||
|
||||
&.active {
|
||||
padding-right: 22px;
|
||||
padding-left: 22px;
|
||||
background: $foreground;
|
||||
}
|
||||
|
||||
&.special {
|
||||
background: darken($color: $color3, $amount: 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.distro-logo {
|
||||
padding: 0;
|
||||
padding-left: 12px;
|
||||
padding-right: 6px;
|
||||
|
||||
& > label {
|
||||
font-size: 15px;
|
||||
padding-right: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.systray {
|
||||
all: unset;
|
||||
|
||||
& > * > * {
|
||||
margin: 0 6px;
|
||||
}
|
||||
}
|
||||
|
||||
.mediaplayer {
|
||||
border-radius: 12px;
|
||||
|
||||
& > .media {
|
||||
border-radius: inherit;
|
||||
|
||||
&:hover {
|
||||
& > box {
|
||||
box-shadow: inset 0 0 0 50px rgba($color: $foreground, $alpha: .1);
|
||||
}
|
||||
}
|
||||
& > box {
|
||||
border-radius: inherit;
|
||||
background: darken($color: $color3, $amount: 5);
|
||||
|
||||
& > label {
|
||||
color: $foreground;
|
||||
font-size: inherit;
|
||||
|
||||
&:first-child {
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.revealed {
|
||||
transition: 80ms linear;
|
||||
|
||||
.media > box {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
.media-controls {
|
||||
padding: 3px;
|
||||
background: darken($color: $color3, $amount: 10);
|
||||
border-top-right-radius: 12px;
|
||||
border-bottom-right-radius: 12px;
|
||||
|
||||
& button {
|
||||
background: $color2;
|
||||
margin: 0 1px;
|
||||
border-radius: 2px;
|
||||
|
||||
&:hover {
|
||||
background: lighten($color: $color2, $amount: 5);
|
||||
}
|
||||
|
||||
&:first-child {
|
||||
border-top-left-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-top-right-radius: 8px;
|
||||
border-bottom-right-radius: 8px;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 0 7px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.window {
|
||||
padding: 0 6px;
|
||||
|
||||
& > .icon {
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
& > box.info {
|
||||
& > label.window-class {
|
||||
font-size: 9.8px;
|
||||
font-family: monospace;
|
||||
color: darken($color: $foreground, $amount: 20);
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
& > label.window-title {
|
||||
font-size: 12px;
|
||||
color: $foreground;
|
||||
margin-top: -1px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.network-eventbox > box {
|
||||
padding-left: 10px;
|
||||
padding-right: 7px;
|
||||
}
|
||||
|
||||
.bluetooth button {
|
||||
padding-left: 10px;
|
||||
padding-right: 7px;
|
||||
}
|
||||
|
||||
.audio-eventbox {
|
||||
&:hover box.audio {
|
||||
background: darken($color: $color2, $amount: 5);
|
||||
}
|
||||
|
||||
& > .audio {
|
||||
padding: 0 8px;
|
||||
border-radius: 12px;
|
||||
|
||||
&.open {
|
||||
background: darken($color: $color3, $amount: 10);
|
||||
}
|
||||
|
||||
label {
|
||||
font-weight: 600;
|
||||
|
||||
&:first-child {
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-left: 2px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.clock {
|
||||
& .cal-open > box {
|
||||
background: darken($color: $color3, $amount: 10);
|
||||
}
|
||||
|
||||
& .icon {
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
& label:not(.icon) {
|
||||
margin-right: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
.control-center-toggle {
|
||||
border-radius: 12px;
|
||||
|
||||
&:hover {
|
||||
background: darken($color: $color2, $amount: 10);
|
||||
}
|
||||
|
||||
& > box {
|
||||
padding-left: 12px;
|
||||
padding-right: 14px;
|
||||
|
||||
label {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
&.open {
|
||||
background: darken($color: $color3, $amount: 10);
|
||||
}
|
||||
}
|
||||
|
||||
.hardware {
|
||||
& > box {
|
||||
margin: 0 5px;
|
||||
|
||||
&:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
|
||||
.calendar-box {
|
||||
padding: 10px;
|
||||
background: rgba($background, 0.6);
|
||||
border-radius: 16px;
|
||||
|
||||
& > .time {
|
||||
font-size: 42px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
& > .date {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.month-calendar {
|
||||
border-radius: 12px;
|
||||
padding: 0 5px;
|
||||
padding-top: 10px;
|
||||
font-weight: 500;
|
||||
|
||||
& > .header {
|
||||
background: unset;
|
||||
border-radius: 6px;
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
border-bottom: solid .5px gray;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: $color2;
|
||||
}
|
||||
|
||||
// Selected day / Current day
|
||||
&:selected {
|
||||
border: 1px solid $color2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,202 +0,0 @@
|
||||
box.cc {
|
||||
margin: 12px;
|
||||
margin-right: 0;
|
||||
background: rgba($background, .85);
|
||||
border-top-left-radius: 24px;
|
||||
border-bottom-left-radius: 24px;
|
||||
padding: 18px;
|
||||
box-shadow: 0 3px 4px 1px $background;
|
||||
}
|
||||
|
||||
.top-bar {
|
||||
margin-bottom: 15px;
|
||||
|
||||
& label {
|
||||
&.hostname {
|
||||
font-size: 13.3px;
|
||||
font-weight: 700;
|
||||
border-bottom: .5px solid rgba(darken($color: $foreground, $amount: 15), .5);
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
&.uptime {
|
||||
font-size: 11.7px;
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
|
||||
.button-row {
|
||||
margin: 7px 0;
|
||||
}
|
||||
|
||||
.wallpaper {
|
||||
padding-left: 9px;
|
||||
padding-right: 12px;
|
||||
}
|
||||
|
||||
.screenshot {
|
||||
padding-left: 9px;
|
||||
padding-right: 12px;
|
||||
}
|
||||
|
||||
.color-picker {
|
||||
padding-right: 11px;
|
||||
}
|
||||
|
||||
.powermenu {
|
||||
padding-right: 11px;
|
||||
}
|
||||
}
|
||||
|
||||
.cc-notifications {
|
||||
&.scroll {
|
||||
.notifications {
|
||||
box.notification {
|
||||
background: darken($color: $color1, $amount: 10);
|
||||
border-radius: 16px;
|
||||
margin: 4px 0;
|
||||
|
||||
& > .top {
|
||||
border-top-left-radius: inherit;
|
||||
border-top-right-radius: inherit;
|
||||
background: darken($color: $color1, $amount: 7);
|
||||
border-bottom: .5px solid rgba(darken($color: $foreground, $amount: 15), .3);
|
||||
padding: 5px 6px;
|
||||
|
||||
& > .app-info {
|
||||
& .app-icon {
|
||||
margin-right: 4px;
|
||||
}
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.close {
|
||||
padding: 4px 8px;
|
||||
border-radius: 9px;
|
||||
}
|
||||
}
|
||||
|
||||
& .content {
|
||||
padding: 8px;
|
||||
padding-top: 0px;
|
||||
|
||||
& > .image {
|
||||
border-radius: 16px;
|
||||
margin-right: 6px;
|
||||
margin-top: 6px;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center 0;
|
||||
}
|
||||
|
||||
& .text {
|
||||
& label {
|
||||
font-family: "Cantarell", "Noto Sans", "Noto Sans CJK JP", "Noto Sans CJK KR";
|
||||
}
|
||||
|
||||
& label.summary {
|
||||
font-weight: 600;
|
||||
font-size: 18px;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
& label.body {
|
||||
font-size: 13.1px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& .bottom {
|
||||
margin-top: 4px;
|
||||
|
||||
&.button-row {
|
||||
& button.do-not-disturb {
|
||||
padding-right: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tiles-grid {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.tiles {
|
||||
margin-bottom: 2px;
|
||||
|
||||
& > .tile-checkbox:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
& > .tile-checkbox:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
& .tile-checkbox {
|
||||
margin: 2px;
|
||||
|
||||
&:hover {
|
||||
& > box {
|
||||
background: $color3;
|
||||
}
|
||||
&:checked > box {
|
||||
background: $color2;
|
||||
}
|
||||
}
|
||||
|
||||
&:checked {
|
||||
& > box {
|
||||
background: $color2;
|
||||
}
|
||||
}
|
||||
|
||||
& > *:not(box) {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
& > .tile {
|
||||
background: darken($color: $foreground, $amount: 65);
|
||||
border-radius: 16px;
|
||||
padding: 16px;
|
||||
margin-left: -16px; // This covers the checkbox space, hiding the check thing
|
||||
|
||||
.icon {
|
||||
font-size: 15px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.label {
|
||||
font-size: 12.6px;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& .network {
|
||||
.icon {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
& .dnd {
|
||||
.icon {
|
||||
margin-right: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
& .screen-rec {
|
||||
.icon {
|
||||
margin-right: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
& .night-light {
|
||||
.icon {
|
||||
margin-right: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
.floating-notifications {
|
||||
& > .notifications .floating-notification {
|
||||
$background-color: darken($color: $color1, $amount: 40);
|
||||
background: $background-color;
|
||||
border-radius: 16px;
|
||||
margin: 14px;
|
||||
box-shadow: 0 0 8px 2px rgba($background, .9);
|
||||
|
||||
& > .top {
|
||||
border-top-left-radius: 15.4px;
|
||||
border-top-right-radius: 15.4px;
|
||||
padding: 6px 12px;
|
||||
background: lighten($color: $background-color, $amount: 5);
|
||||
border-bottom: .5px solid rgba($foreground, .2);
|
||||
|
||||
label {
|
||||
font-family: "Noto Sans Mono", monospace;
|
||||
font-size: 11px;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 10px;
|
||||
|
||||
.image {
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
margin-right: 6px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.text-content {
|
||||
|
||||
label.summary {
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
label.body {
|
||||
font-size: 13.3px;
|
||||
}
|
||||
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
& > .bottom {
|
||||
padding: 8px;
|
||||
margin: 0 8px;
|
||||
|
||||
& .tip {
|
||||
background: darken($color: $color1, $amount: 40);
|
||||
border-radius: 12px;
|
||||
padding: 8px 12px;
|
||||
box-shadow: 0 0 0px 1px $background;
|
||||
|
||||
& > .icon {
|
||||
margin-right: 4px;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
& > .right {
|
||||
background: darken($color: $color1, $amount: 40);
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 0 0px 1px $background;
|
||||
|
||||
& .icon {
|
||||
margin-right: 4px;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,230 +0,0 @@
|
||||
|
||||
$foreground: lighten($color: $foreground, $amount: 5);
|
||||
|
||||
* {
|
||||
all: unset;
|
||||
transition: 120ms linear;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
label {
|
||||
color: lighten($foreground, 15)
|
||||
}
|
||||
|
||||
box.button-row {
|
||||
$bg-color: darken($color: $foreground, $amount: 25);
|
||||
|
||||
& > button {
|
||||
background: rgba($bg-color, .8);
|
||||
border-radius: 1px;
|
||||
margin: 0 1px;
|
||||
|
||||
&:first-child {
|
||||
border-top-left-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-top-right-radius: 8px;
|
||||
border-bottom-right-radius: 8px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: $bg-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
box.vertical.button-row {
|
||||
padding: 2px;
|
||||
$bg-color: darken($color: $foreground, $amount: 25);
|
||||
|
||||
& > button {
|
||||
background: rgba($bg-color, .8);
|
||||
border-radius: 2px;
|
||||
margin: 1px 0;
|
||||
|
||||
&:first-child {
|
||||
border-top-left-radius: 8px;
|
||||
border-top-right-radius: 8px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-bottom-left-radius: 8px;
|
||||
border-bottom-right-radius: 8px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: $bg-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
button,
|
||||
.button > box {
|
||||
padding: 6px 10px;
|
||||
border-radius: 12px;
|
||||
background: none;
|
||||
}
|
||||
|
||||
button:hover,
|
||||
.button:hover > box {
|
||||
background: darken($color: $color2, $amount: 5);
|
||||
}
|
||||
|
||||
button:active,
|
||||
.button:active > box {
|
||||
background: darken($color: $color3, $amount: 10);
|
||||
}
|
||||
|
||||
button label {
|
||||
color: $foreground;
|
||||
}
|
||||
|
||||
menu {
|
||||
background: $background;
|
||||
border-radius: 14px;
|
||||
padding: 2px;
|
||||
|
||||
& > menuitem {
|
||||
padding: 8px 24px;
|
||||
border-radius: 4px;
|
||||
|
||||
&:hover {
|
||||
background: $color1;
|
||||
}
|
||||
|
||||
&:first-child {
|
||||
border-top-left-radius: 12px;
|
||||
border-top-right-radius: 12px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-bottom-left-radius: 12px;
|
||||
border-bottom-right-radius: 12px;
|
||||
}
|
||||
|
||||
label {
|
||||
font-weight: 600;
|
||||
color: $foreground;
|
||||
}
|
||||
}
|
||||
|
||||
& > separator {
|
||||
background: lighten($color: $background, $amount: 5);
|
||||
margin: .5px 10px;
|
||||
padding: 1px 0;
|
||||
border-radius: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
trough {
|
||||
background: darken($color: $foreground, $amount: 25);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
trough highlight {
|
||||
background: $foreground;
|
||||
padding: 10px;
|
||||
border-radius: inherit;
|
||||
}
|
||||
|
||||
scale {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
scrollbar trough {
|
||||
background: rgba(darken($color: $foreground, $amount: 50), .7);
|
||||
margin: 5px 0;
|
||||
padding: 2px;
|
||||
|
||||
& slider {
|
||||
background: lighten($color: $color1, $amount: 15);
|
||||
padding: 3px;
|
||||
border-radius: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
tooltip {
|
||||
& box {
|
||||
margin: 16px;
|
||||
margin-top: 0;
|
||||
border-radius: 12px;
|
||||
border: 1px solid darken($color: $color1, $amount: 1);
|
||||
background: $background;
|
||||
padding: 6px 8px;
|
||||
box-shadow: 0 3px 5px 1px rgba($color: #000000, $alpha: .8);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.big-media {
|
||||
padding: 16px;
|
||||
margin: 6px 0;
|
||||
border-radius: 18px;
|
||||
|
||||
& > box > .album-image {
|
||||
background-size: 100%;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center 0;
|
||||
margin-right: 12px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
& > box > .right {
|
||||
|
||||
& > .media-info {
|
||||
label {
|
||||
font-family: "Cantarell", "Noto Sans CJK JP";
|
||||
}
|
||||
|
||||
& label.title {
|
||||
font-weight: 700;
|
||||
font-size: 16px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
& label.artist {
|
||||
font-weight: 600;
|
||||
font-size: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
& > .controls {
|
||||
padding: 0px;
|
||||
|
||||
& > button {
|
||||
padding: 4px 9px;
|
||||
|
||||
& > label {
|
||||
font-size: 13.3px;
|
||||
}
|
||||
}
|
||||
|
||||
& > button.repeat {
|
||||
padding-right: 11px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.album-bg {
|
||||
box-shadow: inset 0 0 0 100px rgba(0, 0, 0, .5);
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.separator {
|
||||
background: darken($color: $foreground, $amount: 20);
|
||||
|
||||
&.horizontal {
|
||||
margin: 8px 4px;
|
||||
padding: 0 1px;
|
||||
}
|
||||
|
||||
&.vertical {
|
||||
margin: 4px 10px;
|
||||
padding: 1px 0;
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
|
||||
.powermenu-container {
|
||||
margin: 400px 100px;
|
||||
|
||||
& * {
|
||||
outline: initial;
|
||||
}
|
||||
& > button {
|
||||
padding: 96px;
|
||||
margin: 0 6px;
|
||||
border-radius: 6px;
|
||||
background: darken($color: $foreground, $amount: 35);
|
||||
|
||||
&:first-child {
|
||||
border-top-left-radius: 24px;
|
||||
border-bottom-left-radius: 24px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-top-right-radius: 24px;
|
||||
border-bottom-right-radius: 24px;
|
||||
}
|
||||
|
||||
& label {
|
||||
font-size: 98px;
|
||||
}
|
||||
}
|
||||
|
||||
& button:hover {
|
||||
background: $color1;
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
|
||||
.volume-control {
|
||||
background: rgba($background, .6);
|
||||
padding: 6px;
|
||||
border-radius: 16px;
|
||||
|
||||
trough {
|
||||
background: rgba(lighten($color: $background, $amount: 25), .5);
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
trough highlight {
|
||||
background: lighten($color: $color2, $amount: 40);
|
||||
padding: 10px;
|
||||
border-radius: inherit;
|
||||
}
|
||||
|
||||
scale {
|
||||
padding: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.volume-control .separator {
|
||||
border-top: .5px solid rgba(darken($color: $foreground, $amount: 25), .7);
|
||||
margin-bottom: 8px;
|
||||
margin-left: 6px;
|
||||
margin-right: 6px;
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
.volume-control .slider {
|
||||
label {
|
||||
margin-left: 18px;
|
||||
color: $background;
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
; All globally used variables, polls and listeners should be stored here
|
||||
|
||||
; Variables
|
||||
; State
|
||||
(defvar window_state_powermenu "closed")
|
||||
(defvar window_state_control-center "closed")
|
||||
(defvar window_state_floating-notifications "closed")
|
||||
(defvar window_state_bar "closed")
|
||||
(defvar window_state_volume-control "closed")
|
||||
(defvar window_state_calendar-window "closed")
|
||||
(defvar window_state_volume-popup "closed")
|
||||
(defvar window_state_floating-media "closed")
|
||||
|
||||
(defvar json_popup_notifications "{ \"notifications\": [] }")
|
||||
|
||||
|
||||
; Listeners
|
||||
(deflisten json_notification_history :initial "{\"history\": []}"
|
||||
`sh scripts/notification-watch.sh`)
|
||||
|
||||
(deflisten json_volume :initial `{ "output": 60, "source": 80 }`
|
||||
`sh scripts/get-volume-watch.sh`)
|
||||
|
||||
(deflisten literal_workspaces :initial ""
|
||||
`sh scripts/workspaces.sh`)
|
||||
|
||||
(deflisten json_media :initial "{}"
|
||||
`python3 scripts/mediaplayer.py`)
|
||||
|
||||
(deflisten json_active_window :initial "{ \"title\": \"null\", \"class\": \"null\" }"
|
||||
`sh scripts/active-window.sh`)
|
||||
|
||||
|
||||
; Polls
|
||||
(defpoll day_name :interval "2s"
|
||||
`date +"%A"`)
|
||||
(defpoll month_name :interval "2s"
|
||||
`date +"%B"`)
|
||||
(defpoll hostname :initial "GNU/Linux"
|
||||
:interval "24h"
|
||||
`cat /etc/hostname`)
|
||||
|
||||
(defpoll uptime_info :interval "50s"
|
||||
`uptime -p | sed -e 's/^up //'`)
|
||||
|
||||
(defpoll network_status :interval "2s"
|
||||
`nmcli n c`)
|
||||
|
||||
(defpoll bluetooth_powered :interval "2s"
|
||||
`bluetoothctl show | grep Powered | awk '{ print $2 }'`)
|
||||
|
||||
(defpoll notification_modes :interval "1s"
|
||||
`makoctl mode | xargs`)
|
||||
|
||||
(defpoll is_recording :interval "1s"
|
||||
`sh -c "[[ -f $HOME/.cache/recording.lock ]] && echo true || echo false"`)
|
||||
|
||||
(defpoll night_light :interval "1s"
|
||||
`sh -c "[[ -f $HOME/.cache/night-light.pid ]] && echo true || echo false"`)
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
(defwidget audio []
|
||||
(eventbox :onclick "sh ${EWW_CONFIG_DIR}/scripts/eww-window.sh toggle volume-control"
|
||||
:class "audio-eventbox"
|
||||
:cursor "pointer"
|
||||
(box :class "audio ${window_state_volume-control}"
|
||||
(eventbox :onscroll `[ {} == "up" ] && wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ || wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-`
|
||||
(label :text "${ json_volume.output != 0 ? '' : '' } ${json_volume.output}%"))
|
||||
(eventbox :onscroll `[ {} == "up" ] && wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 5%+ || wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 5%-`
|
||||
(label :text "${ json_volume.source != 0 ? '' : '' } ${json_volume.source}%"))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,6 +0,0 @@
|
||||
(defwidget battery [ ?device ]
|
||||
(box :class "battery"
|
||||
:visible { EWW_BATTERY != "" ? true : false }
|
||||
(label :text " ${ EWW_BATTERY != '' ? EWW_BATTERY?.status : '' }%")
|
||||
)
|
||||
)
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
(defwidget cc-toggle []
|
||||
(eventbox :onclick "sh scripts/eww-window.sh toggle control-center"
|
||||
:onrightclick "makoctl mode -t dnd"
|
||||
:class "control-center-toggle ${ window_state_control-center == "open" ? "open" : "closed" }"
|
||||
(box :class "button"
|
||||
{ notification_modes =~ "dnd" ? "" : ""}
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,26 +0,0 @@
|
||||
(defwidget clock []
|
||||
(box :class "clock"
|
||||
:tooltip { day_name + ", " + month_name + formattime(EWW_TIME, " %d") }
|
||||
|
||||
(eventbox :onclick "sh scripts/eww-window.sh toggle calendar-window"
|
||||
:class '${ window_state_calendar-window == "open" ? "cal-open" : "" } button'
|
||||
(box :space-evenly false
|
||||
(box :space-evenly false
|
||||
:class "time"
|
||||
(label :text ""
|
||||
:class "icon")
|
||||
|
||||
(label :text "${day_name}")
|
||||
|
||||
(revealer :reveal { window_state_calendar-window == "closed" }
|
||||
:transition "slideright"
|
||||
:duration "240ms"
|
||||
:class "unrevealer"
|
||||
|
||||
(label :text { formattime(EWW_TIME, "%d, %H:%M") } )
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,19 +0,0 @@
|
||||
(defwidget hardware [ ?cpu ?memory ?visible ]
|
||||
(eventbox :class "hardware-eventbox button"
|
||||
:onclick "sh ${EWW_CONFIG_DIR}/scripts/eww-window.sh toggle hardware-monitor"
|
||||
:visible { visible == "" || visible ? true : false }
|
||||
(box :class "hardware"
|
||||
:space-evenly false
|
||||
(box :class "cpu"
|
||||
:visible { cpu == "" || cpu ? true : false }
|
||||
:tooltip { "CPU: " + arraylength(EWW_CPU?.cores) + " Threads" }
|
||||
(label :text " ${ round(EWW_CPU?.avg, 0) }%")
|
||||
)
|
||||
(box :class "memory"
|
||||
:visible { memory == "" || memory ? true : false }
|
||||
:tooltip { "Total Memory: " + round(EWW_RAM?.total_mem / 1000000000, 1) + " GiB(s)" }
|
||||
(label :text " ${ round(EWW_RAM?.used_mem_perc, 0) }%")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,5 +0,0 @@
|
||||
(defwidget logo []
|
||||
(button :class "distro-logo"
|
||||
:onclick "hyprctl dispatch exec anyrun"
|
||||
" ")
|
||||
)
|
||||
@@ -1,65 +0,0 @@
|
||||
|
||||
(defvar media_reveal_controls false)
|
||||
|
||||
(defwidget media []
|
||||
(eventbox :onhover "${EWW_CMD} update media_reveal_controls=true"
|
||||
:onhoverlost "${EWW_CMD} update media_reveal_controls=false"
|
||||
:visible { json_media == "" || (json_media.title == "null" &&
|
||||
json_media.artist == "null") ||
|
||||
(json_active_window.class =~ json_media.player ||
|
||||
json_active_window.title =~ json_media.title) ?
|
||||
false : true
|
||||
}
|
||||
:onclick "sh scripts/eww-window.sh toggle floating-media"
|
||||
:class "mediaplayer-eventbox"
|
||||
|
||||
(box :class "mediaplayer ${ media_reveal_controls && window_state_floating-media == "closed" ? 'revealed' : '' }"
|
||||
:space-evenly false
|
||||
|
||||
(eventbox :class "media"
|
||||
:tooltip "${json_media.title} - ${json_media.artist}"
|
||||
|
||||
(box :space-evenly false
|
||||
(label :class "player"
|
||||
:text { json_media.player == "spotify" ? " " : " " })
|
||||
|
||||
(label :class "media-title"
|
||||
:text "${json_media.title}"
|
||||
:limit-width 40)
|
||||
|
||||
(separator :orientation "horizontal"
|
||||
:alpha 0.8
|
||||
:style "border-radius: 2x;")
|
||||
|
||||
(label :class "media-artist"
|
||||
:text "${json_media.artist}"
|
||||
:limit-width 25)
|
||||
)
|
||||
)
|
||||
(revealer :class "media-controls-revealer"
|
||||
:reveal { media_reveal_controls ? "${ window_state_floating-media == 'closed' ? true : false }" : false }
|
||||
:transition "slideright"
|
||||
:duration "220ms"
|
||||
|
||||
(box :class "media-controls"
|
||||
(button :class "url"
|
||||
:onclick "wl-copy '${json_media.url}'"
|
||||
:tooltip "Copy link to Clipboard"
|
||||
:visible { json_media.url != "" && json_media.url != "null" }
|
||||
"")
|
||||
(button :class "previous"
|
||||
:onclick "playerctl previous --player=${json_media.player}"
|
||||
"")
|
||||
|
||||
(button :class "toggle play-pause"
|
||||
:onclick "playerctl play-pause --player=${json_media.player}"
|
||||
{ json_media.status == "playing" ? "" : "" })
|
||||
|
||||
(button :class "next"
|
||||
:onclick "playerctl next --player=${json_media.player}"
|
||||
"")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,8 +0,0 @@
|
||||
(defwidget network []
|
||||
(eventbox :class "button network-eventbox"
|
||||
:onclick "hyprctl dispatch exec 'nm-connection-editor'"
|
||||
(box :class "network"
|
||||
(label :text "${ network_status == 'full' ? ' ' : ' ' }")
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,29 +0,0 @@
|
||||
|
||||
(defwidget window []
|
||||
(box :class "window"
|
||||
:visible { json_active_window.class == "" || json_active_window.class == "null" ? false : true }
|
||||
:space-evenly false
|
||||
:valign "center"
|
||||
:orientation "horizontal"
|
||||
|
||||
(image :class "icon"
|
||||
:icon "${ json_active_window.initialClass =~ 'zen' ? 'zen-browser' : json_active_window.initialClass }"
|
||||
:icon-size "toolbar")
|
||||
|
||||
(box :class "info"
|
||||
:orientation { json_active_window.title == "" ? "horizontal" : "vertical" }
|
||||
:space-evenly false
|
||||
(label :class "window-class"
|
||||
:text "${json_active_window.class}"
|
||||
:xalign 0
|
||||
:yalign 0)
|
||||
(label :class "window-title"
|
||||
:text "${json_active_window.title}"
|
||||
:visible { json_active_window.title != "" ? true : false }
|
||||
:limit-width 45
|
||||
:tooltip "${json_active_window.title}"
|
||||
:xalign 0
|
||||
:yalign 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,13 +0,0 @@
|
||||
(defvar hover_workspaces false)
|
||||
|
||||
(defwidget workspaces []
|
||||
(eventbox :onscroll "[[ {} == up ]] && hyprctl dispatch workspace e+1 >> /dev/null || hyprctl dispatch workspace e-1 >> /dev/null"
|
||||
:class "workspaces-eventbox"
|
||||
:onhover "${EWW_CMD} update hover_workspaces=true"
|
||||
:onhoverlost "${EWW_CMD} update hover_workspaces=false"
|
||||
(box :class "workspaces"
|
||||
:valign "center"
|
||||
(literal :content literal_workspaces)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,84 +0,0 @@
|
||||
(defwidget big-media [ show-album-bg show-album-image ?album-image-size ?style ?visible ]
|
||||
(box :class "big-media ${ show-album-bg ? 'album-bg' : '' } ${ show-album-image ? 'album-image' : '' }"
|
||||
:style "${ show-album-bg ? "background-image: url(\"${ json_media.artUrl != "null" ? json_media.artUrl : '' }\")" : "" }; ${style}"
|
||||
:visible { visible == false ? false : true }
|
||||
:space-evenly false
|
||||
:orientation "vertical"
|
||||
|
||||
(box :orientation "horizontal"
|
||||
:space-evenly false
|
||||
:class "media"
|
||||
|
||||
(box :class "album-image"
|
||||
:width { album-image-size != "" ? album-image-size : 98 }
|
||||
:height { album-image-size != "" ? "${album-image-size - 11}" : 87 }
|
||||
:style "background-image: url(\"${ json_media.artUrl != "null" ? json_media.artUrl : "" }\");"
|
||||
:valign "center"
|
||||
:visible { json_media.artUrl == "null" || !show-album-image ? false : true })
|
||||
|
||||
(box :orientation "vertical"
|
||||
:space-evenly false
|
||||
:class "right"
|
||||
:valign "center"
|
||||
|
||||
(box :class "media-info"
|
||||
:space-evenly false
|
||||
:orientation "vertical"
|
||||
|
||||
(label :class "title"
|
||||
:text "${json_media.title}"
|
||||
:xalign 0
|
||||
:limit-width 40
|
||||
:show-truncated true)
|
||||
(label :class "artist"
|
||||
:text "${json_media.artist}"
|
||||
:xalign 0
|
||||
:limit-width 40
|
||||
:show-truncated true)
|
||||
)
|
||||
|
||||
(box :class "controls"
|
||||
:orientation "horizontal"
|
||||
:space-evenly false
|
||||
:halign "start"
|
||||
|
||||
(box :class "button-row"
|
||||
:orientation "horizontal"
|
||||
:space-evenly false
|
||||
:halign "start"
|
||||
:visible { json_media.url != "null" ? true : false }
|
||||
|
||||
(button :class "url"
|
||||
:onclick "wl-copy '${json_media.url}'"
|
||||
:style "padding-right: 13px;"
|
||||
:tooltip "Copy link to Clipboard"
|
||||
"")
|
||||
)
|
||||
|
||||
(box :class "button-row"
|
||||
:orientation "horizontal"
|
||||
:space-evenly false
|
||||
:halign "start"
|
||||
|
||||
(button :class "shuffle"
|
||||
:onclick "playerctl --player=${json_media.player} shuffle Toggle"
|
||||
:tooltip "Toggle shuffle"
|
||||
"")
|
||||
(button :class "previous"
|
||||
:onclick "playerctl --player=${json_media.player} previous"
|
||||
:tooltip "Previous"
|
||||
"")
|
||||
(button :class "play-pause"
|
||||
:onclick "playerctl --player=${json_media.player} play-pause"
|
||||
:tooltip { json_media.status == "playing" ? "Pause" : "Play" }
|
||||
{ json_media.status == "playing" ? "" : "" })
|
||||
(button :class "next"
|
||||
:onclick "playerctl --player=${json_media.player} next"
|
||||
:tooltip "Next"
|
||||
"")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,59 +0,0 @@
|
||||
(defwidget notification [ ?application_name ?icon summary body ?image ?onclickclose ?onclick ]
|
||||
(eventbox :onclick "${onclick}"
|
||||
(box :class "notification"
|
||||
:orientation "vertical"
|
||||
:height 96
|
||||
:space-evenly false
|
||||
|
||||
(box :class "top"
|
||||
:orientation "horizontal"
|
||||
:space-evenly false
|
||||
|
||||
(box :class "app-info"
|
||||
:space-evenly false
|
||||
:halign "start"
|
||||
:hexpand true
|
||||
:vexpand false
|
||||
|
||||
(image :class "app-icon"
|
||||
:visible { icon != "" ? true : false }
|
||||
:icon "${icon}"
|
||||
:icon-size "menu")
|
||||
(label :class "app-name"
|
||||
:text "${application_name}")
|
||||
)
|
||||
(button :class "close"
|
||||
:onclick "${onclickclose}"
|
||||
:visible true
|
||||
"")
|
||||
)
|
||||
|
||||
(box :class "content"
|
||||
:space-evenly false
|
||||
(box :class "image"
|
||||
:width 96
|
||||
:height 96
|
||||
:visible { image != "" && image != "\{\}" ? true : false }
|
||||
:style { image != "" ? "background-image: url('${ image =~ "^file://(.*)$" || image =~ "^http(.*)://(.*)$" ? image : "${ "file://" + image }" }');" : "" }
|
||||
)
|
||||
|
||||
(box :class "text"
|
||||
:orientation "vertical"
|
||||
:space-evenly false
|
||||
|
||||
(label :class "summary"
|
||||
:markup "${summary}"
|
||||
:xalign 0
|
||||
:halign "start"
|
||||
:show-truncated true)
|
||||
|
||||
(label :class "body"
|
||||
:markup "${body}"
|
||||
:xalign 0
|
||||
:show-truncated false
|
||||
:wrap true)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,38 +0,0 @@
|
||||
(defwidget notifications []
|
||||
(scroll :class "cc-notifications scroll"
|
||||
:hscroll false
|
||||
:vscroll true
|
||||
:vexpand true
|
||||
:style "border-radius: 16px;"
|
||||
|
||||
(box :class "notifications"
|
||||
:orientation "vertical"
|
||||
:space-evenly false
|
||||
|
||||
(for notification in { json_notification_history["history"] }
|
||||
(notification :application_name "${notification.app-name.data}"
|
||||
:image "${notification.app-icon.data}"
|
||||
:summary "${notification.summary.data}"
|
||||
:body "${notification.body.data}"
|
||||
:onclickclose "sh scripts/notification-remove.sh ${notification.id.data}"
|
||||
:icon "${notification.app-name.data}")
|
||||
)
|
||||
|
||||
(box :class "empty-notifications"
|
||||
:visible { arraylength(json_notification_history["history"]) == 0 }
|
||||
:style "margin-top: 50px;"
|
||||
:space-evenly false
|
||||
:orientation "vertical"
|
||||
:halign "center"
|
||||
:valign "center"
|
||||
|
||||
(label :class "bell-icon"
|
||||
:text ""
|
||||
:style "font-size: 96px")
|
||||
|
||||
(label :text "You're done!"
|
||||
:style "margin-left: 12px;")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,75 +0,0 @@
|
||||
(defwidget tiles []
|
||||
(box :class "tiles-grid"
|
||||
:orientation "vertical"
|
||||
(box :class "tiles tiles1"
|
||||
(tile :icon ''
|
||||
:label "Network"
|
||||
:enabled { network_status == "full" ? true : false }
|
||||
:onenable "nmcli n on > /dev/null"
|
||||
:ondisable "nmcli n off > /dev/null"
|
||||
:visible true
|
||||
:class "network")
|
||||
|
||||
(tile :icon ''
|
||||
:label "Bluetooth"
|
||||
:enabled { bluetooth_powered == "yes" ? true : false }
|
||||
:onenable "bluetoothctl power on > /dev/null"
|
||||
:ondisable "bluetoothctl power off > /dev/null"
|
||||
:visible { bluetooth_powered == "" ? false : true })
|
||||
|
||||
(tile :icon ''
|
||||
:label "Do Not Disturb"
|
||||
:enabled { notification_modes =~ "dnd" ? true : false }
|
||||
:onenable "makoctl mode -a dnd"
|
||||
:ondisable "makoctl mode -r dnd"
|
||||
:visible true
|
||||
:class "dnd")
|
||||
)
|
||||
(box :class "tiles tiles2"
|
||||
:visible true
|
||||
(tile :icon ''
|
||||
:label "Airplane Mode"
|
||||
:enabled { (network_status != "full" && network_status != "partial") && bluetooth_powered != "yes" ? true : false }
|
||||
:onenable "bluetoothctl power off; nmcli n off"
|
||||
:ondisable "bluetoothctl power on; nmcli n on")
|
||||
(tile :icon ''
|
||||
:label "Screen Record"
|
||||
:enabled "${is_recording}"
|
||||
:onenable "hyprctl dispatch exec \"sh $HOME/.config/eww/scripts/screen-recording.sh\" >> /dev/null"
|
||||
:ondisable "kill $(cat $HOME/.cache/recording.pid)"
|
||||
:class "screen-rec")
|
||||
(tile :icon ''
|
||||
:label "Night Light"
|
||||
:enabled "${night_light}"
|
||||
:onenable "hyprctl dispatch exec \"sh $HOME/.config/eww/scripts/night-light.sh\""
|
||||
:ondisable "kill $(cat $HOME/.cache/night-light.pid)"
|
||||
:class "night-light")
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(defwidget tile [ ?class icon label ?onclickarrow ?enabled onenable ondisable ?visible ?min-width ]
|
||||
(checkbox :onchecked "${onenable}"
|
||||
:onunchecked "${ondisable}"
|
||||
:visible { visible == "" || visible ? true : false }
|
||||
:checked { enabled == "" || !enabled ? false : true }
|
||||
:timeout "2s"
|
||||
:class "tile-checkbox ${class}"
|
||||
|
||||
(box :class "tile"
|
||||
:space-evenly false
|
||||
:valign "center"
|
||||
|
||||
(label :text "${icon}"
|
||||
:class "icon"
|
||||
:unindent true
|
||||
:limit-width 1
|
||||
:show-truncated false
|
||||
:xalign 0)
|
||||
|
||||
(label :text "${label}"
|
||||
:class "label"
|
||||
:xalign 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,46 +0,0 @@
|
||||
(defwidget top-bar []
|
||||
(box :class "top-bar"
|
||||
:orientation "horizontal"
|
||||
|
||||
(box :class "left"
|
||||
:orientation "vertical"
|
||||
:halign "start"
|
||||
:space-evenly false
|
||||
|
||||
(label :xalign 0
|
||||
:text " ${hostname}"
|
||||
:class "hostname")
|
||||
|
||||
(label :xalign 0
|
||||
:text " ${uptime_info}"
|
||||
:class "uptime")
|
||||
)
|
||||
|
||||
(box :orientation "horizontal"
|
||||
:class "button-row"
|
||||
:space-evenly false
|
||||
:halign "end"
|
||||
|
||||
(button :class "lock"
|
||||
:onclick "hyprctl dispatch exec hyprlock"
|
||||
:tooltip "Lock"
|
||||
'')
|
||||
(button :class "color-picker"
|
||||
:onclick "hyprctl dispatch exec 'sh $HOME/.config/eww/scripts/color-picker.sh'"
|
||||
:tooltip "Pick a Color"
|
||||
'')
|
||||
(button :class "screenshot"
|
||||
:onclick "hyprctl dispatch exec 'hyprshot -m region -o $HOME/Screenshots'"
|
||||
:tooltip "Select to screenshot"
|
||||
'')
|
||||
(button :class "wallpaper"
|
||||
:onclick "hyprctl dispatch exec 'sh $HOME/.config/hypr/scripts/change-wallpaper.sh'"
|
||||
:tooltip "Select a wallpaper"
|
||||
'')
|
||||
(button :class "powermenu"
|
||||
:onclick "sh scripts/eww-window.sh close bar && sh scripts/eww-window.sh open powermenu"
|
||||
:tooltip "Choose power options"
|
||||
'')
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,4 +0,0 @@
|
||||
(defwidget separator [ ?orientation ?alpha ?style ]
|
||||
(box :class "separator ${ orientation == '' || orientation == 'horizontal' || orientation == "h" ? 'horizontal' : 'vertical' }"
|
||||
:style "opacity: ${ alpha == '' ? 1 : alpha }; ${style}")
|
||||
)
|
||||
@@ -1,19 +0,0 @@
|
||||
(defwidget output-slider []
|
||||
(box :class "slider output-slider"
|
||||
:space-evenly true
|
||||
|
||||
(overlay
|
||||
(scale :min 0
|
||||
:max 101 ; dirty fix max 99% volume
|
||||
:value "${json_volume.output}"
|
||||
:orientation "horizontal"
|
||||
:draw-value false
|
||||
:flipped false
|
||||
:onchange "wpctl set-volume @DEFAULT_AUDIO_SINK@ $(awk -v n={} 'BEGIN { print (n / 100) }')"
|
||||
:tooltip "${json_volume.output}")
|
||||
|
||||
(label :text ""
|
||||
:xalign 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,20 +0,0 @@
|
||||
(defwidget source-slider []
|
||||
(box :class "slider source-slider"
|
||||
:space-evenly true
|
||||
|
||||
(overlay
|
||||
(scale :min 0
|
||||
:max 101 ; dirty fix 99% max volume
|
||||
:value "${json_volume.source}"
|
||||
:orientation "horizontal"
|
||||
:draw-value false
|
||||
:flipped false
|
||||
:onchange "wpctl set-volume @DEFAULT_AUDIO_SOURCE@ $(awk -v n={} 'BEGIN { print (n / 100) }')"
|
||||
:class "output-volume-slider"
|
||||
:tooltip "${json_volume.source}")
|
||||
|
||||
(label :text ""
|
||||
:xalign 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,60 +0,0 @@
|
||||
(include "widgets/bar/workspaces.yuck")
|
||||
(include "widgets/bar/clock.yuck")
|
||||
(include "widgets/bar/cc-toggle.yuck")
|
||||
(include "widgets/bar/audio.yuck")
|
||||
(include "widgets/bar/media.yuck")
|
||||
(include "widgets/bar/logo.yuck")
|
||||
(include "widgets/bar/window.yuck")
|
||||
(include "widgets/bar/network.yuck")
|
||||
(include "widgets/bar/battery.yuck")
|
||||
(include "widgets/bar/hardware.yuck")
|
||||
|
||||
(defwindow bar
|
||||
:monitor 0
|
||||
:geometry (geometry :width "100%"
|
||||
:height "46px"
|
||||
:anchor "top center")
|
||||
:stacking "fg"
|
||||
:exclusive true
|
||||
:namespace "eww-bar"
|
||||
(box :class "bar"
|
||||
:vexpand true
|
||||
:hexpand false
|
||||
(centerbox :orientation "horizontal"
|
||||
(box :class "widgets-left"
|
||||
:halign "start"
|
||||
:space-evenly false
|
||||
:vexpand true
|
||||
|
||||
(logo)
|
||||
(workspaces)
|
||||
(window)
|
||||
)
|
||||
(box :class "widgets-center"
|
||||
:halign "center"
|
||||
:space-evenly false
|
||||
:vexpand true
|
||||
|
||||
(clock)
|
||||
(media)
|
||||
)
|
||||
(box :class "widgets-right"
|
||||
:halign "end"
|
||||
:space-evenly false
|
||||
:vexpand true
|
||||
|
||||
(systray :spacing 0
|
||||
:orientation "horizontal"
|
||||
:space-evenly false
|
||||
:icon-size 14
|
||||
:prepend-new false
|
||||
:class "systray"
|
||||
)
|
||||
(audio)
|
||||
(battery)
|
||||
(network)
|
||||
(cc-toggle)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,24 +0,0 @@
|
||||
(defwindow calendar-window
|
||||
:monitor 0
|
||||
:geometry (geometry :anchor "top center"
|
||||
:y "5px")
|
||||
:stacking "fg"
|
||||
:exclusive false
|
||||
:namespace "eww-calendar"
|
||||
|
||||
(box :class "calendar-box"
|
||||
:space-evenly false
|
||||
:orientation "vertical"
|
||||
|
||||
(label :class "time"
|
||||
:text { formattime(EWW_TIME, "%H:%M") })
|
||||
|
||||
(label :class "date"
|
||||
:text { month_name + formattime(EWW_TIME, " %d, %Y") })
|
||||
(calendar :class "month-calendar"
|
||||
:show-details true
|
||||
:show-heading true
|
||||
:show-day-names true
|
||||
:show-week-numbers false)
|
||||
)
|
||||
)
|
||||
@@ -1,47 +0,0 @@
|
||||
(include "widgets/control-center/top-bar.yuck")
|
||||
(include "widgets/control-center/notifications.yuck")
|
||||
(include "widgets/control-center/notification.yuck")
|
||||
(include "widgets/control-center/tiles.yuck")
|
||||
|
||||
(defwindow control-center []
|
||||
:monitor 0
|
||||
:geometry (geometry :width "500px"
|
||||
:height "90%"
|
||||
:anchor "top right")
|
||||
:stacking "overlay"
|
||||
:exclusive false
|
||||
:namespace "eww-cc"
|
||||
|
||||
(box :orientation "horizontal"
|
||||
(eventbox
|
||||
(box :class "cc"
|
||||
:orientation "vertical"
|
||||
:space-evenly false
|
||||
|
||||
(top-bar)
|
||||
(tiles)
|
||||
(revealer :reveal { window_state_floating-media != "open" }
|
||||
:transition "slideup"
|
||||
:duration "380ms"
|
||||
|
||||
(big-media :show-album-bg true
|
||||
:show-album-image true
|
||||
:visible { json_media == "" || (json_media.title == "null"
|
||||
&& json_media.artist == "null") ? false : true })
|
||||
)
|
||||
(separator :orientation "vertical"
|
||||
:alpha ".08")
|
||||
(notifications)
|
||||
(box :class "bottom button-row"
|
||||
:halign "end"
|
||||
:space-evenly false
|
||||
|
||||
(button :class "clear-all"
|
||||
:onclick "sh scripts/notification-clear.sh"
|
||||
:visible { arraylength(json_notification_history["history"]) > 0 }
|
||||
" Clear")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,24 +0,0 @@
|
||||
(defwindow floating-media []
|
||||
:monitor 0
|
||||
:geometry (geometry :anchor "top center"
|
||||
:width "460px"
|
||||
:y "5px")
|
||||
:exclusive false
|
||||
:stacking "fg"
|
||||
:focusable false
|
||||
:namespace "eww-media"
|
||||
(box :class "floating-media"
|
||||
:orientation "vertical"
|
||||
:space-evenly false
|
||||
:visible { json_media == "" || (json_media.title == "null"
|
||||
&& json_media.artist == "null") ? false : true }
|
||||
|
||||
(big-media :show-album-bg true
|
||||
:album-image-size 128
|
||||
:show-album-image true
|
||||
:style "margin: 16px; margin-top: 0; box-shadow:
|
||||
0 5px 6px 1px rgba(0, 0, 0, .6),
|
||||
inset 0 0 0 200px rgba(0, 0, 0, .52);"
|
||||
:visible true)
|
||||
)
|
||||
)
|
||||
@@ -1,115 +0,0 @@
|
||||
(defwindow floating-notifications []
|
||||
:monitor 0
|
||||
:exclusive false
|
||||
:focusable false
|
||||
:namespace "eww-notification-popup"
|
||||
:geometry (geometry :anchor "top right"
|
||||
:width "512px"
|
||||
:height "1px"
|
||||
:x "5px"
|
||||
:y "6px")
|
||||
:stacking "overlay"
|
||||
|
||||
(box :class "floating-notifications"
|
||||
:orientation "vertical"
|
||||
:space-evenly false
|
||||
:hexpand true
|
||||
:vexpand false
|
||||
|
||||
(box :class "notifications"
|
||||
:space-evenly false
|
||||
:orientation "vertical"
|
||||
|
||||
(for item in { json_popup_notifications["notifications"] }
|
||||
(floating-notification :summary "${item.summary.data}"
|
||||
:body "${item.body.data}"
|
||||
:image "${item.app-icon.data}"
|
||||
:app-name "${item.app-name.data}"
|
||||
:onhoverlost "sh scripts/notification-popup-remove.sh ${item.id.data}")
|
||||
)
|
||||
)
|
||||
|
||||
(box :visible { arraylength(json_popup_notifications?.["notifications"]) > 0 }
|
||||
:orientation "horizontal"
|
||||
:valign "end"
|
||||
:class "bottom"
|
||||
:space-evenly true
|
||||
:vexpand false
|
||||
|
||||
(box :class "left"
|
||||
:space-evenly false
|
||||
(box :space-evenly false
|
||||
:class "tip"
|
||||
:valign "center"
|
||||
(label :text ""
|
||||
:class "icon")
|
||||
(label :halign "start"
|
||||
:text "Hover to dismiss"
|
||||
:yalign 0.5)
|
||||
)
|
||||
)
|
||||
|
||||
(box :class "right"
|
||||
:space-evenly false
|
||||
:halign "end"
|
||||
(eventbox :class "button"
|
||||
:onclick "sh ${EWW_CONFIG_DIR}/scripts/eww-window.sh close floating-notifications; ${EWW_CMD} update 'json_popup_notifications={\"notifications\": []}'"
|
||||
(box :class "clear-all"
|
||||
:space-evenly false
|
||||
|
||||
(label :text ""
|
||||
:class "icon")
|
||||
(label :text "Clear all")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(defwidget floating-notification [ summary body image app-name ?onhoverlost ]
|
||||
(eventbox :onhoverlost "${onhoverlost}"
|
||||
:class "floating-notification-eventbox"
|
||||
(box :class "floating-notification"
|
||||
:space-evenly false
|
||||
:orientation "vertical"
|
||||
|
||||
(box :orientation "horizontal"
|
||||
:class "top"
|
||||
:space-evenly false
|
||||
|
||||
(image :class "app-icon"
|
||||
:icon "${ app-name =~ 'zen-alpha' ? 'zen-browser' : app-name }"
|
||||
:icon-size "menu")
|
||||
|
||||
(label :text "${app-name}"
|
||||
:xalign 0)
|
||||
)
|
||||
|
||||
(box :orientation "horizontal"
|
||||
:space-evenly false
|
||||
:class "content"
|
||||
(box :class "image"
|
||||
:style "background-image: image(url('${image}'));"
|
||||
:width 86
|
||||
:height 85
|
||||
:visible { image != "" ? true : false })
|
||||
|
||||
(box :class "text-content"
|
||||
:orientation "vertical"
|
||||
:space-evenly false
|
||||
|
||||
(label :class "summary"
|
||||
:markup "${summary}"
|
||||
:xalign 0)
|
||||
|
||||
(label :class "body"
|
||||
:markup "${body}"
|
||||
:xalign 0
|
||||
:wrap true
|
||||
:show-truncated false)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,15 +0,0 @@
|
||||
(defwindow hardware-monitor []
|
||||
:monitor 0
|
||||
:geometry (geometry :width "320"
|
||||
:anchor "top right"
|
||||
:y "5px")
|
||||
|
||||
:exclusive 0
|
||||
:namespace "eww-hardware"
|
||||
:focusable false
|
||||
:stacking "fg"
|
||||
|
||||
(box :class "hardware-monitor"
|
||||
; TODO
|
||||
)
|
||||
)
|
||||
@@ -1,33 +0,0 @@
|
||||
(defwindow powermenu []
|
||||
:monitor 0
|
||||
:geometry (geometry :width "100%"
|
||||
:height "100%")
|
||||
|
||||
:stacking "overlay"
|
||||
:namespace "eww-powermenu"
|
||||
:focusable true
|
||||
:exclusive true
|
||||
|
||||
(eventbox :class "outside"
|
||||
:onclick "sh scripts/eww-window.sh close powermenu; sh scripts/eww-window.sh open bar"
|
||||
(box :space-evenly true
|
||||
:halign "center"
|
||||
:class "powermenu-container"
|
||||
(button :class "poweroff"
|
||||
:onclick "systemctl poweroff"
|
||||
"")
|
||||
(button :class "reboot"
|
||||
:onclick "systemctl reboot"
|
||||
"")
|
||||
(button :class "suspend"
|
||||
:onclick "systemctl suspend"
|
||||
"")
|
||||
(button :class "logout"
|
||||
:onclick "loginctl kill-user $(sh -c 'echo $USER')"
|
||||
"")
|
||||
;(button :class "close"
|
||||
; :onclick "sh scripts/eww-window.sh close powermenu; sh scripts/eww-window.sh open bar"
|
||||
;"")
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,39 +0,0 @@
|
||||
(include "./widgets/volume-control/output-slider.yuck")
|
||||
(include "./widgets/volume-control/source-slider.yuck")
|
||||
|
||||
(defwindow volume-control []
|
||||
:monitor 0
|
||||
:namespace "eww-volume"
|
||||
:geometry (geometry :anchor "top right"
|
||||
:width "280px"
|
||||
:x "6px"
|
||||
:y "5px")
|
||||
:exclusive false
|
||||
:stacking "overlay"
|
||||
:focusable false
|
||||
|
||||
(box :class "volume-control"
|
||||
:space-evenly false
|
||||
:orientation "vertical"
|
||||
|
||||
(output-slider)
|
||||
(source-slider)
|
||||
|
||||
(separator :orientation "vertical"
|
||||
:alpha 0.5)
|
||||
|
||||
(box :class "vertical button-row"
|
||||
:orientation "vertical"
|
||||
|
||||
(button :class "bluetooth-devices"
|
||||
:onclick "sh scripts/eww-window.sh close volume-control; hyprctl dispatch exec overskride"
|
||||
(label :text "Bluetooth devices"
|
||||
:xalign 0))
|
||||
|
||||
(button :class "more-devices"
|
||||
:onclick "sh scripts/eww-window.sh close volume-control; hyprctl dispatch exec pavucontrol"
|
||||
(label :text "More settings"
|
||||
:xalign 0))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -1,16 +0,0 @@
|
||||
(defwindow volume-popup []
|
||||
:monitor 0
|
||||
:stacking "overlay"
|
||||
:namespace "volume-popup"
|
||||
:focusable false
|
||||
:exclusive false
|
||||
:geometry (geometry :width 180
|
||||
:anchor "top center"
|
||||
:y "10px")
|
||||
|
||||
(box :class "volume-popup"
|
||||
(output-slider)
|
||||
(source-slider)
|
||||
; TODO
|
||||
)
|
||||
)
|
||||
@@ -24,7 +24,7 @@ bind = $mainMod, F, togglefloating
|
||||
bind = $mainMod, SPACE, exec, $menu
|
||||
bind = $mainMod, P, pseudo,
|
||||
bind = $mainMod, J, togglesplit
|
||||
bind = $mainMod, N, exec, sh $HOME/.config/eww/scripts/eww-window.sh toggle control-center
|
||||
bind = $mainMod, N, exec, sh $XDG_CONFIG_HOME/eww/scripts/eww-window.sh toggle control-center
|
||||
bind = $mainMod, L, exec, $lockscreen
|
||||
bind = $mainMod, F11, fullscreen
|
||||
|
||||
@@ -46,10 +46,10 @@ bind = , Print, exec, $screenshotSelect
|
||||
bind = $mainMod, Print, exec, $screenshotFull
|
||||
|
||||
# Open clipboard
|
||||
bind = $mainMod, V, exec, cliphist list | $dmenu | cliphist decode | xargs -r wl-copy
|
||||
bind = $mainMod, V, exec, cliphist list | anyrun --plugins libstdin.so | read pipe | [[ $pipe == "" ]] || echo $pipe | cliphist decode | wl-copy
|
||||
|
||||
# Open wallpaper menu
|
||||
bind = $mainMod, W, exec, env bash $HOME/.config/hypr/scripts/change-wallpaper.sh
|
||||
bind = $mainMod, W, exec, sh $XDG_CONFIG_HOME/hypr/scripts/change-wallpaper.sh
|
||||
|
||||
# Reload binds
|
||||
# Eww
|
||||
|
||||
@@ -68,10 +68,12 @@ layerrule = blur, eww-calendar
|
||||
layerrule = blur, eww-cc
|
||||
layerrule = blur, eww-volume
|
||||
layerrule = blur, eww-powermenu
|
||||
layerrule = blur, top-bar
|
||||
layerrule = ignorealpha .6, eww-volume
|
||||
layerrule = ignorealpha .55, eww-bar
|
||||
layerrule = ignorealpha .5, eww-calendar
|
||||
layerrule = ignorealpha .7, eww-cc
|
||||
layerrule = ignorealpha .55, top-bar
|
||||
|
||||
# Workspace Rules
|
||||
#workspace = 1, persistent:true
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
# Lightweight Wayland Notification Daemon (mako) Configuration File
|
||||
# the man page of mako config file is a mess :skull:
|
||||
|
||||
# general
|
||||
max-history=20
|
||||
sort=-time
|
||||
actions=1
|
||||
history=1
|
||||
icons=1
|
||||
default-timeout=1
|
||||
ignore-timeout=1
|
||||
|
||||
# display
|
||||
layer=overlay
|
||||
anchor=top-right
|
||||
|
||||
# binding
|
||||
on-touch=invoke-default-action
|
||||
|
||||
# style
|
||||
font=Cantarell 12
|
||||
background-color=#1b2024
|
||||
padding=12
|
||||
width=420
|
||||
border-size=1
|
||||
border-color=#7e7e7ef0
|
||||
border-radius=14
|
||||
text-alignment=left
|
||||
margin=16
|
||||
max-icon-size=72
|
||||
|
||||
# [urgency="low"]
|
||||
# default-timeout=1
|
||||
|
||||
# [urgency="normal"]
|
||||
# default-timeout=1
|
||||
|
||||
# [urgency="critical"]
|
||||
# default-timeout=1
|
||||
|
||||
# modes
|
||||
[mode="dnd"]
|
||||
invisible=1
|
||||
|
||||
# vim: ft=cfg
|
||||
# nvim: ft=cfg
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
HYPRLAND_DOTS_DIRS=("hypr" "eww" "anyrun" "kitty" "wal" "fastfetch" "mako")
|
||||
HYPRLAND_DOTS_DIRS=("hypr" "ags" "anyrun" "kitty" "wal" "fastfetch")
|
||||
WALLPAPERS_DIR="$HOME/wallpapers"
|
||||
|
||||
printf "\n"
|
||||
|
||||
|
After Width: | Height: | Size: 932 KiB |
|
After Width: | Height: | Size: 4.5 MiB |
|
After Width: | Height: | Size: 4.5 MiB |
|
After Width: | Height: | Size: 850 KiB |
|
Before Width: | Height: | Size: 10 MiB After Width: | Height: | Size: 10 MiB |
|
After Width: | Height: | Size: 55 KiB |