diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-03-31 23:02:52 +1100 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-03-31 23:02:52 +1100 |
| commit | 8fab7d4b65cd16769d3ef48e44da3f8ed75582ed (patch) | |
| tree | cd711556a1f894f8ba8420fe6b249ae58733ca06 /src/widgets | |
| parent | bar: add error for no wireplumber (diff) | |
| download | caelestia-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.tsx | 49 |
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(); + }); + }} + /> +); |