popup: no fallbacks for work areas no desktop has; text setup cannot fail
popuplayout had two refit stages for a work area shorter than one padded row — 40 pixels — and popupdraw re-checked the layout it had just been handed, against an Imgh that bounded no buffer any more. Pango and Cairo abort rather than return nil, so textinit is void and the layout is never nil; the stride Cairo computes for RGB24 is w*4 by definition; and textdraw set the layout's width and ellipsis twice.
This commit is contained in:
@@ -119,7 +119,7 @@ void
|
||||
popuplayout(Drawcmd *dc, int areaw, int areah, Popup *p)
|
||||
{
|
||||
char buf[32];
|
||||
int first, i, markrow, nall, nmark, npre, pad, total, width, y;
|
||||
int first, i, markrow, nall, nmark, npre, total, width, y;
|
||||
|
||||
memset(p, 0, sizeof *p);
|
||||
p->prey = -1;
|
||||
@@ -127,14 +127,12 @@ popuplayout(Drawcmd *dc, int areaw, int areah, Popup *p)
|
||||
p->rowsy = -1;
|
||||
p->marky = -1;
|
||||
p->sely = -1;
|
||||
pad = PopupPad;
|
||||
nall = min(max(dc->nkouho, 0), Maxdisp);
|
||||
npre = dc->pre.n != 0;
|
||||
if((nall == 0 && !npre) || areaw <= 0 || areah <= 0)
|
||||
return;
|
||||
|
||||
/* Rows first; a page marker when they do not all fit; and in a
|
||||
* sliver of a work area the selected row alone, unpadded. */
|
||||
/* As many rows as fit, and a page marker when they do not all. */
|
||||
total = max(dc->total, dc->first + nall);
|
||||
markrow = dc->first > 0 || nall < total;
|
||||
p->n = fitrows(areah, npre, markrow, nall);
|
||||
@@ -142,15 +140,8 @@ popuplayout(Drawcmd *dc, int areaw, int areah, Popup *p)
|
||||
markrow = 1;
|
||||
p->n = fitrows(areah, npre, markrow, nall);
|
||||
}
|
||||
if(p->n == 0 && markrow){
|
||||
markrow = 0;
|
||||
p->n = fitrows(areah, npre, markrow, nall);
|
||||
}
|
||||
if(p->n == 0 && nall != 0){
|
||||
npre = 0;
|
||||
pad = 0;
|
||||
p->n = max(min(nall, areah / Fontsz), 1);
|
||||
}
|
||||
if(p->n == 0 && !npre)
|
||||
return;
|
||||
if(p->n != 0 && dc->sel >= p->n)
|
||||
p->row0 = min(dc->sel - p->n + 1, nall - p->n);
|
||||
first = dc->first + p->row0;
|
||||
@@ -171,7 +162,7 @@ popuplayout(Drawcmd *dc, int areaw, int areah, Popup *p)
|
||||
}
|
||||
p->w = min(width, areaw);
|
||||
|
||||
y = pad;
|
||||
y = PopupPad;
|
||||
if(npre){
|
||||
p->prey = y;
|
||||
y += Fontsz;
|
||||
@@ -188,7 +179,7 @@ popuplayout(Drawcmd *dc, int areaw, int areah, Popup *p)
|
||||
p->marky = y;
|
||||
y += Fontsz;
|
||||
}
|
||||
p->h = min(y + pad, areah);
|
||||
p->h = min(y + PopupPad, areah);
|
||||
p->textw = max(p->w - 2*PopupPad - PopupNumw, 0);
|
||||
if(markrow){
|
||||
p->markw = min(p->markw, max(p->w - 2*PopupPad, 0));
|
||||
@@ -206,10 +197,6 @@ popupdraw(u32int *img, Drawcmd *dc, Popup *p)
|
||||
u32int color;
|
||||
int i, j, y;
|
||||
|
||||
if(img == nil || p->n < 0 || p->n > Maxdisp ||
|
||||
p->row0 < 0 || p->row0 + p->n > dc->nkouho ||
|
||||
p->w <= 0 || p->h <= 0 || p->h > Imgh)
|
||||
return;
|
||||
fill(img, p->w*p->h, Colbg);
|
||||
if(p->prey >= 0)
|
||||
textdraw(img, p->w, p->h, PopupPad, p->prey,
|
||||
|
||||
Reference in New Issue
Block a user