nixos-configs/modules/ags/config/greeter.ts

112 lines
2.9 KiB
TypeScript
Raw Normal View History

const { Box, Button, Entry, Label, Menu, MenuItem, Window } = Widget;
const { idle, readFileAsync } = Utils;
2024-02-05 12:00:25 -05:00
const greetd = await Service.import('greetd');
const { Gdk } = imports.gi;
const DEFAULT_NAME = 'matt';
const name = Label(DEFAULT_NAME);
let menu;
const dropdown = Button({
child: name,
setup: () => {
idle(() => {
readFileAsync('/etc/passwd').then((out) => {
const users = out.split('\n')
.map((u) => {
const user = u.split(':');
let i = 2;
return {
name: user[0],
uid: Number(user[i++]),
gid: Number(user[i++]),
desc: user[i++],
home: user[i++],
shell: user[i],
};
})
.filter((u) => {
return u.uid >= 1000 &&
!u.name.includes('nixbld') &&
u.name !== 'nobody';
});
// FIXME: make menu scrollable
menu = Menu({
attach_widget: dropdown,
children: users.map((u) => MenuItem({
on_activate: () => {
name.label = u.name;
},
child: Label({
label: u.name,
justification: 'center',
css: `
min-width: ${dropdown.get_allocated_width() / 2}px;
`,
}),
})),
});
}).catch(print);
});
},
on_primary_click_release: (_, event) => {
menu.popup_at_widget(
dropdown,
Gdk.Gravity.SOUTH,
Gdk.Gravity.NORTH,
event,
);
},
});
2024-02-05 12:00:25 -05:00
const password = Entry({
2024-02-05 12:00:25 -05:00
placeholder_text: 'Password',
visibility: false,
on_accept: () => {
2024-02-06 13:31:36 -05:00
greetd.login(
name.label || '',
2024-02-06 13:31:36 -05:00
password.text || '',
'Hyprland',
).catch((err) => {
response.label = JSON.stringify(err);
});
2024-02-05 12:00:25 -05:00
},
});
2024-02-05 12:00:25 -05:00
const response = Label();
2024-02-05 12:00:25 -05:00
const win = Window({
2024-02-06 13:31:36 -05:00
name: 'greeter',
2024-02-05 12:00:25 -05:00
css: 'background-color: transparent;',
anchor: ['top', 'left', 'right', 'bottom'],
2024-02-06 13:31:36 -05:00
keymode: 'exclusive',
setup: () => {
idle(() => {
password.grab_focus();
});
},
child: Box({
2024-02-05 12:00:25 -05:00
vertical: true,
hpack: 'center',
vpack: 'center',
hexpand: true,
vexpand: true,
children: [
dropdown,
2024-02-05 12:00:25 -05:00
password,
response,
],
}),
});
export default { windows: [win] };