📺🗿 Terminal graphics for the 21st century.


Master Build Status1.8 Build Status Latest Release

AboutGalleryPackagesDevelopment

Chafa is a command-line utility that converts all kinds of images, including animated GIFs, into sixel or ANSI/Unicode character output that can be displayed in a terminal.

It is highly configurable, with support for alpha transparency and multiple color modes and color spaces, combining selectable ranges of Unicode characters to produce the desired output.

The core functionality is provided by a C library with a public, well-documented API.

Both library and frontend tools are covered by the Lesser GPL license, version 3 or later (LGPLv3+).

The official web pages and C API documentation can be found online. Check out the gallery for screenshots.

Installing

Chafa is most likely packaged for your distribution, so if you're not going to hack on it, you're better off using official packages. If you want to build the latest and greatest yourself, read on.

You will need GCC, make, Autoconf, Automake, Libtool and the GLib development package installed to compile Chafa from its git repository. If you want to build the command-line tool chafa and not just the library, you will additionally need the ImageMagick development packages.

If you want to build documentation, you will also need gtk-doc.

Start by cloning the repository:

$ git clone https://github.com/hpjansson/chafa.git

Then cd to the toplevel directory and issue the following shell commands:

$ ./autogen.sh
$ make
$ sudo make install

That should do it!

