├── .cache
└── eww
│ └── colors
│ ├── colors-foot.ini
│ ├── colors-gradience.json
│ ├── colors-hyprland.conf
│ ├── colors.css
│ ├── colors.scss
│ ├── current.json
│ ├── templates
│ ├── colors-foot.ini
│ ├── colors-gradience.json
│ ├── colors-hyprland.conf
│ ├── colors.css
│ └── colors.scss
│ └── wall.png
├── .config
├── Thunar
│ └── uca.xml
├── eww
│ ├── eww.scss
│ ├── eww.yuck
│ ├── scripts
│ │ ├── apps
│ │ ├── hyprland
│ │ ├── network
│ │ ├── nightlight
│ │ ├── notifications
│ │ ├── pacman
│ │ ├── powerprofile
│ │ ├── python
│ │ │ ├── apps.py
│ │ │ ├── hyprland.py
│ │ │ ├── material-colors.py
│ │ │ ├── mpris.py
│ │ │ ├── notifications.py
│ │ │ ├── utils.py
│ │ │ └── weather.py
│ │ ├── theme
│ │ └── volume
│ ├── scss
│ │ ├── common
│ │ │ ├── button.scss
│ │ │ ├── floating-widget.scss
│ │ │ ├── icon-image.scss
│ │ │ ├── scrollbar.scss
│ │ │ ├── slider.scss
│ │ │ ├── tooltip.scss
│ │ │ ├── unset.scss
│ │ │ └── widget.scss
│ │ ├── variables.scss
│ │ ├── widgets
│ │ │ ├── application.scss
│ │ │ ├── calendar.scss
│ │ │ ├── date.scss
│ │ │ ├── media.scss
│ │ │ ├── notification-center.scss
│ │ │ ├── notification.scss
│ │ │ └── separator.scss
│ │ └── windows
│ │ │ ├── bar.scss
│ │ │ ├── corners.scss
│ │ │ ├── desktop.scss
│ │ │ ├── dock.scss
│ │ │ ├── info-center.scss
│ │ │ ├── launcher.scss
│ │ │ ├── menu.scss
│ │ │ ├── notifications.scss
│ │ │ ├── overview.scss
│ │ │ ├── powermenu.scss
│ │ │ └── volume.scss
│ └── yuck
│ │ ├── setup.yuck
│ │ ├── widgets.yuck
│ │ ├── widgets
│ │ ├── application.yuck
│ │ ├── bar.yuck
│ │ ├── clock.yuck
│ │ ├── info-center.yuck
│ │ ├── media.yuck
│ │ ├── menu.yuck
│ │ ├── notification-center.yuck
│ │ ├── notification.yuck
│ │ ├── overview.yuck
│ │ └── separator.yuck
│ │ ├── windows.yuck
│ │ └── windows
│ │ ├── bar.yuck
│ │ ├── desktop.yuck
│ │ ├── dock.yuck
│ │ ├── info-center.yuck
│ │ ├── launcher.yuck
│ │ ├── menu.yuck
│ │ ├── notifications.yuck
│ │ ├── overview.yuck
│ │ ├── powermenu.yuck
│ │ └── volume.yuck
├── fontconfig
│ └── fonts.conf
├── foot
│ └── foot.ini
├── hypr
│ ├── animations.conf
│ ├── autostart.conf
│ ├── binds.conf
│ ├── hyprland.conf
│ ├── rules.conf
│ ├── settings.conf
│ └── theme.conf
├── lsd
│ ├── config.yaml
│ └── icons.yaml
└── starship
│ └── starship.toml
├── .local
└── bin
│ ├── actions
│ ├── checkoverview
│ ├── checkvolume
│ ├── color
│ ├── colorpicker
│ ├── dripshot
│ ├── eww
│ ├── fetch
│ ├── init
│ ├── lsd
│ ├── volume
│ ├── wallpaper
│ └── ytmp3
├── .zshenv
├── .zshrc
├── README.md
└── assets
├── desktop.png
├── launcher.png
├── main.png
├── overview.png
└── powermenu.png
/.cache/eww/colors/colors-foot.ini:
--------------------------------------------------------------------------------
1 | [colors]
2 | alpha=0.9
3 | foreground=1e1a1d
4 | background=fcfcfc
5 |
6 | regular0=fcfcfc
7 | regular1=ba1b1b
8 | regular2=85468d
9 | regular3=82524a
10 | regular4=350040
11 | regular5=251626
12 | regular6=85468d
13 | regular7=1e1a1d
14 |
15 | bright0=4d444c
16 | bright1=ba1b1b
17 | bright2=85468d
18 | bright3=82524a
19 | bright4=350040
20 | bright5=251626
21 | bright6=85468d
22 | bright7=1e1a1d
--------------------------------------------------------------------------------
/.cache/eww/colors/colors-gradience.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "material",
3 | "variables": {
4 | "accent_color": "#85468d",
5 | "accent_bg_color": "#85468d",
6 | "accent_fg_color": "#fcfcfc",
7 | "destructive_color": "#ffdad4",
8 | "destructive_bg_color": "#ffdad4",
9 | "destructive_fg_color": "#1e1a1d",
10 | "success_color": "#82524a",
11 | "success_bg_color": "#82524a",
12 | "success_fg_color": "#1e1a1d",
13 | "warning_color": "#6b586b",
14 | "warning_bg_color": "#6b586b",
15 | "warning_fg_color": "#1e1a1d",
16 | "error_color": "#ffdad4",
17 | "error_bg_color": "#ffdad4",
18 | "error_fg_color": "#1e1a1d",
19 | "window_bg_color": "#fcfcfc",
20 | "window_fg_color": "#1e1a1d",
21 | "view_bg_color": "#fcfcfc",
22 | "view_fg_color": "#1e1a1d",
23 | "headerbar_bg_color": "#fcfcfc",
24 | "headerbar_fg_color": "#1e1a1d",
25 | "headerbar_border_color": "rgba(236, 224, 225, 0.8)",
26 | "headerbar_backdrop_color": "#fcfcfc",
27 | "headerbar_shade_color": "rgba(236, 224, 225, 0.07)",
28 | "sidebar_bg_color": "#fcfcfc",
29 | "sidebar_fg_color": "#1e1a1d",
30 | "sidebar_backdrop_color": "#fcfcfc",
31 | "card_bg_color": "#ecdee8",
32 | "card_fg_color": "#1e1a1d",
33 | "card_shade_color": "rgba(0, 0, 0, 0.07)",
34 | "thumbnail_bg_color": "#fcfcfc",
35 | "thumbnail_fg_color": "#1e1a1d",
36 | "dialog_bg_color": "#fcfcfc",
37 | "dialog_fg_color": "#1e1a1d",
38 | "popover_bg_color": "#fcfcfc",
39 | "popover_fg_color": "#1e1a1d",
40 | "shade_color": "rgba(0, 0, 0, 0.36)",
41 | "scrollbar_outline_color": "rgba(158, 140, 143, 0.5)"
42 | },
43 | "palette": {
44 | "blue_": {
45 | "1": "#99c1f1",
46 | "2": "#62a0ea",
47 | "3": "#3584e4",
48 | "4": "#1c71d8",
49 | "5": "#1a5fb4"
50 | },
51 | "green_": {
52 | "1": "#8ff0a4",
53 | "2": "#57e389",
54 | "3": "#33d17a",
55 | "4": "#2ec27e",
56 | "5": "#26a269"
57 | },
58 | "yellow_": {
59 | "1": "#f9f06b",
60 | "2": "#f8e45c",
61 | "3": "#f6d32d",
62 | "4": "#f5c211",
63 | "5": "#e5a50a"
64 | },
65 | "orange_": {
66 | "1": "#ffbe6f",
67 | "2": "#ffa348",
68 | "3": "#ff7800",
69 | "4": "#e66100",
70 | "5": "#c64600"
71 | },
72 | "red_": {
73 | "1": "#f66151",
74 | "2": "#ed333b",
75 | "3": "#e01b24",
76 | "4": "#c01c28",
77 | "5": "#a51d2d"
78 | },
79 | "purple_": {
80 | "1": "#dc8add",
81 | "2": "#c061cb",
82 | "3": "#9141ac",
83 | "4": "#813d9c",
84 | "5": "#613583"
85 | },
86 | "brown_": {
87 | "1": "#cdab8f",
88 | "2": "#b5835a",
89 | "3": "#986a44",
90 | "4": "#865e3c",
91 | "5": "#63452c"
92 | },
93 | "light_": {
94 | "1": "#ffffff",
95 | "2": "#f6f5f4",
96 | "3": "#deddda",
97 | "4": "#c0bfbc",
98 | "5": "#9a9996"
99 | },
100 | "dark_": {
101 | "1": "#77767b",
102 | "2": "#5e5c64",
103 | "3": "#3d3846",
104 | "4": "#241f31",
105 | "5": "#000000"
106 | }
107 | },
108 | "custom_css": {
109 | "gtk4": "",
110 | "gtk3": ""
111 | },
112 | "plugins": {}
113 | }
--------------------------------------------------------------------------------
/.cache/eww/colors/colors-hyprland.conf:
--------------------------------------------------------------------------------
1 | $surface = rgb(ecdee8)
2 | $primary = rgb(85468d)
--------------------------------------------------------------------------------
/.cache/eww/colors/colors.css:
--------------------------------------------------------------------------------
1 | @define-color primary #85468d;
2 | @define-color onPrimary #ffffff;
3 | @define-color primaryContainer #ffd5ff;
4 | @define-color onPrimaryContainer #350040;
5 | @define-color secondary #6b586b;
6 | @define-color onSecondary #ffffff;
7 | @define-color secondaryContainer #f4dbf1;
8 | @define-color onSecondaryContainer #251626;
9 | @define-color tertiary #82524a;
10 | @define-color onTertiary #ffffff;
11 | @define-color tertiaryContainer #ffdad2;
12 | @define-color onTertiaryContainer #33110c;
13 | @define-color error #ba1b1b;
14 | @define-color onError #ffffff;
15 | @define-color errorContainer #ffdad4;
16 | @define-color onErrorContainer #410001;
17 | @define-color background #fcfcfc;
18 | @define-color onBackground #1e1a1d;
19 | @define-color surface #fcfcfc;
20 | @define-color onSurface #1e1a1d;
21 | @define-color surfaceVariant #ecdee8;
22 | @define-color onSurfaceVariant #4d444c;
23 | @define-color outline #7e747c;
24 | @define-color shadow #000000;
25 | @define-color inverseSurface #332f32;
26 | @define-color inverseOnSurface #f7eef3;
27 | @define-color inversePrimary #f7adfc;
--------------------------------------------------------------------------------
/.cache/eww/colors/colors.scss:
--------------------------------------------------------------------------------
1 | $primary: #85468d;
2 | $onPrimary: #ffffff;
3 | $primaryContainer: #ffd5ff;
4 | $onPrimaryContainer: #350040;
5 | $secondary: #6b586b;
6 | $onSecondary: #ffffff;
7 | $secondaryContainer: #f4dbf1;
8 | $onSecondaryContainer: #251626;
9 | $tertiary: #82524a;
10 | $onTertiary: #ffffff;
11 | $tertiaryContainer: #ffdad2;
12 | $onTertiaryContainer: #33110c;
13 | $error: #ba1b1b;
14 | $onError: #ffffff;
15 | $errorContainer: #ffdad4;
16 | $onErrorContainer: #410001;
17 | $background: #fcfcfc;
18 | $onBackground: #1e1a1d;
19 | $surface: #fcfcfc;
20 | $onSurface: #1e1a1d;
21 | $surfaceVariant: #ecdee8;
22 | $onSurfaceVariant: #4d444c;
23 | $outline: #7e747c;
24 | $shadow: #000000;
25 | $inverseSurface: #332f32;
26 | $inverseOnSurface: #f7eef3;
27 | $inversePrimary: #f7adfc;
--------------------------------------------------------------------------------
/.cache/eww/colors/current.json:
--------------------------------------------------------------------------------
1 | {
2 | "scheme": "light",
3 | "type": "color",
4 | "base_color": "#C49EC4"
5 | }
--------------------------------------------------------------------------------
/.cache/eww/colors/templates/colors-foot.ini:
--------------------------------------------------------------------------------
1 | [colors]
2 | alpha=0.9
3 | foreground={{ onSurface }}
4 | background={{ surface }}
5 |
6 | regular0={{ surface }}
7 | regular1={{ error }}
8 | regular2={{ primary}}
9 | regular3={{ tertiary }}
10 | regular4={{ onPrimaryContainer }}
11 | regular5={{ onSecondaryContainer }}
12 | regular6={{ primary }}
13 | regular7={{ onSurface }}
14 |
15 | bright0={{ onSurfaceVariant }}
16 | bright1={{ error }}
17 | bright2={{ primary}}
18 | bright3={{ tertiary }}
19 | bright4={{ onPrimaryContainer }}
20 | bright5={{ onSecondaryContainer }}
21 | bright6={{ primary }}
22 | bright7={{ onSurface }}
--------------------------------------------------------------------------------
/.cache/eww/colors/templates/colors-gradience.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "material",
3 | "variables": {
4 | "accent_color": "{{ primary }}",
5 | "accent_bg_color": "{{ primary }}",
6 | "accent_fg_color": "{{ surface }}",
7 | "destructive_color": "{{ errorContainer }}",
8 | "destructive_bg_color": "{{ errorContainer }}",
9 | "destructive_fg_color": "{{ onSurface }}",
10 | "success_color": "{{ tertiary }}",
11 | "success_bg_color": "{{ tertiary }}",
12 | "success_fg_color": "{{ onSurface }}",
13 | "warning_color": "{{ secondary }}",
14 | "warning_bg_color": "{{ secondary }}",
15 | "warning_fg_color": "{{ onSurface }}",
16 | "error_color": "{{ errorContainer }}",
17 | "error_bg_color": "{{ errorContainer }}",
18 | "error_fg_color": "{{ onSurface }}",
19 | "window_bg_color": "{{ surface }}",
20 | "window_fg_color": "{{ onSurface }}",
21 | "view_bg_color": "{{ surface }}",
22 | "view_fg_color": "{{ onSurface }}",
23 | "headerbar_bg_color": "{{ surface }}",
24 | "headerbar_fg_color": "{{ onSurface }}",
25 | "headerbar_border_color": "rgba(236, 224, 225, 0.8)",
26 | "headerbar_backdrop_color": "{{ surface }}",
27 | "headerbar_shade_color": "rgba(236, 224, 225, 0.07)",
28 | "sidebar_bg_color": "{{ surface }}",
29 | "sidebar_fg_color": "{{ onSurface }}",
30 | "sidebar_backdrop_color": "{{ surface }}",
31 | "card_bg_color": "{{ surfaceVariant }}",
32 | "card_fg_color": "{{ onSurface }}",
33 | "card_shade_color": "rgba(0, 0, 0, 0.07)",
34 | "thumbnail_bg_color": "{{ surface }}",
35 | "thumbnail_fg_color": "{{ onSurface }}",
36 | "dialog_bg_color": "{{ surface }}",
37 | "dialog_fg_color": "{{ onSurface }}",
38 | "popover_bg_color": "{{ surface }}",
39 | "popover_fg_color": "{{ onSurface }}",
40 | "shade_color": "rgba(0, 0, 0, 0.36)",
41 | "scrollbar_outline_color": "rgba(158, 140, 143, 0.5)"
42 | },
43 | "palette": {
44 | "blue_": {
45 | "1": "#99c1f1",
46 | "2": "#62a0ea",
47 | "3": "#3584e4",
48 | "4": "#1c71d8",
49 | "5": "#1a5fb4"
50 | },
51 | "green_": {
52 | "1": "#8ff0a4",
53 | "2": "#57e389",
54 | "3": "#33d17a",
55 | "4": "#2ec27e",
56 | "5": "#26a269"
57 | },
58 | "yellow_": {
59 | "1": "#f9f06b",
60 | "2": "#f8e45c",
61 | "3": "#f6d32d",
62 | "4": "#f5c211",
63 | "5": "#e5a50a"
64 | },
65 | "orange_": {
66 | "1": "#ffbe6f",
67 | "2": "#ffa348",
68 | "3": "#ff7800",
69 | "4": "#e66100",
70 | "5": "#c64600"
71 | },
72 | "red_": {
73 | "1": "#f66151",
74 | "2": "#ed333b",
75 | "3": "#e01b24",
76 | "4": "#c01c28",
77 | "5": "#a51d2d"
78 | },
79 | "purple_": {
80 | "1": "#dc8add",
81 | "2": "#c061cb",
82 | "3": "#9141ac",
83 | "4": "#813d9c",
84 | "5": "#613583"
85 | },
86 | "brown_": {
87 | "1": "#cdab8f",
88 | "2": "#b5835a",
89 | "3": "#986a44",
90 | "4": "#865e3c",
91 | "5": "#63452c"
92 | },
93 | "light_": {
94 | "1": "#ffffff",
95 | "2": "#f6f5f4",
96 | "3": "#deddda",
97 | "4": "#c0bfbc",
98 | "5": "#9a9996"
99 | },
100 | "dark_": {
101 | "1": "#77767b",
102 | "2": "#5e5c64",
103 | "3": "#3d3846",
104 | "4": "#241f31",
105 | "5": "#000000"
106 | }
107 | },
108 | "custom_css": {
109 | "gtk4": "",
110 | "gtk3": ""
111 | },
112 | "plugins": {}
113 | }
--------------------------------------------------------------------------------
/.cache/eww/colors/templates/colors-hyprland.conf:
--------------------------------------------------------------------------------
1 | $surface = rgb({{ surfaceVariant }})
2 | $primary = rgb({{ primary }})
--------------------------------------------------------------------------------
/.cache/eww/colors/templates/colors.css:
--------------------------------------------------------------------------------
1 | @define-color primary {{ primary }};
2 | @define-color onPrimary {{ onPrimary }};
3 | @define-color primaryContainer {{ primaryContainer }};
4 | @define-color onPrimaryContainer {{ onPrimaryContainer }};
5 | @define-color secondary {{ secondary }};
6 | @define-color onSecondary {{ onSecondary }};
7 | @define-color secondaryContainer {{ secondaryContainer }};
8 | @define-color onSecondaryContainer {{ onSecondaryContainer }};
9 | @define-color tertiary {{ tertiary }};
10 | @define-color onTertiary {{ onTertiary }};
11 | @define-color tertiaryContainer {{ tertiaryContainer }};
12 | @define-color onTertiaryContainer {{ onTertiaryContainer }};
13 | @define-color error {{ error }};
14 | @define-color onError {{ onError }};
15 | @define-color errorContainer {{ errorContainer }};
16 | @define-color onErrorContainer {{ onErrorContainer }};
17 | @define-color background {{ background }};
18 | @define-color onBackground {{ onBackground }};
19 | @define-color surface {{ surface }};
20 | @define-color onSurface {{ onSurface }};
21 | @define-color surfaceVariant {{ surfaceVariant }};
22 | @define-color onSurfaceVariant {{ onSurfaceVariant }};
23 | @define-color outline {{ outline }};
24 | @define-color shadow {{ shadow }};
25 | @define-color inverseSurface {{ inverseSurface }};
26 | @define-color inverseOnSurface {{ inverseOnSurface }};
27 | @define-color inversePrimary {{ inversePrimary }};
28 |
--------------------------------------------------------------------------------
/.cache/eww/colors/templates/colors.scss:
--------------------------------------------------------------------------------
1 | $primary: {{ primary }};
2 | $onPrimary: {{ onPrimary }};
3 | $primaryContainer: {{ primaryContainer }};
4 | $onPrimaryContainer: {{ onPrimaryContainer }};
5 | $secondary: {{ secondary }};
6 | $onSecondary: {{ onSecondary }};
7 | $secondaryContainer: {{ secondaryContainer }};
8 | $onSecondaryContainer: {{ onSecondaryContainer }};
9 | $tertiary: {{ tertiary }};
10 | $onTertiary: {{ onTertiary }};
11 | $tertiaryContainer: {{ tertiaryContainer }};
12 | $onTertiaryContainer: {{ onTertiaryContainer }};
13 | $error: {{ error }};
14 | $onError: {{ onError }};
15 | $errorContainer: {{ errorContainer }};
16 | $onErrorContainer: {{ onErrorContainer }};
17 | $background: {{ background }};
18 | $onBackground: {{ onBackground }};
19 | $surface: {{ surface }};
20 | $onSurface: {{ onSurface }};
21 | $surfaceVariant: {{ surfaceVariant }};
22 | $onSurfaceVariant: {{ onSurfaceVariant }};
23 | $outline: {{ outline }};
24 | $shadow: {{ shadow }};
25 | $inverseSurface: {{ inverseSurface }};
26 | $inverseOnSurface: {{ inverseOnSurface }};
27 | $inversePrimary: {{ inversePrimary }};
--------------------------------------------------------------------------------
/.cache/eww/colors/wall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/.cache/eww/colors/wall.png
--------------------------------------------------------------------------------
/.config/Thunar/uca.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | utilities-terminal
5 | Open Terminal Here
6 |
7 | 1653152521049373-1
8 | foot -T flooat
9 |
10 |
11 | *
12 |
13 |
14 |
15 |
16 | com.github.maoschanz.DynamicWallpaperEditor
17 | Set Wallpaper
18 |
19 | 1653152845925747-1
20 | swww img %n --transition-fps 75 --transition-type wipe --transition-duration 2
21 | sww
22 |
23 | *
24 |
25 |
26 |
27 |
28 | nvim
29 | Open with Nvim
30 |
31 | 1653154187810667-1
32 | foot -T flooat -e nvim %n
33 |
34 |
35 | *
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/.config/eww/eww.scss:
--------------------------------------------------------------------------------
1 | @import "/home/klyn/.cache/eww/colors/colors.scss";
2 | @import "scss/variables.scss";
3 |
4 | @import "scss/common/button.scss";
5 | @import "scss/common/floating-widget.scss";
6 | @import "scss/common/icon-image.scss";
7 | @import "scss/common/scrollbar.scss";
8 | @import "scss/common/slider.scss";
9 | @import "scss/common/tooltip.scss";
10 | @import "scss/common/unset.scss";
11 | @import "scss/common/widget.scss";
12 |
13 | @import "scss/widgets/application.scss";
14 | @import "scss/widgets/calendar.scss";
15 | @import "scss/widgets/date.scss";
16 | @import "scss/widgets/media.scss";
17 | @import "scss/widgets/notification.scss";
18 | @import "scss/widgets/notification-center.scss";
19 | @import "scss/widgets/separator.scss";
20 |
21 | @import "scss/windows/powermenu.scss";
22 | @import "scss/windows/bar.scss";
23 | @import "scss/windows/corners.scss";
24 | @import "scss/windows/desktop.scss";
25 | @import "scss/windows/dock.scss";
26 | @import "scss/windows/info-center.scss";
27 | @import "scss/windows/launcher.scss";
28 | @import "scss/windows/menu.scss";
29 | @import "scss/windows/notifications.scss";
30 | @import "scss/windows/overview.scss";
31 | @import "scss/windows/volume.scss";
32 |
--------------------------------------------------------------------------------
/.config/eww/eww.yuck:
--------------------------------------------------------------------------------
1 | (include "yuck/widgets.yuck")
2 | (include "yuck/windows.yuck")
3 | (include "yuck/setup.yuck")
4 |
5 | (defpoll nightlight :interval "10h" `scripts/nightlight get`)
6 | (defpoll powerprofile :interval "10h" `scripts/powerprofile get`)
7 | (defpoll theme :interval "10h" `scripts/theme get`)
8 | (defpoll date :interval "5m" `date +'{"day": "%d", "month": "%m", "year": "%Y"}'`)
9 | (defpoll uptime :interval "1m" `awk '{print $1 / 60}' /proc/uptime`)
10 | (defpoll colors :interval "10h" `scripts/python/material-colors.py --type`)
11 |
12 | (deflisten audio :initial "{}" `scripts/volume`)
13 | (deflisten pacman :initial "{}" `scripts/pacman`)
14 | (deflisten network :initial "{}" `scripts/network`)
15 | (deflisten workspaces :initial "{}" `scripts/python/hyprland.py`)
16 | (deflisten weather :initial "{}" `scripts/python/weather.py`)
17 | (deflisten notifications :initial "{}" `scripts/python/notifications.py`)
18 | (deflisten mpris :initial "{}" `scripts/python/mpris.py`)
19 | (deflisten apps :initial "{}" `scripts/python/apps.py`)
20 |
21 | (defvar user "klyn@arch")
22 | (defvar active "{}")
23 | (defvar dock "{}")
24 | (defvar positions "{}")
25 | (defvar selected "")
26 | (defvar popup "")
27 | (defvar duration "250ms")
28 | (defvar interval "hourly")
29 | (defvar dock_rev true)
30 | (defvar music_rev false)
31 | (defvar media-bar_rev false)
32 | (defvar utils-bar_rev false)
33 | (defvar volume-bar_rev false)
34 | (defvar volume_rev false)
35 | (defvar menu_rev false)
36 | (defvar info-center_rev false)
37 | (defvar notification_rev false)
38 | (defvar themes_rev false)
39 | (defvar icons '{
40 | "volume": {
41 | "true": "",
42 | "false": ""
43 | },
44 | "microphone": {
45 | "true": "",
46 | "false": ""
47 | },
48 | "network": {
49 | "up": "",
50 | "down": ""
51 | },
52 | "power": {
53 | "poweroff": "",
54 | "reboot": "",
55 | "suspend": "",
56 | "exit": ""
57 | },
58 | "bell": {
59 | "true": "",
60 | "false": ""
61 | },
62 | "light": {
63 | "true": "",
64 | "false": ""
65 | },
66 | "power-profile": {
67 | "performance": "",
68 | "balanced": "",
69 | "power-saver": ""
70 | },
71 | "media": {
72 | "true": "",
73 | "false": ""
74 | }
75 | }'
76 | )
77 |
--------------------------------------------------------------------------------
/.config/eww/scripts/apps:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | queryApp() {
4 | dbus-send --session --type=method_call \
5 | --dest=com.juminai.Apps \
6 | /com/juminai/Apps \
7 | com.juminai.Apps.Query \
8 | string:$1
9 | }
10 |
11 | updateFreq() {
12 | dbus-send --session --type=method_call \
13 | --dest=com.juminai.Apps \
14 | /com/juminai/Apps \
15 | com.juminai.Apps.UpdateFreq \
16 | string:$1
17 | }
18 |
19 | add() {
20 | dbus-send --session --type=method_call \
21 | --dest=com.juminai.Apps \
22 | /com/juminai/Apps \
23 | com.juminai.Apps.Add\
24 | string:$1
25 | }
26 |
27 | if [[ $1 == 'query' ]]; then queryApp $2; fi
28 | if [[ $1 == 'freq' ]]; then updateFreq $2; fi
29 | if [[ $1 == 'add' ]]; then add $2; fi
30 |
--------------------------------------------------------------------------------
/.config/eww/scripts/hyprland:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [[ $1 == 'window' ]]; then hyprctl dispatch focuswindow address:$2; fi
4 | if [[ $1 == 'workspace' ]]; then hyprctl dispatch workspace $2; fi
5 | if [[ $1 == 'move' ]]; then hyprctl dispatch movetoworkspacesilent $2,address:$3 && eww update selected=""; fi
6 | if [[ $1 == 'special' ]]; then hyprctl dispatch movetoworkspacesilent special,address:$2; fi
7 | if [[ $1 == 'close' ]]; then hyprctl dispatch closewindow address:$2; fi
8 | if [[ $1 == 'update' ]]; then eww update selected=$2; fi
--------------------------------------------------------------------------------
/.config/eww/scripts/network:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | INTERFACE=$(ip -o route show to default | awk '{print $5}')
4 | OPERSTATE=$(cat /sys/class/net/$INTERFACE/operstate)
5 | echo '{"name": "'$INTERFACE'", "status": "'$OPERSTATE'"}'
6 |
7 | ip monitor link | while read -r line; do
8 | INTERFACE=$(ip -o -4 route show to default | awk '{print $5}')
9 | OPERSTATE=$(cat /sys/class/net/$INTERFACE/operstate)
10 | echo '{"name": "'$INTERFACE'", "status": "'$OPERSTATE'"}'
11 | done
12 |
--------------------------------------------------------------------------------
/.config/eww/scripts/nightlight:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | state() {
4 | if [[ -z $(pgrep wlsunset) ]]; then
5 | echo false
6 | else
7 | echo true
8 | fi
9 | }
10 |
11 | toggle() {
12 | if [[ $(state) == true ]]; then
13 | eww update nightlight=false
14 | pkill wlsunset
15 | else
16 | eww update nightlight=true
17 | wlsunset -t 3400 &
18 | fi
19 | }
20 |
21 |
22 | if [[ $1 == 'toggle' ]]; then toggle; fi
23 | if [[ $1 == 'get' ]]; then state; fi
24 |
--------------------------------------------------------------------------------
/.config/eww/scripts/notifications:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | dismiss() {
4 | dbus-send --session --type=method_call \
5 | --dest=org.freedesktop.Notifications \
6 | /org/freedesktop/Notifications \
7 | org.freedesktop.Notifications.DismissPopup \
8 | uint32:$1
9 | }
10 |
11 | close() {
12 | dbus-send --session --type=method_call \
13 | --dest=org.freedesktop.Notifications \
14 | /org/freedesktop/Notifications \
15 | org.freedesktop.Notifications.CloseNotification \
16 | uint32:$1
17 | }
18 |
19 | action() {
20 | dbus-send --session --type=method_call \
21 | --dest=org.freedesktop.Notifications \
22 | /org/freedesktop/Notifications \
23 | org.freedesktop.Notifications.InvokeAction \
24 | uint32:$1 string:$2
25 |
26 | eww update info-center_rev=false
27 | }
28 |
29 | clear_all() {
30 | dbus-send --session --type=method_call \
31 | --dest=org.freedesktop.Notifications \
32 | /org/freedesktop/Notifications \
33 | org.freedesktop.Notifications.ClearAll
34 | }
35 |
36 | toggle_dnd() {
37 | dbus-send --session --type=method_call \
38 | --dest=org.freedesktop.Notifications \
39 | /org/freedesktop/Notifications \
40 | org.freedesktop.Notifications.ToggleDND
41 | }
42 |
43 | remove_id() {
44 | dbus-send --session --type=method_call \
45 | --dest=org.freedesktop.Notifications \
46 | /org/freedesktop/Notifications \
47 | org.freedesktop.Notifications.RemovePopupID \
48 | uint32:$1
49 | }
50 |
51 | if [[ $1 == 'dismiss' ]]; then dismiss $2 $3; fi
52 | if [[ $1 == 'close' ]]; then close $2; fi
53 | if [[ $1 == 'action' ]]; then action $2 $3; fi
54 | if [[ $1 == 'clear' ]]; then clear_all; fi
55 | if [[ $1 == 'toggle' ]]; then toggle_dnd; fi
56 | if [[ $1 == 'pop' ]]; then remove_id $2; fi
57 |
--------------------------------------------------------------------------------
/.config/eww/scripts/pacman:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | while true; do
4 | pkgs="$(yay -Q | wc -l)"
5 |
6 | updates_arch=$(checkupdates 2>/dev/null | wc -l)
7 | updates_arch=${updates_arch:-0}
8 |
9 | updates_aur=$(yay -Qum 2>/dev/null | wc -l)
10 | updates_aur=${updates_aur:-0}
11 |
12 | updates=$((updates_arch + updates_aur))
13 |
14 | echo '{"packages": '$pkgs', "updates": '$updates'}'
15 | sleep 600
16 | done
17 |
--------------------------------------------------------------------------------
/.config/eww/scripts/powerprofile:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | PROFILE=$(powerprofilesctl get)
4 |
5 | toggle() {
6 | if [[ $PROFILE == 'balanced' ]]; then
7 | eww update powerprofile=power-saver
8 | powerprofilesctl set power-saver
9 | else
10 | eww update powerprofile=balanced
11 | powerprofilesctl set balanced
12 | fi
13 | }
14 |
15 | if [[ $1 == 'toggle' ]]; then toggle; fi
16 | if [[ $1 == 'get' ]]; then echo $PROFILE; fi
17 |
--------------------------------------------------------------------------------
/.config/eww/scripts/python/apps.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # juminai @ github
3 |
4 | import gi
5 | import dbus
6 | import dbus.service
7 |
8 | gi.require_version("Gtk", "3.0")
9 |
10 | from dbus.mainloop.glib import DBusGMainLoop
11 | from gi.repository import Gio, GLib
12 | from hyprland import update_dock
13 | from utils import load, get_themed_icon, update_eww, write_file
14 |
15 | class Apps(dbus.service.Object):
16 | def __init__(self):
17 | super().__init__(
18 | dbus.service.BusName(
19 | "com.juminai.Apps",
20 | bus=dbus.SessionBus()
21 | ), "/com/juminai/Apps"
22 | )
23 |
24 | self.populate()
25 |
26 |
27 | def installed_apps(self):
28 | app_info = Gio.AppInfo
29 | app_infos = app_info.get_all()
30 |
31 | app_list = []
32 |
33 | for app_info in app_infos:
34 | if app_info.should_show():
35 | get_icon = app_info.get_icon()
36 | app_icon = None
37 |
38 | if get_icon:
39 | if get_icon.get_names():
40 | icon_name = get_icon.get_names()[0]
41 | app_icon = get_themed_icon(icon_name)
42 |
43 | app_id = app_info.get_id()
44 |
45 | app = {
46 | "name": app_info.get_name(),
47 | "executable": app_info.get_executable(),
48 | "icon": app_icon,
49 | "description": app_info.get_description(),
50 | "id": app_id,
51 | "frequency": load("frequency").get(app_id, 0),
52 | }
53 |
54 | app_list.append(app)
55 |
56 | app_list.sort(
57 | key=lambda x: x["frequency"],
58 | reverse=True
59 | )
60 | return app_list
61 |
62 |
63 | def populate(self):
64 | self.apps = self.installed_apps()
65 | update_eww("apps", self.apps)
66 | write_file("apps", self.apps)
67 |
68 |
69 | @dbus.service.method("com.juminai.Apps", in_signature="s", out_signature="")
70 | def Query(self, query):
71 | filtered = []
72 |
73 | for app in self.apps:
74 | if query.lower() in app["name"].lower():
75 | filtered.append(app)
76 |
77 | update_eww("apps", filtered)
78 |
79 |
80 | @dbus.service.method("com.juminai.Apps", in_signature="s", out_signature="")
81 | def UpdateFreq(self, app):
82 | frequencies = load("frequency")
83 |
84 | if app not in frequencies:
85 | frequencies[app] = 1
86 | else:
87 | frequencies[app] += 1
88 |
89 | write_file("frequency", frequencies)
90 | self.populate()
91 |
92 |
93 | @dbus.service.method("com.juminai.Apps", in_signature="s", out_signature="")
94 | def Add(self, app):
95 | dock_apps = load("dock")
96 |
97 | if app not in dock_apps:
98 | dock_apps.append(app)
99 | else:
100 | dock_apps.remove(app)
101 |
102 | write_file("dock", dock_apps)
103 | update_dock()
104 |
105 |
106 | if __name__ == "__main__":
107 | DBusGMainLoop(set_as_default=True)
108 | loop = GLib.MainLoop()
109 | Apps()
110 | try:
111 | loop.run()
112 | except KeyboardInterrupt:
113 | loop.quit()
114 |
--------------------------------------------------------------------------------
/.config/eww/scripts/python/hyprland.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # juminai @ github
3 |
4 | import json
5 | import os
6 | import subprocess
7 | import sys
8 |
9 | from utils import load, update_eww, generate
10 |
11 | SIGNATURE = os.environ.get("HYPRLAND_INSTANCE_SIGNATURE")
12 | RUNTIME = os.environ.get("XDG_RUNTIME_DIR")
13 |
14 | apps = load("apps")
15 |
16 |
17 | def run_command(command):
18 | result = subprocess.check_output(command, text=True)
19 | return json.loads(result)
20 |
21 |
22 | def fix_name(window_class):
23 | classes = {
24 | "brave": "brave",
25 | "telegram": "telegram",
26 | "inkscape": "inkscape",
27 | "nautilus": "nautilus",
28 | "transmissionbt": "transmission",
29 | }
30 |
31 | window_class = window_class.lower()
32 |
33 | for key, value in classes.items():
34 | if key in window_class:
35 | return value
36 | return window_class
37 |
38 | return window_class
39 |
40 |
41 | def get_app_info(window_class):
42 | app_name = fix_name(window_class)
43 | app_icon = None
44 | app_id = None
45 |
46 | for app in apps:
47 | if app_name in app["executable"].lower():
48 | app_id = app["id"]
49 | app_name = app["name"]
50 | app_icon = app["icon"]
51 | break
52 |
53 | return {
54 | "id": app_id,
55 | "class": app_name,
56 | "icon": app_icon
57 | }
58 |
59 |
60 | def get_workspaces():
61 | clients = run_command(["hyprctl", "clients", "-j"])
62 | data = {i: [] for i in range(1, 8)}
63 |
64 | for client in clients:
65 | workspace_id = client["workspace"]["id"]
66 | mapped = client["mapped"]
67 | window_class = client["class"]
68 |
69 | if window_class == "" or not mapped:
70 | continue
71 |
72 | app = get_app_info(window_class)
73 |
74 | window = {
75 | "id": app["id"],
76 | "class": app["class"],
77 | "icon": app["icon"],
78 | "address": client["address"],
79 | "at": client["at"],
80 | "size": client["size"],
81 | }
82 |
83 | data[workspace_id].append(window)
84 |
85 | workspaces = [
86 | {
87 | "id": workspace_id,
88 | "windows": windows
89 | } for workspace_id, windows in data.items()
90 | ]
91 |
92 | return workspaces
93 |
94 |
95 | def get_active():
96 | active_workspace = run_command(["hyprctl", "activeworkspace", "-j"])
97 | active_window = run_command(["hyprctl", "activewindow", "-j"])
98 |
99 | active = {
100 | "workspace": active_workspace["id"],
101 | "address": None,
102 | "id": None,
103 | "class": None,
104 | "icon": None
105 | }
106 |
107 | if active_window:
108 | active_class = active_window["class"]
109 | active["address"] = active_window["address"]
110 | active.update(get_app_info(active_class))
111 |
112 | return active
113 |
114 |
115 | def get_dock_apps(workspaces):
116 | dock = load("dock")
117 | dock_apps = {
118 | "favorite": [],
119 | "impostor": []
120 | }
121 |
122 | for workspace in workspaces:
123 | if workspace["windows"]:
124 | for window in workspace["windows"]:
125 | if window["id"]:
126 |
127 | app = {
128 | "name": window["class"],
129 | "icon": window["icon"],
130 | "id": window["id"],
131 | "address": window["address"]
132 | }
133 |
134 | if window["id"] in dock:
135 | dock_apps["favorite"].append(app)
136 | else:
137 | dock_apps["impostor"].append(app)
138 |
139 | for app in apps:
140 | if app["id"] in dock:
141 | if not any(i["id"] == app["id"] for i in dock_apps["favorite"]):
142 | dock_apps["favorite"].append(
143 | {
144 | "name": app["name"],
145 | "icon": app["icon"],
146 | "id": app["id"],
147 | "address": None
148 | }
149 | )
150 |
151 | dock_apps["favorite"] = sorted(
152 | dock_apps["favorite"],
153 | key=lambda x: x["name"]
154 | )
155 |
156 | return dock_apps
157 |
158 |
159 | def update_dock():
160 | update_eww("dock", get_dock_apps(get_workspaces()))
161 |
162 |
163 | def monitor_socat():
164 | socat = ["socat", "-u", f"UNIX-CONNECT:{RUNTIME}/hypr/{SIGNATURE}/.socket2.sock", "-"]
165 | with subprocess.Popen(socat, stdout=subprocess.PIPE, text=True) as process:
166 | for line in process.stdout:
167 | workspaces = get_workspaces()
168 |
169 | if line.startswith((
170 | "activewindow>>",
171 | "closewindow>>",
172 | "openwindow>>"
173 | )):
174 | generate(workspaces)
175 | update_eww("dock", get_dock_apps(workspaces))
176 | update_eww("active", get_active())
177 |
178 | elif line.startswith((
179 | "movewindow>>",
180 | "changefloatingmode>>",
181 | "fullscreen>>"
182 | )):
183 | generate(workspaces)
184 |
185 | elif line.startswith("workspace>>"):
186 | update_eww("active", get_active())
187 |
188 | if __name__ == "__main__":
189 | try:
190 | workspaces = get_workspaces()
191 | generate(workspaces)
192 | update_eww("dock", get_dock_apps(workspaces))
193 | update_eww("active", get_active())
194 | monitor_socat()
195 | except KeyboardInterrupt:
196 | pass
--------------------------------------------------------------------------------
/.config/eww/scripts/python/material-colors.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | import sys
4 | import os
5 | import shutil
6 | import argparse
7 |
8 | from jinja2 import Template
9 | from material_color_utilities_python import *
10 | from PIL import Image
11 | from utils import COLORS_DIR, TEMPLATES_DIR, CURRENT_JSON, WALLPAPER_PATH
12 |
13 |
14 | def get_colors(colorscheme):
15 | return {
16 | "primary": hexFromArgb(colorscheme.get_primary()),
17 | "onPrimary": hexFromArgb(colorscheme.get_onPrimary()),
18 | "primaryContainer": hexFromArgb(colorscheme.get_primaryContainer()),
19 | "onPrimaryContainer": hexFromArgb(colorscheme.get_onPrimaryContainer()),
20 | "secondary": hexFromArgb(colorscheme.get_secondary()),
21 | "onSecondary": hexFromArgb(colorscheme.get_onSecondary()),
22 | "secondaryContainer": hexFromArgb(colorscheme.get_secondaryContainer()),
23 | "onSecondaryContainer": hexFromArgb(colorscheme.get_onSecondaryContainer()),
24 | "tertiary": hexFromArgb(colorscheme.get_tertiary()),
25 | "onTertiary": hexFromArgb(colorscheme.get_onTertiary()),
26 | "tertiaryContainer": hexFromArgb(colorscheme.get_tertiaryContainer()),
27 | "onTertiaryContainer": hexFromArgb(colorscheme.get_onTertiaryContainer()),
28 | "error": hexFromArgb(colorscheme.get_error()),
29 | "onError": hexFromArgb(colorscheme.get_onError()),
30 | "errorContainer": hexFromArgb(colorscheme.get_errorContainer()),
31 | "onErrorContainer": hexFromArgb(colorscheme.get_onErrorContainer()),
32 | "background": hexFromArgb(colorscheme.get_background()),
33 | "onBackground": hexFromArgb(colorscheme.get_onBackground()),
34 | "surface": hexFromArgb(colorscheme.get_surface()),
35 | "onSurface": hexFromArgb(colorscheme.get_onSurface()),
36 | "surfaceVariant": hexFromArgb(colorscheme.get_surfaceVariant()),
37 | "onSurfaceVariant": hexFromArgb(colorscheme.get_onSurfaceVariant()),
38 | "outline": hexFromArgb(colorscheme.get_outline()),
39 | "shadow": hexFromArgb(colorscheme.get_shadow()),
40 | "inverseSurface": hexFromArgb(colorscheme.get_inverseSurface()),
41 | "inverseOnSurface": hexFromArgb(colorscheme.get_inverseOnSurface()),
42 | "inversePrimary": hexFromArgb(colorscheme.get_inversePrimary())
43 | }
44 |
45 |
46 | def get_colors_from_img(image, scheme):
47 | img = Image.open(image)
48 | basewidth = 64
49 | wpercent = (basewidth/float(img.size[0]))
50 | hsize = int((float(img.size[1])*float(wpercent)))
51 | img = img.resize((basewidth,hsize),Image.Resampling.LANCZOS)
52 | theme = themeFromImage(img)
53 | colorscheme = theme.get('schemes').get(scheme)
54 |
55 | return get_colors(colorscheme)
56 |
57 |
58 | def get_colors_from_color(color, scheme):
59 | theme = themeFromSourceColor(argbFromHex(color))
60 | colorscheme = theme.get('schemes').get(scheme)
61 |
62 | return get_colors(colorscheme)
63 |
64 |
65 | def generate_wallpaper(color):
66 | img = Image.new('RGB', (1920, 1080), color)
67 | img.save(WALLPAPER_PATH)
68 |
69 |
70 | def read_config():
71 | empty = {
72 | "scheme": "dark",
73 | "type": "image",
74 | "base_color": None
75 | }
76 |
77 | try:
78 | with open(CURRENT_JSON, "r") as config:
79 | return json.load(config)
80 | except FileNotFoundError:
81 | with open(CURRENT_JSON, "w") as config:
82 | json.dump(empty, config)
83 | return empty
84 |
85 |
86 | def write_config(data):
87 | output_json = json.dumps(data, indent=2)
88 | with open(CURRENT_JSON, "w") as config:
89 | config.write(output_json)
90 |
91 |
92 | def render_templates(colors_list):
93 | for template in os.listdir(TEMPLATES_DIR):
94 |
95 | with open(f"{TEMPLATES_DIR}/{template}", "r") as file:
96 | template_rendered = Template(file.read()).render(colors_list)
97 |
98 | with open(f"{COLORS_DIR}/{template}", "w") as output_file:
99 |
100 | if 'foot' in template or 'hyprland' in template:
101 | output_file.write(template_rendered.replace('#', ''))
102 | else:
103 | output_file.write(template_rendered)
104 |
105 | def setup(img):
106 | try:
107 | shutil.copyfile(img, WALLPAPER_PATH)
108 | except shutil.SameFileError:
109 | pass
110 | os.system("eww reload")
111 | os.system("pkill -SIGUSR1 foot")
112 | os.system(f"gradience-cli apply -p '{COLORS_DIR}/colors-gradience.json' --gtk both")
113 | os.system(f"swww img {WALLPAPER_PATH} --transition-fps 75 --transition-type wipe --transition-duration 2")
114 |
115 |
116 | def main(colors, image, scheme, type, base_color):
117 | render_templates(colors)
118 |
119 | write_config({
120 | "scheme": scheme,
121 | "type": type,
122 | "base_color": base_color
123 | })
124 |
125 | setup(image)
126 |
127 |
128 | if __name__ == "__main__":
129 | current = read_config()
130 | scheme = current['scheme']
131 | type = current['type']
132 | base_color = current['base_color']
133 |
134 | parser = argparse.ArgumentParser(description="Generate material colors on fly")
135 |
136 | parser.add_argument("--image", type=str, help="Generate color scheme based on an image file.")
137 | parser.add_argument("--toggle", action="store_true", help="Toggle between light and dark color schemes.")
138 | parser.add_argument("--current", action="store_true", help="Print current colors scheme(light/dark)")
139 | parser.add_argument("--type", action="store_true", help="Print current colors type(image/color)")
140 | parser.add_argument("--color", type=str, help="Generate color scheme based on a color and simple plain wallpaper")
141 |
142 | args = parser.parse_args()
143 |
144 | if args.image:
145 | colors = get_colors_from_img(args.image, scheme)
146 | main(colors, args.image, scheme, "image", None)
147 |
148 | elif args.toggle:
149 | match scheme:
150 | case "dark":
151 | scheme = "light"
152 | case "light":
153 | scheme = "dark"
154 | case _:
155 | scheme = "dark"
156 |
157 | match type:
158 | case "image":
159 | colors = get_colors_from_img(WALLPAPER_PATH, scheme)
160 | main(colors, WALLPAPER_PATH, scheme, "image", None)
161 | os.system("eww update current_theme=image")
162 |
163 | case "color":
164 | colors = get_colors_from_color(base_color, scheme)
165 | generate_wallpaper(colors['surfaceVariant'])
166 | main(colors, WALLPAPER_PATH, scheme, "color", base_color)
167 | os.system("eww update current_theme=color")
168 |
169 | elif args.current:
170 | sys.stdout.write(scheme + "\n")
171 | sys.stdout.flush()
172 |
173 | elif args.type:
174 | sys.stdout.write(type + "\n")
175 | sys.stdout.flush()
176 |
177 | elif args.color:
178 | colors = get_colors_from_color(args.color, scheme)
179 | generate_wallpaper(colors['secondaryContainer'])
180 | main(colors, WALLPAPER_PATH, scheme, "color", args.color)
181 | os.system("eww update current_theme=color")
182 |
183 | else:
184 | print("No valid argument specified. Use --help for usage information.")
185 |
--------------------------------------------------------------------------------
/.config/eww/scripts/python/mpris.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # juminai @ github
3 |
4 | import dbus
5 | import gi
6 | import os
7 | import requests
8 | import time
9 | import cairosvg
10 | import hashlib
11 |
12 | from io import BytesIO
13 | from PIL import Image
14 | from gi.repository import GLib
15 | from dbus.mainloop.glib import DBusGMainLoop
16 | from utils import get_themed_icon, MPRIS_DIR, update_eww
17 |
18 | def get_property(interface, prop):
19 | try:
20 | return interface.Get("org.mpris.MediaPlayer2.Player", prop)
21 | except dbus.exceptions.DBusException:
22 | return None
23 |
24 |
25 | def format_time(seconds):
26 | if seconds < 3600:
27 | minutes = seconds // 60
28 | remaining_seconds = seconds % 60
29 | return f"{minutes:02d}:{remaining_seconds:02d}"
30 | else:
31 | hours = seconds // 3600
32 | minutes = (seconds % 3600) // 60
33 | remaining_seconds = seconds % 60
34 | return f"{hours:02d}:{minutes:02d}:{remaining_seconds:02d}"
35 |
36 |
37 | def clean_name(name):
38 | name = name.split(".instance")[0]
39 | name = name.replace("org.mpris.MediaPlayer2.", "")
40 | return name
41 |
42 |
43 | def get_icon(name):
44 | player_name = clean_name(name)
45 | icon = get_themed_icon(player_name)
46 | return icon
47 |
48 |
49 | def get_artwork(artwork, title, player):
50 | file_name = hashlib.sha1(f"{title}_{player}".encode()).hexdigest()
51 | save_path = f"{MPRIS_DIR}/{file_name}"
52 |
53 | if not artwork or len(artwork) > 200:
54 | save_path = f"{MPRIS_DIR}/{player}"
55 | artwork = svg_to_png(get_icon(player), save_path)
56 |
57 | if not os.path.exists(save_path):
58 | if artwork.startswith("https://"):
59 | link = requests.get(artwork)
60 | artwork = BytesIO(link.content)
61 | else:
62 | artwork = artwork.replace("file://", "")
63 |
64 | save_img(artwork, save_path)
65 |
66 | return save_path
67 |
68 |
69 | def save_img(artwork, save_path):
70 | try:
71 | image = Image.open(artwork)
72 | image.save(save_path, format="PNG")
73 | except FileNotFoundError:
74 | pass
75 |
76 |
77 | def svg_to_png(svg_path, png_path):
78 | if not os.path.exists(png_path):
79 | cairosvg.svg2png(url=svg_path, write_to=png_path)
80 | save_img(png_path, png_path)
81 |
82 | return png_path
83 |
84 |
85 | def get_players():
86 | bus_names = bus.list_names()
87 |
88 | mpris_players = []
89 | for name in bus_names:
90 | if "org.mpris.MediaPlayer2" in name:
91 | mpris_players.append(name)
92 |
93 | return mpris_players
94 |
95 |
96 | def mpris_data():
97 | player_names = get_players()
98 |
99 | players = []
100 |
101 | for name in player_names:
102 | player = bus.get_object(name, "/org/mpris/MediaPlayer2")
103 | interface = dbus.Interface(player, "org.freedesktop.DBus.Properties")
104 | metadata = get_property(interface, "Metadata")
105 | playback_status = get_property(interface, "PlaybackStatus")
106 |
107 | if playback_status == "Stopped" or metadata is None:
108 | continue
109 |
110 | player_name = clean_name(name)
111 | title = metadata.get("xesam:title", "Unknown")
112 | artist = metadata.get("xesam:artist", ["Unknown"])[0]
113 | album = metadata.get("xesam:album", "Unknown")
114 | artwork = metadata.get("mpris:artUrl", None)
115 | length = metadata.get("mpris:length", -1) // 1000000 or -1
116 | volume = get_property(interface, "Volume")
117 | loop_status = get_property(interface, "LoopStatus")
118 | shuffle = bool(get_property(interface, "Shuffle"))
119 | can_go_next = bool(get_property(interface, "CanGoNext"))
120 | can_go_previous = bool(get_property(interface, "CanGoPrevious"))
121 | can_play = bool(get_property(interface, "CanPlay"))
122 | can_pause = bool(get_property(interface, "CanPause"))
123 |
124 | player_data = {
125 | "name": player_name,
126 | "title": title,
127 | "artist": artist,
128 | "album": album,
129 | "artUrl": get_artwork(artwork, title, player_name),
130 | "status": playback_status,
131 | "length": length,
132 | "lengthStr": format_time(length) if length != -1 else -1,
133 | "volume": int(volume * 100) if volume is not None else -1,
134 | "loop": loop_status,
135 | "shuffle": shuffle,
136 | "canGoNext": can_go_next,
137 | "canGoPrevious": can_go_previous,
138 | "canPlay": can_play,
139 | "canPause": can_pause,
140 | "icon": get_icon(player_name),
141 | }
142 |
143 | players.append(player_data)
144 |
145 | return players
146 |
147 |
148 | def get_positions():
149 | player_names = get_players()
150 |
151 | positions = {}
152 |
153 | for name in player_names:
154 | player = bus.get_object(name, "/org/mpris/MediaPlayer2")
155 | interface = dbus.Interface(player, "org.freedesktop.DBus.Properties")
156 |
157 | position = get_property(interface, "Position")
158 | position = position // 1000000 if position is not None else -1
159 |
160 | positions[clean_name(name)] = {
161 | "position": position,
162 | "positionStr": format_time(position) if position != -1 else -1
163 | }
164 |
165 | return positions
166 |
167 |
168 | def properties_changed():
169 | bus.add_signal_receiver(
170 | emit,
171 | dbus_interface="org.freedesktop.DBus.Properties",
172 | signal_name="PropertiesChanged",
173 | path="/org/mpris/MediaPlayer2"
174 | )
175 |
176 |
177 | def player_changed():
178 | bus.add_signal_receiver(
179 | emit,
180 | dbus_interface="org.freedesktop.DBus",
181 | signal_name="NameOwnerChanged",
182 | path="/org/freedesktop/DBus"
183 | )
184 |
185 |
186 | def update_positions():
187 | update_eww("positions", get_positions())
188 | return True
189 |
190 |
191 | def emit(interface, changed_properties, invalidated_properties):
192 | if "org.mpris.MediaPlayer2" in interface:
193 | if "Rate" not in changed_properties:
194 | update_eww("mpris", mpris_data())
195 |
196 |
197 | if __name__ == "__main__":
198 | DBusGMainLoop(set_as_default=True)
199 | bus = dbus.SessionBus()
200 | loop = GLib.MainLoop()
201 |
202 | try:
203 | update_eww("mpris", mpris_data())
204 | properties_changed()
205 | player_changed()
206 | GLib.timeout_add(1000, update_positions)
207 | loop.run()
208 | except KeyboardInterrupt:
209 | loop.quit()
--------------------------------------------------------------------------------
/.config/eww/scripts/python/notifications.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # juminai @ github
3 |
4 | import gi
5 | import datetime
6 | import os
7 | import dbus
8 | import dbus.service
9 |
10 | gi.require_version("GdkPixbuf", "2.0")
11 |
12 | from dbus.mainloop.glib import DBusGMainLoop
13 | from gi.repository import GLib, GdkPixbuf
14 | from bs4 import BeautifulSoup
15 | from utils import get_themed_icon, NOTIFICATIONS_DIR, load, update_eww, write_file
16 |
17 | class Notifications(dbus.service.Object):
18 | def __init__(self):
19 | bus_name = dbus.service.BusName("org.freedesktop.Notifications", dbus.SessionBus())
20 | dbus.service.Object.__init__(self, bus_name, "/org/freedesktop/Notifications")
21 |
22 | self.list = load("notifications")
23 | self.dnd = self.list["dnd"]
24 | self.active_popups = {}
25 | update_eww("notifications", self.list)
26 |
27 | @dbus.service.method("org.freedesktop.Notifications", in_signature="susssasa{sv}i", out_signature="u")
28 | def Notify(
29 | self,
30 | app_name,
31 | replaces_id,
32 | app_image,
33 | summary,
34 | body,
35 | actions,
36 | hints,
37 | expire_timeout,
38 | ):
39 |
40 | notification_id = self.get_id(replaces_id)
41 |
42 | details = {
43 | "id": notification_id,
44 | "appName": app_name or None,
45 | "appIcon": get_themed_icon(app_name),
46 | "summary": self.clean_text(summary) or None,
47 | "body": self.clean_text(body) or None,
48 | "actions": self.get_actions(actions),
49 | "urgency": self.get_urgency(hints),
50 | "time": int(datetime.datetime.now().timestamp()),
51 | "image": self.get_app_image(app_image, hints, notification_id),
52 | }
53 |
54 | self.save_notification(details)
55 |
56 | if not self.dnd:
57 | self.save_popup(details)
58 |
59 | return notification_id
60 |
61 |
62 | @dbus.service.method("org.freedesktop.Notifications", in_signature="", out_signature="ssss")
63 | def GetServerInformation(self):
64 | return (
65 | "dbus notifications",
66 | "klyn",
67 | "1.0",
68 | "1.2"
69 | )
70 |
71 |
72 | @dbus.service.method("org.freedesktop.Notifications", in_signature="", out_signature="as")
73 | def GetCapabilities(self):
74 | return (
75 | "actions",
76 | "body",
77 | "icon-static",
78 | "persistence"
79 | )
80 |
81 |
82 | @dbus.service.signal("org.freedesktop.Notifications", signature="us")
83 | def ActionInvoked(self, notification_id, action):
84 | return (notification_id, action)
85 |
86 |
87 | @dbus.service.method("org.freedesktop.Notifications", in_signature="us", out_signature="")
88 | def InvokeAction(self, notification_id, action):
89 | self.ActionInvoked(notification_id, action)
90 |
91 |
92 | @dbus.service.signal("org.freedesktop.Notifications", signature="uu")
93 | def NotificationClosed(self, notification_id, reason):
94 | return (notification_id, reason)
95 |
96 |
97 | @dbus.service.method("org.freedesktop.Notifications", in_signature="", out_signature="")
98 | def ToggleDND(self):
99 | self.dnd = not self.dnd
100 | self.list["dnd"] = self.dnd
101 | self.update()
102 |
103 |
104 | @dbus.service.method("org.freedesktop.Notifications", in_signature="u", out_signature="")
105 | def CloseNotification(self, notification_id):
106 | for i in self.list["notifications"]:
107 | if i["id"] == notification_id:
108 | self.list["notifications"].remove(i)
109 | break
110 |
111 | self.NotificationClosed(notification_id, 2)
112 | self.DismissPopup(notification_id)
113 | self.update()
114 |
115 |
116 | @dbus.service.method("org.freedesktop.Notifications", in_signature="u", out_signature="")
117 | def DismissPopup(self, notification_id):
118 | for i in self.list["popups"]:
119 | if i["id"] == notification_id:
120 | self.list["popups"].remove(i)
121 | break
122 |
123 | self.RemovePopupID(notification_id)
124 | self.update()
125 |
126 |
127 | @dbus.service.method("org.freedesktop.Notifications", in_signature="u", out_signature="")
128 | def RemovePopupID(self , notification_id):
129 | if notification_id in self.active_popups:
130 | GLib.source_remove(self.active_popups[notification_id])
131 | self.active_popups.pop(notification_id, None)
132 |
133 |
134 | @dbus.service.method("org.freedesktop.Notifications", in_signature="", out_signature="")
135 | def ClearAll(self):
136 | for i in self.list["notifications"]:
137 | self.NotificationClosed(i["id"], 2)
138 |
139 | self.list = {
140 | "dnd": self.dnd,
141 | "notifications": [],
142 | "popups": []
143 | }
144 |
145 | for i in self.active_popups.keys():
146 | GLib.source_remove(self.active_popups[i])
147 | self.active_popups = {}
148 | self.update()
149 |
150 |
151 | def save_notification(self, notification):
152 | for i in self.list["notifications"]:
153 | if i["id"] == notification["id"]:
154 | self.list["notifications"].remove(i)
155 | break
156 |
157 | self.list["notifications"].insert(0, notification)
158 | self.update()
159 |
160 |
161 | def save_popup(self, notification):
162 | for i in self.list["popups"]:
163 | if i["id"] == notification["id"]:
164 | self.list["popups"].remove(i)
165 | GLib.source_remove(self.active_popups[i["id"]])
166 | break
167 |
168 | if len(self.list["popups"]) >= 3:
169 | oldest_popup = self.list["popups"].pop(0)
170 | self.DismissPopup(oldest_popup["id"])
171 |
172 | self.list["popups"].append(notification)
173 |
174 | popup_id = notification["id"]
175 | self.active_popups[popup_id] = GLib.timeout_add_seconds(
176 | 5,
177 | self.DismissPopup,
178 | popup_id
179 | )
180 | self.update()
181 |
182 |
183 | def clean_text(self, text):
184 | soup = BeautifulSoup(text, 'html.parser')
185 | cleaned_text = soup.get_text(separator=' ', strip=True)
186 |
187 | return cleaned_text
188 |
189 |
190 | def get_app_image(self, app_image, hints, notification_id):
191 | image = None
192 |
193 | if app_image:
194 | if os.path.isfile(app_image) or app_image.startswith("file://"):
195 | image = app_image
196 | else:
197 | image = get_themed_icon(app_image)
198 |
199 | if "image-data" in hints:
200 | image_data = hints["image-data"]
201 | image_path = f"{NOTIFICATIONS_DIR}/{notification_id}"
202 | self.save_img_byte(image_data, image_path)
203 | image = image_path
204 |
205 | return image
206 |
207 |
208 | def save_img_byte(self, px_args, save_path: str):
209 | GdkPixbuf.Pixbuf.new_from_bytes(
210 | width=px_args[0],
211 | height=px_args[1],
212 | has_alpha=px_args[3],
213 | data=GLib.Bytes(px_args[6]),
214 | colorspace=GdkPixbuf.Colorspace.RGB,
215 | rowstride=px_args[2],
216 | bits_per_sample=px_args[4],
217 | ).savev(save_path, "png")
218 |
219 |
220 | def get_urgency(self, hints):
221 | urgency = None
222 |
223 | if "urgency" in hints:
224 | urgency = hints["urgency"]
225 | if urgency == 0:
226 | urgency = "low"
227 | elif urgency == 1:
228 | urgency = "normal"
229 | elif urgency == 2:
230 | urgency = "critical"
231 |
232 | return urgency
233 |
234 |
235 | def get_id(self, replaces_id):
236 | if replaces_id != 0:
237 | notification_id = replaces_id
238 | else:
239 | if self.list.get("notifications", []):
240 | notification_id = self.list.get("notifications", [])[0]["id"] + 1
241 | else:
242 | notification_id = 1
243 |
244 | return notification_id
245 |
246 |
247 | def get_actions(self, actions):
248 | actions = list(actions)
249 | pairs = []
250 |
251 | for i in range(0, len(actions), 2):
252 | if actions[i + 1] != "":
253 | pairs.append({
254 | "label": actions[i + 1],
255 | "id": actions[i]
256 | })
257 |
258 | return pairs
259 |
260 |
261 | def update(self):
262 | update_eww("notifications", self.list)
263 | write_file("notifications",
264 | {
265 | "dnd": self.list["dnd"],
266 | "notifications": self.list["notifications"],
267 | "popups": []
268 | }
269 | )
270 |
271 |
272 | if __name__ == "__main__":
273 | DBusGMainLoop(set_as_default=True)
274 | loop = GLib.MainLoop()
275 | Notifications()
276 | try:
277 | loop.run()
278 | except KeyboardInterrupt:
279 | loop.quit()
280 |
--------------------------------------------------------------------------------
/.config/eww/scripts/python/utils.py:
--------------------------------------------------------------------------------
1 | # juminai @ github
2 |
3 | import json
4 | import os
5 | import gi
6 | import subprocess
7 | import sys
8 |
9 | gi.require_version("Gtk", "3.0")
10 |
11 | from gi.repository import Gtk
12 |
13 | CACHE = os.path.expandvars("$XDG_CACHE_HOME/eww")
14 |
15 | APPS_DIR = os.path.join(CACHE, "apps")
16 | NOTIFICATIONS_DIR = os.path.join(CACHE, "notifications")
17 | MPRIS_DIR = os.path.join(CACHE, "mpris")
18 | WEATHER_DIR = os.path.join(CACHE, "weather")
19 | COLORS_DIR = os.path.join(CACHE, "colors")
20 | TEMPLATES_DIR = os.path.join(COLORS_DIR, "templates")
21 |
22 | APPS_JSON = os.path.join(APPS_DIR, "apps.json")
23 | DOCK_JSON = os.path.join(APPS_DIR, "dock.json")
24 | FREQUENCY_JSON = os.path.join(APPS_DIR, "frequency.json")
25 | NOTIFICATIONS_JSON = os.path.join(NOTIFICATIONS_DIR, "notifications.json")
26 | CURRENT_JSON = os.path.join(COLORS_DIR, "current.json")
27 | WALLPAPER_PATH = os.path.join(COLORS_DIR, "wall.png")
28 |
29 | for file in [
30 | CACHE,
31 | APPS_DIR,
32 | NOTIFICATIONS_DIR,
33 | MPRIS_DIR,
34 | WEATHER_DIR,
35 | ]:
36 | os.makedirs(file, exist_ok=True)
37 |
38 | def get_themed_icon(icon_name):
39 | theme = Gtk.IconTheme.get_default()
40 |
41 | if "Screenshot" in icon_name:
42 | icon_name = "com.github.maoschanz.DynamicWallpaperEditor"
43 |
44 | if "Color Picker" in icon_name:
45 | icon_name = "gcolor3"
46 |
47 | icon_name = [icon_name, icon_name.lower(), icon_name.capitalize()]
48 |
49 | for name in icon_name:
50 | icon = theme.lookup_icon(name.split()[0], 128, 0)
51 | if icon:
52 | return icon.get_filename()
53 | return None
54 |
55 |
56 | def get_file(name):
57 | file_paths = {
58 | "apps": APPS_JSON,
59 | "dock": DOCK_JSON,
60 | "frequency": FREQUENCY_JSON,
61 | "notifications": NOTIFICATIONS_JSON
62 | }
63 |
64 | return file_paths.get(name, None)
65 |
66 |
67 | def load(file):
68 | file = get_file(file)
69 |
70 | try:
71 | with open(file, "r") as log:
72 | return json.load(log)
73 | except (FileNotFoundError, json.JSONDecodeError):
74 | if file == NOTIFICATIONS_JSON:
75 | return {
76 | "dnd": False,
77 | "notifications": [],
78 | "popups": []
79 | }
80 |
81 | if file == FREQUENCY_JSON:
82 | return {}
83 |
84 | if file in [DOCK_JSON, APPS_JSON]:
85 | return []
86 |
87 |
88 | def update_eww(var, content):
89 | subprocess.run([
90 | "eww", "update", f"{var}={json.dumps(content)}"
91 | ])
92 |
93 |
94 | def write_file(file, content):
95 | file = get_file(file)
96 |
97 | with open(file, "w") as log:
98 | json.dump(content, log, indent=2)
99 |
100 |
101 | def generate(content):
102 | sys.stdout.write(json.dumps(content) + "\n")
103 | sys.stdout.flush()
--------------------------------------------------------------------------------
/.config/eww/scripts/python/weather.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # juminai @ github
3 |
4 | import requests
5 | import json
6 | import time
7 | import os
8 | from utils import update_eww, WEATHER_DIR
9 |
10 | api_key = '56bfec39d45f284396f7e099cf4d150e'
11 | city_id = '3466537'
12 | units = 'metric'
13 | exclude = 'minute'
14 |
15 |
16 | def get_weather(city_id, api_key, units):
17 | url = f"http://api.openweathermap.org/data/2.5/weather?id={city_id}&appid={api_key}&units={units}"
18 |
19 | req = requests.get(url)
20 | data = req.json()
21 |
22 | city = data["name"]
23 | lon = data["coord"]["lon"]
24 | lat = data["coord"]["lat"]
25 |
26 | current = {
27 | "temp": data["main"]["temp"],
28 | "feels_like": data["main"]["feels_like"],
29 | "temp_min": data["main"]["temp_min"],
30 | "temp_max": data["main"]["temp_max"],
31 | "humidity": data["main"]["humidity"],
32 | "description": data["weather"][0]["description"],
33 | "icon": get_icon(data["weather"][0]["icon"]),
34 | "icon_image": get_icon_image(data["weather"][0]["icon"]),
35 | }
36 |
37 | url2 = f"https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&exclude={exclude}&appid={api_key}&units={units}"
38 |
39 | req2 = requests.get(url2)
40 | data2 = req2.json()
41 |
42 | daily_data = []
43 |
44 | for i in data2["daily"][1:8]:
45 | min_temp = i["temp"]["min"]
46 | max_temp = i["temp"]["max"]
47 | description = i['weather'][0]['description']
48 | icon = get_icon(i['weather'][0]['icon'])
49 | icon_image = get_icon_image(i['weather'][0]['icon'])
50 |
51 | dt = i['dt']
52 |
53 | day = {
54 | "dt": dt,
55 | "temp_min": min_temp,
56 | "temp_max": max_temp,
57 | "description": description,
58 | "icon": icon,
59 | "icon_image": icon_image,
60 | }
61 |
62 | daily_data.append(day)
63 |
64 | hourly_data = []
65 |
66 | for i in data2["hourly"][1:8]:
67 | temp = i["temp"]
68 | description = i['weather'][0]['description']
69 | icon = get_icon(i['weather'][0]['icon'])
70 | icon_image = get_icon_image(i['weather'][0]['icon'])
71 | dt = i['dt']
72 |
73 | hour = {
74 | "dt": dt,
75 | "temp": temp,
76 | "description": description,
77 | "icon": icon,
78 | "icon_image": icon_image,
79 | }
80 |
81 | hourly_data.append(hour)
82 |
83 | return {
84 | "city": city,
85 | "current": current,
86 | "daily": daily_data,
87 | "hourly": hourly_data
88 | }
89 |
90 |
91 | def get_icon_image(icon_code):
92 | icon_path = f"{WEATHER_DIR}/{icon_code}.png"
93 |
94 | if not os.path.exists(icon_path):
95 | base_url = "http://openweathermap.org/img/wn/"
96 | icon_url = f"{base_url}{icon_code}@4x.png"
97 |
98 | response = requests.get(icon_url)
99 | with open(icon_path, 'wb') as icon:
100 | icon.write(response.content)
101 |
102 | return icon_path
103 |
104 |
105 | def get_icon(icon_code):
106 | icon_map = {
107 | "01d": "",
108 | "01n": "",
109 | "02d": "",
110 | "02n": "",
111 | "03d": "",
112 | "03n": "",
113 | "04d": "",
114 | "04n": "",
115 | "09d": "",
116 | "09n": "",
117 | "10d": "",
118 | "10n": "",
119 | "11d": "",
120 | "11n": "",
121 | "13d": "",
122 | "13n": "",
123 | "40d": "",
124 | "40n": "",
125 | }
126 | return icon_map.get(icon_code, "")
127 |
128 |
129 | if __name__ == "__main__":
130 | while True:
131 | weather = get_weather(city_id, api_key, units)
132 |
133 | if weather:
134 | update_eww("weather", weather)
135 | time.sleep(1800)
--------------------------------------------------------------------------------
/.config/eww/scripts/theme:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | INTERFACE="org.gnome.desktop.interface"
4 | THEME=$(gsettings get $INTERFACE color-scheme | tr -d "'")
5 | SCSS="$XDG_CONFIG_HOME/eww/scss/variables.scss"
6 |
7 | set_dark() {
8 | gsettings set $INTERFACE gtk-theme 'adw-gtk3-dark'
9 | gsettings set $INTERFACE color-scheme 'prefer-dark'
10 | gsettings set $INTERFACE icon-theme 'Papirus-Dark'
11 | }
12 |
13 | set_light() {
14 | gsettings set $INTERFACE gtk-theme 'adw-gtk3'
15 | gsettings set $INTERFACE color-scheme 'default'
16 | gsettings set $INTERFACE icon-theme 'Papirus-Light'
17 | }
18 |
19 | toggle() {
20 | if [[ $THEME == 'prefer-dark' ]]; then
21 | sed '1s/dark/light/' -i $SCSS
22 | eww update theme=light
23 | set_light
24 | else
25 | sed '1s/light/dark/' -i $SCSS
26 | eww update theme=dark
27 | set_dark
28 | fi
29 | python $XDG_CONFIG_HOME/eww/scripts/python/material-colors.py --toggle
30 | }
31 |
32 | get() {
33 | if [[ $THEME == prefer-dark ]]; then
34 | echo dark
35 | else
36 | echo light
37 | fi
38 | }
39 |
40 | if [[ $1 == 'toggle' ]]; then toggle; fi
41 | if [[ $1 == 'get' ]]; then get; fi
42 |
--------------------------------------------------------------------------------
/.config/eww/scripts/volume:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | input_source=$(volume source | jq .input)
4 |
5 | output=$(pamixer --get-volume)
6 | output_mute=$(pamixer --get-mute)
7 | input=$(pamixer --source $input_source --get-volume)
8 | input_mute=$(pamixer --source $input_source --get-mute)
9 |
10 | echo '{"output": {"volume": '$output', "muted": "'$output_mute'"}, "input": {"volume": '$input', "muted": "'$input_mute'"}}'
11 |
12 | pactl subscribe | rg --line-buffered "on sink|on source" | while read -r _; do
13 | output=$(pamixer --get-volume)
14 | output_mute=$(pamixer --get-mute)
15 | input=$(pamixer --source $input_source --get-volume)
16 | input_mute=$(pamixer --source $input_source --get-mute)
17 |
18 | echo '{"output": {"volume": '$output', "muted": "'$output_mute'"}, "input": {"volume": '$input', "muted": "'$input_mute'"}}'
19 | done
20 |
--------------------------------------------------------------------------------
/.config/eww/scss/common/button.scss:
--------------------------------------------------------------------------------
1 | @mixin button-active {
2 | box-shadow: inset 0 0 0 $border-width $border-color;
3 | background-image: $accent-gradient;
4 |
5 | label {
6 | color: $accent-fg;
7 | }
8 | }
9 |
10 | @mixin button($flat: false, $reactive: true, $focusable: true, $radius: $radius) {
11 | border-radius: $radius;
12 | color: $fg-color;
13 |
14 | @if $flat {
15 | background-color: transparent;
16 | background-image: none;
17 | box-shadow: none;
18 | }
19 |
20 | @else {
21 | background-color: $button-bg;
22 | box-shadow: inset 0 0 0 $border-width $border-color;
23 | }
24 |
25 | @if $reactive {
26 | @if $focusable {
27 | &:focus {
28 | box-shadow: inset 0 0 0 $border-width $accent;
29 | background-color: $hover;
30 | }
31 | }
32 |
33 | &:hover {
34 | box-shadow: inset 0 0 0 $border-width $border-color;
35 | background-color: $hover;
36 | }
37 |
38 | &:active,
39 | &.active {
40 | @include button-active;
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/.config/eww/scss/common/floating-widget.scss:
--------------------------------------------------------------------------------
1 | @mixin floating-widget($drop-shadow: true, $padding: 1rem) {
2 | @if $drop-shadow {
3 | box-shadow: 0 0 5px 0 $shadow,
4 | inset 0 0 0 $border-width $border-color;
5 | } @else {
6 | border: $border;
7 | }
8 |
9 | margin: $gaps;
10 | border-radius: $radius;
11 | background-color: $bg-color;
12 | padding: $padding;
13 | color: $fg-color;
14 | }
--------------------------------------------------------------------------------
/.config/eww/scss/common/icon-image.scss:
--------------------------------------------------------------------------------
1 | @mixin image($size: 1.5rem, $cover: false) {
2 | min-width: $size;
3 | min-height: $size;
4 | background-repeat: no-repeat;
5 | background-position: center;
6 |
7 | @if $cover {
8 | background-size: cover;
9 | }
10 |
11 | @else {
12 | background-size: contain;
13 | }
14 |
15 | }
--------------------------------------------------------------------------------
/.config/eww/scss/common/scrollbar.scss:
--------------------------------------------------------------------------------
1 | @mixin scrollbar {
2 | scrollbar.vertical {
3 | transition: $transition;
4 | background: transparentize($fg-color, 0.95);
5 | border-radius: $radius;
6 |
7 | &:hover {
8 | background: transparentize($fg-color, 0.92);
9 |
10 | slider {
11 | background: transparentize($fg-color, 0.3);
12 | min-width: 0.5rem;
13 | }
14 | }
15 | }
16 |
17 | scrollbar.vertical slider {
18 | background-color: transparentize($fg-color, 0.5);
19 | border-radius: $radius;
20 | min-width: .4rem;
21 | min-height: 2rem;
22 | transition: $transition;
23 | }
24 |
25 | overshoot {
26 | &.top {
27 | background: transparentize($accent, 0.8);
28 | border-radius: 0 0 100% 100%;
29 | }
30 |
31 | &.bottom {
32 | background: transparentize($accent, 0.8);
33 | border-radius: 100% 100% 0 0;
34 | }
35 | }
36 | }
--------------------------------------------------------------------------------
/.config/eww/scss/common/slider.scss:
--------------------------------------------------------------------------------
1 | @mixin slider($drop-shadow: true, $width: 0.4rem, $color: $accent, $gradient: $accent-gradient, $slider: true, $focusable: true, $radius: $radius) {
2 | trough {
3 | transition: $transition;
4 | border-radius: $radius;
5 | border: $border;
6 | background-color: $button-bg;
7 | min-height: $width;
8 | min-width: $width;
9 |
10 | highlight,
11 | progress {
12 | border-radius: $radius;
13 | background-image: $gradient;
14 | min-height: $width;
15 | min-width: $width;
16 | }
17 | }
18 |
19 | slider {
20 | box-shadow: none;
21 | background-color: transparent;
22 | border: $border-width solid transparent;
23 | transition: $transition;
24 | border-radius: $radius;
25 | min-height: $width;
26 | min-width: $width;
27 | margin: -$width;
28 | }
29 |
30 | &:hover trough {
31 | background-color: $hover;
32 |
33 | slider {
34 | @if $slider {
35 | background-color: $fg-color;
36 | @if $theme == 'light' {
37 | background-color: $bg-color;
38 | }
39 | border-color: $border-color;
40 |
41 | @if $drop-shadow {
42 | box-shadow: 0 0 3px 0 $shadow;
43 | }
44 | }
45 | }
46 | }
47 |
48 | @if $focusable {
49 | trough:focus {
50 | background-color: $hover;
51 | box-shadow: inset 0 0 0 $border-width $color;
52 |
53 | highlight,
54 | progress {
55 | background-color: transparentize($color, 0.3);
56 | }
57 |
58 | slider {
59 | @if $slider {
60 | background-color: darken($color, 10);
61 | box-shadow: inset 0 0 0 $border-width $accent;
62 | }
63 | }
64 | }
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/.config/eww/scss/common/tooltip.scss:
--------------------------------------------------------------------------------
1 | tooltip {
2 | >*>* {
3 | background-color: $bg-color;
4 | border-radius: $button-radius;
5 | border: $border;
6 | color: $fg-color;
7 | padding: 5px;
8 | margin: 4px;
9 | box-shadow: 0 0 3px 0 $shadow;
10 | }
11 | }
--------------------------------------------------------------------------------
/.config/eww/scss/common/unset.scss:
--------------------------------------------------------------------------------
1 | * {
2 | all: unset;
3 | transition: $transition;
4 | font-family: "SF Pro", "Font Awesome 6 Pro Solid";
5 | }
--------------------------------------------------------------------------------
/.config/eww/scss/common/widget.scss:
--------------------------------------------------------------------------------
1 | @mixin widget($padding: 1rem) {
2 | border-radius: $radius;
3 | background-color: $widget-bg;
4 | padding: $padding;
5 | color: $fg-color;
6 | border: $border;
7 | }
--------------------------------------------------------------------------------
/.config/eww/scss/variables.scss:
--------------------------------------------------------------------------------
1 | $theme: dark;
2 |
3 | $fg-color: $onSurface;
4 | $bg-color: $surface;
5 | $accent: $primary;
6 | $accent-gradient: linear-gradient(to right, $accent, lighten($accent, 15%));
7 | $accent-fg: $bg-color;
8 |
9 | $gaps: 8px;
10 | $transition: 250ms;
11 | $radius: 1rem;
12 |
13 | $hover: if($theme=='light', transparentize($accent, 0.6), transparentize($accent, 0.8));
14 |
15 | $widget-bg: if($theme=='light', transparentize($accent, 0.8), transparentize($accent, 0.9));
16 |
17 | $border-width: 1px;
18 | $border-color: if($theme=='light', rgba(black, 0.03), rgba(white, 0.03));
19 | $border: $border-width solid $border-color;
20 |
21 | $shadow: rgba($shadow, 0.5);
22 | $text-shadow: 2px 2px 2px $shadow;
23 |
24 | $button-radius: $radius*0.6;
25 | $button-bg: $widget-bg;
26 |
--------------------------------------------------------------------------------
/.config/eww/scss/widgets/application.scss:
--------------------------------------------------------------------------------
1 | @mixin application($dock: false) {
2 | button {
3 | @include button;
4 |
5 | @if $dock {
6 | @include button($flat: true);
7 | padding: .5rem;
8 | }
9 |
10 | .icon {
11 | @include image($size: 4rem);
12 |
13 | @if $dock {
14 | @include image($size: 3.5rem);
15 | }
16 | }
17 |
18 | .name {
19 | font-size: 1.1rem;
20 | font-weight: 500;
21 | }
22 |
23 | .description {
24 | color: transparentize($fg-color, 0.2);
25 | }
26 |
27 | }
28 | }
--------------------------------------------------------------------------------
/.config/eww/scss/widgets/calendar.scss:
--------------------------------------------------------------------------------
1 | @mixin calendar {
2 | font-size: 1.1rem;
3 | font-weight: 500;
4 | @include widget($padding: 1rem 1rem 0 1rem);
5 |
6 | calendar {
7 | padding: 0.4rem;
8 |
9 | &:selected {
10 | box-shadow: inset 0 -8px 0 0 transparentize($accent, 0.5),
11 | inset 0 0 0 1px $accent;
12 | border-radius: $button-radius;
13 | }
14 |
15 | &.highlight,
16 | &.header {
17 | color: $accent;
18 | }
19 |
20 | &.button {
21 | @include button($flat: true);
22 | color: $accent;
23 | }
24 |
25 | &:indeterminate {
26 | color: transparentize($fg-color, 0.75);
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/.config/eww/scss/widgets/date.scss:
--------------------------------------------------------------------------------
1 | @mixin date($size, $tiny: false) {
2 | color: $fg-color;
3 |
4 | .clock {
5 | .time {
6 | font-size: $size;
7 | font-weight: bold;
8 | }
9 |
10 | .timebox {
11 | margin: $size*0.1;
12 | min-width: $size*0.15;
13 | min-height: $size*0.15;
14 | border-radius: 100%;
15 |
16 | box {
17 | box-shadow: $text-shadow;
18 | background-color: $fg-color;
19 | }
20 |
21 | @if $tiny {
22 | margin: $size*0.1 $size*0.15;
23 |
24 | box {
25 | box-shadow: none;
26 | }
27 | }
28 | }
29 | }
30 |
31 | &.active {
32 | .clock {
33 | .timebox {
34 | box {
35 | background-color: $bg-color;
36 | }
37 | }
38 | }
39 | }
40 |
41 | .today {
42 | font-size: $size * 0.25;
43 | font-weight: 500;
44 |
45 | @if $tiny {
46 | font-size: $size * 0.85;
47 | }
48 | }
49 | }
--------------------------------------------------------------------------------
/.config/eww/scss/widgets/media.scss:
--------------------------------------------------------------------------------
1 | @mixin player {
2 | .artwork {
3 | @include image($cover: true);
4 | border-radius: $radius;
5 | min-width: 6rem;
6 | min-height: 6rem;
7 | }
8 |
9 | .metadata {
10 | .title {
11 | font-size: 1.1rem;
12 | font-weight: bold;
13 | }
14 |
15 | .artist,
16 | .album {
17 | font-size: 1rem;
18 | }
19 | }
20 |
21 | .progress {
22 | @include slider;
23 | margin: .5rem 0;
24 | }
25 |
26 | .position {
27 | font-size: 1rem;
28 | font-weight: 500;
29 | }
30 |
31 | .icon {
32 | @include image;
33 | margin-right: -.5rem;
34 | }
35 |
36 | .time {
37 | font-size: .9rem;
38 | font-weight: 500;
39 | }
40 |
41 | .controls {
42 | .loop,
43 | .shuffle {
44 | font-size: 1.1rem;
45 | }
46 |
47 | .toggle {
48 | font-size: 1.5rem;
49 | }
50 |
51 | .previous,
52 | .next{
53 | font-size: 1.3rem;
54 | }
55 |
56 | .disabled {
57 | color: transparentize($fg-color, 0.5);
58 | }
59 | }
60 |
61 | .volume {
62 | padding: 1rem;
63 |
64 | .volume-scale {
65 | @include slider;
66 | }
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/.config/eww/scss/widgets/notification-center.scss:
--------------------------------------------------------------------------------
1 | @mixin notification-center {
2 | min-width: 30rem;
3 |
4 | .header {
5 | font-size: 1.5rem;
6 | margin: 0 .5rem .5rem;
7 |
8 | .label {
9 | font-weight: bold;
10 | }
11 |
12 | .clear {
13 | @include button($flat: true);
14 | padding: .6rem .8rem;
15 | border-radius: 100%;
16 | font-size: 1.2rem;
17 | }
18 | }
19 |
20 | .notification-list {
21 | @include scrollbar;
22 |
23 | .notification {
24 | @include notification;
25 |
26 | .content {
27 | @include widget;
28 | }
29 | }
30 |
31 | .empty {
32 | .icon {
33 | font-family: 'Font Awesome 6 Duotone Solid';
34 | font-size: 8rem;
35 | color: $accent;
36 | }
37 |
38 | .label {
39 | font-size: 1.5rem;
40 | font-weight: bold;
41 | }
42 | }
43 | }
44 | }
--------------------------------------------------------------------------------
/.config/eww/scss/widgets/notification.scss:
--------------------------------------------------------------------------------
1 | @mixin notification {
2 | .content {
3 | &.critical {
4 | background-color: $tertiaryContainer;
5 | }
6 | box {
7 | .image {
8 | @include image($size: 4rem);
9 | border-radius: $radius;
10 |
11 | &.Screenshot {
12 | @include image($size: 8rem, $cover: true);
13 | }
14 |
15 | &.Spotify,
16 | &.Color,
17 | &.Cider {
18 | @include image($size: 6rem);
19 | }
20 | }
21 |
22 | .summary {
23 | font-weight: bold;
24 | }
25 |
26 | .app-icon {
27 | @include image($size: 1.3rem);
28 | }
29 |
30 | .time {
31 | font-size: .9rem;
32 | font-weight: 400;
33 | color: transparentize($fg-color, 0.1);
34 | margin-top: 2px;
35 | }
36 |
37 | .close {
38 | min-width: 1.4em;
39 | min-height: 1.4em;
40 | border-radius: $radius/2;
41 | }
42 | }
43 |
44 | .actions {
45 | margin-top: .5rem;
46 |
47 | .action {
48 | @include button($radius: $button-radius);
49 | font-weight: 500;
50 | padding: 0.4rem;
51 | }
52 | }
53 | }
54 |
55 | &:hover {
56 | .content {
57 | .close {
58 | @include button($radius: $radius/2);
59 | transition: 0ms;
60 | background-color: transparentize($accent, 0.6);
61 |
62 | &:hover {
63 | background-color: transparentize($accent, 0.1);
64 |
65 | @if $theme=='dark' {
66 | color: $bg-color;
67 | }
68 | }
69 |
70 | &:active {
71 | background-color: $accent;
72 | }
73 | }
74 | }
75 | }
76 | }
--------------------------------------------------------------------------------
/.config/eww/scss/widgets/separator.scss:
--------------------------------------------------------------------------------
1 | @mixin separator($spacing: 5px) {
2 | background-color: transparentize($fg-color, 0.8);
3 | min-width: 4px;
4 | min-height: 4px;
5 | border-radius: $radius;
6 | margin: 0 $spacing;
7 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/bar.scss:
--------------------------------------------------------------------------------
1 | @mixin bar-button {
2 | @include button($flat: true);
3 | padding: 0 6px;
4 | border-radius: $button-radius;
5 | }
6 |
7 | .bar {
8 | .widget {
9 | background-color: $bg-color;
10 | padding: 5px 10px;
11 | margin-bottom: $gaps;
12 | box-shadow: 0 0 5px 0 $shadow;
13 | font-weight: 500;
14 |
15 | .separator {
16 | @include separator;
17 | }
18 |
19 | .workspaces {
20 | @include bar-button;
21 | &:active {
22 | background-image: none;
23 | }
24 |
25 | .indicator {
26 | transition: $transition/2;
27 | border-radius: $radius;
28 |
29 | &.occupied {
30 | background: lighten($bg-color, 50);
31 | min-width: 10px;
32 | min-height: 10px;
33 |
34 | @if $theme =='light' {
35 | background: transparentize($fg-color, 0.3);
36 | }
37 | }
38 |
39 | &.active {
40 | background: $accent;
41 | min-width: 24px;
42 | min-height: 14px;
43 | border-radius: $radius/3;
44 | }
45 |
46 | &.empty {
47 | background: transparentize($fg-color, 0.8);
48 | min-width: 8px;
49 | min-height: 8px;
50 | }
51 |
52 | &:hover {
53 | &.empty {
54 | background: transparentize($fg-color, 0.6);
55 | }
56 | }
57 | }
58 | }
59 |
60 | .active-client {
61 | @include bar-button;
62 |
63 | .icon {
64 | @include image($size: 20px);
65 | }
66 |
67 | .name {
68 | font-size: 1rem;
69 | }
70 | }
71 |
72 | .notification-bar {
73 | @include bar-button;
74 |
75 | .icon {
76 | font-family: 'Font Awesome 6 Duotone Solid';
77 | font-size: 1.2rem;
78 | }
79 |
80 | .summary {
81 | margin-right: 5px
82 | }
83 | }
84 |
85 | .date-bar {
86 | @include bar-button;
87 | @include date($size: 1.2rem, $tiny: true);
88 | }
89 |
90 | .media-bar {
91 | @include bar-button;
92 |
93 | .icon {
94 | @include image($size: 20px);
95 | }
96 |
97 | .title {
98 | margin-right: 5px;
99 | }
100 | }
101 |
102 | .utils-bar {
103 | .caret {
104 | @include bar-button;
105 | }
106 |
107 | .buttons {
108 | margin-right: 5px;
109 |
110 | button {
111 | @include bar-button;
112 | }
113 | }
114 | }
115 |
116 | .system-indicators {
117 | @include bar-button;
118 | font-size: 1.1rem;
119 | }
120 |
121 | .power-button {
122 | @include bar-button;
123 | font-size: 1.2rem;
124 | color: $error;
125 | }
126 | }
127 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/corners.scss:
--------------------------------------------------------------------------------
1 | .corner {
2 | background-color: transparent;
3 | padding: 15px;
4 | border-radius: 100%;
5 |
6 | &.left {
7 | box-shadow: -15px -15px 0 0 $bg-color;
8 | }
9 |
10 | &.right {
11 | box-shadow: 15px -15px 0 0 $bg-color;
12 | }
13 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/desktop.scss:
--------------------------------------------------------------------------------
1 | .desktop {
2 | .info {
3 | text-shadow: $text-shadow;
4 | @include date($size: 10rem);
5 |
6 | label {
7 | color: $fg-color;
8 | }
9 |
10 | .clock {
11 | .timebox {
12 |
13 | box {
14 | background-color: $fg-color;
15 | }
16 | }
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/dock.scss:
--------------------------------------------------------------------------------
1 | .dock {
2 | .widget {
3 | @include floating-widget($padding: 0.5rem);
4 |
5 | .launcher-button {
6 | @include button($flat: true);
7 |
8 | label {
9 | font-size: 2rem;
10 | text-shadow: $text-shadow;
11 | padding: 1rem;
12 | }
13 | }
14 |
15 | .indicator {
16 | padding: 2px;
17 | border-radius: $radius;
18 |
19 | &.open {
20 | background-color: transparentize($fg-color, 0.75);
21 | margin: 2px 25px;
22 | }
23 |
24 | &.active {
25 | background-color: $accent;
26 | margin: 2px 20px;
27 | }
28 | }
29 |
30 | .div {
31 | background: transparentize($fg-color, 0.8);
32 | padding: 1px;
33 | border-radius: $radius;
34 | margin: .5rem;
35 | }
36 |
37 | .favorite,
38 | .impostor {
39 | .application {
40 | @include application($dock: true);
41 | }
42 | }
43 | }
44 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/info-center.scss:
--------------------------------------------------------------------------------
1 | .info-center {
2 | .widget {
3 | @include floating-widget;
4 |
5 | .notification-center {
6 | @include notification-center;
7 | }
8 |
9 | .calendar {
10 | @include calendar;
11 | }
12 |
13 | .date {
14 | @include date($size: 5rem);
15 | margin-bottom: 5px;
16 | }
17 |
18 | .separator {
19 | background-color: transparentize($fg-color, 0.92);
20 | min-width: 2px;
21 | margin: 0 10px 0 2px;
22 | }
23 |
24 | .weather {
25 | @include widget;
26 |
27 | .current {
28 | .icon {
29 | font-size: 3rem;
30 | text-shadow: $text-shadow;
31 | margin-right: 10px;
32 |
33 | .clouds {
34 | color: white;
35 | }
36 | @include image($size: 6rem);
37 | margin-right: 5rem;
38 | }
39 |
40 | .temp {
41 | font-size: 3rem;
42 | font-weight: bold;
43 |
44 | &.celcius {
45 | font-size: 2rem;
46 | }
47 |
48 | }
49 |
50 | .description {
51 | font-size: 1.2rem;
52 | font-weight: bold;
53 | }
54 |
55 | .feels-like,
56 | .humidity {
57 | color: transparentize($fg-color, 0.25);
58 | font-size: 13px;
59 | font-weight: 500;
60 | }
61 | }
62 |
63 | .forecast {
64 | .i {
65 | .dt {
66 | color: transparentize($fg-color, 0.25);
67 | font-size: 13px;
68 | font-weight: 500;
69 | margin-bottom: -3px;
70 | }
71 |
72 | .icon {
73 | @include image($size: 2.5rem);
74 | }
75 |
76 | .temp {
77 | font-weight: 500;
78 | }
79 | }
80 | }
81 | }
82 | }
83 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/launcher.scss:
--------------------------------------------------------------------------------
1 | .launcher {
2 | min-width: 38rem;
3 | min-height: 42rem;
4 |
5 | .widget {
6 | @include floating-widget;
7 |
8 | .search {
9 | margin: .5rem 1rem 1rem;
10 | @include button;
11 |
12 | .icon {
13 | font-size: 1.2rem;
14 | margin-left: 15px;
15 | }
16 |
17 | .input {
18 | padding: 1rem;
19 | font-weight: 500;
20 | caret-color: $fg-color;
21 | }
22 | }
23 |
24 | .app-list {
25 | @include scrollbar;
26 | margin: 0 .5rem;
27 | .application {
28 | @include application($dock: true);
29 | }
30 | .div {
31 | padding: 1px;
32 | border-radius: $radius;
33 | background-color: transparentize($fg-color, 0.94);
34 | }
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/menu.scss:
--------------------------------------------------------------------------------
1 | .menu {
2 | .widget {
3 | @include floating-widget();
4 |
5 | .profile {
6 | &.picture {
7 | background-image: url('https://github.com/juminai.png');
8 | @include image($size: 6rem);
9 | border-radius: $radius;
10 | }
11 |
12 | &.info {
13 | // @include widget;
14 |
15 | .name {
16 | font-size: 1.5rem;
17 | font-weight: bold;
18 | }
19 |
20 | .uptime {
21 | font-size: 1.1rem;
22 | }
23 |
24 | .power {
25 | @include powermenu-button($size: 1.5rem);
26 | }
27 | }
28 | }
29 |
30 | .utils {
31 | @include widget;
32 |
33 | button {
34 | @include button($radius: 100%);
35 | font-size: 1.6rem;
36 | }
37 |
38 | .theme,
39 | .nightlight,
40 | .powerprofile,
41 | .dnd {
42 |
43 | &.dark,
44 | &.true,
45 | &.power-saver {
46 | @include button-active;
47 | }
48 | }
49 | }
50 |
51 | .system-info {
52 | .progress {
53 | @include widget;
54 | padding: 0.5rem;
55 |
56 | circular-progress {
57 | background-color: transparentize($fg-color, 0.9);
58 |
59 | &.ram,
60 | &.disk,
61 | &.temp,
62 | &.cpu {
63 | color: $accent;
64 | }
65 |
66 | &.cpu {
67 | label {
68 | margin-left: 1px;
69 | }
70 | }
71 |
72 | &.temp {
73 |
74 | label {
75 | margin-left: 1px;
76 | }
77 | }
78 | }
79 | }
80 |
81 | .icon {
82 | font-size: 1.5rem;
83 | padding: 1.5rem;
84 | }
85 | }
86 |
87 | .network {
88 | font-weight: 500;
89 |
90 | .indicator {
91 | @include widget;
92 |
93 | .icon {
94 | font-size: 1.2rem;
95 |
96 | &.down {
97 | color: transparentize($fg-color, 0.5)
98 | }
99 | }
100 | }
101 |
102 | .metric {
103 | min-width: 6rem;
104 | @include widget;
105 |
106 | .icon {
107 | font-size: 1.1rem;
108 | }
109 | }
110 | }
111 |
112 | .theme-selector {
113 | @include button;
114 | padding: 0 1rem;
115 | font-weight: 500;
116 |
117 | .icon {
118 | font-size: 1.2rem
119 | }
120 |
121 | .caret {
122 | min-width: 1rem;
123 | }
124 | }
125 |
126 | .themes {
127 | @include widget;
128 | font-size: 1.1rem;
129 | margin-top: 1rem;
130 |
131 | .separator {
132 | min-width: 1px;
133 | background-color: $hover;
134 | }
135 |
136 | button {
137 | @include button($flat: true, $radius: $button-radius);
138 | padding: .5rem;
139 | }
140 |
141 | .icon {
142 | font-size: 1.2rem;
143 | }
144 | }
145 |
146 | .sliders {
147 | @include widget($padding: .5rem);
148 |
149 | .icon {
150 | font-size: 1.3rem;
151 | min-width: 2rem;
152 | padding: 0.5rem;
153 | }
154 |
155 | .true {
156 | color: transparentize($fg-color, 0.5);
157 | }
158 |
159 | .scale {
160 | @include slider($width: 0.8rem);
161 | margin-left: 5px;
162 | }
163 |
164 | .launch {
165 | @include button($flat: true);
166 | font-size: 1.1rem;
167 | margin: 0 .5rem;
168 | padding: .5rem;
169 | }
170 | }
171 |
172 | .media-list {
173 | @include scrollbar;
174 | .player {
175 | @include player;
176 | @include widget($padding: .5rem 1rem .5rem .5rem);
177 | }
178 | }
179 | }
180 | }
181 |
182 | .media-volume {
183 | @include widget($padding: .5rem .4rem .5rem 1rem);
184 | margin: .5rem;
185 |
186 | .player-scale {
187 | @include slider($width: 0.4rem);
188 | margin-left: 5px;
189 | }
190 |
191 | .player-icon {
192 | @include image
193 | }
194 |
195 | .top {
196 | font-size: 1.1rem;
197 | .separator {
198 | min-width: 1px;
199 | background-color: $hover;
200 | }
201 | }
202 |
203 | .percent {
204 | font-weight: 500;
205 |
206 | }
207 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/notifications.scss:
--------------------------------------------------------------------------------
1 | .notifications {
2 | .notification {
3 | @include notification;
4 | .content {
5 | @include floating-widget;
6 | min-width: 28rem;
7 | }
8 | }
9 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/overview.scss:
--------------------------------------------------------------------------------
1 | .overview {
2 | .widget {
3 | @include floating-widget;
4 |
5 | .workspace {
6 | @include button($radius: $button-radius);
7 |
8 | .indicator {
9 | padding: 2px;
10 | margin: .4rem 3rem;
11 | background-color: $accent;
12 | border-radius: $radius;
13 | }
14 |
15 | .window {
16 | @include button($radius: $button-radius);
17 | }
18 |
19 | .icon {
20 | @include image($size: 2.2rem)
21 | }
22 | }
23 | }
24 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/powermenu.scss:
--------------------------------------------------------------------------------
1 | @mixin powermenu-button($size: 5rem) {
2 |
3 | button{
4 | @include button;
5 | color: $accent;
6 | padding: $size/2;
7 | font-size: $size;
8 | }
9 |
10 | .poweroff {
11 | color: $error;
12 | }
13 | }
14 |
15 | .powermenu {
16 | background-color: transparentize($bg-color, 0.7);
17 |
18 | .widget {
19 | @include floating-widget;
20 | @include powermenu-button;
21 | }
22 | }
--------------------------------------------------------------------------------
/.config/eww/scss/windows/volume.scss:
--------------------------------------------------------------------------------
1 | .vol {
2 | @include floating-widget;
3 | border-radius: $radius*1.15;
4 | padding: .2rem;
5 |
6 | label {
7 | color: lighten($bg-color, 10%);
8 |
9 | @if $theme =="light" {
10 | color: darken($bg-color, 10%);
11 | }
12 |
13 | font-size: 1.6rem;
14 | margin: 0 .25rem 1rem 0;
15 | text-shadow: $text-shadow;
16 | }
17 |
18 | .scale {
19 | @include slider($width: 3rem, $slider: false);
20 | min-height: 15rem;
21 | }
22 | }
--------------------------------------------------------------------------------
/.config/eww/yuck/setup.yuck:
--------------------------------------------------------------------------------
1 | (defwindow bar
2 | :monitor 0
3 | :stacking "bg"
4 | :exclusive false
5 | :geometry (geometry
6 | :width "100%"
7 | :height "50px"
8 | :anchor "top center")
9 | (bar)
10 | )
11 |
12 | (defwindow corner-left
13 | :stacking "fg"
14 | :monitor 0
15 | :geometry (geometry
16 | :y "42px"
17 | :anchor "top left")
18 | (box :class "corner left")
19 | )
20 |
21 | (defwindow corner-right
22 | :stacking "fg"
23 | :monitor 0
24 | :geometry (geometry
25 | :y "42px"
26 | :anchor "top right")
27 | (box :class "corner right")
28 | )
29 |
30 | (defwindow notifications
31 | :monitor 0
32 | :stacking "fg"
33 | :geometry (geometry
34 | :y "42px"
35 | :height "5px"
36 | :anchor "top center")
37 | (notifications)
38 | )
39 |
40 | (defwindow menu
41 | :monitor 0
42 | :stacking "fg"
43 | :namespace "eww_menu"
44 | :geometry (geometry
45 | :y "42px"
46 | :height "5px"
47 | :anchor "top right")
48 | (menu)
49 | )
50 |
51 | (defwindow info-center
52 | :monitor 0
53 | :stacking "fg"
54 | :geometry (geometry
55 | :y "42px"
56 | :height "5px"
57 | :anchor "top center")
58 | (info-center)
59 | )
60 |
61 | (defwindow launcher
62 | :monitor 0
63 | :stacking "overlay"
64 | :focusable true
65 | :geometry (geometry
66 | :anchor "center")
67 | (box
68 | (eventbox
69 | :onclick "actions launcher"
70 | (launcher)
71 | )
72 | )
73 | )
74 |
75 | (defwindow volume
76 | :monitor 0
77 | :stacking "overlay"
78 | :geometry (geometry
79 | :width "5px"
80 | :anchor "right center")
81 | (volume)
82 | )
83 |
84 | (defwindow overview
85 | :monitor 0
86 | :stacking "overlay"
87 | :geometry (geometry
88 | :anchor "center")
89 | (overview)
90 | )
91 |
92 | (defwindow dock
93 | :monitor 0
94 | :stacking "fg"
95 | :geometry (geometry
96 | :height "5px"
97 | :anchor "bottom center")
98 | (dock)
99 | )
100 |
101 | (defwindow powermenu
102 | :monitor 0
103 | :stacking "overlay"
104 | :namespace "eww_powermenu"
105 | :focusable true
106 | :geometry (geometry
107 | :width "100%"
108 | :height "100%"
109 | :anchor "center")
110 | (box
111 | (eventbox
112 | :onclick "eww open --toggle powermenu"
113 | (powermenu)
114 | )
115 | )
116 | )
117 |
118 | (defwindow desktop
119 | :monitor 0
120 | :stacking "bg"
121 | :geometry (geometry
122 | :anchor "center")
123 | (desktop)
124 | )
125 |
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets.yuck:
--------------------------------------------------------------------------------
1 | (include "yuck/widgets/application.yuck")
2 | (include "yuck/widgets/bar.yuck")
3 | (include "yuck/widgets/clock.yuck")
4 | (include "yuck/widgets/info-center.yuck")
5 | (include "yuck/widgets/media.yuck")
6 | (include "yuck/widgets/menu.yuck")
7 | (include "yuck/widgets/notification-center.yuck")
8 | (include "yuck/widgets/notification.yuck")
9 | (include "yuck/widgets/overview.yuck")
10 | (include "yuck/widgets/separator.yuck")
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/application.yuck:
--------------------------------------------------------------------------------
1 | (defwidget application [app simple]
2 | (eventbox
3 | :class "application"
4 | :cursor "pointer"
5 | :tooltip {simple ? app.name : ""}
6 | (overlay
7 | (button
8 | :onclick {
9 | app.address != "null" && simple ?
10 | "scripts/hyprland window ${app.address}" :
11 | !simple ? "actions launcher open ${app.id}" : "actions launch-app ${app.id}"
12 | }
13 | :onrightclick "scripts/apps add ${app.id}"
14 | :onmiddleclick "scripts/hyprland close ${app.address}"
15 | (box
16 | :space-evenly false
17 | :spacing 10
18 | (box
19 | :class "icon"
20 | :style "background-image: url('${app.icon}');"
21 | :halign "center"
22 | :valign "center"
23 | )
24 | (box
25 | :visible {!simple}
26 | :orientation "v"
27 | :space-evenly false
28 | :spacing 5
29 | :valign {app.description != "null" ? "start" : "center"}
30 | :halign "start"
31 | (label :class "name" :text {app.name} :halign "start")
32 | (label
33 | :visible {app.description != "null"}
34 | :class "description"
35 | :text {app.description}
36 | :halign "start"
37 | :wrap true
38 | :xalign 0
39 | )
40 | )
41 | )
42 | )
43 | (box
44 | :class "indicator ${app.address == active.address ? "active" : app.address != "null" ? "open" : ""}"
45 | :valign "end"
46 | :visible {app.address != "null" && simple}
47 | )
48 | )
49 | )
50 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/bar.yuck:
--------------------------------------------------------------------------------
1 | (defwidget workspaces []
2 | (button
3 | :class "workspaces"
4 | (box
5 | :space-evenly false
6 | :spacing 7
7 | (for workspace in workspaces
8 | (eventbox
9 | :cursor "pointer"
10 | :halign "center"
11 | :valign "center"
12 | (button
13 | :onclick "scripts/hyprland workspace ${workspace.id}"
14 | :class "indicator ${workspace.id == active.workspace ? "active" : arraylength(workspace.windows) > 0 ? "occupied" : "empty"}"
15 | )
16 | )
17 | )
18 | )
19 | )
20 | )
21 |
22 | (defwidget active-client []
23 | (button
24 | :class "active-client"
25 | :onclick "eww open --toggle overview"
26 | (box
27 | :class "app"
28 | :space-evenly false
29 | :spacing 5
30 | (box
31 | :class "icon ${active.class}"
32 | :style "background-image: url('${active.icon}')"
33 | :visible {active.icon != "null"}
34 | :halign "start"
35 | )
36 | (label
37 | :class "name"
38 | :text {active.class != "null" ? active.class : "Desktop ${active.workspace}"}
39 | :limit-width 20
40 | )
41 | (label :text {apps[0].id} :visible false)
42 | )
43 | )
44 | )
45 |
46 | (defwidget notification-bar []
47 | (eventbox
48 | :onhover "eww update notification_rev=true"
49 | :onhoverlost "eww update notification_rev=false"
50 | (button
51 | :class "notification-bar"
52 | :onclick "actions info-center"
53 | :tooltip "${arraylength(notifications.notifications)} ${arraylength(notifications.notifications) == 1 ? "notification" : "notifications"}"
54 | :visible {arraylength(notifications.notifications) > 0}
55 | (box
56 | :space-evenly false
57 | (revealer
58 | :transition "slideright"
59 | :reveal {notification_rev || arraylength(notifications.popups) > 0}
60 | :duration duration
61 | (label
62 | :class "summary"
63 | :visible {arraylength(notifications.notifications) > 0}
64 | :text {notifications.notifications[0].summary}
65 | :limit-width 25
66 | )
67 | )
68 | (label
69 | :class "icon"
70 | :text ""
71 | )
72 | )
73 | )
74 | )
75 | )
76 |
77 | (defwidget date-bar []
78 | (button
79 | :class "date-bar ${info-center_rev ? "active" : ""}"
80 | :onclick "actions info-center"
81 | (box
82 | :space-evenly false
83 | :spacing 5
84 | (clock :name "clock-bar")
85 | (label :text "-")
86 | (label
87 | :class "today"
88 | :text {formattime(EWW_TIME, "%a, %b %d", "America/Sao_Paulo")}
89 | )
90 | )
91 | )
92 | )
93 |
94 | (defwidget media-bar []
95 | (eventbox
96 | :onhover "eww update media-bar_rev=true"
97 | :onhoverlost "eww update media-bar_rev=false"
98 | :onscroll "echo {} | sed -e 's/up/next/g' -e 's/down/previous/g' | xargs playerctl -p ${mpris[0].name}"
99 | (button
100 | :class "media-bar"
101 | :onclick "playerctl -p ${mpris[0].name} play-pause"
102 | :visible {arraylength(mpris) > 0}
103 | (box
104 | :space-evenly false
105 | (label
106 | :text {positions[mpris[0].name].position}
107 | :visible false
108 | )
109 | (revealer
110 | :transition "slideleft"
111 | :duration duration
112 | :reveal media-bar_rev
113 | (label
114 | :class "title"
115 | :text "${mpris[0].artist} - ${mpris[0].title}"
116 | :limit-width 40
117 | )
118 | )
119 | (box
120 | :class "icon ${mpris[0].name}"
121 | :style "background-image: url('${mpris[0].icon}')"
122 | )
123 | )
124 | )
125 | )
126 | )
127 |
128 | (defwidget utils-bar []
129 | (box
130 | :class "utils-bar"
131 | (box
132 | :space-evenly false
133 | (revealer
134 | :transition "slideleft"
135 | :duration duration
136 | :reveal utils-bar_rev
137 | (box
138 | :class "buttons"
139 | :spacing 5
140 | (systray
141 | :spacing 10
142 | :icon-size 20
143 | :prepend-new true
144 | )
145 | (utils-button
146 | :css "colorpicker"
147 | :icon ""
148 | :action "actions colorpicker"
149 | :wait "300ms"
150 | :tip "Color Picker"
151 | )
152 | (utils-button
153 | :css "screenshot"
154 | :icon ""
155 | :action "actions screenshot full"
156 | :wait "300ms"
157 | :tip "Screenshot Full"
158 | )
159 | (utils-button
160 | :css "screenshot"
161 | :icon ""
162 | :action "actions screenshot crop"
163 | :wait "300ms"
164 | :tip "Screenshot Crop"
165 | )
166 | (utils-button
167 | :css "update"
168 | :icon ""
169 | :action "actions update"
170 | :wait "300ms"
171 | :tip "Update"
172 | )
173 | )
174 | )
175 | (button
176 | :class "caret"
177 | :onclick "eww update utils-bar_rev=${!utils-bar_rev}"
178 | {utils-bar_rev ? "" : ""}
179 | )
180 | )
181 | )
182 | )
183 |
184 | (defwidget dnd-indicator []
185 | (box
186 | :class "dnd-indicator"
187 | :visible {notifications.dnd}
188 | {icons.bell[notifications.dnd]}
189 | )
190 | )
191 |
192 | (defwidget nightlight-indicator []
193 | (box
194 | :class "nightlight-indicator"
195 | :visible {nightlight}
196 | {icons.light[nightlight]}
197 | )
198 | )
199 |
200 | (defwidget network-indicator []
201 | (box
202 | :class "network-indicator"
203 | {icons.network[network.status]}
204 | )
205 | )
206 |
207 | (defwidget volume-indicator []
208 | (eventbox
209 | :onscroll "volume {}"
210 | :cursor "pointer"
211 | :valign "center"
212 | (button
213 | :class "volume-indicator ${audio.output.muted}"
214 | :onclick "volume toggle"
215 | :tooltip "${audio.output.volume}%"
216 | {icons.volume[audio.output.muted]}
217 | )
218 | )
219 | )
220 |
221 | (defwidget mic-indicator []
222 | (box
223 | :class "mic-indicator"
224 | :visible {audio.input.muted}
225 | {icons.microphone[audio.input.muted]}
226 | )
227 | )
228 |
229 | (defwidget power-button []
230 | (eventbox
231 | :cursor "pointer"
232 | (button
233 | :class "power-button"
234 | :onclick "eww open --toggle powermenu"
235 | ""
236 | )
237 | )
238 | )
239 |
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/clock.yuck:
--------------------------------------------------------------------------------
1 | (defwidget clock []
2 | (box
3 | :class "clock"
4 | :space-evenly false
5 | :halign "center"
6 | (label
7 | :class "time"
8 | :text {formattime(EWW_TIME, "%H", "America/Sao_Paulo")}
9 | )
10 | (box
11 | :class "timebox"
12 | :valign "center"
13 | :orientation "v"
14 | (box :class "timebox purple" :halign "center" :valign "center")
15 | (box :class "timebox green" :halign "center" :valign "center")
16 | (box :class "timebox yellow" :halign "center" :valign "center")
17 | )
18 | (label
19 | :class "time"
20 | :text {formattime(EWW_TIME, "%M", "America/Sao_Paulo")}
21 | )
22 | )
23 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/info-center.yuck:
--------------------------------------------------------------------------------
1 | (defwidget calendar-info-center []
2 | (box
3 | :class "calendar"
4 | (calendar
5 | :day {date.day}
6 | :month {date.month}
7 | :year {date.year}
8 | )
9 | )
10 | )
11 |
12 | (defwidget clock-info-center []
13 | (box
14 | :class "date"
15 | :space-evenly false
16 | :orientation "v"
17 | (clock)
18 | (label :class "today"
19 | :text {formattime(EWW_TIME, "%A, %B %d", "America/Sao_Paulo")}
20 | )
21 | )
22 | )
23 |
24 | (defwidget grau []
25 | (label :class "celcius" :text "°")
26 | )
27 |
28 | (defwidget weather []
29 | (box
30 | :class "weather"
31 | :space-evenly false
32 | :orientation "v"
33 | :spacing 8
34 | :hexpand true
35 | (box
36 | :class "current"
37 | :space-evenly false
38 | :spacing 10
39 | (box
40 | :class "temp"
41 | :space-evenly false
42 | :valign "end"
43 | (label :text {round(weather.current.temp, 0)})
44 | (label
45 | :class "temp celcius"
46 | :text "°"
47 | :valign "start"
48 | )
49 | )
50 | (box
51 | :orientation "v"
52 | :space-evenly false
53 | (label
54 | :class "description"
55 | :text {weather.current.description}
56 | :xalign 0
57 | )
58 | (box
59 | :space-evenly false
60 | (label
61 | :class "feels-like"
62 | :text "Feels like ${round(weather.current.feels_like, 0)}"
63 | :xalign 0
64 | )
65 | (grau)
66 | )
67 | (box
68 | :space-evenly false
69 | (label
70 | :class "humidity"
71 | :text "Humidity ${round(weather.current.humidity, 0)}%"
72 | :xalign 0
73 | )
74 | )
75 | )
76 | (overlay
77 | :hexpand true
78 | :vexpand true
79 | :halign "end"
80 | (box :width 0)
81 | (button
82 | :class "current icon"
83 | :style "background-image: url('${weather.current.icon_image}');"
84 | :halign "center"
85 | :valign "center"
86 | :onclick "eww update forecast_rev=${!forecast_rev}"
87 | )
88 | )
89 | )
90 | (box :class "separator" :visible forecast_rev)
91 | (box
92 | :class "forecast"
93 | :visible forecast_rev
94 | (for i in {weather[interval]}
95 | (box
96 | :class "i"
97 | :orientation "v"
98 | :space-evenly false
99 | (label
100 | :class "dt"
101 | :text "${formattime(i.dt, interval == "daily" ? "%a" : "%I%p", "America/Sao_Paulo")}"
102 | )
103 | (button
104 | :class "icon"
105 | :style "background-image: url('${i.icon_image}')"
106 | :tooltip {i.description}
107 | :onclick {interval == "daily" ? "eww update interval=hourly" : "eww update interval=daily"}
108 | )
109 | (box
110 | :space-evenly false
111 | :halign "center"
112 | (label :class "temp" :text {round(interval == "daily" ? i.temp_max : i.temp, 0)})
113 | (grau)
114 | )
115 | )
116 | )
117 | )
118 | )
119 | )
120 |
121 | (defvar forecast_rev false)
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/media.yuck:
--------------------------------------------------------------------------------
1 | (defwidget player [player]
2 | (box
3 | :class "player ${player.name}"
4 | :space-evenly false
5 | :spacing 10
6 | (box
7 | :class "artwork"
8 | :style "background-image: url('${player.artUrl}');"
9 | :valign "center"
10 | :halign "center"
11 | )
12 | (box
13 | :class "info"
14 | :orientation "v"
15 | :space-evenly false
16 | :hexpand true
17 | (box
18 | :class "metadata"
19 | :orientation "v"
20 | :space-evenly false
21 | :spacing 2
22 | :vexpand true
23 | (box
24 | :space-evenly false
25 | :hexpand true
26 | (label
27 | :class "title"
28 | :text {player.title}
29 | :limit-width 40
30 | :wrap true
31 | :xalign 0
32 | :hexpand true
33 | )
34 | (button
35 | :class "icon ${player.name}"
36 | :style "background-image: url('${player.icon}')"
37 | :tooltip {player.name}
38 | :vexpand true
39 | :valign "start"
40 | )
41 | )
42 | (label
43 | :class "artist"
44 | :text {player.artist}
45 | :visible {player.artist != ""}
46 | :limit-width 30
47 | :wrap true
48 | :xalign 0
49 | )
50 | (label
51 | :class "album"
52 | :text {player.album}
53 | :visible {player.album != ""}
54 | :limit-width 30
55 | :wrap true
56 | :xalign 0
57 | )
58 | )
59 | (box
60 | :space-evenly false
61 | :orientation "v"
62 | (scale
63 | :visible {player.length > 0}
64 | :class "progress ${player.name}"
65 | :value {positions[player.name].position}
66 | :min 0
67 | :max {player.length}
68 | :onchange "playerctl -p ${player.name} position {}"
69 | )
70 | )
71 | (centerbox
72 | :hexpand true
73 | (label
74 | :class "time"
75 | :text {positions[player.name].positionStr}
76 | :visible {player.length > 0}
77 | :halign "start"
78 | :hexpand true
79 | )
80 | (box
81 | :class "controls"
82 | :halign "center"
83 | :hexpand true
84 | :spacing 10
85 | (eventbox
86 | :cursor "pointer"
87 | :visible {player.loop != "null"}
88 | (button
89 | :onclick "playerctl -p ${player.name} shuffle toggle"
90 | :class "shuffle ${player.shuffle ? "" : "disabled"}"
91 | :tooltip {player.shuffle ? "On" : "Off"}
92 | ""
93 | )
94 | )
95 | (eventbox
96 | :cursor {player.canGoPrevious ? "pointer" : "not-allowed"}
97 | (button
98 | :class "previous ${player.canGoPrevious ? "" : "disabled"}"
99 | :onclick "playerctl -p ${player.name} previous"
100 | ""
101 | )
102 | )
103 | (eventbox
104 | :cursor "pointer"
105 | (button
106 | :class "toggle ${player.canPlay ? "" : player.canPause ? "" : "disabled"}"
107 | :width 20
108 | :onclick "playerctl -p ${player.name} play-pause"
109 | {
110 | player.status == "Playing" ? "" :
111 | player.status == "Paused" ? "" :
112 | ""
113 | }
114 | )
115 | )
116 | (eventbox
117 | :cursor {player.canGoNext ? "pointer" : "not-allowed"}
118 | (button
119 | :class "next ${player.canGoNext ? "" : "disabled"}"
120 | :onclick "playerctl -p ${player.name} next"
121 | ""
122 | )
123 | )
124 | (eventbox
125 | :cursor "pointer"
126 | :visible {player.loop != "null"}
127 | (button
128 | :onclick {
129 | player.loop == "None" ?
130 | "playerctl -p ${player.name} loop playlist" :
131 | player.loop == "Playlist" ?
132 | "playerctl -p ${player.name} loop track" :
133 | "playerctl -p ${player.name} loop none"
134 | }
135 | :class "loop ${player.loop == 'None' ? "disabled" : ""}"
136 | :tooltip {player.loop}
137 | {
138 | player.loop == "Track" ? "" :
139 | player.loop == "Playlist" ? "" :
140 | ""
141 | }
142 | )
143 | )
144 | )
145 | (label
146 | :class "time"
147 | :text {player.lengthStr}
148 | :visible {player.length > 0}
149 | :halign "end"
150 | :hexpand true
151 | )
152 | )
153 | )
154 | )
155 | )
156 |
157 | ; (box
158 | ; ; :space-evenly false
159 | ; :class "bottom"
160 | ; ;:spacing 6
161 | ; ; (button
162 | ; ; :class "icon ${player.name}"
163 | ; ; :style "background-image: url('${player.icon}')"
164 | ; ; :tooltip {player.name}
165 | ; ; )
166 | ; ; (box
167 | ; ; :class "position"
168 | ; ; :visible {player.length > 0}
169 | ; ; :space-evenly false
170 | ; ; :spacing 3
171 | ; ; (label :class "time" :text {positions[player.name].positionStr})
172 | ; ; ; (label :text "/" :class "time")
173 | ; ; ; (label :class "time" :text {player.lengthStr})
174 | ; ; )
175 | ; )
176 |
177 | ; (box
178 | ; :class "volume"
179 | ; :visible {player.volume != -1}
180 | ; :orientation "v"
181 | ; (scale
182 | ; :class "volume-scale ${player.name}"
183 | ; :flipped true
184 | ; :orientation "v"
185 | ; :min 0
186 | ; :max 101
187 | ; :value {player.volume}
188 | ; :tooltip "${player.volume}%"
189 | ; :onchange "echo 'scale=2; {}/100' | bc | xargs playerctl -p ${player.name} volume"
190 | ; )
191 | ; )
192 |
193 |
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/menu.yuck:
--------------------------------------------------------------------------------
1 | (defwidget profile []
2 | (box
3 | :class "profile"
4 | :space-evenly false
5 | :spacing 15
6 | (box :class "profile picture" )
7 | (box
8 | :class "profile info"
9 | :space-evenly false
10 | :hexpand true
11 | (box
12 | :space-evenly false
13 | :orientation "v"
14 | :hexpand true
15 | :spacing 5
16 | (label :class "name" :text user :xalign 0)
17 | (box
18 | :class "uptime"
19 | :spacing 10
20 | :space-evenly false
21 | (label :text "")
22 | (label :text "${round(uptime, 0)} min")
23 | )
24 | (box
25 | :class "uptime"
26 | :spacing 10
27 | :space-evenly false
28 | (label :text "")
29 | (label :text "${pacman.updates} updates" :xalign 0)
30 | )
31 | )
32 | (box
33 | :class "power"
34 | :halign "end"
35 | :valign "center"
36 | :spacing 10
37 | (powermenu-button :command "poweroff")
38 | (powermenu-button :command "exit")
39 | )
40 | )
41 | )
42 | )
43 |
44 | (defwidget theme-selector []
45 | (button
46 | :class "theme-selector ${themes_rev ? "active" : ""}"
47 | :onclick "eww update themes_rev=${!themes_rev}"
48 | (box
49 | :space-evenly false
50 | (box
51 | :space-evenly false
52 | :spacing 8
53 | :hexpand true
54 | (label
55 | :class "icon"
56 | :text ""
57 | )
58 | (label :class "label" :text "Theme")
59 | )
60 | (box
61 | :class "caret"
62 | :halign "end" :hexpand true
63 | (label :text {themes_rev ? "" : ""})
64 | )
65 | )
66 | )
67 | )
68 |
69 | (defwidget themes []
70 | (revealer
71 | :reveal themes_rev
72 | :transition "slidedown"
73 | :duration duration
74 | (box
75 | :class "themes"
76 | :orientation "v"
77 | :space-evenly false
78 | :spacing 10
79 | (label :text "Theme Selector" :halign "start")
80 | (box :class "separator")
81 | (box
82 | :orientation "v"
83 | :spacing 5
84 | (button
85 | :onclick "actions image"
86 | :timeout "300ms"
87 | (box
88 | (box
89 | :space-evenly false
90 | :spacing 10
91 | (label :text "" :class "icon")
92 | (label :text "From Image")
93 | )
94 | (label
95 | :text ""
96 | :hexpand true
97 | :halign "end"
98 | :visible {colors != "color"}
99 | )
100 | )
101 | )
102 | (button
103 | :onclick "actions color"
104 | :timeout "300ms"
105 | (box
106 | (box
107 | :space-evenly false
108 | :spacing 10
109 | (label :text "" :class "icon")
110 | (label :text "From Color")
111 | )
112 | (label
113 | :text ""
114 | :hexpand true
115 | :halign "end"
116 | :visible {colors != "image"}
117 | )
118 | )
119 | )
120 | )
121 | )
122 | )
123 | )
124 |
125 | (defwidget utils-button [icon action css wait ?tip]
126 | (eventbox
127 | :cursor "pointer"
128 | (button
129 | :class css
130 | :onclick action
131 | :timeout wait
132 | :tooltip tip
133 | icon
134 | )
135 | )
136 | )
137 |
138 | (defwidget utils []
139 | (box
140 | :class "utils"
141 | :orientation "v"
142 | :spacing 15
143 | (box
144 | :spacing 15
145 | (utils-button
146 | :css "dnd ${notifications.dnd}"
147 | :icon {icons.bell[notifications.dnd]}
148 | :action "scripts/notifications toggle"
149 | :wait "200ms"
150 | )
151 | (utils-button
152 | :css "nightlight ${nightlight}"
153 | :icon {icons.light[nightlight]}
154 | :action "scripts/nightlight toggle"
155 | :wait "200ms"
156 | )
157 | )
158 | (box
159 | :spacing 15
160 | (utils-button
161 | :css "theme ${theme}"
162 | :icon ""
163 | :action "scripts/theme toggle"
164 | :wait "400ms"
165 | )
166 | (utils-button
167 | :css "powerprofile ${powerprofile}"
168 | :icon {icons.power-profile[powerprofile]}
169 | :action "scripts/powerprofile toggle"
170 | :wait "200ms"
171 | )
172 | )
173 | )
174 | )
175 |
176 | (defwidget slider [class value action icon launch ?muted]
177 | (box
178 | :class class
179 | :space-evenly false
180 | :hexpand true
181 | (eventbox
182 | :cursor "pointer"
183 | :valign "center"
184 | (button
185 | :class "icon ${muted}"
186 | :onclick "${action} toggle"
187 | icon
188 | )
189 | )
190 | (scale
191 | :class "scale"
192 | :hexpand true
193 | :tooltip {muted ? "Muted" : "${value}%"}
194 | :value value
195 | :min 0
196 | :max 101
197 | :onchange "${action} set {}"
198 | )
199 | (eventbox
200 | :cursor "pointer"
201 | :valign "center"
202 | (button
203 | :class "launch"
204 | :onclick launch
205 | ""
206 | )
207 | )
208 | )
209 | )
210 |
211 | (defwidget system-sliders []
212 | (box
213 | :class "sliders"
214 | :orientation "v"
215 | :space-evenly false
216 | (box
217 | :space-evenly false
218 | :hexpand true
219 | (slider
220 | :class "menu-volume"
221 | :value {audio.output.volume}
222 | :icon {icons.media[audio.output.muted]}
223 | :action "volume"
224 | :launch "pavucontrol &"
225 | :muted {audio.output.muted}
226 | )
227 | (eventbox
228 | :cursor "pointer"
229 | :valign "center"
230 | :visible {arraylength(mpris) > 0}
231 | (button
232 | :class "launch ${media-volume_rev ? "active" : ""}"
233 | :onclick "eww update media-volume_rev=${!media-volume_rev}"
234 | ""
235 | )
236 | )
237 | )
238 | (mpris-volume)
239 | (slider
240 | :class "menu-mic"
241 | :value {audio.input.volume}
242 | :icon {icons.microphone[audio.input.muted]}
243 | :action "volume mic"
244 | :launch "pavucontrol &"
245 | :muted {audio.input.muted}
246 | )
247 | )
248 | )
249 |
250 | (defvar media-volume_rev false)
251 |
252 | (defwidget mpris-volume []
253 | (revealer
254 | :reveal media-volume_rev
255 | :transition "slidedown"
256 | :duration duration
257 | (box
258 | :class "media-volume"
259 | :orientation "v"
260 | :spacing 10
261 | (for player in mpris
262 | (box
263 | :space-evenly false
264 | :spacing 5
265 | (box
266 | :class "player-icon"
267 | :style "background-image: url('${player.icon}')"
268 | )
269 | (scale
270 | :class "player-scale"
271 | :hexpand true
272 | :value {player.volume}
273 | :min 0
274 | :max 101
275 | :onchange "echo 'scale=2; {}/100' | bc | xargs playerctl -p ${player.name} volume"
276 | )
277 | (label :class "percent" :text "${player.volume}%" :width 50)
278 | )
279 | )
280 | )
281 | )
282 | )
283 |
284 | (defwidget system-progress [data icon css tip]
285 | (box
286 | :class "progress"
287 | (circular-progress
288 | :class css
289 | :value data
290 | :thickness 8
291 | :tooltip tip
292 | (overlay
293 | :valign "center"
294 | (label
295 | :class "icon"
296 | :text icon
297 | )
298 | )
299 | )
300 | )
301 | )
302 |
303 | (defwidget system-info []
304 | (box
305 | :class "system-info"
306 | :orientation "v"
307 | :spacing 15
308 | (box
309 | :spacing 15
310 | (system-progress
311 | :css "cpu"
312 | :tip "CPU ${round(EWW_CPU.avg,0)}%"
313 | :data {round(EWW_CPU.avg, 0)}
314 | :icon ""
315 | )
316 | (system-progress
317 | :css "ram"
318 | :tip "RAM ${round(EWW_RAM.used_mem / 1000000, 2)}MB"
319 | :data {round(EWW_RAM.used_mem_perc, 0)}
320 | :icon ""
321 | )
322 | )
323 | (box
324 | :spacing 15
325 | (system-progress
326 | :css "temp"
327 | :tip "Temperature ${EWW_TEMPS["AMDGPU_EDGE"]}°C"
328 | :data {round(EWW_TEMPS.AMDGPU_EDGE, 0)}
329 | :icon ""
330 | )
331 | (system-progress
332 | :css "disk"
333 | ;:tip "SSD ${round(EWW_DISK["/"].used_perc, 2)}%"
334 | :tip "${round(EWW_DISK["/"].used / 1000000000, 1)}GB / ${round(EWW_DISK["/"].total / 1000000000, 1)}GB"
335 | :data {round(EWW_DISK["/"].used_perc, 0)}
336 | :icon ""
337 | )
338 | )
339 | )
340 | )
341 |
342 | (defwidget menu-network []
343 | (box
344 | :class "network"
345 | :space-evenly false
346 | :spacing 10
347 | :hexpand true
348 | (box
349 | :class "indicator"
350 | :space-evenly false
351 | :spacing 8
352 | :hexpand true
353 | (label
354 | :class "icon ${network.status}"
355 | :text {icons.network[network.status]}
356 | )
357 | (label :class "name" :text {network.status == "up" ? "Connected" : "Disconnected"})
358 | )
359 | ; (box
360 | ; :space-evenly false
361 | ; :spacing 10
362 | ; (box
363 | ; :class "metric"
364 | ; (box
365 | ; :space-evenly false
366 | ; :spacing 8
367 | ; (label :text "" :class "icon")
368 | ; (label
369 | ; :text "${round(EWW_NET[network.name].NET_DOWN / 1000000, 2)}MB"
370 | ; :xalign 1 :hexpand true
371 | ; )
372 | ; )
373 | ; )
374 | ; (box
375 | ; :class "metric"
376 | ; (box
377 | ; :space-evenly false
378 | ; :spacing 8
379 | ; (label :text "" :class "icon")
380 | ; (label
381 | ; :text "${round(EWW_NET[network.name].NET_UP / 1000000, 2)}MB"
382 | ; :xalign 1 :hexpand true
383 | ; )
384 | ; )
385 | ; )
386 | ; )
387 | )
388 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/notification-center.yuck:
--------------------------------------------------------------------------------
1 | (defwidget notification-center []
2 | (box
3 | :class "notification-center"
4 | :orientation "v"
5 | :space-evenly false
6 | (box
7 | :class "header"
8 | :space-evenly false
9 | :hexpand true
10 | (label
11 | :class "label"
12 | :text "Notification Center"
13 | )
14 | (revealer
15 | :reveal {arraylength(notifications.notifications) > 0}
16 | :transition "crossfade"
17 | :halign "end"
18 | :hexpand true
19 | (eventbox
20 | :cursor "pointer"
21 | :halign "center"
22 | :valign "center"
23 | (button
24 | :onclick "scripts/notifications clear"
25 | :class "clear"
26 | ""
27 | )
28 | )
29 | )
30 | )
31 | (scroll
32 | :class "notification-list"
33 | :vscroll true
34 | :vexpand true
35 | (box
36 | :space-evenly false
37 | (box
38 | :orientation "v"
39 | :space-evenly "false"
40 | :spacing 10
41 | :hexpand true
42 | (box
43 | :visible {arraylength(notifications.notifications) == 0}
44 | :class "empty"
45 | :valign "center"
46 | :vexpand true
47 | :orientation "v"
48 | :space-evenly "false"
49 | :spacing 25
50 | (label :class "icon" :text "")
51 | (label :class "label" :text "No Notifications")
52 | )
53 | (for i in {notifications.notifications}
54 | (notification
55 | :notification i
56 | :floating false
57 | )
58 | )
59 | )
60 | (box :width 10 :visible {arraylength(notifications.notifications) != 0})
61 | )
62 | )
63 | )
64 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/notification.yuck:
--------------------------------------------------------------------------------
1 | (defwidget notification [notification floating]
2 | (eventbox
3 | :class "notification"
4 | :onmiddleclick "scripts/notifications close ${notification.id}"
5 | :onhover {
6 | floating ?
7 | "eww update popup=_'${notification.id}' && scripts/notifications pop ${notification.id}" :
8 | "eww update popup='${notification.id}'"
9 | }
10 | :onhoverlost {
11 | floating ?
12 | "scripts/notifications dismiss ${notification.id}" :
13 | "eww update popup=''"
14 | }
15 | (box
16 | :class "content ${notification.urgency}"
17 | :space-evenly false
18 | :orientation "v"
19 | (box
20 | :space-evenly false
21 | :spacing 10
22 | (overlay
23 | :valign "center"
24 | (box
25 | :class "image ${notification.appName}"
26 | :style "background-image: url('${notification.image}')"
27 | :valign "center"
28 | :halign "start"
29 | :visible {notification.image != "null"}
30 | )
31 | (box
32 | :class "app-icon"
33 | :style "background-image: url('${notification.appIcon}');"
34 | :valign "end"
35 | :halign "end"
36 | :visible {notification.appIcon != "null"}
37 | )
38 | )
39 | (box
40 | :orientation "v"
41 | :space-evenly false
42 | :hexpand true
43 | (box
44 | :space-evenly false
45 | :spacing 5
46 | (label
47 | :class "summary"
48 | :limit-width 40
49 | :wrap true
50 | :xalign 0
51 | :visible {notification.summary != "null"}
52 | :text {notification.summary}
53 | )
54 | (box :hexpand true)
55 | (label
56 | :class "time"
57 | :xalign 1
58 | :valign "start"
59 | :visible {!floating}
60 | :text {
61 | ;EWW_TIME - notification.time < 82000 ?
62 | formattime(notification.time, "%R", "America/Sao_Paulo") ;:
63 | ;formattime(notification.time, "%a, %R", "America/Sao_Paulo")
64 | }
65 |
66 | )
67 | (eventbox
68 | :cursor "pointer"
69 | (button
70 | :class "close"
71 | :valign "start"
72 | :onclick "scripts/notifications close ${notification.id}"
73 | ""
74 | )
75 | )
76 | )
77 | (label
78 | :class "body"
79 | :limit-width 120
80 | :wrap true
81 | :xalign 0
82 | :justify "left"
83 | :text {notification.body}
84 | :visible {notification.body != "null"}
85 | )
86 | )
87 | )
88 | (revealer
89 | :transition "slidedown"
90 | :duration duration
91 | :reveal {
92 | arraylength(notification.actions) != 0 &&
93 | (floating ?
94 | (popup == "_${notification.id}") : (popup == notification.id)
95 | )
96 | }
97 | (box
98 | :class "actions"
99 | :spacing 10
100 | (for action in {notification.actions}
101 | (eventbox
102 | :cursor "pointer"
103 | (button
104 | :class "action"
105 | :onclick "scripts/notifications action ${notification.id} ${action.id}"
106 | {action.label}
107 | )
108 | )
109 | )
110 | )
111 | )
112 | )
113 | )
114 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/overview.yuck:
--------------------------------------------------------------------------------
1 | (defwidget client [workspace]
2 | (eventbox
3 | :class "workspace"
4 | :onclick "scripts/hyprland workspace ${workspace.id}"
5 | :onrightclick {
6 | selected != "" ?
7 | "scripts/hyprland move ${workspace.id} ${selected}" :
8 | ""
9 | }
10 | :tooltip "Workspace ${workspace.id}"
11 | (overlay
12 | (box
13 | :space-evenly false
14 | :style "
15 | min-width: ${round(1920 * 0.12, 0)}px;
16 | min-height: ${round(1080 * 0.12, 0)}px;
17 | "
18 | (for window in {workspace.windows}
19 | (box
20 | :class "window ${window.address == "" ? "empty" : ""}"
21 | :style "
22 | margin-left: ${round(window.at[0] * 0.12, 0)}px;
23 | margin-top: ${round(window.at[1] * 0.12, 0)}px;
24 | margin-right: -${round((window.at[0] + window.size[0]) * 0.12, 0)}px;
25 | margin-bottom: ${round(1080 * 0.12 - ((window.at[1] + window.size[1]) * 0.12), 0)}px;
26 | "
27 | (eventbox
28 | :class "window button"
29 | :cursor "cell"
30 | :onrightclick {
31 | selected == "" ?
32 | "scripts/hyprland update ${window.address}" :
33 | "scripts/hyprland move ${workspace.id} ${selected}"
34 | }
35 | :onmiddleclick "scripts/hyprland close ${window.address}"
36 | :tooltip {window.class}
37 | (box
38 | :class "icon ${window.icon}"
39 | :style "background-image: url('${window.icon}');"
40 | :halign "center" :valign "center"
41 | )
42 | )
43 | )
44 | )
45 | )
46 | (box
47 | :class "indicator"
48 | :valign "start"
49 | :visible {workspace.id == active.workspace}
50 | )
51 | )
52 | )
53 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/widgets/separator.yuck:
--------------------------------------------------------------------------------
1 | (defwidget separator [?visible]
2 | (box
3 | :class "separator"
4 | :visible visible
5 | :halign "center"
6 | :valign "center"
7 | )
8 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows.yuck:
--------------------------------------------------------------------------------
1 | (include "yuck/windows/bar.yuck")
2 | (include "yuck/windows/desktop.yuck")
3 | (include "yuck/windows/dock.yuck")
4 | (include "yuck/windows/info-center.yuck")
5 | (include "yuck/windows/launcher.yuck")
6 | (include "yuck/windows/menu.yuck")
7 | (include "yuck/windows/notifications.yuck")
8 | (include "yuck/windows/overview.yuck")
9 | (include "yuck/windows/powermenu.yuck")
10 | (include "yuck/windows/volume.yuck")
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/bar.yuck:
--------------------------------------------------------------------------------
1 | (defwidget bar []
2 | (box
3 | :class "bar"
4 | (box
5 | :class "widget"
6 | (box
7 | :class "start"
8 | :halign "start"
9 | :space-evenly false
10 | (workspaces)
11 | (separator)
12 | (active-client)
13 | )
14 | (box
15 | :class "center"
16 | :halign "center"
17 | :space-evenly false
18 | (notification-bar)
19 | (separator :visible {arraylength(notifications.notifications) > 0})
20 | (date-bar)
21 | )
22 | (box
23 | :class "end"
24 | :halign "end"
25 | :space-evenly false
26 | (media-bar)
27 | (separator :visible {arraylength(mpris) > 0})
28 | (utils-bar)
29 | (separator)
30 | (eventbox
31 | :class "system-indicators"
32 | :onclick "actions menu"
33 | (box
34 | :class "system-indicators ${menu_rev ? "active" : ""}"
35 | :spacing 10
36 | (dnd-indicator)
37 | (nightlight-indicator)
38 | (network-indicator)
39 | (volume-indicator)
40 | (mic-indicator)
41 | )
42 | )
43 | (separator)
44 | (power-button)
45 | )
46 | )
47 | )
48 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/desktop.yuck:
--------------------------------------------------------------------------------
1 | (defwidget desktop []
2 | (box
3 | :class "desktop"
4 | (box
5 | :class "desktop info"
6 | :orientation "v"
7 | :space-evenly false
8 | :halign "center"
9 | :valign "center"
10 | (clock)
11 | (label
12 | :class "today"
13 | :text {formattime(EWW_TIME, "%A, %B %d", "America/Sao_Paulo")}
14 | )
15 | )
16 | )
17 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/dock.yuck:
--------------------------------------------------------------------------------
1 | (defwidget dock []
2 | (eventbox
3 | :class "dock"
4 | :onhover "eww update dock_rev=true"
5 | :onhoverlost "eww update dock_rev=false"
6 | (revealer
7 | :reveal {dock_rev || active.class == "null"}
8 | :transition "slideup"
9 | :duration duration
10 | (box
11 | :class "widget"
12 | :halign "center"
13 | :space-evenly false
14 | (eventbox
15 | :cursor "pointer"
16 | (button
17 | :class "launcher-button"
18 | :onclick "actions launcher"
19 | ""
20 | )
21 | )
22 | (box :width 5)
23 | (box
24 | :class "favorite"
25 | :spacing 5
26 | (for i in {dock.favorite}
27 | (application
28 | :app i
29 | :simple true
30 | )
31 | )
32 | )
33 | (box
34 | :class "div"
35 | :visible {arraylength(dock.impostor) > 0 && arraylength(dock.favorite) > 0}
36 | )
37 | (box
38 | :class "impostor"
39 | :spacing 5
40 | (for i in {dock.impostor}
41 | (application
42 | :app i
43 | :simple true
44 | )
45 | )
46 | )
47 | )
48 | )
49 | )
50 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/info-center.yuck:
--------------------------------------------------------------------------------
1 | (defwidget info-center []
2 | (revealer
3 | :transition "slidedown"
4 | :reveal info-center_rev
5 | :duration duration
6 | (box
7 | :class "info-center"
8 | :space-evenly false
9 | (box
10 | :class "widget"
11 | :space-evenly false
12 | (notification-center)
13 | (box :class "separator")
14 | (box
15 | :class "left"
16 | :orientation "v"
17 | :space-evenly false
18 | :spacing 10
19 | (clock-info-center)
20 | (calendar-info-center)
21 | (weather)
22 | )
23 | )
24 | )
25 | )
26 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/launcher.yuck:
--------------------------------------------------------------------------------
1 | (defwidget launcher []
2 | (box
3 | :class "launcher"
4 | (box
5 | :class "widget"
6 | :orientation "v"
7 | :space-evenly false
8 | (box
9 | :class "search"
10 | :space-evenly false
11 | (label
12 | :text ""
13 | :class "icon"
14 | )
15 | (input
16 | :class "input"
17 | :hexpand true
18 | :onchange "scripts/apps query {}"
19 | :onaccept "actions launcher open ${apps[0].id}"
20 | )
21 | )
22 | (scroll
23 | :class "app-list"
24 | :vscroll true
25 | :vexpand true
26 | (box
27 | :space-evenly false
28 | (box
29 | :orientation "v"
30 | :space-evenly false
31 | :spacing 5
32 | :hexpand true
33 | (box :class "div" :hexpand true)
34 | (for i in apps
35 | (box
36 | :orientation "v"
37 | :space-evenly false
38 | :spacing 5
39 | (application
40 | :app i
41 | :simple false
42 | )
43 | (box :class "div" :hexpand true)
44 | )
45 | )
46 | )
47 | (box :width 10)
48 | )
49 | )
50 | )
51 | )
52 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/menu.yuck:
--------------------------------------------------------------------------------
1 | (defwidget menu []
2 | (revealer
3 | :transition "slidedown"
4 | :reveal menu_rev
5 | :duration duration
6 | (box
7 | :class "menu"
8 | (box
9 | :class "widget"
10 | :space-evenly false
11 | :orientation "v"
12 | :spacing 15
13 | (profile)
14 | (system-sliders)
15 | (box
16 | :orientation "v"
17 | :space-evenly false
18 | (box
19 | :spacing 15
20 | (menu-network)
21 | (theme-selector)
22 | )
23 | (themes)
24 | )
25 | (box
26 | :spacing 15
27 | (utils)
28 | (system-info)
29 | )
30 | ; (scroll
31 | ; :class "media-list"
32 | ; :vscroll true
33 | ; :vexpand true
34 | ; :visible {arraylength(mpris) > 0}
35 | ; :height {round(arraylength(mpris) * 114, 0)}
36 | (box
37 | :class "media-list"
38 | :orientation "v"
39 | :space-evenly false
40 | :spacing 10
41 | :visible {mpris[0] != "{}" && arraylength(mpris) > 0}
42 | (for i in mpris
43 | (player :player i)
44 | )
45 | )
46 | ;)
47 | )
48 | )
49 | )
50 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/notifications.yuck:
--------------------------------------------------------------------------------
1 | (defwidget notifications []
2 | (box
3 | :class "notifications"
4 | :space-evenly false
5 | :orientation "v"
6 | (for i in "[2, 1, 0]"
7 | (revealer
8 | :reveal {notifications.popups[i] != "null" && !info-center_rev}
9 | :transition "slidedown"
10 | :duration duration
11 | (notification
12 | :notification {notifications.popups[i]}
13 | :floating true
14 | )
15 | )
16 | )
17 | )
18 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/overview.yuck:
--------------------------------------------------------------------------------
1 | (defwidget overview []
2 | (box
3 | :class "overview"
4 | (box
5 | :class "widget"
6 | :spacing 15
7 | (for workspace in {workspaces}
8 | (client :workspace workspace)
9 | )
10 | )
11 | )
12 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/powermenu.yuck:
--------------------------------------------------------------------------------
1 | (defwidget powermenu []
2 | (box
3 | :class "powermenu"
4 | (box
5 | :class "widget"
6 | :halign "center"
7 | :valign "center"
8 | :spacing 20
9 | (powermenu-button :command "poweroff")
10 | (powermenu-button :command "reboot")
11 | (powermenu-button :command "suspend")
12 | (powermenu-button :command "exit")
13 | )
14 | )
15 | )
16 |
17 | (defwidget powermenu-button [command]
18 | (eventbox
19 | :cursor "pointer"
20 | :halign "center"
21 | :valign "center"
22 | (button
23 | :class command
24 | :onclick {command == "exit" ? "hyprctl dispatch exit" : "systemctl ${command} -i"}
25 | {icons.power[command]}
26 | )
27 | )
28 | )
--------------------------------------------------------------------------------
/.config/eww/yuck/windows/volume.yuck:
--------------------------------------------------------------------------------
1 | (defwidget volume []
2 | (revealer
3 | :transition "slideleft"
4 | :reveal {volume_rev && !menu_rev}
5 | :duration duration
6 | (box
7 | :class "vol"
8 | (overlay
9 | (box
10 | :class "scale ${audio.output.volume}"
11 | (scale
12 | :min 0
13 | :max 101
14 | :value {audio.output.volume}
15 | :orientation "v"
16 | :flipped true
17 | :onchange "volume set {}"
18 | )
19 | )
20 | (label
21 | :halign "center"
22 | :valign "end"
23 | :text {icons.media[audio.output.muted]}
24 | )
25 | )
26 | )
27 | )
28 | )
29 |
30 |
--------------------------------------------------------------------------------
/.config/fontconfig/fonts.conf:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Juminai
8 |
9 | Symbols Nerd Font
10 |
11 |
12 |
13 |
14 |
15 | serif
16 |
17 | Roboto Serif
18 |
19 |
20 |
21 |
22 |
23 | sans-serif
24 |
25 | Roboto
26 |
27 |
28 |
29 |
30 |
31 | monospace
32 |
33 | Roboto Mono
34 |
35 |
36 |
37 |
38 |
39 | true
40 |
41 |
42 | true
43 |
44 |
45 | false
46 |
47 |
48 | hintslight
49 |
50 |
51 | rgb
52 |
53 |
54 | lcddefault
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/.config/foot/foot.ini:
--------------------------------------------------------------------------------
1 | # -*- conf -*-
2 |
3 | # shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
4 | # term=foot (or xterm-256color if built with -Dterminfo=disabled)
5 | # login-shell=no
6 |
7 | # app-id=foot # globally set wayland app-id. Default values are "foot" and "footclient" for desktop and server mode
8 | # title=foot
9 | # locked-title=no
10 |
11 | [main]
12 | include=~/.cache/eww/colors/colors-foot.ini
13 |
14 | font=Juminai:style=Regular:size=15
15 | font-bold=Juminai:style=Bold:size=15
16 | font-italic=Juminai:style=Italic:size=15
17 | font-bold-italic=Juminai:style=Bold Italic:size=15
18 | # font-size-adjustment=0.5
19 | # line-height=
20 | # letter-spacing=0
21 | # horizontal-letter-offset=0
22 | # vertical-letter-offset=0
23 | # underline-offset=
24 | # underline-thickness=
25 | # box-drawings-uses-font-glyphs=no
26 | # dpi-aware=no
27 |
28 | initial-window-size-pixels=800x600 # Or,
29 | # initial-window-size-chars=
30 | # initial-window-mode=windowed
31 | pad=20x20 # optionally append 'center'
32 | # resize-delay-ms=100
33 |
34 | # notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body}
35 |
36 | # bold-text-in-bright=no
37 | # word-delimiters=,│`|:"'()[]{}<>
38 | # selection-target=primary
39 | # workers=
40 | # utmp-helper=/usr/lib/utempter/utempter # When utmp backend is ‘libutempter’ (Linux)
41 | # utmp-helper=/usr/libexec/ulog-helper # When utmp backend is ‘ulog’ (FreeBSD)
42 |
43 | [environment]
44 | # name=value
45 |
46 | [bell]
47 | # urgent=no
48 | # notify=no
49 | # command=
50 | # command-focused=no
51 |
52 | [scrollback]
53 | lines=10000
54 | # multiplier=3.0
55 | # indicator-position=relative
56 | # indicator-format=""
57 |
58 | [url]
59 | # launch=xdg-open ${url}
60 | # label-letters=sadfjklewcmpgh
61 | # osc8-underline=url-mode
62 | # protocols=http, https, ftp, ftps, file, gemini, gopher
63 | # uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[]
64 |
65 | [cursor]
66 | style=beam
67 | # color=
68 | blink=yes
69 | # beam-thickness=1.5
70 | # underline-thickness=
71 |
72 | [mouse]
73 | # hide-when-typing=no
74 | # alternate-scroll-mode=yes
75 |
76 | [touch]
77 | # long-press-delay=400
78 |
79 | ## dimmed colors (see foot.ini(5) man page)
80 | # dim0=
81 | # ...
82 | # dim7=
83 |
84 | ## The remaining 256-color palette
85 | # 16 = <256-color palette #16>
86 | # ...
87 | # 255 = <256-color palette #255>
88 |
89 | ## Misc colors
90 | # selection-foreground=
91 | # selection-background=
92 | # jump-labels= # black-on-yellow
93 | # scrollback-indicator= # black-on-bright-blue
94 | # search-box-no-match= # black-on-red
95 | # search-box-match= # black-on-yellow
96 | # urls=
97 |
98 | [csd]
99 | # preferred=server
100 | # size=26
101 | # font=
102 | # color=
103 | # hide-when-maximized=no
104 | # double-click-to-maximize=yes
105 | # border-width=0
106 | # border-color=
107 | # button-width=26
108 | # button-color=
109 | # button-minimize-color=
110 | # button-maximize-color=
111 | # button-close-color=
112 |
113 | [key-bindings]
114 | # scrollback-up-page=Shift+Page_Up
115 | # scrollback-up-half-page=none
116 | # scrollback-up-line=none
117 | # scrollback-down-page=Shift+Page_Down
118 | # scrollback-down-half-page=none
119 | # scrollback-down-line=none
120 | # clipboard-copy=Control+Shift+c XF86Copy
121 | # clipboard-paste=Control+Shift+v XF86Paste
122 | # primary-paste=Shift+Insert
123 | # search-start=Control+Shift+r
124 | # font-increase=Control+plus Control+equal Control+KP_Add
125 | # font-decrease=Control+minus Control+KP_Subtract
126 | # font-reset=Control+0 Control+KP_0
127 | # spawn-terminal=Control+Shift+n
128 | # minimize=none
129 | # maximize=none
130 | # fullscreen=none
131 | # pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none
132 | # pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none
133 | # pipe-selected=[xargs -r firefox] none
134 | show-urls-launch=Control+Shift+u
135 | # show-urls-copy=none
136 | # show-urls-persistent=none
137 | # prompt-prev=Control+Shift+z
138 | # prompt-next=Control+Shift+x
139 | unicode-input=Control+Shift+o
140 | # noop=none
141 |
142 | [search-bindings]
143 | # cancel=Control+g Control+c Escape
144 | # commit=Return
145 | # find-prev=Control+r
146 | # find-next=Control+s
147 | # cursor-left=Left Control+b
148 | # cursor-left-word=Control+Left Mod1+b
149 | # cursor-right=Right Control+f
150 | # cursor-right-word=Control+Right Mod1+f
151 | # cursor-home=Home Control+a
152 | # cursor-end=End Control+e
153 | # delete-prev=BackSpace
154 | # delete-prev-word=Mod1+BackSpace Control+BackSpace
155 | # delete-next=Delete
156 | # delete-next-word=Mod1+d Control+Delete
157 | # extend-to-word-boundary=Control+w
158 | # extend-to-next-whitespace=Control+Shift+w
159 | # clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste
160 | # primary-paste=Shift+Insert
161 | # unicode-input=none
162 |
163 | [url-bindings]
164 | # cancel=Control+g Control+c Control+d Escape
165 | # toggle-url-visible=t
166 |
167 | [text-bindings]
168 | # \x03=Mod4+c # Map Super+c -> Ctrl+c
169 |
170 | [mouse-bindings]
171 | # selection-override-modifiers=Shift
172 | # primary-paste=BTN_MIDDLE
173 | # select-begin=BTN_LEFT
174 | # select-begin-block=Control+BTN_LEFT
175 | # select-extend=BTN_RIGHT
176 | # select-extend-character-wise=Control+BTN_RIGHT
177 | # select-word=BTN_LEFT-2
178 | # select-word-whitespace=Control+BTN_LEFT-2
179 | # select-row=BTN_LEFT-3
180 |
181 | # vim: ft=dosini
182 |
--------------------------------------------------------------------------------
/.config/hypr/animations.conf:
--------------------------------------------------------------------------------
1 | animations {
2 | enabled = true
3 | # Animation curves
4 |
5 | bezier = linear, 0, 0, 1, 1
6 | bezier = md3_standard, 0.2, 0, 0, 1
7 | bezier = md3_decel, 0.05, 0.7, 0.1, 1
8 | bezier = md3_accel, 0.3, 0, 0.8, 0.15
9 | bezier = overshot, 0.05, 0.9, 0.1, 1.1
10 | bezier = crazyshot, 0.1, 1.5, 0.76, 0.92
11 | bezier = hyprnostretch, 0.05, 0.9, 0.1, 1.0
12 | bezier = menu_decel, 0.1, 1, 0, 1
13 | bezier = menu_accel, 0.38, 0.04, 1, 0.07
14 | bezier = easeInOutCirc, 0.85, 0, 0.15, 1
15 | bezier = easeOutCirc, 0, 0.55, 0.45, 1
16 | bezier = easeOutExpo, 0.16, 1, 0.3, 1
17 | bezier = softAcDecel, 0.26, 0.26, 0.15, 1
18 | bezier = md2, 0.4, 0, 0.2, 1 # use with .2s duration
19 | # Animation configs
20 | animation = windows, 1, 3, md3_decel, popin 60%
21 | animation = windowsIn, 1, 3, md3_decel, popin 60%
22 | animation = windowsOut, 1, 3, md3_accel, popin 60%
23 | animation = border, 1, 10, default
24 | animation = fade, 1, 3, md3_decel
25 | animation = layers, 0
26 | #animation = layersIn, 1, 3, menu_decel, slide
27 | #animation = layersOut, 1, 1.6, menu_accel
28 | animation = fadeLayersIn, 1, 2, menu_decel
29 | animation = fadeLayersOut, 1, 4.5, menu_accel
30 | animation = workspaces, 1, 7, menu_decel, slide
31 | # animation = workspaces, 1, 2.5, softAcDecel, slide
32 | # animation = workspaces, 1, 7, menu_decel, slidefade 15%
33 | # animation = specialWorkspace, 1, 3, md3_decel, slidefadevert 15%
34 | animation = specialWorkspace, 1, 3, md3_decel, slidevert
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/.config/hypr/autostart.conf:
--------------------------------------------------------------------------------
1 | exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
2 | exec-once = systemctl --user start xdg-desktop-portal-hyprland
3 | exec-once = wl-paste --type text --watch cliphist store --no-newline
4 | exec-once = wl-paste --type image --watch cliphist store
5 | exec-once = swww init
6 | exec-once = init
7 |
--------------------------------------------------------------------------------
/.config/hypr/binds.conf:
--------------------------------------------------------------------------------
1 | $mainMod = SUPER
2 |
3 | bind = $mainMod SHIFT, P, exec, colorpicker
4 | bind = $mainMod SHIFT, T, exec, thunar
5 | bind = $mainMod SHIFT, Return, exec, [float]foot
6 | bind = $mainMod, Return, exec, foot
7 | bind = $mainMod, M, exec, actions menu
8 | bind = $mainMod, C, exec, actions info-center
9 | bind = $mainMod, D, exec, actions launcher
10 | bind = ALT, Tab, exec, actions overview
11 | bind = $mainMod, E, exec, eww open --toggle powermenu
12 | bind = $mainMod, z, exec, notify-send -i dialog-warning 'Test Notification' `date +%F_%T` -A action='Action 1' -A action='Action 2'
13 |
14 | # Screenshot
15 | bind = ,Print, exec, dripshot full
16 | bind = SHIFT, Print, exec, dripshot crop
17 |
18 | # Media control
19 | bind = ,XF86AudioPrev, exec, playerctl previous
20 | bind = ,XF86AudioPlay, exec, playerctl play-pause
21 | bind = ,XF86AudioNext, exec, playerctl next
22 |
23 | # Volume control
24 | bind = ,XF86AudioMute, exec, volume toggle
25 | bind = ,XF86AudioLowerVolume, exec, volume down
26 | bind = ,XF86AudioRaiseVolume, exec, volume up
27 |
28 | # Hypr
29 | bind = $mainMod, Tab, workspace, previous
30 | bind = $mainMod SHIFT, Q, exit
31 | bind = $mainMod, Q, killactive
32 | bind = $mainMod, space, togglefloating
33 | bind = $mainMod, F, fullscreen
34 | bind = $mainMod, P, pseudo
35 |
36 | # Move focus with mainMod + arrow keys
37 | bind = $mainMod, left, movefocus, l
38 | bind = $mainMod, right, movefocus, r
39 | bind = $mainMod, up, movefocus, u
40 | bind = $mainMod, down, movefocus, d
41 |
42 | # Switch workspaces with mainMod + [1-7]
43 | bind = $mainMod, 1, workspace, 1
44 | bind = $mainMod, 2, workspace, 2
45 | bind = $mainMod, 3, workspace, 3
46 | bind = $mainMod, 4, workspace, 4
47 | bind = $mainMod, 5, workspace, 5
48 | bind = $mainMod, 6, workspace, 6
49 | bind = $mainMod, 7, workspace, 7
50 |
51 | # Move active window to a workspace with mainMod + SHIFT + [1-7]
52 | bind = $mainMod SHIFT, 1, movetoworkspace, 1
53 | bind = $mainMod SHIFT, 2, movetoworkspace, 2
54 | bind = $mainMod SHIFT, 3, movetoworkspace, 3
55 | bind = $mainMod SHIFT, 4, movetoworkspace, 4
56 | bind = $mainMod SHIFT, 5, movetoworkspace, 5
57 | bind = $mainMod SHIFT, 6, movetoworkspace, 6
58 | bind = $mainMod SHIFT, 7, movetoworkspace, 7
59 |
60 | # Scroll through existing workspaces with mainMod + scroll
61 | bind = $mainMod, mouse_down, workspace, e+1
62 | bind = $mainMod, mouse_up, workspace, e-1
63 |
64 | # Move/resize windows with mainMod + LMB/RMB and dragging
65 | bindm = $mainMod, mouse:272, movewindow
66 | bindm = $mainMod, mouse:273, resizewindow
67 |
--------------------------------------------------------------------------------
/.config/hypr/hyprland.conf:
--------------------------------------------------------------------------------
1 | source = ~/.config/hypr/settings.conf
2 | source = ~/.config/hypr/rules.conf
3 | source = ~/.config/hypr/binds.conf
4 | source = ~/.config/hypr/theme.conf
5 | source = ~/.config/hypr/autostart.conf
6 | source = ~/.config/hypr/animations.conf
7 |
--------------------------------------------------------------------------------
/.config/hypr/rules.conf:
--------------------------------------------------------------------------------
1 | windowrule = workspace 2, ^(.*Brave-browser.*)$
2 | windowrule = workspace 3, title:^(.*Kotatogram.*)$
3 | windowrule = workspace 3, title:^(.*Telegram.*)$
4 | windowrule = workspace 4 silent, ^(Spotify)$
5 | windowrule = workspace 4 silent, ^(Cider)$
6 | windowrule = workspace 5, ^(discord)$
7 | windowrule = workspace 6, ^(.*ransmission-gtk.*)$
8 | windowrule = workspace 7, ^(mpv)$
9 | windowrule = float, ^(.*ransmission-gtk.*)$
10 | windowrule = float, ^(thunar)$
11 | windowrule = float, ^(org.gnome.Nautilus)$
12 | windowrule = float, ^(zenity)$
13 | windowrule = float, ^(mpv)$
14 | windowrule = float, ^(Viewnior)$
15 | windowrule = float, title:^(flooat)$
16 | windowrule = float, ^(engrampa)$
17 | windowrule = float, title:^(.*Abrir.*)$
18 | windowrule = float, title:^(.*Fechar.*)$
19 | windowrule = float, title:^(.*Open.*)$
20 | windowrule = float, title:^(.*Close.*)$
21 | windowrule = size 360 140, title:^(.*Rename.*)$
22 | windowrule = size 900 550, ^(thunar)$
23 | windowrule = size 900 550, ^(org.gnome.Nautilus)$
24 | layerrule = blur,^(eww_powermenu)$
25 | layerrule = noanim, ^(eww_menu)$
26 |
--------------------------------------------------------------------------------
/.config/hypr/settings.conf:
--------------------------------------------------------------------------------
1 | monitor = HDMI-A-1, 1920x1080@75, 0x0, 1
2 | monitor = HDMI-A-1, addreserved, 40, 0, 0, 0
3 |
4 | input {
5 | kb_layout = us
6 | kb_variant =
7 | kb_model =
8 | kb_options =
9 | kb_rules =
10 |
11 | follow_mouse = 1
12 | }
13 |
14 | dwindle {
15 | pseudotile = yes
16 | preserve_split = yes
17 | }
18 |
19 | gestures {
20 | workspace_swipe = off
21 | }
22 |
23 | binds {
24 | allow_workspace_cycles = true
25 | }
26 |
27 | misc {
28 | disable_hyprland_logo = true
29 | disable_splash_rendering = true
30 | animate_manual_resizes = false
31 | animate_mouse_windowdragging = false
32 | vfr = true
33 | vrr = 0
34 | }
35 |
--------------------------------------------------------------------------------
/.config/hypr/theme.conf:
--------------------------------------------------------------------------------
1 | source = ~/.cache/eww/colors/colors-hyprland.conf
2 |
3 | general {
4 | gaps_in = 10
5 | gaps_out = 30
6 | border_size = 3
7 | col.active_border = $primary
8 | col.inactive_border = $surface
9 |
10 | resize_on_border = false
11 | extend_border_grab_area = false
12 | hover_icon_on_border = true
13 |
14 | layout = dwindle
15 | }
16 |
17 | decoration {
18 | rounding = 14
19 |
20 | drop_shadow = true
21 | shadow_range = 16
22 | shadow_render_power = 4
23 | shadow_ignore_window = true
24 | col.shadow = 0x90000000
25 |
26 | blur {
27 | enabled = yes
28 | size = 8
29 | passes = 2
30 | new_optimizations = on
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/.config/lsd/config.yaml:
--------------------------------------------------------------------------------
1 | # == Classic ==
2 | # This is a shorthand to override some of the options to be backwards compatible
3 | # with `ls`. It affects the "color"->"when", "sorting"->"dir-grouping", "date"
4 | # and "icons"->"when" options.
5 | # Possible values: false, true
6 | classic: false
7 |
8 | # == Blocks ==
9 | # This specifies the columns and their order when using the long and the tree
10 | # layout.
11 | # Possible values: permission, user, group, context, size, date, name, inode, links, git
12 | blocks:
13 | - permission
14 | - user
15 | - group
16 | - size
17 | - date
18 | - name
19 |
20 | # == Color ==
21 | # This has various color options. (Will be expanded in the future.)
22 | color:
23 | # When to colorize the output.
24 | # When "classic" is set, this is set to "never".
25 | # Possible values: never, auto, always
26 | when: auto
27 | # How to colorize the output.
28 | # When "classic" is set, this is set to "no-color".
29 | # Possible values: default,
30 | # when specifying , lsd will look up theme file
31 | # XDG Base Directory if relative, e.g. ~/.config/lsd/themes/.yaml,
32 | # The file path if absolute
33 | theme: default
34 |
35 | # == Date ==
36 | # This specifies the date format for the date column. The freeform format
37 | # accepts a strftime like string.
38 | # When "classic" is set, this is set to "date".
39 | # Possible values: date, relative, '+'
40 | # `date_format` will be a `strftime` formatted value. e.g. `date: '+%d %b %y %X'` will give you a date like this: 17 Jun 21 20:14:55
41 | date: date
42 |
43 | # == Dereference ==
44 | # Whether to dereference symbolic links.
45 | # Possible values: false, true
46 | dereference: false
47 |
48 | # == Display ==
49 | # What items to display. Do not specify this for the default behavior.
50 | # Possible values: all, almost-all, directory-only
51 | # display: all
52 |
53 | # == Icons ==
54 | icons:
55 | # When to use icons.
56 | # When "classic" is set, this is set to "never".
57 | # Possible values: always, auto, never
58 | when: auto
59 | # Which icon theme to use.
60 | # Possible values: fancy, unicode
61 | theme: fancy
62 | # Separator between icon and the name
63 | # Default to 1 space
64 | separator: " "
65 |
66 | # == Ignore Globs ==
67 | # A list of globs to ignore when listing.
68 | # ignore-globs:
69 | # - .git
70 |
71 | # == Indicators ==
72 | # Whether to add indicator characters to certain listed files.
73 | # Possible values: false, true
74 | indicators: false
75 |
76 | # == Layout ==
77 | # Which layout to use. "oneline" might be a bit confusing here and should be
78 | # called "one-per-line". It might be changed in the future.
79 | # Possible values: grid, tree, oneline
80 | layout: grid
81 |
82 | # == Recursion ==
83 | recursion:
84 | # Whether to enable recursion.
85 | # Possible values: false, true
86 | enabled: false
87 | # How deep the recursion should go. This has to be a positive integer. Leave
88 | # it unspecified for (virtually) infinite.
89 | # depth: 3
90 |
91 | # == Size ==
92 | # Specifies the format of the size column.
93 | # Possible values: default, short, bytes
94 | size: default
95 |
96 | # == Permission ==
97 | # Specify the format of the permission column
98 | # Possible value: rwx, octal
99 | permission: rwx
100 |
101 | # == Sorting ==
102 | sorting:
103 | # Specify what to sort by.
104 | # Possible values: extension, name, time, size, version
105 | column: name
106 | # Whether to reverse the sorting.
107 | # Possible values: false, true
108 | reverse: false
109 | # Whether to group directories together and where.
110 | # When "classic" is set, this is set to "none".
111 | # Possible values: first, last, none
112 | dir-grouping: none
113 |
114 | # == No Symlink ==
115 | # Whether to omit showing symlink targets
116 | # Possible values: false, true
117 | no-symlink: false
118 |
119 | # == Total size ==
120 | # Whether to display the total size of directories.
121 | # Possible values: false, true
122 | total-size: false
123 |
124 | # == Hyperlink ==
125 | # Attach hyperlink to filenames
126 | # Possible values: always, auto, never
127 | hyperlink: never
128 |
129 | # == Symlink arrow ==
130 | # Specifies how the symlink arrow display, chars in both ascii and utf8
131 | symlink-arrow:
132 |
133 | # == Header ==
134 | # Whether to display block headers.
135 | # Possible values: false, true
136 | header: false
137 |
--------------------------------------------------------------------------------
/.config/lsd/icons.yaml:
--------------------------------------------------------------------------------
1 | name:
2 | desktop:
3 | downloads:
4 | videos:
5 | music:
6 | documents:
7 | pictures:
8 | templates:
9 | public:
10 | doc:
11 | node_modules:
12 | .trash:
13 | .github:
14 | .gitmodules:
15 | .gitignore:
16 | .editorconfig:
17 | .cargo:
18 | a.out:
19 | license.txt:
20 | .zshrc:
21 | package-lock.json:
22 | package.json:
23 | user-dirs.dirs:
24 | nvim:
25 | share:
26 | bin:
27 | config:
28 | extension:
29 | md:
30 | json:
31 | go:
32 | hs:
33 | rs: 🦀
34 | tar:
35 | gz:
36 | zip:
37 | rar:
38 | png:
39 | jpg:
40 | jpeg:
41 | svg:
42 | gif:
43 | xlsx:
44 | yml:
45 | toml:
46 | otf:
47 | ttf:
48 | list:
49 | conf:
50 | xml:
51 | txt:
52 | csv:
53 | lua:
54 | log:
55 | desktop:
56 | filetype:
57 | dir:
58 | file:
59 | pipe:
60 | socket:
61 | executable:
62 | symlink-dir:
63 | symlink-file:
64 | device-char:
65 | device-block:
66 | special:
67 |
--------------------------------------------------------------------------------
/.config/starship/starship.toml:
--------------------------------------------------------------------------------
1 | format = '($character)'
2 | right_format = '''$git_branch$git_status$directory'''
3 |
4 | # Disable the blank line at the start of the prompt
5 | add_newline = false
6 | command_timeout = 5000
7 |
8 | [line_break]
9 | disabled = true
10 |
11 | [character]
12 | success_symbol = "[](bold blue)"
13 | error_symbol = "[](bold red)"
14 | vicmd_symbol = "[](bold yellow)"
15 |
16 |
17 | [directory]
18 | format = " [$path](blue)"
19 | truncation_length = 3
20 | truncate_to_repo=false
21 | disabled = false
22 |
23 | [git_branch]
24 | format = "[ ](yellow)[$branch](yellow) "
25 |
26 | [git_status]
27 | format= "[ ](green)[$all_status$ahead_behind](green) "
28 | conflicted = "="
29 | ahead = " ${count}"
30 | behind = " ${count}"
31 | diverged = " ${ahead_count} ${behind_count}"
32 | up_to_date = " "
33 | untracked = "?${count}"
34 | stashed = ""
35 | modified = "!${count}"
36 | staged = "+${count}"
37 | renamed = "*${count}"
38 | deleted = "-${count}"
39 |
--------------------------------------------------------------------------------
/.local/bin/actions:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | screenshot() {
4 | sleep 0.2
5 | if [[ $1 == "full" ]]; then
6 | dripshot full
7 | else
8 | dripshot crop &
9 | fi
10 | }
11 |
12 | picker() {
13 | sleep 0.2
14 | colorpicker &
15 | }
16 |
17 | update() {
18 | foot -T flooat -e $SHELL -c 'yay -Syu' &
19 | }
20 |
21 | menu() {
22 | MENU=$(eww get menu_rev)
23 | if [[ $MENU == false ]]; then
24 | eww update menu_rev=true
25 | else
26 | eww update menu_rev=false
27 | fi
28 | }
29 |
30 | info-center() {
31 | STATE=$(eww get info-center_rev)
32 | if [[ $STATE == false ]]; then
33 | eww update info-center_rev=true
34 | else
35 | eww update info-center_rev=false
36 | fi
37 | }
38 |
39 | launcher() {
40 | $XDG_CONFIG_HOME/eww/scripts/apps query
41 | eww open --toggle launcher
42 | if [[ $1 == "open" ]]; then launch-app $2; fi
43 | }
44 |
45 | launch-app() {
46 | $XDG_CONFIG_HOME/eww/scripts/apps freq $1
47 | cd $HOME
48 | gtk-launch $1
49 | }
50 |
51 | overview() {
52 | ID=$(hyprctl activeworkspace -j | jq .id)
53 |
54 | if [[ -z $(pgrep checkoverview) ]]; then
55 | checkoverview &
56 | fi
57 | if [[ $ID < 7 ]]; then
58 | hyprctl dispatch workspace +1
59 | else
60 | hyprctl dispatch workspace 1
61 | fi
62 | }
63 |
64 | image() {
65 | wallpaper & disown
66 | }
67 |
68 | from_color() {
69 | color & disown
70 | }
71 |
72 | if [[ $1 == 'image' ]]; then image; fi
73 | if [[ $1 == 'color' ]]; then from_color; fi
74 | if [[ $1 == "colorpicker" ]]; then picker; fi
75 | if [[ $1 == "screenshot" ]]; then screenshot $2; fi
76 | if [[ $1 == "update" ]]; then update; fi
77 | if [[ $1 == "menu" ]]; then menu; fi
78 | if [[ $1 == "launcher" ]]; then launcher $2 $3; fi
79 | if [[ $1 == "info-center" ]]; then info-center; fi
80 | if [[ $1 == "overview" ]]; then overview; fi
81 | if [[ $1 == "launch-app" ]]; then launch-app $2; fi
82 |
--------------------------------------------------------------------------------
/.local/bin/checkoverview:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [[ -z $(eww active-windows | grep overview) ]]; then
4 | eww open overview
5 | fi
6 |
7 | id=$(hyprctl activeworkspace -j | jq .id)
8 |
9 | while true; do
10 | sleep 1
11 | new_id=$(hyprctl activeworkspace -j | jq .id)
12 |
13 | if [[ $id != $new_id ]]; then
14 | id="$new_id"
15 | else
16 | if [[ $id == $(hyprctl activeworkspace -j | jq .id) ]]; then
17 | if [[ -n $(eww active-windows | grep overview) ]]; then
18 | eww close overview
19 | exit
20 | fi
21 | fi
22 | fi
23 | done
24 |
--------------------------------------------------------------------------------
/.local/bin/checkvolume:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [[ $(eww get volume_rev) == false ]]; then
4 | eww update volume_rev=true
5 | fi
6 |
7 | vol=$(eww get audio | jq .output)
8 |
9 | while true; do
10 | sleep 3
11 | new_vol=$(eww get audio | jq .output)
12 |
13 | if [[ $vol != $new_vol ]]; then
14 | vol=$new_vol
15 | else
16 | if [[ $vol == $(eww get audio | jq .output) ]]; then
17 | if [[ $(eww get volume_rev) == true ]]; then
18 | eww update volume_rev=false
19 | exit
20 | fi
21 | fi
22 | fi
23 | done
24 |
--------------------------------------------------------------------------------
/.local/bin/color:
--------------------------------------------------------------------------------
1 | color() {
2 | selected_color=$(zenity --color-selection --show-palette)
3 |
4 | if [ $? -eq 1 ]; then
5 | echo "Color selection canceled."
6 | exit 1
7 | fi
8 |
9 | rgb_color=$(echo "$selected_color" | sed 's/[^0-9,]*\([0-9]*,[0-9]*,[0-9]*\).*/\1/')
10 |
11 | IFS=',' read -ra rgb_array <<<"$rgb_color"
12 |
13 | hex_color="#"
14 | for component in "${rgb_array[@]}"; do
15 | hex_component=$(printf "%02X" "$component")
16 | hex_color="${hex_color}${hex_component}"
17 | done
18 | python $XDG_CONFIG_HOME/eww/scripts/python/material-colors.py --color $hex_color
19 | }
20 |
21 | color
22 |
--------------------------------------------------------------------------------
/.local/bin/colorpicker:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # requires hyprpicker imagemagick wl-clipboard
3 |
4 | TEMP_DIR=$HOME/.cache/colorpicker
5 |
6 | [ ! -d $TEMP_DIR ] && mkdir -p $TEMP_DIR
7 |
8 | pick() {
9 | HEX_COLOR=$(hyprpicker)
10 |
11 | [[ -z $HEX_COLOR ]] && exit 1
12 |
13 | HEX="${HEX_COLOR#\#}"
14 | FNAME="$TEMP_DIR/$HEX.png"
15 |
16 | convert -size 100x100 xc:"$HEX_COLOR" "$FNAME"
17 |
18 | COLOR_CODE="$HEX_COLOR"
19 |
20 | echo "$COLOR_CODE" | wl-copy -n
21 |
22 | notify-send -u low -a "Color Picker" -i "$FNAME" $COLOR_CODE "Copied to clipboard"
23 | }
24 |
25 | pick
26 |
--------------------------------------------------------------------------------
/.local/bin/dripshot:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | DATE="$(date +'%d-%m-%y_%H:%M:%S')"
4 | DIR="$HOME/Pictures/screenshots"
5 | PIC="$DIR/$DATE.png"
6 |
7 | [ ! -d "$DIR" ] && mkdir -pv "$DIR"
8 |
9 | abort() {
10 | notify-send -a "Warn" -i dialog-error "Screenshot" "aborted"
11 | exit 1
12 | }
13 |
14 | notification() {
15 | NOTIFY=$(notify-send -A open=Open -A delete=Delete -a Screenshot -i "$PIC" "Screenshot" "$PIC")
16 | if [[ $NOTIFY == "open" ]]; then
17 | viewnior $PIC
18 | elif [[ $NOTIFY == "delete" ]]; then
19 | rm -rf $PIC
20 | else
21 | exit 0
22 | fi
23 | }
24 |
25 | case "$1" in
26 | full)
27 | grim "$PIC" || exit 1
28 | wl-copy <"$PIC"
29 | notification
30 | ;;
31 | crop)
32 | grim -g "$(slurp)" "$PIC" || exit 1
33 | wl-copy <"$PIC"
34 | notification
35 | ;;
36 | esac
37 |
--------------------------------------------------------------------------------
/.local/bin/eww:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/.local/bin/eww
--------------------------------------------------------------------------------
/.local/bin/fetch:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Tiny colored fetch script
3 | # elenapan @ github
4 |
5 | f=3 b=4
6 | for j in f b; do
7 | for i in {0..7}; do
8 | printf -v $j$i %b "\e[${!j}${i}m"
9 | done
10 | done
11 | d=$'\e[1m'
12 | t=$'\e[0m'
13 | v=$'\e[7m'
14 |
15 | # Items
16 | sep=
17 | s=$d$f0$sep$t
18 |
19 | ds=
20 | distro="$(uname -o | awk -F '"' '/PRETTY_NAME/ { print $2 }' /etc/os-release)"
21 |
22 | h=
23 | wmname="$(echo $XDG_CURRENT_DESKTOP)"
24 |
25 | k=
26 | kernel="$(uname -r | cut -d '-' -f1)"
27 |
28 | p=
29 | packages="$(pacman -Q | wc -l)"
30 |
31 | sh=
32 | shell=$(basename $SHELL)
33 |
34 | colors=$(for i in {0..7}; do echo -en "\e[${1}$((30 + $i))m▅▅"; done)
35 |
36 | tput clear
37 | cat << EOF
38 | $f6$ds $t$distro
39 | (\ /) $f4$k $t$kernel
40 | ( $d. .$t) $f3$p $t$packages
41 | c($f1"$t)($f1"$t) $d$f2$h $t$wmname
42 | $f1$sh $t$shell
43 | EOF
44 |
--------------------------------------------------------------------------------
/.local/bin/init:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | pkill eww
4 | pkill python
5 |
6 | eww daemon
7 | eww open desktop
8 | eww open bar
9 | eww open corner-left
10 | eww open corner-right
11 | eww open dock
12 | eww open volume
13 | eww open info-center
14 | eww open menu
15 | eww open notifications
16 |
--------------------------------------------------------------------------------
/.local/bin/lsd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/.local/bin/lsd
--------------------------------------------------------------------------------
/.local/bin/volume:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # requires pamixer
3 |
4 | input="alsa_input.pci-0000_06_00.6.analog-stereo"
5 | output="alsa_output.pci-0000_06_00.6.analog-stereo.monitor"
6 |
7 | input_source=$(pamixer --list-sources | awk '/"'$input'"/ {print $1}')
8 | output_source=$(pamixer --list-sources | awk '/"'$output'"/ {print $1}')
9 |
10 | get_source() {
11 | echo '{"output": '$output_source', "input": '$input_source'}'
12 | }
13 |
14 | check() {
15 | if [[ -z $(pgrep checkvolume) ]]; then
16 | checkvolume &
17 | fi
18 | }
19 |
20 | mic() {
21 | source="pamixer --source $input_source"
22 | unmute="$source -u &&"
23 | if [[ $1 == 'toggle' ]]; then $source -t; fi
24 | if [[ $1 == 'set' ]]; then $unmute $source --set-volume $2; fi
25 | if [[ $1 == 'up' ]]; then $unmute $source -i 1; fi
26 | if [[ $1 == 'down' ]]; then $unmute $source -d 2; fi
27 | }
28 |
29 | set() {
30 | check
31 | pamixer -u
32 | pamixer --set-volume $1
33 | }
34 |
35 | up() {
36 | check
37 | pamixer -u
38 | pamixer -i 2
39 | }
40 |
41 | down() {
42 | check
43 | pamixer -u
44 | pamixer -d 2
45 | }
46 |
47 | if [[ $1 == 'toggle' ]]; then check && pamixer -t; fi
48 | if [[ $1 == 'set' ]]; then set $2; fi
49 | if [[ $1 == 'up' ]]; then up; fi
50 | if [[ $1 == 'down' ]]; then down; fi
51 | if [[ $1 == 'mic' ]]; then mic $2 $3; fi
52 | if [[ $1 == 'source' ]]; then get_source; fi
53 |
--------------------------------------------------------------------------------
/.local/bin/wallpaper:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | wallpaper() {
4 | image=$(zenity --file-selection '~/Pictures/wallpapers')
5 |
6 | if [[ $image == "" ]]; then
7 | exit 0
8 | fi
9 |
10 | python $XDG_CONFIG_HOME/eww/scripts/python/material-colors.py --image "$image"
11 | }
12 |
13 | wallpaper
14 |
--------------------------------------------------------------------------------
/.local/bin/ytmp3:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | for i in "$@"; do
4 | yt-dlp -x \
5 | --audio-format mp3 \
6 | --audio-quality 0 \
7 | -P ~/Music \
8 | -o "%(title)s.%(ext)s" \
9 | "$i"
10 | done
11 |
--------------------------------------------------------------------------------
/.zshenv:
--------------------------------------------------------------------------------
1 | export PATH="$HOME/.local/bin:$PATH"
2 | export EDITOR=nvim
3 | export XDG_CONFIG_HOME="$HOME/.config"
4 | export XDG_CACHE_HOME="$HOME/.cache"
5 | export XDG_MUSIC_DIR="$HOME/Music"
6 | export XDG_PICTURES_DIR="$HOME/Pictures"
7 |
--------------------------------------------------------------------------------
/.zshrc:
--------------------------------------------------------------------------------
1 | #!/bin/zsh
2 | SHELL=$(which zsh || echo '/bin/zsh')
3 |
4 | fpath=(usr/share/zsh/site-functions $fpath)
5 |
6 | setopt autocd # change directory just by typing its name
7 | setopt interactivecomments # allow comments in interactive mode
8 | setopt magicequalsubst # enable filename expansion for arguments of the form ‘anything=expression’
9 | setopt nonomatch # hide error message if there is no match for the pattern
10 | setopt notify # report the status of background jobs immediately
11 | setopt numericglobsort # sort filenames numerically when it makes sense
12 | setopt promptsubst # enable command substitution in prompt
13 | setopt MENU_COMPLETE # Automatically highlight first element of completion menu
14 | setopt AUTO_LIST # Automatically list choices on ambiguous completion.
15 | setopt COMPLETE_IN_WORD # Complete from both ends of a word.
16 |
17 | # enable completion features
18 | autoload -Uz compinit
19 | compinit -i
20 |
21 | zstyle ':completion:*:*:*:*:*' menu select
22 | zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' # case insensitive tab completion
23 |
24 | zstyle ':completion:*' use-cache on
25 | zstyle ':completion:*' cache-path "$HOME/.cache/.zcompcache"
26 |
27 | # Define completers
28 | zstyle ':completion:*' completer _extensions _complete _approximate
29 |
30 | zstyle ':completion:*:*:*:*:corrections' format '%F{yellow}!- %d (errors: %e) -!%f'
31 | zstyle ':completion:*:*:*:*:descriptions' format '%F{blue}-- %D %d --%f'
32 | zstyle ':completion:*:*:*:*:messages' format ' %F{purple} -- %d --%f'
33 | zstyle ':completion:*:*:*:*:warnings' format ' %F{red}-- no matches found --%f'
34 |
35 | zstyle ':completion:*' group-name ''
36 | zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
37 |
38 | # Only display some tags for the command cd
39 | zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories
40 |
41 | # History configurations
42 | HISTFILE="$HOME/.cache/.zsh_history"
43 | HISTSIZE=10000
44 | SAVEHIST=20000
45 | setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE
46 | setopt hist_ignore_dups # ignore duplicated commands history list
47 | setopt hist_ignore_space # ignore commands that start with space
48 | setopt hist_verify # show command with history expansion to user before running it
49 | setopt share_history # share command history data
50 |
51 | # source plugins
52 | source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
53 | source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
54 |
55 | cd() {
56 | builtin cd "$@" && command lsd -A
57 | }
58 |
59 | # init starship
60 | eval "$(starship init zsh)"
61 | # setup starship custom prompt
62 | export STARSHIP_CONFIG=$HOME/.config/starship/starship.toml
63 |
64 | # alias
65 | alias ..='cd ..'
66 | alias mkdir='mkdir -pv'
67 | alias ls='lsd'
68 | alias l='lsd -a'
69 | alias cat='bat --color always --theme base16 --plain'
70 | alias grep='grep --color=auto'
71 | alias v='nvim'
72 | alias vim='nvim'
73 | alias mv='mv -v'
74 | alias cp='cp -rv'
75 | alias rm='rm -rfv'
76 | alias gc='git clone'
77 | alias q='exit'
78 | alias fetch='clear ; fetch'
79 | alias footrc='nvim $HOME/.config/foot/foot.ini'
80 |
81 | # pacman install
82 | alias paci="yay -Slq | fzf --prompt=' ' --color=bw -m --preview 'cat <(yay -Si {1}) <(yay -Fl {1} | awk \"{print \$2}\")' | xargs -ro yay -S --needed"
83 |
84 | # pacman remove
85 | alias pacr="yay -Qq | fzf --prompt=' ' --color=bw -m --preview 'yay -Qi {1}' | xargs -ro yay -Rns"
86 |
87 | # pacman view
88 | alias pac="yay -Qq | fzf --prompt=' ' --color=bw -m --preview 'yay -Qi {1}'"
89 |
90 | # pacman clear
91 | alias pacc='yay -Qtdq | yay -Rns -'
92 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Details
2 |
3 | - **OS:** Arch Linux
4 | - **Compositor:** Hyprland
5 | - **Terminal:** foot
6 | - **Widgets:** eww
7 | - **Colors:** [Material You](https://github.com/avanisubbiah/material-color-utilities-python)
8 | - **Fonts:**
9 | * **Icons:** Font Awesome 6 Pro
10 | * **UI:** San Francisco
11 | * **Terminal:** custom Iosevka
12 |
13 | ##
14 |
15 | 
16 | 
17 | 
18 | 
19 | 
20 |
21 | #### thanks
22 | * [Aylur](https://github.com/Aylur/dotfiles)
23 |
--------------------------------------------------------------------------------
/assets/desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/desktop.png
--------------------------------------------------------------------------------
/assets/launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/launcher.png
--------------------------------------------------------------------------------
/assets/main.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/main.png
--------------------------------------------------------------------------------
/assets/overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/overview.png
--------------------------------------------------------------------------------
/assets/powermenu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/juminai/dotfiles/a34b6259b050de256fcb9bd93a0f2ef062b26283/assets/powermenu.png
--------------------------------------------------------------------------------