diff --git a/libs/img.c b/libs/img.c index 68d097d..cd30dc8 100644 --- a/libs/img.c +++ b/libs/img.c @@ -168,3 +168,48 @@ loadimagecache(const char *file, int *width, int *height) imlib_save_image(buf); free(buf); } + +void +jumptoindex(unsigned int index) { + unsigned int i; + sel = curr = matches; + calcoffsets(); + for(i = 1; i < index; ++i) { + if(sel && sel->right && (sel = sel->right) == next) { + curr = next; + calcoffsets(); + } + } +} + +void +resizetoimageheight(int imageheight) +{ + int omh = mh, olines = lines; + lines = reallines; + + if(lines * bh < imageheight + imagegaps * 2) + lines = (imageheight+imagegaps*2)/bh; + + mh = (lines + 1) * bh; + + if(mh - bh < imageheight + imagegaps * 2) + mh = imageheight+imagegaps*2+bh; + + if(!win || omh == mh) + return; + + XResizeWindow(dpy, win, mw, mh); + drw_resize(drw, mw, mh); + + if (olines != lines) { + struct item *item; + unsigned int i = 1; + for (item = matches; item && item != sel; item = item->right) + ++i; + + jumptoindex(i); + } + + drawmenu(); +} diff --git a/spmenu.c b/spmenu.c index 222568a..b7c8643 100644 --- a/spmenu.c +++ b/spmenu.c @@ -103,6 +103,7 @@ static char numbers[NUMBERSBUFSIZE] = ""; static char *embed; static int numlockmask = 0; static int bh, mw, mh; +static int reallines = 0; static int reqlineheight; /* required menu height */ static int clineheight; /* menu height added through argument */ static int dmx = 0; /* put spmenu at this x offset */ @@ -159,6 +160,7 @@ static void complete(const Arg *arg); static void savehistory(char *input); static void drawmenu(void); +static void calcoffsets(void); #include "libs/xrdb.h" @@ -1504,6 +1506,10 @@ run(void) } if (image && longestedge) { int leftmargin = imagegaps; + if(mh != bh + height + imagegaps * 2) { + resizetoimageheight(height); + } + if (!imageposition) { /* top mode = 0 */ if (height > width) width = height; @@ -1612,6 +1618,11 @@ setup(void) /* calculate menu geometry */ bh = drw->font->h + 2 + reqlineheight; lines = MAX(lines, 0); + reallines = lines; +#if USEIMAGE + if (image) + resizetoimageheight(imageheight); +#endif mh = (lines + 1) * bh; promptw = (prompt && *prompt) ? TEXTWM(prompt) - lrpad / 4 : 0;