jstkdng / ueberzugpp

Drop in replacement for ueberzug written in C++
GNU General Public License v3.0
836 stars 29 forks source link

Coordinates and dimensions not respected #170

Closed lucas-mior closed 5 months ago

lucas-mior commented 8 months ago

Something happened between version 2.8.8 and 2.9.4, because in the former, everything works as expected, but on the later, the images are always displayed on the upper left corner and real size, no matter what x, y, width and height options I pass. I have not changed my configuration (which I have used for years).

jstkdng commented 8 months ago

Hey, can you show the logs after running export SPDLOG_LEVEL=debug? They are located on /tmp/ueberzugpp-$USER.log

BennyOe commented 7 months ago

@jstkdng my st config is

``` /* See LICENSE file for copyright and license details. */ /* * appearance * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ static char *font = "JetBrainsMono NFM:pixelsize=12:antialias=true:autohint=true"; /* Spare fonts */ static char *font2[] = { "Symbola:pixelsize=14:antialias=true:autohint=true", }; static int borderpx = 2; /* * What program is execed by st depends of these precedence rules: * 1: program passed with -e * 2: scroll and/or utmp * 3: SHELL environment variable * 4: value of shell in /etc/passwd * 5: value of shell in config.h */ static char *shell = "/bin/sh"; char *utmp = NULL; /* scroll program: to enable use a string like "scroll" */ char *scroll = NULL; char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; /* identification sequence returned in DA and DECID */ char *vtiden = "\033[?6c"; /* Kerning / character bounding-box multipliers */ static float cwscale = 1.0; static float chscale = 1.0; /* * word delimiter string * * More advanced example: L" `'\"()[]{}" */ wchar_t *worddelimiters = L" "; /* selection timeouts (in milliseconds) */ static unsigned int doubleclicktimeout = 300; static unsigned int tripleclicktimeout = 600; /* alt screens */ int allowaltscreen = 1; /* allow certain non-interactive (insecure) window operations such as: setting the clipboard text */ int allowwindowops = 0; /* * draw latency range in ms - from new content/keypress/etc until drawing. * within this range, st draws when content stops arriving (idle). mostly it's * near minlatency, but it waits longer for slow updates to avoid partial draw. * low minlatency will tear/flicker more, as it can "detect" idle too early. */ static double minlatency = 8; static double maxlatency = 33; /* * blinking timeout (set to 0 to disable blinking) for the terminal blinking * attribute. */ static unsigned int blinktimeout = 800; /* * thickness of underline and bar cursors */ static unsigned int cursorthickness = 2; /* * 1: render most of the lines/blocks characters without using the font for * perfect alignment between cells (U2500 - U259F except dashes/diagonals). * Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored. * 0: disable (render all U25XX glyphs normally from the font). */ const int boxdraw = 1; const int boxdraw_bold = 1; /* braille (U28XX): 1: render as adjacent "pixels", 0: use font */ const int boxdraw_braille = 1; /* * bell volume. It must be a value between -100 and 100. Use 0 for disabling * it */ static int bellvolume = 0; /* default TERM value */ char *termname = "st-256color"; /* * spaces per tab * * When you are changing this value, don't forget to adapt the »it« value in * the st.info and appropriately install the st.info in the environment where * you use this st version. * * it#$tabspaces, * * Secondly make sure your kernel is not expanding tabs. When running `stty * -a` »tab0« should appear. You can tell the terminal to not expand tabs by * running following command: * * stty tabs */ unsigned int tabspaces = 8; /* bg opacity */ float alpha = 0.8, alphaUnfocused = 0.75; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { /* 8 normal colors */ "#000000", /* 0: black */ "#f7768e", /* 1: red */ "#9ece6a", /* 2: green */ "#e0af68", /* 3: yellow */ "#7aa2f7", /* 4: blue */ "#bb9af7", /* 5: magenta */ "#7dcfff", /* 6: cyan */ "#a9b1d6", /* 7: white */ /* 8 bright colors */ "#414868", /* 8: brblack */ "#f7768e", /* 9: brred */ "#9ece6a", /* 10: brgreen */ "#e0af68", /* 11: bryellow */ "#7aa2f7", /* 12: brblue */ "#bb9af7", /* 13: brmagenta */ "#7dcfff", /* 14: brcyan */ "#c0caf5", /* 15: brwhite */ }; /* * Default colors (colorname index) * foreground, background, cursor, reverse cursor */ unsigned int defaultfg = 7; unsigned int defaultbg = 0; static unsigned int defaultcs = 15; static unsigned int defaultrcs = 8; unsigned int bg = 0, bgUnfocused = 0; /* * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81 * Default style of cursor * 0: Blinking block * 1: Blinking block (default) * 2: Steady block ("█") * 3: Blinking underline * 4: Steady underline ("_") * 5: Blinking bar * 6: Steady bar ("|") * 7: Blinking st cursor * 8: Steady st cursor */ static unsigned int cursorstyle = 2; static Rune stcursor = 0x2603; /* snowman (U+2603) */ /* * Whether to use pixel geometry or cell geometry */ static Geometry geometry = CellGeometry; /* * Default columns and rows numbers */ static unsigned int cols = 80; static unsigned int rows = 24; /* * Default width and height (including borders!) */ static unsigned int width = 564; static unsigned int height = 364; /* * Default colour and shape of the mouse cursor */ static char *mouseshape = "xterm"; /* * Color used to display font attributes when fontconfig selected a font which * doesn't match the ones requested. */ static unsigned int defaultattr = 11; /* * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). * Note that if you want to use ShiftMask with selmasks, set this to an other * modifier, set to 0 to not use it. */ static uint forcemousemod = ShiftMask; /* * Internal mouse shortcuts. * Beware that overloading Button1 will disable the selection. */ static MouseShortcut mshortcuts[] = { /* mask button function argument release */ { XK_ANY_MOD, Button4, kscrollup, {.i = 1}, 0, /* !alt */ -1 }, { XK_ANY_MOD, Button5, kscrolldown, {.i = 1}, 0, /* !alt */ -1 }, { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, }; /* Internal keyboard shortcuts. */ #define MODKEY Mod1Mask #define TERMMOD (ControlMask | ShiftMask) static Shortcut shortcuts[] = { /* mask keysym function argument */ { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, { ControlMask, XK_Print, toggleprinter, {.i = 0} }, { ShiftMask, XK_Print, printscreen, {.i = 0} }, { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, { TERMMOD, XK_Prior, zoom, {.f = +1} }, { TERMMOD, XK_Next, zoom, {.f = -1} }, { ControlMask, XK_plus, zoom, {.f = +1} }, { ControlMask, XK_equal, zoom, {.f = +1} }, { ControlMask, XK_minus, zoom, {.f = -1} }, { TERMMOD, XK_Home, zoomreset, {.f = 0} }, { TERMMOD, XK_C, clipcopy, {.i = 0} }, { TERMMOD, XK_V, clippaste, {.i = 0} }, { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, { TERMMOD, XK_Return, newterm, {.i = 0} }, }; /* * Special keys (change & recompile st.info accordingly) * * Mask value: * * Use XK_ANY_MOD to match the key no matter modifiers state * * Use XK_NO_MOD to match the key alone (no modifiers) * appkey value: * * 0: no value * * > 0: keypad application mode enabled * * = 2: term.numlock = 1 * * < 0: keypad application mode disabled * appcursor value: * * 0: no value * * > 0: cursor application mode enabled * * < 0: cursor application mode disabled * * Be careful with the order of the definitions because st searches in * this table sequentially, so any XK_ANY_MOD must be in the last * position for a key. */ /* * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) * to be mapped below, add them to this array. */ static KeySym mappedkeys[] = {-1}; /* * State bits to ignore when matching key or button events. By default, * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. */ static uint ignoremod = Mod2Mask | XK_SWITCH_MOD; /* * This is the huge key array which defines all compatibility to the Linux * world. Please decide about changes wisely. */ static Key key[] = { /* keysym mask string appkey appcursor */ { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, { XK_KP_End, ControlMask, "\033[J", -1, 0}, { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, { XK_KP_End, ShiftMask, "\033[K", -1, 0}, { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, { XK_KP_Delete, XK_ANY_MOD, "\033[3~", -1, 0}, { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0}, { XK_Up, ControlMask, "\033[1;5A", 0, 0}, { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0}, { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0}, { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0}, { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0}, { XK_Down, ControlMask, "\033[1;5B", 0, 0}, { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0}, { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0}, { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0}, { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0}, { XK_Left, ControlMask, "\033[1;5D", 0, 0}, { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0}, { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0}, { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0}, { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0}, { XK_Right, ControlMask, "\033[1;5C", 0, 0}, { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0}, { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0}, { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0}, { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, { XK_Return, Mod1Mask, "\033\r", 0, 0}, { XK_Return, XK_ANY_MOD, "\r", 0, 0}, { XK_Insert, ShiftMask, "\033[4l", -1, 0}, { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, { XK_Insert, ControlMask, "\033[L", -1, 0}, { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, { XK_Delete, ControlMask, "\033[M", -1, 0}, { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, { XK_Delete, ShiftMask, "\033[2K", -1, 0}, { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, { XK_Delete, XK_ANY_MOD, "\033[3~", -1, 0}, { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, { XK_Home, ShiftMask, "\033[2J", 0, -1}, { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, { XK_End, ControlMask, "\033[J", -1, 0}, { XK_End, ControlMask, "\033[1;5F", +1, 0}, { XK_End, ShiftMask, "\033[K", -1, 0}, { XK_End, ShiftMask, "\033[1;2F", +1, 0}, { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, { XK_Next, ControlMask, "\033[6;5~", 0, 0}, { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, }; /* * Selection types' masks. * Use the same masks as usual. * Button1Mask is always unset, to make masks match between ButtonPress. * ButtonRelease and MotionNotify. * If no match is found, regular selection is used. */ static uint selmasks[] = { [SEL_RECTANGULAR] = Mod1Mask, }; /* * Printable characters in ASCII, used to estimate the advance width * of single wide characters. */ static char ascii_printable[] = " !\"#$%&'()*+,-./0123456789:;<=>?" "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" "`abcdefghijklmnopqrstuvwxyz{|}~"; ```

There are quite a lot of patches used. I'm using this repo https://github.com/papitz/SimpleTerminal/tree/benni

But the bug was also happening on xTerm with no configuration added.

I don't know if this can be an issue with the window manager as well. I'm using dwm with also a lot of patches included. If you need any logs or want me to check something, I will be glad to investigate and help.

jstkdng commented 7 months ago

I'm checking the logs from the yazi issue and I noticed that st is returning bad ioctl values after the first run.

[2024-04-11 09:19:45.315] [terminal] [debug] ioctl sizes: COLS=0 ROWS=0 XPIXEL=0 YPIXEL=0

That could be an issue on st's side. Also tested xterm and I'm unable to reproduce the issue, can you reproduce the issue if you run plain ueberzug without yazi?

BennyOe commented 7 months ago

I tested it with {"action":"add","identifier":"preview","max_height":0,"max_width":0,"path":"/your/image-path.jpg","x":0,"y":0} and this worked. But with yazi it only works when I downgrade ueberzug

lucas-mior commented 6 months ago

Yes, using "max_width" and "max_height" without "scale":"fit_contain" works, however that's not the same behaviour. Small images dont get scaled up to make use of the available space. It seems to be me that "scale":"fit_contain" no longer works (in version 2.8.8 it still works).

lucas-mior commented 6 months ago

Or not. Using most recent ueberzug version still has the same problem, even using "max_width"and "max_height". So I guess I have to keep using version 2.8.8 for now.

Ornanovitch commented 6 months ago

I have the very same problem since today, when I updated ueberzugpp from 2.9.4-1 to 2.9.4-2 on Archlinux. But this bump of the pkgrel has only been triggered to fix some out of date/missing libraries... I don't know which one, but maybe this comes from a library.

jstkdng commented 6 months ago

Could be a recent sway update, I'll investigate

Ornanovitch commented 6 months ago

I personally don't use sway, I was more thinking about ueberzugpp dependencies like opencv or libxcb. Could it comes from sway if I don't use it?

Ornanovitch commented 6 months ago

I realize it's working again on my side since a reboot... so I suspect I have the same behavior as the one described in the original Yazi issue:

when I close the terminal without exiting yazi before and then reopen yazi in a new terminal the preview is messed up

Ornanovitch commented 6 months ago

Sorry for the multiple comments, but I just managed to identify a potential problem: with Yazi I navigated into a folder with hundreds of images. While everything looks ok on the ui side, a generation process seems blocked:

2024-05-11-131455_209x41_scrot

If I try to quit properly Yazi, it warns me:

1 task running, sure to quit?

In the meantime, here is the unfinished job from the ueberzugpp log:

[2024-05-11 13:07:12.939] [opencv] [info] loading file /tmp/yazi/5b580669acab7d41a304b978b4138b2a
[2024-05-11 13:07:14.583] [main] [info] Command received: {"action":"remove","identifier":"yazi"}
# nothing else after

But If I force quit and re-open Yazi, everything works again (as of now), so maybe I had no luck yesterday...

jstkdng commented 6 months ago

Please do raise that issue with the yazi dev, looks weird.

Could it comes from sway if I don't use it?

Sorry, that was for another issue, don't mind it

lucas-mior commented 6 months ago

Update: It seems that ueberzugpp works fine until version 2.9.3. From 2.9.4 onwards, the following command does not work properly (bug described in the first comment):

dprintf(UEBERZUG_FIFO.fd,
        "{\"action\": \"add\", \"identifier\": \"preview\","
        "\"x\": %u, \"y\": %u, \"max_width\": %u, \"max_height\": %u,",
        pane.x, pane.y, pane.width, pane.height);
dprintf(UEBERZUG_FIFO.fd, "\"path\": \"%s\"}\n", image.fullpath);

After testing the git commits between the versions mentioned above, it seems that the commit that created the bug is 082e34e. The diff follows:

diff --git a/src/application.cpp b/src/application.cpp
index 721b7f7..7ba9148 100644
--- a/src/application.cpp
+++ b/src/application.cpp
@@ -219,22 +219,25 @@ void Application::socket_loop()
 {
     UnixSocket socket;
     socket.bind_to_endpoint(util::get_socket_path());
-    const int waitms = 100;

+    const int waitms = 100;
+    int conn = -1;
     while (true) {
-        int conn = -1;
         try {
             conn = socket.wait_for_connections(waitms);
-            if (stop_flag.load()) {
-                break;
-            }
-            if (conn == -1) {
-                continue;
-            }
         } catch (const std::system_error &err) {
             stop_flag.store(true);
             break;
         }
+
+        if (stop_flag.load()) {
+            break;
+        }
+
+        if (conn == -1) {
+            continue;
+        }
+
         const auto data = socket.read_data_from_connection(conn);
         for (const auto &cmd : data) {
             if (cmd == "EXIT") {
diff --git a/src/canvas/wayland/wayland.cpp b/src/canvas/wayland/wayland.cpp
index 4f1457d..be9d622 100644
--- a/src/canvas/wayland/wayland.cpp
+++ b/src/canvas/wayland/wayland.cpp
@@ -190,6 +190,7 @@ void WaylandCanvas::handle_events()
 {
     const int waitms = 100;
     const auto wl_fd = wl_display_get_fd(display);
+    bool in_event = false;

     while (true) {
         // prepare to read wayland events
@@ -199,20 +200,22 @@ void WaylandCanvas::handle_events()
         wl_display_flush(display);

         try {
-            const auto in_event = os::wait_for_data_on_fd(wl_fd, waitms);
-            if (Application::stop_flag.load()) {
-                break;
-            }
-            if (in_event) {
-                wl_display_read_events(display);
-                wl_display_dispatch_pending(display);
-            } else {
-                wl_display_cancel_read(display);
-            }
+            in_event = os::wait_for_data_on_fd(wl_fd, waitms);
         } catch (const std::system_error &err) {
             Application::stop_flag.store(true);
             break;
         }
+
+        if (Application::stop_flag.load()) {
+            break;
+        }
+
+        if (in_event) {
+            wl_display_read_events(display);
+            wl_display_dispatch_pending(display);
+        } else {
+            wl_display_cancel_read(display);
+        }
     }
 }

diff --git a/src/canvas/x11/x11.cpp b/src/canvas/x11/x11.cpp
index e64862a..5c12418 100644
--- a/src/canvas/x11/x11.cpp
+++ b/src/canvas/x11/x11.cpp
@@ -123,21 +123,24 @@ void X11Canvas::handle_events()
     const int event_mask = 0x80;
     const int waitms = 100;
     const int connfd = xcb_get_file_descriptor(connection);
+    bool status = false;

     while (true) {
         try {
-            const bool status = os::wait_for_data_on_fd(connfd, waitms);
-            if (Application::stop_flag.load()) {
-                break;
-            }
-            if (!status) {
-                continue;
-            }
+            status = os::wait_for_data_on_fd(connfd, waitms);
         } catch (const std::system_error &err) {
             Application::stop_flag.store(true);
             break;
         }

+        if (Application::stop_flag.load()) {
+            break;
+        }
+
+        if (!status) {
+            continue;
+        }
+
         const std::scoped_lock lock{windows_mutex};
         auto event = unique_C_ptr<xcb_generic_event_t>{xcb_poll_for_event(connection)};
         while (event) {
diff --git a/src/terminal.cpp b/src/terminal.cpp
index 84c52fe..74a0af6 100644
--- a/src/terminal.cpp
+++ b/src/terminal.cpp
@@ -48,7 +48,10 @@ Terminal::Terminal()
     logger = spdlog::get("terminal");
     term = os::getenv("TERM").value_or("xterm-256color");
     term_program = os::getenv("TERM_PROGRAM").value_or("");
-    logger->info(R"(TERM="{}", TERM_PROGRAM="{}")", term, term_program);
+    logger->info("TERM = {}", term);
+    if (!term_program.empty()) {
+        logger->info("TERM_PROGRAM = {}", term_program);
+    }
     open_first_pty();
     get_terminal_size();
     set_detected_output();
jstkdng commented 6 months ago

why are you dividing the command into multiple writes?

dprintf(UEBERZUG_FIFO.fd, "{\"action\": \"add\", \"identifier\": \"preview\"," "\"x\": %u, \"y\": %u, \"max_width\": %u, \"max_height\": %u,", pane.x, pane.y, pane.width, pane.height); dprintf(UEBERZUG_FIFO.fd, "\"path\": \"%s\"}\n", image.fullpath);

jstkdng commented 6 months ago

I pushed a fix to master, please do test it

lucas-mior commented 5 months ago

why are you dividing the command into multiple writes?

dprintf(UEBERZUG_FIFO.fd, "{\"action\": \"add\", \"identifier\": \"preview\"," "\"x\": %u, \"y\": %u, \"max_width\": %u, \"max_height\": %u,", pane.x, pane.y, pane.width, pane.height); dprintf(UEBERZUG_FIFO.fd, "\"path\": \"%s\"}\n", image.fullpath);

Only for code organization. Also I use ueberzug commands in other scripts and they all shared the same problem, not only this C code.

lucas-mior commented 5 months ago

I pushed a fix to master, please do test it

It seems to be working, thank you very much.

jstkdng commented 5 months ago

Nice, closing then