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 appears at bottom     */
      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 the left of input field */
     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 lines */
     34  static unsigned int lines      = 0;
     35  
     36 +static unsigned int lineheight = 0; /* -h option; minimum height of a menu line     */
     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 bottom if topbar is 0) */
     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, dest + 3, 0);
    184 +      iscomment = 6;
    185 +      drw_setscheme(drw, sel == item ? scheme[SchemeHover] : scheme[SchemeNorm]);
    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 : lrpad / 2,
    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, 1, 0);
    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 'lineheight' tall */
    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 - dmy);
    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: 0x%lx",
    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] [-m monitor]\n"
    266 +	fputs("usage: dmenu [-bfiv] [-l lines] [-h height] [-p prompt] [-fn font] [-m monitor]\n"
    267 +	      "             [-x xoffset] [-y yoffset] [-z width]\n"
    268  	      "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
    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 in vertical list */
    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 (from bottom up if -b) */
    278 +			dmy = atoi(argv[++i]);
    279 +		else if (!strcmp(argv[i], "-z"))   /* make dmenu this wide */
    280 +			dmw = atoi(argv[++i]);
    281 +        else if (!strcmp(argv[i], "-h")) { /* minimum height of one menu line */
    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 left of input field */
    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");