feat(ags): replace hyprlock with ags
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
d98290a6e4
commit
94ce797784
11 changed files with 201 additions and 75 deletions
|
@ -36,6 +36,6 @@ in {
|
||||||
polkit-1.text = mkDefault (mkBefore grosshackConf);
|
polkit-1.text = mkDefault (mkBefore grosshackConf);
|
||||||
|
|
||||||
# FIXME: sometimes can't use password
|
# FIXME: sometimes can't use password
|
||||||
hyprlock.text = mkDefault (mkBefore grosshackConf);
|
ags.text = mkDefault (mkBefore grosshackConf);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
BIN
flake.lock
BIN
flake.lock
Binary file not shown.
BIN
flake.nix
BIN
flake.nix
Binary file not shown.
3
modules/ags/config/lockscreen.js
Normal file
3
modules/ags/config/lockscreen.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import { transpileTypeScript } from './js/utils.js';
|
||||||
|
|
||||||
|
export default (await transpileTypeScript('lockscreen')).default;
|
8
modules/ags/config/lockscreen.ts
Normal file
8
modules/ags/config/lockscreen.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import LaunchLockscreen from './ts/lockscreen/main.ts';
|
||||||
|
|
||||||
|
|
||||||
|
LaunchLockscreen();
|
||||||
|
|
||||||
|
App.config({
|
||||||
|
icons: './icons',
|
||||||
|
});
|
5
modules/ags/config/scss/lockscreen.scss
Normal file
5
modules/ags/config/scss/lockscreen.scss
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@import './common';
|
||||||
|
|
||||||
|
window {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
175
modules/ags/config/ts/lockscreen/main.ts
Normal file
175
modules/ags/config/ts/lockscreen/main.ts
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
const { Box, Entry, Label, Separator, Window } = Widget;
|
||||||
|
|
||||||
|
import Gdk from 'gi://Gdk?version=3.0';
|
||||||
|
import Gtk from 'gi://Gtk?version=3.0';
|
||||||
|
import Lock from 'gi://GtkSessionLock?version=0.1';
|
||||||
|
|
||||||
|
/* Types */
|
||||||
|
import { Box as AgsBox } from 'types/widgets/box';
|
||||||
|
|
||||||
|
|
||||||
|
const lock = Lock.prepare_lock();
|
||||||
|
const windows: Gtk.Window[] = [];
|
||||||
|
const blurBGs: AgsBox<Gtk.Widget, { geometry: { w: number, h: number }; }>[] = [];
|
||||||
|
|
||||||
|
const transition_duration = 1000;
|
||||||
|
const windowMargins = -2;
|
||||||
|
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 unlock = () => {
|
||||||
|
blurBGs.forEach((b) => {
|
||||||
|
b.css = bgCSS({
|
||||||
|
w: b.attribute.geometry.w,
|
||||||
|
h: 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
Utils.timeout(transition_duration / 2, () => {
|
||||||
|
b.css = bgCSS({
|
||||||
|
w: 1,
|
||||||
|
h: 1,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
Utils.timeout(transition_duration, () => {
|
||||||
|
lock.unlock_and_destroy();
|
||||||
|
Gdk.Display.get_default()?.sync();
|
||||||
|
App.quit();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const PasswordPrompt = (monitor: Gdk.Monitor) => {
|
||||||
|
const rev = Box({
|
||||||
|
css: bgCSS(),
|
||||||
|
attribute: {
|
||||||
|
geometry: {} as { w: number, h: number },
|
||||||
|
},
|
||||||
|
|
||||||
|
setup: (self) => Utils.idle(() => {
|
||||||
|
self.attribute.geometry = {
|
||||||
|
w: monitor.geometry.width,
|
||||||
|
h: monitor.geometry.height,
|
||||||
|
};
|
||||||
|
|
||||||
|
self.css = bgCSS({
|
||||||
|
w: self.attribute.geometry.w,
|
||||||
|
h: 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
Utils.timeout(transition_duration / 2, () => {
|
||||||
|
self.css = bgCSS({
|
||||||
|
w: self.attribute.geometry.w,
|
||||||
|
h: self.attribute.geometry.h,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
blurBGs.push(rev);
|
||||||
|
|
||||||
|
Window({
|
||||||
|
name: `blur-bg-${monitor.get_model()}`,
|
||||||
|
gdkmonitor: monitor,
|
||||||
|
layer: 'overlay',
|
||||||
|
anchor: ['top', 'bottom', 'right', 'left'],
|
||||||
|
margins: [windowMargins],
|
||||||
|
exclusivity: 'ignore',
|
||||||
|
|
||||||
|
child: Box({
|
||||||
|
hexpand: false,
|
||||||
|
vexpand: false,
|
||||||
|
hpack: 'center',
|
||||||
|
vpack: 'center',
|
||||||
|
child: rev,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const label = Label('Enter password:');
|
||||||
|
|
||||||
|
return new Gtk.Window({
|
||||||
|
child: Widget.Box({
|
||||||
|
vertical: true,
|
||||||
|
vpack: 'center',
|
||||||
|
hpack: 'center',
|
||||||
|
spacing: 16,
|
||||||
|
|
||||||
|
children: [
|
||||||
|
Box({
|
||||||
|
hpack: 'center',
|
||||||
|
class_name: 'avatar',
|
||||||
|
}),
|
||||||
|
|
||||||
|
Box({
|
||||||
|
class_name: 'entry-box',
|
||||||
|
vertical: true,
|
||||||
|
children: [
|
||||||
|
label,
|
||||||
|
|
||||||
|
Separator(),
|
||||||
|
|
||||||
|
Entry({
|
||||||
|
hpack: 'center',
|
||||||
|
xalign: 0.5,
|
||||||
|
visibility: false,
|
||||||
|
placeholder_text: 'password',
|
||||||
|
|
||||||
|
on_accept: (self) => {
|
||||||
|
self.sensitive = false;
|
||||||
|
|
||||||
|
Utils.authenticate(self.text ?? '')
|
||||||
|
.then(() => unlock())
|
||||||
|
.catch((e) => {
|
||||||
|
self.text = '';
|
||||||
|
label.label = e.message;
|
||||||
|
self.sensitive = true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}).on('realize', (entry) => entry.grab_focus()),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const createWindow = (monitor: Gdk.Monitor) => {
|
||||||
|
const win = PasswordPrompt(monitor);
|
||||||
|
|
||||||
|
windows.push(win);
|
||||||
|
// @ts-expect-error should be fine
|
||||||
|
lock.new_surface(win, monitor);
|
||||||
|
win.show();
|
||||||
|
};
|
||||||
|
|
||||||
|
const on_locked = () => {
|
||||||
|
const display = Gdk.Display.get_default();
|
||||||
|
|
||||||
|
for (let m = 0; m < (display?.get_n_monitors() ?? 0); m++) {
|
||||||
|
const monitor = display?.get_monitor(m);
|
||||||
|
|
||||||
|
if (monitor) {
|
||||||
|
createWindow(monitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
display?.connect('monitor-added', (_, monitor) => {
|
||||||
|
createWindow(monitor);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const on_finished = () => {
|
||||||
|
lock.destroy();
|
||||||
|
Gdk.Display.get_default()?.sync();
|
||||||
|
App.quit();
|
||||||
|
};
|
||||||
|
|
||||||
|
lock.connect('locked', on_locked);
|
||||||
|
lock.connect('finished', on_finished);
|
||||||
|
|
||||||
|
|
||||||
|
export default () => lock.lock_lock();
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
flakeDir = config.environment.variables.FLAKE;
|
flakeDir = config.environment.variables.FLAKE;
|
||||||
isTouchscreen = config.hardware.sensor.iio.enable;
|
isTouchscreen = config.hardware.sensor.iio.enable;
|
||||||
gtk-lock = gtk-session-lock.packages.${pkgs.system}.default;
|
gtkSessionLock = gtk-session-lock.packages.${pkgs.system}.default;
|
||||||
in {
|
in {
|
||||||
# Enable pam for ags and astal
|
# Enable pam for ags and astal
|
||||||
security.pam.services.ags = {};
|
security.pam.services.ags = {};
|
||||||
|
@ -57,14 +57,14 @@ in {
|
||||||
enable = true;
|
enable = true;
|
||||||
extraPackages = with pkgs; [
|
extraPackages = with pkgs; [
|
||||||
libadwaita
|
libadwaita
|
||||||
gtk-lock
|
gtkSessionLock
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.ags = {
|
programs.ags = {
|
||||||
enable = true;
|
enable = true;
|
||||||
extraPackages = [
|
extraPackages = [
|
||||||
gtk-lock
|
gtkSessionLock
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ in {
|
||||||
source = "${config.programs.ags.finalPackage}/share/com.github.Aylur.ags/types";
|
source = "${config.programs.ags.finalPackage}/share/com.github.Aylur.ags/types";
|
||||||
recursive = true;
|
recursive = true;
|
||||||
};
|
};
|
||||||
"${agsConfigDir}/config/types/gtk-session-lock".source = pkgs.callPackage ./gtk-session-lock-types {inherit gtk-lock;};
|
"${agsConfigDir}/config/types/gtk-session-lock".source = pkgs.callPackage ./gtk-session-lock-types {inherit gtkSessionLock;};
|
||||||
"${agsConfigDir}/config/config.js".text = configJs;
|
"${agsConfigDir}/config/config.js".text = configJs;
|
||||||
}
|
}
|
||||||
// (import ./icons.nix {inherit pkgs agsConfigDir;});
|
// (import ./icons.nix {inherit pkgs agsConfigDir;});
|
||||||
|
@ -120,6 +120,8 @@ in {
|
||||||
|
|
||||||
layerrule = [
|
layerrule = [
|
||||||
"noanim, ^(?!win-).*"
|
"noanim, ^(?!win-).*"
|
||||||
|
"blur, ^(blur-bg.*)"
|
||||||
|
"ignorealpha 0.19, ^(blur-bg.*)"
|
||||||
];
|
];
|
||||||
|
|
||||||
exec-once = [
|
exec-once = [
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
gdk-pixbuf,
|
gdk-pixbuf,
|
||||||
gobject-introspection,
|
gobject-introspection,
|
||||||
gtk3,
|
gtk3,
|
||||||
gtk-lock,
|
gtkSessionLock,
|
||||||
harfbuzz,
|
harfbuzz,
|
||||||
pango,
|
pango,
|
||||||
...
|
...
|
||||||
|
@ -20,7 +20,7 @@ buildNpmPackage {
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
npx @ts-for-gir/cli generate ${builtins.concatStringsSep " " [
|
npx @ts-for-gir/cli generate ${builtins.concatStringsSep " " [
|
||||||
"-g ${gtk-lock.dev}/share/gir-1.0"
|
"-g ${gtkSessionLock.dev}/share/gir-1.0"
|
||||||
"-g ${gobject-introspection.dev}/share/gir-1.0"
|
"-g ${gobject-introspection.dev}/share/gir-1.0"
|
||||||
"-g ${gtk3.dev}/share/gir-1.0"
|
"-g ${gtk3.dev}/share/gir-1.0"
|
||||||
"-g ${pango.dev}/share/gir-1.0"
|
"-g ${pango.dev}/share/gir-1.0"
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
hyprlock,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
inherit (lib) optionalString;
|
|
||||||
inherit (config.vars) mainMonitor;
|
|
||||||
|
|
||||||
monitor = optionalString (mainMonitor != null) mainMonitor;
|
|
||||||
in {
|
|
||||||
imports = [hyprlock.homeManagerModules.default];
|
|
||||||
|
|
||||||
programs.hyprlock = {
|
|
||||||
enable = true;
|
|
||||||
general = {
|
|
||||||
hide_cursor = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
backgrounds = [
|
|
||||||
{
|
|
||||||
path = "screenshot";
|
|
||||||
blur_size = 5;
|
|
||||||
blur_passes = 2;
|
|
||||||
vibrancy_darkness = 0.0;
|
|
||||||
brightness = 1.0;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
input-fields = [
|
|
||||||
{
|
|
||||||
inherit monitor;
|
|
||||||
size.height = 70;
|
|
||||||
fade_on_empty = false;
|
|
||||||
outer_color = "rgba(10, 10, 10, 1.0)";
|
|
||||||
inner_color = "rgb(151515)";
|
|
||||||
font_color = "rgba(240, 240, 240, 1.0)"; # This is the dot color
|
|
||||||
capslock_color = "rgba(171, 12, 8, 1.0)";
|
|
||||||
placeholder_text = let
|
|
||||||
span = "<span foreground='##cccccc' style='italic' size='15pt' allow_breaks='true'>";
|
|
||||||
mkSpan = s: "${span}${s}</span>";
|
|
||||||
in
|
|
||||||
mkSpan "\r$PROMPT";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
labels = [
|
|
||||||
{
|
|
||||||
inherit monitor;
|
|
||||||
text = "$TIME";
|
|
||||||
font_size = 80;
|
|
||||||
font_family = "Ubuntu Mono";
|
|
||||||
position.y = 240;
|
|
||||||
shadow_passes = 3;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
inherit monitor;
|
|
||||||
text = "<i> Groovy </i>";
|
|
||||||
font_family = "Ubuntu Mono";
|
|
||||||
shadow_passes = 3;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -14,7 +14,6 @@ in {
|
||||||
../greetd
|
../greetd
|
||||||
];
|
];
|
||||||
|
|
||||||
security.pam.services.hyprlock = {};
|
|
||||||
services.gnome.gnome-keyring.enable = true;
|
services.gnome.gnome-keyring.enable = true;
|
||||||
|
|
||||||
home-manager.users.${mainUser} = let
|
home-manager.users.${mainUser} = let
|
||||||
|
@ -23,16 +22,14 @@ in {
|
||||||
name = "lock";
|
name = "lock";
|
||||||
runtimeInputs = [
|
runtimeInputs = [
|
||||||
hmCfg.programs.ags.finalPackage
|
hmCfg.programs.ags.finalPackage
|
||||||
hmCfg.programs.hyprlock.package
|
|
||||||
];
|
];
|
||||||
text = ''
|
text = ''
|
||||||
ags -r 'Tablet.setLaptopMode()'
|
ags -r 'Tablet.setLaptopMode()'
|
||||||
hyprlock
|
ags -b lockscreen -c ~/.config/ags/lockscreen.js
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
imports = [
|
imports = [
|
||||||
./hyprlock.nix
|
|
||||||
hypridle.homeManagerModules.default
|
hypridle.homeManagerModules.default
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue