diff --git a/nixosModules/ags/config/app.ts b/nixosModules/ags/config/app.ts
index ac690a4c..20af41a4 100644
--- a/nixosModules/ags/config/app.ts
+++ b/nixosModules/ags/config/app.ts
@@ -2,8 +2,23 @@
// TODO: quick-settings
// TODO: music player stuff
// TODO: on-screen-keyboard
+// TODO: see if I can bundle each config separately with nix
-import GLib from 'gi://GLib';
+import { programArgs } from 'system';
+
+import binto from './configurations/binto';
+import wim from './configurations/wim';
+
+import greeter from './configurations/greeter';
+import lock from './configurations/lock';
-(await import(`./configurations/${GLib.getenv('CONF')}.ts`)).default();
+switch (programArgs[0]) {
+ case 'binto': binto(); break;
+
+ case 'wim': wim(); break;
+
+ case 'greeter': greeter(); break;
+
+ case 'lock': lock(); break;
+}
diff --git a/nixosModules/ags/config/configurations/binto.ts b/nixosModules/ags/config/configurations/binto.ts
index db27ec3d..8bb571c7 100644
--- a/nixosModules/ags/config/configurations/binto.ts
+++ b/nixosModules/ags/config/configurations/binto.ts
@@ -1,25 +1,25 @@
-export default async() => {
- const { execAsync } = await import('astal');
- const { App } = await import('astal/gtk3');
+import { execAsync } from 'astal';
+import { App } from 'astal/gtk3';
- const style = (await import('../style/main.scss')).default;
+import style from '../style/main.scss';
- const AppLauncher = (await import('../widgets/applauncher/main')).default;
- const Bar = (await import('../widgets/bar/binto')).default;
- const BgLayer = (await import('../widgets/bg-layer/main')).default;
- const Calendar = (await import('../widgets/date/binto')).default;
- const Clipboard = (await import('../widgets/clipboard/main')).default;
- const { NotifPopups, NotifCenter } = await import('../widgets/notifs/binto');
- const OSD = (await import('../widgets/osd/main')).default;
- const PowerMenu = (await import('../widgets/powermenu/main')).default;
- const Screenshot = (await import('../widgets/screenshot/main')).default;
+import AppLauncher from '../widgets/applauncher/main';
+import Bar from '../widgets/bar/binto';
+import BgLayer from '../widgets/bg-layer/main';
+import Calendar from '../widgets/date/binto';
+import Clipboard from '../widgets/clipboard/main';
+import { NotifPopups, NotifCenter } from '../widgets/notifs/binto';
+import OSD from '../widgets/osd/main';
+import PowerMenu from '../widgets/powermenu/main';
+import Screenshot from '../widgets/screenshot/main';
- const { closeAll, perMonitor } = await import('../lib');
- const Brightness = (await import('../services/brightness')).default;
- const GSR = (await import('../services/gpu-screen-recorder')).default;
- const MonitorClicks = (await import('../services/monitor-clicks')).default;
+import { closeAll, perMonitor } from '../lib';
+import Brightness from '../services/brightness';
+import GSR from '../services/gpu-screen-recorder';
+import MonitorClicks from '../services/monitor-clicks';
+export default () => {
App.start({
css: style,
@@ -61,9 +61,8 @@ export default async() => {
PowerMenu();
Screenshot();
- Brightness.initService({
- caps: 'input2::capslock',
- });
+ Brightness.initService({ caps: 'input2::capslock' });
+ GSR.initService();
new MonitorClicks();
},
});
diff --git a/nixosModules/ags/config/configurations/greeter.ts b/nixosModules/ags/config/configurations/greeter.ts
index 3403d29b..ad2517eb 100644
--- a/nixosModules/ags/config/configurations/greeter.ts
+++ b/nixosModules/ags/config/configurations/greeter.ts
@@ -1,12 +1,12 @@
-export default async() => {
- const { execAsync } = await import('astal');
- const { App } = await import('astal/gtk3');
+import { execAsync } from 'astal';
+import { App } from 'astal/gtk3';
- const Greeter = (await import('../widgets/greeter/main')).default;
+import Greeter from '../widgets/greeter/main';
- const style = (await import('../style/greeter.scss')).default;
+import style from '../style/greeter.scss';
+export default () => {
App.start({
css: style,
instanceName: 'greeter',
diff --git a/nixosModules/ags/config/configurations/lock.ts b/nixosModules/ags/config/configurations/lock.ts
index a551efb4..55d56145 100644
--- a/nixosModules/ags/config/configurations/lock.ts
+++ b/nixosModules/ags/config/configurations/lock.ts
@@ -1,11 +1,11 @@
-export default async() => {
- const { App } = await import('astal/gtk3');
+import { App } from 'astal/gtk3';
- const Lockscreen = (await import('../widgets/lockscreen/main')).default;
+import Lockscreen from '../widgets/lockscreen/main';
- const style = (await import('../style/lock.scss')).default;
+import style from '../style/lock.scss';
+export default () => {
App.start({
css: style,
instanceName: 'lock',
diff --git a/nixosModules/ags/config/configurations/wim.ts b/nixosModules/ags/config/configurations/wim.ts
index 2f0aceb3..692f586b 100644
--- a/nixosModules/ags/config/configurations/wim.ts
+++ b/nixosModules/ags/config/configurations/wim.ts
@@ -1,26 +1,26 @@
-export default async() => {
- const { execAsync } = await import('astal');
- const { App } = await import('astal/gtk3');
+import { execAsync } from 'astal';
+import { App } from 'astal/gtk3';
- const style = (await import('../style/main.scss')).default;
+import style from '../style/main.scss';
- const AppLauncher = (await import('../widgets/applauncher/main')).default;
- const Bar = (await import('../widgets/bar/wim')).default;
- const BgLayer = (await import('../widgets/bg-layer/main')).default;
- const Calendar = (await import('../widgets/date/wim')).default;
- const Clipboard = (await import('../widgets/clipboard/main')).default;
- const Corners = (await import('../widgets/corners/main')).default;
- const IconBrowser = (await import('../widgets/icon-browser/main')).default;
- const { NotifPopups, NotifCenter } = await import('../widgets/notifs/wim');
- const OSD = (await import('../widgets/osd/main')).default;
- const PowerMenu = (await import('../widgets/powermenu/main')).default;
- const Screenshot = (await import('../widgets/screenshot/main')).default;
+import AppLauncher from '../widgets/applauncher/main';
+import Bar from '../widgets/bar/wim';
+import BgLayer from '../widgets/bg-layer/main';
+import Calendar from '../widgets/date/wim';
+import Clipboard from '../widgets/clipboard/main';
+import Corners from '../widgets/corners/main';
+import IconBrowser from '../widgets/icon-browser/main';
+import { NotifPopups, NotifCenter } from '../widgets/notifs/wim';
+import OSD from '../widgets/osd/main';
+import PowerMenu from '../widgets/powermenu/main';
+import Screenshot from '../widgets/screenshot/main';
- const { closeAll, perMonitor } = await import('../lib');
- const Brightness = (await import('../services/brightness')).default;
- const MonitorClicks = (await import('../services/monitor-clicks')).default;
+import { closeAll, perMonitor } from '../lib';
+import Brightness from '../services/brightness';
+import MonitorClicks from '../services/monitor-clicks';
+export default () => {
App.start({
css: style,
diff --git a/nixosModules/ags/config/services/gpu-screen-recorder.ts b/nixosModules/ags/config/services/gpu-screen-recorder.ts
index 8509b07a..5e01ab1c 100644
--- a/nixosModules/ags/config/services/gpu-screen-recorder.ts
+++ b/nixosModules/ags/config/services/gpu-screen-recorder.ts
@@ -75,25 +75,28 @@ const notifySend = ({
class GSR extends GObject.Object {
private _lastNotifID: number | undefined;
- constructor() {
- super();
+ public initService() {
+ try {
+ subprocess(
+ ['gsr-start'],
+ (path) => {
+ if (!this._lastNotifID) {
+ console.error('[GSR] ID of warning notif not found');
- subprocess(
- ['gsr-start'],
- (path) => {
- if (!this._lastNotifID) {
- console.error('[GSR] ID of warning notif not found');
-
- setTimeout(() => {
+ setTimeout(() => {
+ this._onSaved(path);
+ }, 1000);
+ }
+ else {
this._onSaved(path);
- }, 1000);
- }
- else {
- this._onSaved(path);
- }
- },
- () => { /**/ },
- );
+ }
+ },
+ () => { /**/ },
+ );
+ }
+ catch (_e) {
+ console.error('Missing dependency for gpu-screen-recorder');
+ }
}
public saveReplay() {
diff --git a/nixosModules/ags/config/widgets/greeter/main.tsx b/nixosModules/ags/config/widgets/greeter/main.tsx
index fbb5af64..668cd050 100644
--- a/nixosModules/ags/config/widgets/greeter/main.tsx
+++ b/nixosModules/ags/config/widgets/greeter/main.tsx
@@ -4,92 +4,84 @@ import { App, Astal, Gtk, Widget } from 'astal/gtk3';
import AstalGreet from 'gi://AstalGreet';
-const DEFAULT_NAME = 'matt';
-const PARSED_INDEX = {
- name: 0,
- uid: 2,
- gid: 3,
- desc: 4,
- home: 5,
- shell: 6,
-};
+export default () => {
+ const DEFAULT_NAME = 'matt';
+ const PARSED_INDEX = {
+ name: 0,
+ uid: 2,
+ gid: 3,
+ desc: 4,
+ home: 5,
+ shell: 6,
+ };
-const parsePasswd = (fileContent: string) => {
- const splitUsers = fileContent.split('\n');
- const parsedUsers = splitUsers.map((u) => {
- const user = u.split(':');
+ const parsePasswd = (fileContent: string) => {
+ const splitUsers = fileContent.split('\n');
+ const parsedUsers = splitUsers.map((u) => {
+ const user = u.split(':');
- return {
- name: user[PARSED_INDEX.name],
- uid: Number(user[PARSED_INDEX.uid]),
- gid: Number(user[PARSED_INDEX.gid]),
- desc: user[PARSED_INDEX.desc],
- home: user[PARSED_INDEX.home],
- shell: user[PARSED_INDEX.shell],
- };
+ return {
+ name: user[PARSED_INDEX.name],
+ uid: Number(user[PARSED_INDEX.uid]),
+ gid: Number(user[PARSED_INDEX.gid]),
+ desc: user[PARSED_INDEX.desc],
+ home: user[PARSED_INDEX.home],
+ shell: user[PARSED_INDEX.shell],
+ };
+ });
+
+ // Filter out system users, nixbld users and nobody
+ return parsedUsers.filter((u) => {
+ return u.uid >= 1000 &&
+ !u.name.includes('nixbld') &&
+ u.name !== 'nobody';
+ });
+ };
+
+ const users = parsePasswd(readFile('/etc/passwd'));
+
+ const dropdown = new Gtk.ComboBoxText();
+
+ dropdown.show_all();
+
+ users.forEach((u) => {
+ dropdown.append(null, u.name);
});
- // Filter out system users, nixbld users and nobody
- return parsedUsers.filter((u) => {
- return u.uid >= 1000 &&
- !u.name.includes('nixbld') &&
- u.name !== 'nobody';
- });
-};
+ const response = as Widget.Label;
-const users = parsePasswd(readFile('/etc/passwd'));
+ const password = (
+ idle(() => {
+ self.grab_focus();
+ })}
-dropdown.show_all();
+ onActivate={(self) => {
+ AstalGreet.login(
+ dropdown.get_active_text() ?? '',
+ self.text || '',
+ 'Hyprland',
+ (_, res) => {
+ try {
+ AstalGreet.login_finish(res);
+ App.quit();
+ }
+ catch (error) {
+ response.label = JSON.stringify(error);
+ }
+ },
+ );
+ }}
+ />
+ );
-users.forEach((u) => {
- dropdown.append(null, u.name);
-});
-
-const response = as Widget.Label;
-
-const password = (
- idle(() => {
- self.grab_focus();
- })}
-
- onActivate={(self) => {
- AstalGreet.login(
- dropdown.get_active_text() ?? '',
- self.text || '',
- 'Hyprland',
- (_, res) => {
- try {
- AstalGreet.login_finish(res);
- App.quit();
- }
- catch (error) {
- response.label = JSON.stringify(error);
- }
- },
- );
- }}
- />
-);
-
-
-export default () => (
-
-
(
valign={Gtk.Align.CENTER}
hexpand
vexpand
- className="linked"
-
- setup={() => {
- idle(() => {
- const usernames = users.map((u) => u.name);
-
- if (usernames.includes(DEFAULT_NAME)) {
- dropdown.set_active(usernames.indexOf(DEFAULT_NAME));
- }
- });
- }}
+ className="base"
>
- {dropdown}
- {password}
-
+
-
-);
+ setup={() => {
+ idle(() => {
+ const usernames = users.map((u) => u.name);
+
+ if (usernames.includes(DEFAULT_NAME)) {
+ dropdown.set_active(usernames.indexOf(DEFAULT_NAME));
+ }
+ });
+ }}
+ >
+ {dropdown}
+ {password}
+
+
+ {response}
+
+
+ );
+};
diff --git a/nixosModules/ags/config/widgets/lockscreen/main.tsx b/nixosModules/ags/config/widgets/lockscreen/main.tsx
index 925cd1d2..995c2eeb 100644
--- a/nixosModules/ags/config/widgets/lockscreen/main.tsx
+++ b/nixosModules/ags/config/widgets/lockscreen/main.tsx
@@ -21,222 +21,221 @@ class BlurredBox extends Widget.Box {
}
-const windows = new Map();
-const blurBGs: BlurredBox[] = [];
+export default () => {
+ const windows = new Map();
+ const blurBGs: BlurredBox[] = [];
-const transition_duration = 1000;
-const WINDOW_MARGINS = -2;
-const ENTRY_SPACING = 20;
-const CLOCK_SPACING = 60;
+ const transition_duration = 1000;
+ const WINDOW_MARGINS = -2;
+ const ENTRY_SPACING = 20;
+ const CLOCK_SPACING = 60;
-const bgCSS = ({ w = 1, h = 1 } = {}) => `
- border: 2px solid rgba(189, 147, 249, 0.8);
- background: rgba(0, 0, 0, 0.2);
- min-height: ${h}px;
- min-width: ${w}px;
- transition: min-height ${transition_duration / 2}ms,
- min-width ${transition_duration / 2}ms;
+ const bgCSS = ({ w = 1, h = 1 } = {}) => `
+ border: 2px solid rgba(189, 147, 249, 0.8);
+ background: rgba(0, 0, 0, 0.2);
+ min-height: ${h}px;
+ min-width: ${w}px;
+ transition: min-height ${transition_duration / 2}ms,
+ min-width ${transition_duration / 2}ms;
`;
-const lock = Lock.prepare_lock();
+ const lock = Lock.prepare_lock();
-const unlock = () => {
- blurBGs.forEach((b) => {
- b.css = bgCSS({
- w: b.geometry.w,
- h: 1,
- });
-
- timeout(transition_duration / 2, () => {
+ const unlock = () => {
+ blurBGs.forEach((b) => {
b.css = bgCSS({
- w: 1,
+ w: b.geometry.w,
h: 1,
});
- });
- });
- timeout(transition_duration, () => {
- lock.unlock_and_destroy();
- Gdk.Display.get_default()?.sync();
- App.quit();
- });
-};
-const Clock = () => {
- const time = Variable('').poll(1000, () => {
- return (new Date().toLocaleString([], {
- hour: 'numeric',
- minute: 'numeric',
- hour12: true,
- }) ?? '')
- .replace('a.m.', 'AM')
- .replace('p.m.', 'PM');
- });
-
- return (
-
- );
-};
-
-const PasswordPrompt = (monitor: Gdk.Monitor, visible: boolean) => {
- const rev = new BlurredBox({ css: bgCSS() });
-
- idle(() => {
- rev.geometry = {
- w: monitor.geometry.width,
- h: monitor.geometry.height,
- };
-
- rev.css = bgCSS({
- w: rev.geometry.w,
- h: 1,
- });
-
- timeout(transition_duration / 2, () => {
- rev.css = bgCSS({
- w: rev.geometry.w,
- h: rev.geometry.h,
+ timeout(transition_duration / 2, () => {
+ b.css = bgCSS({
+ w: 1,
+ h: 1,
+ });
});
});
- });
+ timeout(transition_duration, () => {
+ lock.unlock_and_destroy();
+ Gdk.Display.get_default()?.sync();
+ App.quit();
+ });
+ };
- blurBGs.push(rev);
+ const Clock = () => {
+ const time = Variable('').poll(1000, () => {
+ return (new Date().toLocaleString([], {
+ hour: 'numeric',
+ minute: 'numeric',
+ hour12: true,
+ }) ?? '')
+ .replace('a.m.', 'AM')
+ .replace('p.m.', 'PM');
+ });
-
-
+ );
+ };
+
+ const PasswordPrompt = (monitor: Gdk.Monitor, visible: boolean) => {
+ const rev = new BlurredBox({ css: bgCSS() });
+
+ idle(() => {
+ rev.geometry = {
+ w: monitor.geometry.width,
+ h: monitor.geometry.height,
+ };
+
+ rev.css = bgCSS({
+ w: rev.geometry.w,
+ h: 1,
+ });
+
+ timeout(transition_duration / 2, () => {
+ rev.css = bgCSS({
+ w: rev.geometry.w,
+ h: rev.geometry.h,
+ });
+ });
+ });
+
+ blurBGs.push(rev);
+
+
- {rev}
-
- ;
+
+ {rev}
+
+ ;
- const label = as Widget.Label;
-
- return new Gtk.Window({
- child: visible ?
- (
-
-
-
-
+ const label = as Widget.Label;
+ return new Gtk.Window({
+ child: visible ?
+ (
-
-
- {label}
+
-
+
- self.grab_focus()}
-
- onActivate={(self) => {
- self.sensitive = false;
-
- AstalAuth.Pam.authenticate(self.text ?? '', (_, task) => {
- try {
- AstalAuth.Pam.authenticate_finish(task);
- unlock();
- }
- catch (e) {
- self.text = '';
- label.label = (e as Error).message;
- self.sensitive = true;
- }
- });
- }}
+ className="avatar"
/>
+
+
+ {label}
+
+
+
+ self.grab_focus()}
+
+ onActivate={(self) => {
+ self.sensitive = false;
+
+ AstalAuth.Pam.authenticate(self.text ?? '', (_, task) => {
+ try {
+ AstalAuth.Pam.authenticate_finish(task);
+ unlock();
+ }
+ catch (e) {
+ self.text = '';
+ label.label = (e as Error).message;
+ self.sensitive = true;
+ }
+ });
+ }}
+ />
+
-
- ) :
- ,
- });
-};
+ ) :
+ ,
+ });
+ };
-const createWindow = (monitor: Gdk.Monitor) => {
- const hyprDesc = get_hyprland_monitor_desc(monitor);
- const entryVisible = Vars.mainMonitor === hyprDesc || Vars.dupeLockscreen;
- const win = PasswordPrompt(monitor, entryVisible);
+ const createWindow = (monitor: Gdk.Monitor) => {
+ const hyprDesc = get_hyprland_monitor_desc(monitor);
+ const entryVisible = Vars.mainMonitor === hyprDesc || Vars.dupeLockscreen;
+ const win = PasswordPrompt(monitor, entryVisible);
- windows.set(monitor, win);
-};
+ windows.set(monitor, win);
+ };
-const lock_screen = () => {
- const display = Gdk.Display.get_default();
+ const lock_screen = () => {
+ const display = Gdk.Display.get_default();
- for (let m = 0; m < (display?.get_n_monitors() ?? 0); m++) {
- const monitor = display?.get_monitor(m);
+ for (let m = 0; m < (display?.get_n_monitors() ?? 0); m++) {
+ const monitor = display?.get_monitor(m);
- if (monitor) {
+ if (monitor) {
+ createWindow(monitor);
+ }
+ }
+
+ display?.connect('monitor-added', (_, monitor) => {
createWindow(monitor);
- }
+ });
+
+ lock.lock_lock();
+
+ windows.forEach((win, monitor) => {
+ lock.new_surface(win, monitor);
+ win.show();
+ });
+ };
+
+ const on_finished = () => {
+ lock.destroy();
+ Gdk.Display.get_default()?.sync();
+ App.quit();
+ };
+
+ lock.connect('finished', on_finished);
+
+ if (Vars.hasFprintd) {
+ globalThis.authFinger = () => AstalAuth.Pam.authenticate('', (_, task) => {
+ try {
+ AstalAuth.Pam.authenticate_finish(task);
+ unlock();
+ }
+ catch (e) {
+ console.error((e as Error).message);
+ }
+ });
+ globalThis.authFinger();
}
-
- display?.connect('monitor-added', (_, monitor) => {
- createWindow(monitor);
- });
-
- lock.lock_lock();
-
- windows.forEach((win, monitor) => {
- lock.new_surface(win, monitor);
- win.show();
- });
-};
-
-const on_finished = () => {
- lock.destroy();
- Gdk.Display.get_default()?.sync();
- App.quit();
-};
-
-lock.connect('finished', on_finished);
-
-if (Vars.hasFprintd) {
- globalThis.authFinger = () => AstalAuth.Pam.authenticate('', (_, task) => {
- try {
- AstalAuth.Pam.authenticate_finish(task);
- unlock();
- }
- catch (e) {
- console.error((e as Error).message);
- }
- });
- globalThis.authFinger();
-}
-
-export default () => {
lock_screen();
};
diff --git a/nixosModules/ags/packages.nix b/nixosModules/ags/packages.nix
index 6ee938ae..ed872ee7 100644
--- a/nixosModules/ags/packages.nix
+++ b/nixosModules/ags/packages.nix
@@ -26,8 +26,10 @@ in {
"cava"
"powerprofiles"
"river"
- "docs" # not a lib
- "gjs" # not a lib
+
+ # Not libraries
+ "docs"
+ "gjs"
]
)
++ [gtk-session-lock.packages.${pkgs.system}.default];
@@ -36,10 +38,8 @@ in {
name = "lock";
runtimeInputs = [cfg.package];
text = ''
- export CONF="lock"
-
if [ "$#" == 0 ]; then
- exec ags run ~/${cfg.configDir}
+ exec ags run ~/${cfg.configDir} -a lock
else
exec ags "$@" -i lock
fi
@@ -54,10 +54,8 @@ in {
name = "ags";
runtimeInputs = [cfg.package];
text = ''
- export CONF="${hostName}"
-
if [ "$#" == 0 ]; then
- exec ags run ~/${cfg.configDir}
+ exec ags run ~/${cfg.configDir} -a ${hostName}
else
exec ags "$@"
fi
@@ -67,8 +65,7 @@ in {
name = "agsConf";
runtimeInputs = [cfg.package];
text = ''
- export CONF="$1"
- exec ${cfg.package}/bin/ags run ~/${cfg.configDir}
+ exec ags run ~/${cfg.configDir} -a "$1"
'';
})
]
diff --git a/nixosModules/desktop/manager/ags.nix b/nixosModules/desktop/manager/ags.nix
index 482d3c5e..1ed498be 100644
--- a/nixosModules/desktop/manager/ags.nix
+++ b/nixosModules/desktop/manager/ags.nix
@@ -54,8 +54,7 @@ self: {
];
text = ''
- export CONF="greeter"
- exec ags run ${agsConfig}
+ exec ags run ${agsConfig} -a greeter
'';
})
];