lockrs
- 9 Devlogs
- 49 Total hours
Lockrs is a wayland server agnostic, gpu-accelerated lock screen engine made in Rust. It works by implementing the egui library for lock screen surfaces.
Lockrs is a wayland server agnostic, gpu-accelerated lock screen engine made in Rust. It works by implementing the egui library for lock screen surfaces.
Reviewed the code before the ship!
noting much to report, i’ll just put the new lockscreen again
A lot of big changes!
these 10 hours of coding felt like a constant rabbit hole, but i finally fixed all the things i found TuT.
First of all, i made some new widgets: namely, a text input for the password that reserves space for the “login failed” failure text, an uptime widget and widget that fetches the default network interface.
While making an example lock screen using these new widgets, i noticed that taking a screenshot was just a huge pain; One had to go do gpu texture copying magic and it was just A Bad Time in general. So, i decided to bake that functionality into lockrs itself, so now there’s a screenshot feature (enabled by default) which makes it able to save screenshots.
But while implementing the screenshot feature, i noticed that there were some inconsistencies in the multiple output logic and in the buffer scaling logic, so i fixed those (this took surprisingly long :p).
After implementing that, i went to take that screenshot, and noticed that the UI would freeze for a bit while the disk I/O of saving the image was running. This was quite annoying, so i also decided to make a whole ass worker thread that handles password checking (which also used to hang the UI thread, albeit for a short time) and to save the screenshot.
Anyways, after this journey of a few days of coding, here’s the example screenshot, finally:
P.S.: while trying to put an image here, firefox crashed and i had to rewrite this whole thing… to anyone seeing this, save your devlogs somewhere before adding pics :p
Well, im at it again with this project. I took quite a long break to make another project, and now have had the time to come back to this. I’ve finally written some in-depth docs, and will review them later today with a fresh mind to be sure that they’re as right as possible.
I also fixed a design flaw, but im not very sure if how i did it really fixed it. Before, this is the old way it’s doing it:
app.ui(|_, ui| {
// put stuff inside some ui levels
egui::CentralPanel::default()
.frame(egui::Frame::NONE)
.show(ui, |ui| {
// maybe make new ui levels
// inside the levels, return TryExit
TryExit::Force
})
.inner.inner.inner //as many .inner as ui levels
// TryExit is in, because you need to return the inner TryExit
})
this felt extremely clunky. So, i solved it like this:
// mutable reference to a TryExit
app.ui(|_, ui, exit: &mut TryExit| {
// as many levels as you want
egui::CentralPanel::default()
.frame(egui::Frame::NONE)
.show(ui, |ui| {
// instead of returning it, mutate the passed-in reference
*exit = TryExit::Force;
}); // no need to return anything, so no .inner
})
this feels a bit better, but idrk still. For the time being, the API will be the latter.
Anyways, have a look at the new docs:
As a prize for your great work, look out for a bonus prize in the mail :)
After taking a small break, i finally finished this project. I decided to turn it into a library instead of a really customizable lockscreen, because what would be the purpose in making something that could very well work in any number of ways and then limiting it to a few widgets? I’m quite satisfied with how it turned out, even if there are a few rough spots. Also, i decided to license it under MIT or Apache 2.0, as per convention for rust libraries.
In the end, i’ll be definitely using lockrs, and i hope some other people will too.
I managed to add PAM authentication. I also tried to add support for shaders and in general gpu work, and discovering i bit off way more than i can chew, i just decided not to.
So, i tried to add a background, but i stumbled upon an obstacle which sent me diving into egui’s source code, because it kept claiming that it couldn’t load images with side bigger than 2048px; turns out this is only a limitation of the WebGPU API, that, as the name suggests, runs on browsers, not on desktops. Anyways, after a lot of fiddling with egui’s components, i managed to make it use images with sides up to 8000px.
Now i’ll probably customize the bar a little, and maybe make a few egui widgets for it.
After wrecking my mind unnecessarily over how to handle pointer events for a ridiculous amount of time, I finally got something that somehow works; now i also have a working text input! It just prints the input to the terminal for now, but I’ll be messing with PAM a bit to do authentication now. wish me luck!
I finally got the keyboard to work! for now, it just exits as soon as a key is pressed, but i’m working on implementing full functionality. also, now the code is much much cleaner, properly divided in functions instead of being all chucked into main. I don’t really have a way to display this with a screenshot, so i’ll just reuse an old one unfortunately :p
Well, i managed to render to the lock screen with egui instead of using
the raw buffer; for now, it’s still a mess of spaghetti code that barely
works and will turn into a footgun very quickly if i don’t get
working on the lower level part of it instead of throwing stuff at the
wall and seeing if it sticks. The next step is tidying the code up
instead of throwing everything into main, so that i can get some
customization going. Also, i should probably add the authentication part
of the lock screen instead of having it unlock after a few seconds.
I finished a first proof of concept for wl-lock; right now, it locks the user out for two seconds while displaying a mauve screen.
For now, it’s still fully cpu rendered, but i plan on adding gpu-accelerated background blur and general effects.
The next step is hooking egui into it!