Commit Graph

162 Commits

Author SHA1 Message Date
Manuel Stoeckl
96f0a0f9c6 Exit when password handling subprocess crashes
It is better to have swaylock crash immediately and the compositor
show a red screen than to operate in a degraded state where
passwords cannot be checked and the screen cannot be unlocked.
2024-11-01 22:55:34 +01:00
Kenny Levinsen
cca2436ba5 Improve frame callback and commit handling
The few places that required a surface commit relied on render_frame and
render_frame_background to form it form them after they had set up frame
callback events. This would fail if render_frame ran out of buffers and
exited early, as the caller would still wait indefinitely on the frame
callback.

swaylock would quite consistently run out of buffers when rendering
immediately after a configure event, such as when the keypress causing
render also caused outputs to be enabled from idle.

Restructure the render and commit handling slightly so that the whole
frame callback and commit setup is handled by the render code, which now
has a single render entrypoint. This both avoids stalls from lacking
commits, but also fixes the case the configure path to respect frame
callbacks so we do not run out of buffers in the first place.
2024-09-06 19:46:24 -04:00
Christian Meissl
376cc5fcd4 Init eventloop directly after wl_connect
this makes sure the eventloop is initialized before
any event dispatching. fixes occasional segfaults I
observed on resume.
2024-02-23 19:17:28 +01:00
Simon Ser
7b4a5c4447 Check initial wl_display_roundtrip() return value
On error, print a message and exit.
2023-12-14 11:52:28 +01:00
Simon Ser
9b4b390588 Remove unnecessary wl_display_roundtrip() call
Calling wl_display_roundtrip() from an event handler is a bad
practice in general because it nests multiple dispatches.

We don't need to block here anyways.
2023-12-14 11:52:28 +01:00
Martin Dørum
ba921312c5 Fix output-specific images when output reappears
When setting an image with `--image <output>:<path>`, the image used to
fail to apply if the relevant output appears some time after swaylock
executes.

Co-authored-by: Alexander Bakker <ab@alexbakker.me>
2023-12-14 11:31:13 +01:00
Manuel Stoeckl
ccd31553f3 Make self-pipe nonblocking to prevent deadlock
If a large number of signals is sent, it is possible to fill the
buffer for sigusr_fds[1] before the main loop has a chance to read
from it; then the signal handler do_sigusr() will block on write.
2023-10-07 22:15:02 +02:00
Manuel Stoeckl
0569a47ef7 Configure SIGUSR1 with sigaction() instead of signal()
If signal() is used to set a signal handler, only the first signal
received will use the handler; any later signals use the default
behavior (making swaylock terminate immediately, without unlocking).
Using sigaction() ensures that the handler will be used every time.
2023-10-07 22:15:02 +02:00
Simon Ser
f692ee0075 Don't send READY=1 for readiness notifications
Just send a singular newline like s6 expects.

systemd doesn't support spawning a process with an FD to send
readiness notifications to, instead it provides a socket name. IOW,
this cannot be used directly with systemd after all.

Closes: https://github.com/swaywm/swaylock/issues/312
2023-10-06 13:03:07 +02:00
Manuel Stoeckl
10df946671 Fix Wayland object leaks when outputs are destroyed 2023-08-06 21:27:54 +02:00
Manuel Stoeckl
31ebd85fe0 Separate input and auth state
This commit establishes separate state machines for auth state (whether
the password submitted is being verified or is wrong) and input state
(typing indicators and clear message -- things relevant to the state of
the password being typed in, before it is submitted.) This makes it
possible to display the auth state while updating the input state (for
example, show that the previously submitted password is 'verifying' or
'wrong' while typing another.)

