Commit Graph

317 Commits

Author SHA1 Message Date
Simon Ser
91bb968110 Document --ready-fd in man page 2023-12-17 13:58:40 +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
prezmop
f2298bdbf7 Clear password on ctrl+backpace and ctrl+delete 2023-12-10 13:02:22 +01:00
Lyle Hanson
7cecd395a2 Link to manpage
The README for `swayidle` has a convenient link to the manpage, following suit here.
2023-11-26 22:39:41 +01:00
Max Kunzelmann
51e9e6ceda Fix retry behaviour in while loop with mlock()
If mlock() fails with errno EAGAIN, it should be retried up to five
times, which is tracked in the retries variable. However, the `return
false` statement after the switch case makes the function return false
after the first failed mlock() call.

Remove this statement to actually retry up to five times.

Signed-off-by: Max Kunzelmann <maxdev@posteo.de>
2023-11-17 13:56:41 +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
Sophie Winter
2018673e1d Don't drop the buffer until after surface commit 2023-06-12 14:17:43 +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
Hugo Osvaldo Barrera
876965f944 Accept input while validating
Allow typing new input while the previous one is validating. Can be
tested with:

    ninja -C build && sway -c sway.conf

Where sway.config is:

    exec ./build/swaylock

Fixes: https://github.com/swaywm/swaylock/issues/241
2023-04-14 09:55:19 +02:00
Manuel Stoeckl
75e837c31a Synchronize highlight position between outputs
This change has the additional benefit of ensuring that the position
of the highlight only changes in reaction to a letter key or
backspace being pressed, and not when the compositor sends a new
configure event or the output needs to be redrawn for some other
reason.
2023-04-02 02:34:19 +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
bd2dfec9ae build: bump version to 1.7.2 2023-01-28 22:54:27 +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
Simon Ser
6213fa0a7c build: bump version to 1.7.1 2023-01-27 12:23:16 +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
Manuel Stoeckl
b4e3a2b0fd Remove overridden surface attachment
The removed lines had no effect, since later in `render_frame`
buffer->buffer is attached to surface->child.
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
Simon Ser
84598b08f2 build: use configuration data for SYSCONFDIR and SWAYLOCK_VERSION 2022-12-05 11:02:41 +01:00
Simon Ser
ee8d4ff655 build: drop intermediate protocols static lib 2022-12-05 11:02:41 +01:00
Simon Ser
dcba5bcb9f build: move completions to separate file 2022-12-05 11:02:41 +01:00
nerdopolis
d9e71c87c7 Fix build on Debian Stable 2022-11-28 08:12:06 +01:00
Simon Ser
9ec4541030 build: find native wayland-scanner 2022-11-27 14:13:37 +01:00
Simon Ser
1c77805930 build: bump to version 1.7 2022-11-27 14:07:27 +01:00
Manuel Stoeckl
cbdafb031a Use shm_open instead of mkstemp
shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.
2022-11-24 23:56:10 +01:00
sonny
226244e93c Fix capitalization. 2022-11-21 16:31:11 +01:00
Alexander Orzechowski
f6f804013f Check for existence of subcompositor
We need this protocol
2022-11-14 21:07:01 +01:00
Alexander Orzechowski
5c1b16b957 renderer: work with current buffer locally
No need to store this globally accessible struct member.
2022-11-14 21:06:41 +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
Alexander Orzechowski
cc2779330f meson: Clean up client_protocols 2022-09-26 19:58:53 +02:00
Simon Ser
b5cfd43deb shadow: make the result of crypt() const
This should not be free'd.
2022-09-26 19:58:04 +02: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
John Lindgren
605859cdd4 Fix loss of clarity with odd-sized centered image 2022-09-10 20:04:31 +02:00
Robin Ebert
bdeb891378 Use mlock for password buffer 2022-06-15 10:49:32 +02:00
Rick van Schijndel
fad5bc2f61 wayland-scanner: use native version to support cross-compilation
Cross-compilation support was broken in 55c018a350 because wayland-scanner from the host system is used with that change.
This patch changes it back to use wayland-scanner from the build system.
For normal (non-cross) compilation this shouldn't change anything.

Meson also uses the build machine wayland-scanner binary:
- c649a2b8c5/mesonbuild/modules/unstable_wayland.py (L48-L53)
2022-04-26 05:41:28 +02:00
Oğuz Ersen
55394afe8f bash-completion: localize variables 2022-03-27 11:28:13 +02:00
Johan Malm
11030b7350 Delete whole utf8 character on backspace
...rather than just the last byte of the password buffer.

Demostrate the need for this by taking the following steps:
- Apply the patch below (before this commit).
- Set keyboard layout to one where utf8 characters longer than one byte
  can be obtained, for example åäö using Swedish layout
  (XKB_DEFAULT_LAYOUT=se).
- Type "åäö" then press backspace and observe that it takes two
  backspaces to delete each character fully, and therefore six
  backspaces to fully clear the password buffer.

diff --git a/password.c b/password.c
index e1a1d9a..b640cd3 100644
--- a/password.c
+++ b/password.c
@@ -29,6 +29,7 @@ void clear_password_buffer(struct swaylock_password *pw) {
 static bool backspace(struct swaylock_password *pw) {
 	if (pw->len != 0) {
 		pw->buffer[--pw->len] = 0;
+		fprintf(stderr, "%s\n", pw->buffer);
 		return true;
 	}
 	return false;
2022-03-22 22:11:27 +01:00
Johan Malm
06d22a8dea Remove redundant function render_frames() 2022-03-20 22:54:39 +01:00
Johan Malm
03b75eaf44 cairo.h: remove redundant prototype
cairo_surface_t *cairo_image_surface_scale();
2022-03-20 22:54:39 +01: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
tiosgz
cdc057f09a seat: NULL-check on keyboard.modifiers event
It can be sent before keyboard.keymap (for example
when running swaylock from a different tty), in
which case the xkb state isn't initialized yet.
2022-02-10 09:40:06 +01:00