♻️ refactor: reorganize windows and widgets in a modular way

plus, better code for bluetooth device pairing and connecting
This commit is contained in:
retrozinndev
2025-09-25 13:19:52 -03:00
parent 7f3e66cc71
commit ba83c673aa
37 changed files with 186 additions and 176 deletions
+1 -1
View File
@@ -23,7 +23,7 @@ import { Clipboard } from "./modules/clipboard";
import { Config } from "./modules/config"; import { Config } from "./modules/config";
import { Gdk, Gtk } from "ags/gtk4"; import { Gdk, Gtk } from "ags/gtk4";
import { createRoot, getScope } from "ags"; import { createRoot, getScope } from "ags";
import { OSDModes, triggerOSD } from "./window/OSD"; import { OSDModes, triggerOSD } from "./window/osd";
import { programArgs, programInvocationName } from "system"; import { programArgs, programInvocationName } from "system";
import { setConsoleLogDomain } from "console"; import { setConsoleLogDomain } from "console";
import { initPlayer } from "./modules/media"; import { initPlayer } from "./modules/media";
+2 -2
View File
@@ -1,16 +1,16 @@
import { Gtk } from "ags/gtk4";
import { Wireplumber } from "./volume"; import { Wireplumber } from "./volume";
import { Windows } from "../windows"; import { Windows } from "../windows";
import { restartInstance } from "./reload-handler"; import { restartInstance } from "./reload-handler";
import { timeout } from "ags/time"; import { timeout } from "ags/time";
import { Runner } from "../runner/Runner"; import { Runner } from "../runner/Runner";
import { showWorkspaceNumber } from "../widget/bar/Workspaces"; import { showWorkspaceNumber } from "../window/bar/widgets/Workspaces";
import { playSystemBell } from "./utils"; import { playSystemBell } from "./utils";
import { player, setPlayer } from "./media"; import { player, setPlayer } from "./media";
import { generalConfig, Shell } from "../app"; import { generalConfig, Shell } from "../app";
import AstalIO from "gi://AstalIO"; import AstalIO from "gi://AstalIO";
import AstalMpris from "gi://AstalMpris"; import AstalMpris from "gi://AstalMpris";
import { Gtk } from "ags/gtk4";
export type RemoteCaller = { export type RemoteCaller = {
+5
View File
@@ -32,6 +32,11 @@ export class Bluetooth extends GObject.Object {
createRoot((_) => { createRoot((_) => {
this.#scope = getScope(); this.#scope = getScope();
if(this.astalBl.adapters.length > 0) {
this.#isAvailable = true;
this.notify("is-available");
}
this.#connections.set( this.#connections.set(
AstalBluetooth.get_default(), AstalBluetooth.get_default(),
AstalBluetooth.get_default().connect("adapter-added", (self, adapter) => { AstalBluetooth.get_default().connect("adapter-added", (self, adapter) => {
@@ -1,11 +1,11 @@
import { Astal, Gdk, Gtk } from "ags/gtk4"; import { Astal, Gdk, Gtk } from "ags/gtk4";
import { execApp, getAppIcon, getApps, getAstalApps } from "../modules/apps"; import { execApp, getAppIcon, getApps, getAstalApps } from "../../modules/apps";
import { getPopupWindowContainer, PopupWindow } from "../widget/PopupWindow"; import { getPopupWindowContainer, PopupWindow } from "../../widget/PopupWindow";
import AstalApps from "gi://AstalApps"; import AstalApps from "gi://AstalApps";
import Pango from "gi://Pango?version=1.0"; import Pango from "gi://Pango?version=1.0";
import { createState, For } from "ags"; import { createState, For } from "ags";
import { escapeUnintendedMarkup } from "../modules/utils"; import { escapeUnintendedMarkup } from "../../modules/utils";
const ignoredKeys = [ const ignoredKeys = [
@@ -1,11 +1,11 @@
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { Tray } from "../widget/bar/Tray"; import { Tray } from "./widgets/Tray";
import { Workspaces } from "../widget/bar/Workspaces"; import { Workspaces } from "./widgets/Workspaces";
import { FocusedClient } from "../widget/bar/FocusedClient"; import { FocusedClient } from "./widgets/FocusedClient";
import { Apps } from "../widget/bar/Apps"; import { Apps } from "./widgets/Apps";
import { Clock } from "../widget/bar/Clock"; import { Clock } from "./widgets/Clock";
import { Status } from "../widget/bar/Status"; import { Status } from "./widgets/Status";
import { Media } from "../widget/bar/Media"; import { Media } from "./widgets/Media";
export const Bar = (mon: number) => { export const Bar = (mon: number) => {
@@ -1,7 +1,8 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Windows } from "../../windows"; import { Windows } from "../../../windows";
import { createBinding } from "ags"; import { createBinding } from "ags";
import { tr } from "../../i18n/intl"; import { tr } from "../../../i18n/intl";
export const Apps = () => export const Apps = () =>
<Gtk.Button class={createBinding(Windows.getDefault(), "openWindows").as((openWindows) => <Gtk.Button class={createBinding(Windows.getDefault(), "openWindows").as((openWindows) =>
@@ -1,8 +1,8 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Windows } from "../../windows"; import { Windows } from "../../../windows";
import { createBinding } from "ags"; import { createBinding } from "ags";
import { time } from "../../modules/utils"; import { time } from "../../../modules/utils";
import { generalConfig } from "../../app"; import { generalConfig } from "../../../app";
export const Clock = () => export const Clock = () =>
@@ -1,7 +1,7 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { createBinding, With } from "ags"; import { createBinding, With } from "ags";
import { variableToBoolean } from "../../modules/utils"; import { variableToBoolean } from "../../../modules/utils";
import { getAppIcon, getSymbolicIcon } from "../../modules/apps"; import { getAppIcon, getSymbolicIcon } from "../../../modules/apps";
import Pango from "gi://Pango?version=1.0"; import Pango from "gi://Pango?version=1.0";
import AstalHyprland from "gi://AstalHyprland"; import AstalHyprland from "gi://AstalHyprland";
@@ -1,10 +1,10 @@
import { createBinding, onCleanup, With } from "ags"; import { createBinding, onCleanup, With } from "ags";
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Separator } from "../Separator"; import { Separator } from "../../../widget/Separator";
import { Windows } from "../../windows"; import { Windows } from "../../../windows";
import { Clipboard } from "../../modules/clipboard"; import { Clipboard } from "../../../modules/clipboard";
import { getPlayerIconFromBusName, variableToBoolean } from "../../modules/utils"; import { getPlayerIconFromBusName, variableToBoolean } from "../../../modules/utils";
import { accessMediaUrl, player, setPlayer } from "../../modules/media"; import { accessMediaUrl, player, setPlayer } from "../../../modules/media";
import GObject from "ags/gobject"; import GObject from "ags/gobject";
import AstalMpris from "gi://AstalMpris"; import AstalMpris from "gi://AstalMpris";
@@ -1,16 +1,16 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Wireplumber } from "../../modules/volume"; import { Wireplumber } from "../../../modules/volume";
import { Notifications } from "../../modules/notifications"; import { Notifications } from "../../../modules/notifications";
import { Windows } from "../../windows"; import { Windows } from "../../../windows";
import { Recording } from "../../modules/recording"; import { Recording } from "../../../modules/recording";
import { Accessor, createBinding, createComputed, With } from "ags"; import { Accessor, createBinding, createComputed, With } from "ags";
import { time, variableToBoolean } from "../../modules/utils"; import { variableToBoolean } from "../../../modules/utils";
import { Bluetooth } from "../../../modules/bluetooth";
import GObject from "ags/gobject"; import GObject from "ags/gobject";
import AstalBluetooth from "gi://AstalBluetooth"; import AstalBluetooth from "gi://AstalBluetooth";
import AstalNetwork from "gi://AstalNetwork"; import AstalNetwork from "gi://AstalNetwork";
import AstalWp from "gi://AstalWp"; import AstalWp from "gi://AstalWp";
import { Bluetooth } from "../../modules/bluetooth";
export const Status = () => export const Status = () =>
@@ -1,6 +1,6 @@
import { createBinding, createComputed, For, With } from "ags"; import { createBinding, createComputed, For, With } from "ags";
import { Gdk, Gtk } from "ags/gtk4"; import { Gdk, Gtk } from "ags/gtk4";
import { variableToBoolean } from "../../modules/utils"; import { variableToBoolean } from "../../../modules/utils";
import GObject from "gi://GObject?version=2.0"; import GObject from "gi://GObject?version=2.0";
import AstalTray from "gi://AstalTray" import AstalTray from "gi://AstalTray"
@@ -1,9 +1,9 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { getAppIcon, getSymbolicIcon } from "../../modules/apps"; import { getAppIcon, getSymbolicIcon } from "../../../modules/apps";
import { Separator } from "../Separator"; import { Separator } from "../../../widget/Separator";
import { generalConfig } from "../../app"; import { generalConfig } from "../../../app";
import { createBinding, createComputed, createState, For, With } from "ags"; import { createBinding, createComputed, createState, For, With } from "ags";
import { variableToBoolean } from "../../modules/utils"; import { variableToBoolean } from "../../../modules/utils";
import AstalHyprland from "gi://AstalHyprland"; import AstalHyprland from "gi://AstalHyprland";
@@ -1,12 +1,12 @@
import { Gdk, Gtk } from "ags/gtk4"; import { Gdk, Gtk } from "ags/gtk4";
import { Separator } from "../widget/Separator"; import { Separator } from "../../widget/Separator";
import { PopupWindow } from "../widget/PopupWindow"; import { PopupWindow } from "../../widget/PopupWindow";
import { BigMedia } from "../widget/center-window/BigMedia"; import { BigMedia } from "./widgets/BigMedia";
import { time, variableToBoolean } from "../modules/utils"; import { time, variableToBoolean } from "../../modules/utils";
import { createBinding } from "ags"; import { createBinding } from "ags";
import { player } from "../../modules/media";
import AstalMpris from "gi://AstalMpris"; import AstalMpris from "gi://AstalMpris";
import { player } from "../modules/media";
export const CenterWindow = (mon: number) => export const CenterWindow = (mon: number) =>
<PopupWindow namespace={"center-window"} marginTop={10} monitor={mon} <PopupWindow namespace={"center-window"} marginTop={10} monitor={mon}
@@ -1,10 +1,10 @@
import { createBinding, For } from "ags"; import { createBinding, For } from "ags";
import { register } from "ags/gobject"; import { register } from "ags/gobject";
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { Clipboard } from "../../modules/clipboard"; import { Clipboard } from "../../../modules/clipboard";
import { accessMediaUrl } from "../../modules/media"; import { accessMediaUrl } from "../../../modules/media";
import { player, setPlayer } from "../../modules/media"; import { player, setPlayer } from "../../../modules/media";
import { pathToURI, variableToBoolean } from "../../modules/utils"; import { pathToURI, variableToBoolean } from "../../../modules/utils";
import AstalMpris from "gi://AstalMpris"; import AstalMpris from "gi://AstalMpris";
import Pango from "gi://Pango?version=1.0"; import Pango from "gi://Pango?version=1.0";
@@ -1,9 +1,9 @@
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { PopupWindow } from "../widget/PopupWindow"; import { PopupWindow } from "../../widget/PopupWindow";
import { QuickActions } from "../widget/control-center/QuickActions"; import { QuickActions } from "./widgets/QuickActions";
import { NotifHistory } from "../widget/control-center/NotifHistory"; import { NotifHistory } from "./widgets/NotifHistory";
import { Tiles } from "../widget/control-center/Tiles"; import { Tiles } from "./widgets/tiles";
import { Sliders } from "../widget/control-center/Sliders"; import { Sliders } from "./widgets/Sliders";
export const ControlCenter = (mon: number) => export const ControlCenter = (mon: number) =>
@@ -1,9 +1,10 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { HistoryNotification, Notifications } from "../../modules/notifications"; import { HistoryNotification, Notifications } from "../../../modules/notifications";
import { NotificationWidget } from "../Notification"; import { NotificationWidget } from "../../../widget/Notification";
import { tr } from "../../i18n/intl"; import { tr } from "../../../i18n/intl";
import { createBinding, For } from "ags"; import { createBinding, For } from "ags";
import AstalNotifd from "gi://AstalNotifd?version=0.1";
import AstalNotifd from "gi://AstalNotifd";
export const NotifHistory = () => export const NotifHistory = () =>
@@ -1,5 +1,5 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Separator } from "../../Separator"; import { Separator } from "../../../widget/Separator";
import { Accessor, createRoot } from "ags"; import { Accessor, createRoot } from "ags";
import { transformWidget, variableToBoolean, WidgetNodeType } from "../../../modules/utils"; import { transformWidget, variableToBoolean, WidgetNodeType } from "../../../modules/utils";
@@ -1,7 +1,7 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Windows } from "../../windows"; import { Windows } from "../../../windows";
import { Wallpaper } from "../../modules/wallpaper"; import { Wallpaper } from "../../../modules/wallpaper";
import { execApp } from "../../modules/apps"; import { execApp } from "../../../modules/apps";
import { Accessor } from "ags"; import { Accessor } from "ags";
import { createPoll } from "ags/time"; import { createPoll } from "ags/time";
@@ -1,13 +1,13 @@
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { Wireplumber } from "../../modules/volume"; import { Wireplumber } from "../../../modules/volume";
import { Pages } from "./Pages"; import { Pages } from "./pages";
import { PageSound } from "./pages/Sound"; import { PageSound } from "./pages/Sound";
import { PageMicrophone } from "./pages/Microphone"; import { PageMicrophone } from "./pages/Microphone";
import { createBinding, With } from "ags"; import { createBinding, With } from "ags";
import { Backlights } from "../../modules/backlight"; import { Backlights } from "../../../modules/backlight";
import { PageBacklight } from "./pages/Backlight";
import AstalWp from "gi://AstalWp"; import AstalWp from "gi://AstalWp";
import { PageBacklight } from "./pages/Backlight";
export let slidersPages: Pages|undefined; export let slidersPages: Pages|undefined;
@@ -1,10 +1,10 @@
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { Backlights } from "../../../modules/backlight"; import { Backlights } from "../../../../modules/backlight";
import { Page, PageButton } from "./Page"; import { Page, PageButton } from "../Page";
import { createBinding, For, With } from "ags"; import { createBinding, For, With } from "ags";
import { addSliderMarksFromMinMax } from "../../../modules/utils"; import { addSliderMarksFromMinMax } from "../../../../modules/utils";
import { userData } from "../../../app"; import { userData } from "../../../../app";
export const PageBacklight = new Page({ export const PageBacklight = new Page({
@@ -1,16 +1,17 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Page, PageButton } from "./Page"; import { Page, PageButton } from "../Page";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { Windows } from "../../../windows"; import { Windows } from "../../../../windows";
import { Notifications } from "../../../modules/notifications"; import { Notifications } from "../../../../modules/notifications";
import { execApp } from "../../../modules/apps"; import { execApp } from "../../../../modules/apps";
import { execAsync } from "ags/process"; import { execAsync } from "ags/process";
import { createBinding, createComputed, For, With } from "ags"; import { createBinding, createComputed, For, With } from "ags";
import { Bluetooth } from "../../../modules/bluetooth"; import { Bluetooth } from "../../../../modules/bluetooth";
import AstalNotifd from "gi://AstalNotifd"; import AstalNotifd from "gi://AstalNotifd";
import AstalBluetooth from "gi://AstalBluetooth"; import AstalBluetooth from "gi://AstalBluetooth";
import Adw from "gi://Adw?version=1"; import Adw from "gi://Adw?version=1";
import Gio from "gi://Gio?version=2.0";
export const BluetoothPage = new Page({ export const BluetoothPage = new Page({
@@ -122,6 +123,13 @@ export const BluetoothPage = new Page({
}); });
function DeviceWidget({ device }: { device: AstalBluetooth.Device }): Gtk.Widget { function DeviceWidget({ device }: { device: AstalBluetooth.Device }): Gtk.Widget {
const pair = async () => {
if(device.paired) return;
device.pair();
device.set_trusted(true);
};
return <PageButton class={createBinding(device, "connected").as(conn => return <PageButton class={createBinding(device, "connected").as(conn =>
conn ? "selected" : "")} title={ conn ? "selected" : "")} title={
createBinding(device, "alias").as(alias => alias ?? "Unknown Device")} createBinding(device, "alias").as(alias => alias ?? "Unknown Device")}
@@ -132,24 +140,25 @@ function DeviceWidget({ device }: { device: AstalBluetooth.Device }): Gtk.Widget
} actionClicked={() => { } actionClicked={() => {
if(device.connected) return; if(device.connected) return;
let skipConnection: boolean = false; pair().then(() => {
if(!device.paired) device.connect_device((_, res) => {
(async () => device.pair())().catch((err: Error) => {
skipConnection = true;
Notifications.getDefault().sendNotification({
appName: "bluetooth",
summary: "Device pairing error",
body: `Couldn't connect to ${device.alias ?? device.name}, an error occurred: ${err.message || err.stack}`,
urgency: AstalNotifd.Urgency.NORMAL
})
}).then(() => device.set_trusted(true));
if(!skipConnection) // get error
(async () => device.connect_device(null))().catch((err: Error) => try { device.connect_device_finish(res); }
catch(e: any) {
Notifications.getDefault().sendNotification({ Notifications.getDefault().sendNotification({
appName: "bluetooth", appName: "bluetooth",
summary: "Device connection error", summary: "Connection Error",
body: `Couldn't connect to ${device.alias ?? device.name}, an error occurred: ${err.message || err.stack}`, body: `An error occurred while attempting to connect to ${
device.alias ?? device.name}: ${(e as Gio.IOErrorEnum).message}`
});
}
});
}).catch((err: Gio.IOErrorEnum) =>
Notifications.getDefault().sendNotification({
appName: "bluetooth",
summary: "Pairing Error",
body: `Couldn't pair with ${device.alias ?? device.name}: ${err.message}`,
urgency: AstalNotifd.Urgency.NORMAL urgency: AstalNotifd.Urgency.NORMAL
}) })
); );
@@ -1,9 +1,9 @@
import { Page, PageButton } from "./Page"; import { Page, PageButton } from "../Page";
import { Wireplumber } from "../../../modules/volume"; import { Wireplumber } from "../../../../modules/volume";
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { createBinding, For } from "ags"; import { createBinding, For } from "ags";
import { lookupIcon } from "../../../modules/apps"; import { lookupIcon } from "../../../../modules/apps";
import AstalWp from "gi://AstalWp?version=0.1"; import AstalWp from "gi://AstalWp?version=0.1";
@@ -1,11 +1,11 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Page, PageButton } from "./Page"; import { Page, PageButton } from "../Page";
import { Windows } from "../../../windows"; import { Windows } from "../../../../windows";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { execApp } from "../../../modules/apps"; import { execApp } from "../../../../modules/apps";
import { Notifications } from "../../../modules/notifications"; import { Notifications } from "../../../../modules/notifications";
import { AskPopup, AskPopupProps } from "../../AskPopup"; import { AskPopup, AskPopupProps } from "../../../../widget/AskPopup";
import { encoder, variableToBoolean } from "../../../modules/utils"; import { encoder, variableToBoolean } from "../../../../modules/utils";
import { createBinding, For, With } from "ags"; import { createBinding, For, With } from "ags";
import GLib from "gi://GLib?version=2.0"; import GLib from "gi://GLib?version=2.0";
@@ -1,8 +1,8 @@
import { Page } from "./Page"; import { Page } from "../Page";
import { NightLight } from "../../../modules/nightlight"; import { NightLight } from "../../../../modules/nightlight";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { addSliderMarksFromMinMax } from "../../../modules/utils"; import { addSliderMarksFromMinMax } from "../../../../modules/utils";
import { createBinding } from "ags"; import { createBinding } from "ags";
export const PageNightLight = new Page({ export const PageNightLight = new Page({
@@ -1,10 +1,10 @@
import { Page, PageButton } from "./Page"; import { Page, PageButton } from "../Page";
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { getAppIcon, lookupIcon } from "../../../modules/apps"; import { getAppIcon, lookupIcon } from "../../../../modules/apps";
import { Wireplumber } from "../../../modules/volume"; import { Wireplumber } from "../../../../modules/volume";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { createBinding, For } from "ags"; import { createBinding, For } from "ags";
import { variableToBoolean } from "../../../modules/utils"; import { variableToBoolean } from "../../../../modules/utils";
import AstalWp from "gi://AstalWp"; import AstalWp from "gi://AstalWp";
import GObject from "gi://GObject?version=2.0"; import GObject from "gi://GObject?version=2.0";
@@ -1,6 +1,6 @@
import { register } from "ags/gobject"; import { register } from "ags/gobject";
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { Page } from "./pages/Page"; import { Page } from "../Page";
import { timeout } from "ags/time"; import { timeout } from "ags/time";
import AstalIO from "gi://AstalIO"; import AstalIO from "gi://AstalIO";
@@ -1,15 +1,15 @@
import { Tile } from "./Tile"; import { Tile } from "./Tile";
import AstalBluetooth from "gi://AstalBluetooth";
import { BluetoothPage } from "../pages/Bluetooth"; import { BluetoothPage } from "../pages/Bluetooth";
import { TilesPages } from "../Tiles"; import { TilesPages } from "../tiles";
import { createBinding, createComputed } from "ags"; import { createBinding, createComputed } from "ags";
import { Bluetooth } from "../../../modules/bluetooth"; import { Bluetooth } from "../../../../modules/bluetooth";
import AstalBluetooth from "gi://AstalBluetooth";
export const TileBluetooth = () => export const TileBluetooth = () =>
<Tile title={"Bluetooth"} visible={ <Tile title={"Bluetooth"} visible={createBinding(Bluetooth.getDefault(), "isAvailable")}
createBinding(Bluetooth.getDefault(), "adapter").as(Boolean) description={createBinding(AstalBluetooth.get_default(), "adapters").as((connected) => {
} description={createBinding(AstalBluetooth.get_default(), "isConnected").as((connected) => {
if(!connected) return ""; if(!connected) return "";
const connectedDevs = AstalBluetooth.get_default().devices.filter(dev => dev.connected); const connectedDevs = AstalBluetooth.get_default().devices.filter(dev => dev.connected);
@@ -1,6 +1,6 @@
import { Notifications } from "../../../modules/notifications"; import { Notifications } from "../../../../modules/notifications";
import { Tile } from "./Tile"; import { Tile } from "./Tile";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { createBinding } from "ags"; import { createBinding } from "ags";
export const TileDND = () => export const TileDND = () =>
@@ -1,12 +1,14 @@
import { execAsync } from "ags/process"; import { execAsync } from "ags/process";
import { Tile } from "./Tile"; import { Tile } from "./Tile";
import AstalNetwork from "gi://AstalNetwork";
import { PageNetwork } from "../pages/Network"; import { PageNetwork } from "../pages/Network";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { TilesPages } from "../Tiles"; import { TilesPages } from "../tiles";
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { createBinding, createComputed, With } from "ags"; import { createBinding, createComputed, With } from "ags";
import AstalNetwork from "gi://AstalNetwork";
export const TileNetwork = () => <Gtk.Box> export const TileNetwork = () => <Gtk.Box>
<With value={createComputed([ <With value={createComputed([
createBinding(AstalNetwork.get_default(), "primary"), createBinding(AstalNetwork.get_default(), "primary"),
@@ -1,11 +1,12 @@
import { Tile } from "./Tile"; import { Tile } from "./Tile";
import { NightLight } from "../../../modules/nightlight"; import { NightLight } from "../../../../modules/nightlight";
import { PageNightLight } from "../pages/NightLight"; import { PageNightLight } from "../pages/NightLight";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { TilesPages } from "../Tiles"; import { TilesPages } from "../tiles";
import { isInstalled } from "../../../modules/utils"; import { isInstalled } from "../../../../modules/utils";
import { createBinding, createComputed } from "ags"; import { createBinding, createComputed } from "ags";
export const TileNightLight = () => export const TileNightLight = () =>
<Tile title={tr("control_center.tiles.night_light.title")} <Tile title={tr("control_center.tiles.night_light.title")}
icon={"weather-clear-night-symbolic"} icon={"weather-clear-night-symbolic"}
@@ -1,7 +1,7 @@
import { Tile } from "./Tile"; import { Tile } from "./Tile";
import { Recording } from "../../../modules/recording"; import { Recording } from "../../../../modules/recording";
import { tr } from "../../../i18n/intl"; import { tr } from "../../../../i18n/intl";
import { isInstalled, time } from "../../../modules/utils"; import { isInstalled } from "../../../../modules/utils";
import { createBinding, createComputed } from "ags"; import { createBinding, createComputed } from "ags";
@@ -9,18 +9,12 @@ export const TileRecording = () =>
<Tile title={tr("control_center.tiles.recording.title")} <Tile title={tr("control_center.tiles.recording.title")}
description={createComputed([ description={createComputed([
createBinding(Recording.getDefault(), "recording"), createBinding(Recording.getDefault(), "recording"),
time createBinding(Recording.getDefault(), "recordingTime")
], (recording, dateTime) => { ], (recording, time) => {
if(!recording || !Recording.getDefault().startedAt) if(!recording || !Recording.getDefault().startedAt)
return tr("control_center.tiles.recording.disabled_desc") || "Start recording"; return tr("control_center.tiles.recording.disabled_desc") || "Start recording";
const startedAtSeconds = dateTime.to_unix() - Recording.getDefault().startedAt!; return time;
if(startedAtSeconds <= 0) return "00:00";
const minutes = Math.floor(startedAtSeconds / 60);
const seconds = Math.floor(startedAtSeconds % 60);
return `${ minutes < 10 ? `0${minutes}` : minutes }:${ seconds < 10 ? `0${seconds}` : seconds }`;
})} })}
icon={"media-record-symbolic"} icon={"media-record-symbolic"}
visible={isInstalled("wf-recorder")} visible={isInstalled("wf-recorder")}
@@ -1,15 +1,13 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { createBinding } from "ags"; import { createBinding } from "ags";
import { omitObjectKeys, variableToBoolean } from "../../../modules/utils"; import { omitObjectKeys, variableToBoolean } from "../../../../modules/utils";
import { property, register, signal } from "ags/gobject"; import { property, register, signal } from "ags/gobject";
import Pango from "gi://Pango?version=1.0"; import Pango from "gi://Pango?version=1.0";
export { Tile };
@register({ GTypeName: "Tile" }) @register({ GTypeName: "Tile" })
class Tile extends Gtk.Box { export class Tile extends Gtk.Box {
@signal(Boolean) toggled(_state: boolean) {} @signal(Boolean) toggled(_state: boolean) {}
@signal() enabled() {} @signal() enabled() {}
@signal() disabled() {} @signal() disabled() {}
@@ -1,10 +1,10 @@
import { Gtk } from "ags/gtk4"; import { Gtk } from "ags/gtk4";
import { TileNetwork } from "./tiles/Network"; import { TileNetwork } from "./Network";
import { TileBluetooth } from "./tiles/Bluetooth"; import { TileBluetooth } from "./Bluetooth";
import { TileDND } from "./tiles/DoNotDisturb"; import { TileDND } from "./DoNotDisturb";
import { TileRecording } from "./tiles/Recording"; import { TileRecording } from "./Recording";
import { TileNightLight } from "./tiles/NightLight"; import { TileNightLight } from "./NightLight";
import { Pages } from "./Pages"; import { Pages } from "../pages";
export let TilesPages: Pages|undefined; export let TilesPages: Pages|undefined;
@@ -1,12 +1,13 @@
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { createBinding, createComputed, For } from "ags"; import { createBinding, createComputed, For } from "ags";
import { Notifications } from "../modules/notifications"; import { Notifications } from "../../modules/notifications";
import { NotificationWidget } from "../widget/Notification"; import { NotificationWidget } from "../../widget/Notification";
import { generalConfig } from "../app"; import { generalConfig } from "../../app";
import AstalNotifd from "gi://AstalNotifd"; import AstalNotifd from "gi://AstalNotifd";
import Adw from "gi://Adw?version=1"; import Adw from "gi://Adw?version=1";
const size = 450; const size = 450;
export const FloatingNotifications = (mon: number) => export const FloatingNotifications = (mon: number) =>
@@ -1,10 +1,10 @@
import { Astal, Gdk, Gtk } from "ags/gtk4"; import { Astal, Gdk, Gtk } from "ags/gtk4";
import { execAsync } from "ags/process"; import { execAsync } from "ags/process";
import { generalConfig } from "../app"; import { generalConfig } from "../../app";
import { AskPopup } from "../widget/AskPopup"; import { AskPopup } from "../../widget/AskPopup";
import { Notifications } from "../modules/notifications"; import { Notifications } from "../../modules/notifications";
import { NightLight } from "../modules/nightlight"; import { NightLight } from "../../modules/nightlight";
import { time } from "../modules/utils"; import { time } from "../../modules/utils";
import GObject from "ags/gobject"; import GObject from "ags/gobject";
import AstalNotifd from "gi://AstalNotifd"; import AstalNotifd from "gi://AstalNotifd";
@@ -1,9 +1,9 @@
import { Astal, Gtk } from "ags/gtk4"; import { Astal, Gtk } from "ags/gtk4";
import { Accessor, createBinding, createState, With } from "ags"; import { Accessor, createBinding, createState, With } from "ags";
import { Wireplumber } from "../modules/volume"; import { Wireplumber } from "../../modules/volume";
import { Windows } from "../windows"; import { Windows } from "../../windows";
import { Backlights } from "../modules/backlight"; import { Backlights } from "../../modules/backlight";
import { construct, variableToBoolean } from "../modules/utils"; import { construct, variableToBoolean } from "../../modules/utils";
import GObject, { ParamSpec, property, register } from "ags/gobject"; import GObject, { ParamSpec, property, register } from "ags/gobject";
import Pango from "gi://Pango?version=1.0"; import Pango from "gi://Pango?version=1.0";
+10 -12
View File
@@ -1,21 +1,19 @@
import { Astal } from "ags/gtk4"; import { Astal } from "ags/gtk4";
import { Bar } from "./window/Bar";
import { variableToBoolean } from "./modules/utils";
import { OSD } from "./window/OSD";
import { ControlCenter } from "./window/ControlCenter";
import { FloatingNotifications } from "./window/FloatingNotifications";
import { CenterWindow } from "./window/CenterWindow";
import { LogoutMenu } from "./window/LogoutMenu";
import { AppsWindow } from "./window/AppsWindow";
import { createRoot, getScope, onCleanup } from "ags";
import { Shell } from "./app"; import { Shell } from "./app";
import GObject, { getter, register, signal } from "ags/gobject"; import GObject, { getter, register, signal } from "ags/gobject";
import { variableToBoolean } from "./modules/utils";
import { createRoot, getScope, onCleanup } from "ags";
import { Bar } from "./window/bar";
import { OSD } from "./window/osd";
import { ControlCenter } from "./window/control-center";
import { FloatingNotifications } from "./window/floating-notifications";
import { CenterWindow } from "./window/center-window";
import { LogoutMenu } from "./window/logout-menu";
import { AppsWindow } from "./window/apps-window";
import AstalHyprland from "gi://AstalHyprland"; import AstalHyprland from "gi://AstalHyprland";
export { Windows };
export type WindowInstance = { instance?: Astal.Window, connections: Array<number> }; export type WindowInstance = { instance?: Astal.Window, connections: Array<number> };
export type WindowData = { export type WindowData = {
create: () => (Astal.Window | Array<Astal.Window>); create: () => (Astal.Window | Array<Astal.Window>);
@@ -32,7 +30,7 @@ export type WindowData = {
* monitor, or all available monitors! * monitor, or all available monitors!
*/ */
@register({ GTypeName: "Windows" }) @register({ GTypeName: "Windows" })
class Windows extends GObject.Object { export class Windows extends GObject.Object {
private static instance: (Windows | null); private static instance: (Windows | null);
declare $signals: GObject.Object.SignalSignatures & { declare $signals: GObject.Object.SignalSignatures & {