Compare commits
10
Commits
59936c7d97
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
129c6b712b | ||
|
|
7175c4880b | ||
|
|
8b48986f4c | ||
|
|
77f96d704b | ||
|
|
d893c63cdd | ||
|
|
b1e217b29a | ||
|
|
86f0b5119e | ||
|
|
dd3d348ae8 | ||
|
|
545031a076 | ||
|
|
475d8093cb |
@@ -1,5 +1,5 @@
|
|||||||
# dmenu version
|
# dmenu version
|
||||||
VERSION = 5.3
|
VERSION = 5.4
|
||||||
|
|
||||||
# paths
|
# paths
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ dmenu \- dynamic menu
|
|||||||
.IR color ]
|
.IR color ]
|
||||||
.RB [ \-sf
|
.RB [ \-sf
|
||||||
.IR color ]
|
.IR color ]
|
||||||
|
.RB [ \-ob
|
||||||
|
.IR color ]
|
||||||
|
.RB [ \-of
|
||||||
|
.IR color ]
|
||||||
.RB [ \-w
|
.RB [ \-w
|
||||||
.IR windowid ]
|
.IR windowid ]
|
||||||
.P
|
.P
|
||||||
@@ -75,6 +79,12 @@ defines the selected background color.
|
|||||||
.BI \-sf " color"
|
.BI \-sf " color"
|
||||||
defines the selected foreground color.
|
defines the selected foreground color.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \-ob " color"
|
||||||
|
defines the outline background color (for multiple selection).
|
||||||
|
.TP
|
||||||
|
.BI \-of " color"
|
||||||
|
defines the outline foreground color (for multiple selection).
|
||||||
|
.TP
|
||||||
.B \-v
|
.B \-v
|
||||||
prints version information to stdout, then exits.
|
prints version information to stdout, then exits.
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
@@ -100,9 +100,9 @@ cleanup(void)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
XUngrabKey(dpy, AnyKey, AnyModifier, root);
|
XUngrabKeyboard(dpy, CurrentTime);
|
||||||
for (i = 0; i < SchemeLast; i++)
|
for (i = 0; i < SchemeLast; i++)
|
||||||
free(scheme[i]);
|
drw_scm_free(drw, scheme[i], 2);
|
||||||
for (i = 0; items && items[i].text; ++i)
|
for (i = 0; items && items[i].text; ++i)
|
||||||
free(items[i].text);
|
free(items[i].text);
|
||||||
free(items);
|
free(items);
|
||||||
@@ -342,34 +342,38 @@ keypress(XKeyEvent *ev)
|
|||||||
if (ev->state & ControlMask) {
|
if (ev->state & ControlMask) {
|
||||||
switch(ksym) {
|
switch(ksym) {
|
||||||
case XK_a: ksym = XK_Home; break;
|
case XK_a: ksym = XK_Home; break;
|
||||||
|
case XK_h:
|
||||||
case XK_b: ksym = XK_Left; break;
|
case XK_b: ksym = XK_Left; break;
|
||||||
case XK_c: ksym = XK_Escape; break;
|
case XK_c: ksym = XK_Escape; break;
|
||||||
case XK_d: ksym = XK_Delete; break;
|
case XK_d: ksym = XK_Delete; break;
|
||||||
case XK_e: ksym = XK_End; break;
|
case XK_e: ksym = XK_End; break;
|
||||||
|
case XK_l:
|
||||||
case XK_f: ksym = XK_Right; break;
|
case XK_f: ksym = XK_Right; break;
|
||||||
case XK_g: ksym = XK_Escape; break;
|
case XK_g: ksym = XK_Escape; break;
|
||||||
case XK_h: ksym = XK_BackSpace; break;
|
// case XK_h: ksym = XK_BackSpace; break;
|
||||||
case XK_i: ksym = XK_Tab; break;
|
case XK_i: ksym = XK_Tab; break;
|
||||||
case XK_j: /* fallthrough */
|
|
||||||
case XK_J: /* fallthrough */
|
|
||||||
case XK_m: /* fallthrough */
|
case XK_m: /* fallthrough */
|
||||||
case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break;
|
case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break;
|
||||||
|
case XK_j: /* fallthrough */
|
||||||
|
case XK_J: /* fallthrough */
|
||||||
case XK_n: ksym = XK_Down; break;
|
case XK_n: ksym = XK_Down; break;
|
||||||
|
case XK_k:
|
||||||
case XK_p: ksym = XK_Up; break;
|
case XK_p: ksym = XK_Up; break;
|
||||||
|
|
||||||
case XK_k: /* delete right */
|
case XK_w:
|
||||||
|
// case XK_k: /* delete right */
|
||||||
text[cursor] = '\0';
|
text[cursor] = '\0';
|
||||||
match();
|
match();
|
||||||
break;
|
break;
|
||||||
case XK_u: /* delete left */
|
case XK_u: /* delete left */
|
||||||
insert(NULL, 0 - cursor);
|
insert(NULL, 0 - cursor);
|
||||||
break;
|
break;
|
||||||
case XK_w: /* delete word */
|
// case XK_w: /* delete word */
|
||||||
while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]))
|
// while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]))
|
||||||
insert(NULL, nextrune(-1) - cursor);
|
// insert(NULL, nextrune(-1) - cursor);
|
||||||
while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]))
|
// while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]))
|
||||||
insert(NULL, nextrune(-1) - cursor);
|
// insert(NULL, nextrune(-1) - cursor);
|
||||||
break;
|
// break;
|
||||||
case XK_y: /* paste selection */
|
case XK_y: /* paste selection */
|
||||||
case XK_Y:
|
case XK_Y:
|
||||||
XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
|
XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
|
||||||
@@ -394,18 +398,36 @@ keypress(XKeyEvent *ev)
|
|||||||
}
|
}
|
||||||
} else if (ev->state & Mod1Mask) {
|
} else if (ev->state & Mod1Mask) {
|
||||||
switch(ksym) {
|
switch(ksym) {
|
||||||
|
case XK_h:
|
||||||
case XK_b:
|
case XK_b:
|
||||||
movewordedge(-1);
|
movewordedge(-1);
|
||||||
goto draw;
|
goto draw;
|
||||||
|
case XK_l:
|
||||||
case XK_f:
|
case XK_f:
|
||||||
movewordedge(+1);
|
movewordedge(+1);
|
||||||
goto draw;
|
goto draw;
|
||||||
case XK_g: ksym = XK_Home; break;
|
case XK_g: ksym = XK_Home; break;
|
||||||
case XK_G: ksym = XK_End; break;
|
case XK_G: ksym = XK_End; break;
|
||||||
case XK_h: ksym = XK_Up; break;
|
// case XK_h: ksym = XK_Up; break;
|
||||||
case XK_j: ksym = XK_Next; break;
|
case XK_j: ksym = XK_Next; break;
|
||||||
case XK_k: ksym = XK_Prior; break;
|
case XK_k: ksym = XK_Prior; break;
|
||||||
case XK_l: ksym = XK_Down; break;
|
// case XK_l: ksym = XK_Down; break;
|
||||||
|
case XK_BackSpace:
|
||||||
|
while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]))
|
||||||
|
insert(NULL, nextrune(-1) - cursor);
|
||||||
|
while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]))
|
||||||
|
insert(NULL, nextrune(-1) - cursor);
|
||||||
|
goto draw;
|
||||||
|
case XK_d: // forward delete word
|
||||||
|
while (text[cursor] != '\0' && strchr(worddelimiters, text[cursor])) { // delete space
|
||||||
|
cursor = nextrune(+1);
|
||||||
|
insert(NULL, nextrune(-1) - cursor);
|
||||||
|
}
|
||||||
|
while (text[cursor] != '\0' && !strchr(worddelimiters, text[cursor])) { // delete word
|
||||||
|
cursor = nextrune(+1);
|
||||||
|
insert(NULL, nextrune(-1) - cursor);
|
||||||
|
}
|
||||||
|
goto draw;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -689,7 +711,6 @@ setup(void)
|
|||||||
CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
|
CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
|
||||||
XSetClassHint(dpy, win, &ch);
|
XSetClassHint(dpy, win, &ch);
|
||||||
|
|
||||||
|
|
||||||
/* input methods */
|
/* input methods */
|
||||||
if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL)
|
if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL)
|
||||||
die("XOpenIM failed: could not open input device");
|
die("XOpenIM failed: could not open input device");
|
||||||
@@ -756,6 +777,10 @@ main(int argc, char *argv[])
|
|||||||
colors[SchemeSel][ColBg] = argv[++i];
|
colors[SchemeSel][ColBg] = argv[++i];
|
||||||
else if (!strcmp(argv[i], "-sf")) /* selected foreground color */
|
else if (!strcmp(argv[i], "-sf")) /* selected foreground color */
|
||||||
colors[SchemeSel][ColFg] = argv[++i];
|
colors[SchemeSel][ColFg] = argv[++i];
|
||||||
|
else if (!strcmp(argv[i], "-ob")) /* outline background color */
|
||||||
|
colors[SchemeOut][ColBg] = argv[++i];
|
||||||
|
else if (!strcmp(argv[i], "-of")) /* outline foreground color */
|
||||||
|
colors[SchemeOut][ColFg] = argv[++i];
|
||||||
else if (!strcmp(argv[i], "-w")) /* embedding window id */
|
else if (!strcmp(argv[i], "-w")) /* embedding window id */
|
||||||
embed = argv[++i];
|
embed = argv[++i];
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -178,8 +178,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
|
|||||||
die("error, cannot allocate color '%s'", clrname);
|
die("error, cannot allocate color '%s'", clrname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wrapper to create color schemes. The caller has to call free(3) on the
|
/* Create color schemes. */
|
||||||
* returned color scheme when done using it. */
|
|
||||||
Clr *
|
Clr *
|
||||||
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
||||||
{
|
{
|
||||||
@@ -187,7 +186,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
|||||||
Clr *ret;
|
Clr *ret;
|
||||||
|
|
||||||
/* need at least two colors for a scheme */
|
/* need at least two colors for a scheme */
|
||||||
if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
|
if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(Clr))))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (i = 0; i < clrcount; i++)
|
for (i = 0; i < clrcount; i++)
|
||||||
@@ -195,6 +194,30 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_clr_free(Drw *drw, Clr *c)
|
||||||
|
{
|
||||||
|
if (!drw || !c)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* c is typedef XftColor Clr */
|
||||||
|
XftColorFree(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
|
||||||
|
DefaultColormap(drw->dpy, drw->screen), c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_scm_free(Drw *drw, Clr *scm, size_t clrcount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (!drw || !scm)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < clrcount; i++)
|
||||||
|
drw_clr_free(drw, &scm[i]);
|
||||||
|
free(scm);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
drw_setfontset(Drw *drw, Fnt *set)
|
drw_setfontset(Drw *drw, Fnt *set)
|
||||||
{
|
{
|
||||||
@@ -248,6 +271,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
|
|||||||
} else {
|
} else {
|
||||||
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
|
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
|
||||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||||
|
if (w < lpad)
|
||||||
|
return x + w;
|
||||||
d = XftDrawCreate(drw->dpy, drw->drawable,
|
d = XftDrawCreate(drw->dpy, drw->drawable,
|
||||||
DefaultVisual(drw->dpy, drw->screen),
|
DefaultVisual(drw->dpy, drw->screen),
|
||||||
DefaultColormap(drw->dpy, drw->screen));
|
DefaultColormap(drw->dpy, drw->screen));
|
||||||
@@ -258,10 +283,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
|
|||||||
usedfont = drw->fonts;
|
usedfont = drw->fonts;
|
||||||
if (!ellipsis_width && render)
|
if (!ellipsis_width && render)
|
||||||
ellipsis_width = drw_fontset_getwidth(drw, "...");
|
ellipsis_width = drw_fontset_getwidth(drw, "...");
|
||||||
if (!invalid_width) {
|
if (!invalid_width && render)
|
||||||
invalid_width = -1; /* stop infinite recursion */
|
|
||||||
invalid_width = drw_fontset_getwidth(drw, invalid);
|
invalid_width = drw_fontset_getwidth(drw, invalid);
|
||||||
}
|
|
||||||
while (1) {
|
while (1) {
|
||||||
ew = ellipsis_len = utf8err = utf8charlen = utf8strlen = 0;
|
ew = ellipsis_len = utf8err = utf8charlen = utf8strlen = 0;
|
||||||
utf8str = text;
|
utf8str = text;
|
||||||
|
|||||||
@@ -40,7 +40,9 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in
|
|||||||
|
|
||||||
/* Colorscheme abstraction */
|
/* Colorscheme abstraction */
|
||||||
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
|
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
|
||||||
|
void drw_clr_free(Drw *drw, Clr *c);
|
||||||
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
|
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
|
||||||
|
void drw_scm_free(Drw *drw, Clr *scm, size_t clrcount);
|
||||||
|
|
||||||
/* Cursor abstraction */
|
/* Cursor abstraction */
|
||||||
Cur *drw_cur_create(Drw *drw, int shape);
|
Cur *drw_cur_create(Drw *drw, int shape);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <errno.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -10,17 +11,17 @@ void
|
|||||||
die(const char *fmt, ...)
|
die(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
int saved_errno;
|
||||||
|
|
||||||
|
saved_errno = errno;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
vfprintf(stderr, fmt, ap);
|
vfprintf(stderr, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
|
if (fmt[0] && fmt[strlen(fmt)-1] == ':')
|
||||||
fputc(' ', stderr);
|
fprintf(stderr, " %s", strerror(saved_errno));
|
||||||
perror(NULL);
|
fputc('\n', stderr);
|
||||||
} else {
|
|
||||||
fputc('\n', stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user