swaywm / swaylock

Screen locker for Wayland
MIT License
851 stars 202 forks source link

Fingerprint support #283

Open SL-RU opened 1 year ago

SL-RU commented 1 year ago

I've added fingerprint support via fprintd daemon which has DBus communication and because of that build dependencies was added(dbus, gio, fprintd and etc), but they are not required for execution. To run swaylock with fprintd you need to start fprintd and then swaylock with argument -p or --fingerprint

Can you make a review and say is merge possible?

Package with fingerprint support on AUR: https://aur.archlinux.org/packages/swaylock-fprintd-git

This relates to #61

SL-RU commented 1 year ago

CI (builds.sr.ht) compiles wrong version. It seems it compiles only master, not selected commit. Is it okay?

emersion commented 1 year ago

Hm, do we really all of this complexity? I'd rather not do any of the D-Bus stuff. Can't users leverage a PAM module which integrates with the fingerprint reader instead?

SL-RU commented 1 year ago

Hm, do we really all of this complexity? I'd rather not do any of the D-Bus stuff. Can't users leverage a PAM module which integrates with the fingerprint reader instead?

Yes, we want to check password and fingerprint in parallel. With Pam closest solution is check fingerprint after empty password was entered.

With this MR we can touch fingerprint scanner while PC is asleep, it will wake up over USB and immediately unlock without necessety to press any button.

emersion commented 1 year ago

I am not sure I want to maintain this upstream.

SL-RU commented 1 year ago

I am not sure I want to maintain this upstream.

Okay, I'll maintain it as a fork

lack commented 1 year ago

I was curious about the fork, @SL-RU : does it need to be tightly integrated with the code of swaylock? Or can it be a separate stand-alone program that interfaces just with the new wlroots lock protocol, and run in parallel with swaylock?

SebTM commented 1 year ago

I am not sure I want to maintain this upstream.

Really sad to hear that, the new implementation is really awesome for daily users. Would it be an option to make @SL-RU a maintainer so that it's included but mostly maintained by him if he is even ok with maintaining a fork?

Deleted my last comment after that as it was an system-issue not related to the code/fork.

paulodiovani commented 1 year ago

I was curious about the fork, @SL-RU : does it need to be tightly integrated with the code of swaylock? Or can it be a separate stand-alone program that interfaces just with the new wlroots lock protocol, and run in parallel with swaylock?

If this works like a plugin it would be great. I already use https://github.com/mortie/swaylock-effects. I would love to see these forks integrated into the main project without compromising its core features.

SL-RU commented 1 year ago

@lack @paulodiovani currently code is tightly integrated with swaylock, but mainly just for indication. It can be separated into separate service. What is new wlroots lock protocol? How swaylock uses it and how fprintd service will interact with it?

kennylevinsen commented 1 year ago

What is new wlroots lock protocol? How swaylock uses it and how fprintd service will interact with it?

ext-session-lock-v1, already implemented in swaylock and only affects how lock screens open a lock surface.

lack commented 1 year ago

I guess what I was thinking of may not even need any knowledge of the lock protocol; but instead of implementing the fingerprint integrated into swaylock it could be an external program that:

Then:

The only thing lost in this approach is a way to have user feedback in swaylock itself if the fingerprint read was attempted and failed...

@SL-RU

WhyNotHugo commented 1 year ago

Can't users leverage a PAM module which integrates with the fingerprint reader instead?

The PAM fingerprint module (from libfprint) relies on libfprintd which depends on polkit which requires systemd. So it's not portable and won't work on many configurations.

That said, this implementation relies on fprintd, so it suffers from the same limitations.

I do think that the approach mentioned by @lack makes a lot of sense. I wonder if we could use SIGUSR2 to signal to the user "failed attempt" for out-of-band unlock attempts.

SebTM commented 1 year ago

I wonder if we could use SIGUSR2 to signal to the user "failed attempt" for out-of-band unlock attempts.

Hey, I tried to implement this - it generally works but I sometimes get random crashes (after more than one SIGUSR2 signals) and tried to debug it with the swaylock-logged script I found in another issue.

Current Status: https://github.com/SebTM/swaylock/tree/feature/sigusr2 PR: https://github.com/swaywm/swaylock/pull/311

#!/bin/sh
(echo -e "\n\nStarting swaylock:\n"; WAYLAND_DEBUG=1 ./build/swaylock -F 2>&1 | sed  's/\[.......\....\]/\[XXXXXXX.YYY\]/') | grep -v keyboard | grep -v pointer >> swaylock_logfile

Log from a crash:

Starting swaylock:

