// always remeasure?
// :xx is points: tab left_margin
// what exactly is left margin for wrapping
-// wrap content with cursor should itself wrap if needed, appeared unwrapped if possible
/*
* Copyright Neil Brown ©2015-2023 <neil@brown.name>
* May be distributed under terms of GPLv2 - see file:COPYING
static inline struct call_return do_measure(struct pane *p safe,
struct render_item *ri safe,
- char *str safe, int len,
- int offset)
+ int splitpos, int len,
+ int maxwidth)
{
struct rline_data *rd = &p->data;
struct call_return cr;
+ char tb[] = " ";
+ char *str = rd->line + ri->start + splitpos;
char tmp;
+ if (rd->line[ri->start] == '\t') {
+ str = tb;
+ if (len < 0)
+ len = ri->tab_cols - splitpos;
+ } else
+ if (len < 0)
+ len = ri->len - splitpos;
tmp = str[len];
str[len] = 0;
cr = call_ret(all, "Draw:text-size", p,
- offset, NULL, str,
+ maxwidth, NULL, str,
rd->scale, NULL, ri->attr);
str[len] = tmp;
+ if (cr.ret == 1 && maxwidth >= 0 &&
+ cr.i >= len)
+ /* All fits in maxwidth */
+ cr.ret = 2;
return cr;
}
for (ri = rd->content; ri; ri = ri->next) {
if (!is_ctrl(rd->line[ri->start])) {
- cr = do_measure(p, ri, rd->line + ri->start,
- ri->len, -1);
+ cr = do_measure(p, ri, 0, -1, -1);
} else {
char tmp[4];
if (ri->eol) {
wrap_margin = rd->head_length;
for (ri = rd->content ; wrap && ri ; ri = ri->next) {
int splitpos;
- char *str;
- int len;
- char tb[] = " ";
if (ri->wrap && (wraprl == NULL || ri->wrap != wraprl->wrap))
wraprl = ri;
if (ri->wrap_margin)
/* Need to split this ri into two or more pieces */
x = ri->x;
splitpos = 0;
- str = rd->line + ri->start;
- len = ri->len;
- if (*str == '\t') {
- str = tb;
- len = ri->tab_cols;
- }
while (1) {
- cr = do_measure(p, ri, str + splitpos,
- len - splitpos,
+ cr = do_measure(p, ri, splitpos, -1,
right_margin - rd->tail_length - x);
- if (cr.i >= len - splitpos)
+ if (cr.ret == 2)
/* Remainder fits now */
break;
/* re-measure the first part */
- cr = do_measure(p, ri, str + splitpos,
+ cr = do_measure(p, ri, splitpos,
cr.i,
right_margin - rd->tail_length - x);
if (rd->line[ri->start] == '\t')
cr.i = 0;
else
- cr = do_measure(p, ri, rd->line + ri->start, ri->len,
- x - ri->x);
+ cr = do_measure(p, ri, 0, -1, x - ri->x);
return ri->start + cr.i;
}
}
if (ri->eol)
cr.x = offset ? ri->width : 0;
- else {
- char *str = rd->line + ri->start + st;
- char tb[] = " ";
- if (rd->line[ri->start] == '\t') {
- str = tb;
- if (offset)
- offset = ri->tab_cols;
- }
- cr = do_measure(p, ri, str, offset - st, -1);
- }
+ else
+ cr = do_measure(p, ri, st, offset - st, -1);
+
if (split)
xy.x = cr.x; /* FIXME margin?? */
else