ags,hypr: initial code!

This commit is contained in:
retrozinndev
2025-01-22 13:45:59 -03:00
parent 5defceb05e
commit 37687b3e62
84 changed files with 368 additions and 2621 deletions
+2
View File
@@ -0,0 +1,2 @@
node_modules/
@girs/
+13
View File
@@ -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);
}
});
+21
View File
@@ -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
}
+21
View File
@@ -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
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"name": "astal-shell",
"dependencies": {
"astal": "/usr/share/astal/gjs"
}
}
+10
View File
@@ -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`)!
);
}
}
+57
View File
@@ -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"`)
}
);
}
+11
View File
@@ -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;
}
+16
View File
@@ -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;
}
}
+47
View File
@@ -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);
}
View File
+26
View File
@@ -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;
+14
View File
@@ -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"
}
}
View File
+11
View File
@@ -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>
)
}
+14
View File
@@ -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>
)
}
+10
View File
@@ -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>
)
}
+17
View File
@@ -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>
);
}
+21
View File
@@ -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);
}
+44
View File
@@ -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>
)
}
+1 -1
View File
@@ -10,7 +10,7 @@ echo "######################################"
printf "\n" printf "\n"
CONFIG_DIR="$HOME/.config" 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" DOTFILES_BACKUP_DIR="$HOME/hyprland-dotfiles-bkp"
echo "Welcome to my dotfiles installation script!" echo "Welcome to my dotfiles installation script!"
-10
View File
@@ -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";
-17
View File
@@ -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")
-12
View File
@@ -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
-18
View File
@@ -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
-17
View File
@@ -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 $()
-104
View File
@@ -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
-26
View File
@@ -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
-205
View File
@@ -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()
-17
View File
@@ -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
-8
View File
@@ -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
-73
View File
@@ -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/&/&amp;/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
-21
View File
@@ -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
-51
View File
@@ -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
-23
View File
@@ -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
-32
View File
@@ -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
-28
View File
@@ -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
-13
View File
@@ -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
-37
View File
@@ -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
-270
View File
@@ -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;
}
}
}
-41
View File
@@ -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;
}
}
}
-202
View File
@@ -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;
}
}
}
-76
View File
@@ -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;
}
}
}
}
-230
View File
@@ -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;
}
}
-32
View File
@@ -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;
}
}
-36
View File
@@ -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;
}
}
-59
View File
@@ -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"`)
-13
View File
@@ -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}%"))
)
)
)
-6
View File
@@ -1,6 +0,0 @@
(defwidget battery [ ?device ]
(box :class "battery"
:visible { EWW_BATTERY != "" ? true : false }
(label :text "󰁹 ${ EWW_BATTERY != '' ? EWW_BATTERY?.status : '' }%")
)
)
-10
View File
@@ -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" ? "󰂠" : "󰂚"}
)
)
)
-26
View File
@@ -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") } )
)
)
)
)
)
)
-19
View File
@@ -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) }%")
)
)
)
)
-5
View File
@@ -1,5 +0,0 @@
(defwidget logo []
(button :class "distro-logo"
:onclick "hyprctl dispatch exec anyrun"
" ")
)
-65
View File
@@ -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}"
"󰒭")
)
)
)
)
)
-8
View File
@@ -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' ? ' ' : '󰤭 ' }")
)
)
)
-29
View File
@@ -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)
)
)
)
-13
View File
@@ -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)
)
)
)
-84
View File
@@ -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;")
)
)
)
)
-75
View File
@@ -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)
)
)
)
-46
View File
@@ -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"
'󰗽')
)
)
)
-4
View File
@@ -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)
)
)
)
-60
View File
@@ -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)
)
)
)
)
-24
View File
@@ -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)
)
)
-47
View File
@@ -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")
)
)
)
)
)
-24
View File
@@ -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)
)
)
-115
View File
@@ -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)
)
)
)
)
)
-15
View File
@@ -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
)
)
-33
View File
@@ -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"
;"󰅖")
)
)
)
-39
View File
@@ -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))
)
)
)
-16
View File
@@ -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
)
)
+3 -3
View File
@@ -24,7 +24,7 @@ bind = $mainMod, F, togglefloating
bind = $mainMod, SPACE, exec, $menu bind = $mainMod, SPACE, exec, $menu
bind = $mainMod, P, pseudo, bind = $mainMod, P, pseudo,
bind = $mainMod, J, togglesplit 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, L, exec, $lockscreen
bind = $mainMod, F11, fullscreen bind = $mainMod, F11, fullscreen
@@ -46,10 +46,10 @@ bind = , Print, exec, $screenshotSelect
bind = $mainMod, Print, exec, $screenshotFull bind = $mainMod, Print, exec, $screenshotFull
# Open clipboard # 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 # 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 # Reload binds
# Eww # Eww
+2
View File
@@ -68,10 +68,12 @@ layerrule = blur, eww-calendar
layerrule = blur, eww-cc layerrule = blur, eww-cc
layerrule = blur, eww-volume layerrule = blur, eww-volume
layerrule = blur, eww-powermenu layerrule = blur, eww-powermenu
layerrule = blur, top-bar
layerrule = ignorealpha .6, eww-volume layerrule = ignorealpha .6, eww-volume
layerrule = ignorealpha .55, eww-bar layerrule = ignorealpha .55, eww-bar
layerrule = ignorealpha .5, eww-calendar layerrule = ignorealpha .5, eww-calendar
layerrule = ignorealpha .7, eww-cc layerrule = ignorealpha .7, eww-cc
layerrule = ignorealpha .55, top-bar
# Workspace Rules # Workspace Rules
#workspace = 1, persistent:true #workspace = 1, persistent:true
-46
View File
@@ -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 -1
View File
@@ -1,6 +1,6 @@
#!/usr/bin/bash #!/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" WALLPAPERS_DIR="$HOME/wallpapers"
printf "\n" printf "\n"
Binary file not shown.

After

Width:  |  Height:  |  Size: 932 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 KiB

Before

Width:  |  Height:  |  Size: 10 MiB

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB