diff --git a/flake.nix b/flake.nix
index d10fe6f..d3a65bf 100644
--- a/flake.nix
+++ b/flake.nix
@@ -44,7 +44,6 @@
user = "zoriya";
mkSystem = system: hostname: {
- nixModules,
homeModules,
}: let
inputs = rawInput // {inherit user;};
@@ -55,7 +54,6 @@
./modules/misc
# ./modules/gnome
./modules/dwl
- nixModules
nur.nixosModules.nur
{
nixpkgs.overlays = [
@@ -137,7 +135,6 @@
git.enable = true;
nvim.enable = true;
direnv.enable = true;
- ntfy.enable = true;
};
};
};
diff --git a/modules/dwl/ags/.editorconfig b/modules/dwl/ags/.editorconfig
new file mode 100644
index 0000000..1aa37fe
--- /dev/null
+++ b/modules/dwl/ags/.editorconfig
@@ -0,0 +1,13 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = tab
+indent_size = tab
+
+[{*.yaml,*.yml}]
+indent_style = space
+indent_size = 2
diff --git a/modules/dwl/ags/.eslintrc.yml b/modules/dwl/ags/.eslintrc.yml
deleted file mode 100644
index 031da55..0000000
--- a/modules/dwl/ags/.eslintrc.yml
+++ /dev/null
@@ -1,76 +0,0 @@
-env:
- es2021: true
-extends: eslint:recommended
-overrides: []
-parserOptions:
- ecmaVersion: latest
- sourceType: 'module'
-rules:
- arrow-parens:
- - error
- - as-needed
- comma-dangle:
- - error
- - always-multiline
- comma-spacing:
- - error
- - before: false
- after: true
- comma-style:
- - error
- - last
- curly:
- - error
- - multi-or-nest
- - consistent
- dot-location:
- - error
- - property
- eol-last: error
- indent:
- - error
- - 4
- - SwitchCase: 1
- keyword-spacing:
- - error
- - before: true
- lines-between-class-members:
- - error
- - always
- - exceptAfterSingleLine: true
- padded-blocks:
- - error
- - never
- - allowSingleLineBlocks: false
- prefer-const: error
- quotes:
- - error
- - single
- - avoidEscape: true
- semi:
- - error
- - always
- nonblock-statement-body-position:
- - error
- - below
- no-trailing-spaces:
- - error
- array-bracket-spacing:
- - error
- - never
- key-spacing:
- - error
- - beforeColon: false
- afterColon: true
- object-curly-spacing:
- - error
- - always
- no-useless-escape:
- - off
-globals:
- ags: readonly
- ARGV: readonly
- imports: readonly
- print: readonly
- console: readonly
- logError: readonly
diff --git a/modules/dwl/ags/.gitignore b/modules/dwl/ags/.gitignore
index 01f5b52..d0cdead 100644
--- a/modules/dwl/ags/.gitignore
+++ b/modules/dwl/ags/.gitignore
@@ -1,8 +1,4 @@
node_modules
package-lock.json
weather_key
-*.css
settings.json
-scss/generated.scss
-scss/additional.scss
-scss/.goutputstream-*
diff --git a/modules/dwl/ags/.stylelintrc.yml b/modules/dwl/ags/.stylelintrc.yml
deleted file mode 100644
index 7b8202e..0000000
--- a/modules/dwl/ags/.stylelintrc.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-extends: stylelint-config-standard-scss
-ignoreFiles: "**/*.js"
-rules:
- selector-type-no-unknown: null
- declaration-empty-line-before: null
- no-descending-specificity: null
- selector-pseudo-class-no-unknown: null
- color-function-notation: legacy
- alpha-value-notation: number
- scss/operator-no-unspaced: null
- scss/no-global-function-names: null
- scss/dollar-variable-empty-line-before: null
- scss/dollar-variable-pattern: ^[a-z]+(_[a-z]+)*$
- scss/at-mixin-pattern: ^[a-z]+(_[a-z]+)*$
diff --git a/modules/dwl/ags/config.js b/modules/dwl/ags/config.js
index 4d3832d..004af0f 100644
--- a/modules/dwl/ags/config.js
+++ b/modules/dwl/ags/config.js
@@ -1,5 +1,4 @@
-import topbar from './layouts/topbar.js';
-import * as shared from './layouts/shared.js';
+import topbar from "./layouts/bar.js";
// TODO: (ags) dwl patch
// const monitors = ags.Service.Hyprland.HyprctlGet('monitors')
@@ -7,14 +6,15 @@ import * as shared from './layouts/shared.js';
const monitors = [0];
export default {
- closeWindowDelay: {
- 'quicksettings': 300,
- 'dashboard': 300,
- },
- windows: [
- ...topbar(monitors),
- // shared.ApplauncherPopup(),
- shared.PowermenuPopup(),
- // shared.VerificationPopup(),
- ],
+ closeWindowDelay: {
+ quicksettings: 300,
+ dashboard: 300,
+ },
+ style: ags.App.configDir + "/style.css",
+ windows: [
+ ...topbar(monitors),
+ // shared.ApplauncherPopup(),
+ // shared.PowermenuPopup(),
+ // shared.VerificationPopup(),
+ ],
};
diff --git a/modules/dwl/ags/layouts/bar.js b/modules/dwl/ags/layouts/bar.js
new file mode 100644
index 0000000..b98080c
--- /dev/null
+++ b/modules/dwl/ags/layouts/bar.js
@@ -0,0 +1,74 @@
+// import { Separator } from '../modules/misc.js';
+// import { PanelIndicator as NotificationIndicator } from './widgets/notifications.js';
+// import { PanelButton as ColorPicker } from '../modules/colorpicker.js';
+// import { PanelButton as DashBoard } from './widgets/dashboard.js';
+// import { PanelButton as ScreenRecord } from '../modules/screenrecord.js';
+// import { PanelButton as QuickSettings } from './widgets/quicksettings.js';
+
+import { Clock } from "../modules/clock.js";
+import { BatteryIndicator } from "../modules/battery.js";
+
+const { App } = ags;
+const { Window, CenterBox, Box, Button } = ags.Widget;
+
+const Bar = (monitor) =>
+ Window({
+ name: `bar${monitor}`,
+ className: "transparent",
+ exclusive: true,
+ anchor: "top left right",
+ monitor,
+ child: CenterBox({
+ startWidget: Box({
+ children: [
+ // Workspaces(),
+ // Separator({ valign: "center" }),
+ // Client(),
+ ],
+ }),
+ endWidget: Box({
+ halign: "end",
+ children: [
+ // NotificationIndicator({
+ // direction: "right",
+ // hexpand: true,
+ // halign: "start",
+ // }),
+ // ags.Widget.Box({ hexpand: true }),
+ // ScreenRecord(),
+ // ColorPicker(),
+ // Separator({ valign: "center" }),
+ Button({
+ onClicked: () => App.toggleWindow("quicksettings"),
+ connections: [[App, (btn, win, visible) => {
+ btn.toggleClassName( "active", win === "quicksettings" && visible);
+ }]],
+ child: Box({
+ children: [
+ // audio.MicrophoneMuteIndicator({ unmuted: null }),
+ // notifications.DNDIndicator({ noisy: null }),
+ // BluetoothIndicator(),
+ // bluetooth.Indicator({ disabled: null }),
+ // network.Indicator(),
+ // audio.SpeakerIndicator(),
+ BatteryIndicator(),
+ ],
+ }),
+ }),
+ Clock({ format: "%a %d %b", className: "module bold" }),
+ Clock({ format: "%H:%M", className: "module accent bold" }),
+ ],
+ }),
+ }),
+ });
+
+export default (monitors) =>
+ [
+ ...monitors.map((mon) => [
+ Bar(mon),
+ // shared.Notifications(mon, 'slide_down', 'top'),
+ // shared.OSDIndicator(mon),
+ ]),
+ // shared.Quicksettings({ position: 'top right' }),
+ // shared.Dashboard({ position: 'top' }),
+ ].flat(2);
diff --git a/modules/dwl/ags/layouts/topbar.js b/modules/dwl/ags/layouts/topbar.js
deleted file mode 100644
index eaaed6e..0000000
--- a/modules/dwl/ags/layouts/topbar.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import * as shared from './shared.js';
-import { Separator } from '../modules/misc.js';
-import { PanelIndicator as NotificationIndicator } from './widgets/notifications.js';
-import { PanelButton as ColorPicker } from '../modules/colorpicker.js';
-import { PanelButton as DashBoard } from './widgets/dashboard.js';
-import { PanelButton as ScreenRecord } from '../modules/screenrecord.js';
-import { PanelButton as QuickSettings } from './widgets/quicksettings.js';
-
-const Bar = monitor => shared.Bar({
- anchor: 'top left right',
- monitor,
- start: [
- // Workspaces(),
- Separator({ valign: 'center' }),
- // Client(),
- ],
- center: [
- DashBoard(),
- ],
- end: [
- NotificationIndicator({ direction: 'right', hexpand: true, halign: 'start' }),
- ags.Widget.Box({ hexpand: true }),
- ScreenRecord(),
- ColorPicker(),
- Separator({ valign: 'center' }),
- QuickSettings(),
- Separator({ valign: 'center' }),
- ],
-});
-
-export default monitors => ([
- ...monitors.map(mon => [
- Bar(mon),
- shared.Notifications(mon, 'slide_down', 'top'),
- shared.OSDIndicator(mon),
- ]),
- shared.Quicksettings({ position: 'top right' }),
- shared.Dashboard({ position: 'top' }),
-]).flat(2);
diff --git a/modules/dwl/ags/modules/battery.js b/modules/dwl/ags/modules/battery.js
index 2ce1ccb..7ba38c1 100644
--- a/modules/dwl/ags/modules/battery.js
+++ b/modules/dwl/ags/modules/battery.js
@@ -1,73 +1,117 @@
const { Battery } = ags.Service;
const { Label, Icon, Stack, ProgressBar, Overlay, Box } = ags.Widget;
-const icons = charging => ([
- ...Array.from({ length: 9 }, (_, i) => i * 10).map(i => ([
- `${i}`, Icon({
- className: `${i} ${charging ? 'charging' : 'discharging'}`,
- icon: `battery-level-${i}${charging ? '-charging' : ''}-symbolic`,
- }),
- ])),
- ['100', Icon({
- className: `100 ${charging ? 'charging' : 'discharging'}`,
- icon: `battery-level-100${charging ? '-charged' : ''}-symbolic`,
- })],
-]);
+const icons = (charging) =>
+ Array.from({ length: 10 }, (_, i) => i * 10).map((i) => [
+ `${i}`,
+ Icon({
+ className: `${i} ${charging ? "charging" : "discharging"}`,
+ icon: `battery-level-${i}${charging ? "-charging" : ""}-symbolic`,
+ }),
+ ]);
-const Indicators = charging => Stack({
- items: icons(charging),
- connections: [[Battery, stack => {
- stack.shown = `${Math.floor(Battery.percent / 10) * 10}`;
- }]],
-});
+const Indicators = (charging) =>
+ Stack({
+ items: icons(charging),
+ connections: [
+ [
+ Battery,
+ (stack) => {
+ stack.shown = `${Math.floor(Battery.percent / 10) * 10}`;
+ },
+ ],
+ ],
+ });
-export const Indicator = ({
- charging = Indicators(true),
- discharging = Indicators(false),
- ...props
-} = {}) => Stack({
- ...props,
- className: 'battery',
- items: [
- ['true', charging],
- ['false', discharging],
- ],
- connections: [[Battery, stack => {
- const { charging, charged } = Battery;
- stack.shown = `${charging || charged}`;
- stack.toggleClassName('charging', Battery.charging);
- stack.toggleClassName('charged', Battery.charged);
- stack.toggleClassName('low', Battery.percent < 30);
- }]],
-});
+const BatteryIconIndicator = ({
+ charging = Indicators(true),
+ discharging = Indicators(false),
+ ...props
+} = {}) =>
+ Stack({
+ ...props,
+ className: "battery",
+ items: [
+ ["true", charging],
+ ["false", discharging],
+ ],
+ connections: [
+ [
+ Battery,
+ (stack) => {
+ const { charging, charged } = Battery;
+ log("battery:", charging, charged, Battery.available);
+ stack.shown = `${charging || charged}`;
+ stack.toggleClassName("charging", Battery.charging);
+ stack.toggleClassName("charged", Battery.charged);
+ stack.toggleClassName("low", Battery.percent < 30);
+ },
+ ],
+ ],
+ });
-export const LevelLabel = props => Label({
- ...props,
- connections: [[Battery, label => label.label = `${Battery.percent}%`]],
-});
+const LevelLabel = (props) =>
+ Label({
+ ...props,
+ connections: [[Battery, (label) => (label.label = `${Battery.percent}%`)]],
+ });
-export const BatteryProgress = props => Box({
- ...props,
- className: 'battery-progress',
- connections: [[Battery, w => {
- w.toggleClassName('half', Battery.percent < 46);
- w.toggleClassName('charging', Battery.charging);
- w.toggleClassName('charged', Battery.charged);
- w.toggleClassName('low', Battery.percent < 30);
- }]],
- children: [Overlay({
- child: ProgressBar({
- hexpand: true,
- connections: [[Battery, progress => {
- progress.fraction = Battery.percent / 100;
- }]],
- }),
- overlays: [Label({
- connections: [[Battery, l => {
- l.label = Battery.charging || Battery.charged
- ? ''
- : `${Battery.percent}%`;
- }]],
- })],
- })],
-});
+export const BatteryIndicator = () =>
+ Box({
+ children: [BatteryIconIndicator(), LevelLabel()],
+ connections: [
+ [
+ Battery,
+ (box) => {
+ box.visible = Battery.available;
+ },
+ ],
+ ],
+ });
+
+// export const BatteryProgress = (props) =>
+// Box({
+// ...props,
+// className: "battery-progress",
+// connections: [
+// [
+// Battery,
+// (w) => {
+// w.toggleClassName("half", Battery.percent < 46);
+// w.toggleClassName("charging", Battery.charging);
+// w.toggleClassName("charged", Battery.charged);
+// w.toggleClassName("low", Battery.percent < 30);
+// },
+// ],
+// ],
+// children: [
+// Overlay({
+// child: ProgressBar({
+// hexpand: true,
+// connections: [
+// [
+// Battery,
+// (progress) => {
+// progress.fraction = Battery.percent / 100;
+// },
+// ],
+// ],
+// }),
+// overlays: [
+// Label({
+// connections: [
+// [
+// Battery,
+// (l) => {
+// l.label =
+// Battery.charging || Battery.charged
+// ? ""
+// : `${Battery.percent}%`;
+// },
+// ],
+// ],
+// }),
+// ],
+// }),
+// ],
+// });
diff --git a/modules/dwl/ags/modules/clock.js b/modules/dwl/ags/modules/clock.js
index 061373e..7dfbd5c 100644
--- a/modules/dwl/ags/modules/clock.js
+++ b/modules/dwl/ags/modules/clock.js
@@ -2,13 +2,16 @@ const { Label } = ags.Widget;
const { DateTime } = imports.gi.GLib;
export const Clock = ({
- format = '%a %d %b %H:%M ',
- interval = 1000,
- ...props
-} = {}) => Label({
- className: 'clock',
- ...props,
- connections: [[interval, label =>
- label.label = DateTime.new_now_local().format(format),
- ]],
-});
+ format = "%a %d %b %H:%M ",
+ interval = 1000,
+ ...props
+} = {}) =>
+ Label({
+ ...props,
+ connections: [
+ [
+ interval,
+ (label) => (label.label = DateTime.new_now_local().format(format)),
+ ],
+ ],
+ });
diff --git a/modules/dwl/ags/modules/applauncher.js b/modules/dwl/ags/old/modules/applauncher.js
similarity index 100%
rename from modules/dwl/ags/modules/applauncher.js
rename to modules/dwl/ags/old/modules/applauncher.js
diff --git a/modules/dwl/ags/modules/asusctl.js b/modules/dwl/ags/old/modules/asusctl.js
similarity index 100%
rename from modules/dwl/ags/modules/asusctl.js
rename to modules/dwl/ags/old/modules/asusctl.js
diff --git a/modules/dwl/ags/modules/audio.js b/modules/dwl/ags/old/modules/audio.js
similarity index 100%
rename from modules/dwl/ags/modules/audio.js
rename to modules/dwl/ags/old/modules/audio.js
diff --git a/modules/dwl/ags/modules/bluetooth.js b/modules/dwl/ags/old/modules/bluetooth.js
similarity index 100%
rename from modules/dwl/ags/modules/bluetooth.js
rename to modules/dwl/ags/old/modules/bluetooth.js
diff --git a/modules/dwl/ags/modules/brightness.js b/modules/dwl/ags/old/modules/brightness.js
similarity index 100%
rename from modules/dwl/ags/modules/brightness.js
rename to modules/dwl/ags/old/modules/brightness.js
diff --git a/modules/dwl/ags/modules/colorpicker.js b/modules/dwl/ags/old/modules/colorpicker.js
similarity index 100%
rename from modules/dwl/ags/modules/colorpicker.js
rename to modules/dwl/ags/old/modules/colorpicker.js
diff --git a/modules/dwl/ags/modules/corner.js b/modules/dwl/ags/old/modules/corner.js
similarity index 100%
rename from modules/dwl/ags/modules/corner.js
rename to modules/dwl/ags/old/modules/corner.js
diff --git a/modules/dwl/ags/modules/misc.js b/modules/dwl/ags/old/modules/misc.js
similarity index 100%
rename from modules/dwl/ags/modules/misc.js
rename to modules/dwl/ags/old/modules/misc.js
diff --git a/modules/dwl/ags/modules/mpris.js b/modules/dwl/ags/old/modules/mpris.js
similarity index 100%
rename from modules/dwl/ags/modules/mpris.js
rename to modules/dwl/ags/old/modules/mpris.js
diff --git a/modules/dwl/ags/modules/network.js b/modules/dwl/ags/old/modules/network.js
similarity index 100%
rename from modules/dwl/ags/modules/network.js
rename to modules/dwl/ags/old/modules/network.js
diff --git a/modules/dwl/ags/modules/notifications.js b/modules/dwl/ags/old/modules/notifications.js
similarity index 100%
rename from modules/dwl/ags/modules/notifications.js
rename to modules/dwl/ags/old/modules/notifications.js
diff --git a/modules/dwl/ags/modules/onscreenindicator.js b/modules/dwl/ags/old/modules/onscreenindicator.js
similarity index 100%
rename from modules/dwl/ags/modules/onscreenindicator.js
rename to modules/dwl/ags/old/modules/onscreenindicator.js
diff --git a/modules/dwl/ags/modules/screenrecord.js b/modules/dwl/ags/old/modules/screenrecord.js
similarity index 100%
rename from modules/dwl/ags/modules/screenrecord.js
rename to modules/dwl/ags/old/modules/screenrecord.js
diff --git a/modules/dwl/ags/modules/wallpaper.js b/modules/dwl/ags/old/modules/wallpaper.js
similarity index 100%
rename from modules/dwl/ags/modules/wallpaper.js
rename to modules/dwl/ags/old/modules/wallpaper.js
diff --git a/modules/dwl/ags/old/scss/common.scss b/modules/dwl/ags/old/scss/common.scss
new file mode 100644
index 0000000..d7eb917
--- /dev/null
+++ b/modules/dwl/ags/old/scss/common.scss
@@ -0,0 +1,315 @@
+window {
+ background-color: transparent;
+}
+//
+// @mixin common{
+// all: unset;
+//
+// * {
+// font-size: $font_size;
+// font-family: $font, sans-serif;
+// }
+// }
+//
+// @mixin widget{
+// @include common;
+// border-radius: $radii;
+// color: $fg_color;
+// background-color: $widget_bg;
+// border: $border;
+// }
+//
+// @mixin button_focus() {
+// box-shadow: inset 0 0 0 $border_width $accent;
+// background-color: $hover;
+// color: $hover_fg;
+// }
+//
+// @mixin button_hover() {
+// box-shadow: inset 0 0 0 $border_width $border_color;
+// background-color: $hover;
+// color: $hover_fg;
+// }
+//
+// @mixin button_active() {
+// box-shadow: inset 0 0 0 $border_width $border_color;
+// background-image: $active_gradient;
+// background-color: $accent;
+// color: $accent_fg;
+// }
+//
+// @mixin button_disabled() {
+// box-shadow: none;
+// background-color: transparent;
+// color: transparentize($fg_color, 0.7);
+// }
+//
+// @mixin button($flat: false, $reactive: true, $radii: $radii, $focusable: true){
+// @include common;
+// transition: $transition;
+// border-radius: $radii;
+// color: $fg_color;
+//
+// @if $flat{
+// background-color: transparent;
+// background-image: none;
+// box-shadow: none;
+// } @else{
+// background-color: $widget_bg;
+// box-shadow: inset 0 0 0 $border_width $border_color;
+// }
+//
+// @if $reactive{
+// @if $focusable {
+// &:focus{
+// @include button_focus;
+// }
+// }
+//
+// &:hover{
+// @include button_hover;
+// }
+//
+// &:active, &.on, &.active, &:checked {
+// @include button_active;
+//
+// &:hover {
+// box-shadow: inset 0 0 0 $border_width $border_color,
+// inset 0 0 0 99px $hover;
+// }
+// }
+// }
+//
+// &:disabled {
+// @include button_disabled;
+// }
+// }
+//
+// @mixin accs_button($flat: false, $reactive: true){
+// @include button($flat: true, $reactive: false, $focusable: false);
+// color: $fg_color;
+//
+// > * {
+// border-radius: $radii;
+// transition: $transition;
+//
+// @if $flat{
+// background-color: transparent;
+// box-shadow: none;
+// } @else{
+// background-color: $widget_bg;
+// box-shadow: inset 0 0 0 $border_width $border_color;
+// }
+// }
+//
+//
+// @if $reactive{
+// &:focus > *, &.focused > * {
+// @include button_focus;
+// }
+//
+// &:hover > * {
+// @include button_hover;
+// }
+//
+// &:active, &.active, &.on, &:checked {
+// > * {
+// @include button_active;
+// }
+//
+// &:hover > * {
+// box-shadow: inset 0 0 0 $border_width $border_color,
+// inset 0 0 0 99px $hover;
+// }
+// }
+// }
+// }
+//
+// @mixin floating_widget {
+// @include common;
+//
+// @if $drop_shadow {
+// box-shadow: 0 0 6px 0 $shadow;
+// }
+// margin: max($spacing, 8px);
+// border: $border_width solid $popover_border_color;
+// border-radius: $popover_radius;
+// background-color: $bg_color;
+// color: $fg_color;
+// padding: $popover_padding;
+// }
+//
+// @mixin slider($width: .7em, $slider_width: .5em, $gradient: $active_gradient, $slider: true, $focusable: true, $radii: $radii){
+// @include common;
+// * { all:unset; }
+//
+// trough{
+// transition: $transition;
+// border-radius: $radii;
+// border: $border;
+// background-color: $widget_bg;
+// min-height: $width;
+// min-width: $width;
+//
+// highlight, progress{
+// border-radius: max($radii - $border_width, 0);
+// background-image: $gradient;
+// min-height: $width;
+// min-width: $width;
+// }
+// }
+//
+// slider {
+// box-shadow: none;
+// background-color: transparent;
+// border: $border_width solid transparent;
+// transition: $transition;
+// border-radius: $radii;
+// min-height: $width;
+// min-width: $width;
+// margin: -$slider_width;
+// }
+//
+// &:hover {
+// trough {
+// background-color: $hover;
+// }
+//
+// slider {
+// @if $slider{
+// background-color: $fg_color;
+// border-color: $border-color;
+//
+// @if $drop_shadow {
+// box-shadow: 0 0 3px 0 $shadow;
+// }
+// }
+// }
+// }
+//
+// &:disabled {
+// highlight, progress{
+// background-color: transparentize($fg_color, 0.4);
+// background-image: none;
+// }
+//
+// slider {
+// @if $slider {
+// background-color: transparentize($fg_color, 0.5);
+// }
+// }
+// }
+//
+// @if $focusable {
+// trough:focus{
+// background-color: $hover;
+// box-shadow: inset 0 0 0 $border_width $accent;
+//
+// slider {
+// @if $slider {
+// background-color: $fg_color;
+// box-shadow: inset 0 0 0 $border_width $accent;
+// }
+// }
+// }
+//
+// }
+// }
+//
+// @mixin shader($width: 3em){
+// @include common;
+//
+// label {
+// color: $shader_fg;
+// text-shadow: $text_shadow;
+// }
+//
+// @if $theme == 'dark' {
+// box-shadow: inset 0 0 $width $width/3 transparentize($bg_color, 0.3);
+// }
+//
+// @if $theme == 'light' {
+// background-color: transparentize($bg_color, 0.8);
+// }
+// }
+//
+// @mixin text_border{
+// text-shadow:
+// -1 * $border_width -1 * $border_width 0 $border_color,
+// $border_width $border_width 0 $border_color,
+// -1 * $border_width $border_width 0 $border_color,
+// $border_width -1 * $border_width 0 $border_color;
+// }
+//
+// @mixin scrollbar{
+// scrollbar, scrollbar * {
+// all: unset;
+// }
+//
+// scrollbar.vertical{
+// slider{
+// background: $widget_bg;
+// border-radius: $radii;
+// min-width: .6em;
+// min-height: 2em;
+// transition: $transition;
+//
+// &:hover {
+// background-color: transparentize($fg_color, 0.6);
+// min-width: .8em;
+// }
+// }
+// }
+// }
+//
+// @mixin switch{
+// @include button;
+//
+// slider {
+// background-color: $fg_color;
+// border-radius: $radii;
+// min-width: 24px;
+// min-height: 24px;
+// }
+//
+// image { color: transparent; }
+// }
+//
+// tooltip {
+// @include common;
+// background-color: transparent;
+// border: none;
+//
+// > * > *{
+// background-color: $bg_color;
+// border-radius: $radii;
+// border: $border_width solid $popover_border_color;
+// color: $fg_color;
+// padding: 8px;
+// margin: 4px;
+// box-shadow: 0 0 3px 0 $shadow;
+// }
+// }
+//
+// window.popup {
+// > * {
+// border: none;
+// box-shadow: none;
+// }
+//
+// menu {
+// border-radius: $popover_radius;
+// background-color: $bg_color;
+// padding: $spacing;
+// border: $border;
+//
+// menuitem {
+// @include button;
+// padding: $spacing/2;
+// margin: $spacing/2 0;
+// > * { margin-left: -30px; }
+// &:first-child { margin-top: 0; }
+// &:last-child { margin-bottom: 0; }
+// }
+// }
+// }
diff --git a/modules/dwl/ags/old/scss/main.scss b/modules/dwl/ags/old/scss/main.scss
new file mode 100644
index 0000000..b1740a6
--- /dev/null
+++ b/modules/dwl/ags/old/scss/main.scss
@@ -0,0 +1,14 @@
+// @import './generated';
+@import './common';
+// @import './widgets/notifications';
+// @import './widgets/media';
+// @import './widgets/datemenu';
+// @import './widgets/applauncher';
+// @import './widgets/quicksettings';
+// @import './widgets/powermenu';
+// @import './widgets/overview';
+// @import './widgets/desktop';
+// @import './widgets/dashboard';
+// @import './widgets/bar';
+// @import './widgets/settings';
+// @import './additional';
diff --git a/modules/dwl/ags/scss/widgets/applauncher.scss b/modules/dwl/ags/old/scss/widgets/applauncher.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/applauncher.scss
rename to modules/dwl/ags/old/scss/widgets/applauncher.scss
diff --git a/modules/dwl/ags/scss/widgets/bar.scss b/modules/dwl/ags/old/scss/widgets/bar.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/bar.scss
rename to modules/dwl/ags/old/scss/widgets/bar.scss
diff --git a/modules/dwl/ags/scss/widgets/dashboard.scss b/modules/dwl/ags/old/scss/widgets/dashboard.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/dashboard.scss
rename to modules/dwl/ags/old/scss/widgets/dashboard.scss
diff --git a/modules/dwl/ags/scss/widgets/datemenu.scss b/modules/dwl/ags/old/scss/widgets/datemenu.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/datemenu.scss
rename to modules/dwl/ags/old/scss/widgets/datemenu.scss
diff --git a/modules/dwl/ags/scss/widgets/desktop.scss b/modules/dwl/ags/old/scss/widgets/desktop.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/desktop.scss
rename to modules/dwl/ags/old/scss/widgets/desktop.scss
diff --git a/modules/dwl/ags/scss/widgets/media.scss b/modules/dwl/ags/old/scss/widgets/media.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/media.scss
rename to modules/dwl/ags/old/scss/widgets/media.scss
diff --git a/modules/dwl/ags/scss/widgets/notifications.scss b/modules/dwl/ags/old/scss/widgets/notifications.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/notifications.scss
rename to modules/dwl/ags/old/scss/widgets/notifications.scss
diff --git a/modules/dwl/ags/scss/widgets/overview.scss b/modules/dwl/ags/old/scss/widgets/overview.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/overview.scss
rename to modules/dwl/ags/old/scss/widgets/overview.scss
diff --git a/modules/dwl/ags/scss/widgets/powermenu.scss b/modules/dwl/ags/old/scss/widgets/powermenu.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/powermenu.scss
rename to modules/dwl/ags/old/scss/widgets/powermenu.scss
diff --git a/modules/dwl/ags/scss/widgets/quicksettings.scss b/modules/dwl/ags/old/scss/widgets/quicksettings.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/quicksettings.scss
rename to modules/dwl/ags/old/scss/widgets/quicksettings.scss
diff --git a/modules/dwl/ags/scss/widgets/settings.scss b/modules/dwl/ags/old/scss/widgets/settings.scss
similarity index 100%
rename from modules/dwl/ags/scss/widgets/settings.scss
rename to modules/dwl/ags/old/scss/widgets/settings.scss
diff --git a/modules/dwl/ags/layouts/shared.js b/modules/dwl/ags/old/shared.js
similarity index 100%
rename from modules/dwl/ags/layouts/shared.js
rename to modules/dwl/ags/old/shared.js
diff --git a/modules/dwl/ags/theme/dialog.js b/modules/dwl/ags/old/theme/dialog.js
similarity index 100%
rename from modules/dwl/ags/theme/dialog.js
rename to modules/dwl/ags/old/theme/dialog.js
diff --git a/modules/dwl/ags/theme/scss.js b/modules/dwl/ags/old/theme/scss.js
similarity index 92%
rename from modules/dwl/ags/theme/scss.js
rename to modules/dwl/ags/old/theme/scss.js
index 5187c77..b49db91 100644
--- a/modules/dwl/ags/theme/scss.js
+++ b/modules/dwl/ags/old/theme/scss.js
@@ -58,9 +58,6 @@ export async function setupScss(theme) {
try {
await writeFile(generated(scss(theme)), `${path}/scss/generated.scss`);
await writeFile(generated(theme.additional_scss || ''), `${path}/scss/additional.scss`);
- await execAsync(['sassc', `${path}/scss/main.scss`, `${path}/style.css`]);
- ags.App.resetCss();
- ags.App.applyCss(`${path}/style.css`);
} catch (error) {
logError(error);
}
diff --git a/modules/dwl/ags/theme/theme.js b/modules/dwl/ags/old/theme/theme.js
similarity index 93%
rename from modules/dwl/ags/theme/theme.js
rename to modules/dwl/ags/old/theme/theme.js
index 5be9296..c9e6ef3 100644
--- a/modules/dwl/ags/theme/theme.js
+++ b/modules/dwl/ags/old/theme/theme.js
@@ -16,7 +16,6 @@ class ThemeService extends Service {
constructor() {
super();
- exec('swww init');
this.setup();
}
@@ -39,7 +38,6 @@ class ThemeService extends Service {
};
setupScss(theme);
this.setupOther();
- this.setupWallpaper();
}
reset() {
@@ -59,15 +57,6 @@ class ThemeService extends Service {
// execAsync(`cp ${wezterm}/charm${darkmode ? '' : '-light'}.lua ${wezterm}/theme.lua`).catch(print);
}
- setupWallpaper() {
- execAsync([
- 'swww', 'img',
- '--transition-type', 'grow',
- // '--transition-pos', exec('hyprctl cursorpos').replace(' ', ''),
- this.getSetting('wallpaper'),
- ]).catch(print);
- }
-
get settings() {
if (this._settings)
return this._settings;
diff --git a/modules/dwl/ags/theme/themes.js b/modules/dwl/ags/old/theme/themes.js
similarity index 100%
rename from modules/dwl/ags/theme/themes.js
rename to modules/dwl/ags/old/theme/themes.js
diff --git a/modules/dwl/ags/layouts/widgets/dashboard.js b/modules/dwl/ags/old/widgets/dashboard.js
similarity index 100%
rename from modules/dwl/ags/layouts/widgets/dashboard.js
rename to modules/dwl/ags/old/widgets/dashboard.js
diff --git a/modules/dwl/ags/layouts/widgets/datemenu.js b/modules/dwl/ags/old/widgets/datemenu.js
similarity index 100%
rename from modules/dwl/ags/layouts/widgets/datemenu.js
rename to modules/dwl/ags/old/widgets/datemenu.js
diff --git a/modules/dwl/ags/layouts/widgets/media.js b/modules/dwl/ags/old/widgets/media.js
similarity index 100%
rename from modules/dwl/ags/layouts/widgets/media.js
rename to modules/dwl/ags/old/widgets/media.js
diff --git a/modules/dwl/ags/layouts/widgets/notifications.js b/modules/dwl/ags/old/widgets/notifications.js
similarity index 100%
rename from modules/dwl/ags/layouts/widgets/notifications.js
rename to modules/dwl/ags/old/widgets/notifications.js
diff --git a/modules/dwl/ags/layouts/widgets/popuplayout.js b/modules/dwl/ags/old/widgets/popuplayout.js
similarity index 100%
rename from modules/dwl/ags/layouts/widgets/popuplayout.js
rename to modules/dwl/ags/old/widgets/popuplayout.js
diff --git a/modules/dwl/ags/layouts/widgets/powermenu.js b/modules/dwl/ags/old/widgets/powermenu.js
similarity index 100%
rename from modules/dwl/ags/layouts/widgets/powermenu.js
rename to modules/dwl/ags/old/widgets/powermenu.js
diff --git a/modules/dwl/ags/layouts/widgets/quicksettings.js b/modules/dwl/ags/old/widgets/quicksettings.js
similarity index 100%
rename from modules/dwl/ags/layouts/widgets/quicksettings.js
rename to modules/dwl/ags/old/widgets/quicksettings.js
diff --git a/modules/dwl/ags/package.json b/modules/dwl/ags/package.json
deleted file mode 100644
index 3a335af..0000000
--- a/modules/dwl/ags/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "ags-dotfiles",
- "version": "1.0.0",
- "description": "My config files for AGS",
- "main": "config.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "lint": "eslint . --fix",
- "stylelint": "stylelint"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/Aylur/dotfiles.git"
- },
- "author": "Aylur",
- "license": "GPL-3.0-or-later",
- "bugs": {
- "url": "https://github.com/Aylur/dotfiles/issues"
- },
- "homepage": "https://github.com/Aylur/dotfiles#readme",
- "devDependencies": {
- "eslint": "^8.44.0",
- "stylelint-config-standard-scss": "^10.0.0"
- }
-}
diff --git a/modules/dwl/ags/scss/common.scss b/modules/dwl/ags/scss/common.scss
deleted file mode 100644
index de4c965..0000000
--- a/modules/dwl/ags/scss/common.scss
+++ /dev/null
@@ -1,315 +0,0 @@
-window {
- background-color: transparent;
-}
-
-@mixin common{
- all: unset;
-
- * {
- font-size: $font_size;
- font-family: $font, sans-serif;
- }
-}
-
-@mixin widget{
- @include common;
- border-radius: $radii;
- color: $fg_color;
- background-color: $widget_bg;
- border: $border;
-}
-
-@mixin button_focus() {
- box-shadow: inset 0 0 0 $border_width $accent;
- background-color: $hover;
- color: $hover_fg;
-}
-
-@mixin button_hover() {
- box-shadow: inset 0 0 0 $border_width $border_color;
- background-color: $hover;
- color: $hover_fg;
-}
-
-@mixin button_active() {
- box-shadow: inset 0 0 0 $border_width $border_color;
- background-image: $active_gradient;
- background-color: $accent;
- color: $accent_fg;
-}
-
-@mixin button_disabled() {
- box-shadow: none;
- background-color: transparent;
- color: transparentize($fg_color, 0.7);
-}
-
-@mixin button($flat: false, $reactive: true, $radii: $radii, $focusable: true){
- @include common;
- transition: $transition;
- border-radius: $radii;
- color: $fg_color;
-
- @if $flat{
- background-color: transparent;
- background-image: none;
- box-shadow: none;
- } @else{
- background-color: $widget_bg;
- box-shadow: inset 0 0 0 $border_width $border_color;
- }
-
- @if $reactive{
- @if $focusable {
- &:focus{
- @include button_focus;
- }
- }
-
- &:hover{
- @include button_hover;
- }
-
- &:active, &.on, &.active, &:checked {
- @include button_active;
-
- &:hover {
- box-shadow: inset 0 0 0 $border_width $border_color,
- inset 0 0 0 99px $hover;
- }
- }
- }
-
- &:disabled {
- @include button_disabled;
- }
-}
-
-@mixin accs_button($flat: false, $reactive: true){
- @include button($flat: true, $reactive: false, $focusable: false);
- color: $fg_color;
-
- > * {
- border-radius: $radii;
- transition: $transition;
-
- @if $flat{
- background-color: transparent;
- box-shadow: none;
- } @else{
- background-color: $widget_bg;
- box-shadow: inset 0 0 0 $border_width $border_color;
- }
- }
-
-
- @if $reactive{
- &:focus > *, &.focused > * {
- @include button_focus;
- }
-
- &:hover > * {
- @include button_hover;
- }
-
- &:active, &.active, &.on, &:checked {
- > * {
- @include button_active;
- }
-
- &:hover > * {
- box-shadow: inset 0 0 0 $border_width $border_color,
- inset 0 0 0 99px $hover;
- }
- }
- }
-}
-
-@mixin floating_widget {
- @include common;
-
- @if $drop_shadow {
- box-shadow: 0 0 6px 0 $shadow;
- }
- margin: max($spacing, 8px);
- border: $border_width solid $popover_border_color;
- border-radius: $popover_radius;
- background-color: $bg_color;
- color: $fg_color;
- padding: $popover_padding;
-}
-
-@mixin slider($width: .7em, $slider_width: .5em, $gradient: $active_gradient, $slider: true, $focusable: true, $radii: $radii){
- @include common;
- * { all:unset; }
-
- trough{
- transition: $transition;
- border-radius: $radii;
- border: $border;
- background-color: $widget_bg;
- min-height: $width;
- min-width: $width;
-
- highlight, progress{
- border-radius: max($radii - $border_width, 0);
- background-image: $gradient;
- min-height: $width;
- min-width: $width;
- }
- }
-
- slider {
- box-shadow: none;
- background-color: transparent;
- border: $border_width solid transparent;
- transition: $transition;
- border-radius: $radii;
- min-height: $width;
- min-width: $width;
- margin: -$slider_width;
- }
-
- &:hover {
- trough {
- background-color: $hover;
- }
-
- slider {
- @if $slider{
- background-color: $fg_color;
- border-color: $border-color;
-
- @if $drop_shadow {
- box-shadow: 0 0 3px 0 $shadow;
- }
- }
- }
- }
-
- &:disabled {
- highlight, progress{
- background-color: transparentize($fg_color, 0.4);
- background-image: none;
- }
-
- slider {
- @if $slider {
- background-color: transparentize($fg_color, 0.5);
- }
- }
- }
-
- @if $focusable {
- trough:focus{
- background-color: $hover;
- box-shadow: inset 0 0 0 $border_width $accent;
-
- slider {
- @if $slider {
- background-color: $fg_color;
- box-shadow: inset 0 0 0 $border_width $accent;
- }
- }
- }
-
- }
-}
-
-@mixin shader($width: 3em){
- @include common;
-
- label {
- color: $shader_fg;
- text-shadow: $text_shadow;
- }
-
- @if $theme == 'dark' {
- box-shadow: inset 0 0 $width $width/3 transparentize($bg_color, 0.3);
- }
-
- @if $theme == 'light' {
- background-color: transparentize($bg_color, 0.8);
- }
-}
-
-@mixin text_border{
- text-shadow:
- -1 * $border_width -1 * $border_width 0 $border_color,
- $border_width $border_width 0 $border_color,
- -1 * $border_width $border_width 0 $border_color,
- $border_width -1 * $border_width 0 $border_color;
-}
-
-@mixin scrollbar{
- scrollbar, scrollbar * {
- all: unset;
- }
-
- scrollbar.vertical{
- slider{
- background: $widget_bg;
- border-radius: $radii;
- min-width: .6em;
- min-height: 2em;
- transition: $transition;
-
- &:hover {
- background-color: transparentize($fg_color, 0.6);
- min-width: .8em;
- }
- }
- }
-}
-
-@mixin switch{
- @include button;
-
- slider {
- background-color: $fg_color;
- border-radius: $radii;
- min-width: 24px;
- min-height: 24px;
- }
-
- image { color: transparent; }
-}
-
-tooltip {
- @include common;
- background-color: transparent;
- border: none;
-
- > * > *{
- background-color: $bg_color;
- border-radius: $radii;
- border: $border_width solid $popover_border_color;
- color: $fg_color;
- padding: 8px;
- margin: 4px;
- box-shadow: 0 0 3px 0 $shadow;
- }
-}
-
-window.popup {
- > * {
- border: none;
- box-shadow: none;
- }
-
- menu {
- border-radius: $popover_radius;
- background-color: $bg_color;
- padding: $spacing;
- border: $border;
-
- menuitem {
- @include button;
- padding: $spacing/2;
- margin: $spacing/2 0;
- > * { margin-left: -30px; }
- &:first-child { margin-top: 0; }
- &:last-child { margin-bottom: 0; }
- }
- }
-}
diff --git a/modules/dwl/ags/scss/main.scss b/modules/dwl/ags/scss/main.scss
deleted file mode 100644
index 56c5e6c..0000000
--- a/modules/dwl/ags/scss/main.scss
+++ /dev/null
@@ -1,14 +0,0 @@
-@import './generated';
-@import './common';
-@import './widgets/notifications';
-@import './widgets/media';
-@import './widgets/datemenu';
-@import './widgets/applauncher';
-@import './widgets/quicksettings';
-@import './widgets/powermenu';
-@import './widgets/overview';
-@import './widgets/desktop';
-@import './widgets/dashboard';
-@import './widgets/bar';
-@import './widgets/settings';
-@import './additional';
diff --git a/modules/dwl/ags/style.css b/modules/dwl/ags/style.css
new file mode 100644
index 0000000..dabdfe4
--- /dev/null
+++ b/modules/dwl/ags/style.css
@@ -0,0 +1,31 @@
+* {
+ all: unset;
+ font-family: monospace;
+ padding: 0;
+ margin: 0;
+}
+
+window {
+ background-color: rgba(0, 0, 0, 0.6);
+}
+
+.module {
+ padding: 0 10px;
+}
+
+.bold {
+ font-weight: bold;
+}
+
+.accent {
+ background-color: #94e2d5;
+ color: #1e1e2e;
+}
+
+
+.battery.low {
+ color: red;
+}
+.battery.charged, .battery.charging {
+ color: green;
+}
diff --git a/modules/dwl/default.nix b/modules/dwl/default.nix
index ed11645..f4eb7ae 100644
--- a/modules/dwl/default.nix
+++ b/modules/dwl/default.nix
@@ -31,6 +31,8 @@
extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
};
+ services.upower.enable = true;
+
# i18n.inputMethod.enabled = "ibus";
# i18n.inputMethod.ibus.engines = with pkgs.ibus-engines; [mozc];
}
diff --git a/modules/dwl/home.nix b/modules/dwl/home.nix
index c2c0cb8..8ba38a9 100644
--- a/modules/dwl/home.nix
+++ b/modules/dwl/home.nix
@@ -12,6 +12,7 @@ in {
sassc
brightnessctl
pavucontrol
+ wbg
wallpaper
];
diff --git a/modules/home/default.nix b/modules/home/default.nix
index 80f2236..e920279 100644
--- a/modules/home/default.nix
+++ b/modules/home/default.nix
@@ -1,7 +1,6 @@
{
imports = [
./hyprland
- ./eww
./rofi
./apps
./zsh
@@ -10,7 +9,6 @@
./direnv
./fcitx5
./colors
- ./ntfy
];
home.stateVersion = "22.11";
diff --git a/modules/home/eww/bar/battery/eww.yuck b/modules/home/eww/bar/battery/eww.yuck
deleted file mode 100644
index 43dccfb..0000000
--- a/modules/home/eww/bar/battery/eww.yuck
+++ /dev/null
@@ -1,10 +0,0 @@
-(defpoll icon :interval "1s" "./bar/battery/get-battery.sh icon")
-(defpoll percent :interval "1s" "./bar/battery/get-battery.sh percent")
-
-(defwidget battery []
- (box :class "battery module floating ${percent < 18 ? "red" : ""}"
- :spacing 6
- (label :valign "center" :class "icon" :text "${icon}")
- (label :valign "center" :class "percent" :text "${percent}%"))
- )
-
diff --git a/modules/home/eww/bar/battery/get-battery.sh b/modules/home/eww/bar/battery/get-battery.sh
deleted file mode 100755
index 0b30faf..0000000
--- a/modules/home/eww/bar/battery/get-battery.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env bash
-
-bat=/sys/class/power_supply/BAT0/
-per="$(cat "$bat/capacity")"
-
-icon() {
-
- [ $(cat "$bat/status") = Charging ] && echo "" && exit
-
- if [ "$per" -gt "90" ]; then
- icon=""
- elif [ "$per" -gt "80" ]; then
- icon=""
- elif [ "$per" -gt "70" ]; then
- icon=""
- elif [ "$per" -gt "60" ]; then
- icon=""
- elif [ "$per" -gt "50" ]; then
- icon=""
- elif [ "$per" -gt "40" ]; then
- icon=""
- elif [ "$per" -gt "30" ]; then
- icon=""
- elif [ "$per" -gt "20" ]; then
- icon=""
- elif [ "$per" -gt "10" ]; then
- icon=""
- elif [ "$per" -gt "0" ]; then
- icon=""
- else
- icon=""
- fi
- echo "$icon"
-}
-
-percent() {
- echo $per
-}
-
-[ "$1" = "icon" ] && icon && exit
-[ "$1" = "percent" ] && percent
diff --git a/modules/home/eww/bar/clock.yuck b/modules/home/eww/bar/clock.yuck
deleted file mode 100644
index 192c3c1..0000000
--- a/modules/home/eww/bar/clock.yuck
+++ /dev/null
@@ -1,13 +0,0 @@
-(defpoll time :initial '{}' :interval "5s" `date +'{"date": "%a %d %b", "hour": "%H", "minute": "%M", "day": "%A"}'`)
-
-(defwidget clock []
- (box
- :class "module accent bold"
- (label
- :text "${time.hour}:${time.minute}"
- :class "hour")))
-
-(defwidget date []
- (box
- :class "module bold"
- (label :text "${time.date}")))
diff --git a/modules/home/eww/bar/eww.scss b/modules/home/eww/bar/eww.scss
deleted file mode 100644
index 84f738b..0000000
--- a/modules/home/eww/bar/eww.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-.bar {
- background-color: $base00;
- color: $base05;
-}
-
-.module {
- padding: 0 10px;
-}
-
-.module-margin {
- margin: 0 10px;
-}
-
-.bold {
- font-weight: bold;
-}
-
-.floating {
- background: $base01;
- border-radius: 10px;
- margin: 5px;
-}
-
-.round {
- border-radius: 50%;
- margin: 5px;
-}
-
-.px-2 {
- padding: 8px 6px;
-}
-
-.battery {
- .icon {
- font-size: 20px;
- }
- .percent {
- margin-left: -5px;
- font-size: 16px;
- font-weight: 500;
- }
-}
-
diff --git a/modules/home/eww/bar/eww.yuck b/modules/home/eww/bar/eww.yuck
deleted file mode 100644
index a2b5e77..0000000
--- a/modules/home/eww/bar/eww.yuck
+++ /dev/null
@@ -1,43 +0,0 @@
-(include "./bar/workspaces/eww.yuck")
-(include "./bar/layout/eww.yuck")
-(include "./bar/window/eww.yuck")
-(include "./bar/battery/eww.yuck")
-(include "./bar/language/eww.yuck")
-(include "./bar/clock.yuck")
-
-(defwidget left []
- (box
- :space-evenly false
- :halign "start"
- (workspaces)
- (layout)
- (window)))
-
-(defwidget right []
- (box
- :space-evenly false
- :halign "end"
- ;; (notification)
- (battery)
- (language)
- (date)
- (clock)
- ))
-
-(defwidget bar []
- (box
- :class "bar"
- (left)
- (right)))
-
-(defwindow bar
- :monitor 0
- :geometry (geometry
- :x "0%"
- :y "0%"
- :width "100%"
- :height "36px"
- :anchor "top center")
- :stacking "fg"
- :exclusive true
- (bar))
diff --git a/modules/home/eww/bar/language/eww.yuck b/modules/home/eww/bar/language/eww.yuck
deleted file mode 100644
index f471ff5..0000000
--- a/modules/home/eww/bar/language/eww.yuck
+++ /dev/null
@@ -1,8 +0,0 @@
-(defpoll lang :interval "1s" :initial "en" "./bar/language/language.sh")
-
-(defwidget language []
- (box :class "module floating"
- :spacing 6
- (label :valign "center" :class "icon" :text "")
- (label :valign "center" :class "percent" :text "${lang}")))
-
diff --git a/modules/home/eww/bar/language/language.sh b/modules/home/eww/bar/language/language.sh
deleted file mode 100755
index 510c8d0..0000000
--- a/modules/home/eww/bar/language/language.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env bash
-
-IMLIST_FILE="/tmp/fcitx5-imlist"
-
-# Print out identifier of current input method
-current() {
- dbus-send --session --print-reply \
- --dest=org.fcitx.Fcitx5 \
- /controller \
- org.fcitx.Fcitx.Controller1.CurrentInputMethod \
- | grep -Po '(?<=")[^"]+' \
- || echo "en"
-}
-
-# List all input methods added to Fcitx
-imlist() {
- if [ ! -f "${IMLIST_FILE}" ]; then
- dbus-send --session --print-reply --dest=org.fcitx.Fcitx5 /controller org.fcitx.Fcitx.Controller1.AvailableInputMethods \
- | awk 'BEGIN{i=0}{
- if($0~/struct {/) i=0;
- else if(i<6){gsub(/"/,"",$2); printf("%s,",$2); i++}
- else if(i==6){printf("%s\n",$2); i++}
- }' > ${IMLIST_FILE}
- # Output like this:
- # pinyin, 拼音, 拼音, fcitx-pinyin, 拼, zh_CN, true
- # rime, 中州韻, , fcitx-rime, ㄓ, zh, true
- # ......
- fi
- cat ${IMLIST_FILE}
-}
-
-# This script wait for events from `watch` and
-# update the text by printing a new line.
-#
-# Strip `Keyboard - ` part from IM name then print
-print_pretty_name() {
- name=$(imlist | grep "^$(current)," | cut -d',' -f5)
- if [[ -z "$name" ]]; then
- return
- fi
- echo "${name}"
-}
-
-react() {
- print_pretty_name
-
- # Track input method changes. Each new line read is an event fired from IM switch
- while true; do
- # When read someting from dbus-monitor
- read -r unused
- print_pretty_name
- done
-}
-
-# Watch for events from Fcitx.
-# Need --line-buffered to avoid messages being hold in buffer
-# dbus-monitor --session destination=org.freedesktop.IBus | grep --line-buffered '65505\|65509' | react
-
-# Dbus watching does not seems to work so /shrug
-print_pretty_name
diff --git a/modules/home/eww/bar/layout/eww.yuck b/modules/home/eww/bar/layout/eww.yuck
deleted file mode 100644
index 1f9cd20..0000000
--- a/modules/home/eww/bar/layout/eww.yuck
+++ /dev/null
@@ -1,7 +0,0 @@
-(deflisten layout :initial "..." "./bar/layout/get-layout.sh")
-
-(defwidget layout []
- (box
- ;:class "round module-margin accent px-2"
- :class "secondary-txt module"
- (label :text "${layout}")))
diff --git a/modules/home/eww/bar/layout/get-layout.sh b/modules/home/eww/bar/layout/get-layout.sh
deleted file mode 100755
index ed80fd9..0000000
--- a/modules/home/eww/bar/layout/get-layout.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-layout() {
- WORKSPACE=$(hyprctl monitors -j | jq '.[0].activeWorkspace.id')
- IS_FULLSCREEN=$(hyprctl workspaces -j | jq ".[] | select(.id == $WORKSPACE).hasfullscreen")
- [ $IS_FULLSCREEN = "true" ] \
- && echo "[$(hyprctl workspaces -j | jq ".[] | select(.id == $WORKSPACE).windows")]" \
- || echo "[]="
-}
-
-
-layout
-socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | while read -r line; do
- layout
-done
diff --git a/modules/home/eww/bar/window/eww.yuck b/modules/home/eww/bar/window/eww.yuck
deleted file mode 100644
index debcc4e..0000000
--- a/modules/home/eww/bar/window/eww.yuck
+++ /dev/null
@@ -1,6 +0,0 @@
-(deflisten title :initial "" "./bar/window/get-window-title.sh")
-
-(defwidget window []
- (box
- :class {(title != "" && title != 'null') ? "floating module" : ""}
- (label :text {title != 'null' ? title : ""})))
diff --git a/modules/home/eww/bar/window/get-window-title.sh b/modules/home/eww/bar/window/get-window-title.sh
deleted file mode 100755
index e035309..0000000
--- a/modules/home/eww/bar/window/get-window-title.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-MAXCHAR=40
-
-hyprctl activewindow -j | jq --raw-output .title | cut -c -$MAXCHAR
-socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | grep --line-buffered '^activewindow>>' | stdbuf -o0 awk -F '>>|,' '{printf "%.40s\n", $3}'
-
diff --git a/modules/home/eww/bar/workspaces/eww.scss b/modules/home/eww/bar/workspaces/eww.scss
deleted file mode 100644
index 602c8d0..0000000
--- a/modules/home/eww/bar/workspaces/eww.scss
+++ /dev/null
@@ -1 +0,0 @@
-//@include "colors";
diff --git a/modules/home/eww/bar/workspaces/eww.yuck b/modules/home/eww/bar/workspaces/eww.yuck
deleted file mode 100644
index f435073..0000000
--- a/modules/home/eww/bar/workspaces/eww.yuck
+++ /dev/null
@@ -1,17 +0,0 @@
-(defvar ws-icons '["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]')
-
-(deflisten curr :initial "1" "./bar/workspaces/get-active-workspace.sh")
-(deflisten wps :initial "[1, 2, 3]" "./bar/workspaces/get-workspaces.sh")
-(defwidget workspaces []
- (box
- :space-evenly true
- (for workspace in wps
- (eventbox :onclick "hyprctl dispatch workspace ${workspace}"
- (box
- :width 36
- :height 36
- :class "${workspace == curr ? "accent" : ""}"
- (label
- :style "font-size: 1.3rem;"
- :text "${ws-icons[workspace - 1]}"
- ))))))
diff --git a/modules/home/eww/bar/workspaces/get-active-workspace.sh b/modules/home/eww/bar/workspaces/get-active-workspace.sh
deleted file mode 100755
index 64365d4..0000000
--- a/modules/home/eww/bar/workspaces/get-active-workspace.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env bash
-
-hyprctl monitors -j | jq --raw-output .[0].activeWorkspace.id
-socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | stdbuf -o0 grep '^workspace>>' | stdbuf -o0 awk -F '>>|,' '{print $2}'
-
diff --git a/modules/home/eww/bar/workspaces/get-workspaces.sh b/modules/home/eww/bar/workspaces/get-workspaces.sh
deleted file mode 100755
index a8e7b43..0000000
--- a/modules/home/eww/bar/workspaces/get-workspaces.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-spaces (){
- hyprctl workspaces -j | jq -c 'map(.id | select(. > 0)) | sort'
-}
-
-spaces
-socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | while read -r line; do
- spaces
-done
diff --git a/modules/home/eww/default.nix b/modules/home/eww/default.nix
deleted file mode 100644
index 34724cc..0000000
--- a/modules/home/eww/default.nix
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- lib,
- config,
- pkgs,
- ...
-}:
-with lib; let
- cfg = config.modules.eww;
-in {
- options.modules.eww = {enable = mkEnableOption "eww";};
-
- config = mkIf cfg.enable {
- home.packages = with pkgs; [
- pamixer
- brightnessctl
- material-icons
- blueberry
- bluez
- gnunet
- jaq
- networkmanagerapplet
- pavucontrol
- playerctl
- procps
- socat
- udev
- upower
- util-linux
- wget
- wireplumber
- wlogout
- bc
- jq
- fusuma
- eww-wayland
- ];
- xdg.configFile."eww" = {
- source = ./.;
- recursive = true;
- };
- xdg.configFile."eww/_colors.scss".text = with config.colorScheme.colors; ''
- $base00: #${base00};
- $base01: #${base01};
- $base02: #${base02};
- $base03: #${base03};
- $base04: #${base04};
- $base05: #${base05};
- $base06: #${base06};
- $base07: #${base07};
- $base08: #${base08};
- $base09: #${base09};
- $base0A: #${base0A};
- $base0B: #${base0B};
- $base0C: #${base0C};
- $base0D: #${base0D};
- $base0E: #${base0E};
- $base0F: #${base0F};
- '';
-
- xdg.configFile."fusuma/config.yaml".source = ./fusuma.yaml;
- };
-}
diff --git a/modules/home/eww/eww.scss b/modules/home/eww/eww.scss
deleted file mode 100644
index 0db9438..0000000
--- a/modules/home/eww/eww.scss
+++ /dev/null
@@ -1,49 +0,0 @@
-@import 'colors';
-@import "bar/eww";
-@import "panel/scss/_init.scss";
-
-* {
- all: unset;
- font-family: "monospace";
-}
-
-.accent {
- background-color: $base0C;
- color: $base00;
-}
-
-.accent-txt {
- color: $base0C;
-}
-
-.secondary {
- background-color: $base0E;
- color: $base00;
-}
-.secondary-txt {
- color: $base0E;
-}
-
-.red {
- background-color: $base08;
- color: $base02;
-}
-.red-txt {
- color: $base0E;
-}
-
-.green {
- background-color: $base0B;
-}
-.green-txt {
- color: $base0B;
-}
-
-.blue {
- background-color: $base0D;
-}
-.blue-txt {
- color: $base0D;
-}
-
-
diff --git a/modules/home/eww/eww.yuck b/modules/home/eww/eww.yuck
deleted file mode 100644
index c7ee936..0000000
--- a/modules/home/eww/eww.yuck
+++ /dev/null
@@ -1,2 +0,0 @@
-(include "./bar/eww.yuck")
-(include "./panel/yuck/_init.yuck")
diff --git a/modules/home/eww/fusuma.yaml b/modules/home/eww/fusuma.yaml
deleted file mode 100644
index 17a96d2..0000000
--- a/modules/home/eww/fusuma.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-swipe:
- 3:
- down:
- command: "hyprctl dispatch fullscreen 1"
- up:
- command: "hyprctl dispatch fullscreen 1"
- 4:
- left:
- command: "hyprctl dispatch cyclenext prev"
- right:
- command: "hyprctl dispatch cyclenext"
- up:
- command: bash -c "eww open panel-closer && eww open panel"
- down:
- command: bash -c "eww close panel-closer && eww close panel"
diff --git a/modules/home/eww/panel/music.sh b/modules/home/eww/panel/music.sh
deleted file mode 100755
index dd561bd..0000000
--- a/modules/home/eww/panel/music.sh
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/usr/bin/env bash
-
-XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache/}"
-
-get_status() {
- s=$1
- if [ "$s" = "Playing" ]; then
- echo ""
- else
- echo ""
- fi
-}
-
-get_length_time() {
- len=$1
- if [ -n "$len" ]; then
- len=$(bc <<< "$len / 1000000 + 1")
- date -d@"$len" +%M:%S
- else
- echo ""
- fi
-}
-
-get_position() {
- pos=$1
- len=$2
- if [[ -n "$pos" && -n $len ]]; then
- bc -l <<< "$pos / $len * 100"
- else
- echo 0
- fi
-}
-
-get_position_time() {
- pos=$1
- len=$2
- if [ -n "$pos" ]; then
- date -d@"$(bc <<< "$pos / 1000000")" +%M:%S
- else
- echo ""
- fi
-}
-
-get_cover() {
- # COVER_URL=$1
- mkdir -p "$XDG_CACHE_HOME/eww_covers"
- cd "$XDG_CACHE_HOME/eww_covers" || exit
-
- IMGPATH="$XDG_CACHE_HOME/eww_covers/cover_art.png"
-
- playerctl -F metadata mpris:artUrl 2>/dev/null | while read -r COVER_URL; do
- if [[ "$COVER_URL" = https* ]]; then
- if [ ! -e "$XDG_CACHE_HOME/eww_covers/$(basename "$COVER_URL")" ]; then
- wget -N "$COVER_URL" -o /dev/null
- fi
-
- rm "$IMGPATH"
- ln -s "$(basename "$COVER_URL")" "$IMGPATH"
-
- echo "$IMGPATH"
- elif [ "$COVER_URL" = "" ]; then
- echo ""
- else
- echo "$COVER_URL"
- fi
- done
-}
-
-sanitize() {
- echo "$1" | sed 's/"/\"/g'
-}
-
-if [ "$1" = "cover" ]; then
- get_cover
-else
- playerctl -F metadata -f '{{title}}\{{artist}}\{{status}}\{{position}}\{{mpris:length}}\' 2>/dev/null | while IFS="$(printf '\\')" read -r title artist status position len; do
- jaq --null-input \
- -r -c \
- --arg artist "$(sanitize "$artist")" \
- --arg title "$(sanitize "$title")" \
- --arg status "$(get_status "$status")" \
- --arg pos "$(get_position "$position" "$len")" \
- --arg pos_time "$(get_position_time "$position" "$len")" \
- --arg length "$(get_length_time "$len")" \
- '{"artist": $artist, "title": $title, "status": $status, "position": $pos, "position_time": $pos_time, "length": $length}'
- done
-fi
diff --git a/modules/home/eww/panel/scss/_cardimage.scss b/modules/home/eww/panel/scss/_cardimage.scss
deleted file mode 100644
index fc043e4..0000000
--- a/modules/home/eww/panel/scss/_cardimage.scss
+++ /dev/null
@@ -1,87 +0,0 @@
-.disclose-cardimage-eventbox {
- background: linear-gradient(45deg, $base02 20%, $base01 100%);
- border-radius: 0.5em;
-}
-
-.disclose-cardimage-eventbox:hover {
- background: linear-gradient(170deg, $base01 20%, $shade01 100%);
-}
-
-.disclose-cardimage-icon {
- margin: 0 0 0 -0.21em;
- background-size: cover;
- background-repeat: no-repeat;
- border-radius: 50%;
-}
-
-.disclose-cardimage-image-box {
- padding: 0 1em 0 1em;
-}
-
-.disclose-cardimage-image {
- background-size: cover;
- background-repeat: no-repeat;
- box-shadow: -0.4px -0.3px 4px 4px $shade08;
- border-radius: 50%;
- border: 0.25em solid $base09;
-}
-
-.disclose-cardimage-separator {
- background-color: $shade02;
- font-size: 1;
- padding: 3.4em 0 0 0;
- margin: 0 10em 0 10em;
-}
-
-.disclose-cardimage-body-box {
- font-size: 15;
- padding: 1em 0 1em 0;
-}
-
-.disclose-cardimage-summary-box {
- padding: 0.5em 0 0.5em 0.9em;
- background-color: darken($base09, 10%);
- border-radius: 0.3em 0.3em 0 0;
- color: $base02;
-}
-
-.disclose-cardimage-appname-label {
- font-size: 16;
- font-weight: bold;
-}
-
-.disclose-cardimage-close-button {
- margin: 0.6em 1em 0.6em 0;
- padding: 0.2em;
- background-color: $base11;
- color: $base01;
- border-radius: 50%;
- box-shadow: -0.4px -0.3px 4px -1.8px $shade09;
-}
-
-.disclose-cardimage-close-button:hover {
- background-color: $base01;
- color: $base11;
-}
-
-.disclose-cardimage-body-outer {
- padding: 0 1em 0 0;
-}
-
-.disclose-cardimage-summary-label {
- font-size: 20;
- font-weight: bold;
- color: $base05;
-}
-
-.disclose-cardimage-body-label {
- font-size: 16;
- color: $base05;
-}
-
-.disclose-cardimage-timestamp {
- color: $base10;
- font-weight: bold;
-}
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/scss/_cardprog.scss b/modules/home/eww/panel/scss/_cardprog.scss
deleted file mode 100644
index 595bb51..0000000
--- a/modules/home/eww/panel/scss/_cardprog.scss
+++ /dev/null
@@ -1,121 +0,0 @@
-.disclose-cardprog-eventbox {
- background: linear-gradient(45deg, $base02 20%, $base01 100%);
- border-radius: 0.5em;
-}
-
-.disclose-cardprog-eventbox:hover {
- background: linear-gradient(170deg, $base01 20%, $shade01 100%);
-}
-
-.disclose-cardprog-icon {
- margin: 0 0 0 -0.21em;
- background-size: cover;
- background-repeat: no-repeat;
-}
-
-.disclose-cardprog-image-box {
- padding: 0 1em 0 1em;
-}
-
-.disclose-cardprog-image {
- background-size: cover;
- background-repeat: no-repeat;
- box-shadow: -0.4px -0.3px 4px 4px $shade08;
- border-radius: 50%;
- border: 0.25em solid $base09;
-}
-
-.disclose-cardprog-separator {
- background-color: $shade02;
- font-size: 1;
- padding: 3.4em 0 0 0;
- margin: 0 10em 0 10em;
-}
-
-.disclose-cardprog-body-box {
- font-size: 15;
- padding: 1em 0 1em 0;
-}
-
-.disclose-cardprog-summary-box {
- padding: 0.5em 0 0.5em 0.9em;
- background-color: darken($base09, 10%);
- border-radius: 0.3em 0.3em 0 0;
- color: $base02;
-}
-
-.disclose-cardprog-appname-label {
- font-size: 16;
- font-weight: bold;
-}
-
-.disclose-cardprog-close-button {
- margin: 0.6em 1em 0.6em 0;
- padding: 0.2em;
- background-color: $base11;
- color: $base01;
- border-radius: 50%;
- box-shadow: -0.4px -0.3px 4px -1.8px $shade09;
-}
-
-.disclose-cardprog-close-button:hover {
- background-color: $base01;
- color: $base11;
-}
-
-.disclose-cardprog-body-outer {
- padding: 0 1em 0 0;
-}
-
-.disclose-cardprog-summary-label {
- font-size: 20;
- font-weight: bold;
- color: $base05;
-}
-
-.disclose-cardprog-body-label {
- font-size: 16;
- color: $base05;
-}
-
-.disclose-cardprog-timestamp {
- color: $base10;
- font-weight: bold;
-}
-
-.disclose-cardprog-scale {
- background-color: $shade01;
- border-radius: 0.2em;
- margin: 0.5em 0 0.5em;
-
- contents {
- trough {
- border-radius: 0.2em;
-
- // Uncomment to enable slider pointer
- // slider {
- // margin: -8px;
- // background-color: $base15;
- // box-shadow: -0.4px -0.3px 4px -1.8px $shade09;
- // border-radius: 20%;
- // }
-
- highlight {
- background-color: $base09;
- padding: 0.7em;
- border-radius: 0.2em;
- }
- }
- }
-}
-
-.disclose-cardprog-value-label {
- padding: 0 0.5em 0 0.5em;
- margin: 0.2em 0 0.2em 0;
- color: $base02;
- font-weight: 700;
- background-color: $base10;
- border-radius: 10%;
-}
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/scss/_cardradial.scss b/modules/home/eww/panel/scss/_cardradial.scss
deleted file mode 100644
index a839181..0000000
--- a/modules/home/eww/panel/scss/_cardradial.scss
+++ /dev/null
@@ -1,84 +0,0 @@
-.disclose-cardradial-eventbox {
- background: linear-gradient(45deg, $base02 20%, $base01 100%);
- border-radius: 0.5em;
-}
-
-.disclose-cardradial-eventbox:hover {
- background: linear-gradient(170deg, $base01 20%, $shade01 100%);
-}
-
-.disclose-cardradial-separator {
- background-color: $shade02;
- font-size: 1;
- padding: 3.4em 0 0 0;
- margin: 0 10em 0 10em;
-}
-
-.disclose-cardradial-body-box {
- font-size: 15;
- padding: 1em 0 1em 0;
-}
-
-.disclose-cardradial-summary-box {
- padding: 0.5em 0 0.5em 0.9em;
- background-color: darken($base09, 10%);
- border-radius: 0.3em 0.3em 0 0;
- color: $base02;
-}
-
-.disclose-cardradial-appname-label {
- font-size: 16;
- font-weight: bold;
-}
-
-.disclose-cardradial-close-button {
- margin: 0.6em 1em 0.6em 0;
- padding: 0.2em;
- background-color: $base11;
- color: $base01;
- border-radius: 50%;
- box-shadow: -0.4px -0.3px 4px -1.8px $shade09;
-}
-
-.disclose-cardradial-close-button:hover {
- background-color: $base01;
- color: $base11;
-}
-
-.disclose-cardradial-body-outer {
- padding: 0 1em 0 0;
-}
-
-.disclose-cardradial-summary-label {
- font-size: 20;
- font-weight: bold;
- color: $base05;
-}
-
-.disclose-cardradial-body-label {
- font-size: 16;
- color: $base05;
-}
-
-.disclose-cardradial-timestamp {
- color: $base10;
- font-weight: bold;
-}
-
-.disclose-cardradial-circle-box {
- padding: 0 1em 0 1em;
-}
-
-.disclose-cardradial-circle {
- font-size: 25;
- color: $base09;
- background-color: $shade01;
-}
-
-.disclose-cardradial-tasks {
- padding: 1.4em;
- font-weight: bolder;
- color: $base10;
-}
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/scss/_cardscr.scss b/modules/home/eww/panel/scss/_cardscr.scss
deleted file mode 100644
index c9adb4f..0000000
--- a/modules/home/eww/panel/scss/_cardscr.scss
+++ /dev/null
@@ -1,86 +0,0 @@
-.disclose-cardscr-eventbox {
- background: linear-gradient(45deg, $base02 20%, $base01 100%);
- border-radius: 0.5em;
-}
-
-.disclose-cardscr-eventbox:hover {
- background: linear-gradient(170deg, $shade01 20%, $base01 100%);
-}
-
-.disclose-cardscr-summary-box {
- padding: 0.5em 0 0 1em;
- border-radius: 0.3em 0.3em 0 0;
- color: $base02;
-}
-
-.disclose-cardscr-close-button {
- margin: 0.6em 1em 0.6em 0;
- padding: 0.2em;
- background-color: $base11;
- color: $base01;
- border-radius: 50%;
- box-shadow: -0.4px -0.3px 4px -1.8px $shade09;
-}
-
-.disclose-cardscr-close-button:hover {
- background-color: $base01;
- color: $base11;
-}
-
-.disclose-cardscr-summary-label {
- font-size: 20;
- font-weight: bold;
- color: $base05;
-}
-
-.disclose-cardscr-body-label {
- font-size: 16;
- color: $base05;
-}
-
-.disclose-cardscr-timestamp {
- color: $base10;
- font-weight: bold;
-}
-
-.disclose-cardscr-image {
- margin: 1em;
- border-radius: 0.5em;
- background-size: cover;
- background-repeat: no-repeat;
-}
-
-.disclose-cardscr-timestamp {
- padding-right: 1em;
-}
-
-.disclose-cardscr-open-button,
-.disclose-cardscr-delete-button {
- font-size: 20;
- font-weight: bold;
- padding: 0.6em 3.72em 0.6em 3.72em;
- margin-bottom: 0.7em;
- border-radius: 0.2em;
- color: $base02;
-}
-
-.disclose-cardscr-open-button {
- background-color: darken($base09, 10%);
-}
-
-.disclose-cardscr-open-button:hover {
- color: $base09;
- background-color: $shade02;
-}
-
-.disclose-cardscr-delete-button {
- background-color: $shade02;
- color: $base11;
-}
-
-.disclose-cardscr-delete-button:hover {
- background-color: $base11;
- color: $shade02;
-}
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/scss/_empty.scss b/modules/home/eww/panel/scss/_empty.scss
deleted file mode 100644
index 73584ad..0000000
--- a/modules/home/eww/panel/scss/_empty.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-.disclose-empty-banner {
- padding-top: 8em;
-}
-
-.disclose-empty-box {
- padding: 1em 1em 10em 0;
-}
-
-.disclose-empty-label {
- padding-top: 3em;
- color: $shade00;
- font-size: 16;
-}
-
-.disclose-separator {
- font-size: 0.5;
- background-color: $base03;
- margin: 35em 25em 35em 25em;
-}
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/scss/_init.scss b/modules/home/eww/panel/scss/_init.scss
deleted file mode 100644
index 4f74afc..0000000
--- a/modules/home/eww/panel/scss/_init.scss
+++ /dev/null
@@ -1,65 +0,0 @@
-$base10: $base0A;
-$base11: $base0B;
-$base12: $base0C;
-$base13: $base0D;
-$base14: $base0E;
-$base15: $base0F;
-$shade00: #3d464e;
-$shade01: #2b3238;
-$shade02: #24292e;
-$shade03: #1f2429;
-$shade04: #1c2126;
-$shade05: #191e23;
-$shade06: #161b20;
-$shade07: #151a1f;
-$shade08: #13181d;
-$shade09: #11161b;
-$shade10: #0e1115;
-$shade11: #0c0f13;
-$shade12: #0a0d11;
-$normal: darken(#7ab0df, 50%);
-$critical: darken(#f87070, 50%);
-$low: darken(#79dcaa, 50%);
-$other: darken(#ffe59e, 50%);
-
-.disclose-closer {
- padding-top: 36px;
- background-color: transparent;
-}
-
-.disclose-layout-box {
- background-color: $base00;
- font-family: monospace;
- padding-bottom: 1em;
-}
-
-.disclose-headers {
- padding: 1em 2em 0 2em;
- margin-bottom: 1.5em;
- color: $base05;
-}
-
-.disclose-headers-label {
- font-size: 20;
- color: $base05;
- opacity: 0.8;
-}
-
-.disclose-scroll {
- margin: 0 1.5em 0 1.5em;
-}
-
-@import "./_empty.scss";
-
-@import "./_cardprog.scss";
-@import "./_cardscr.scss";
-@import "./_cardimage.scss";
-@import "./_cardradial.scss";
-
-@import "./_urgency.scss";
-@import "./_stats.scss";
-@import "./_music.scss";
-@import "./_modifiers.scss";
-@import "./_override.scss";
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/scss/_modifiers.scss b/modules/home/eww/panel/scss/_modifiers.scss
deleted file mode 100644
index 328410f..0000000
--- a/modules/home/eww/panel/scss/_modifiers.scss
+++ /dev/null
@@ -1,16 +0,0 @@
-.shot-image-bord-dashed {
- border-style: dashed;
-}
-
-.Spotify-rectangle {
- margin: 0.3em;
- border-radius: 0.2em;
- border-width: 0
-}
-
-.Qbittorrent-rectangle {
- border-radius: 0;
- border-width: 0;
-}
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/scss/_music.scss b/modules/home/eww/panel/scss/_music.scss
deleted file mode 100644
index 900331e..0000000
--- a/modules/home/eww/panel/scss/_music.scss
+++ /dev/null
@@ -1,49 +0,0 @@
-.disclose-music-box {
- background-image: linear-gradient(to bottom left, rgba(0, 0, 0, 1.0), rgba(30, 33, 40, 0.5));
- background-size: cover;
- background-repeat: no-repeat;
- margin-right: 1em;
- border-radius: 1.5em;
-
- .play-status {
- padding: 4px;
- font-size: 25;
- }
-
- .volume-container {
- background-color: $base03;
- border-radius: 2em;
- opacity: 0.8;
- padding-right: 8px;
-
-
- .volume-icon {
- margin: 0.3em;
- padding: 0.2em;
- border-radius: 1em;
- font-size: 20;
- }
-
- .volume-text {
- font-weight: 600;
- }
- }
-}
-
-.disclose-dnd-header {
- font-size: 20;
- font-weight: bold;
- color: $base05;
-}
-
-.disclose-dnd-footer {
- font-size: 15;
- color: darken($base06, 10%);
-}
-
-.disclose-dnd-labels {
- padding: 1.5em;
-}
-
-
-// vim:filetype=scss
diff --git a/modules/home/eww/panel/scss/_override.scss b/modules/home/eww/panel/scss/_override.scss
deleted file mode 100644
index 65de8ba..0000000
--- a/modules/home/eww/panel/scss/_override.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-.disclose-cardprog-separator,
-.disclose-cardradial-separator,
-.disclose-cardimage-separator {
- opacity: 0.0;
-}
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/scss/_stats.scss b/modules/home/eww/panel/scss/_stats.scss
deleted file mode 100644
index 6d55c48..0000000
--- a/modules/home/eww/panel/scss/_stats.scss
+++ /dev/null
@@ -1,41 +0,0 @@
-.disclose-big-button {
- font-size: 15;
- border-radius: 2em;
- padding: 16px 0;
-}
-
-.disclose-stats-box {
- background-color: $base01;
- border-radius: 3em;
- margin: 0 1em 0 1em;
- padding: 0.8em;
-
- .stats-label {
- padding: 0.9em 0.9em 0.9em 0.83em;
- font-size: 23;
- font-weight: bold;
- }
-
- circular-progress {
- background-color: $base02;
- }
-
- .stats-separator {
- font-size: 1;
- background-color: $base03;
- padding: 1em;
- margin-left: 15em;
- }
-
- .info-value {
- font-size: 20;
- font-weight: bold;
- }
-
- .info-label {
- color: $base0F;
- padding: 0 8px;
- }
-}
-
-// vim:filetype=scss
diff --git a/modules/home/eww/panel/scss/_urgency.scss b/modules/home/eww/panel/scss/_urgency.scss
deleted file mode 100644
index bc35294..0000000
--- a/modules/home/eww/panel/scss/_urgency.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.disclose-cardimage-summary-box-CRITICAL {
- background-color: darken($base11, 10%);
-}
-
-.disclose-cardimage-summary-box-LOW {
- background-color: darken($base15, 10%);
-}
-
-// vim:ft=scss
diff --git a/modules/home/eww/panel/shell/cache.py b/modules/home/eww/panel/shell/cache.py
deleted file mode 100755
index a7390ac..0000000
--- a/modules/home/eww/panel/shell/cache.py
+++ /dev/null
@@ -1,209 +0,0 @@
-"""A DBus eavesdropper for org.freedesktop.Notifications
-interface.
-
-This is created mainly to cache the raw image data that is
-sent by stupid applications like Spotify, Discord, etc.
-Now that I think about it all of the electron clients do this.
-
-Usually any application, if they had to they'd send the
-notifications as a path i.e. caching the image themselves
-and then returning the path to it.
-
-Also,
-is a really nice manual. Give it a read.
-"""
-
-# Authored By dharmx under:
-# GNU GENERAL PUBLIC LICENSE
-# Version 3, 29 June 2007
-#
-# Copyright (C) 2007 Free Software Foundation, Inc.
-# Everyone is permitted to copy and distribute verbatim copies
-# of this license document, but changing it is not allowed.
-#
-# Permissions of this strong copyleft license are conditioned on
-# making available complete source code of licensed works and
-# modifications, which include larger works using a licensed work,
-# under the same license. Copyright and license notices must be
-# preserved. Contributors provide an express grant of patent rights.
-#
-# Read the complete license here:
-#
-
-import datetime
-import os
-import pathlib
-import sys
-import typing
-
-import dbus
-import utils
-
-from dbus.mainloop.glib import DBusGMainLoop
-from gi.repository import GLib
-
-
-class Urgency:
- """Acts as an Enum for indicating the urgency levels as per
- the notifications specification.
-
- You may use these to match wheter a specific notification belongs
- to a specific urgency class or, not.
-
- Attributes:
- LOW: Ads, Login, etc.
- NORMAL: USB unplugged, Drive mounted, etc.
- CRITICAL: Your PC is on fire, Storage Full, etc.
- """
- LOW = b"\x00"
- NORMAL = b"\x01"
- CRITICAL = b"\x02"
-
-
-class Eavesdropper:
- """A quick and naive way of saving the image-data.
-
- The main idea is to keep a notification server running that
- implements image-data and image-path as per the freedesktop
- notification specification.
- And, then you'd run the eavesdropper which will connect to that
- interface (org.freedesktop.Notifications) and will continuously
- monitor that interface.
- And, if any application sends a notification, that contains a raw
- icon then it will be saved into the cache directory.
-
- Attributes:
- callback:
- The arbitrary subroutine that will executed on getting a notification.
- cache_dir:
- The directory path that all of those image-data would be saved.
- """
-
- def __init__(
- self,
- callback: typing.Callable = print,
- cache_dir: str = "/tmp"
- ):
- """Assigns the CTOR parameters to the field variables (duh..)
-
- Arguments:
- callback: The arbitrary subroutine that will executed on getting a notification.
- cache_dir: The directory path that all of those image-data would be saved.
- """
- self.callback = callback
- self.cache_dir = f"{os.path.expandvars(cache_dir)}/image-data"
- # translation: mkdir --parents cache_dir
- pathlib.PosixPath(self.cache_dir).mkdir(parents=True, exist_ok=True)
-
- def _message_callback(
- self, _,
- message: dbus.lowlevel.MethodReturnMessage
- or dbus.lowlevel.MethodCallMessage
- ):
- """A filter callback for parsing the specific messages that are received from the DBus interface.
-
- Arguments:
- proxy_bus:
- The bus that sent the message.
- message:
- In this case a message is sent when the
- Notify method is called AND when the Notify method returns something.
-
- If the message is of type dbus.lowlevel.MethodCallMessage then this will NOT call the passed callback.
- """
-
- # we will be filtering this out as we only need the value that the method call returns
- # i.e. dbus.lowlevel.MethodReturnMessage
- if type(message) != dbus.lowlevel.MethodCallMessage:
- return
-
- args_list = message.get_args_list()
- # convert dbus data types to pythonic ones
- # eg: dbus.String('Hello') -> 'Hello'
- args_list = [utils.unwrap(item) for item in args_list]
-
- # set fallbacks like a fine gentleman
- details = {
- "appname": args_list[0].strip() or "Unknown",
- "summary": args_list[3].strip() or "Summary Unavailable.",
- "body": args_list[4].strip() or "Body Unavailable.",
- "id": datetime.datetime.now().strftime("%s"),
- "urgency": "unknown",
- }
-
- if "urgency" in args_list[6]:
- details["urgency"] = args_list[6]["urgency"]
-
- if args_list[2].strip():
- # if the iconpath value is a path i.e. if it has slashes on them
- # then assign that as the iconpath
- if "/" in args_list[2] or "." in args_list[2]:
- details["iconpath"] = args_list[2]
- else:
- # and if the iconpath is just a string that has no extensions or,
- # a pathlike structure like: 'bell' or 'custom-folder-bookmark'
- # it might have a dash (-) sign but not all the time.
- # then fetch that actual path of that icon as that is a part of the
- # icon theme naming convention and the current icon theme should probably have it
- details["iconpath"] = utils.get_gtk_icon_path(args_list[2])
- else:
- # if there are no icon hints then use fallback (generic bell)
- details["iconpath"] = utils.get_gtk_icon_path(
- "custom-notification")
-
- if "image-data" in args_list[6]:
- # capture the raw image bytes and save them to the cache_dir/x.png path
- details["iconpath"] = f"{self.cache_dir}/{details['appname']}-{details['id']}.png"
- utils.save_img_byte(
- args_list[6]["image-data"], details["iconpath"])
-
- # BUG: add a print statement -> init logger.py and disown the process
- # BUG: then you'll notice the notifications with value (progress) hint does not get logged
- if "value" in args_list[6]:
- details["progress"] = args_list[6]["value"]
-
- # execute arbitrary callback and passing details about the current notification.
- self.callback(details)
-
- def eavesdrop(
- self,
- timeout: int or bool = False,
- timeout_callback: typing.Callable = print
- ):
- """Primes the session bus instance and starts a GLib mainloop.
-
- Arguments:
- timeout:
- Intervals for executing the callback.
- timeout_callback:
- Callback that will be executed on intervals.
- """
- DBusGMainLoop(set_as_default=True)
-
- rules = {
- "interface": "org.freedesktop.Notifications",
- "member": "Notify",
- "eavesdrop": "true", # https://bugs.freedesktop.org/show_bug.cgi?id=39450
- }
-
- bus = dbus.SessionBus()
- # discard all other interfaces except org.freedesktop.Notifications
- # setting eavesdrop to true enables DBus to send the messages that are
- # not meant for you.
- # removing the eavesdrop key from rules will not send the Notify method's
- # contents to you (you can try and see what happens)
- bus.add_match_string(",".join([f"{key}={value}" for key, value in rules.items()]))
- bus.add_message_filter(self._message_callback)
-
- try:
- loop = GLib.MainLoop()
- if timeout:
- # executes a callback in intervals
- GLib.set_timeout(timeout, timeout_callback)
- loop.run()
- except (KeyboardInterrupt, Exception) as excep:
- sys.stderr.write(str(excep) + "\n")
- bus.close()
-
-
-# vim:filetype=python
diff --git a/modules/home/eww/panel/shell/combine.bash b/modules/home/eww/panel/shell/combine.bash
deleted file mode 100755
index 0956a8e..0000000
--- a/modules/home/eww/panel/shell/combine.bash
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env bash
-
-CACHE_PATH="$XDG_CACHE_HOME/eww/dunst/notifications.txt"
-QUOTE_PATH="$XDG_CACHE_HOME/eww/dunst/quotes.txt"
-DEFAULT_QUOTE="To fake it is to stand guard over emptiness. \u2500\u2500 Arthur Herzog"
-
-mkdir -p "${CACHE_PATH:h}" "${QUOTE_PATH:h}" 2> /dev/null
-touch "$CACHE_PATH" "$QUOTE_PATH" 2> /dev/null
-
-INTERVAL='0.2'
-
-function rand_quote() {
- local format
- format="$(tr '\n \t\r' 's' < "$QUOTE_PATH")"
- if [[ "$format" != "" ]]; then
- shuf "$QUOTE_PATH" | head -n1
- else
- echo "$DEFAULT_QUOTE"
- fi
-}
-
-function empty_format() {
- local format
- format=(
- "(box"
- ":class"
- "'disclose-empty-box'"
- ":height"
- "750"
- ":orientation"
- "'vertical'"
- ":space-evenly"
- "false"
- "(image"
- ":class"
- "'disclose-empty-banner'"
- ":valign"
- "'end'"
- ":vexpand"
- "true"
- ":path"
- "'./assets/wedding-bells.png'"
- ":image-width"
- "250"
- ":image-height"
- "250)"
- "(label"
- ":vexpand"
- "true"
- ":valign"
- "'start'"
- ":wrap"
- "true"
- ":class"
- "'disclose-empty-label'"
- ":text"
- "'$(rand_quote)'))"
- )
- echo "${format[@]}"
-}
-
-function not_empty() {
- echo -n "(box :spacing 20 :orientation 'vertical' :space-evenly false"
- if [[ "$(echo "$1" | tr -d ' ')" != "" ]]; then
- echo -n "$1"
- else
- echo -n "$(empty_format)"
- fi
- echo ")"
-}
-
-case "$1" in
- rmid) sed -i "/:identity ':::###::::XXXWWW$2===::'/d" "$CACHE_PATH" ;;
- sub)
- old="$(tr '\n' ' ' < "$CACHE_PATH")"
- not_empty "$old"
- while sleep "$INTERVAL"; do
- new="$(tr '\n' ' ' < "$CACHE_PATH")"
- if [[ "$old" != "$new" ]]; then
- not_empty "$new"
- old="$new"
- fi
- done
- ;;
- quote) rand_quote ;;
- cls) echo > "$CACHE_PATH" ;;
-esac
-
-# vim:filetype=sh
diff --git a/modules/home/eww/panel/shell/github.sh b/modules/home/eww/panel/shell/github.sh
deleted file mode 100755
index e347b9e..0000000
--- a/modules/home/eww/panel/shell/github.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-
-CONFIG="$XDG_CONFIG_HOME/eww/ewwrc"
-CACHE_DIR=$(jq --raw-output .github.cache_dir "$CONFIG")
-eval "CACHE_DIR=${CACHE_DIR}"
-USER_NAME=$(jq --raw-output .github.username "$CONFIG")
-DATE=$(date +%F)
-
-[ -f "$CACHE_DIR" ] || mkdir --parents "$CACHE_DIR"
-
-fetch_user_info() {
- [ -f "$CACHE_DIR/users-$USER_NAME-$DATE.json" ] || curl --silent https://api.github.com/users/dharmx > "$CACHE_DIR/users-$USER_NAME-$DATE.json"
- [ -f "$CACHE_DIR/repos-$USER_NAME-$DATE.json" ] || curl --silent https://api.github.com/users/dharmx/repos > "$CACHE_DIR/repos-$USER_NAME-$DATE.json"
-}
-
-fetch_user_info
-case "$1" in
- users) cat "$CACHE_DIR/users-$USER_NAME-$DATE.json" ;;
- repos) cat "$CACHE_DIR/repos-$USER_NAME-$DATE.json" ;;
-esac
-
-# vim:filetype=sh
diff --git a/modules/home/eww/panel/shell/handlers.py b/modules/home/eww/panel/shell/handlers.py
deleted file mode 100755
index 86c97f0..0000000
--- a/modules/home/eww/panel/shell/handlers.py
+++ /dev/null
@@ -1,320 +0,0 @@
-"""This file is tightly integrated with logger.py and won't work without it.
-Unlike the files cache.py and utils.py.
-
-This module just redirects specific presets of messages based on the source
-(the application) that sent that message.
-
-The redirector will call the specific function based off the appname, then
-the called handler function will evaluate the YUCK literal and replace all
-of the items on the format string with the passed attributes and then return it.
-"""
-
-# Authored By dharmx under:
-# GNU GENERAL PUBLIC LICENSE
-# Version 3, 29 June 2007
-#
-# Copyright (C) 2007 Free Software Foundation, Inc.
-# Everyone is permitted to copy and distribute verbatim copies
-# of this license document, but changing it is not allowed.
-#
-# Permissions of this strong copyleft license are conditioned on
-# making available complete source code of licensed works and
-# modifications, which include larger works using a licensed work,
-# under the same license. Copyright and license notices must be
-# preserved. Contributors provide an express grant of patent rights.
-#
-# Read the complete license here:
-#
-
-import datetime
-
-import cache
-import utils
-
-# WARN: Subject to heavy change.
-
-def redir_to_handlers(formats, attributes: dict) -> str:
- r"""Function for evaluating which handler function will be called.
-
- Before calling the handler function it will do some filtering and
- then actually call the handler which should return a fully evaluated
- YUCK literal string.
-
- Arguments:
- formats:
- All of the YUCK literal format strings.
- attributes:
- Details about the currently sent notification like summary, body, appname, etc.
-
- Returns:
- A str that is a primed YUCK literal with passed attributes.
-
- Example:
- Format:
- (_cardimage :identity ':::###::::XXXWWW%(id)s===::'
- :close_action './src/shell/logger.py rmid %(id)s'
- :limit_body '%(BODY_LIMITER)s'
- :limit_summary '%(SUMMARY_LIMITER)s'
- :summary '%(summary)s'
- :body '%(body)s'
- :close '繁'
- :image_height 100
- :image_width 100
- :image '%(iconpath)s'
- :appname '%(appname)s'
- :icon '%(iconpath)s'
- :icon_height 32
- :icon_width 32
- :timestamp '%(TIMESTAMP)s'
- :urgency '%(URGENCY)s')
- Primed:
- (_cardimage :identity ':::###::::XXXWWW1658665761===::'
- :close_action './src/shell/logger.py rmid 1658665761'
- :limit_body '110'
- :limit_summary '30'
- :summary 'Picom'
- :body 'The compositer is now disabled.'
- :close '繁'
- :image_height 100
- :image_width 100
- :image '/home/maker/.icons/custom/stock/128/custom-crying.png'
- :appname 'Picom'
- :icon '/home/maker/.icons/custom/stock/128/custom-crying.png'
- :icon_height 32
- :icon_width 32
- :timestamp '17:59'
- :urgency 'CRITICAL')
- """
-
- # assign the timestamp of the notification.
- attributes["TIMESTAMP"] = datetime.datetime.now().strftime(
- attributes["TIMESTAMP_FORMAT"])
-
- # turn the urgency values (which are in bytes) to a more readable format (string).
- match attributes["urgency"]:
- case cache.Urgency.LOW:
- attributes["URGENCY"] = "LOW"
- case cache.Urgency.NORMAL:
- attributes["URGENCY"] = "NORMAL"
- case cache.Urgency.CRITICAL:
- attributes["URGENCY"] = "CRITICAL"
- case _:
- attributes["URGENCY"] = "NORMAL"
-
- # handle next lines (especially discord code blocks)
- # NOTE: may make this only discord / firefox specific
- attributes["body"] = attributes["body"].replace("\n", " ")
- attributes["summary"] = attributes["summary"].replace("\n", " ")
-
- # check if there are any pango tags on the body and summary and if so
- # it will then remove it.
- if utils.contains_pango(attributes["body"]):
- attributes["body"] = utils.strip_pango_tags(attributes["body"])
- if utils.contains_pango(attributes["summary"]):
- attributes["summary"] = utils.strip_pango_tags(
- attributes["summary"]
- )
-
- # it will replace all of the apostrophes with \' i.e. escape them.
- if "'" in attributes["body"]:
- attributes["body"] = attributes["body"].replace("'", "\\'")
- if "'" in attributes["summary"]:
- attributes["summary"] = attributes["summary"].replace("'", "\\'")
-
- # only 15 chars would be taken if the summary has non-english charecters.
- attributes["SUMMARY_LIMITER"] = ""
- summary_lang_char_check = utils.has_non_english_chars(
- attributes["summary"][:15]
- )
- # if summary has asian characters like Japanese, Hindi or, Chinese
- if summary_lang_char_check["CJK"]:
- attributes["SUMMARY_LIMITER"] = 14
- # if summary has Cyrillic characters
- elif summary_lang_char_check["CYR"]:
- attributes["SUMMARY_LIMITER"] = 30
-
- attributes["BODY_LIMITER"] = ""
- body_lang_char_check = utils.has_non_english_chars(attributes["body"][:70])
- if body_lang_char_check["CJK"]:
- attributes["BODY_LIMITER"] = 80
- elif body_lang_char_check["CYR"]:
- attributes["BODY_LIMITER"] = 110
- else:
- attributes["BODY_LIMITER"] = 100
-
- # redirect to handlers
- match attributes["appname"]:
- case "notify-send":
- return notify_send_handler(formats, attributes)
- case "volume":
- return volume_handler(formats, attributes)
- case "brightness":
- return brightness_handler(formats, attributes)
- case "shot":
- return shot_handler(formats, attributes)
- case "shot_icon":
- return shot_icon_handler(formats, attributes)
- case "todo":
- return todo_handler(formats, attributes)
- case "Spotify":
- return Spotify_handler(formats, attributes)
- case _:
- return default_handler(formats, attributes)
-
-
-# TODO: Segregate redir_to_handlers into more utility / helper functions.
-# NOTE: Currently it is a bit hard to utilize config values without making the code dirtier.
-# NOTE: For instance shot_handler will eventually load the command strings from the config JSON for attributes["DELETE"]. See logger.py
-def shot_handler(formats, attributes: dict) -> str:
- """Handler for screenshot related notifications.
-
- Note that this handler will only handle the screenshots itself.
- That is, it won't handle it if say.. the screenshot is copied to the clipboard, etc.
- All of those are handled by shot_icon_handler.
-
- Arguments:
- formats: See redir_to_handlers.
- attributes: See redir_to_handlers.
-
- Returns:
- See redir_to_handlers
- """
- # TODO: Make this better
- attributes["DELETE"] = f"rm --force \\'{attributes['iconpath']}\\' && ./src/shell/logger.py rmid {attributes['id']}"
- attributes["OPEN"] = f"xdg-open \\'{attributes['iconpath']}\\'"
-
- # capitalize words i.e. notify_send -> Notify Send
- attributes["appname"] = utils.prettify_name(attributes["appname"])
- return formats["shot"] % attributes
-
-
-def Spotify_handler(formats, attributes: dict) -> str:
- """Handler for notifications related to the official electron client for Spotify.
-
- Arguments:
- formats: See redir_to_handlers.
- attributes: See redir_to_handlers.
-
- Returns:
- See redir_to_handlers
- """
- return formats["Spotify"] % attributes
-
-
-def default_handler(formats, attributes: dict) -> str:
- r"""Handler for basic notifications. The notifications that are ordinary.
- Or, rather the notifications that do not match any of the match-cases in
- the redir_to_handlers function.
-
- Arguments:
- formats: See redir_to_handlers.
- attributes: See redir_to_handlers.
-
- Example:
- notify-send Hello
- notify-send Greetings
- notify-send -u low -i bell Greetings Ding\!
- notify-send -a appname-does-not-exist -i bell Yo
-
- Returns:
- See redir_to_handlers
- """
- attributes["appname"] = utils.prettify_name(attributes["appname"])
- return formats["default"] % attributes
-
-
-def notify_send_handler(formats, attributes: dict) -> str:
- """Handler for notifications related to the notify-send command.
-
- See:
- default_handler
-
- Arguments:
- formats: See redir_to_handlers.
- attributes: See redir_to_handlers.
-
- Returns:
- See redir_to_handlers
- """
- attributes["appname"] = utils.prettify_name(attributes["appname"])
- return formats["notify-send"] % attributes
-
-
-def brightness_handler(formats, attributes: dict) -> str:
- """Handler for notifications related to brightness control.
-
- Arguments:
- formats: See redir_to_handlers.
- attributes: See redir_to_handlers.
-
- Returns:
- See redir_to_handlers
- """
- attributes["appname"] = utils.prettify_name(attributes["appname"])
- return formats["brightness"] % attributes
-
-
-def volume_handler(formats, attributes: dict) -> str:
- """Handler for notifications related to volume control.
-
- Arguments:
- formats: See redir_to_handlers.
- attributes: See redir_to_handlers.
-
- Returns:
- See redir_to_handlers
- """
- attributes["appname"] = utils.prettify_name(attributes["appname"])
- return formats["volume"] % attributes
-
-
-# TODO: Make this general purpose and not just todo specific.
-def todo_handler(formats, attributes: dict) -> str:
- """Handler for notifications related to todo-bin CLI application by Siddomy.
-
- The notification body needs to be in a particular format in order for it to register.
- That is: tasks done and are remaining.
-
- The fragments and will be picked up by this handler.
-
- Arguments:
- formats: See redir_to_handlers.
- attributes: See redir_to_handlers.
-
- Returns:
- See redir_to_handlers
- """
- splitted = attributes["body"].split(" ")
- attributes["TOTAL"] = int(splitted[4])
- attributes["DONE"] = int(splitted[0])
-
- # handle division by zero
- attributes["PERC"] = (attributes["DONE"] / attributes["TOTAL"]
- ) * 100 if attributes["DONE"] > 0 else 0
-
- attributes["appname"] = utils.prettify_name(attributes["appname"])
- return formats["todo"] % attributes
-
-
-def shot_icon_handler(formats, attributes: dict) -> str:
- """Almost same as default_handler only just it uses a different icon.
-
- Redundant, but still nice to if you want to add additional
- functionalities on this particular appname.
-
- See:
- default_handler
- shot_handler
-
- Arguments:
- formats: See redir_to_handlers.
- attributes: See redir_to_handlers.
-
- Returns:
- See redir_to_handlers
- """
- attributes["appname"] = utils.prettify_name(attributes["appname"])
- return formats["shot_icon"] % attributes
-
-
-# vim:filetype=python
diff --git a/modules/home/eww/panel/shell/logger.py b/modules/home/eww/panel/shell/logger.py
deleted file mode 100755
index c4faa7f..0000000
--- a/modules/home/eww/panel/shell/logger.py
+++ /dev/null
@@ -1,146 +0,0 @@
-#!/usr/bin/env --split-string=python -u
-"""Script for logging desktop notifications in the form of YUCK literal.
-
-General idea is to have a file log the notifications in the form of YUCK
-literal containing a widget structure which will then be concatenated into
-a box widget to take a list-like structure.
-
-The said structure needs to be re-rendered whenever the log file notices
-a change. Like, deleting an entry or, adding an entry or, editing an entry.
-
-Note, if you still have not guessed already, if you make any changes to the
-log file then the list of notifications will be re-rendered again.
-"""
-
-# Authored By dharmx under:
-# GNU GENERAL PUBLIC LICENSE
-# Version 3, 29 June 2007
-#
-# Copyright (C) 2007 Free Software Foundation, Inc.
-# Everyone is permitted to copy and distribute verbatim copies
-# of this license document, but changing it is not allowed.
-#
-# Permissions of this strong copyleft license are conditioned on
-# making available complete source code of licensed works and
-# modifications, which include larger works using a licensed work,
-# under the same license. Copyright and license notices must be
-# preserved. Contributors provide an express grant of patent rights.
-#
-# Read the complete license here:
-#
-
-# WARN: This script is under active development and is subject to frequent changes.
-# WARN: Currently this script is quite inefficient. So, you have been warned.
-
-import json
-import os
-import pathlib
-import sys
-
-import cache
-import handlers
-import utils
-
-# presetted notification format strings i.e. they are just utility items that help reducing the size of code
-# another reason is convenience i.e. it would be easier to have all the formats in one place and defining them
-# would be less cumbersome.
-FORMATS = {
- "spotifyd": "(_cardimage :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :image_height 100 :image_width 100 :image '%(iconpath)s' :appname '%(appname)s' :icon '%(iconpath)s' :icon_height 32 :icon_width 32 :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s')",
- "ncspot": "(_cardimage :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :image_height 100 :image_width 100 :image '%(iconpath)s' :appname '%(appname)s' :icon '%(iconpath)s' :icon_height 32 :icon_width 32 :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s')",
- "Spotify": "(_cardimage :class 'Spotify-rectangle' :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :image_height 100 :image_width 100 :image '%(iconpath)s' :appname '%(appname)s' :icon '%(iconpath)s' :icon_height 32 :icon_width 32 :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s')",
- "shot_icon": "(_cardimage :class 'shot-image-bord-dashed' :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :image_height 100 :image_width 100 :image '%(iconpath)s' :appname '%(appname)s' :icon '%(iconpath)s' :icon_height 32 :icon_width 32 :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s')",
- "shot": "(_cardscr :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :delete '%(DELETE)s' :open '%(OPEN)s' :summary '%(summary)s' :image '%(iconpath)s' :image_height 250 :image_width 100 :urgency '%(URGENCY)s' :close '繁' :timestamp '%(TIMESTAMP)s')",
- "default": "(_cardimage :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :image_height 100 :image_width 100 :image '%(iconpath)s' :appname '%(appname)s' :icon '%(iconpath)s' :icon_height 32 :icon_width 32 :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s')",
- "notify-send": "(_cardimage :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :image_height 100 :image_width 100 :image '%(iconpath)s' :appname '%(appname)s' :icon './assets/browser.png' :icon_height 32 :icon_width 32 :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s')",
- "empty": "(box :class 'disclose-empty-box' :height 750 :orientation 'vertical' :space-evenly false (image :class 'disclose-empty-banner' :valign 'end' :vexpand true :path './assets/wedding-bells.png' :image-width 250 :image-height 250) (label :vexpand true :valign 'start' :wrap true :class 'disclose-empty-label' :text '%(QUOTE)s'))",
- "brightness": "(_cardprog :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :image_height 100 :image_width 100 :image '%(iconpath)s' :appname '%(appname)s' :icon '%(iconpath)s' :icon_height 32 :icon_width 32 :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s' :progress '%(progress)s')",
- "todo": "(_cardradial :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :appname '%(appname)s' :progress %(PERC)s :thickness 20.0 :total %(TOTAL)s :done %(DONE)s :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s')",
- "volume": "(_cardprog :identity ':::###::::XXXWWW%(id)s===::' :close_action './src/shell/combine.bash rmid %(id)s' :limit_body '%(BODY_LIMITER)s' :limit_summary '%(SUMMARY_LIMITER)s' :summary '%(summary)s' :body '%(body)s' :close '繁' :image_height 100 :image_width 100 :image '%(iconpath)s' :appname '%(appname)s' :icon '%(iconpath)s' :icon_height 32 :icon_width 32 :timestamp '%(TIMESTAMP)s' :urgency '%(URGENCY)s' :progress '%(progress)s')"
-}
-
-if __name__ == "__main__":
- # load only notification related options from the config JSON
- config = json.loads(
- pathlib.PosixPath(
- os.path.expandvars("$XDG_CONFIG_HOME/eww/ewwrc")
- ).read_text()
- )["notify"]
-
- # kind of like the sliding window algorithm i.e. will pop the notifications if this number is reached
- HISTORY_LIMIT = config["limit"]
- # file path where the notifications will be saved
- CACHE_PATH = os.path.expandvars(config["cache_path"])
- # directory path where the notifications will be saved
- # WARN: Do not edit this; Only edit this if you know what you are doing!
- CACHE_DIR = os.path.dirname(CACHE_PATH)
- # file path where the quotes are stored
- QUOTE_PATH = os.path.expandvars(config["quote_path"])
- # fallback if the quote DB has no quotes in them
- DEFAULT_QUOTE = config["default_quote"]
- # Watcher interval; Reflects how fast disclose will be rendered.
- INTERVAL = config["interval"]
-
- # handle IndexError
- if len(sys.argv) < 2:
- sys.argv = ("dummy", "dummy")
- match sys.argv[1]:
- case "subscribe":
- utils.create_parents_file(CACHE_PATH) # mkdir --parents
- utils.create_parents_file(QUOTE_PATH) # mkdir --parents
- utils.watcher(
- CACHE_PATH,
- lambda contents: sys.stdout.write(
- "(box :spacing 20 :orientation 'vertical' :space-evenly false " +
- # handle empty and display fallback
- contents.replace("\n", " ") + ")\n"
- if contents.strip()
- else (
- (FORMATS["empty"] + "\n")
- % {"QUOTE": utils.get_rand_quote(QUOTE_PATH, DEFAULT_QUOTE)}
- )
- ),
- INTERVAL,
- )
- case "rmid":
- # grep based off the notification id and then remove that YUCK literal entry from the log file
- utils.file_matched_index_rm(
- CACHE_PATH, f":identity ':::###::::XXXWWW{sys.argv[2]}===::'"
- )
- case "stats":
- sys.stdout.write(
- json.dumps(
- utils.parse_and_print_stats(
- pathlib.PosixPath(CACHE_PATH).read_text()
- )
- )
- + "\n"
- )
- case "rm":
- utils.file_rm_line(CACHE_PATH, int(sys.argv[2]))
- case "quote":
- sys.stdout.write(utils.get_rand_quote(QUOTE_PATH, DEFAULT_QUOTE))
- case "cls":
- pathlib.PosixPath(CACHE_PATH).write_text("")
- case "init":
- def master_callback(details: dict):
- r"""Callback function that handles fetching and logging the notification details.
-
- Arguments:
- details: the JSON that should have a similar structure to the following:
- {
- "summary": "Hello",
- "body": "Who's there?",
- "id": 16444442,
- "urgency": "LOW"
- }
- """
- details["TIMESTAMP_FORMAT"] = config["timestamp"]
- if not config["excluded_appnames"] or details["appname"] not in config["excluded_appnames"]:
- saved_path = handlers.redir_to_handlers(FORMATS, details)
- # actual point where the notification is being logged.
- utils.file_add_line(CACHE_PATH, saved_path, HISTORY_LIMIT)
-
- # start eavesdropping on the org.freedesktop.Notifications interface and log the notification info
- cache.Eavesdropper(master_callback, CACHE_DIR).eavesdrop()
-
-# vim:filetype=python
diff --git a/modules/home/eww/panel/shell/utils.py b/modules/home/eww/panel/shell/utils.py
deleted file mode 100755
index 1cf0a19..0000000
--- a/modules/home/eww/panel/shell/utils.py
+++ /dev/null
@@ -1,463 +0,0 @@
-#!/usr/bin/env python
-
-"""Utility module. Shared across almost all of the python scripts / modules."""
-
-# Authored By dharmx under:
-# GNU GENERAL PUBLIC LICENSE
-# Version 3, 29 June 2007
-#
-# Copyright (C) 2007 Free Software Foundation, Inc.
-# Everyone is permitted to copy and distribute verbatim copies
-# of this license document, but changing it is not allowed.
-#
-# Permissions of this strong copyleft license are conditioned on
-# making available complete source code of licensed works and
-# modifications, which include larger works using a licensed work,
-# under the same license. Copyright and license notices must be
-# preserved. Contributors provide an express grant of patent rights.
-#
-# Read the complete license here:
-#
-
-import json
-import os
-import pathlib
-import random
-import re
-import sys
-import time
-import typing
-import unicodedata
-
-from wand.image import COLORSPACE_TYPES, Image
-from html.parser import HTMLParser
-from io import StringIO
-
-import dbus
-import gi
-
-# supress GIO warnings
-gi.require_version("Gtk", "3.0")
-gi.require_version("GdkPixbuf", "2.0")
-
-import requests
-from gi.repository import GdkPixbuf, Gio, GLib, Gtk
-
-
-class PangoStripper(HTMLParser):
- def __init__(self):
- super().__init__()
- self.reset()
- self.strict = False
- self.convert_charrefs = True
- self.text = StringIO()
-
- def handle_data(self, d):
- self.text.write(d)
-
- def get_data(self):
- return self.text.getvalue()
-
-
-def contains_pango(string: str) -> bool:
- """Checks if a string contains HTML tags or not. Since a pango string has to have at least two tags
-
- Arguments:
- string: The Pango markup format string.
-
- Returns:
- A bool value i.e. whether a has pango markup or not.
- """
- return any(item in string for item in ["", "", ""])
-
-
-def strip_pango_tags(pango: str) -> str:
- """Removes HTML tags like , , etc.
-
- Arguments:
- pango: The Pango format string that needs to be stripped of its tags.
-
- Returns:
- A str without the tags.
- """
- stripper = PangoStripper()
- stripper.feed(pango)
- return stripper.get_data()
-
-
-def create_parents_file(file_path: str):
- '''A replication of [ -f "$FILE_PATH" ] || mkdir --parents "$FILE_PATH"
-
- Arguments:
- file_path: The location of the file.
- '''
- pathlib.PosixPath(os.path.dirname(file_path)).mkdir(
- parents=True, exist_ok=True)
- pathlib.PosixPath(file_path).touch(exist_ok=True)
-
-
-def watcher(file_path: str, callback: typing.Callable, interval: int, initial: bool = True):
- """A file watcher function that executes a callback function if any change is made to a file.
-
- Arguments:
- file_path: The file location that needs to be monitored.
- callback: A callback function that would be invoked when any change is noticed.
- interval: The time rate at which the file will be checked for changes.
- initial: Initially execute the callback once before entering the watch loop.
- """
- try:
- old = pathlib.PosixPath(file_path).read_text()
- if initial:
- callback(old)
- while not time.sleep(interval):
- new = pathlib.PosixPath(file_path).read_text()
- if new != old:
- callback(new)
- old = new
- except KeyboardInterrupt:
- sys.stdout.write("Closed.\n")
- except FileNotFoundError:
- sys.stderr.write("The path does not exist!\n")
- except Exception as excep:
- sys.stderr.write(f"{excep}\n")
-
-
-def get_rand_quote(file_path: str, default_quote: str) -> str:
- """Get a random quote or, rather a random line.
-
- Arguments:
- file_path: The location of the file.
- default_quote: Fallback quote if the file doesn't exist r, is empty.
- """
- loaded_quotes: str = pathlib.PosixPath(file_path).read_text().strip()
- return random.choice(loaded_quotes.splitlines()) if loaded_quotes else default_quote
-
-
-def file_matched_index_rm(file_path: str, pattern: str):
- """Removes line from a file if a pattern matches that line.
-
- Arguments:
- file_path: The location of the file.
- pattern: Pattern to match the line that needs to be removed.
- """
- posix_file_path = pathlib.PosixPath(file_path)
- lines = posix_file_path.read_text().splitlines()
-
- # skip the line if pattern matches
- rm_index_lines = [
- lines[index]
- for index in range(len(lines))
- if not re.search(pattern, lines[index])
- ]
-
- if len(lines) != len(rm_index_lines):
- posix_file_path.write_text("\n".join(rm_index_lines))
-
-
-def file_rm_line(file_path: str, position: int | bool | range = True):
- """Ranged line removal, indexed line removal and stack-like (pop / reverse pop) line removal.
-
- Arguments:
- file_path: The location of the file.
- position: If the value is of type:
- range: then that the lines starting from that range will be removed.
- int: then that specific file line number will be removed.
- bool: True will pop and False will pop from the end.
- """
- file = pathlib.PosixPath(file_path)
- match str(type(position)):
- case "":
- file_contents = file.read_text().splitlines()
- # no need to run the loop if all you need to do is remove the first line
- if position == 0:
- file_rm_line(file_path, position=True)
- return
- elif position == len(file_contents) - 1:
- file_rm_line(file_path, position=False)
- return
- line_removed_contents = []
- # skip the line that matches the position value.
- for index in range(len(file_contents)):
- if index != position:
- line_removed_contents += [file_contents[index]]
- file.write_text("\n".join(line_removed_contents))
- # filter falsey and truthy and use the actual bool class signature
- case "":
- file_contents = file.read_text().splitlines()
- file_contents = file_contents[1:] if position else file_contents[:-1]
- file.write_text("\n".join(file_contents))
- case "":
- if not position:
- file.write_text("")
- return
- file_contents = file.read_text().splitlines()
- write_contents = []
- # keep on skipping the lines if they are in the range.
- for index in range(len(file_contents)):
- if index not in position:
- write_contents += [file_contents[index]]
- file.write_text("\n".join(write_contents))
-
-
-def prettify_name(name: str) -> str:
- """Transforms 'Hello-World' -> 'Hello World', 'notify-send++lol' -> 'Notify Send Lol'
-
- Arguments:
- name: The string that needs to be prettified.
-
- Returns:
- A prettified str.
- """
- return " ".join(
- item.capitalize()
- for item in name.replace("-", " ").replace("_", " ").split(" ")
- )
-
-
-def file_add_line(file_path: str, write_contents: str, limit: int, top: bool = True):
- """Functions like sliding window algorithm
-
- That is after the file hits a certain line limit, lines from the behind will be dropped (older entries)
- and THEN the newer ones will be entered.
-
- Arguments:
- file_path: The location of the file.
- write_contents: The contents that needs to be written to the file.
- limit: The line limit.
- top: Adds new entry at the beginning of the file if True, at the end otherwise.
- """
- file = pathlib.PosixPath(file_path)
- file_contents = file.read_text().splitlines()
- if len(file_contents) == limit:
- file_contents = file_contents[:-1]
- file_contents = (
- [write_contents] + file_contents if top else file_contents + [write_contents]
- )
- file.write_text("\n".join(file_contents))
-
-
-def parse_and_print_stats(file_contents: str) -> dict:
- """Looks the words CRITICAL, LOW and NORMAL and calcuates its frequency.
-
- Arguments:
- file_contents: the string that needs to be calculated for frequency.
-
- Returns:
- Individual frequency of the words in dict format.
- {"CRITICAL": 10.00, "NORMAL": 85.00, "LOW": 5.00}
- """
- stats = {"critical": 0, "low": 0, "normal": 0, "total": 0}
-
- for line in file_contents.splitlines():
- if "CRITICAL" in line:
- stats["critical"] += 1
- stats["total"] += 1
- elif "LOW" in line:
- stats["low"] += 1
- stats["total"] += 1
- elif "NORMAL" in line:
- stats["normal"] += 1
- stats["total"] += 1
-
- # handle division / zero
- stats["critical"] = (
- stats["critical"] * 100 /
- stats["total"] if stats["critical"] > 0 else 0
- )
- stats["normal"] = (
- stats["normal"] * 100 / stats["total"] if stats["normal"] > 0 else 0
- )
- stats["low"] = stats["low"] * 100 / \
- stats["total"] if stats["low"] > 0 else 0
- return stats
-
-
-def has_non_english_chars(string: str) -> dict:
- """Check if there is any CJK / Cyrillic characters in the given string.
-
- Arguments:
- string: the string that needs to be checked.
-
- Returns:
- A dict containing True / False for keys representing if such characters exist or not.
- {"CJK": True, "CYR": False} for string value: "おはようございます means Good Morning!"
- """
- return {
- "CJK": any(unicodedata.category(char) == "Lo" for char in string),
- "CYR": any(unicodedata.category(char) == "Lu" for char in string),
- }
-
-
-def unwrap(value: dbus.Array
- | dbus.Boolean
- | dbus.Byte
- | dbus.Dictionary
- | dbus.Double
- | dbus.Int16
- | dbus.ByteArray
- | dbus.Int32
- | dbus.Int64
- | dbus.Signature
- | dbus.UInt16
- | dbus.UInt32
- | dbus.UInt64
- | dbus.String) -> str | int | list | tuple | float | dict | bool | bytes:
- """Try to trivially translate a dictionary's elements into nice string formatting.
-
- Arguments:
- value: A type out of:
- dbus.Boolean,
- dbus.Byte,
- dbus.Dictionary,
- dbus.Double,
- dbus.Int16,
- dbus.ByteArray,
- dbus.Int32,
- dbus.Int64,
- dbus.Signature,
- dbus.UInt16,
- dbus.UInt32,
- dbus.UInt64 and dbus.String
-
- Returns:
- A str or int or list or tuple or float or dict or bool or bytes depending on the value.
- """
- if isinstance(value, dbus.ByteArray):
- return "".join([str(byte) for byte in value])
- if isinstance(value, (dbus.Array, list, tuple)):
- return [unwrap(item) for item in value]
- if isinstance(value, (dbus.Dictionary, dict)):
- return dict([(unwrap(x), unwrap(y)) for x, y in value.items()])
- if isinstance(value, (dbus.Signature, dbus.String)):
- return str(value)
- if isinstance(value, dbus.Boolean):
- return bool(value)
- if isinstance(
- value,
- (dbus.Int16, dbus.UInt16, dbus.Int32,
- dbus.UInt32, dbus.Int64, dbus.UInt64),
- ):
- return int(value)
- if isinstance(value, dbus.Byte):
- return bytes([int(value)])
- return value
-
-
-def save_img_byte(px_args: typing.Iterable, save_path: str):
- """Converts image data to an image file.
-
- See for the whole description.
-
- Arguments:
- px_args: Should contain an iterable in the following format.
- [image_width, image_height, rowstride, has_alpha, bits_per_sample, _, image_bytes]
- save_path: the filepath where this pixbuf should be saved to.
- """
- # https://specifications.freedesktop.org/notification-spec/latest/ar01s08.html
- # https://specifications.freedesktop.org/notification-spec/latest/ar01s05.html
- GdkPixbuf.Pixbuf.new_from_bytes(
- width=px_args[0],
- height=px_args[1],
- has_alpha=px_args[3],
- data=GLib.Bytes(px_args[6]),
- colorspace=GdkPixbuf.Colorspace.RGB,
- rowstride=px_args[2],
- bits_per_sample=px_args[4],
- ).savev(save_path, "png")
-
-
-def get_gtk_icon_path(icon_name: str, size: int = 128) -> str:
- """Returns the icon path by the specified name from your current icon theme.
-
- Recursively search for lower sizes until 32x32 and
- return a fallback if the requested path does not exists.
-
- Arguments:
- icon_name: Icon name as per the icon naming specification:
-
- size: the pixel size (widthxheight -> heightxheight -> size) of the requested icon.
- """
- if size < 32:
- return os.path.expandvars("$XDG_CONFIG_HOME/eww/assets/bell.png")
- if info := Gtk.IconTheme.get_default().lookup_icon(icon_name, size, 0):
- return info.get_filename()
- return get_gtk_icon_path(icon_name, size - 1)
-
-
-def get_mime_icon_path(mimetype: str, size: int = 32) -> str:
- """Gets the default icon path from the current GTK icon theme for the specified mime type.
-
- Arguments:
- mimetype: The file type like png, json, etc.
- size: The of the returned icon
-
- Returns:
- A str that is the path to the requested icon.
- """
- icon = Gio.content_type_get_icon(mimetype)
- theme = Gtk.IconTheme.get_default()
- if info := theme.choose_icon(icon.get_names(), size, 0):
- return info.get_filename()
-
-
-def get_location() -> dict | None:
- try:
- response = requests.get('https://api64.ipify.org?format=json').json()
- ip_address = response["ip"]
- response = requests.get(f'https://ipapi.co/{ip_address}/json/').json()
- return {
- "latitude": response.get("latitude"),
- "longitude": response.get("longitude"),
- "city": response.get("city"),
- "country": response.get("country_name"),
- "lang": response.get("languages").split(",")[0],
- }
- except requests.exceptions.ConnectionError:
- return None
-
-
-def auto_locate(cache_dir: str) -> dict | None:
- cache_posix_path = pathlib.PosixPath(f"{cache_dir}/location.json")
- if not cache_posix_path.is_file(): # assuming the directory exists
- fetched_location = get_location()
- if not fetched_location:
- return None
-
- cache_posix_path.write_text(json.dumps(fetched_location))
- return fetched_location
- return json.loads(cache_posix_path.read_text())
-
-
-def fetch_save(link: str, save_path: str, callback: typing.Callable = None) -> bool:
- try:
- data = requests.get(link)
- if data.status_code == 200:
- metadata = data.json()
- if callback:
- metadata = callback(metadata)
- pathlib.PosixPath(save_path).write_text(json.dumps(metadata))
- return True
- return False
- except requests.exceptions.ConnectionError:
- return False
-
-
-def img_dark_bright_col(filepath: str, colors: int = 10) -> tuple:
- with Image(filename=filepath) as image:
- image.quantize(
- number_colors=colors,
- colorspace_type=COLORSPACE_TYPES[21],
- dither=True, measure_error=False, treedepth=8)
- return tuple(
- "#%02X%02X%02X" % (item.red_int8, item.green_int8, item.blue_int8)
- for item in image.histogram)
-
-
-if __name__ == "__main__":
- match sys.argv[1]:
- case "histogram":
- image_path = sys.argv[2]
- histogram_colors = int(sys.argv[3])
- print(json.dumps(img_dark_bright_col(image_path, histogram_colors)))
-
-# vim:filetype=python
diff --git a/modules/home/eww/panel/yuck/_env.yuck b/modules/home/eww/panel/yuck/_env.yuck
deleted file mode 100644
index 415ed72..0000000
--- a/modules/home/eww/panel/yuck/_env.yuck
+++ /dev/null
@@ -1,4 +0,0 @@
-; REAL THINGS
-(defpoll disclose_stats :interval "5s" "./src/shell/logger.py stats")
-(deflisten disclose_sub "./src/shell/combine.bash sub")
-(defpoll disclose_dnd_state :interval "1s" "dunstctl is-paused")
diff --git a/modules/home/eww/panel/yuck/_init.yuck b/modules/home/eww/panel/yuck/_init.yuck
deleted file mode 100644
index a080956..0000000
--- a/modules/home/eww/panel/yuck/_init.yuck
+++ /dev/null
@@ -1,29 +0,0 @@
-(include "./panel/yuck/_env.yuck")
-
-(include "./panel/yuck/cards/_cardimage.yuck")
-(include "./panel/yuck/cards/_cardprog.yuck")
-(include "./panel/yuck/cards/_cardscr.yuck")
-(include "./panel/yuck/cards/_cardradial.yuck")
-
-(include "./panel/yuck/_stats.yuck")
-(include "./panel/yuck/_music.yuck")
-(include "./panel/yuck/_layout.yuck")
-
-(defwidget closer [window]
- (eventbox :onclick "eww close ${window} && eww close ${window}-closer"))
-
-(defwindow panel-closer
- :monitor 0
- :geometry (geometry :width "100%" :height "100%")
- :stacking "fg"
- :focusable false
- (closer :window "panel"))
-
-(defwindow panel :stacking "fg"
- :windowtype "normal"
- :wm-ignore true
- :monitor 0
- :geometry (geometry :width "26%" :height "100%" :anchor "right bottom")
- (panel_layout))
-
-;; vim:ft=yuck
diff --git a/modules/home/eww/panel/yuck/_layout.yuck b/modules/home/eww/panel/yuck/_layout.yuck
deleted file mode 100644
index 66585a1..0000000
--- a/modules/home/eww/panel/yuck/_layout.yuck
+++ /dev/null
@@ -1,25 +0,0 @@
-(defwidget panel_layout []
- (box :class "disclose-closer"
- (box :orientation "vertical"
- :space-evenly false
- :class "disclose-layout-box"
- (box :space-evenly false
- :class "disclose-headers"
- :spacing 6
- (label :text "Notifications"
- :class "disclose-headers-label"
- :halign "start"
- :hexpand true))
- (scroll :hscroll false
- :vscroll true
- :vexpand true
- :hexpand true
- :class "disclose-scroll"
- (literal :content disclose_sub))
- (label :class "disclose-separator" :text "")
- (wifi)
- (box :space-evenly false :class "disclose-misc-box"
- (dstats)
- (dmusic)))))
-
- ;; vim:filetype=yuck
diff --git a/modules/home/eww/panel/yuck/_lib.yuck b/modules/home/eww/panel/yuck/_lib.yuck
deleted file mode 100644
index b523d14..0000000
--- a/modules/home/eww/panel/yuck/_lib.yuck
+++ /dev/null
@@ -1,47 +0,0 @@
-(defwidget _sundialinfo [class halign ?hexpand ?prefix]
- (label :class "${class}-sundial-label" :halign halign :hexpand hexpand
- :text "${prefix}${time.hour >= 2 && time.hour <= 4 ? "Early Morning" :
- time.hour <= 5 ? "Dawn" :
- time.hour >= 6 && (time.hour <= 8 && time.min <= 59) ? "Morning" :
- time.hour >= 9 && (time.hour <= 11 && time.min <= 59) ? "Late Morning" :
- time.hour == 12 && time.min <= 29 ? "Midday" :
- time.hour >= 12 && time.hour <= 16 ? "Afternoon" :
- time.hour > 16 && time.hour <= 17 ? "Late Afternoon" :
- (time.hour >= 17 && time.min <= 1) || (time.hour <= 18 && time.min <= 20) ? "Early Evening" :
- time.hour >= 18 && time.hour <= 19 ? "Dusk" :
- time.hour > 19 && time.hour <= 21 ? "Late Evening" :
- time.hour > 21 ? "Night" : "Midnight"}"))
-
-(defwidget _profile [path size ?tooltip ?button-class ?image-class ?M ?L ?R]
- (button :onmiddleclick M
- :onclick L
- :onrightclick R
- :timeout "2s"
- :tooltip tooltip
- :class "vertigo-button ${button-class}"
- (image :path path
- :image-width size
- :class "vertigo-image ${image-class}")))
-
-(defwidget _infobatnolbl [battery status one two three four five six seven charge ?class]
- (box :class "lumin-battery-box ${class}"
- :space-evenly false
- :spacing 8
- (label :class "lumin-battery-icon ${class}" :text {status == 'Charging' ? charge :
- battery < 15 ? seven :
- battery < 30 ? six :
- battery < 45 ? five :
- battery < 60 ? four :
- battery < 75 ? three :
- battery < 95 ? two : one})))
-
-(defwidget _infonetnolbl [strength offline excellent good okay slow ?class]
- (box :class "lumin-network-box ${class}"
- :space-evenly false
- :spacing 8
- (label :class "lumin-network-icon ${class}" :text {strength == "" ? offline :
- strength < 26 ? slow :
- strength < 51 ? okay :
- strength < 76 ? good : excellent})))
-
-; vim:filetype=yuck
diff --git a/modules/home/eww/panel/yuck/_music.yuck b/modules/home/eww/panel/yuck/_music.yuck
deleted file mode 100644
index 457da85..0000000
--- a/modules/home/eww/panel/yuck/_music.yuck
+++ /dev/null
@@ -1,38 +0,0 @@
-(deflisten music :initial '{"title": "", "status": ""}' "./panel/music.sh")
-(deflisten music_cover "./panel/music.sh cover")
-
-(defpoll volume :interval "1s" "pamixer --get-volume")
-(defpoll is_mute :interval "1s" "pamixer --get-mute")
-
-(defwidget dmusic []
- (box :vexpand true
- :hexpand true
- :class "disclose-music-box"
- :style "background-image: linear-gradient(to bottom left, rgba(0, 0, 0, 0.7), rgba(30, 33, 40, 0.2)), url(\"${music_cover}\");"
- :space-evenly false
- (box :class "disclose-dnd-labels"
- :hexpand true
- :orientation "vertical"
- :space-evenly false
- (label :halign "start"
- :wrap true
- :class "disclose-dnd-header"
- :text {music.title == '' ? "No music" : music.title})
- (label :halign "start"
- :valign "start"
- :wrap true
- :class "disclose-dnd-footer"
- :vexpand true
- :text {music.artist == 'null' ? "" : music.artist})
- (box :valign "end" :space-evenly false :class "disclose-dnd-waiting-toggle"
- (button :onclick "action"
- :hexpand true
- :halign "start"
- :valign "end"
- :class "play-status accent-txt" {music.status})
- (box :space-evenly false :class "volume-container"
- (label :class "volume-icon"
- :text {is_mute == 'true' ? "婢" : "墳"})
- (label :class "volume-text" :text "${volume}%"))))))
-
-;; vim:filetype=yuck
diff --git a/modules/home/eww/panel/yuck/_stats.yuck b/modules/home/eww/panel/yuck/_stats.yuck
deleted file mode 100644
index 517e973..0000000
--- a/modules/home/eww/panel/yuck/_stats.yuck
+++ /dev/null
@@ -1,64 +0,0 @@
-; TODO: Update this value when pressing the button.
-(defpoll bright :interval '1s' "brightnessctl -m | cut -d , -f 4 | head -c -2")
-
-(defpoll ssid :interval "1s" `nmcli -terse -fields SSID,ACTIVE device wifi | awk --field-separator ':' '{if($2=="yes")print$1}'`)
-(defpoll bluethooth :interval '1s' "echo info | timeout 1 bluetoothctl | grep 'Name'")
-(defpoll theme :interval '1s' "cat ~/.local/state/theme")
-
-
-(defwidget stat_card [icon name percent value colorClass ?click]
- (button
- :click click
- (box
- :space-evenly false
- :class "disclose-stats-box"
- (circular-progress :value percent
- :thickness 10
- :class "${colorClass}-txt"
- (label :halign "center" :class "stats-label ${colorClass}-txt" :text icon))
- (label :class "stats-separator" :text "")
- (box :hexpand true :halign "center" :orientation "vertical" :class "disclose-stats-info-box"
- (label :halign "center" :class "info-value ${colorClass}-txt" :text value)
- (label :halign "start" :class "info-label" :text name)))))
-
-(defwidget dstats []
- (box :space-evenly false
- :orientation "vertical"
- :class "disclose-stats"
- :spacing 10
- (stat_card
- :icon ""
- :name "CPU"
- :percent 0
- :value {round(EWW_CPU.avg, 2)}
- :colorClass "red")
- (stat_card
- :icon ""
- :name "Memory"
- :percent {EWW_RAM.used_mem_perc}
- :value "${round(EWW_RAM.used_mem_perc, 0)}%"
- :colorClass "green")
- (stat_card
- :icon {theme == "light" ? "" : ""}
- :name "Brightness"
- :percent bright
- :value "${bright}%"
- :colorClass "blue"
- :click "settheme")))
-
-
-(defwidget wifi []
- (box
- :class "module"
- :spacing 16
- :style "margin: 8px 16px 16px 16px"
- (button
- :class "accent disclose-big-button"
- :click "nm-connection-editor"
- "直 : ${ssid != "" ? ssid : "Disconnected"}")
- (button
- :class "secondary disclose-big-button"
- :onclick "blueberry"
- " : ${bluethooth != "" ? bluethooth : 'Disconnected'}")))
-
-;; vim:filetype=yuck
diff --git a/modules/home/eww/panel/yuck/cards/_cardimage.yuck b/modules/home/eww/panel/yuck/cards/_cardimage.yuck
deleted file mode 100644
index d11a5d4..0000000
--- a/modules/home/eww/panel/yuck/cards/_cardimage.yuck
+++ /dev/null
@@ -1,85 +0,0 @@
-(defwidget _cardimage [
- summary
- body
-
- ?limit_summary
- ?limit_body
-
- appname
- timestamp
- urgency
-
- icon
- icon_width
- icon_height
- close
- ?close_action
-
- ?style
- ?class
-
- image
- image_width
- image_height
- ]
- (eventbox :class "disclose-cardimage-eventbox disclose-cardimage-eventbox-${urgency} disclose-cardimage-eventbox-${appname}"
- (box :orientation "vertical"
- :space-evenly false
- :class "disclose-cardimage-container-box disclose-cardimage-container-box-${urgency} disclose-cardimage-container-box-${appname}"
- (box :class "disclose-cardimage-summary-box disclose-cardimage-summary-box-${urgency} disclose-cardimage-summary-box-${appname}"
- :space-evenly false
- :spacing 6
-
- (box :style "background-image: url('${icon}')"
- :width icon_width
- :height icon_height
- :space-evenly false
- :class "disclose-cardimage-icon disclose-cardimage-icon-${urgency} disclose-cardimage-icon-${appname}")
- (label :text appname
- :hexpand true
- :halign "start"
- :class "disclose-cardimage-appname-label disclose-cardimage-appname-label-${urgency} disclose-cardimage-appname-label-${appname}")
- (button :class "disclose-cardimage-close-button disclose-cardimage-close-button-${urgency} disclose-cardimage-close-button-${appname}"
- :onclick close_action
- :timeout "2s"
- (label :text close
- :class "disclose-cardimage-close-icon disclose-cardimage-close-icon-${urgency} disclose-cardimage-close-icon-${appname}")))
-
- (box :class "disclose-cardimage-separator disclose-cardimage-separator-${urgency} disclose-cardimage-separator-${appname}"
- :space-evenly false)
-
- (box :class "disclose-cardimage-body-box disclose-cardimage-body-box-${urgency} disclose-cardimage-body-box-${appname}"
- :space-evenly false
- (box :halign "center"
- :valign "center"
- :class "disclose-cardimage-image-box disclose-cardimage-image-box-${urgency} disclose-cardimage-image-box-${appname}"
- (box :style "background-image: url('${image}');${style}"
- :hexpand false
- :vexpand false
- :width image_width
- :height image_height
- :space-evenly false
- :class "disclose-cardimage-image disclose-cardimage-image-${urgency} disclose-cardimage-image-${appname} ${class}"))
-
- (box :hexpand true
- :vexpand true
- :valign "center"
- :orientation "vertical"
- :spacing 5
- :class "disclose-cardimage-body-outer disclose-cardimage-body-outer-${urgency} disclose-cardimage-body-outer-${appname}"
- :space-evenly false
- (label :text summary
- :limit-width {limit_summary != "" ? limit_summary : 25}
- :halign "start"
- :class "disclose-cardimage-summary-label disclose-cardimage-summary-label-${urgency} disclose-cardimage-summary-label-${appname}")
- (label :text body
- :halign "start"
- :limit-width {limit_body != "" ? limit_body : 110}
- :xalign 0.0
- :wrap true
- :class "disclose-cardimage-body-label disclose-cardimage-body-${urgency} disclose-cardimage-body-${appname}")
- (label :text timestamp
- :halign "end"
- :class "disclose-cardimage-timestamp disclose-cardimage-timestamp-${urgency} disclose-cardimage-timestamp-${appname}"))))))
-
-;; vim:ft=yuck
diff --git a/modules/home/eww/panel/yuck/cards/_cardprog.yuck b/modules/home/eww/panel/yuck/cards/_cardprog.yuck
deleted file mode 100644
index 32ad7d4..0000000
--- a/modules/home/eww/panel/yuck/cards/_cardprog.yuck
+++ /dev/null
@@ -1,92 +0,0 @@
-(defwidget _cardprog [
- summary
- body
-
- ?limit_summary
- ?limit_body
-
- appname
- timestamp
- urgency
- progress
-
- icon
- icon_width
- icon_height
- close
- ?close_action
-
- ?style
- image
- image_width
- image_height
- ]
- (eventbox :class "disclose-cardprog-eventbox disclose-cardprog-eventbox-${urgency} disclose-cardprog-eventbox-${appname}"
- (box :orientation "vertical"
- :space-evenly false
- :class "disclose-cardprog-container-box disclose-cardprog-container-box-${urgency} disclose-cardprog-container-box-${appname}"
- (box :class "disclose-cardprog-summary-box disclose-cardprog-summary-box-${urgency} disclose-cardprog-summary-box-${appname}"
- :space-evenly false
- :spacing 6
- (box :style "background-image: url('${icon}')"
- :width icon_width
- :height icon_height
- :space-evenly false
- :class "disclose-cardprog-icon disclose-cardprog-icon-${urgency} disclose-cardprog-icon-${appname}")
- (label :text appname
- :hexpand true
- :halign "start"
- :class "disclose-cardprog-appname-label disclose-cardprog-appname-label-${urgency} disclose-cardprog-appname-label-${appname}")
- (button :class "disclose-cardprog-close-button disclose-cardprog-close-button-${urgency} disclose-cardprog-close-button-${appname}"
- :onclick close_action
- :timeout "2s"
- (label :text close
- :class "disclose-cardprog-close-icon disclose-cardprog-close-icon-${urgency} disclose-cardprog-close-icon-${appname}")))
- (box :class "disclose-cardprog-separator disclose-cardprog-separator-${urgency} disclose-cardprog-separator-${appname}"
- :space-evenly false)
- (box :class "disclose-cardprog-body-box disclose-cardprog-body-box-${urgency} disclose-cardprog-body-box-${appname}"
- :space-evenly false
- (box :halign "center"
- :valign "center"
- :class "disclose-cardprog-image-box disclose-cardprog-image-box-${urgency} disclose-cardprog-image-box-${appname}"
- (box :style "background-image: url('${image}');${style}"
- :hexpand false
- :vexpand false
- :width image_width
- :height image_height
- :space-evenly false
- :class "disclose-cardprog-image disclose-cardprog-image-${urgency} disclose-cardprog-image-${appname}"))
- (box :spacing 1
- :hexpand true
- :vexpand true
- :valign "center"
- :orientation "vertical"
- :class "disclose-cardprog-body-outer disclose-cardprog-body-outer-${urgency} disclose-cardprog-body-outer-${appname}"
- :space-evenly false
- (box :class "disclose-cardprog-summary-body-box disclose-cardprog-summary-body-box-${urgency} disclose-cardprog-summary-body-box-${appname}"
- (label :limit-width {limit_summary != "" ? limit_summary : 25}
- :text summary
- :halign "start"
- :class "disclose-cardprog-summary-label disclose-cardprog-summary-label-${urgency} disclose-cardprog-summary-label-${appname}")
- (label :text timestamp
- :halign "end"
- :class "disclose-cardprog-timestamp disclose-cardprog-timestamp-${urgency} disclose-cardprog-timestamp-${appname}"))
- (label :limit-width {limit_body != "" ? limit_body : 110}
- :text body
- :halign "start"
- :wrap true
- :xalign 0.0
- :class "disclose-cardprog-body-label disclose-cardprog-body-${urgency} disclose-cardprog-body-${appname}")
- (box :spacing 15
- :class "disclose-cardprog-scale-box disclose-cardprog-scale-box-${urgency} disclose-cardprog-scale-box-${appname}"
- :space-evenly false
- (scale :hexpand true
- :class "disclose-cardprog-scale disclose-cardprog-scale-${urgency} disclose-cardprog-scale-${appname}"
- :min 0
- :max 100
- :active false
- :value progress)
- (label :class "disclose-cardprog-value-label disclose-cardprog-value-label-${urgency} disclose-cardprog-value-label-${appname}"
- :text progress)))))))
-
-;; vim:ft=yuck
diff --git a/modules/home/eww/panel/yuck/cards/_cardradial.yuck b/modules/home/eww/panel/yuck/cards/_cardradial.yuck
deleted file mode 100644
index 1d9447a..0000000
--- a/modules/home/eww/panel/yuck/cards/_cardradial.yuck
+++ /dev/null
@@ -1,69 +0,0 @@
-(defwidget _cardradial [
- summary
- body
-
- ?limit_summary
- ?limit_body
-
- appname
- timestamp
- urgency
-
- close
- ?close_action
-
- progress
- thickness
-
- total
- done
- ]
- (eventbox :class "disclose-cardradial-eventbox disclose-cardradial-eventbox-${urgency} disclose-cardradial-eventbox-${appname}"
- (box :orientation "vertical"
- :space-evenly false
- :class "disclose-cardradial-container-box disclose-cardradial-container-box-${urgency} disclose-cardradial-container-box-${appname}"
- (box :class "disclose-cardradial-summary-box disclose-cardradial-summary-box-${urgency} disclose-cardradial-summary-box-${appname}"
- :space-evenly false
- (label :text appname
- :hexpand true
- :halign "start"
- :class "disclose-cardradial-appname-label disclose-cardradial-appname-label-${urgency} disclose-cardradial-appname-label-${appname}")
- (button :class "disclose-cardradial-close-button disclose-cardradial-close-button-${urgency} disclose-cardradial-close-button-${appname}"
- :onclick close_action
- :timeout "2s"
- (label :text close
- :class "disclose-cardradial-close-icon disclose-cardradial-close-icon-${urgency} disclose-cardradial-close-icon-${appname}")))
- (box :class "disclose-cardradial-separator disclose-cardradial-separator-${urgency} disclose-cardradial-separator-${appname}"
- :space-evenly false)
- (box :class "disclose-cardradial-body-box disclose-cardradial-body-box-${urgency} disclose-cardradial-body-box-${appname}"
- :space-evenly false
- (box :halign "center"
- :valign "center"
- :class "disclose-cardradial-circle-box disclose-cardradial-circle-box-${urgency} disclose-cardradial-circle-box-${appname}"
- (circular-progress :value progress
- :thickness thickness
- :class "disclose-cardradial-circle disclose-cardradial-circle-${urgency} disclose-cardradial-circle-${appname}"
- (label :class "disclose-cardradial-tasks disclose-cardradial-tasks-${urgency} disclose-cardradial-tasks-${appname}"
- :text "${done}/${total}")))
- (box :hexpand true
- :vexpand true
- :valign "center"
- :spacing 5
- :orientation "vertical"
- :class "disclose-cardradial-body-outer disclose-cardradial-body-outer-${urgency} disclose-cardradial-body-outer-${appname}"
- :space-evenly false
- (label :limit-width {limit_summary != "" ? limit_summary : 25}
- :text summary
- :halign "start"
- :class "disclose-cardradial-summary-label disclose-cardradial-summary-label-${urgency} disclose-cardradial-summary-label-${appname}")
- (label :limit-width {limit_body != "" ? limit_body : 110}
- :text body
- :xalign 0.0
- :halign "start"
- :wrap true
- :class "disclose-cardradial-body-label disclose-cardradial-body-${urgency} disclose-cardradial-body-${appname}")
- (label :text timestamp
- :halign "end"
- :class "disclose-cardradial-timestamp disclose-cardradial-timestamp-${urgency} disclose-cardradial-timestamp-${appname}"))))))
-
-;; vim:ft=yuck
diff --git a/modules/home/eww/panel/yuck/cards/_cardscr.yuck b/modules/home/eww/panel/yuck/cards/_cardscr.yuck
deleted file mode 100644
index 65878ca..0000000
--- a/modules/home/eww/panel/yuck/cards/_cardscr.yuck
+++ /dev/null
@@ -1,54 +0,0 @@
-(defwidget _cardscr [
- summary
- ?limit_summary
-
- close
- ?close_action
-
- image
- image_width
- image_height
-
- timestamp
- urgency
- delete
- open
- ]
- (eventbox :class "disclose-cardscr-eventbox disclose-cardscr-eventbox-${urgency}"
- (box :orientation "vertical"
- :space-evenly false
- :class "disclose-cardscr-container-box disclose-cardscr-container-box-${urgency}"
- (box :space-evenly false
- :class "disclose-cardscr-summary-box disclose-cardscr-summary-box-${urgency}"
- (label :hexpand true
- :limit-width {limit_summary != "" ? limit_summary : 25}
- :halign "start"
- :class "disclose-cardscr-summary-label disclose-cardscr-summary-label-${urgency}"
- :text summary)
- (label :class "disclose-cardscr-timestamp disclose-cardscr-timestamp-${urgency}"
- :text timestamp)
- (button :class "disclose-cardscr-close-button disclose-cardscr-close-button-${urgency}"
- :onclick close_action
- :timeout "2s"
- (label :text close
- :class "disclose-cardscr-close-icon disclose-cardscr-close-icon-${urgency}")))
- (box :class "disclose-cardscr-image"
- :style "background-image: url('${image}')"
- :width image_width
- :height image_height
- :space-evenly false)
- (box :spacing 20
- :space-evenly true
- :class "disclose-cardscr-action-box disclose-cardscr-action-box-${urgency}"
- :hexpand true
- :halign "center"
- (button :class "disclose-cardscr-open-button disclose-cardscr-open-button-${urgency}"
- :onclick open :timeout "2s"
- (label :text "Open"
- :class "disclose-cardscr-open-label disclose-cardscr-open-label-${urgency}"))
- (button :class "disclose-cardscr-delete-button disclose-cardscr-delete-button-${urgency}"
- :onclick delete :timeout "2s"
- (label :text "Delete"
- :class "disclose-cardscr-delete-label disclose-cardscr-delete-label-${urgency}"))))))
-
-;; vim:ft=yuck
diff --git a/modules/home/eww/togglepanel.sh b/modules/home/eww/togglepanel.sh
deleted file mode 100755
index 2bb13fe..0000000
--- a/modules/home/eww/togglepanel.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-eww windows | grep '*panel' > /dev/null
-[[ $? -eq 0 ]] \
- && (eww close panel-closer && eww close panel) \
- || (eww open panel-closer && eww open panel)
diff --git a/wallpapers/samurai-panda.png b/wallpapers/samurai-panda.png
new file mode 100644
index 0000000..ce55439
Binary files /dev/null and b/wallpapers/samurai-panda.png differ