summaryrefslogtreecommitdiff
path: root/src/widgets
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-03-31 23:02:52 +1100
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-03-31 23:02:52 +1100
commit8fab7d4b65cd16769d3ef48e44da3f8ed75582ed (patch)
treecd711556a1f894f8ba8420fe6b249ae58733ca06 /src/widgets
parentbar: add error for no wireplumber (diff)
downloadcaelestia-shell-8fab7d4b65cd16769d3ef48e44da3f8ed75582ed.tar.gz
caelestia-shell-8fab7d4b65cd16769d3ef48e44da3f8ed75582ed.tar.bz2
caelestia-shell-8fab7d4b65cd16769d3ef48e44da3f8ed75582ed.zip
feat: fake screen rounding
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/screencorner.tsx49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/widgets/screencorner.tsx b/src/widgets/screencorner.tsx
new file mode 100644
index 0000000..a55d782
--- /dev/null
+++ b/src/widgets/screencorner.tsx
@@ -0,0 +1,49 @@
+import type { Binding } from "astal";
+import { Gtk, type Widget } from "astal/gtk3";
+import type cairo from "cairo";
+
+type Place = "topleft" | "topright" | "bottomleft" | "bottomright";
+
+export default ({ place, ...rest }: Widget.DrawingAreaProps & { place: Place | Binding<Place> }) => (
+ <drawingarea
+ {...rest}
+ className="screen-corner"
+ setup={self => {
+ self.connect("realize", () => self.get_window()?.set_pass_through(true));
+
+ const r = self.get_style_context().get_property("border-radius", Gtk.StateFlags.NORMAL) as number;
+ self.set_size_request(r, r);
+ self.connect("draw", (_, cr: cairo.Context) => {
+ const c = self.get_style_context().get_background_color(Gtk.StateFlags.NORMAL);
+ const r = self.get_style_context().get_property("border-radius", Gtk.StateFlags.NORMAL) as number;
+ self.set_size_request(r, r);
+
+ switch (typeof place === "string" ? place : place.get()) {
+ case "topleft":
+ cr.arc(r, r, r, Math.PI, (3 * Math.PI) / 2);
+ cr.lineTo(0, 0);
+ break;
+
+ case "topright":
+ cr.arc(0, r, r, (3 * Math.PI) / 2, 2 * Math.PI);
+ cr.lineTo(r, 0);
+ break;
+
+ case "bottomleft":
+ cr.arc(r, 0, r, Math.PI / 2, Math.PI);
+ cr.lineTo(0, r);
+ break;
+
+ case "bottomright":
+ cr.arc(0, 0, r, 0, Math.PI / 2);
+ cr.lineTo(r, r);
+ break;
+ }
+
+ cr.closePath();
+ cr.setSourceRGBA(c.red, c.green, c.blue, c.alpha);
+ cr.fill();
+ });
+ }}
+ />
+);