diff --git a/keybinds.h b/keybinds.h index bae66f7..b82c09e 100644 --- a/keybinds.h +++ b/keybinds.h @@ -66,6 +66,10 @@ static Key keys[] = { { 0, 0, XK_j, move, {.i = 2 } }, { 0, 0, XK_h, move, {.i = 3 } }, { 0, 0, XK_l, move, {.i = 4 } }, + { 0, CONTROL, XK_k, setlines, {.i = +1 } }, + { 0, CONTROL, XK_j, setlines, {.i = -1 } }, + { 0, CONTROL, XK_h, setcolumns, {.i = +1 } }, + { 0, CONTROL, XK_l, setcolumns, {.i = -1 } }, { 0, CONTROL, XK_k, restoresel, {0} }, { 0, CONTROL, XK_h, viewhist, {0} }, { 0, CONTROL, XK_u, clear, {0} }, diff --git a/libs/arg.c b/libs/arg.c index 2fe8319..a68f16c 100644 --- a/libs/arg.c +++ b/libs/arg.c @@ -396,3 +396,25 @@ defaultimg(const Arg *arg) drawmenu(); #endif } + +void +setlines(const Arg *arg) +{ + lines += arg->i; + if (lines < 0) lines = 0; + + match(); + resizeclient(); + drawmenu(); +} + +void +setcolumns(const Arg *arg) +{ + columns += arg->i; + if (columns < 0) columns = 0; + + match(); + resizeclient(); + drawmenu(); +} diff --git a/libs/arg.h b/libs/arg.h index cfe8e38..803c7d2 100644 --- a/libs/arg.h +++ b/libs/arg.h @@ -29,3 +29,5 @@ static void rotateimg(const Arg *arg); static void flipimg(const Arg *arg); static void setimgpos(const Arg *arg); static void setimggaps(const Arg *arg); +static void setlines(const Arg *arg); +static void setcolumns(const Arg *arg); diff --git a/libs/client.c b/libs/client.c index b0c8196..10735b2 100644 --- a/libs/client.c +++ b/libs/client.c @@ -42,3 +42,24 @@ set_prop(void) return; } + +void +resizeclient(void) +{ + int omh = mh; + + bh = drw->font->h + 2 + reqlineheight; + lines = MAX(lines, 0); + + #if USEIMAGE + if (image) + resizetoimageheight(imageheight); + #endif + + mh = (lines + 1) * bh; + + if (!win || omh == mh) return; + + XResizeWindow(dpy, win, mw, mh); + drw_resize(drw, mw, mh); +} diff --git a/libs/client.h b/libs/client.h index 9c7e320..d80b7ad 100644 --- a/libs/client.h +++ b/libs/client.h @@ -2,3 +2,4 @@ static void create_window(int x, int y, int w, int h); static void prepare_window_size(void); static void set_window(void); static void set_prop(void); +static void resizeclient(void); diff --git a/libs/draw.c b/libs/draw.c index 149897a..7d66b32 100644 --- a/libs/draw.c +++ b/libs/draw.c @@ -235,13 +235,15 @@ drawmenu(void) } #endif - for (item = curr; item != next; item = item->right, i++) + for (item = curr; item != next; item = item->right, i++) { drawitem( item, x + ((i / lines) * ((mw - x) / columns)) - xpad, y + (((i % lines) + 1) * bh), (mw - x) / columns ); + } + } else if (matches) { /* draw horizontal list */ x += inputw; diff --git a/libs/match.c b/libs/match.c index d68c54c..8830f3d 100644 --- a/libs/match.c +++ b/libs/match.c @@ -130,6 +130,7 @@ match(void) appenditem(item, &lsubstr, &substrend); } } + if (lhpprefix) { if (matches) { matchend->right = lhpprefix; diff --git a/spmenu.c b/spmenu.c index 393b07a..9a5e911 100644 --- a/spmenu.c +++ b/spmenu.c @@ -199,7 +199,6 @@ static void calcoffsets(void); static void readstdin(void); static void recalculatenumbers(void); static void usage(void); -static void match(void); static void movewordedge(int dir); static void insert(const char *str, ssize_t n); static void cleanup(void); @@ -225,8 +224,6 @@ static char *(*fstrstr)(const char *, const char *) = cistrstr; #include "libs/img.c" #include "libs/rtl.h" #include "libs/rtl.c" -#include "libs/match.h" -#include "libs/match.c" #include "libs/event.h" #include "libs/event.c" #include "libs/key.c" @@ -234,13 +231,15 @@ static char *(*fstrstr)(const char *, const char *) = cistrstr; #include "libs/sort.c" #include "libs/draw.c" #include "libs/schemes.c" -#include "libs/arg.c" #include "libs/argv.h" #include "libs/argv.c" #include "libs/xrdb.c" #include "libs/mode.c" #include "libs/client.h" #include "libs/client.c" +#include "libs/match.h" +#include "libs/match.c" +#include "libs/arg.c" void appenditem(struct item *item, struct item **list, struct item **last) @@ -683,8 +682,8 @@ setup(void) reqlineheight = clineheight; } - /* calculate menu geometry */ - bh = drw->font->h + 2 + reqlineheight; + // resize client + bh = drw->font->h + 2 + reqlineheight; lines = MAX(lines, 0); reallines = lines; @@ -693,7 +692,7 @@ setup(void) resizetoimageheight(imageheight); #endif - mh = (lines + 1) * bh; + mh = (lines + 1) * bh; promptw = (prompt && *prompt) ? TEXTWM(prompt) - lrpad / 4 : 0; if (accuratewidth) {