diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-01-15 21:47:51 +1100 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-01-15 21:47:51 +1100 |
| commit | 0592075b4e04d5c67fa0546071d19b80a12947c5 (patch) | |
| tree | bd3341579631d6e0b4f73423ef93becec8711ce1 | |
| parent | osds: more visible (diff) | |
| download | caelestia-shell-0592075b4e04d5c67fa0546071d19b80a12947c5.tar.gz caelestia-shell-0592075b4e04d5c67fa0546071d19b80a12947c5.tar.bz2 caelestia-shell-0592075b4e04d5c67fa0546071d19b80a12947c5.zip | |
bar: network and bluetooth actions
Do stuff on click
| -rw-r--r-- | modules/bar.tsx | 149 |
1 files changed, 91 insertions, 58 deletions
diff --git a/modules/bar.tsx b/modules/bar.tsx index 933fa5e..6821b94 100644 --- a/modules/bar.tsx +++ b/modules/bar.tsx @@ -1,7 +1,7 @@ import { execAsync, GLib, register, Variable } from "astal"; import { bind, kebabify } from "astal/binding"; import { App, Astal, astalify, Gdk, Gtk, type ConstructProps } from "astal/gtk3"; -import AstalBluetooth01 from "gi://AstalBluetooth"; +import AstalBluetooth from "gi://AstalBluetooth"; import AstalHyprland from "gi://AstalHyprland"; import AstalNetwork from "gi://AstalNetwork"; import AstalNotifd from "gi://AstalNotifd"; @@ -189,12 +189,27 @@ const TrayItem = (item: AstalTray.TrayItem) => { const Tray = () => <box className="module tray">{bind(AstalTray.get_default(), "items").as(i => i.map(TrayItem))}</box>; const Network = () => ( - <stack - transitionType={Gtk.StackTransitionType.SLIDE_UP_DOWN} - transitionDuration={120} - shown={bind(AstalNetwork.get_default(), "primary").as(p => - p === AstalNetwork.Primary.WIFI ? "wifi" : "wired" - )} + <button + onClick={(_, event) => { + const network = AstalNetwork.get_default(); + if (event.button === Astal.MouseButton.PRIMARY) { + // TODO: networks panel + } else if (event.button === Astal.MouseButton.SECONDARY) network.wifi.enabled = !network.wifi.enabled; + else if (event.button === Astal.MouseButton.MIDDLE) + execAsync("uwsm app -- gnome-control-center wifi").catch(() => { + network.wifi.scan(); + execAsync( + "uwsm app -- foot -T nmtui fish -c 'sleep .1; set -e COLORTERM; TERM=xterm-old nmtui connect'" + ).catch(err => { + // Idk why but foot always throws this error when it opens + if ( + err.message !== + "warn: wayland.c:1619: compositor does not implement the XDG toplevel icon protocol\nwarn: terminal.c:1973: slave exited with signal 1 (Hangup)" + ) + console.error(err); + }); + }); + }} setup={self => { const network = AstalNetwork.get_default(); const tooltipText = Variable(""); @@ -227,64 +242,76 @@ const Network = () => ( }} > <stack - name="wifi" transitionType={Gtk.StackTransitionType.SLIDE_UP_DOWN} transitionDuration={120} - setup={self => { - const network = AstalNetwork.get_default(); - const update = () => { - if (network.wifi.internet === AstalNetwork.Internet.CONNECTED) - self.shown = String(Math.ceil(network.wifi.strength / 25)); - else if (network.wifi.internet === AstalNetwork.Internet.CONNECTING) self.shown = "connecting"; - else self.shown = "disconnected"; - }; - self.hook(network.wifi, "notify::internet", update); - self.hook(network.wifi, "notify::strength", update); - update(); - }} + shown={bind(AstalNetwork.get_default(), "primary").as(p => + p === AstalNetwork.Primary.WIFI ? "wifi" : "wired" + )} > - <label className="icon" label="wifi_off" name="disconnected" /> - <label className="icon" label="settings_ethernet" name="connecting" /> - <label className="icon" label="signal_wifi_0_bar" name="0" /> - <label className="icon" label="network_wifi_1_bar" name="1" /> - <label className="icon" label="network_wifi_2_bar" name="2" /> - <label className="icon" label="network_wifi_3_bar" name="3" /> - <label className="icon" label="signal_wifi_4_bar" name="4" /> - </stack> - <stack - name="wired" - transitionType={Gtk.StackTransitionType.SLIDE_UP_DOWN} - transitionDuration={120} - setup={self => { - const network = AstalNetwork.get_default(); - const update = () => { - if (network.primary !== AstalNetwork.Primary.WIRED) return; + <stack + name="wifi" + transitionType={Gtk.StackTransitionType.SLIDE_UP_DOWN} + transitionDuration={120} + setup={self => { + const network = AstalNetwork.get_default(); + const update = () => { + if (network.wifi.internet === AstalNetwork.Internet.CONNECTED) + self.shown = String(Math.ceil(network.wifi.strength / 25)); + else if (network.wifi.internet === AstalNetwork.Internet.CONNECTING) self.shown = "connecting"; + else self.shown = "disconnected"; + }; + self.hook(network.wifi, "notify::internet", update); + self.hook(network.wifi, "notify::strength", update); + update(); + }} + > + <label className="icon" label="wifi_off" name="disconnected" /> + <label className="icon" label="settings_ethernet" name="connecting" /> + <label className="icon" label="signal_wifi_0_bar" name="0" /> + <label className="icon" label="network_wifi_1_bar" name="1" /> + <label className="icon" label="network_wifi_2_bar" name="2" /> + <label className="icon" label="network_wifi_3_bar" name="3" /> + <label className="icon" label="signal_wifi_4_bar" name="4" /> + </stack> + <stack + name="wired" + transitionType={Gtk.StackTransitionType.SLIDE_UP_DOWN} + transitionDuration={120} + setup={self => { + const network = AstalNetwork.get_default(); + const update = () => { + if (network.primary !== AstalNetwork.Primary.WIRED) return; - if (network.wired.internet === AstalNetwork.Internet.CONNECTED) self.shown = "connected"; - else if (network.wired.internet === AstalNetwork.Internet.CONNECTING) self.shown = "connecting"; - else self.shown = "disconnected"; - }; - self.hook(network, "notify::primary", update); - if (network.wired) self.hook(network.wired, "notify::internet", update); - update(); - }} - > - <label className="icon" label="wifi_off" name="disconnected" /> - <label className="icon" label="settings_ethernet" name="connecting" /> - <label className="icon" label="lan" name="connected" /> + if (network.wired.internet === AstalNetwork.Internet.CONNECTED) self.shown = "connected"; + else if (network.wired.internet === AstalNetwork.Internet.CONNECTING) self.shown = "connecting"; + else self.shown = "disconnected"; + }; + self.hook(network, "notify::primary", update); + if (network.wired) self.hook(network.wired, "notify::internet", update); + update(); + }} + > + <label className="icon" label="wifi_off" name="disconnected" /> + <label className="icon" label="settings_ethernet" name="connecting" /> + <label className="icon" label="lan" name="connected" /> + </stack> </stack> - </stack> + </button> ); const Bluetooth = () => ( - <stack - transitionType={Gtk.StackTransitionType.SLIDE_UP_DOWN} - transitionDuration={120} - shown={bind(AstalBluetooth01.get_default(), "isPowered").as(p => (p ? "enabled" : "disabled"))} + <button + onClick={(_, event) => { + if (event.button === Astal.MouseButton.PRIMARY) { + // TODO: bluetooth panel + } else if (event.button === Astal.MouseButton.SECONDARY) AstalBluetooth.get_default().toggle(); + else if (event.button === Astal.MouseButton.MIDDLE) + execAsync("uwsm app -- blueman-manager").catch(console.error); + }} setup={self => { const tooltipText = Variable(""); const update = () => { - const devices = AstalBluetooth01.get_default() + const devices = AstalBluetooth.get_default() .get_devices() .filter(d => d.connected); tooltipText.set( @@ -293,14 +320,20 @@ const Bluetooth = () => ( : "No connected devices" ); }; - self.hook(AstalBluetooth01.get_default(), "notify", update); + self.hook(AstalBluetooth.get_default(), "notify", update); // TODO: fix not updating update(); setupCustomTooltip(self, bind(tooltipText)); }} > - <label className="icon" label="bluetooth" name="enabled" /> - <label className="icon" label="bluetooth_disabled" name="disabled" /> - </stack> + <stack + transitionType={Gtk.StackTransitionType.SLIDE_UP_DOWN} + transitionDuration={120} + shown={bind(AstalBluetooth.get_default(), "isPowered").as(p => (p ? "enabled" : "disabled"))} + > + <label className="icon" label="bluetooth" name="enabled" /> + <label className="icon" label="bluetooth_disabled" name="disabled" /> + </stack> + </button> ); const StatusIcons = () => ( |