The two state machines interact only when submitting a password. There
is some interference with the rendering code -- a 'cleared' message
from the input state machine supersedes verifying/wrong messages from
the auth state machine; although since the 'clear' state has a shorter
timeout than the auth 'invalid' state, this is unlikely to hide the 'wrong'
message.
2023-05-09 12:40:41 +02:00
Manuel Stoeckl
1d3e62c67f Stop pooling background surface buffers
The wl_buffers for the background surface only need to be updated
when the output dimensions change. Using the fixed pool of two
buffers to cache these buffers does not help, since if a new buffer
is needed, it will have a different size than whatever buffers were
cached. Furthermore, because the pool has fixed size, it is possible
to run out of buffers if configure events arrive faster than
pool buffers are marked not busy, which can lead to protocol errors
when the background surface is committed after acknowledging a new
size, but without attaching a buffer that matches that size.
2023-03-22 10:56:42 +01:00
Simon Ser
ac3b49b657 Drop support for layer-shell
Superseded by ext-session-lock-v1
2023-01-28 23:03:30 +01:00
Simon Ser
db9ee6d127 Add --ready-fd
This implements a readiness notification mechanism which works on
both systemd and s6.

References: https://github.com/swaywm/swaylock/pull/42
References: https://github.com/swaywm/swaylock/pull/275
2023-01-28 22:58:19 +01:00
Simon Ser
be566a2935 Wait for the locked event
We were ignoring the locked event. Wait for it instead.
2023-01-28 22:51:38 +01:00
Manuel Stoeckl
4a44c306e7 Remove unused fields in swaylock_surface 2023-01-27 12:19:32 +01:00
Manuel Stoeckl
10ab8b2740 Estimate buffer size in advance for render_frame
The size of the surface used to draw the indicator depends on
the extents of the text being drawn on and under the indicator.

This commit refactors the `render_frame` function so that the surface
size is computed before drawing; before, `render_frame` drew onto a
buffer, estimated the size the buffer should have had, and recursively
called itself to try again with the estimated size, if necessary. This
was done because Cairo's methods to estimate font and text size
require that a cairo_t context object and an associated cairo_surface
already have been set up. Since the surface size depends on the text
size, the natural way to use Cairo would have a circular dependency.

In order to compute sizes _before_ the buffer is created, this commit
adds a 1x1 surface and a matching `test_cairo` context which is set to
the same font and drawing parameters as the buffer that will be
created. Font/text extent measurements should give the same results as
for the final buffer.
2023-01-27 12:19:32 +01:00
Lily Foster
2c4bafc57f Fix option parsing without --debug after #261
From getopt manual page:

> By default, getopt() permutes the contents of argv as it scans, so that eventually all the nonoptions are at the end. Two other scanning modes are also implemented. [...] If the first character of optstring is '-', then each nonoption argv-element is handled as if it were the argument of an option with character code 1.

> If the first character (following any optional '+' or '-' described above) of optstring is a colon (':'), then getopt() likewise does not print an error message. In addition, it returns ':' instead of '?' to indicate a missing option argument. This allows the caller to distinguish the two different types of errors.
2023-01-26 16:34:49 +01:00
Arnout Engelen
d5eb85ba1c Parse --debug parameter before forking
To make sure the backend picks up the loglevel as well
2023-01-03 16:34:53 +01:00
Alexander Orzechowski
f6f804013f Check for existence of subcompositor
We need this protocol
2022-11-14 21:07:01 +01:00
Aleksei Bavshin
1225e75be0 Ensure that ext_session_lock_v1.unlock_and_destroy is processed.
Use wl_display_roundtrip to ensure that the unlock request is received
and processed by the server. The protocol requires[1] this to avoid
possible races.

