feat(greetd): add list of all normal users as dropdown
All checks were successful
Discord / discord commits (push) Has been skipped
All checks were successful
Discord / discord commits (push) Has been skipped
This commit is contained in:
parent
51e4988599
commit
3ae192b3c1
3 changed files with 73 additions and 13 deletions
|
@ -22,9 +22,6 @@
|
|||
|
||||
|
||||
"block-scoped-var": ["error"],
|
||||
"capitalized-comments": ["warn", "always", {
|
||||
"ignoreConsecutiveComments": true
|
||||
}],
|
||||
"class-methods-use-this": ["error"],
|
||||
"curly": ["warn"],
|
||||
"default-case-last": ["warn"],
|
||||
|
|
|
@ -1,17 +1,76 @@
|
|||
const { idle } = Utils;
|
||||
const { Box, Button, Entry, Label, Menu, MenuItem, Window } = Widget;
|
||||
const { idle, readFileAsync } = Utils;
|
||||
|
||||
const greetd = await Service.import('greetd');
|
||||
|
||||
const name = Widget.Entry({
|
||||
placeholder_text: 'Username',
|
||||
on_accept: () => password.grab_focus(),
|
||||
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';
|
||||
});
|
||||
|
||||
const password = Widget.Entry({
|
||||
// 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,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
const password = Entry({
|
||||
placeholder_text: 'Password',
|
||||
visibility: false,
|
||||
on_accept: () => {
|
||||
greetd.login(
|
||||
name.text || '',
|
||||
name.label || '',
|
||||
password.text || '',
|
||||
'Hyprland',
|
||||
|
||||
|
@ -21,9 +80,9 @@ const password = Widget.Entry({
|
|||
},
|
||||
});
|
||||
|
||||
const response = Widget.Label();
|
||||
const response = Label();
|
||||
|
||||
const win = Widget.Window({
|
||||
const win = Window({
|
||||
name: 'greeter',
|
||||
css: 'background-color: transparent;',
|
||||
anchor: ['top', 'left', 'right', 'bottom'],
|
||||
|
@ -35,14 +94,14 @@ const win = Widget.Window({
|
|||
});
|
||||
},
|
||||
|
||||
child: Widget.Box({
|
||||
child: Box({
|
||||
vertical: true,
|
||||
hpack: 'center',
|
||||
vpack: 'center',
|
||||
hexpand: true,
|
||||
vexpand: true,
|
||||
children: [
|
||||
name,
|
||||
dropdown,
|
||||
password,
|
||||
response,
|
||||
],
|
||||
|
|
4
modules/ags/config/test-greeter.js
Normal file
4
modules/ags/config/test-greeter.js
Normal file
|
@ -0,0 +1,4 @@
|
|||
// Delete /tmp/ags-greeter before and after using this
|
||||
import { transpileTypeScript } from './js/utils.js';
|
||||
|
||||
export default (await transpileTypeScript('greeter')).default;
|
Loading…
Reference in a new issue