diff --git a/.gitignore b/.gitignore index 4ad8ce4..0a8110b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.out *.o spmenu +*zst* diff --git a/docs/example.Xresources b/docs/example.Xresources index f36895c..023d667 100644 --- a/docs/example.Xresources +++ b/docs/example.Xresources @@ -67,3 +67,11 @@ spmenu.generatecache: 0 spmenu.mode: 0 spmenu.normtext: Normal spmenu.instext: Insert +spmenu.pango_item: 1 +spmenu.pango_prompt: 1 +spmenu.pango_input: 1 +spmenu.pango_leftarrow: 1 +spmenu.pango_rightarrow: 1 +spmenu.pango_numbers: 1 +spmenu.pango_mode: 1 +spmenu.pango_password: 1 diff --git a/options.h b/options.h index 1f11352..47015df 100644 --- a/options.h +++ b/options.h @@ -130,6 +130,15 @@ static char col_sgrcolor13[] = "#ff00ff"; /* SGR color #13 */ static char col_sgrcolor14[] = "#00ffff"; /* SGR color #14 */ static char col_sgrcolor15[] = "#ffffff"; /* SGR color #15 */ +static int pango_item = 1; /* Enable support for pango markup for the items */ +static int pango_prompt = 1; /* Enable support for pango markup for the prompt */ +static int pango_input = 1; /* Enable support for pango markup for user input */ +static int pango_leftarrow = 1; /* Enable support for pango markup for the left arrow */ +static int pango_rightarrow = 1; /* Enable support for pango markup for the right arrow */ +static int pango_numbers = 1; /* Enable support for pango markup for the match count */ +static int pango_mode = 1; /* Enable support for pango markup for the mode indicator */ +static int pango_password = 1; /* Enable support for pango markup for the password text */ + /* Alpha options */ #define fgalpha opaque /* Foreground alpha */ #define bgalpha 200 /* Background alpha */ diff --git a/options.mk b/options.mk index 98eac8d..455e9ec 100644 --- a/options.mk +++ b/options.mk @@ -5,5 +5,5 @@ VERSION = 0.2 # includes and libs -INCS = -I$(X11INC) -I$(FREETYPEINC) `pkg-config --cflags xft pango pangoxft` -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) $(XRENDERLIBS) $(IMLIB2LIBS) -lm `pkg-config --libs xft pango pangoxft` +INCS = -I$(X11INC) -I$(FREETYPEINC) $(BDINC) `pkg-config --cflags xft pango pangoxft` +LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) $(XRENDERLIBS) $(IMLIB2LIBS) $(BDLIBS) -lm `pkg-config --libs xft pango pangoxft` diff --git a/spmenu.c b/spmenu.c index f959ab5..c7f3132 100644 --- a/spmenu.c +++ b/spmenu.c @@ -9,22 +9,30 @@ #include #include -#ifdef FRIBIDI -#define USERTL 1 -#else +/* check if we should enable right to left language support */ +#ifdef NORTL #define USERTL 0 +#else +#define USERTL 1 #endif -#if USERTL -#include -#endif - +/* check if we should enable image support */ #ifdef NOIMAGE #define USEIMAGE 0 #else #define USEIMAGE 1 #endif +#ifdef XINERAMA +#define USEXINERAMA 1 +#else +#define USEXINERAMA 0 +#endif + +#if USERTL +#include +#endif + #if USEIMAGE #include #include @@ -32,7 +40,7 @@ #include #endif -#ifdef XINERAMA +#if USEXINERAMA #include #endif @@ -345,9 +353,9 @@ drawitem(struct item *item, int x, int y, int w) rw = TEXTWM(buffer) - lrpad; #if USERTL apply_fribidi(buffer); - drw_text(drw, x, y, rw + lp, bh, lp, fribidi_text, 0, True); + drw_text(drw, x, y, rw + lp, bh, lp, fribidi_text, 0, pango_item ? True : False); #else - drw_text(drw, x, y, rw + lp, bh, lp, buffer, 0, True); + drw_text(drw, x, y, rw + lp, bh, lp, buffer, 0, pango_item ? True : False); #endif x += rw + lp; @@ -395,9 +403,9 @@ drawitem(struct item *item, int x, int y, int w) /* draw any text that doesn't use sgr sequences */ #if USERTL apply_fribidi(buffer); - int r = drw_text(drw, x, y, w - rw, bh, lp, fribidi_text, 0, True); + int r = drw_text(drw, x, y, w - rw, bh, lp, fribidi_text, 0, pango_item ? True : False); #else - int r = drw_text(drw, x, y, w - rw, bh, lp, buffer, 0, True); + int r = drw_text(drw, x, y, w - rw, bh, lp, buffer, 0, pango_item ? True : False); #endif if (!hidehighlight && !ib) drawhighlights(item, x, y, w - rw); @@ -429,27 +437,27 @@ drawmenu(void) drw_setscheme(drw, scheme[SchemePrompt]); } - x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0, True); + x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0, pango_prompt ? True : False); } /* draw input field */ w = (lines > 0 || !matches) ? mw - x : inputw; drw_setscheme(drw, scheme[SchemeInput]); if (passwd) { - censort = ecalloc(1, sizeof(text)); + censort = ecalloc(1, sizeof(text)); memset(censort, '.', strlen(text)); #if USERTL apply_fribidi(censort); - drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0, True); + drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0, pango_password ? True : False); #else - drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0, True); + drw_text(drw, x, 0, w - LENGTH(censort), bh, lrpad / 2, censort, 0, pango_password ? True : False); #endif - free(censort); + free(censort); } else { #if USERTL apply_fribidi(text); - drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0, True); + drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0, pango_input ? True : False); #else - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0, True); + drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0, pango_input ? True : False); #endif } @@ -482,7 +490,7 @@ drawmenu(void) w = TEXTW(leftarrow); if (curr->left) { drw_setscheme(drw, scheme[SchemeLArrow]); - drw_text(drw, x, 0, w, bh, lrpad / 2, leftarrow, 0, True); + drw_text(drw, x, 0, w, bh, lrpad / 2, leftarrow, 0, pango_leftarrow ? True : False); } x += w; for (item = curr; item != next; item = item->right) @@ -496,21 +504,21 @@ drawmenu(void) drw_setscheme(drw, scheme[SchemeRArrow]); if (hidematchcount) { - drw_text(drw, mw - w - TEXTW(modetext), 0, w, bh, lrpad / 2, rightarrow, 0, True); + drw_text(drw, mw - w - TEXTW(modetext), 0, w, bh, lrpad / 2, rightarrow, 0, pango_rightarrow ? True : False); } else { - drw_text(drw, mw - w - TEXTW(numbers) - TEXTW(modetext), 0, w, bh, lrpad / 2, rightarrow, 0, True); + drw_text(drw, mw - w - TEXTW(numbers) - TEXTW(modetext), 0, w, bh, lrpad / 2, rightarrow, 0, pango_rightarrow ? True : False); } } } if (!hidematchcount) { drw_setscheme(drw, scheme[SchemeNumber]); - drw_text(drw, mw - TEXTW(numbers) - TEXTW(modetext), 0, TEXTW(numbers), bh, lrpad / 2, numbers, 0, False); + drw_text(drw, mw - TEXTW(numbers) - TEXTW(modetext), 0, TEXTW(numbers), bh, lrpad / 2, numbers, 0, pango_numbers ? True : False); } if (!hidemode) { drw_setscheme(drw, scheme[SchemeMode]); - drw_text(drw, mw - TEXTW(modetext), 0, TEXTW(modetext), bh, lrpad / 2, modetext, 0, False); + drw_text(drw, mw - TEXTW(modetext), 0, TEXTW(modetext), bh, lrpad / 2, modetext, 0, pango_mode ? True : False); } drw_map(drw, win, 0, 0, mw, mh); @@ -1533,7 +1541,7 @@ setup(void) Window w, dw, *dws; XWindowAttributes wa; XClassHint ch = { class, class }; - #ifdef XINERAMA + #if USEXINERAMA XineramaScreenInfo *info; Window pw; int a, di, n, area = 0; @@ -1620,7 +1628,7 @@ setup(void) } } } - #ifdef XINERAMA + #if USEXINERAMA i = 0; if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { XGetInputFocus(dpy, &w, &di); diff --git a/xresources.h b/xresources.h index df07aae..cb65037 100644 --- a/xresources.h +++ b/xresources.h @@ -3,121 +3,129 @@ */ ResourcePref resources[] = { - { "font", STRING, &font }, - { "col_caretfgcolor", STRING, &col_caretfgcolor }, - { "col_larrowfg", STRING, &col_larrowfg }, - { "col_rarrowfg", STRING, &col_rarrowfg }, - { "col_larrowbg", STRING, &col_larrowbg }, - { "col_rarrowbg", STRING, &col_rarrowbg }, - { "col_itemnormfg", STRING, &col_itemnormfg }, - { "col_itemnormbg", STRING, &col_itemnormbg }, - { "col_itemselfg", STRING, &col_itemselfg }, - { "col_itemselbg", STRING, &col_itemselbg }, - { "col_inputbg", STRING, &col_inputbg }, - { "col_inputfg", STRING, &col_inputfg }, - { "col_menubgcolor", STRING, &col_menubgcolor }, - { "col_numfgcolor", STRING, &col_numfgcolor }, - { "col_numbgcolor", STRING, &col_numbgcolor }, - { "col_modefgcolor", STRING, &col_modefgcolor }, - { "col_modebgcolor", STRING, &col_modebgcolor }, - { "col_normhlfgcolor", STRING, &col_normhlfgcolor }, - { "col_normhlbgcolor", STRING, &col_normhlbgcolor }, - { "col_selhlfgcolor", STRING, &col_selhlfgcolor }, - { "col_selhlbgcolor", STRING, &col_selhlbgcolor }, - { "col_bordercolor", STRING, &col_bordercolor }, - { "col_promptfg", STRING, &col_promptfg }, - { "col_promptbg", STRING, &col_promptbg }, + { "font", STRING, &font }, + { "col_caretfgcolor", STRING, &col_caretfgcolor }, + { "col_larrowfg", STRING, &col_larrowfg }, + { "col_rarrowfg", STRING, &col_rarrowfg }, + { "col_larrowbg", STRING, &col_larrowbg }, + { "col_rarrowbg", STRING, &col_rarrowbg }, + { "col_itemnormfg", STRING, &col_itemnormfg }, + { "col_itemnormbg", STRING, &col_itemnormbg }, + { "col_itemselfg", STRING, &col_itemselfg }, + { "col_itemselbg", STRING, &col_itemselbg }, + { "col_inputbg", STRING, &col_inputbg }, + { "col_inputfg", STRING, &col_inputfg }, + { "col_menubgcolor", STRING, &col_menubgcolor }, + { "col_numfgcolor", STRING, &col_numfgcolor }, + { "col_numbgcolor", STRING, &col_numbgcolor }, + { "col_modefgcolor", STRING, &col_modefgcolor }, + { "col_modebgcolor", STRING, &col_modebgcolor }, + { "col_normhlfgcolor", STRING, &col_normhlfgcolor }, + { "col_normhlbgcolor", STRING, &col_normhlbgcolor }, + { "col_selhlfgcolor", STRING, &col_selhlfgcolor }, + { "col_selhlbgcolor", STRING, &col_selhlbgcolor }, + { "col_bordercolor", STRING, &col_bordercolor }, + { "col_promptfg", STRING, &col_promptfg }, + { "col_promptbg", STRING, &col_promptbg }, /* Pywal support */ - { "color10", STRING, &col_caretfgcolor }, - { "color4", STRING, &col_larrowfg }, - { "color4", STRING, &col_rarrowfg }, - { "color10", STRING, &col_itemnormfg }, - { "color10", STRING, &col_inputfg }, - { "color0", STRING, &col_itemnormbg }, - { "color0", STRING, &col_menubgcolor }, - { "color0", STRING, &col_larrowbg }, - { "color0", STRING, &col_rarrowbg }, - { "color0", STRING, &col_itemselfg }, - { "color0", STRING, &col_inputbg }, - { "color12", STRING, &col_promptbg }, - { "color0", STRING, &col_promptfg }, - { "color6", STRING, &col_itemselbg }, - { "color6", STRING, &col_bordercolor }, - { "color0", STRING, &col_numfgcolor }, - { "color5", STRING, &col_numbgcolor }, - { "color0", STRING, &col_modefgcolor }, - { "color7", STRING, &col_modebgcolor }, - { "color2", STRING, &col_normhlbgcolor }, - { "color3", STRING, &col_selhlbgcolor }, - { "color0", STRING, &col_normhlfgcolor }, - { "color0", STRING, &col_selhlfgcolor }, + { "color10", STRING, &col_caretfgcolor }, + { "color4", STRING, &col_larrowfg }, + { "color4", STRING, &col_rarrowfg }, + { "color10", STRING, &col_itemnormfg }, + { "color10", STRING, &col_inputfg }, + { "color0", STRING, &col_itemnormbg }, + { "color0", STRING, &col_menubgcolor }, + { "color0", STRING, &col_larrowbg }, + { "color0", STRING, &col_rarrowbg }, + { "color0", STRING, &col_itemselfg }, + { "color0", STRING, &col_inputbg }, + { "color12", STRING, &col_promptbg }, + { "color0", STRING, &col_promptfg }, + { "color6", STRING, &col_itemselbg }, + { "color6", STRING, &col_bordercolor }, + { "color0", STRING, &col_numfgcolor }, + { "color5", STRING, &col_numbgcolor }, + { "color0", STRING, &col_modefgcolor }, + { "color7", STRING, &col_modebgcolor }, + { "color2", STRING, &col_normhlbgcolor }, + { "color3", STRING, &col_selhlbgcolor }, + { "color0", STRING, &col_normhlfgcolor }, + { "color0", STRING, &col_selhlfgcolor }, /* sgr colors */ - { "col_sgrcolor0", STRING, &col_sgrcolor0 }, - { "col_sgrcolor1", STRING, &col_sgrcolor1 }, - { "col_sgrcolor2", STRING, &col_sgrcolor2 }, - { "col_sgrcolor3", STRING, &col_sgrcolor3 }, - { "col_sgrcolor4", STRING, &col_sgrcolor4 }, - { "col_sgrcolor5", STRING, &col_sgrcolor5 }, - { "col_sgrcolor6", STRING, &col_sgrcolor6 }, - { "col_sgrcolor7", STRING, &col_sgrcolor7 }, - { "col_sgrcolor8", STRING, &col_sgrcolor8 }, - { "col_sgrcolor9", STRING, &col_sgrcolor9 }, - { "col_sgrcolor10", STRING, &col_sgrcolor10 }, - { "col_sgrcolor11", STRING, &col_sgrcolor11 }, - { "col_sgrcolor12", STRING, &col_sgrcolor12 }, - { "col_sgrcolor13", STRING, &col_sgrcolor13 }, - { "col_sgrcolor14", STRING, &col_sgrcolor14 }, - { "col_sgrcolor15", STRING, &col_sgrcolor15 }, + { "col_sgrcolor0", STRING, &col_sgrcolor0 }, + { "col_sgrcolor1", STRING, &col_sgrcolor1 }, + { "col_sgrcolor2", STRING, &col_sgrcolor2 }, + { "col_sgrcolor3", STRING, &col_sgrcolor3 }, + { "col_sgrcolor4", STRING, &col_sgrcolor4 }, + { "col_sgrcolor5", STRING, &col_sgrcolor5 }, + { "col_sgrcolor6", STRING, &col_sgrcolor6 }, + { "col_sgrcolor7", STRING, &col_sgrcolor7 }, + { "col_sgrcolor8", STRING, &col_sgrcolor8 }, + { "col_sgrcolor9", STRING, &col_sgrcolor9 }, + { "col_sgrcolor10", STRING, &col_sgrcolor10 }, + { "col_sgrcolor11", STRING, &col_sgrcolor11 }, + { "col_sgrcolor12", STRING, &col_sgrcolor12 }, + { "col_sgrcolor13", STRING, &col_sgrcolor13 }, + { "col_sgrcolor14", STRING, &col_sgrcolor14 }, + { "col_sgrcolor15", STRING, &col_sgrcolor15 }, /* sgr colors */ - { "color0", STRING, &col_sgrcolor0 }, - { "color1", STRING, &col_sgrcolor1 }, - { "color2", STRING, &col_sgrcolor2 }, - { "color3", STRING, &col_sgrcolor3 }, - { "color4", STRING, &col_sgrcolor4 }, - { "color5", STRING, &col_sgrcolor5 }, - { "color6", STRING, &col_sgrcolor6 }, - { "color7", STRING, &col_sgrcolor7 }, - { "color8", STRING, &col_sgrcolor8 }, - { "color9", STRING, &col_sgrcolor9 }, - { "color10", STRING, &col_sgrcolor10 }, - { "color11", STRING, &col_sgrcolor11 }, - { "color12", STRING, &col_sgrcolor12 }, - { "color13", STRING, &col_sgrcolor13 }, - { "color14", STRING, &col_sgrcolor14 }, - { "color15", STRING, &col_sgrcolor15 }, + { "color0", STRING, &col_sgrcolor0 }, + { "color1", STRING, &col_sgrcolor1 }, + { "color2", STRING, &col_sgrcolor2 }, + { "color3", STRING, &col_sgrcolor3 }, + { "color4", STRING, &col_sgrcolor4 }, + { "color5", STRING, &col_sgrcolor5 }, + { "color6", STRING, &col_sgrcolor6 }, + { "color7", STRING, &col_sgrcolor7 }, + { "color8", STRING, &col_sgrcolor8 }, + { "color9", STRING, &col_sgrcolor9 }, + { "color10", STRING, &col_sgrcolor10 }, + { "color11", STRING, &col_sgrcolor11 }, + { "color12", STRING, &col_sgrcolor12 }, + { "color13", STRING, &col_sgrcolor13 }, + { "color14", STRING, &col_sgrcolor14 }, + { "color15", STRING, &col_sgrcolor15 }, - { "menuposition", INTEGER, &menuposition }, - { "menupaddingv", INTEGER, &menupaddingv }, - { "menupaddingh", INTEGER, &menupaddingh }, + { "menuposition", INTEGER, &menuposition }, + { "menupaddingv", INTEGER, &menupaddingv }, + { "menupaddingh", INTEGER, &menupaddingh }, - { "accuratewidth", INTEGER, &accuratewidth }, - { "alpha", INTEGER, &alpha }, - { "type", INTEGER, &type }, - { "preselected", INTEGER, &preselected }, - { "colorprompt", INTEGER, &colorprompt }, - { "prompt", STRING, &prompt }, - { "class", STRING, &class }, - { "leftarrow", STRING, &leftarrow }, - { "rightarrow", STRING, &rightarrow }, - { "normtext", STRING, &normtext }, - { "instext", STRING, &instext }, - { "bordercentered", INTEGER, &bordercentered }, - { "borderwidth", INTEGER, &borderwidth }, - { "lines", INTEGER, &lines }, - { "lineheight", INTEGER, &lineheight }, - { "columns", INTEGER, &columns }, - { "maxhist", INTEGER, &maxhist }, - { "hidematchcount", INTEGER, &hidematchcount }, - { "hidehighlight", INTEGER, &hidehighlight }, - { "hidemode", INTEGER, &hidemode }, - { "histnodup", INTEGER, &histnodup }, - { "casesensitive", INTEGER, &casesensitive }, - { "imagesize", INTEGER, &imagesize }, - { "imagegaps", INTEGER, &imagegaps }, - { "imageposition", INTEGER, &imageposition }, - { "generatecache", INTEGER, &generatecache }, - { "mode", INTEGER, &mode }, + { "accuratewidth", INTEGER, &accuratewidth }, + { "alpha", INTEGER, &alpha }, + { "type", INTEGER, &type }, + { "preselected", INTEGER, &preselected }, + { "colorprompt", INTEGER, &colorprompt }, + { "prompt", STRING, &prompt }, + { "class", STRING, &class }, + { "leftarrow", STRING, &leftarrow }, + { "rightarrow", STRING, &rightarrow }, + { "normtext", STRING, &normtext }, + { "instext", STRING, &instext }, + { "bordercentered", INTEGER, &bordercentered }, + { "borderwidth", INTEGER, &borderwidth }, + { "lines", INTEGER, &lines }, + { "lineheight", INTEGER, &lineheight }, + { "columns", INTEGER, &columns }, + { "maxhist", INTEGER, &maxhist }, + { "hidematchcount", INTEGER, &hidematchcount }, + { "hidehighlight", INTEGER, &hidehighlight }, + { "hidemode", INTEGER, &hidemode }, + { "histnodup", INTEGER, &histnodup }, + { "casesensitive", INTEGER, &casesensitive }, + { "imagesize", INTEGER, &imagesize }, + { "imagegaps", INTEGER, &imagegaps }, + { "imageposition", INTEGER, &imageposition }, + { "generatecache", INTEGER, &generatecache }, + { "mode", INTEGER, &mode }, + { "pango_item", INTEGER, &pango_item }, + { "pango_prompt", INTEGER, &pango_prompt }, + { "pango_input", INTEGER, &pango_input }, + { "pango_leftarrow", INTEGER, &pango_leftarrow }, + { "pango_rightarrow", INTEGER, &pango_rightarrow }, + { "pango_numbers", INTEGER, &pango_numbers }, + { "pango_mode", INTEGER, &pango_mode }, + { "pango_password", INTEGER, &pango_password }, };