[1]: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/161
2022-11-12 10:40:19 +01:00
Daniel De Graaf
dafbef3ade Unlock the screen on SIGUSR1
When the screen is locked using ext_session_lock, killing swaylock will
leave the session locked.  This is normally desirable if the kill is due
to the OOM killer or swaylock crashing, but can be undesirable if an
unlock is desired.  This adds a signal handler for SIGUSR1 if using
ext_session_lock.
2022-09-24 12:15:53 +02:00
Robin Ebert
bdeb891378 Use mlock for password buffer 2022-06-15 10:49:32 +02:00
Simon Ser
2813756a19 Drop xdg-output requirement
Rely on wl_output v4 instead.
2022-03-10 10:31:51 +01:00
tiosgz
92de4d2e31 Do not crash on connecting new output
The problem here was that a commit in reaction to wl_output::geometry
was made before the surface was configured, which is a protocol error.
See 65552.531 in the following log.

    [  65537.378] wl_registry@2.global(37, "wl_output", 4)
    [  65537.534]  -> wl_registry@2.bind(37, "wl_output", 3, new id [unknown]@21)
    [  65537.679]  -> wl_compositor@5.create_surface(new id wl_surface@19)
    [  65537.744]  -> wl_compositor@5.create_surface(new id wl_surface@23)
    [  65537.822]  -> wl_subcompositor@6.get_subsurface(new id wl_subsurface@24, wl_surface@23, wl_surface@19)
    [  65537.934]  -> wl_subsurface@24.set_sync()
    [  65537.973]  -> ext_session_lock_v1@3.get_lock_surface(new id ext_session_lock_surface_v1@25, wl_surface@19, wl_output@21)
    [  65538.086]  -> wl_compositor@5.create_region(new id wl_region@26)
    [  65538.148]  -> wl_region@26.add(0, 0, 2147483647, 2147483647)
    [  65538.275]  -> wl_surface@19.set_opaque_region(wl_region@26)
    [  65538.325]  -> wl_region@26.destroy()
    [  65538.383]  -> wl_display@1.sync(new id wl_callback@27)
    [  65551.781] wl_display@1.delete_id(26)
    [  65551.924] wl_display@1.delete_id(27)
    [  65551.971] wl_pointer@13.enter(839, wl_surface@15, 558.01562500, 785.66796875)
    [  65552.093]  -> wl_pointer@13.set_cursor(839, nil, 0, 0)
    [  65552.231] wl_output@21.geometry(0, 0, 440, 300, 0, "Samsung Electric Company", "SyncMaster", 0)
    [  65552.453]  -> wl_surface@19.frame(new id wl_callback@26)
    [  65552.531]  -> wl_surface@19.commit()
    [  65552.568] wl_output@21.mode(1, 1680, 1050, 59883)
    [  65552.685] wl_output@21.scale(1)
    [  65552.762] wl_output@21.done()
    [  65552.796] ext_session_lock_surface_v1@25.configure(840, 1680, 1050)
    [  65552.893]  -> ext_session_lock_surface_v1@25.ack_configure(840)
    [  65553.044]  -> wl_shm@4.create_pool(new id wl_shm_pool@28, fd 7, 7056000)
    [  65553.156]  -> wl_shm_pool@28.create_buffer(new id wl_buffer@29, 0, 1680, 1050, 6720, 0)
    [  65553.224]  -> wl_shm_pool@28.destroy()
    [  65558.903]  -> wl_surface@19.set_buffer_scale(1)
    [  65558.953]  -> wl_surface@19.attach(wl_buffer@29, 0, 0)
    [  65558.981]  -> wl_surface@19.damage_buffer(0, 0, 2147483647, 2147483647)
    [  65559.013]  -> wl_surface@19.commit()
    [  65559.026]  -> wl_subsurface@24.set_position(842, 465)
    [  65559.063]  -> wl_surface@23.attach(nil, 0, 0)
    [  65559.088]  -> wl_surface@23.commit()
    [  65559.110]  -> wl_subsurface@24.set_position(782, 465)
    [  65559.186]  -> wl_shm@4.create_pool(new id wl_shm_pool@30, fd 8, 58564)
    [  65559.220]  -> wl_shm_pool@30.create_buffer(new id wl_buffer@31, 0, 121, 121, 484, 0)
    [  65559.266]  -> wl_shm_pool@30.destroy()
    [  65559.287]  -> wl_surface@23.attach(nil, 0, 0)
    [  65559.316]  -> wl_surface@23.commit()
    [  65559.385]  -> wl_surface@23.set_buffer_scale(1)
    [  65559.402]  -> wl_surface@23.attach(wl_buffer@31, 0, 0)
    [  65559.427]  -> wl_surface@23.damage_buffer(0, 0, 2147483647, 2147483647)
    [  65559.458]  -> wl_surface@23.commit()
    [  65559.467]  -> wl_surface@19.commit()
    [  65559.478] wl_callback@27.done(840)
    [  65559.740] wl_display@1.error(ext_session_lock_surface_v1@25, 0, "session lock surface has never been configured")
    ext_session_lock_surface_v1@25: error 0: session lock surface has never been configured
