about summary refs log tree commit diff stats
path: root/src/local/pager.nim
Commit message (Collapse)AuthorAgeFilesLines
* dynstream: fix memory leakbptato2024-10-041-2/+1
| | | | now I know why overloading dealloc felt wrong
* sixel, term: reduce half-dump special casingbptato2024-10-041-3/+7
| | | | | | | Makes it slightly easier to debug image output. Also, we stop sending dimension headers, and no longer check for the scheme env var to make CLI invocation a bit less annoying.
* pager: improve rewrite-url semanticsbptato2024-09-301-7/+19
| | | | | | | | | | | | | Previously, it just changed the URL before loading the site; now it's an actual redirect. Technically, the previous behavior was more flexible, because it let you apply siteconf rules exclusively for sites where you redirected from. Practically, this was not very useful, and probably unexpected for anybody trying to use the feature. This also fixes a bug where the loader filter would be set for the original page, so you couldn't switch from https to http, etc.
* pager: add missing nil checkbptato2024-09-291-2/+3
|
* loader: send headers for tocache requests toobptato2024-09-281-5/+2
| | | | | This lets us send the transparency bit as a header, and also halves the number of header parsers in loader.
* container: fix control char displaybptato2024-09-281-1/+1
| | | | | | Also, kill twidth and its friends; we haven't been using it for a while now. (In the future, a solution with PUA chars might be worth exploring.)
* loader, pager: fix fd leaksbptato2024-09-251-0/+3
|
* term: prevent negative line damage, fix off by onebptato2024-09-251-1/+1
|
* pager: make image ordering deterministicbptato2024-09-251-1/+2
| | | | ensure that images are shown in the order buffer sent them
* sixel: support transparencybptato2024-09-241-2/+6
| | | | | | | | | | | | | | | | | | Sixel can only represent transparency for fully transparent (alpha = 0) and fully opaque (alpha = 255) pixels, i.e. we would have to do blending ourselves to do this "properly". But what do you even blend? Background color? Images? Clearly you can't do text... So instead of going down the blending route, we now just approximate the 8-bit channel with Sixel's 1-bit channel and then patch it up with dither. It does look a bit weird, but it's not *that* bad, especially compared to the previous strategy of "blend with some color which hopefully happens to be the background color" (it rarely was). Note that this requires us to handle transparent images specially in term. That is, for opaque ones, we can leave out the "clear cells affected by image" part, but for transparent ones, we must clear the entire image every time.
* select: use a separate module (again)bptato2024-09-241-1/+5
| | | | | | | | | Now we dispatch to select objects from the pager object too, just to make things even more confusing. Well, it works better than the previous arrangement, in that trying to use unimplemented movements now just throws instead of moving around the container. Yay for OOP (?)
* pager: fix double-width overprint & reload blank screen bugbptato2024-09-241-3/+7
| | | | | * fix overprint of double width chars in status & select * fix blank screen on reload + startpos screen move
* sixel: use inline background for blendingbptato2024-09-241-1/+1
| | | | still not really great, because inline background is a mess too
* Replace std/selectors with pollbptato2024-09-231-6/+5
| | | | | | | | | | | | std/selectors uses OS-specific selector APIs, which sounds good in theory (faster than poll!), but sucks for portability in practice. Sure, you can fix portability bugs, but who knows how many there are on untested platforms... poll is standard, so if it works on one computer it should work on all other ones. (I hope.) As a bonus, I rewrote the timeout API for poll, which incidentally fixes setTimeout across forks. Also, SIGWINCH should now work on all platforms (as we self-pipe instead of signalfd/kqueue magic).
* client, forkserver, dynstream: misc refactorings, fixesbptato2024-09-231-27/+18
| | | | | | * fix broken int conversion in dynstream * fix EPIPE handling in forkserver * merge fdmap and connectingContainers into loader map
* term: refactorbptato2024-09-231-8/+9
| | | | | * reduce copies & allocations * simplify SGR generation
* loader: mmap intermediate image files, misc refactoringbptato2024-09-221-22/+79
| | | | | | | | | | | | | | | | | | | | | | | | | | | * refactor parseHeader * optimize response blob() * add direct "to cache" mode for loader requests which sets stdout to a file, and use it for image processing * move image resizing into a separate process * mmap cache files in between processing steps when possible At last, resize is no longer a part of image decoding. Also, it feels much nicer to keep encoded image data in the same cache as everything else. The mmap operations *should* be more efficient than copying the whole RGBA data through a pipe. In practice, it only makes a difference for loading (well, now just mmapping) the encoded image into the pager, where it singlehandedly speeds up image display by 10x on my test image. For the other steps, the unfortunate fact that "tocache" must delay the next fork/exec in the pipeline until the entire image is processed seems to equal out any wins we might have gotten from skipping a single raw RGBA copy. I have tried moving the delay before the exec (it's possible with yet another pipe), but it didn't help much and made the code much uglier. (Not that tocache didn't, but I can live with this...)
* pager: improve hover text handlingbptato2024-09-221-42/+73
| | | | | | | | | | | * align status truncating behavior with w3m (not exactly, clipping is still different, but this should be fine for now) * add "su" for "show last alert" - w3m's solution here is to scroll one char at a time with "u", but that's extremely annoying to use. We already have a line editor that can navigate lines, so reuse that instead. * fix peekCursor showing empty text * update todo
* dom: add forms, elements getter + misc fixesbptato2024-09-171-9/+2
| | | | | | | | | | | | * add document.forms * add form.elements * remove redundant jshasprop functions * use mpairs for attribute iteration (mpairs use pointers, but pairs copies) * fix remove() crash * fix remove() collection invalidation for children (if parent is not in the collection) * update monoucha
* loader: refactor/move around some procsbptato2024-09-151-2/+3
| | | | | | | | | | | | | | Module boundaries didn't make much sense here either. Specifically: * loader/cgi was originally just one of the many "real" protocols supported by loader, so it was in a separate module (like the other ones). Now it's mostly an "internal" protocol, and it was getting cumbersome to pass all required loader state to loadCGI. * The loader interface has grown quite large, but there is no need for (or advantage in) putting it in the same module as the implementation. Now CGI is handled by loader, and the interface is in the new module "loaderiface".
* Refactor img/*bptato2024-09-151-1/+1
| | | | | I've moved most image logic to adapter, so it doesn't really make sense to have this subdir anymore.
* loader: refactor, misc optimizations & fixesbptato2024-09-141-22/+10
| | | | | | | | * factor out input/output handle tables; use a seq instead * add possibility to directly open cached items onto stdin (mainly an optimization for reading images, which are always cached) * close used handles on local CGI execution * make clone during load work again
* term: improve damage tracking, special case yaftbptato2024-09-131-0/+1
| | | | | | | It still sucks, but at least now it flashes a bit less. (I should really redo it properly some time) Also, special case yaft so that we always output sixels for it.
* pager: fix saveSourcebptato2024-09-101-4/+6
| | | | | | Welp. The fence was needed after all. The keybinding was broken anyway; fix that too.
* pager: fix rewrite-url weirdnessbptato2024-09-101-5/+3
| | | | | | | | | saveSource's URL overriding mechanism conflicted with rewrite-url, since the latter wouldn't change the overriding URL (which was not optional either). Remove the former since a) it's just cosmetic and b) not really visible to the user at all.
* pager, term: fix kitty display, add a sixel bounds checkbptato2024-09-091-2/+2
|
* utils: add twtunibptato2024-09-081-10/+11
| | | | | | | | | | | | | | | | | | | std/unicode has the following issues: * Rune is an int32, which implies overflow checking. Also, it is distinct, so you have to convert it manually to do arithmetic. * QJS libunicode and Chagashi work with uint32, interfacing with these required pointless type conversions. * fastRuneAt is a template, meaning it's pasted into every call site. Also, it decodes to UCS-4, so it generates two branches that aren't even used. Overall this lead to quite some code bloat. * fastRuneAt and lastRune have frustratingly different interfaces. Writing code to handle both cases is error prone. * On older Nim versions which we still support, std/unicode takes strings, not openArray[char]'s. Replace it with "twtuni", which includes some improved versions of the few procedures from std/unicode that we actually use.
* term: sixel sizing & output fixesbptato2024-09-051-2/+2
| | | | | | | | | | | | * round down to number divisible by 6 for height * make pager's dispw match term's dispw even after width clamping * make *BE procs actually emit/consume big-endian (lol) * fix borked sixel set raster attributes & control string I mixed up SRA with the device control string's parameters, so instead of toggling transparency in the DCS, I was setting the second SRA parameter to 0. Which, by the way, defines the aspect ratio's denominator, and has nothing to do with transparency. Whoops.
* loader: fix some fd leaksbptato2024-09-021-4/+2
| | | | + be a bit more paranoid about double closes
* pager: fix missing gotoLine return valuebptato2024-09-011-0/+1
|
* canvas: move to separate CGI scriptbptato2024-09-011-34/+21
| | | | | | | | | | * stream: and passFd is now client-based, and accessible for buffers * Bitmap's width & height is now int, not uint64 * no more non-network Bitmap special case in the pager for canvas I just shoehorned it into the static image model, so it still doesn't render changes after page load. But at least now it doesn't crash the browser.
* pager: fix nav direction after view sourcebptato2024-08-271-0/+1
|
* sixel: break out into a separate cgi scriptbptato2024-08-241-31/+51
| | | | | | | | This caches sixel output. Works best when the line height is a multiple of 6px, but should still be faster than the previous solution everywhere else too (simply by virtue of encoding separate images in parallel). Next step: actual color quantization
* winattrs: un-snakeifybptato2024-08-231-1/+1
|
* xhr: more progressbptato2024-08-151-6/+5
| | | | | | | | | | * add responseText, response * add net tests -> currently sync XHR only; should find a way to do async tests... * update monoucha -> simplified & updated some related code that no longer worked properly
* mailcap: various fixesbptato2024-08-111-5/+5
| | | | | | * parse last line even if it doesn't end with LF * parse flags & named fields case-insensitively * update naming
* dom: remove generic JS bindingsbptato2024-08-111-6/+11
| | | | Dispatch manually with fromJS instead.
* pager: fix incorrect error message in rewrite-urlbptato2024-08-101-3/+6
| | | | It did not actually break rewrite-url, but was still annoying.
* pager: fix <select> drawing after container redrawbptato2024-08-091-0/+2
|
* Update monouchabptato2024-08-091-30/+34
|
* Fixes for Nim 2.2bptato2024-07-291-2/+0
| | | | | | | | | * xmlhttprequest: fix missing import * painter: generic tuple workaround * dynstream: merge module with implementations (so it will work with vtables) Not enabling vtables yet since it doesn't work with refc.
* buffer, pager, config: add meta-refresh + misc fixesbptato2024-07-281-24/+68
| | | | | | | | | * buffer, pager, config: add meta-refresh value, which makes it possible to follow http-equiv=refresh META tags. * config: clean up redundant format mode parser * timeout: accept varargs for params to pass on to functions * pager: add "options" dict to JS gotoURL * twtstr: remove redundant startsWithNoCase
* pager: fix dead containers left in replaceBackupbptato2024-07-231-0/+6
| | | | | | | | | | | fixes the following bug: * click a link that redirects somewhere * go back * discard buffer (that had the link) * discard the new buffer then you would find yourself in a zombie buffer you previously discarded
* loader: copy cached items on buffer cloningbptato2024-07-201-3/+3
| | | | | This fixes a bug where cloning buffers with images would crash the browser.
* loader: async status/headers for fetchbptato2024-07-191-7/+2
| | | | | | | | The status code & headers are no longer guaranteed to be sent right after res/outputId, so read them asynchronously instead. (This is pretty much the same code as the buffer connection handler in pager. Hopefully we can merge the two at some point.)
* config: support smart casebptato2024-07-161-4/+1
| | | | and enable it by default.
* 32-bit compilation fixesbptato2024-07-131-8/+8
| | | | | | | | It seems registerHandle/unregister doesn't accept cint as handles. Not sure why it even works on 64-bit targets... (maybe some converter weirdness?) Seems best to explicitly cast it away.
* pager: fix redirection to deleted buffersbptato2024-07-061-5/+18
| | | | | | Fixes the bug where getting redirected to a buffer that the pager then deleted (e.g. image display, site no longer available, etc.) would land you in a buffer detached from the main tree.
* config: add buffer.autofocusbptato2024-07-041-0/+1
| | | | Same as [[siteconf]] autofocus.
* pager: PNGify kitty images, clear images on buffer switchbptato2024-07-021-13/+48
| | | | | | | | | | | Saves bandwidth; it's especially useful over SSH. Still not sure if this is the right solution, since it now needs two select cycles instead of one, and it does yet another copy of the image. (Unnecessarily, because stbi cannot stream its output, and stbiw cannot stream its input.) Also, to save memory, we now discard decoded images of buffers that are not being viewed.