From 33e1ab078501436b0d634b6f3f2f23687783894b Mon Sep 17 00:00:00 2001
From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>
Date: Wed, 2 Apr 2025 18:43:01 +1100
Subject: bar: embedded style
---
app.tsx | 3 +-
scss/bar.scss | 65 +++++++++++++++++++++++-
src/modules/bar.tsx | 113 +++++++++++++++++++++++++++---------------
src/modules/screencorners.tsx | 23 +++++++++
4 files changed, 163 insertions(+), 41 deletions(-)
diff --git a/app.tsx b/app.tsx
index 351e617..b28369d 100644
--- a/app.tsx
+++ b/app.tsx
@@ -2,7 +2,7 @@ import Bar from "@/modules/bar";
import Launcher from "@/modules/launcher";
import NotifPopups from "@/modules/notifpopups";
import Osds from "@/modules/osds";
-import ScreenCorners from "@/modules/screencorners";
+import ScreenCorners, { BarScreenCorners } from "@/modules/screencorners";
import Session from "@/modules/session";
import SideBar from "@/modules/sidebar";
import Calendar from "@/services/calendar";
@@ -81,6 +81,7 @@ App.start({
Monitors.get_default().forEach(m => );
Monitors.get_default().forEach(m => );
Monitors.get_default().forEach(m => );
+ Monitors.get_default().forEach(m => );
// Init services
timeout(1000, () => {
diff --git a/scss/bar.scss b/scss/bar.scss
index b8d36e4..efd1935 100644
--- a/scss/bar.scss
+++ b/scss/bar.scss
@@ -15,7 +15,6 @@
@include font.mono;
font-size: lib.s(14);
- padding-right: lib.s(3);
label.icon {
font-size: lib.s(18);
@@ -183,12 +182,18 @@
}
&.gaps {
+ padding-right: lib.s(3);
+
.module {
@include lib.rounded(8);
background-color: scheme.$base;
}
+ .screen-corner {
+ background-color: transparent;
+ }
+
.os-icon {
@include lib.border(scheme.$yellow);
@@ -242,4 +247,62 @@
}
}
}
+
+ &.embedded {
+ $-rounding: 23;
+
+ margin: 0;
+
+ .module {
+ background-color: scheme.$mantle;
+ }
+
+ .screen-corner {
+ @include lib.rounded($-rounding);
+ }
+
+ &.horizontal {
+ .module {
+ padding: lib.s(10) lib.s(10);
+ padding-left: lib.s(15);
+ }
+
+ .before-spacer {
+ border-bottom-right-radius: lib.s($-rounding);
+ padding-right: lib.s(15);
+ }
+
+ .after-spacer {
+ border-bottom-left-radius: lib.s($-rounding);
+ }
+
+ .power {
+ padding-right: lib.s(12);
+ }
+ }
+
+ &.vertical {
+ .module {
+ padding: lib.s(8) lib.s(10);
+ }
+
+ .before-spacer {
+ border-bottom-right-radius: lib.s($-rounding);
+ padding-bottom: lib.s(15);
+ }
+
+ .after-spacer {
+ border-top-right-radius: lib.s($-rounding);
+ padding-top: lib.s(15);
+ }
+
+ .os-icon {
+ padding-top: lib.s(12);
+ }
+
+ .power {
+ padding-bottom: lib.s(12);
+ }
+ }
+ }
}
diff --git a/src/modules/bar.tsx b/src/modules/bar.tsx
index 2aa45b6..9d65191 100644
--- a/src/modules/bar.tsx
+++ b/src/modules/bar.tsx
@@ -10,7 +10,7 @@ import { setupCustomTooltip } from "@/utils/widgets";
import ScreenCorner from "@/widgets/screencorner";
import { execAsync, Variable } from "astal";
import Binding, { bind, kebabify } from "astal/binding";
-import { App, Astal, Gtk } from "astal/gtk3";
+import { App, Astal, Gtk, type Widget } from "astal/gtk3";
import { bar as config } from "config";
import AstalBattery from "gi://AstalBattery";
import AstalBluetooth from "gi://AstalBluetooth";
@@ -20,6 +20,11 @@ import AstalNotifd from "gi://AstalNotifd";
import AstalTray from "gi://AstalTray";
import AstalWp from "gi://AstalWp";
+interface SpacerClassNameProps {
+ beforeSpacer?: boolean;
+ afterSpacer?: boolean;
+}
+
const hyprland = AstalHyprland.get_default();
const getBatteryIcon = (perc: number) => {
@@ -74,19 +79,22 @@ const switchPane = (name: string) => {
}
};
-const OSIcon = () => (
+const spacerClassName = ({ beforeSpacer, afterSpacer }: SpacerClassNameProps) =>
+ `${beforeSpacer ? "before-spacer" : ""} ${afterSpacer ? "after-spacer" : ""}`;
+
+const OSIcon = (props: SpacerClassNameProps) => (
);
-const ActiveWindow = () => (
+const ActiveWindow = (props: SpacerClassNameProps) => (
{
const title = Variable("");
const updateTooltip = (c: AstalHyprland.Client | null) =>
@@ -124,7 +132,7 @@ const ActiveWindow = () => (
);
-const MediaPlaying = () => {
+const MediaPlaying = (props: SpacerClassNameProps) => {
const players = Players.get_default();
const getLabel = (fallback = "") =>
players.lastPlayer ? `${players.lastPlayer.title} - ${players.lastPlayer.artist}` : fallback;
@@ -141,7 +149,7 @@ const MediaPlaying = () => {
setupCustomTooltip(self, bind(label));
}}
>
-
+
players.hookLastPlayer(self, "notify::identity", () => {
@@ -211,7 +219,7 @@ const Workspace = ({ idx }: { idx: number }) => {
);
};
-const Workspaces = () => (
+const Workspaces = (props: SpacerClassNameProps) => (
{
const activeWs = hyprland.focusedClient?.workspace.name;
@@ -220,7 +228,7 @@ const Workspaces = () => (
hyprland.dispatch("workspace", (event.delta_y < 0 ? "-" : "+") + 1);
}}
>
-
+
{bind(config.modules.workspaces.shown).as(
n => Array.from({ length: n }).map((_, idx) => ) // Start from 1
)}
@@ -241,10 +249,10 @@ const TrayItem = (item: AstalTray.TrayItem) => (
);
-const Tray = () => (
+const Tray = (props: SpacerClassNameProps) => (
i.length > 0)}
>
{bind(AstalTray.get_default(), "items").as(i => i.map(TrayItem))}
@@ -420,14 +428,14 @@ const Bluetooth = () => (
);
-const StatusIcons = () => (
-
+const StatusIcons = (props: SpacerClassNameProps) => (
+
);
-const PkgUpdates = () => (
+const PkgUpdates = (props: SpacerClassNameProps) => (
);
-const NotifCount = () => (
+const NotifCount = (props: SpacerClassNameProps) => (
);
-const Battery = () => {
+const Battery = (props: SpacerClassNameProps) => {
const className = Variable.derive(
[bind(AstalBattery.get_default(), "percentage"), bind(AstalBattery.get_default(), "charging")],
- (p, c) => `module battery ${c ? "charging" : p < 0.2 ? "low" : ""}`
+ (p, c) => `module battery ${c ? "charging" : p < 0.2 ? "low" : ""} ${spacerClassName(props)}`
);
const tooltip = Variable.derive(
[bind(AstalBattery.get_default(), "timeToEmpty"), bind(AstalBattery.get_default(), "timeToFull")],
@@ -500,14 +508,14 @@ const Battery = () => {
);
};
-const DateTime = () => (
+const DateTime = (props: SpacerClassNameProps) => (
);
-const DateTimeVertical = () => (
+const DateTimeVertical = (props: SpacerClassNameProps) => (
);
-const Power = () => (
+const Power = (props: SpacerClassNameProps) => (
);
+
+export const BarScreenCorners = ({ monitor }: { monitor: Monitor }) => (
+
+ Astal.WindowAnchor.TOP |
+ Astal.WindowAnchor.LEFT |
+ (v ? Astal.WindowAnchor.BOTTOM : Astal.WindowAnchor.RIGHT)
+ )}
+ visible={bind(bar.style).as(s => s === "embedded")}
+ setup={self =>
+ self.connect("size-allocate", () => self.get_window()?.input_shape_combine_region(new Cairo.Region(), 0, 0))
+ }
+ >
+
+
+
+ (v ? "bottomleft" : "topright"))} />
+
+
+);
--
cgit v1.2.3-freya