From fb9686c6505475f342ad94fa5ed1351f554f97fe Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 9 Aug 2022 16:21:52 +0200 Subject: Move uncritical files into `etc/` (#350) This is mainly just to reduce the amount of files in the project root. The criteria of what gets into `etc/` are the following: * The file should not be necessary for building nsxiv. This excludes the `icon/*` stuff since that's needed by `window.c`. * The file shouldn't have any valid reason to stay in the project root. This excludes things like `README.md`, `.gitignore` etc. Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/350 Reviewed-by: explosion-mental --- etc/CHANGELOG.md | 397 +++++++++++++++++++++++++++ etc/CONTRIBUTING.md | 97 +++++++ etc/examples/image-info | 21 ++ etc/examples/key-handler | 41 +++ etc/examples/thumb-info | 20 ++ etc/examples/win-title | 27 ++ etc/nsxiv.1 | 565 +++++++++++++++++++++++++++++++++++++++ etc/nsxiv.desktop | 8 + etc/woodpecker/CFLAGS | 13 + etc/woodpecker/analysis.yml | 28 ++ etc/woodpecker/build.yml | 28 ++ etc/woodpecker/clang-tidy-checks | 17 ++ etc/woodpecker/spell.yml | 9 + 13 files changed, 1271 insertions(+) create mode 100644 etc/CHANGELOG.md create mode 100644 etc/CONTRIBUTING.md create mode 100755 etc/examples/image-info create mode 100755 etc/examples/key-handler create mode 100755 etc/examples/thumb-info create mode 100755 etc/examples/win-title create mode 100644 etc/nsxiv.1 create mode 100644 etc/nsxiv.desktop create mode 100644 etc/woodpecker/CFLAGS create mode 100644 etc/woodpecker/analysis.yml create mode 100644 etc/woodpecker/build.yml create mode 100644 etc/woodpecker/clang-tidy-checks create mode 100644 etc/woodpecker/spell.yml (limited to 'etc') diff --git a/etc/CHANGELOG.md b/etc/CHANGELOG.md new file mode 100644 index 0000000..100e24a --- /dev/null +++ b/etc/CHANGELOG.md @@ -0,0 +1,397 @@ +nsxiv - Changelog +----------------- + +**[git](https://codeberg.org/nsxiv/nsxiv.git)** + +Changes will only be documented on stable releases. If you're on git/master then +there may be more changes. Please use `git log` to view them. + +- - - + +***SPECIAL NOTE***: Due to [this incident](https://codeberg.org/nsxiv/nsxiv-tmp/issues/1) +we have moved development over to [CodeBerg](https://codeberg.org/nsxiv/nsxiv). + +A lot of the references *below* may now be 404 on GitHub. Any threads which +survived the wipe have been migrated over to [nsxiv-record]. All of the +references *above* can be found on the new main nsxiv repository on CodeBerg. + +[nsxiv-record]: https://codeberg.org/nsxiv/nsxiv-record/ + +- - - + +**[v30](https://codeberg.org/nsxiv/nsxiv/archive/v30.tar.gz)** +*(June 15, 2022)* + +* Changes: + + * Development and main repository moved over to Codeberg. + See the special note above for more info. + * `autoreload_{inotify,nop}.c` merged into a single file, `autoreload.c`. [#263] + * Moved all configuration related macros to `config.mk`. [#264] + * `win-title` is now called only when there's change rather than being called + on each redraw. [#266] + +* Added: + + * Added more mimetypes to the `.desktop` entry. [#260] + * Added `thumb-info` for customizing the statusbar in thumbnail-mode. [#265] + * Added comments for building on OpenBSD. [#264] + +* Fixes: + + * "Too many open file" error due to not closing the win-title script. [#245] + * `-f` now directly starts in fullscreen mode rather than opening a normal + window and then going fullscreen. [#251] + * Broken slideshow on slow systems or fast animations. [#282] + * Memory leak when removing an image in thumbnail mode. [#247] + * Correctly setting `_NET_WM_PID`. [#251] + * Don't override statusbar if info script doesn't exist. [#271] + * Potential misbehavior regarding font. [#250] + +[#245]: https://codeberg.org/nsxiv/nsxiv-record/pulls/245 +[#247]: https://codeberg.org/nsxiv/nsxiv-record/pulls/247 +[#250]: https://codeberg.org/nsxiv/nsxiv-record/pulls/250 +[#251]: https://codeberg.org/nsxiv/nsxiv-record/pulls/251 +[#263]: https://codeberg.org/nsxiv/nsxiv-record/pulls/263 +[#264]: https://codeberg.org/nsxiv/nsxiv-record/pulls/264 +[#260]: https://codeberg.org/nsxiv/nsxiv-record/pulls/260 +[#264]: https://codeberg.org/nsxiv/nsxiv-record/pulls/264 +[#265]: https://codeberg.org/nsxiv/nsxiv-record/pulls/265 +[#266]: https://codeberg.org/nsxiv/nsxiv-record/pulls/266 +[#271]: https://codeberg.org/nsxiv/nsxiv-record/pulls/271 +[#282]: https://codeberg.org/nsxiv/nsxiv-record/pulls/282 + +- - - + +**[v29](https://github.com/nsxiv/nsxiv/archive/v29.tar.gz)** +*(March 03, 2022)* + +* Changes: + + * Window title is now customizeable via `win-title`, cli flag `-T` and related + config.h options are removed. See `WINDOW TITLE` section of the manpage for + more info. [#213] + * Imlib2 cache size is now set based on total memory percentage, by default + set to 3%. [#184] + * Removed some non-POSIX extensions in the Makefile. [#225] + +* Added: + + * Ability to customize thumbnail mode mouse-bindings via `config.h`. [#167] + * Option to set statusbar position to top via `config.h`. [#231] + * New keybinding z to scroll to center. [#203] + +* Fixes: + + * Manpage cleanup: avoid confusing wording and document thumbnail mode + mouse-bindings. [#186] + * Wrong jpeg exif orientation with Imlib2 v1.7.5 (and above). [#188] + * Animation slowdown when zoomed in. [#200] + * Reset statusbar after failed keyhandler. [#191] + * Window title not working on certain WMs. [#234] + * Various compiler warnings. [#197] + +[#167]: https://codeberg.org/nsxiv/nsxiv-record/pulls/167 +[#184]: https://codeberg.org/nsxiv/nsxiv-record/pulls/184 +[#186]: https://codeberg.org/nsxiv/nsxiv-record/pulls/186 +[#188]: https://codeberg.org/nsxiv/nsxiv-record/pulls/188 +[#191]: https://codeberg.org/nsxiv/nsxiv-record/pulls/191 +[#197]: https://codeberg.org/nsxiv/nsxiv-record/pulls/197 +[#200]: https://codeberg.org/nsxiv/nsxiv-record/pulls/200 +[#203]: https://codeberg.org/nsxiv/nsxiv-record/pulls/203 +[#213]: https://codeberg.org/nsxiv/nsxiv-record/pulls/213 +[#225]: https://codeberg.org/nsxiv/nsxiv-record/pulls/225 +[#231]: https://codeberg.org/nsxiv/nsxiv-record/pulls/231 +[#234]: https://codeberg.org/nsxiv/nsxiv-record/pulls/234 + +- - - + +**[v28](https://github.com/nsxiv/nsxiv/archive/v28.tar.gz)** +*(December 12, 2021)* + +* Changes: + + * Statusbar made optional via `HAVE_LIBFONTS`. [#95] + * Remove library auto-detection, use `OPT_DEP_DEFAULT` instead. [#71] + * Example scripts will now be installed into `EGPREFIX` + (`$(PREFIX)/share/doc/nsxiv/examples` by default). See README for more + info. [#86] + +* Added: + + * Animated webp support (optional via `HAVE_LIBWEBP`). [#20] + * New mouse-binding Ctrl-Button1 for relative drag. [#117] + * Ability to configure colors and fonts in `config.h`. [#115] + * Ability to configure navigation width area in `config.h`. [#155] + * Ability to customize the set of modifiers used when processing keybindings + in `config.h` via `USED_MODMASK`. [#150] + * Ability to configure Imlib2's cache size for better image (re)loading + performance in `config.h`. [#171] + * Cli flag `-0` for sending null-seperated file-list to standard out (`-o`), + and key-handler and receiving null-seperated file-list via stdin (`-i`). + [#68] [#141] [#164] + * Export environment variable `NSXIV_USING_NULL` to key-handler. [#164] + * Embed new nsxiv icon. [#163] + * `make install-icon` to install icons. [#80] [#96] + * `make install-desktop` to install .desktop entry. [#80] [#96] + * `make install-all` to install everything. [#80] [#96] + * Configurable `KEYHANDLER_ABORT` in `config.h`. [#91] [#172] + * Statusbar message upon key-handler activation. [#98] + * Ability to write custom C functions in `config.h` and use them via + keybindings. [#76] + +* Fixes: + + * Not able to use `KEYHANDLER_ABORT` key (Escape by default) in + regular keybindings. [#91] + * Memory leak related to Xresources. [#134] + * Memory leak in gif loader. [#165] + * Better handle gif colormap and prevent out-of-bound access. [#165] + * Prevent crash when zooming out in very small images. [#178] + * Removed non-POSIX commands and extensions from `Makefile`. [#71] + * Regression where nsxiv wouldn't run on non-TrueColor X server. [#114] + * Wrong comments in `config.h` and description in `manpage`. + [#105] [#106] [#152] + +[#20]: https://codeberg.org/nsxiv/nsxiv-record/pulls/20 +[#68]: https://codeberg.org/nsxiv/nsxiv-record/pulls/68 +[#71]: https://codeberg.org/nsxiv/nsxiv-record/pulls/71 +[#76]: https://codeberg.org/nsxiv/nsxiv-record/pulls/76 +[#80]: https://codeberg.org/nsxiv/nsxiv-record/pulls/80 +[#86]: https://codeberg.org/nsxiv/nsxiv-record/pulls/86 +[#91]: https://codeberg.org/nsxiv/nsxiv-record/pulls/91 +[#95]: https://codeberg.org/nsxiv/nsxiv-record/pulls/95 +[#96]: https://codeberg.org/nsxiv/nsxiv-record/pulls/96 +[#98]: https://codeberg.org/nsxiv/nsxiv-record/pulls/98 +[#105]: https://codeberg.org/nsxiv/nsxiv-record/pulls/105 +[#106]: https://codeberg.org/nsxiv/nsxiv-record/pulls/106 +[#114]: https://codeberg.org/nsxiv/nsxiv-record/pulls/114 +[#115]: https://codeberg.org/nsxiv/nsxiv-record/pulls/115 +[#117]: https://codeberg.org/nsxiv/nsxiv-record/pulls/117 +[#134]: https://codeberg.org/nsxiv/nsxiv-record/pulls/134 +[#141]: https://codeberg.org/nsxiv/nsxiv-record/pulls/141 +[#150]: https://codeberg.org/nsxiv/nsxiv-record/pulls/150 +[#152]: https://codeberg.org/nsxiv/nsxiv-record/pulls/152 +[#155]: https://codeberg.org/nsxiv/nsxiv-record/pulls/155 +[#163]: https://codeberg.org/nsxiv/nsxiv-record/pulls/163 +[#164]: https://codeberg.org/nsxiv/nsxiv-record/pulls/164 +[#165]: https://codeberg.org/nsxiv/nsxiv-record/pulls/165 +[#171]: https://codeberg.org/nsxiv/nsxiv-record/pulls/171 +[#172]: https://codeberg.org/nsxiv/nsxiv-record/pulls/172 +[#178]: https://codeberg.org/nsxiv/nsxiv-record/pulls/178 + +- - - + +**[v27.1](https://github.com/nsxiv/nsxiv/archive/v27.1.tar.gz)** +*(September 16, 2021)* + +* Fixes: + + * Source tarball failing build [#66] + +[#66]: https://codeberg.org/nsxiv/nsxiv-record/pulls/66 + +- - - + +**[v27](https://github.com/nsxiv/nsxiv/archive/v27.tar.gz)** +*(September 16, 2021)* + +* Changes: + + * Re-release under the name nsxiv. + * Xresources `Sxiv.foreground` and `Sxiv.background` changed + to `Nsxiv.window.foreground` and `Nsxiv.window.background`. + * Xresources `Sxiv.font` changed to `Nsxiv.bar.font`. + * Rework the build system. Now by default we'll build with only optional + dependencies that are already installed. [#19] + +* Added: + + * Fill scale mode. [#2] + * Configurable X window title (via `config.h` and the `-T` flag). [#23] + * Support custom bar colors via Xresources. [#19] + * Support custom mark color via Xresources. [#51] + * Toggle animation playback with Ctrl-a. [#33] + * Set `_NET_WM_PID` and `WM_CLIENT_MACHINE` X properties. [#13] + * Set `ICCCM WM manager` hints. [#12] + +* Fixes: + + * Cli flag `-G` not initially setting gamma. [#31] + * Wrong keybinding description in the manpage. [#14] + * .desktop entry not advertising webp support. [#15] + * Prevent crash when embedded into transparent window. [#3] + * Small memory leak. [#57] + * Rare crash when showing some GIFs. [#41] + * Rare event where nsxiv wouldn't close after window being destroyed. [#53] + +[#2]: https://codeberg.org/nsxiv/nsxiv-record/pulls/2 +[#3]: https://codeberg.org/nsxiv/nsxiv-record/pulls/3 +[#12]: https://codeberg.org/nsxiv/nsxiv-record/pulls/12 +[#13]: https://codeberg.org/nsxiv/nsxiv-record/pulls/13 +[#14]: https://codeberg.org/nsxiv/nsxiv-record/pulls/14 +[#15]: https://codeberg.org/nsxiv/nsxiv-record/pulls/15 +[#19]: https://codeberg.org/nsxiv/nsxiv-record/pulls/19 +[#23]: https://codeberg.org/nsxiv/nsxiv-record/pulls/23 +[#31]: https://codeberg.org/nsxiv/nsxiv-record/pulls/31 +[#33]: https://codeberg.org/nsxiv/nsxiv-record/pulls/33 +[#41]: https://codeberg.org/nsxiv/nsxiv-record/pulls/41 +[#51]: https://codeberg.org/nsxiv/nsxiv-record/pulls/51 +[#53]: https://codeberg.org/nsxiv/nsxiv-record/pulls/53 +[#57]: https://codeberg.org/nsxiv/nsxiv-record/pulls/57 + + +sxiv +---- + +**Stable releases** + +**[v26](https://github.com/nsxiv/nsxiv/archive/v26.tar.gz)** +*(January 16, 2020)* + + * Maintenance release + +**[v25](https://github.com/nsxiv/nsxiv/archive/v25.tar.gz)** +*(January 26, 2019)* + + * Support font fallback for missing glyphs + * Fix busy loop when built without inotify + * Use background/foreground colors from X resource database + +**[v24](https://github.com/nsxiv/nsxiv/archive/v24.tar.gz)** +*(October 27, 2017)* + + * Automatically reload the current image whenever it changes + * Support embedding into other X windows with -e (e.g. tabbed) + * New option -p prevents sxiv from creating cache and temporary files + * Simpler mouse mappings, the most basic features are accessible with the + mouse only (navigate, zoom, pan) + +**[v1.3.2](https://github.com/nsxiv/nsxiv/archive/v1.3.2.tar.gz)** +*(December 20, 2015)* + + * external key handler gets file paths on stdin, not as arguments + * Cache out-of-view thumbnails in the background + * Apply gamma correction to thumbnails + +**[v1.3.1](https://github.com/nsxiv/nsxiv/archive/v1.3.1.tar.gz)** +*(November 16, 2014)* + + * Fixed build error, caused by delayed config.h creation + * Fixed segfault when run with -c + +**[v1.3](https://github.com/nsxiv/nsxiv/archive/v1.3.tar.gz)** +*(October 24, 2014)* + + * Extract thumbnails from EXIF tags (requires libexif) + * Zoomable thumbnails, supported sizes defined in config.h + * Fixed build error with giflib version >= 5.1.0 + +**[v1.2](https://github.com/nsxiv/nsxiv/archive/v1.2.tar.gz)** +*(April 24, 2014)* + + * Added external key handler, called on keys prefixed with `Ctrl-x` + * New keybinding `{`/`}` to change gamma (by András Mohari) + * Support for slideshows, enabled with `-S` option & toggled with `s` + * Added application icon (created by 0ion9) + * Checkerboard background for alpha layer + * Option `-o` only prints files marked with `m` key + * Fixed rotation/flipping of multi-frame images (gifs) + +**[v1.1.1](https://github.com/nsxiv/nsxiv/archive/v1.1.1.tar.gz)** +*(June 2, 2013)* + + * Various bug fixes + +**[v1.1](https://github.com/nsxiv/nsxiv/archive/v1.1.tar.gz)** +*(March 30, 2013)* + + * Added status bar on bottom of window with customizable content + * New keyboard shortcuts `\`/`|`: flip image vertically/horizontally + * New keyboard shortcut `Ctrl-6`: go to last/alternate image + * Added own EXIF orientation handling, removed dependency on libexif + * Fixed various bugs + +**[v1.0](https://github.com/nsxiv/nsxiv/archive/v1.0.tar.gz)** +*(October 31, 2011)* + + * Support for multi-frame images & GIF animations + * POSIX compliant (IEEE Std 1003.1-2001) + +**[v0.9](https://github.com/nsxiv/nsxiv/archive/v0.9.tar.gz)** +*(August 17, 2011)* + + * Made key and mouse mappings fully configurable in config.h + * Complete code refactoring + +**[v0.8.2](https://github.com/nsxiv/nsxiv/archive/v0.8.2.tar.gz)** +*(June 29, 2011)* + + * POSIX-compliant Makefile; compiles under NetBSD + +**[v0.8.1](https://github.com/nsxiv/nsxiv/archive/v0.8.1.tar.gz)** +*(May 8, 2011)* + + * Fixed fullscreen under window managers, which are not fully EWMH-compliant + +**[v0.8](https://github.com/nsxiv/nsxiv/archive/v0.8.tar.gz)** +*(April 18, 2011)* + + * Support for thumbnail caching + * Ability to run external commands (e.g. jpegtran, convert) on current image + +**[v0.7](https://github.com/nsxiv/nsxiv/archive/v0.7.tar.gz)** +*(February 26, 2011)* + + * Sort directory entries when using `-r` command line option + * Hide cursor in image mode + * Full functional thumbnail mode, use Return key to switch between image and + thumbnail mode + +**[v0.6](https://github.com/nsxiv/nsxiv/archive/v0.6.tar.gz)** +*(February 16, 2011)* + + * Bug fix: Correctly display filenames with umlauts in window title + * Basic support of thumbnails + +**[v0.5](https://github.com/nsxiv/nsxiv/archive/v0.5.tar.gz)** +*(February 6, 2011)* + + * New command line option: `-r`: open all images in given directories + * New key shortcuts: `w`: resize image to fit into window; `W`: resize window + to fit to image + +**[v0.4](https://github.com/nsxiv/nsxiv/archive/v0.4.tar.gz)** +*(February 1, 2011)* + + * New command line option: `-F`, `-g`: use fixed window dimensions and apply + a given window geometry + * New key shortcut: `r`: reload current image + +**[v0.3.1](https://github.com/nsxiv/nsxiv/archive/v0.3.1.tar.gz)** +*(January 30, 2011)* + + * Bug fix: Do not set setuid bit on executable when using `make install` + * Pan image with mouse while pressing middle mouse button + +**[v0.3](https://github.com/nsxiv/nsxiv/archive/v0.3.tar.gz)** +*(January 29, 2011)* + + * New command line options: `-d`, `-f`, `-p`, `-s`, `-v`, `-w`, `-Z`, `-z` + * More mouse mappings: Go to next/previous image with left/right click, + scroll image with mouse wheel (horizontally if Shift key is pressed), + zoom image with mouse wheel if Ctrl key is pressed + +**[v0.2](https://github.com/nsxiv/nsxiv/archive/v0.2.tar.gz)** +*(January 23, 2011)* + + * Bug fix: Handle window resizes correctly + * New keyboard shortcuts: `g`/`G`: go to first/last image; `[`/`]`: go 10 + images back/forward + * Support for mouse wheel zooming (by Dave Reisner) + * Added fullscreen mode + +**[v0.1](https://github.com/nsxiv/nsxiv/archive/v0.1.tar.gz)** +*(January 21, 2011)* + + * Initial release diff --git a/etc/CONTRIBUTING.md b/etc/CONTRIBUTING.md new file mode 100644 index 0000000..8d9680f --- /dev/null +++ b/etc/CONTRIBUTING.md @@ -0,0 +1,97 @@ +Project Scope +------------- + + * Bug fixes and maintenance + * Prioritize extensibility and simplicity + * Do not make the codebase more complex, keep it simple to hack on + * Do not add extra dependency (if we do, add compile time switch to disable it) + * New features may be added if it cannot be achieved (easily) via a shell script, + doesn't break backwards compatibility and doesn't violate any of the above rules. + +Note: Since we aim to be a drop-in replacement for sxiv, we intend to keep all +sxiv's behaviors/features even in cases where removing them would make the +code-base simpler. + +Also note that (n)sxiv uses `imlib2` for loading images. Thus any request or +patches for adding support for new image formats should go into +[imlib2's repo](https://git.enlightenment.org/old/legacy-imlib2) instead. + + +Contribution Guideline +---------------------- + +When contributing, make sure: + + * Your contribution falls under nsxiv's scope and aim + * You follow the existing code style (see [.editorconfig](../.editorconfig)) + * You open the pull request from a new branch, not from master + * To avoid using force pushes, especially for bigger patches. Only use them + when there's merge conflicts. + +If your contribution is not suitable for general use, it will not be included in nsxiv. +For changes that are very much up to preference, such as changing values in config.h, +please do not open a pull request unless you have an objective explanation. + +See the [open issues](https://codeberg.org/nsxiv/nsxiv/issues) to find something +to work on. You can also filter the issues via label: + +* [Good first issue](https://codeberg.org/nsxiv/nsxiv/issues?labels=49698): + (Easy) Issues which do not require much if any experience. +* [Up for grabs](https://codeberg.org/nsxiv/nsxiv/issues?labels=49705): + (Intermediate) Issues which are free for anyone who wants to pick it up. + Might require some experience. +* [Help wanted](https://codeberg.org/nsxiv/nsxiv/issues?labels=49699): + (Intermediate/Experienced) Issues where we require some help. + + +Development workflow for maintainers +------------------------------------ + +If we notice you contributing and/or showing interest in issues/pull requests, +we may invite you to join the nsxiv org as a member. Being a member simply means +you will be able to approve, disapprove and merge pull requests. + +Our workflow regarding pull requests is the following: + + * Code related changes require two approvals, but documentation related + changes (e.g. typo) can be merged with just one. + * If a pull request has a single approval, no objections and has been open + for more than 7 days, then it may be force-merged. + * Always prefer squashing when merging. In the case a PR makes more than one + significant change, use the "don't squash" tag and rebase instead. + * When merging, make sure the commit message is cleaned up properly so that + it reflects the current intention of the PR. + +For releases, the process is the following: + + * Tag the release with a "vN" tag, where N is the version number. Also set + the commit message and tag description for the release commit to "Release + version N". Make sure to use an annotated tag. + * Update `VERSION` macro in `config.mk`. + * Update the changelog (`etc/CHANGELOG.md`): + * Include link to the release tarball and add the release date. + * Document only the changes or fixes between releases. Don't document + changes which never made it into a release. + * Use the "Changes" section to document behavior changes since the last + release, the "Added" section for new features, and the "Fixes" section + for fixed bugs or regressions. + * Include pull request IDs with reference style links. + +Mirroring to GitHub: + +Assuming `origin` is the name of the codeberg remote and `github` is the name +of the github remote; run the following commands to mirror the codeberg repo to +github: + +```console +$ git fetch --prune origin +$ git push --prune github '+refs/remotes/origin/*:refs/heads/*' '+refs/tags/*:refs/tags/*' +``` + +The first command updates the local repo and the second command pushes +everything on `origin` without pushing any of the local branches. + +- - - + +For mundane development related talks which don't warrant their own issue, use +the [general discussion](https://codeberg.org/nsxiv/nsxiv/issues/294) thread. diff --git a/etc/examples/image-info b/etc/examples/image-info new file mode 100755 index 0000000..5f06123 --- /dev/null +++ b/etc/examples/image-info @@ -0,0 +1,21 @@ +#!/bin/sh + +# Example for $XDG_CONFIG_HOME/nsxiv/exec/image-info +# Called by nsxiv(1) whenever an image gets loaded. +# The output is displayed in nsxiv's status bar. +# Arguments: +# $1: path to image file (as provided by the user) +# $2: image width +# $3: image height +# $4: fully resolved path to the image file + +s=" " # field separator + +exec 2>/dev/null + +filename=$(basename -- "$1") +filesize=$(du -Hh -- "$1" | cut -f 1) +geometry="${2}x${3}" + +echo "${filesize}${s}${geometry}${s}${filename}" + diff --git a/etc/examples/key-handler b/etc/examples/key-handler new file mode 100755 index 0000000..3fe741d --- /dev/null +++ b/etc/examples/key-handler @@ -0,0 +1,41 @@ +#!/bin/sh + +# Example for $XDG_CONFIG_HOME/nsxiv/exec/key-handler +# Called by nsxiv(1) after the external prefix key (C-x by default) is pressed. +# The next key combo is passed as its first argument. Passed via stdin are the +# images to act upon: all marked images, if in thumbnail mode and at least one +# image has been marked, otherwise the current image. nsxiv(1) will block until +# the handler terminates. It then checks which images have been modified and +# reloads them. + +# By default nsxiv(1) will send one image per-line to stdin, however when using +# -0 the image list will be NULL separated and the environment variable +# "$NSXIV_USING_NULL" will be set to 1. + +# The key combo argument has the following form: "[C-][M-][S-]KEY", +# where C/M/S indicate Ctrl/Meta(Alt)/Shift modifier states and KEY is the X +# keysym as listed in /usr/include/X11/keysymdef.h without the "XK_" prefix. +# If KEY has an uppercase equivalent, S-KEY is resolved into it. For instance, +# K replaces S-k and Scedilla replaces S-scedilla, but S-Delete is sent as-is. + +rotate() { + degree="$1" + tr '\n' '\0' | xargs -0 realpath | sort | uniq | while read file; do + case "$(file -b -i "$file")" in + image/jpeg*) jpegtran -rotate "$degree" -copy all -outfile "$file" "$file" ;; + *) mogrify -rotate "$degree" "$file" ;; + esac + done +} + +case "$1" in +"C-x") xclip -in -filter | tr '\n' ' ' | xclip -in -selection clipboard ;; +"C-c") while read file; do xclip -selection clipboard -target image/png "$file"; done ;; +"C-e") while read file; do urxvt -bg "#444" -fg "#eee" -sl 0 -title "$file" -e sh -c "exiv2 pr -q -pa '$file' | less" & done ;; +"C-g") tr '\n' '\0' | xargs -0 gimp & ;; +"C-r") while read file; do rawtherapee "$file" & done ;; +"C-comma") rotate 270 ;; +"C-period") rotate 90 ;; +"C-slash") rotate 180 ;; +esac + diff --git a/etc/examples/thumb-info b/etc/examples/thumb-info new file mode 100755 index 0000000..b422f9c --- /dev/null +++ b/etc/examples/thumb-info @@ -0,0 +1,20 @@ +#!/bin/sh + +# Example for $XDG_CONFIG_HOME/nsxiv/exec/thumb-info +# Called by nsxiv(1) whenever the selected thumbnail changes. +# The output is displayed in nsxiv's status bar. +# Arguments: +# $1: path to image file (as provided by the user) +# $2: empty +# $3: empty +# $4: fully resolved path to the image file + +s=" " # field separator + +exec 2>/dev/null + +filename=$(basename -- "$4") +filesize=$(du -Hh -- "$4" | cut -f 1) + +echo "${filesize}${s}${filename}" + diff --git a/etc/examples/win-title b/etc/examples/win-title new file mode 100755 index 0000000..31994ef --- /dev/null +++ b/etc/examples/win-title @@ -0,0 +1,27 @@ +#!/bin/sh + +# Example for $XDG_CONFIG_HOME/nsxiv/exec/win-title +# Called by nsxiv(1) whenever any of the relevant information changes. +# The output is set as nsxiv's window title. +# +# Arguments, "Optional" arguments might be empty: +# $1: resolved absolute path of the current file +# $2: current file number +# $3: total file number +# $4: image width (Optional: Disabled on thumbnails mode) +# $5: image height (Optional: Disabled on thumbnails mode) +# $6: current zoom (Optional: Disabled on thumbnails mode) +# +# The term file is used rather than image as nsxiv does not +# precheck that the input files are valid images. Total file +# count may be different from the actual count of valid images. + +exec 2>/dev/null + +filename="${1##*/}" + +if [ -n "$4" ]; then # image mode + printf "%s" "nsxiv - ${filename} | ${4}x${5} ${6}% [${2}/${3}]" +else + printf "%s" "nsxiv - ${filename} [${2}/${3}]" +fi diff --git a/etc/nsxiv.1 b/etc/nsxiv.1 new file mode 100644 index 0000000..f4801b0 --- /dev/null +++ b/etc/nsxiv.1 @@ -0,0 +1,565 @@ +.TH NSXIV 1 nsxiv\-VERSION +.SH NAME +nsxiv \- Neo Simple X Image Viewer +.SH SYNOPSIS +.B nsxiv +.RB [ \-abcfhiopqrtvZ0 ] +.RB [ \-A +.IR FRAMERATE ] +.RB [ \-e +.IR WID ] +.RB [ \-G +.IR GAMMA ] +.RB [ \-g +.IR GEOMETRY ] +.RB [ \-N +.IR NAME ] +.RB [ \-n +.IR NUM ] +.RB [ \-S +.IR DELAY ] +.RB [ \-s +.IR MODE ] +.RB [ \-z +.IR ZOOM ] +.IR FILE ... +.SH DESCRIPTION +nsxiv is a simple image viewer for X. +.P +It has two modes of operation: image and thumbnail mode. The default is image +mode, in which only the current image is shown. In thumbnail mode a grid of +small previews is displayed, making it easy to choose an image to open. +.P +Please note, that the fullscreen mode requires an EWMH/NetWM-compliant window +manager. +.SH OPTIONS +.TP +.BI "\-A " FRAMERATE +Play animations with a constant frame rate set to +.IR FRAMERATE . +.TP +.B \-a +Play animations of multi-frame images. +.TP +.B \-b +Do not show statusbar at the bottom of the window. +.TP +.B \-c +Remove all orphaned cache files from the thumbnail cache directory and exit. +.TP +.BI "\-e " WID +Embed nsxiv's window into window whose ID is +.IR WID . +.TP +.B \-f +Start in fullscreen mode. +.TP +.BI "\-G " GAMMA +Set image gamma to GAMMA (\-32..32). +.TP +.BI "\-g " GEOMETRY +Set window position and size. See section GEOMETRY SPECIFICATIONS of X(7) for +more information on GEOMETRY argument. +.TP +.BI "\-N " NAME +Set the resource name of nsxiv's X window to NAME. +.TP +.BI "\-n " NUM +Start at picture number NUM. +.TP +.B \-h +Print brief usage information to standard output and exit. +.TP +.B \-i +Read names of files to open from standard input. Also done if FILE is `-'. +.TP +.B \-o +Write list of all marked files to standard output when quitting. In combination +with +.B \-i +nsxiv can be used as a visual filter/pipe. +.TP +.B \-p +Enable private mode, in which nsxiv does not write any cache or temporary files. +.TP +.B \-q +Be quiet, and disable warnings to standard error stream. +.TP +.B \-r +Search the given directories recursively for images to view. +.TP +.BI "\-S " DELAY +Start in slideshow mode. Set the delay between images to +.I DELAY +seconds. +.I DELAY +may be a floating-point number. +.TP +.BI "\-s " MODE +Set scale mode according to MODE character. Supported modes are: [d]own, +[f]it, [F]ill, [w]idth, [h]eight. +.TP +.B \-t +Start in thumbnail mode. +.TP +.B \-v +Print version information to standard output and exit. +.TP +.B \-Z +The same as `\-z 100'. +.TP +.BI "\-z " ZOOM +Set zoom level to ZOOM percent. +.TP +.B \-0 +Use NULL-separator. With this option, output of \-o and file-list sent to the +key-handler and the input of \-i will be separated by a NULL character. +.SH KEYBOARD COMMANDS +.SS General +The following keyboard commands are available in both image and thumbnail modes: +.TP +.BR 0 \- 9 +Prefix the next command with a number (denoted via +.IR count ). +.TP +.B q +Quit nsxiv. +.TP +.B Return +Switch to thumbnail mode / open selected image in image mode. +.TP +.B f +Toggle fullscreen mode. +.TP +.B b +Toggle visibility of statusbar at the bottom of the window. +.TP +.B Ctrl-x +Send the next key to the external key-handler. See section EXTERNAL KEY HANDLER +for more information. +.TP +.B g +Go to the first image. +.TP +.B G +Go to the last image, or image number +.IR count . +.TP +.B r +Reload image. +.TP +.B D +Remove current image from file list and go to next image. +.TP +.BR Ctrl-h ", " Ctrl-Left +Scroll left one screen width. +.TP +.BR Ctrl-j ", " Ctrl-Down +Scroll down one screen height. +.TP +.BR Ctrl-k ", " Ctrl-Up +Scroll up one screen height. +.TP +.BR Ctrl-l ", " Ctrl-Right +Scroll right one screen width. +.TP +.BR + +Zoom in. +.TP +.B \- +Zoom out. +.TP +.B m +Mark/unmark the current image. +.TP +.B M +Mark/unmark all images starting from the last marked/unmarked image up to the +current one. +.TP +.B Ctrl-m +Reverse all image marks. +.TP +.B Ctrl-u +Remove all image marks. +.TP +.B N +Go +.I count +marked images forward. +.TP +.B P +Go +.I count +marked images backward. +.TP +.B { +Decrease gamma correction by +.I count +steps. +.TP +.B } +Increase gamma correction by +.I count +steps. +.TP +.B Ctrl-g +Reset gamma correction. +.SS Thumbnail mode +The following keyboard commands are only available in thumbnail mode: +.TP +.BR h ", " Left +Move selection left +.I count +times. +.TP +.BR j ", " Down +Move selection down +.I count +times. +.TP +.BR k ", " Up +Move selection up +.I count +times. +.TP +.BR l ", " Right +Move selection right +.I count +times. +.TP +.B R +Reload all thumbnails. +.SS Image mode +The following keyboard commands are only available in image mode: +.TP +Navigate image list: +.TP +.BR n ", " Space +Go +.I count +images forward. +.TP +.BR p ", " Backspace +Go +.I count +images backward. +.TP +.B [ +Go +.I count +* 10 images backward. +.TP +.B ] +Go +.I count +* 10 images forward. +.TP +.B Ctrl-6 +Go to the previously viewed image. +.TP +Handle multi-frame images: +.TP +.B Ctrl-n +Go +.I count +frames of a multi-frame image forward. +.TP +.B Ctrl-p +Go +.I count +frames of a multi-frame image backward. +.TP +.BR Ctrl-a ", " Ctrl-Space +Play/stop animations of multi-frame images. +.TP +Panning: +.TP +.BR h ", " Left +Scroll image 1/5 of window width or +.I count +pixels left. +.TP +.BR j ", " Down +Scroll image 1/5 of window height or +.I count +pixels down. +.TP +.BR k ", " Up +Scroll image 1/5 of window height or +.I count +pixels up. +.TP +.BR l ", " Right +Scroll image 1/5 of window width or +.I count +pixels right. +.TP +.B H +Scroll to left image edge. +.TP +.B J +Scroll to bottom image edge. +.TP +.B K +Scroll to top image edge. +.TP +.B L +Scroll to right image edge. +.TP +.B z +Scroll to image center. +.TP +Zooming: +.TP +.B = +Set zoom level to 100%, or +.IR count %. +.TP +.B w +Set zoom level to 100%, but fit large images into window. +.TP +.B W +Fit image to window. +.TP +.B F +Fill image to window. +.TP +.B e +Fit image to window width. +.TP +.B E +Fit image to window height. +.TP +Rotation: +.TP +.B < +Rotate image counter-clockwise by 90 degrees. +.TP +.B > +Rotate image clockwise by 90 degrees. +.TP +.B ? +Rotate image by 180 degrees. +.TP +Flipping: +.TP +.B | +Flip image horizontally. +.TP +.B _ +Flip image vertically. +.TP +Miscellaneous: +.TP +.B a +Toggle anti-aliasing. +.TP +.B A +Toggle visibility of alpha-channel, i.e. image transparency. +.TP +.B s +Toggle slideshow mode and/or set the delay between images to +.I count +seconds. +.SH MOUSE COMMANDS +.SS Thumbnail mode +The following mouse mappings are available in thumbnail mode: +.TP +.B Button1 +Select the image. Goes into image mode if double\-clicked. +.TP +.B Button3 +Mark/unmark the image. Dragging while holding down Button3 will mark/unmark +multiple images. +.TP +.B Button4 +Scroll up by one row. +.TP +.B Button5 +Scroll down by one row. +.TP +.B Ctrl-Button4 +Scroll up by one page. +.TP +.B Ctrl-Button5 +Scroll down by one page. +.SS Image mode +The following mouse mappings are available in image mode: +.TP +.B Button1 +Go to the next image if the mouse cursor is in the right part of the window or +to the previous image if it is in the left part. +.TP +.B Ctrl-Button1 +Pan the image relative to the mouse cursor. +.TP +.B Button2 +Pan the image according to the mouse cursor position in the window while +keeping this button pressed down. +.TP +.B Button3 +Switch to thumbnail mode. +.TP +.B Button4 +Zoom in. +.TP +.B Button5 +Zoom out. +.SH CONFIGURATION +The following X resources are supported: +.TP +.B window.background +Color of the window background +.TP +.B window.foreground +Color of the window foreground +.TP +.B bar.font +Name of Xft bar font +.TP +.B bar.background +Color of the bar background. Defaults to window.background +.TP +.B bar.foreground +Color of the bar foreground. Defaults to window.foreground +.TP +.B mark.foreground +Color of the mark foreground. Defaults to window.foreground +.TP +Please see xrdb(1) on how to change them. +.SH WINDOW TITLE +The window title can be replaced with the output of a user-provided script, +which is called by nsxiv whenever any of the relevant information changes. +The path of this script is +.I $XDG_CONFIG_HOME/nsxiv/exec/win-title +and the arguments given to it (where "Optional" arguments might be empty) are: +.IP $1 4 +resolved absolute path of the current file +.IP $2 4 +current file number +.IP $3 4 +total file count +.IP $4 4 +image width (Optional: Disabled on thumbnails mode) +.IP $5 4 +image height (Optional: Disabled on thumbnails mode) +.IP $6 4 +current zoom (Optional: Disabled on thumbnails mode) +.P +The term file is used rather than image as nsxiv does not precheck that the +input files are valid images. Total file count may be different from the actual +count of valid images. +.P +There is also an example script installed together with nsxiv as +.IR EGPREFIX/win-title . +.SH STATUS BAR +The information displayed on the left side of the status bar can be replaced +with the output of user-provided script. +.P +The script that is called by nsxiv whenever an image gets loaded is located at +.I $XDG_CONFIG_HOME/nsxiv/exec/image-info +and the arguments given to it are: +.IP $1 4 +path to image file (as provided by the user) +.IP $2 4 +image width +.IP $3 4 +image height +.IP $4 4 +fully resolved path to the image file +.P +In thumbnail mode, the script that is called is located at +.I $XDG_CONFIG_HOME/nsxiv/exec/thumb-info +and the arguments given to it are: +.IP $1 4 +path to image file (as provided by the user) +.IP $2 4 +empty +.IP $3 4 +empty +.IP $4 4 +fully resolved path to the image file +.P +There are also example scripts installed together with nsxiv as +.IR EGPREFIX/image-info +and +.IR EGPREFIX/thumb-info . +.SH EXTERNAL KEY HANDLER +Additional external keyboard commands can be defined using a handler program +located in +.IR $XDG_CONFIG_HOME/nsxiv/exec/key-handler . +The handler is invoked by pressing +.BR Ctrl-x . +The next key combo is passed as its first argument. Passed via stdin are the +images to act upon: all marked images, if in thumbnail mode and at least one +image has been marked, otherwise the current image. nsxiv(1) will block until +the handler terminates. It then checks which images have been modified and +reloads them. + +By default nsxiv(1) will send one image per-line to stdin, however when using +\-0 the image list will be NULL separated and the environment variable +"$NSXIV_USING_NULL" will be set to 1. + +The key combo argument has the following form: "[C-][M-][S-]KEY", +where C/M/S indicate Ctrl/Meta(Alt)/Shift modifier states and KEY is the X +keysym as listed in /usr/include/X11/keysymdef.h without the "XK_" prefix. +If KEY has an uppercase equivalent, S-KEY is resolved into it. For instance, +K replaces S-k and Scedilla replaces S-scedilla, but S-Delete is sent as-is. + +There is also an example script installed together with nsxiv as +.IR EGPREFIX/key-handler . +.SH THUMBNAIL CACHING +nsxiv stores all thumbnails under +.IR $XDG_CACHE_HOME/nsxiv/ . +.P +Use the command line option +.I \-c +to remove all orphaned cache files. Additionally, run the following command +afterwards inside the cache directory to remove empty subdirectories: +.P +.RS +find . \-depth \-type d \-empty ! \-name '.' \-exec rmdir {} \\; +.RE +.SH ORIGINAL AUTHOR +.EX +Bert Muennich +.EE +.SH CURRENT MAINTAINERS +.EX +N-R-K +Berke Kocaoğlu +TAAPArthur +eylles +mamg22 +LuXu +explosion-mental +Guilherme Freire +Stein Gunnar Bakkeby +Anupam Ashish Minz +Sam Whitehead +Kian Kasad +qsmodo +.EE +.SH CONTRIBUTORS +.EX +Bastien Dejean +Dave Reisner +Fung SzeTat +Max Voit + +For additional contributors, run `git shortlog -s` in the nsxiv repository. +.EE +.SH HOMEPAGE +.TP +Website: +.EE +https://nsxiv.codeberg.page/ +.EX +.TP +Source code: +.EE +https://codeberg.org/nsxiv/nsxiv +.EX +.SH SEE ALSO +.BR X (7), +.BR xrdb (1) diff --git a/etc/nsxiv.desktop b/etc/nsxiv.desktop new file mode 100644 index 0000000..de90437 --- /dev/null +++ b/etc/nsxiv.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Name=nsxiv +GenericName=Image Viewer +Exec=nsxiv %F +MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/png;image/tiff;image/x-bmp;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-tga;image/x-xpixmap;image/webp;image/heic;image/svg+xml;application/postscript;image/jp2;image/jxl;image/avif;image/heif; +NoDisplay=true +Icon=nsxiv diff --git a/etc/woodpecker/CFLAGS b/etc/woodpecker/CFLAGS new file mode 100644 index 0000000..57d7d16 --- /dev/null +++ b/etc/woodpecker/CFLAGS @@ -0,0 +1,13 @@ +# vanilla flags +-std=c99 -Wall -pedantic +# optimizations: enables extra warnings and deeper analysis thus catches more errors/warnings +-O3 -flto +# treat warnings as errors +-Werror +# extra flags +-Wextra -Wshadow -Wvla -Wpointer-arith +-Wundef -Wstrict-overflow=4 -Wwrite-strings -Wunreachable-code +-Wbad-function-cast -Wdeclaration-after-statement +-Wmissing-prototypes -Wstrict-prototypes +# silence +-Wno-unused-parameter -Wno-missing-field-initializers diff --git a/etc/woodpecker/analysis.yml b/etc/woodpecker/analysis.yml new file mode 100644 index 0000000..35cef7f --- /dev/null +++ b/etc/woodpecker/analysis.yml @@ -0,0 +1,28 @@ +branches: master + +pipeline: + analysis: + image: alpine + commands: | + apk add --no-cache build-base cppcheck clang-extra-tools \ + imlib2-dev xorgproto \ + libxft-dev libexif-dev giflib-dev libwebp-dev >/dev/null + make config.h version.h + std="c99" + run_cppcheck() { + cppcheck --std="$std" --enable=performance,portability \ + --force --quiet --inline-suppr --error-exitcode=1 \ + --max-ctu-depth=8 -j"$(nproc)" \ + $(make OPT_DEP_DEFAULT="$1" dump_cppflags) \ + --suppress=varFuncNullUB --suppress=uninitvar \ + *.c + } + run_tidy() { + checks="$(sed '/^#/d' etc/woodpecker/clang-tidy-checks | paste -d ',' -s)" + clang-tidy --warnings-as-errors="*" --checks="$checks" --quiet *.c \ + -- -std="$std" $(make OPT_DEP_DEFAULT="$1" dump_cppflags) + } + run_cppcheck "0" + run_cppcheck "1" + run_tidy "0" + run_tidy "1" diff --git a/etc/woodpecker/build.yml b/etc/woodpecker/build.yml new file mode 100644 index 0000000..603fa0e --- /dev/null +++ b/etc/woodpecker/build.yml @@ -0,0 +1,28 @@ +branches: master + +# NOTE: "stable" tcc is too old and fails at linking. instead fetching a recent known working commit. +pipeline: + build: + image: alpine + environment: + - TCC_SHA=027b8fb9b88fe137447fb8bb1b61079be9702472 + commands: | + apk add --no-cache \ + imlib2 imlib2-dev xorgproto \ + libxft libxft-dev libexif libexif-dev giflib giflib-dev libwebp libwebp-dev \ + gcc clang llvm llvm-dev build-base wget ca-certificates >/dev/null + wget "https://github.com/TinyCC/tinycc/archive/$TCC_SHA.tar.gz" >/dev/null + tar xzf "$TCC_SHA.tar.gz" >/dev/null + ( cd "tinycc-$TCC_SHA" && ./configure --config-musl && make -s -j"$(nproc)" && make install; ) >/dev/null + CFLAGS="$(sed '/^#/d' etc/woodpecker/CFLAGS | paste -d ' ' -s)" + build () { + for cc in "gcc" "clang" "tcc"; do + echo "### $cc - $2 build ###" + make clean && make -s -j"$(nproc)" CC="$cc" CFLAGS="$CFLAGS" LDFLAGS="$CFLAGS" OPT_DEP_DEFAULT="$1" + done + } + # full-build # + build "1" "full" + # ensure minimal-build works without opt deps installed + apk del libxft libxft-dev libexif libexif-dev giflib giflib-dev libwebp libwebp-dev >/dev/null + build "0" "minimal" diff --git a/etc/woodpecker/clang-tidy-checks b/etc/woodpecker/clang-tidy-checks new file mode 100644 index 0000000..3c6c62e --- /dev/null +++ b/etc/woodpecker/clang-tidy-checks @@ -0,0 +1,17 @@ +# checks +clang-analyzer-*,clang-diagnostic-*,bugprone-*,performance-*,modernize-* +misc-*,readability-*,android-cloexec-*,cert-* +llvm-include-order + +# silence +-misc-unused-parameters +-bugprone-easily-swappable-parameters,-bugprone-narrowing-conversions,-bugprone-incorrect-roundings +-bugprone-implicit-widening-of-multiplication-result,-bugprone-integer-division +-readability-braces-around-statements,-readability-magic-numbers,-readability-isolate-declaration +-readability-function-cognitive-complexity,-readability-else-after-return +-readability-uppercase-literal-suffix,-readability-avoid-const-params-in-decls +-android-cloexec-fopen,-android-cloexec-pipe + +# false positive warnings +-clang-analyzer-valist.Uninitialized +-misc-no-recursion diff --git a/etc/woodpecker/spell.yml b/etc/woodpecker/spell.yml new file mode 100644 index 0000000..a184092 --- /dev/null +++ b/etc/woodpecker/spell.yml @@ -0,0 +1,9 @@ +branches: master + +# NOTE: codespell not available on stable alpine, use edge +pipeline: + spell-check: + image: alpine:edge + commands: | + apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing py3-codespell git >/dev/null + git ls-files | sed '/\.png$/d' | xargs codespell -- cgit v1.2.3-54-g00ecf