summaryrefslogtreecommitdiff
path: root/drw.c
AgeCommit message (Collapse)Author
2024-07-17render invalid utf8 sequences as U+FFFDNRK
previously drw_text would do the width calculations as if invalid utf8 sequences were replaced with U+FFFD but would pass the invalid utf8 sequence to xft to render where xft would just cut it off at the first invalid byte. this change makes invalid utf8 render as U+FFFD and avoids sending invalid sequences to xft. the following can be used to check the behavior before and after the patch: $ printf "0\xef1234567\ntest" | dmenu Ref: https://lists.suckless.org/dev/2407/35646.html
2024-07-17overhaul utf8decode()NRK
this changes the utf8decode function to: * report when an error occurs * report how many bytes to advance on error these will be useful in the next commit to render invalid utf8 sequences. the new implementation is also shorter and more direct.
2023-07-09drw: minor improvement to the nomatches cacheNRK
1. use `unsigned int` to store the codepoints, this avoids waste on common case where `long` is 64bits. and POSIX guarantees `int` to be at least 32bits so there's no risk of truncation. 2. since switching to `unsigned int` cuts down the memory requirement by half, double the cache size from 64 to 128. 3. instead of a linear search, use a simple hash-table for O(1) lookups.
2022-09-17remove workaround for a crash with color emojis on some systems, now fixed ↵Hiltjo Posthuma
in libXft 2.3.5 https://gitlab.freedesktop.org/xorg/lib/libxft/-/blob/libXft-2.3.5/NEWS
2022-04-16drw_text: account for fallback fonts in ellipsis_widthNRK
additionally, ellipsis_width (which shouldn't change) is made static to avoid re-calculating it on each drw_text() call.
2022-04-16drw_text: don't segfault when called with 0 widthNRK
this patch just rejects *any* 0 width draws, which is surely an error by the caller. this also guards against cases where the width is too small for the ellipsis to fit, so ellipsis_w will remain 0. reported by Bakkeby <bakkeby@gmail.com>
2022-03-25introduce drw_fontset_getwidth_clamp()NRK
getting the width of a string is an O(n) operation, and in many cases users only care about getting the width upto a certain number. instead of calling drw_fontset_getwidth() and *then* clamping the result, this patch introduces drw_fontset_getwidth_clamp() function, similar to strnlen(), which will stop once we reach n. the `invert` parameter was overloaded internally to preserve the API, however library users should be calling drw_fontset_getwidth_clamp() and not depend upon internal behavior of drw_text().
2022-03-25drw_text: improve performance when there's no matchNRK
this was the last piece of the puzzle, the case where we can't find any font to draw the codepoint. in such cases, we use XftFontMatch() which is INSANELY slow. but that's not the real problem. the real problem was we were continuously trying to match the same thing over and over again. this patch introduces a small cache, which keeps track a couple codepoints for which we know we won't find any matches. with this, i can dump lots of emojies into dmenu where some of them don't have any matching font, and still not have dmenu lag insanely or FREEZE completely when scrolling up and down. this also improves startup time, which will of course depend on the system and all installed fonts; but on my system and test case i see the following startup time drop: before -> after 60ms -> 34ms
2022-03-25drw_text: improve both performance and correctnessNRK
this patch makes some non-trivial changes, which significantly improves the performance of drawing large strings as well as fixes any issues regarding the printing of the ellipsis when string gets truncated. * performance: before there were two O(n) loops, one which finds how long we can go without changing font, and the second loop would (incorrectly) truncate the string if it's too big. this patch merges the overflow calculation into the first loop and exits out when overflow is detected. when dumping lots of emojies into dmenu, i see some noticeable startup time improvement: before -> after 460ms -> 360ms input latency when scrolling up/down is also noticeably better and can be tested with the following: for _ in $(seq 20); do cat /dev/urandom | base64 | tr -d '\n' | head -c 1000000 echo done | ./dmenu -l 10 * correctness: the previous version would incorrectly assumed single byte chars and would overwrite them with '.' , this caused a whole bunch of obvious problems, including the ellipsis not getting rendered if then font changed. in addition to exiting out when we detect overflow, this patch also keeps track of the last x-position where the ellipsis would fit. if we detect overflow, we simply make a recursing call to drw_text() at the ellipsis_x position and overwrite what was there. so now the ellipsis will always be printed properly, regardless of weather the font changes or if the string is single byte char or not. the idea of rendering the ellipsis on top incase of overflow was from Bakkeby <bakkeby@gmail.com>, thanks! however the original patch had some issues incorrectly truncating the prompt (-p flag) and cutting off emojies. those have been fixed in here.
2021-08-20Revert "Improve speed of drw_text when provided with large strings"Hiltjo Posthuma
This reverts commit c585e8e498ec6f9c423ab8ea07cf853ee5b05fbe. It causes issues with truncation of characters when the text does not fit and so on. The patch should be reworked and properly tested.
2021-08-12Improve speed of drw_text when provided with large stringsMiles Alan
Calculates len & ew in drw_font_getexts loop by incrementing instead of decrementing; as such avoids proportional increase in time spent in loop based on provided strings size.
2020-06-11Fix memory leaks in drwHiltjo Posthuma
Synced from dwm. Patch by Alex Flierl <shad0w73@freenet.de>, thanks.
2019-02-02Prepared 4.9 release.Anselm R Garbe
2017-11-03drw: drw_scm_create: use Clr typeHiltjo Posthuma
in this context XftColor is a too low-level type.
2016-08-12die() consistency: always add newlineHiltjo Posthuma
2016-06-03import new drw from libsl and minor fixes.Markus Teich
- extract drawitem function (code deduplication) - fix bug where inputw was not correctly calculated from the widest item, but just from the one with the longest strlen() which is not the same. It's better now, but does not account for fallback fonts, since it would be too slow to calculate all the correct item widths on startup. - minor code style fixes (indentation, useless line breaks)
2015-10-20drw: cleanup drw_text, prevent gcc warning false-positive of unused varHiltjo Posthuma
... we don't allow passing text is NULL anymore either, for that behaviour just use drw_rect() (it is used in dwm).
2015-10-20drw: simplify drw_font_xcreate and prevent a potential unneeded allocationHiltjo Posthuma
2015-10-20drw: a valid (non-NULL) Drw and Fnt context must be passedHiltjo Posthuma
don't do these checks on this level. However for resource drw_*_free we will allow it.
2015-10-20add sbase-style ecalloc(), calloc: or dieHiltjo Posthuma
... remove intermediary variables
2015-09-27drw style improvementsHiltjo Posthuma
this makes the code-style more consistent aswell.
2015-06-27Use libdraw: add Xft and fallback-fonts support to graphics libHiltjo Posthuma
- libdraw, util: add drw.{c,h}, util.{c,h} and update code. - libdraw: fix drw_rect(): use w and h parameter. - libdraw: print errstr if last character in string was ":" (sbase). - libdraw: drw_clr_free() allow valid free(NULL). - config.def.h: set default font to monospace. - cleanup() on exit. - LICENSE: update license string for dmenu -v to 2015. - LICENSE: add myself to LICENSE