Comments
  • sixel support

    sixel support

    You mentioned sixel in TODO. However I didn't realize how sixel perform well in the terminal until I see this: https://github.com/hackerb9/lsix . It's a simple bash script, and it might provide some inspiration?

  • Custom font powered by kmeans clustering

    Custom font powered by kmeans clustering

    This is still a work-in-progress, don't merge.

    The core part has been finished. The remaining work is parameter tuning.

    Closes: https://github.com/hpjansson/chafa/issues/20

  • [WIP/Don't merge] Higher Resolution character art with Custom font

    [WIP/Don't merge] Higher Resolution character art with Custom font

    The finest resolution of block symbols in Unicode is 2x2. I created a finer font with 3x3 resolution block symbols. The custom font use private area of Unicode, and starts from 0x10c0001.

    The resolution is 3x3, so the number of all possible blocks is the ninth power of 2, i.e. 512.

    We can create 4x4 resolution font which fits better with 8x8 mask in chafa-symbols.c, but 4x4 resolution results in 2^16 = 65536 symbols. Maybe the performance will decrease drastically with such resolution. So I created 3x3 blocks instead.

    The 3x3 resolution version is called BE512, i.e. "Block Extended 512".

    2018-09-15_13-50

    Remaining works

    • [ ] add definition in autoconf and C source to guard the usage of custom font
    • [ ] sort of segfault when enabled all content from BE512.c
    • [ ] add new tag: CHAFA_SYMBOL_TAG_BE512
    • [ ] Are custom blocks in 3x3 resolution really improving the visual experience?
  • Smolscale uses too much stack space

    Smolscale uses too much stack space

    System information:

    OS: Alpine Linux (edge) Terminal emulator: foot / alacritty chafa version: 1.8.0

    Description

    Most image files get rendered with no problem, while some crashes with SIGSEGV (I tried on both terminal emulators with both sixel and symbols format)

    Here is a sample strace I get:

    $ strace chafa Pictures/Wallpapers/00.jpg
    
    execve("/usr/bin/chafa", ["chafa", "Pictures/Wallpapers/00.jpg"], 0x7ffdd0ae31c8 /* 106 vars */) = 0
    arch_prctl(ARCH_SET_FS, 0x7fbef474cb48) = 0
    set_tid_address(0x7fbef474cf90)         = 7543
    brk(NULL)                               = 0x556512eab000
    brk(0x556512ead000)                     = 0x556512ead000
    mmap(0x556512eab000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x556512eab000
    open("/etc/ld-musl-x86_64.path", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/lib/libMagickWand-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libMagickWand-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libMagickWand-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=1156936, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 1163264, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef459a000
    mmap(0x7fbef45ac000, 884736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x12000) = 0x7fbef45ac000
    mmap(0x7fbef4684000, 192512, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xea000) = 0x7fbef4684000
    mmap(0x7fbef46b3000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x118000) = 0x7fbef46b3000
    close(3)                                = 0
    open("/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=751808, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \332\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 757760, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef44e1000
    mmap(0x7fbef44ee000, 442368, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x7fbef44ee000
    mmap(0x7fbef455a000, 225280, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x79000) = 0x7fbef455a000
    mmap(0x7fbef4592000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xb0000) = 0x7fbef4592000
    close(3)                                = 0
    open("/lib/libchafa.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libchafa.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libchafa.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=256512, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\324\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 262144, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef44a1000
    mmap(0x7fbef44ae000, 94208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x7fbef44ae000
    mmap(0x7fbef44c5000, 86016, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x24000) = 0x7fbef44c5000
    mmap(0x7fbef44da000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x38000) = 0x7fbef44da000
    close(3)                                = 0
    open("/lib/libglib-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libglib-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libglib-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=1085128, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 1093632, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef4396000
    mmap(0x7fbef43b2000, 417792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1c000) = 0x7fbef43b2000
    mmap(0x7fbef4418000, 544768, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x82000) = 0x7fbef4418000
    mmap(0x7fbef449e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x107000) = 0x7fbef449e000
    mmap(0x7fbef44a0000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef44a0000
    close(3)                                = 0
    open("/lib/libMagickCore-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libMagickCore-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libMagickCore-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=2181144, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 2310144, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef4162000
    mmap(0x7fbef418a000, 1314816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x28000) = 0x7fbef418a000
    mmap(0x7fbef42cb000, 376832, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x169000) = 0x7fbef42cb000
    mmap(0x7fbef4328000, 450560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x1c5000) = 0x7fbef4328000
    mmap(0x7fbef4378000, 122880, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef4378000
    close(3)                                = 0
    open("/lib/libX11.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libX11.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libX11.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=1185936, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\330\1\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 1191936, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef403f000
    mmap(0x7fbef405a000, 454656, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1b000) = 0x7fbef405a000
    mmap(0x7fbef40c9000, 598016, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x8a000) = 0x7fbef40c9000
    mmap(0x7fbef415b000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x11b000) = 0x7fbef415b000
    close(3)                                = 0
    open("/lib/libbz2.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libbz2.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libbz2.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=58024, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\270\"\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 61440, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef4030000
    mmap(0x7fbef4032000, 36864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef4032000
    mmap(0x7fbef403b000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x7fbef403b000
    mmap(0x7fbef403d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xc000) = 0x7fbef403d000
    close(3)                                = 0
    open("/lib/libpng16.so.16", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libpng16.so.16", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libpng16.so.16", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=190256, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 i\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 196608, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef4000000
    mmap(0x7fbef4006000, 118784, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x7fbef4006000
    mmap(0x7fbef4023000, 45056, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x23000) = 0x7fbef4023000
    mmap(0x7fbef402e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x2d000) = 0x7fbef402e000
    close(3)                                = 0
    open("/lib/libz.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=100144, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0003\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 106496, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3fe6000
    mmap(0x7fbef3fe9000, 57344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x7fbef3fe9000
    mmap(0x7fbef3ff7000, 28672, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x11000) = 0x7fbef3ff7000
    mmap(0x7fbef3ffe000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x17000) = 0x7fbef3ffe000
    close(3)                                = 0
    open("/lib/libbrotlidec.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libbrotlidec.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libbrotlidec.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=42672, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\20\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 49152, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3fda000
    mmap(0x7fbef3fdb000, 24576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x7fbef3fdb000
    mmap(0x7fbef3fe1000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x7000) = 0x7fbef3fe1000
    mmap(0x7fbef3fe4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7fbef3fe4000
    close(3)                                = 0
    open("/lib/libpcre.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libpcre.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libpcre.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=370464, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360!\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 376832, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3f7e000
    mmap(0x7fbef3f80000, 245760, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3f80000
    mmap(0x7fbef3fbc000, 110592, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x3e000) = 0x7fbef3fbc000
    mmap(0x7fbef3fd8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x59000) = 0x7fbef3fd8000
    close(3)                                = 0
    open("/lib/libintl.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libintl.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libintl.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=42744, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320$\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 53248, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3f71000
    mmap(0x7fbef3f73000, 24576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3f73000
    mmap(0x7fbef3f79000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x8000) = 0x7fbef3f79000
    mmap(0x7fbef3f7b000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7fbef3f7b000
    mmap(0x7fbef3f7d000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef3f7d000
    close(3)                                = 0
    open("/lib/liblcms2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/liblcms2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/liblcms2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=340656, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 352256, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3f1b000
    mmap(0x7fbef3f26000, 192512, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x7fbef3f26000
    mmap(0x7fbef3f55000, 81920, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x3a000) = 0x7fbef3f55000
    mmap(0x7fbef3f6a000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x4e000) = 0x7fbef3f6a000
    mmap(0x7fbef3f6f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef3f6f000
    close(3)                                = 0
    open("/lib/libxml2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libxml2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libxml2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=1213568, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\374\2\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 1220608, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3df1000
    mmap(0x7fbef3e20000, 708608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2f000) = 0x7fbef3e20000
    mmap(0x7fbef3ecd000, 274432, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xdc000) = 0x7fbef3ecd000
    mmap(0x7fbef3f10000, 45056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x11e000) = 0x7fbef3f10000
    mmap(0x7fbef3f1a000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef3f1a000
    close(3)                                = 0
    open("/lib/libfontconfig.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libfontconfig.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libfontconfig.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=239520, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300w\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 245760, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3db5000
    mmap(0x7fbef3dbc000, 110592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x7000) = 0x7fbef3dbc000
    mmap(0x7fbef3dd7000, 94208, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x22000) = 0x7fbef3dd7000
    mmap(0x7fbef3dee000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x38000) = 0x7fbef3dee000
    close(3)                                = 0
    open("/lib/libXext.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libXext.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libXext.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=72544, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\310C\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 77824, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3da2000
    mmap(0x7fbef3da6000, 36864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3da6000
    mmap(0x7fbef3daf000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x7fbef3daf000
    mmap(0x7fbef3db3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x10000) = 0x7fbef3db3000
    close(3)                                = 0
    open("/lib/libltdl.so.7", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libltdl.so.7", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libltdl.so.7", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=38664, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220$\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 45056, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d97000
    mmap(0x7fbef3d99000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3d99000
    mmap(0x7fbef3d9d000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x7fbef3d9d000
    mmap(0x7fbef3da0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x8000) = 0x7fbef3da0000
    close(3)                                = 0
    open("/lib/libxcb.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libxcb.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libxcb.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=153312, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\267\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 159744, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d70000
    mmap(0x7fbef3d7b000, 69632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x7fbef3d7b000
    mmap(0x7fbef3d8c000, 36864, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x1c000) = 0x7fbef3d8c000
    mmap(0x7fbef3d95000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x24000) = 0x7fbef3d95000
    close(3)                                = 0
    open("/lib/libbrotlicommon.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libbrotlicommon.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libbrotlicommon.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=136952, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\20\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 143360, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d4d000
    mmap(0x7fbef3d4e000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x7fbef3d4e000
    mmap(0x7fbef3d4f000, 126976, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3d4f000
    mmap(0x7fbef3d6e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x7fbef3d6e000
    close(3)                                = 0
    open("/lib/liblzma.so.5", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/liblzma.so.5", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/liblzma.so.5", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=136848, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\3504\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 143360, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d2a000
    mmap(0x7fbef3d2d000, 77824, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x7fbef3d2d000
    mmap(0x7fbef3d40000, 45056, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x16000) = 0x7fbef3d40000
    mmap(0x7fbef3d4b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x7fbef3d4b000
    close(3)                                = 0
    open("/lib/libexpat.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libexpat.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libexpat.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=145144, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0pA\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 151552, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d05000
    mmap(0x7fbef3d09000, 90112, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3d09000
    mmap(0x7fbef3d1f000, 28672, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x1a000) = 0x7fbef3d1f000
    mmap(0x7fbef3d27000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x21000) = 0x7fbef3d27000
    close(3)                                = 0
    open("/lib/libuuid.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=30544, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 36864, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3cfc000
    mmap(0x7fbef3cfe000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cfe000
    mmap(0x7fbef3d02000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x7fbef3d02000
    mmap(0x7fbef3d03000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x7fbef3d03000
    close(3)                                = 0
    open("/lib/libXau.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libXau.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libXau.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=13896, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\350\21\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 20480, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3cf7000
    mmap(0x7fbef3cf8000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x7fbef3cf8000
    mmap(0x7fbef3cf9000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cf9000
    mmap(0x7fbef3cfa000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cfa000
    close(3)                                = 0
    brk(0x556512eae000)                     = 0x556512eae000
    open("/lib/libXdmcp.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libXdmcp.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libXdmcp.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=26336, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\270!\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 32768, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3cef000
    mmap(0x7fbef3cf1000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cf1000
    mmap(0x7fbef3cf3000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3cf3000
    mmap(0x7fbef3cf5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x5000) = 0x7fbef3cf5000
    close(3)                                = 0
    open("/lib/libbsd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libbsd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libbsd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=72536, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340H\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 81920, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3cdb000
    mmap(0x7fbef3cdf000, 36864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3cdf000
    mmap(0x7fbef3ce8000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x7fbef3ce8000
    mmap(0x7fbef3cec000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x10000) = 0x7fbef3cec000
    mmap(0x7fbef3cee000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cee000
    close(3)                                = 0
    open("/lib/libmd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libmd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libmd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=43040, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 $\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 49152, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3ccf000
    mmap(0x7fbef3cd1000, 24576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cd1000
    mmap(0x7fbef3cd7000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x8000) = 0x7fbef3cd7000
    mmap(0x7fbef3cd9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7fbef3cd9000
    close(3)                                = 0
    mprotect(0x7fbef46b3000, 8192, PROT_READ) = 0
    mprotect(0x7fbef4592000, 28672, PROT_READ) = 0
    mprotect(0x7fbef44da000, 24576, PROT_READ) = 0
    mprotect(0x7fbef449e000, 4096, PROT_READ) = 0
    mprotect(0x7fbef4749000, 4096, PROT_READ) = 0
    mprotect(0x7fbef4328000, 86016, PROT_READ) = 0
    mprotect(0x7fbef415b000, 12288, PROT_READ) = 0
    mprotect(0x7fbef403d000, 4096, PROT_READ) = 0
    mprotect(0x7fbef402e000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3ffe000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3fe4000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3fd8000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3f7b000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3f6a000, 8192, PROT_READ) = 0
    mprotect(0x7fbef3f10000, 36864, PROT_READ) = 0
    mprotect(0x7fbef3dee000, 8192, PROT_READ) = 0
    mprotect(0x7fbef3db3000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3da0000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3d95000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3d6e000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3d4b000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3d27000, 8192, PROT_READ) = 0
    mprotect(0x7fbef3d03000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3cfa000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3cf5000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3cec000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3cd9000, 4096, PROT_READ) = 0
    mprotect(0x556511a11000, 16384, PROT_READ) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=614108351}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ccd000
    mmap(NULL, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cc8000
    rt_sigprocmask(SIG_UNBLOCK, [RT_1 RT_2], NULL, 8) = 0
    rt_sigaction(SIGINT, {sa_handler=0x556511a06d05, sa_mask=[], sa_flags=SA_RESTORER|SA_RESETHAND|0xffffffff00000000, sa_restorer=0x7fbef46fcc8a}, NULL, 8) = 0
    mmap(NULL, 45056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cbd000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cbc000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cbb000
    mmap(NULL, 86016, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca6000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca5000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca4000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca3000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca2000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca1000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca0000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c9e000
    futex(0x7fbef44a00e8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    ioctl(0, TIOCGWINSZ, {ws_row=42, ws_col=210, ws_xpixel=1890, ws_ypixel=1008}) = 0
    ioctl(1, TIOCGWINSZ, {ws_row=42, ws_col=210, ws_xpixel=1890, ws_ypixel=1008}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c9c000
    brk(0x556512eaf000)                     = 0x556512eaf000
    futex(0x7fbef44a00e8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c9a000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c98000
    munmap(0x7fbef3c98000, 8192)            = 0
    ioctl(1, TIOCGWINSZ, {ws_row=42, ws_col=210, ws_xpixel=1890, ws_ypixel=1008}) = 0
    ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0
    ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost isig icanon -echo ...}) = 0
    open("/usr/share/ImageMagick-7/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/usr/lib/ImageMagick-7.1.0//config-Q16HDRI/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/etc/ImageMagick-7/policy.xml", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_END)                   = 3773
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c98000
    mmap(NULL, 3773, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3c97000
    munmap(0x7fbef3c97000, 3773)            = 0
    close(3)                                = 0
    open("/usr/share/doc/ImageMagick-7/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c96000
    munmap(0x7fbef3c96000, 8192)            = 0
    munmap(0x7fbef3c98000, 8192)            = 0
    open("/usr/share/ImageMagick-7/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/usr/lib/ImageMagick-7.1.0//config-Q16HDRI/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/etc/ImageMagick-7/log.xml", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_END)                   = 1642
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c98000
    mmap(NULL, 1642, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3c97000
    munmap(0x7fbef3c97000, 1642)            = 0
    close(3)                                = 0
    open("/usr/share/doc/ImageMagick-7/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c96000
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=926796892}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994417
    munmap(0x7fbef3c96000, 8192)            = 0
    munmap(0x7fbef3c98000, 8192)            = 0
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=927218663}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994417
    getcwd("/home/follie", 4096)            = 13
    getpid()                                = 7543
    readlink("/proc/7543/exe", "/usr/bin/chafa", 4096) = 14
    stat("/usr/bin/chafa", {st_mode=S_IFREG|0755, st_size=88232, ...}) = 0
    access("/usr/bin/chafa", F_OK)          = 0
    sysinfo({uptime=3691, loads=[62976, 50496, 48544], totalram=15701123072, freeram=8627056640, sharedram=80433152, bufferram=1581056, totalswap=31402745856, freeswap=31402745856, procs=964, totalhigh=0, freehigh=0, mem_unit=1}) = 0
    prlimit64(0, RLIMIT_NOFILE, NULL, {rlim_cur=1024, rlim_max=4*1024}) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=625634361}) = 0
    clock_gettime(CLOCK_MONOTONIC, {tv_sec=3690, tv_nsec=5702532}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_SET)                   = 0
    read(3, "\377\330\377\341\0\30", 6)     = 6
    close(3)                                = 0
    clock_gettime(CLOCK_MONOTONIC, {tv_sec=3690, tv_nsec=6183952}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_SET)                   = 0
    read(3, "\377\330\377\341\0\30Exif\0\0II*\0\10\0\0\0\0\0\0\0\0\0\0\0\377\354\0\21"..., 100) = 100
    close(3)                                = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c96000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c92000
    open("/usr/share/ImageMagick-7/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/usr/lib/ImageMagick-7.1.0//config-Q16HDRI/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/etc/ImageMagick-7/colors.xml", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_END)                   = 1383
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c90000
    mmap(NULL, 1383, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3c8f000
    munmap(0x7fbef3c8f000, 1383)            = 0
    close(3)                                = 0
    open("/usr/share/doc/ImageMagick-7/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c8e000
    munmap(0x7fbef3c8e000, 8192)            = 0
    munmap(0x7fbef3c90000, 8192)            = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c90000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c8e000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c8d000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c89000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c88000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c87000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c86000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c85000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c84000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c83000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c82000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c81000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c80000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7f000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7e000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7d000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7c000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7b000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7a000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c79000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c78000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c77000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c76000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c75000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c74000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c73000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c72000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c71000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c6d000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c69000
    stat("jpg", 0x7ffcf71e3bd0)             = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c67000
    brk(0x556512eb0000)                     = 0x556512eb0000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c66000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c64000
    readlink("/usr", 0x7ffcf71debef, 4042)  = -1 EINVAL (Invalid argument)
    readlink("/usr/lib", 0x7ffcf71debef, 4046) = -1 EINVAL (Invalid argument)
    readlink("/usr/lib/ImageMagick-7.1.0", 0x7ffcf71debef, 4064) = -1 EINVAL (Invalid argument)
    readlink("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI", 0x7ffcf71debef, 4081) = -1 EINVAL (Invalid argument)
    readlink("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders", 0x7ffcf71debef, 4088) = -1 EINVAL (Invalid argument)
    readlink("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.la", 0x7ffcf71debef, 4096) = -1 EINVAL (Invalid argument)
    stat("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.la", {st_mode=S_IFREG|0755, st_size=1070, ...}) = 0
    access("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.la", F_OK) = 0
    open("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.la", O_RDONLY|O_LARGEFILE) = 3
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c63000
    read(3, "# jpeg.la - a libtool library fi"..., 1024) = 1024
    read(3, "lib/ImageMagick-7.1.0/modules-Q1"..., 1024) = 46
    read(3, "", 1024)                       = 0
    close(3)                                = 0
    munmap(0x7fbef3c63000, 4096)            = 0
    open("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=51016, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 57344, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3c56000
    mmap(0x7fbef3c59000, 24576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x7fbef3c59000
    mmap(0x7fbef3c5f000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7fbef3c5f000
    mmap(0x7fbef3c62000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x7fbef3c62000
    close(3)                                = 0
    open("/lib/libjpeg.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libjpeg.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libjpeg.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=546640, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 E\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 552960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3bcf000
    mmap(0x7fbef3bd3000, 258048, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3bd3000
    mmap(0x7fbef3c12000, 270336, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x43000) = 0x7fbef3c12000
    mmap(0x7fbef3c54000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x84000) = 0x7fbef3c54000
    close(3)                                = 0
    mprotect(0x7fbef3c62000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3c54000, 4096, PROT_READ) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=639779233}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bcd000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc9000
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=942991478}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994419
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc1000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc0000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=640734670}) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=640839503}) = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bbc000
    stat("Pictures/Wallpapers/00.jpg", {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    readv(3, [{iov_base="\377\330", iov_len=2}, {iov_base="\377\341\0\30Exif\0\0II*\0\10\0\0\0\0\0\0\0\0\0\0\0\377\354\0\21Du"..., iov_len=1024}], 2) = 1026
    lseek(3, -1026, SEEK_CUR)               = 0
    mmap(NULL, 3493745, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3867000
    close(3)                                = 0
    munmap(0x7fbef3867000, 3493745)         = 0
    madvise(0x7fbef3bc2000, 4096, MADV_FREE) = 0
    munmap(0x7fbef3bc1000, 32768)           = 0
    munmap(0x7fbef3bc0000, 4096)            = 0
    munmap(0x7fbef3bbc000, 16384)           = 0
    munmap(0x7fbef3bc9000, 16384)           = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc9000
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=945256780}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994419
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc1000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc0000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=642980367}) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=643096793}) = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bbc000
    stat("Pictures/Wallpapers/00.jpg", {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    readv(3, [{iov_base="\377\330", iov_len=2}, {iov_base="\377\341\0\30Exif\0\0II*\0\10\0\0\0\0\0\0\0\0\0\0\0\377\354\0\21Du"..., iov_len=1024}], 2) = 1026
    lseek(3, -1026, SEEK_CUR)               = 0
    fstat(3, {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    lseek(3, 0, SEEK_CUR)                   = 0
    fstat(3, {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    close(3)                                = 0
    madvise(0x7fbef3bc2000, 4096, MADV_FREE) = 0
    munmap(0x7fbef3bc1000, 32768)           = 0
    munmap(0x7fbef3bc0000, 4096)            = 0
    munmap(0x7fbef3bbc000, 16384)           = 0
    munmap(0x7fbef3bc9000, 16384)           = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc9000
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=947618253}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994419
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc1000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc0000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=645378389}) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=645484688}) = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bbc000
    stat("Pictures/Wallpapers/00.jpg", {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    readv(3, [{iov_base="\377\330", iov_len=2}, {iov_base="\377\341\0\30Exif\0\0II*\0\10\0\0\0\0\0\0\0\0\0\0\0\377\354\0\21Du"..., iov_len=1024}], 2) = 1026
    lseek(3, -1026, SEEK_CUR)               = 0
    mmap(NULL, 3493745, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3867000
    close(3)                                = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3863000
    mmap(NULL, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef385d000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3859000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=646939844}) = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3858000
    mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3851000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3850000
    munmap(0x7fbef3850000, 4096)            = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3850000
    munmap(0x7fbef3850000, 4096)            = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3850000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef384c000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef384a000
    madvise(0x7fbef3852000, 4096, MADV_FREE) = 0
    munmap(0x7fbef3851000, 28672)           = 0
    munmap(0x7fbef3858000, 4096)            = 0
    munmap(0x7fbef384c000, 16384)           = 0
    munmap(0x7fbef384a000, 8192)            = 0
    munmap(0x7fbef3850000, 4096)            = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3858000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=649286183}) = 0
    mmap(NULL, 99532868, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed96b000
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed963000
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed95b000
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed953000
    mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed950000
    munmap(0x7fbeed953000, 32768)           = 0
    munmap(0x7fbeed95b000, 32768)           = 0
    munmap(0x7fbeed963000, 32768)           = 0
    munmap(0x7fbef3863000, 16384)           = 0
    munmap(0x7fbef385d000, 24576)           = 0
    munmap(0x7fbeed950000, 12288)           = 0
    munmap(0x7fbef3867000, 3493745)         = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bbb000
    mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bb4000
    munmap(0x7fbef3bbb000, 4096)            = 0
    madvise(0x7fbef3bb7000, 4096, MADV_FREE) = 0
    madvise(0x7fbef3bb5000, 4096, MADV_FREE) = 0
    madvise(0x7fbef3bb9000, 4096, MADV_FREE) = 0
    munmap(0x7fbef3bb4000, 28672)           = 0
    munmap(0x7fbef3c69000, 16384)           = 0
    munmap(0x7fbef3c6d000, 16384)           = 0
    clock_gettime(CLOCK_MONOTONIC, {tv_sec=3690, tv_nsec=369650870}) = 0
    mmap(NULL, 33177620, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeeb9c6000
    mmap(NULL, 98304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ba4000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c6f000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c6b000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ba0000
    mmap(NULL, 1718084, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef39fc000
    mmap(NULL, 6872276, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeeb338000
    mmap(NULL, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef39f6000
    sched_getaffinity(0, 128, [0, 1, 2, 3, 4, 5, 6, 7]) = 32
    sched_getaffinity(0, 128, [0, 1, 2, 3, 4, 5, 6, 7]) = 32
    gettid()                                = 7543
    sched_getattr(7543, {size=56, sched_policy=SCHED_OTHER, sched_flags=0, sched_nice=0, sched_priority=0, sched_runtime=0, sched_deadline=0, sched_period=0, sched_util_min=0, sched_util_max=0}, 56, 0) = 0
    sched_setattr(7543, {size=56, sched_policy=SCHED_OTHER, sched_flags=0, sched_nice=0, sched_priority=0, sched_runtime=0, sched_deadline=0, sched_period=0, sched_util_min=0, sched_util_max=0}, 0) = 0
    rt_sigprocmask(SIG_UNBLOCK, [RT_1 RT_2], NULL, 8) = 0
    membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0) = 0
    mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef39d3000
    mprotect(0x7fbef39d5000, 135168, PROT_READ|PROT_WRITE) = 0
    rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], [], 8) = 0
    clone(child_stack=0x7fbef39f5af8, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID|0x400000, parent_tid=[7544], tls=0x7fbef39f5b38, child_tidptr=0x7fbef474cf90) = 7544
    rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
    futex(0x7fbef3ba0950, FUTEX_WAKE_PRIVATE, 1) = 1
    mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef39b0000
    mprotect(0x7fbef39b2000, 135168, PROT_READ|PROT_WRITE) = 0
    rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], [], 8) = 0
    clone(child_stack=0x7fbef39d2af8, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID|0x400000, parent_tid=[7545], tls=0x7fbef39d2b38, child_tidptr=0x7fbef474cf90) = 7545
    rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
    futex(0x7fbef3ba0950, FUTEX_WAKE_PRIVATE, 1) = 1
    mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef398d000
    +++ killed by SIGSEGV (core dumped) +++
    fish: Job 1, 'strace chafa Pictures/Wallpaper…' terminated by signal SIGSEGV (Address boundary error)
    
  • Invisible SVG

    Invisible SVG

    SVG seems to not be rendered by chafa. I don’t know if they are rendered as black on black or if not rendered at all.

    I’v tried multiple backend and playing with --fg /--bg : I still have a black empty space on my terminal.

    mail

  • Now Konsole supports graphics

    Now Konsole supports graphics

    Good news: Konsole (git) supports sixel, iTerm2 and kitty protocols! :tada: Works for me :tm: :

    diff --git a/chafa/chafa-term-db.c b/chafa/chafa-term-db.c
    index b5cacee..472215e 100644
    --- a/chafa/chafa-term-db.c
    +++ b/chafa/chafa-term-db.c
    @@ -321,6 +321,11 @@ detect_capabilities (ChafaTermInfo *ti, gchar **envp)
             gfx_seqs = sixel_seqs;
         }
    
    +    if (strcasecmp (term_program, "konsole"))
    +    {
    +        gfx_seqs = sixel_seqs;
    +    }
    +
         /* Apple Terminal sets TERM=xterm-256color, and does not support truecolor */
         if (!g_ascii_strcasecmp (term_program, "Apple_Terminal"))
             color_seq_list = color_256_list;
    
  • Last line in terminal while playing animation is not used / empty / only cursor

    Last line in terminal while playing animation is not used / empty / only cursor

    Hello And I start with the highest five for this amazing stuff. Respect.

    What is the proper way to use the last line of the terminal while playing back animation? Basically I want to display chafa stuff fullscreen - from top to bottom. https://photos.app.goo.gl/w6Z55vwFN2DrWbd68 The brownish gap is the last line in the image.

    I used tput smcup to check if it makes any difference. It does not in my case. The whole thing runs in a fullscreen alacritty like a greased lightning but I'm not able to properly solve this. Well, I'm saying "not able" because one can always resize the terminal / the window itself - adding one more line / some more height pixels - and the last line gets offscreen. But I have a hunch that there is a less hacky solution.

    Many thanks! Andras

  • Issues building chafa on CentOS 7

    Issues building chafa on CentOS 7

    The first issue, for some reason chafa does not see libwebp installed on my system. I have the following packages installed:

    /root/chafa# yum list installed|grep libwebp
    libwebp.x86_64                   0.3.0-10.el7_9               @updates
    libwebp-devel.x86_64             0.3.0-10.el7_9               @updates
    libwebp7.x86_64                  1.0.3-1.el7.remi             @remi-safe
    

    Seems ok to me, however this is CentOS, maybe libwebp version is too obsolete and not supported?

    The second issue, building the chafa, I get the following error:

    libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26 -Wall -Wextra -Wmissing-prototypes -Wwrite-strings -Wunused-macros -Wundef -Wpointer-arith -Werror=format-security -Wstack-usage=131072 -Wlogical-op -ffast-math -I.. -g -O2 -MT libnsgif_la-lzw.lo -MD -MP -MF .deps/libnsgif_la-lzw.Tpo -c lzw.c  -fPIC -DPIC -o .libs/libnsgif_la-lzw.o
    lzw.c: In function 'lzw_decode_init':
    lzw.c:290:2: error: 'for' loop initial declarations are only allowed in C99 mode
      for (uint32_t i = 0; i < ctx->clear_code; ++i) {
      ^
    lzw.c:290:2: note: use option -std=c99 or -std=gnu99 to compile your code
    

    Changing CFLAGS = -g -O2 line in the chafa/libnsgif/Makefile to CFLAGS = -g -O2 -std=c99 fixes it and allows chafa to build successfuly.

    GCC version in the build toolchain is gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)

    I also get a couple of warnings about m4 macros after running autogen.sh (I don't know is it related or not):

    Running libtoolize...
    libtoolize: putting auxiliary files in `.'.
    libtoolize: copying file `./ltmain.sh'
    libtoolize: You should add the contents of the following files to `aclocal.m4':
    libtoolize:   `/usr/share/aclocal/libtool.m4'
    libtoolize:   `/usr/share/aclocal/ltoptions.m4'
    libtoolize:   `/usr/share/aclocal/ltversion.m4'
    libtoolize:   `/usr/share/aclocal/ltsugar.m4'
    libtoolize:   `/usr/share/aclocal/lt~obsolete.m4'
    libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
    libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
    libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
    Missing optional tool: gtk-doc
    
    Without this, no developer documentation will be generated.
    
    Running aclocal...
    aclocal: warning: couldn't open directory 'm4': No such file or directory
    Running automake...
    ...
    

    However, the only really important question to me from all of this "is there any way to build chafa with the WebP support?"

  • Chafa crashes trying to allocate too much memory

    Chafa crashes trying to allocate too much memory

    When using any format other than symbols, chafa tries to allocate way too much memory. This happens with all images I tried so far, both PNG and JPEG. The issue was introduced somewhere between commits b4e513c (good) and 30b21fa (bad).

    $ chafa -f kitty ~/Pictures/prince_of_persia_title_screen_scaled.png
    (chafa:346124): GLib-ERROR **: 23:10:25.717: ../../../glib/gmem.c:108: failed to allocate 18446744066840471296 bytes
    fish: “chafa -f kitty ~/Pictures/princ…” terminated by signal SIGTRAP (Trace or breakpoint trap)
    
    $ chafa -f sixel ~/Pictures/prince_of_persia_title_screen_scaled.png
    (chafa:346076): GLib-ERROR **: 23:10:07.137: ../../../glib/gmem.c:108: failed to allocate 18446744072010973248 bytes
    fish: “chafa -f sixel ~/Pictures/princ…” terminated by signal SIGTRAP (Trace or breakpoint trap)
    
    $ chafa -f iterm ~/Pictures/prince_of_persia_title_screen_scaled.png
    (chafa:345798): GLib-ERROR **: 23:05:34.798: ../../../glib/gmem.c:108: failed to allocate 18446744066916285920 bytes
    fish: “chafa -f iterm ~/Pictures/princ…” terminated by signal SIGTRAP (Trace or breakpoint trap)
    

    Here is the backtrace from gdb:

    #0  0x00007ffff7e9f295 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #1  0x00007ffff7ea0319 in g_log_default_handler () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #2  0x00007ffff7ea055c in g_logv () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #3  0x00007ffff7ea0743 in g_log () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #4  0x00007ffff7e9eec2 in g_malloc () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #5  0x00007ffff7c2cfcf in chafa_kitty_canvas_new (width=65008, height=39312) at chafa-kitty-canvas.c:53
    #6  0x00007ffff7c1e37c in chafa_canvas_draw_all_pixels (canvas=0x5555555ff950, src_pixel_type=CHAFA_PIXEL_RGBA8_UNASSOCIATED, 
        src_pixels=0x7ffff3a66010 "\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377"..., src_width=1280, src_height=800, src_rowstride=5120) at chafa-canvas.c:1426
    #7  0x000055555555eca1 in build_string (pixel_type=CHAFA_PIXEL_RGBA8_UNASSOCIATED, 
        pixels=0x7ffff3a66010 "\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377"..., 
        src_width=1280, src_height=800, src_rowstride=5120, dest_width=136, dest_height=24) at chafa.c:1196
    #8  0x000055555555f5f0 in run_magickwand (filename=0x5555555bd610 "/home/srl/Pictures/prince_of_persia_title_screen_scaled.png", 
        is_first_file=1, is_first_frame=1, quiet=0) at chafa.c:1508
    #9  0x000055555556013d in run (filename=0x5555555bd610 "/home/srl/Pictures/prince_of_persia_title_screen_scaled.png", is_first_file=1, 
        is_first_frame=1, quiet=0) at chafa.c:1765
    #10 0x00005555555602cd in run_all (filenames=0x5555555bf600 = {...}) at chafa.c:1826
    #11 0x0000555555560456 in main (argc=2, argv=0x7fffffffe178) at chafa.c:1867
    

    The file used in the above examples. prince_of_persia_title_screen_scaled.png

  • apt installation guide for Debian testing/unstable user

    apt installation guide for Debian testing/unstable user

    https://tracker.debian.org/pkg/chafa

    Chafa has been available for Debian testing/unstable user for a while. Maybe we can add a hint to readme? like this:

    +# install with apt
    +
    + Debian testing/unstable users can install chafa directly with apt.
    +
    +sudo apt install chafa
    
     # build from git
     blah blah blah
    

    If it looks reasonable, I can fill the wording and submit a PR.

  • Do not upscale picture

    Do not upscale picture

    By default, displaying a picture with Chafa takes the whole terminal.

    It would be nice to not upscale smaller pictures so the user can get a sense of the size of the picture (for example if it is an icon).

    The "does not upscale" option could work together with the size option to set the size as "maximal size". If I set the size to 100 but I’m viewing an icon which is 10x10, the icon stays at 10x10.

  • --size makes Chafa ignore explicitely declared --scale

    --size makes Chafa ignore explicitely declared --scale

    What I'm trying to do is to view an image that's tall and thin, I want to render it with no height limits but also to not upscale to fit the terminal's width (but still downscale if necessary, keeping the aspect ratio).

    According to the man pages, I have the impression that setting --size "$COLUMNS" --scale 1 I should achieve just that, but it just ingores --scale and upscales the image to the full width of the terminal.

    Chafa is version 1.12.4

  • Not rendering with `--format=kitty` in terminal that has Kitty Image Protocol

    Not rendering with `--format=kitty` in terminal that has Kitty Image Protocol

    WezTerm has support of Kitty Graphics Protocol. But, chafa didn't render anything when using -f kitty. image

    On the other hand, I tested broot which mention can display image in terminal that has Kitty Graphics Protocol, i.e. WezTerm, and its really can display image out of the box in WezTerm.

  • [kitty/gif] provide auto detection of background for perception of transparency

    [kitty/gif] provide auto detection of background for perception of transparency

    For the kitty terminal, in particular, when viewing a gif a background color needs to be provided to ensure consequent frames are not overlayed ontop of one another.

    For gifs that are transparent, this breaks the transparency. One way to recover the perception of transparency is to automatically determine the background of the current terminal and use that color as the background of the gif that is displayed.

    Note this issue only appears when displaying gifs in the kitty terminal.

    This could be implemented as the following option: --bg auto.

    Alternatives: timg solves this issue with the same flag -b auto, which they keep as default.

    See the conversation following this comment for more rational/info/disc.

  • Support limiting symbols to a particular vintage character set

    Support limiting symbols to a particular vintage character set

    It would be a nice addition to chafa to support restricting the characters used to a subset corresponding to a particular computer's character set (for example, PETSCII, ATASCII, Apple II, etc.) While the vintage class to symbols and fill is nice, it's not specific enough... If I'm making ATASCII art, I don't want it to include characters that aren't supported by the Atari's limited character set.

    I'd like to see classes corresponding to the individual computer/terminal types, so as to limit the output to that particular character set. (for example --symbols=ATASCII, --fill=PETSCII)

    Specifically, characters from each supported character set class would need to be mapped to the appropriate unicode points, and those sets assigned to individual symbol classes. Unscii is a font that might help with this endeavour, as well as displaying the output in a terminal, as it faithfully tries to recreate the pixelated character sets of many retro platforms.

    (Related closed issue here)

  • Support SVG in static builds

    Support SVG in static builds

    Split from issue 88. See comment by @crmabs there.

    I had to leave out SVG support from the static exes because it was hard to support in a static build. This has probably gotten easier in the past year or two.

    We depend on a post-Rust-rewrite librsvg2. MXE still has the last C-only version, probably because they can't support a Rust toolchain either. I could probably add an option to use an older API, but old librsvg2 versions don't receive updates, so are probably insecure.

Spitfire is a basic terminal language that can exicute code via the terminal.

Spitfire is a basic terminal language that can exicute code via the terminal. It is easy to learn and runs fast, considering that its just a 300 line c++ file.

Nov 18, 2021
A C, C++ and Rust library to draw graphics with pixels in the terminal
A C, C++ and Rust library to draw graphics with pixels in the terminal

A library to draw graphics with pixels in the terminal Who needs a GUI when you have a terminal ? Building To generate libpluto.a, run: $ make To ins

Nov 7, 2022
Small header only C++ library for writing multiplatform terminal applications

Terminal Terminal is small header only library for writing terminal applications. It works on Linux, macOS and Windows (in the native cmd.exe console)

Dec 1, 2022
:computer: C++ Functional Terminal User Interface. :heart:
:computer: C++ Functional Terminal User Interface. :heart:

FTXUI Functional Terminal (X) User interface A simple C++ library for terminal based user interface. Demo: Feature Functional style. Inspired by [1] a

Nov 30, 2022
A little UNIX-inspired terminal application for the Numworks Calculator (not using escher).
A little UNIX-inspired terminal application for the Numworks Calculator (not using escher).

L.E. Terminal (let for short) is a little UNIX-inspired terminal for the Numworks Calculator.

Aug 31, 2022
Draw sequence diagram in text from terminal.

sequence-diagram-cli Draw seqence diagram from terminal.

Nov 26, 2022
Terminal calculator made for programmers working with multiple number representations, sizes, and overall close to the bits
Terminal calculator made for programmers working with multiple number representations, sizes, and overall close to the bits

Programmer calculator The programmer calculator is a simple terminal tool designed to give maximum efficiency and flexibility to the programmer workin

Nov 22, 2022
X terminal emulator rendering through OpenGL ES Compute Shaders

Zutty is a terminal emulator for the X Window System, functionally similar to several other X terminal emulators such as xterm, rxvt and countless others

Dec 3, 2022
The new Windows Terminal and the original Windows console host, all in the same place!

The new Windows Terminal and the original Windows console host, all in the same place!

Nov 28, 2022
n³ The unorthodox terminal file manager
n³ The unorthodox terminal file manager

n³ The unorthodox terminal file manager

Nov 30, 2022
Graphs the activity of a chia harvester in a linux terminal.
Graphs the activity of a chia harvester in a linux terminal.

Chia Harvest Graph Monitor for Chia Harvesting Introduction The chiaharvestgraph tool will graph Chia Harvesting activity in a linux terminal. Use a 2

Nov 10, 2022
a simple to use linux terminal

a simple to use linux terminal

Feb 17, 2022
Collection of human friendly terminal interface for git.
Collection of human friendly terminal interface for git.

A collection of human friendly terminal user interface for git.

Nov 25, 2022
Simple benchmark for terminal output

TermBench This is a simple timing utility you can use to see how slow your terminal program is at parsing escape-sequence-coded color output. It can b

Oct 19, 2022
tinytetris - 80x23 terminal tetris
tinytetris - 80x23 terminal tetris

tinytetris - 80x23 terminal tetris

Dec 1, 2022
Contour - A modern C++ Terminal Emulator
 Contour - A modern C++ Terminal Emulator

contour is a modern terminal emulator, for everyday use. It is aiming for power users with a modern feature mindset.

Nov 24, 2022
Simple Unix Terminal Football Manager-like game.

Superleage 2020/2021 It is a "work in progress" simple game based on some mechanics of Football Manager. The game is in a very early stage of Developm

Oct 14, 2021
timg - Terminal Image and Video Viewer
 timg - Terminal Image and Video Viewer

timg - Terminal Image and Video Viewer

Nov 29, 2022
Tiny Mobile Terminal Device Kit.
Tiny Mobile Terminal Device Kit.

Tiny Mobile Terminal Device Kit.

Dec 1, 2022