2022-02-10 09:54:57 +01:00
Simon Ser
1d1c75b631 Add support for ext-session-lock-v1
This is a new protocol to lock the session [1]. It should be more
reliable than layer-shell + input-inhibitor.

[1]: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/131
2022-02-02 15:30:45 +01:00
grumpey
366db56553 Call fclose vice free, fixes #198 2021-07-11 19:52:55 +02:00
Simon Ser
9d3da72a39 Use wl_surface.damage_buffer
We incorrectly used the buffer size instead of the surface size.
Let's not bother and just damage the maximum region.
2021-02-17 16:50:38 +01:00
Simon Ser
05325b1197 Initialize indicator size to zero
Initializing to 1 is incorrect when the surface scale is > 1.
2021-02-17 16:50:38 +01:00
Martin Dørum
235b925df7 Fix a potential use-after-free 2020-10-15 15:17:41 +02:00
Martin Dørum
a99afe6a70
Implement key repeat 2020-06-19 23:02:23 +02:00
Matt Della
a7404e1096 Added option to adjust ring position via CLI arguments and the config file 2019-11-27 19:53:07 -05:00
Olegs Jeremejevs
426e1ce93d Fix, clean up and sync docs and completions 2019-09-12 16:33:24 -04:00
Alexander Martin
666ae950bc Adds option to show indicator even if idle 2019-08-04 02:15:49 -04:00
Martin Dørum
b1a7defa00 seed rand 2019-06-28 10:27:42 -04:00
Abdelhakim Qbaich
89b214612c Resizable buffer size for the subsurface 2019-06-22 22:36:53 +03:00
Peter Kasza
183d1bd549 Add fixed font-size option for indicator
This commit adds a new command line option called --font-size to
specify a fixed font size in the indicator. The default value for
font-size is 0, which means that the text will autoscale. Any other
positive value will result in a fixed text size.
2019-05-05 09:25:59 -06:00
bbgun7
86f4fea55e Added hide keyboard layout option 2019-04-22 10:34:19 -07:00
Brian Ashworth
7892d8cc51 Allow spaces in image file path
This allows one or more spaces to be in the image file path
2019-04-01 11:33:14 +03:00
Kenny Levinsen
d815e29b64 Do not exit if no outputs are present 2019-03-30 00:37:59 +02:00
Anders Nylander
7d5a73b0a9 Decouple the drawing of the background from drawing the indicator.
* Render background only once in main wl_surface
* Render indicator on subsurface
2019-03-20 23:07:31 +02:00
Dominik Bendle
a052a56bc2 Display xkb layout while typing
Displays the current keyboard layout below the unlock indicator if more
than one xkb layout is configured or the show-keyboard-layout option is
given. The text is displayed with a background box.

Adds commandline options for text color, background color and border
color of the box as well.
2019-02-06 01:42:49 +01:00
Dominik Bendle
40e9098a74 Add option show-failed-attempts
Keeps track of unsuccessful authentication attempts via an int counter
in the state struct. Displays on the unlock indicator, but will be
replaced by the Caps Lock text if enabled.
2019-01-29 20:44:32 +01:00
Dominik Bendle
c2b99768e9 Allow setting both background image and colour
The -c/--color option no longer sets BACKGROUND_MODE_SOLID_COLOR (which
disables the background image) and the background color is now set in
all cases. One can still use --scaling solid_color to disable display of
a background image.

As a consequence, there is now only one possible default background
colour (white), regardless of whether a background image is given or not.
2019-01-25 10:30:13 +01:00
emersion
d98ada0efd
Simplify XDG_CONFIG_HOME handling 2019-01-19 08:36:09 +01:00
Drew DeVault
52eeb9fc1e
Merge pull request #24 from c-edw/feature/AbortSUIDWithPAM
Log error and exit if swaylock is suid with PAM backend.
2019-01-18 09:07:17 -05:00
Connor E
648b0ccd64 Make setuid error clearer. 2019-01-18 13:52:17 +00:00
Connor E
7c0ba89197 Handle alloc failures. 2019-01-18 13:45:34 +00:00
Connor E
291bae1e44 Remove VLAs. 2019-01-18 12:27:42 +00:00
Michael Weiss
710a711fd7
Replace old Sway references with swaylock 2019-01-17 17:18:20 +01:00