the short opt -t does not accept optional argument since it'd
break short option chaining.
e.g `nsxiv -tp` currently works as `nsxiv -t -p` but if `-t`
accepted optional argument then it'd stop working since "p" will
be interpreted as argument to `-t` instead of being a flag.
ref: https://codeberg.org/nsxiv/nsxiv/issues/404
`print_usage` is called in two cases:
1) when `-h` is given on the command line.
2) when there is a usage error.
In the first case, the help message should go to stdout. In the second case,
it is an error, and should go to stderr.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/510
Reviewed-by: NRK <nrk@disroot.org>
Co-authored-by: André Marçais <pex@marcais.net>
Co-committed-by: André Marçais <pex@marcais.net>
currently, there's no feedback on when the statusbar text is
getting truncated due to insufficient space. this prints an
ellipsis if the text wouldn't be able to fit inside the given
width to indicate truncation.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/501
Reviewed-by: eylles <eylles@noreply.codeberg.org>
by default imlib2 uses a compression level of 2 for writing
pngs, which is rather low.
a compression level of 8 should result in slightly lower
thumbnail filesizes without affecting the encoding speed too
much (since these thumbnails are very small already).
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/505
Reviewed-by: eylles <eylles@noreply.codeberg.org>
to reproduce:
( unset HOME XDG_CACHE_HOME; nsxiv -t ~/pictures; )
the code never really worked without a cache_dir going back to
original sxiv. so just fatally error out instead of crashing
with a null pointer dereference.
the imlib2 based multi-frame loader has not respected -A setting
since it's introduction in commit 76c2b81b.
also change multi.framedelay to `int` to avoid signedness change
warning.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/503
Reviewed-by: eylles <eylles@noreply.codeberg.org>
for cases like "/file", `base - filepath` will result in 0
instead of 1.
regression introduced in: 94d531fd82
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/498
Reviewed-by: eylles <eylles@noreply.codeberg.org>
for whatever reason, the path where homebrew installs headers
and libraries are no longer being searched by default. work
around it by manually specifying them with -I and -L.
this makes it so that script outputs are read when the script
actually finishes. one objection to reading on POLLHUP was that
the script might fill up the pipe and get stuck. we already mark
the read-end as non-blocking on our end so might as well make
the write-end non-blocking as well which avoids the script
getting blocked after (and if) it fills up the pipe.
ref: https://codeberg.org/nsxiv/nsxiv/pulls/334
Closes: https://codeberg.org/nsxiv/nsxiv/issues/377
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/490
Reviewed-by: eylles <eylles@noreply.codeberg.org>
When rotating a partially shown image (i.e. image size * zoom >
window size) the image is panned to top or left (if `win->w` or
`win->h` is greatest, respectively). Seems to be due to
unsignedness of `win->[wh]`, when taking the difference between
them in `img_rotate` either `img->[xy]` ends up being close to
`UINT_MAX` and the image is panned to top or left edge.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/493
Reviewed-by: NRK <nrk@disroot.org>
Co-authored-by: e5150 <e5150@noreply.codeberg.org>
Co-committed-by: e5150 <e5150@noreply.codeberg.org>
A decent amount of users have been confused by this.
So make it more explicit to avoid confusion.
Co-authored-by: NRK <nrk@disroot.org>
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/488
Reviewed-by: NRK <nrk@disroot.org>
Co-authored-by: fxdn <fxdn@noreply.codeberg.org>
Co-committed-by: fxdn <fxdn@noreply.codeberg.org>
disable misc-include-cleaner, it nags about "directly" including
things like "stdbool.h" instead of relying on "nsxiv.h" for it.
also disable bugprone-switch-missing-default-case which nags
about missing `default` switch cases.
this makes it more consistent with e4fceab by moving the key-handler
related messages to the right side as well.
additionally this fixes a regression introduced by 3659361 where the
left statusbar would remain at "Running key-handler..." if the image
didn't change.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/481
Reviewed-by: eylles <eylles@noreply.codeberg.org>
no longer needs to be a separate function now that the legacy loaders
are removed.
also remove a NOLINT comment and use `(void)var` to silence warning.
this removes the legacy gif and webp loaders. moving forward
multi-frame/animated images will be loaded by imlib2 itself.
Closes: https://codeberg.org/nsxiv/nsxiv/issues/397
by writing to a tmpfile first, and then renaming it to the desired
target - multiple nsxiv instances writing thumbnail at the same time are
guaranteed not to stomp over one another.
rename() is guaranteed to be atomic by POSIX. however, it can fail with
EXDEV if both the files don't reside in the same filesystem. and so we
cannot make the tmpfile something like "/tmp/nsxiv-XXXXXX".
instead, create the tmpfile inside the cache_dir to reduce chances of
EXDEV occuring.
currently the logic of when to open/close script is scattered around the
entire code-base which is both ugly and error-prone.
this patch centralizes script handling by remembering the relevant
information on each redraw and then comparing it with the previous
information to figure out whether something changed or not.
this also fixes a bug where scripts weren't being called in thumbnail
mode when mouse was used for selecting a different image.
Closes: https://codeberg.org/nsxiv/nsxiv/issues/475
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/477
Reviewed-by: eylles <eylles@noreply.codeberg.org>
4b67816 only partially fixed this issue. because imlib2's cache may not
have sub-second granularity, there still exists a time-frame while the
`mtime` has not yet been updated but we might be trying to reload the
image due to receiving an inotify event in which case imlib2 will end up
giving us the old frame.
imlib2 v1.12.0 adds a function that allows us to decache any frames
associated with a filename. this allows us to invalidate the cache
manually instead of relying on `mtime`.
but if that's not available due to older imlib2, then forcefully reload
the raw frames and decache them. this has the unfortunate cost that if
`mtime` *was* updated properly then we'll end up loading that image
twice.
fixes: https://codeberg.org/nsxiv/nsxiv/issues/456
don't capitalize "berg" in "Codeberg" spelling. Codeberg's official
sites does not seem to do so.
switch from "GPLv2" to "GPL-2.0-or-later" according to the spdx short
identifier: https://spdx.org/licenses/GPL-2.0-or-later.html
explicitly mention that Imlib2 needs to be built with X11 support.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/470
Reviewed-by: explosion-mental <explosion-mental@noreply.codeberg.org>
currently the autoreload feature of nsxiv is a bit unreliable because we
try to load at the very first event we received. however, the writer
might not be done writing and so we might try to load a truncated image
(and fail).
in the following ascii diagram, function S represents sleep and `+` sign
represents writes by the writer. because we set the sleep (of 10ms) at
the first event, subsequent writes by the writer doesn't influence our
reload logic:
S(10) load()
nsxiv | |
writer + + + + (done)
time(ms): 00 05 10 15
after this patch, (assuming function T (re)sets a timeout), we will keep
(re)setting a timeout on new events giving the writer more time to
finish:
T(10) T(10) T(10) T(10) load()
nsxiv | | | | |
writer + + + + (done)
time(ms): 00 05 10 15 20 25
while this patch makes things significantly more robust, the problem
here is inherently unsolvable since there's no way to tell whether the
writer is done writing or not.
for example, if user does something like `curl 'some.png' > test.png`
then curl might stop for a second or two in the middle of writing due to
internet issues - which will make nsxiv drop the image.
this patch also increases the autoreload delay from 10ms to now 128ms
instead to decrease chances of false failures.
ref: 6ae2df6ed5
partially-fixes: https://codeberg.org/nsxiv/nsxiv/issues/456
commit-message-by: NRK
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/459
Reviewed-by: eylles <eylles@noreply.codeberg.org>
1. `c99` doesn't exist on openbsd
2. `c99` behaves weirdly on macos (doesn't support -Wall)
since make will already set CC (required by POSIX if the implementation
supports C, see `man 1p make`) to something appropriate (or it might be
set in the environment) go ahead and remove explicitly setting it on our
end.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/455
Reviewed-by: TAAPArthur <taaparthur@noreply.codeberg.org>
these document improvements and/or removal of unnecessary code for when
we will require a higher minimum version of Imlib2.
all the comments have been prefixed with "UPGRADE: " for easy grepping.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/457
Reviewed-by: explosion-mental <explosion-mental@noreply.codeberg.org>
a lot of application which allow selecting features at build time seem
to output the build config with `--version` or similar (e.g ffmpeg).
aside from giving the user information about the feature set the binary
was compiled with (in case the user didn't compile it themselves, e.g on
a binary distro) it can also (possibly) help when submitting bug
reports.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/462
Reviewed-by: explosion-mental <explosion-mental@noreply.codeberg.org>
might as well make things consistent instead of having certain values
that can be NULL and certain that cannot.
some of the default values are still kept in config.h for example
reasons.
* switch to git ls-files to avoid picking up any other local .c files
* enable assertions during static analysis since we used some assertions to
disable/silence certain warnings.
* update TCC commit hash to a more recent one
* parallelize static analysis
cppcheck already has -j argument to parallelize it's analysis and
provide results faster, clang-tidy unfortunately doesn't.
so use xargs -P to archive parallel execution. on my system this brings
down the analysis time from ~27s to ~5s.
the fedora copr repo is no longer being updated since the maintainer of
it, mamg22, no longer uses nsxiv in his daily setup (and thus stopped
contributing to nsxiv as well).
he has requested the repo and his email to be removed from the project.
so go ahead and honor that request.
also take this as an opportunity to remove some long inactive
maintainers from the CURRENT MAINTAINERS section of the manpage.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/448
Reviewed-by: explosion-mental <explosion-mental@noreply.codeberg.org>
slight addendum to 657080a7e5
instead of disabling asserts by adding -DNDEBUG to config.mk, this
disables asserts by default in the source code itself. this way, if
someone compiles with `make CFLAGS="-O3 -march=native"` without knowing
about asserts/-DNDEBUG then he won't accidentally get a build with
assertions in it.
this basically makes the assertions opt-in, if someone wants it, he'll
need to *explicitly* set `-DDEBUG` to get it. so that it's not possible
to accidentally end up with assertions enabled.
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/447
Reviewed-by: TAAPArthur <taaparthur@noreply.codeberg.org>
gif spec [0] doesn't mention what to do when "Delay Time" is 0.
apng spec [1] states:
| If the the value of the numerator is 0 the decoder should render the
| next frame as quickly as possible, though viewers may impose a
| reasonable lower bound.
webp spec [2]:
| the interpretation of frame duration of 0 (and often <= 10) is
| implementation defined.
so it seems that it's safe to set a default delay for 0 delay frames,
which is what the older gif and webp loaders were already doing. do the
same for the imlib2 multi-frame loader as well.
[0]: https://www.w3.org/Graphics/GIF/spec-gif89a.txt
[1]: https://wiki.mozilla.org/APNG_Specification
[2]: https://developers.google.com/speed/webp/docs/riff_container#animation
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/445
Reviewed-by: eylles <eylles@noreply.codeberg.org>
this avoids overwriting the left side bar,
which might contain more important information,
for e.g output of the thumb-info script.
Co-authored-by: A1337Xyz <blindwizard@tutanota.com>
Co-authored-by: NRK <nrk@disroot.org>
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/446
Reviewed-by: eylles <eylles@noreply.codeberg.org>
Reviewed-by: NRK <nrk@disroot.org>
Co-authored-by: a1337xyz <a1337xyz@noreply.codeberg.org>
Co-committed-by: a1337xyz <a1337xyz@noreply.codeberg.org>
the multiframe loaders sets the color modifier to NULL but doesn't
restore it before returning. this results in a imlib2 developer warning
if you try to change brightness/contrast on a multiframe image (which
doesn't have alpha).
ensure that the color modifier is restored before returning under all
paths.
Reported-by: Madhu
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/440
Reviewed-by: eylles <eylles@noreply.codeberg.org>
by default imlib2 doesn't check the file's timestamp to avoid disk
activity when loading from cache. however, this ends up breaking our
autoreload functionality on multi-frame images.
the reason why single frame images weren't broken was because
`img_load()` calls `imlib_image_set_changes_on_disk()`, which tells
imlib2 to check the timestamp before loading from cache.
do the same thing for the multi-frame loader as well.
additionally add a comment to img_load() explaining what's going on.
Closes: https://codeberg.org/nsxiv/nsxiv/issues/436
Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/437
Reviewed-by: eylles <eylles@noreply.codeberg.org>
clang-tidy currently flags the following:
util.c:57:8: error: 'ptr' may be set to null if 'realloc' fails, which may result in a leak of the original buffer [bugprone-suspicious-realloc-usage,-warnings-as-errors]
ptr = realloc(ptr, size);
the analysis here is correct, but if realloc fails, we simply exit so
there's no real "leak".
moreover this check is not very useful for nsxiv's codebase because we
do not use naked realloc(), instead we use the erealloc wrapper that
exits on failure. so just disable the warning entirely instead of
changing the source code to silence the false positive.