Commit Graph

35 Commits

Author SHA1 Message Date
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
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
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
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
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
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
Robin Ebert
bdeb891378 Use mlock for password buffer 2022-06-15 10:49:32 +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
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
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
Alexander Martin
666ae950bc Adds option to show indicator even if idle 2019-08-04 02:15:49 -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
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
Ian Fan
b87e2a4916 Remove references to pango 2019-01-23 12:20:24 +00:00
Connor E
648b0ccd64 Make setuid error clearer. 2019-01-18 13:52:17 +00:00
emersion
c77f0eb4ed
Check password without blocking 2019-01-17 12:42:13 +01:00
emersion
0c7932a3af
Move PAM into a child process 2019-01-17 09:53:23 +01:00
Brian Ashworth
dff6b63725 Remove list.c
This replaces all occurrences of `list_t` with `wl_list` to eliminate
the need for `list.c`
2019-01-15 09:26:18 +01:00
Brian Ashworth
e3935ad143 Implement logging and remove wlroots dependency
This implements a simpler version of the wlroots logger for swaylock.
With this logger, the dependency on wlroots can be dropped. This also
adds a debug flag and disables debugging output by default
2019-01-14 23:30:54 -05:00
Robinhuett
1e7696fceb Add caps lock state to indicator
This implements customization for the indicator as proposed in sway#2788 with comments from sway#3367 in mind.
The default behaviour does not change exept for the caps lock text color.
Since these changes seem to be lost in the split I've remade them.
2019-01-14 16:51:04 +01:00
Drew DeVault
0c9501e0b0 Remove unused functions in common code 2019-01-13 21:19:43 -05:00
Drew DeVault
b90637e2a6 Convert swaylock into standalone project 2019-01-13 21:16:47 -05:00