| dmenu-emoji-highlight-5.0.diff - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| dmenu-emoji-highlight-5.0.diff (9148B) | |
| --- | |
| 1 diff --git a/config.def.h b/config.def.h | |
| 2 index 1edb647..ed3b175 100644 | |
| 3 --- a/config.def.h | |
| 4 +++ b/config.def.h | |
| 5 @@ -4,18 +4,33 @@ | |
| 6 static int topbar = 1; /* -b option; if 0, dmenu … | |
| 7 /* -fn option overrides fonts[0]; default X11 font or font set */ | |
| 8 static const char *fonts[] = { | |
| 9 - "monospace:size=10" | |
| 10 + "monospace:size=10", | |
| 11 + "FiraCode Nerd Font:size=12", | |
| 12 }; | |
| 13 + | |
| 14 static const char *prompt = NULL; /* -p option; prompt to th… | |
| 15 -static const char *colors[SchemeLast][2] = { | |
| 16 - /* fg bg */ | |
| 17 - [SchemeNorm] = { "#bbbbbb", "#222222" }, | |
| 18 - [SchemeSel] = { "#eeeeee", "#005577" }, | |
| 19 - [SchemeOut] = { "#000000", "#00ffff" }, | |
| 20 +static const char *colors[SchemeLast][10] = { | |
| 21 + /* fg bg */ | |
| 22 + [SchemeNorm] = { "#bbbbbb", "#222222", "#222222" }, | |
| 23 + [SchemeSel] = { "#eeeeee", "#005577", "#005577" }, | |
| 24 + [SchemeOut] = { "#000000", "#00ffff", "#00ffff" }, | |
| 25 + [SchemeHighlight] = {"#f1fa8c", "#596377", "#3E485B"}, | |
| 26 + [SchemeHover] = {"#ffffff", "#353D4B", "#3E485B"}, | |
| 27 + [SchemeGreen] = {"#ffffff", "#52E067", "#41b252"}, | |
| 28 + [SchemeRed] = {"#ffffff", "#e05252", "#c24343"}, | |
| 29 + [SchemeYellow] = {"#ffffff", "#e0c452", "#bca33f"}, | |
| 30 + [SchemeBlue] = {"#ffffff", "#5280e0", "#3a62b3"}, | |
| 31 + [SchemePurple] = {"#ffffff", "#9952e0", "#7439b0"}, | |
| 32 }; | |
| 33 /* -l option; if nonzero, dmenu uses vertical list with given number of… | |
| 34 static unsigned int lines = 0; | |
| 35 | |
| 36 +static unsigned int lineheight = 0; /* -h option; minimum height of a m… | |
| 37 +static unsigned int min_lineheight = 8; | |
| 38 +static int sely = 0; | |
| 39 +static int commented = 0; | |
| 40 +static int animated = 0; | |
| 41 + | |
| 42 /* | |
| 43 * Characters not considered part of a word while deleting words | |
| 44 * for example: " /?\"&[]" | |
| 45 diff --git a/dmenu.c b/dmenu.c | |
| 46 index 65f25ce..a558fcb 100644 | |
| 47 --- a/dmenu.c | |
| 48 +++ b/dmenu.c | |
| 49 @@ -26,7 +26,20 @@ | |
| 50 #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) | |
| 51 | |
| 52 /* enums */ | |
| 53 -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes… | |
| 54 +enum { | |
| 55 + SchemeNorm, | |
| 56 + SchemeFade, | |
| 57 + SchemeHighlight, | |
| 58 + SchemeHover, | |
| 59 + SchemeSel, | |
| 60 + SchemeOut, | |
| 61 + SchemeGreen, | |
| 62 + SchemeYellow, | |
| 63 + SchemeBlue, | |
| 64 + SchemePurple, | |
| 65 + SchemeRed, | |
| 66 + SchemeLast | |
| 67 +}; /* color schemes */ | |
| 68 | |
| 69 struct item { | |
| 70 char *text; | |
| 71 @@ -37,6 +50,9 @@ struct item { | |
| 72 static char text[BUFSIZ] = ""; | |
| 73 static char *embed; | |
| 74 static int bh, mw, mh; | |
| 75 +static int dmx = 0; /* put dmenu at this x offset */ | |
| 76 +static int dmy = 0; /* put dmenu at this y offset (measured from the bo… | |
| 77 +static unsigned int dmw = 0; /* make dmenu this wide */ | |
| 78 static int inputw = 0, promptw; | |
| 79 static int lrpad; /* sum of left and right padding */ | |
| 80 static size_t cursor; | |
| 81 @@ -114,16 +130,117 @@ cistrstr(const char *s, const char *sub) | |
| 82 } | |
| 83 | |
| 84 static int | |
| 85 -drawitem(struct item *item, int x, int y, int w) | |
| 86 -{ | |
| 87 - if (item == sel) | |
| 88 - drw_setscheme(drw, scheme[SchemeSel]); | |
| 89 - else if (item->out) | |
| 90 - drw_setscheme(drw, scheme[SchemeOut]); | |
| 91 - else | |
| 92 - drw_setscheme(drw, scheme[SchemeNorm]); | |
| 93 - | |
| 94 - return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); | |
| 95 +drawitem(struct item *item, int x, int y, int w) { | |
| 96 + int iscomment = 0; | |
| 97 + if (item->text[0] == '>') { | |
| 98 + if (item->text[1] == '>') { | |
| 99 + iscomment = 3; | |
| 100 + switch (item->text[2]) { | |
| 101 + case 'r': | |
| 102 + drw_setscheme(drw, scheme[SchemeRed]); | |
| 103 + break; | |
| 104 + case 'g': | |
| 105 + drw_setscheme(drw, scheme[SchemeGreen]); | |
| 106 + break; | |
| 107 + case 'y': | |
| 108 + drw_setscheme(drw, scheme[SchemeYellow]); | |
| 109 + break; | |
| 110 + case 'b': | |
| 111 + drw_setscheme(drw, scheme[SchemeBlue]); | |
| 112 + break; | |
| 113 + case 'p': | |
| 114 + drw_setscheme(drw, scheme[SchemePurple]); | |
| 115 + break; | |
| 116 + case 'h': | |
| 117 + drw_setscheme(drw, scheme[SchemeHighlight]); | |
| 118 + break; | |
| 119 + case 's': | |
| 120 + drw_setscheme(drw, scheme[SchemeSel]); | |
| 121 + break; | |
| 122 + default: | |
| 123 + iscomment = 1; | |
| 124 + drw_setscheme(drw, scheme[SchemeNorm]); | |
| 125 + break; | |
| 126 + } | |
| 127 + } else { | |
| 128 + drw_setscheme(drw, scheme[SchemeNorm]); | |
| 129 + iscomment = 1; | |
| 130 + } | |
| 131 + | |
| 132 + } else if (item->text[0] == ':') { | |
| 133 + iscomment = 2; | |
| 134 + if (item == sel) { | |
| 135 + switch (item->text[1]) { | |
| 136 + case 'r': | |
| 137 + drw_setscheme(drw, scheme[SchemeRed]); | |
| 138 + break; | |
| 139 + case 'g': | |
| 140 + drw_setscheme(drw, scheme[SchemeGreen]); | |
| 141 + break; | |
| 142 + case 'y': | |
| 143 + drw_setscheme(drw, scheme[SchemeYellow]); | |
| 144 + break; | |
| 145 + case 'b': | |
| 146 + drw_setscheme(drw, scheme[SchemeBlue]); | |
| 147 + break; | |
| 148 + case 'p': | |
| 149 + drw_setscheme(drw, scheme[SchemePurple]); | |
| 150 + break; | |
| 151 + case 'h': | |
| 152 + drw_setscheme(drw, scheme[SchemeHighlight]); | |
| 153 + break; | |
| 154 + case 's': | |
| 155 + drw_setscheme(drw, scheme[SchemeSel]); | |
| 156 + break; | |
| 157 + default: | |
| 158 + drw_setscheme(drw, scheme[SchemeSel]); | |
| 159 + iscomment = 0; | |
| 160 + break; | |
| 161 + } | |
| 162 + } else { | |
| 163 + drw_setscheme(drw, scheme[SchemeNorm]); | |
| 164 + } | |
| 165 + } else { | |
| 166 + if (item == sel) | |
| 167 + drw_setscheme(drw, scheme[SchemeSel]); | |
| 168 + else if (item->out) | |
| 169 + drw_setscheme(drw, scheme[SchemeOut]); | |
| 170 + else | |
| 171 + drw_setscheme(drw, scheme[SchemeNorm]); | |
| 172 + } | |
| 173 + | |
| 174 + int temppadding; | |
| 175 + temppadding = 0; | |
| 176 + if (iscomment == 2) { | |
| 177 + if (item->text[2] == ' ') { | |
| 178 + temppadding = drw->fonts->h * 3; | |
| 179 + animated = 1; | |
| 180 + char dest[1000]; | |
| 181 + strcpy(dest, item->text); | |
| 182 + dest[6] = '\0'; | |
| 183 + drw_text(drw, x, y, temppadding, lineheight, temppadding / 2.6, d… | |
| 184 + iscomment = 6; | |
| 185 + drw_setscheme(drw, sel == item ? scheme[SchemeHover] : scheme[Sch… | |
| 186 + } | |
| 187 + } | |
| 188 + | |
| 189 + char *output; | |
| 190 + if (commented) { | |
| 191 + static char onestr[2]; | |
| 192 + onestr[0] = item->text[0]; | |
| 193 + onestr[1] = '\0'; | |
| 194 + output = onestr; | |
| 195 + } else { | |
| 196 + output = item->text; | |
| 197 + } | |
| 198 + | |
| 199 + if (item == sel) | |
| 200 + sely = y; | |
| 201 + return drw_text( | |
| 202 + drw, x + ((iscomment == 6) ? temppadding : 0), y, | |
| 203 + commented ? bh : (w - ((iscomment == 6) ? temppadding : 0)), bh, | |
| 204 + commented ? (bh - drw_fontset_getwidth(drw, (output))) / 2 : lrpa… | |
| 205 + output + iscomment, 0); | |
| 206 } | |
| 207 | |
| 208 static void | |
| 209 @@ -131,7 +248,7 @@ drawmenu(void) | |
| 210 { | |
| 211 unsigned int curpos; | |
| 212 struct item *item; | |
| 213 - int x = 0, y = 0, w; | |
| 214 + int x = 0, y = 0, fh = drw->fonts->h, w; | |
| 215 | |
| 216 drw_setscheme(drw, scheme[SchemeNorm]); | |
| 217 drw_rect(drw, 0, 0, mw, mh, 1, 1); | |
| 218 @@ -148,7 +265,7 @@ drawmenu(void) | |
| 219 curpos = TEXTW(text) - TEXTW(&text[cursor]); | |
| 220 if ((curpos += lrpad / 2 - 1) < w) { | |
| 221 drw_setscheme(drw, scheme[SchemeNorm]); | |
| 222 - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); | |
| 223 + drw_rect(drw, x + curpos, 2 + (bh - fh) / 2, 2, fh - 4,… | |
| 224 } | |
| 225 | |
| 226 if (lines > 0) { | |
| 227 @@ -609,6 +726,7 @@ setup(void) | |
| 228 | |
| 229 /* calculate menu geometry */ | |
| 230 bh = drw->fonts->h + 2; | |
| 231 + bh = MAX(bh,lineheight); /* make a menu line AT LEAST 'lineh… | |
| 232 lines = MAX(lines, 0); | |
| 233 mh = (lines + 1) * bh; | |
| 234 #ifdef XINERAMA | |
| 235 @@ -637,9 +755,9 @@ setup(void) | |
| 236 if (INTERSECT(x, y, 1, 1, info[i])) | |
| 237 break; | |
| 238 | |
| 239 - x = info[i].x_org; | |
| 240 - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); | |
| 241 - mw = info[i].width; | |
| 242 + x = info[i].x_org + dmx; | |
| 243 + y = info[i].y_org + (topbar ? dmy : info[i].height - mh… | |
| 244 + mw = (dmw>0 ? dmw : info[i].width); | |
| 245 XFree(info); | |
| 246 } else | |
| 247 #endif | |
| 248 @@ -647,9 +765,9 @@ setup(void) | |
| 249 if (!XGetWindowAttributes(dpy, parentwin, &wa)) | |
| 250 die("could not get embedding window attributes:… | |
| 251 parentwin); | |
| 252 - x = 0; | |
| 253 - y = topbar ? 0 : wa.height - mh; | |
| 254 - mw = wa.width; | |
| 255 + x = dmx; | |
| 256 + y = topbar ? dmy : wa.height - mh - dmy; | |
| 257 + mw = (dmw>0 ? dmw : wa.width); | |
| 258 } | |
| 259 promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; | |
| 260 inputw = MIN(inputw, mw/3); | |
| 261 @@ -689,7 +807,8 @@ setup(void) | |
| 262 static void | |
| 263 usage(void) | |
| 264 { | |
| 265 - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [… | |
| 266 + fputs("usage: dmenu [-bfiv] [-l lines] [-h height] [-p prompt] … | |
| 267 + " [-x xoffset] [-y yoffset] [-z width]\n" | |
| 268 " [-nb color] [-nf color] [-sb color] [-sf co… | |
| 269 exit(1); | |
| 270 } | |
| 271 @@ -717,6 +836,16 @@ main(int argc, char *argv[]) | |
| 272 /* these options take one argument */ | |
| 273 else if (!strcmp(argv[i], "-l")) /* number of lines i… | |
| 274 lines = atoi(argv[++i]); | |
| 275 + else if (!strcmp(argv[i], "-x")) /* window x offset */ | |
| 276 + dmx = atoi(argv[++i]); | |
| 277 + else if (!strcmp(argv[i], "-y")) /* window y offset (… | |
| 278 + dmy = atoi(argv[++i]); | |
| 279 + else if (!strcmp(argv[i], "-z")) /* make dmenu this w… | |
| 280 + dmw = atoi(argv[++i]); | |
| 281 + else if (!strcmp(argv[i], "-h")) { /* minimum height of one men… | |
| 282 + lineheight = atoi(argv[++i]); | |
| 283 + lineheight = MAX(lineheight, min_lineheight); | |
| 284 + } | |
| 285 else if (!strcmp(argv[i], "-m")) | |
| 286 mon = atoi(argv[++i]); | |
| 287 else if (!strcmp(argv[i], "-p")) /* adds prompt to le… | |
| 288 @@ -752,6 +881,9 @@ main(int argc, char *argv[]) | |
| 289 die("no fonts could be loaded."); | |
| 290 lrpad = drw->fonts->h; | |
| 291 | |
| 292 + if (lineheight == -1) | |
| 293 + lineheight = drw->fonts->h * 2.5; | |
| 294 + | |
| 295 #ifdef __OpenBSD__ | |
| 296 if (pledge("stdio rpath", NULL) == -1) | |
| 297 die("pledge"); |