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.
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.
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.
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)
...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;