[XXXXXXX.YYY]  -> wl_display@1.get_registry(new id wl_registry@2)
[XXXXXXX.YYY]  -> wl_display@1.sync(new id wl_callback@3)
[XXXXXXX.YYY] wl_display@1.delete_id(3)
[XXXXXXX.YYY] wl_registry@2.global(1, "wl_shm", 1)
[XXXXXXX.YYY]  -> wl_registry@2.bind(1, "wl_shm", 1, new id [unknown]@4)
[XXXXXXX.YYY] wl_registry@2.global(2, "wl_drm", 2)
[XXXXXXX.YYY] wl_registry@2.global(3, "zwp_linux_dmabuf_v1", 4)
[XXXXXXX.YYY] wl_registry@2.global(4, "wl_compositor", 5)
[XXXXXXX.YYY]  -> wl_registry@2.bind(4, "wl_compositor", 4, new id [unknown]@5)
[XXXXXXX.YYY] wl_registry@2.global(5, "wl_subcompositor", 1)
[XXXXXXX.YYY]  -> wl_registry@2.bind(5, "wl_subcompositor", 1, new id [unknown]@6)
[XXXXXXX.YYY] wl_registry@2.global(6, "wl_data_device_manager", 3)
[XXXXXXX.YYY] wl_registry@2.global(7, "zwlr_gamma_control_manager_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(8, "zxdg_output_manager_v1", 3)
[XXXXXXX.YYY] wl_registry@2.global(9, "org_kde_kwin_idle", 1)
[XXXXXXX.YYY] wl_registry@2.global(10, "ext_idle_notifier_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(11, "zwp_idle_inhibit_manager_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(12, "zwlr_layer_shell_v1", 4)
[XXXXXXX.YYY] wl_registry@2.global(13, "xdg_wm_base", 2)
[XXXXXXX.YYY] wl_registry@2.global(14, "zwp_tablet_manager_v2", 1)
[XXXXXXX.YYY] wl_registry@2.global(15, "org_kde_kwin_server_decoration_manager", 1)
[XXXXXXX.YYY] wl_registry@2.global(16, "zxdg_decoration_manager_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(19, "wp_presentation", 1)
[XXXXXXX.YYY] wl_registry@2.global(20, "zwlr_output_manager_v1", 4)
[XXXXXXX.YYY] wl_registry@2.global(21, "zwlr_output_power_manager_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(22, "zwp_input_method_manager_v2", 1)
[XXXXXXX.YYY] wl_registry@2.global(23, "zwp_text_input_manager_v3", 1)
[XXXXXXX.YYY] wl_registry@2.global(24, "zwlr_foreign_toplevel_manager_v1", 3)
[XXXXXXX.YYY] wl_registry@2.global(25, "ext_session_lock_manager_v1", 1)
[XXXXXXX.YYY]  -> wl_registry@2.bind(25, "ext_session_lock_manager_v1", 1, new id [unknown]@7)
[XXXXXXX.YYY] wl_registry@2.global(26, "wp_drm_lease_device_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(27, "zwlr_export_dmabuf_manager_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(28, "zwlr_screencopy_manager_v1", 3)
[XXXXXXX.YYY] wl_registry@2.global(29, "zwlr_data_control_manager_v1", 2)
[XXXXXXX.YYY] wl_registry@2.global(30, "zwp_primary_selection_device_manager_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(31, "wp_viewporter", 1)
[XXXXXXX.YYY] wl_registry@2.global(32, "wp_single_pixel_buffer_manager_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(33, "zxdg_exporter_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(34, "zxdg_importer_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(35, "zxdg_exporter_v2", 1)
[XXXXXXX.YYY] wl_registry@2.global(36, "zxdg_importer_v2", 1)
[XXXXXXX.YYY] wl_registry@2.global(37, "xdg_activation_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(40, "zwlr_input_inhibit_manager_v1", 1)
[XXXXXXX.YYY] wl_registry@2.global(42, "wl_seat", 8)
[XXXXXXX.YYY]  -> wl_registry@2.bind(42, "wl_seat", 4, new id [unknown]@8)
[XXXXXXX.YYY] wl_registry@2.global(44, "wl_output", 4)
[XXXXXXX.YYY]  -> wl_registry@2.bind(44, "wl_output", 4, new id [unknown]@9)
[XXXXXXX.YYY] wl_callback@3.done(621)
[XXXXXXX.YYY]  -> ext_session_lock_manager_v1@7.lock(new id ext_session_lock_v1@3)
[XXXXXXX.YYY]  -> wl_display@1.sync(new id wl_callback@10)
[XXXXXXX.YYY] wl_display@1.delete_id(10)
[XXXXXXX.YYY] wl_seat@8.name("seat0")
[XXXXXXX.YYY] wl_seat@8.capabilities(3)
[XXXXXXX.YYY] wl_output@9.geometry(0, 0, 280, 190, 0, "BOE", "0x095F", 0)
[XXXXXXX.YYY] wl_output@9.mode(1, 2256, 1504, 59999)
[XXXXXXX.YYY] wl_output@9.scale(2)
[XXXXXXX.YYY] wl_output@9.name("eDP-1")
[XXXXXXX.YYY] wl_output@9.description("BOE 0x095F (eDP-1)")
[XXXXXXX.YYY] wl_output@9.done()
[XXXXXXX.YYY] ext_session_lock_v1@3.locked()
[XXXXXXX.YYY] wl_callback@10.done(624)
[XXXXXXX.YYY]  -> wl_compositor@5.create_surface(new id wl_surface@10)
[XXXXXXX.YYY]  -> wl_compositor@5.create_surface(new id wl_surface@13)
[XXXXXXX.YYY]  -> wl_subcompositor@6.get_subsurface(new id wl_subsurface@14, wl_surface@13, wl_surface@10)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_sync()
[XXXXXXX.YYY]  -> ext_session_lock_v1@3.get_lock_surface(new id ext_session_lock_surface_v1@15, wl_surface@10, wl_output@9)
[XXXXXXX.YYY]  -> wl_compositor@5.create_region(new id wl_region@16)
[XXXXXXX.YYY]  -> wl_region@16.add(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@10.set_opaque_region(wl_region@16)
[XXXXXXX.YYY]  -> wl_region@16.destroy()
[XXXXXXX.YYY] wl_display@1.delete_id(16)
[XXXXXXX.YYY] ext_session_lock_surface_v1@15.configure(625, 1804, 1203)
[XXXXXXX.YYY]  -> ext_session_lock_surface_v1@15.ack_configure(625)
[XXXXXXX.YYY]  -> wl_surface@10.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_shm@4.create_pool(new id wl_shm_pool@16, fd 10, 34723392)
[XXXXXXX.YYY]  -> wl_shm_pool@16.create_buffer(new id wl_buffer@17, 0, 3608, 2406, 14432, 0)
[XXXXXXX.YYY]  -> wl_shm_pool@16.destroy()
[XXXXXXX.YYY]  -> wl_surface@10.attach(wl_buffer@17, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@10.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY]  -> wl_buffer@17.destroy()
[XXXXXXX.YYY]  -> wl_shm@4.create_pool(new id wl_shm_pool@18, fd 11, 234256)
[XXXXXXX.YYY]  -> wl_shm_pool@18.create_buffer(new id wl_buffer@19, 0, 242, 242, 968, 0)
[XXXXXXX.YYY]  -> wl_shm_pool@18.destroy()
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] discarded [unknown]@17.[event 0](0 fd, 8 byte)
[XXXXXXX.YYY] wl_display@1.delete_id(16)
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_display@1.delete_id(18)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@18)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(18)
[XXXXXXX.YYY] wl_callback@18.done(2009114)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@18)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(18)
[XXXXXXX.YYY] wl_callback@18.done(2009136)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@18)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(18)
[XXXXXXX.YYY] wl_callback@18.done(2009161)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@18)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(18)
[XXXXXXX.YYY] wl_callback@18.done(2009169)
[XXXXXXX.YYY] wl_seat@8.capabilities(2)
[XXXXXXX.YYY] wl_seat@8.capabilities(0)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(11)
[XXXXXXX.YYY] wl_display@1.delete_id(12)
[XXXXXXX.YYY] wl_display@1.delete_id(18)
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2010663)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_callback@17.done(2010664)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2019172)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_callback@17.done(2019181)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2020672)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_callback@17.done(2020673)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2021404)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_callback@17.done(2021407)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_seat@8.capabilities(2)
[XXXXXXX.YYY] wl_seat@8.capabilities(3)
[XXXXXXX.YYY] wl_callback@17.done(2024594)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] discarded [zombie]@18.[event 0](1 fd, 16 byte)
[XXXXXXX.YYY] discarded [zombie]@18.[event 5](0 fd, 16 byte)
[XXXXXXX.YYY] discarded [zombie]@18.[event 1](0 fd, 20 byte)
[XXXXXXX.YYY] discarded [zombie]@18.[event 4](0 fd, 28 byte)
[XXXXXXX.YYY] wl_display@1.delete_id(18)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2024602)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2026289)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2026312)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2026331)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2026345)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2026931)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2026954)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2026971)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2026988)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027012)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027021)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027052)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_callback@17.done(2027055)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027092)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027104)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027132)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027137)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027172)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027188)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2027212)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_seat@8.capabilities(2)
[XXXXXXX.YYY] wl_seat@8.capabilities(0)
[XXXXXXX.YYY] wl_callback@17.done(2027355)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(12)
[XXXXXXX.YYY] wl_display@1.delete_id(11)
[XXXXXXX.YYY] wl_display@1.delete_id(18)
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_callback@17.done(2027358)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_callback@17.done(2028833)
[XXXXXXX.YYY]  -> wl_surface@10.frame(new id wl_callback@17)
[XXXXXXX.YYY]  -> wl_subsurface@14.set_position(843, 541)
[XXXXXXX.YYY]  -> wl_surface@13.set_buffer_scale(2)
[XXXXXXX.YYY]  -> wl_surface@13.attach(wl_buffer@19, 0, 0)
[XXXXXXX.YYY]  -> wl_surface@13.damage_buffer(0, 0, 2147483647, 2147483647)
[XXXXXXX.YYY]  -> wl_surface@13.commit()
[XXXXXXX.YYY]  -> wl_surface@10.commit()
[XXXXXXX.YYY] wl_display@1.delete_id(17)
[XXXXXXX.YYY] wl_buffer@19.release()
[XXXXXXX.YYY] wl_callback@17.done(2028834)

Maybe someone can have a look as my C skills are very elementary... Edit: Also already have a working (but needs some cleanup) wrapper-app (starting/sending SIGUSR1 to swaylock) handling fingerprint auth in go via dbus.