Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bfb071698a | ||
|
|
7c0334de3d | ||
|
|
8627d0c659 | ||
|
|
61e0072c3e | ||
|
|
0785a28f1d | ||
|
|
5453bb65d9 | ||
|
|
7175c4880b | ||
|
|
8b48986f4c | ||
|
|
77f96d704b |
No files matched your search
@@ -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
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
/* See LICENSE file for copyright and license details. */
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -102,7 +103,7 @@ cleanup(void)
|
|||||||
|
|
||||||
XUngrabKeyboard(dpy, CurrentTime);
|
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);
|
||||||
@@ -171,7 +172,7 @@ drawmenu(void)
|
|||||||
/* draw vertical list */
|
/* draw vertical list */
|
||||||
for (item = curr; item != next; item = item->right)
|
for (item = curr; item != next; item = item->right)
|
||||||
drawitem(item, x, y += bh, mw - x);
|
drawitem(item, x, y += bh, mw - x);
|
||||||
} else if (matches) {
|
} else if (matches && curr) {
|
||||||
/* draw horizontal list */
|
/* draw horizontal list */
|
||||||
x += inputw;
|
x += inputw;
|
||||||
w = TEXTW("<");
|
w = TEXTW("<");
|
||||||
@@ -414,7 +415,7 @@ keypress(XKeyEvent *ev)
|
|||||||
switch(ksym) {
|
switch(ksym) {
|
||||||
default:
|
default:
|
||||||
insert:
|
insert:
|
||||||
if (!iscntrl((unsigned char)*buf))
|
if (len > 0 && !iscntrl((unsigned char)*buf))
|
||||||
insert(buf, len);
|
insert(buf, len);
|
||||||
break;
|
break;
|
||||||
case XK_Delete:
|
case XK_Delete:
|
||||||
@@ -556,10 +557,12 @@ readstdin(void)
|
|||||||
for (i = 0; (len = getline(&line, &linesiz, stdin)) != -1; i++) {
|
for (i = 0; (len = getline(&line, &linesiz, stdin)) != -1; i++) {
|
||||||
if (i + 1 >= itemsiz) {
|
if (i + 1 >= itemsiz) {
|
||||||
itemsiz += 256;
|
itemsiz += 256;
|
||||||
|
if (itemsiz > SIZE_MAX / sizeof(*items))
|
||||||
|
die("too many items");
|
||||||
if (!(items = realloc(items, itemsiz * sizeof(*items))))
|
if (!(items = realloc(items, itemsiz * sizeof(*items))))
|
||||||
die("cannot realloc %zu bytes:", itemsiz * sizeof(*items));
|
die("cannot realloc %zu bytes:", itemsiz * sizeof(*items));
|
||||||
}
|
}
|
||||||
if (line[len - 1] == '\n')
|
if (len > 0 && line[len - 1] == '\n')
|
||||||
line[len - 1] = '\0';
|
line[len - 1] = '\0';
|
||||||
if (!(items[i].text = strdup(line)))
|
if (!(items[i].text = strdup(line)))
|
||||||
die("strdup:");
|
die("strdup:");
|
||||||
@@ -639,6 +642,8 @@ setup(void)
|
|||||||
#ifdef XINERAMA
|
#ifdef XINERAMA
|
||||||
i = 0;
|
i = 0;
|
||||||
if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) {
|
if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) {
|
||||||
|
if (n < 1)
|
||||||
|
die("Xinerama reported no screens");
|
||||||
XGetInputFocus(dpy, &w, &di);
|
XGetInputFocus(dpy, &w, &di);
|
||||||
if (mon >= 0 && mon < n)
|
if (mon >= 0 && mon < n)
|
||||||
i = mon;
|
i = mon;
|
||||||
@@ -661,6 +666,9 @@ setup(void)
|
|||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
if (INTERSECT(x, y, 1, 1, info[i]) != 0)
|
if (INTERSECT(x, y, 1, 1, info[i]) != 0)
|
||||||
break;
|
break;
|
||||||
|
/* fallback to the first screen if there is no intersection */
|
||||||
|
if (i >= n)
|
||||||
|
i = 0;
|
||||||
|
|
||||||
x = info[i].x_org;
|
x = info[i].x_org;
|
||||||
y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
|
y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
|
||||||
@@ -693,8 +701,9 @@ setup(void)
|
|||||||
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");
|
||||||
|
|
||||||
xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
|
if ((xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
|
||||||
XNClientWindow, win, XNFocusWindow, win, NULL);
|
XNClientWindow, win, XNFocusWindow, win, NULL)) == NULL)
|
||||||
|
die("XCreateIC failed: could not obtain input context");
|
||||||
|
|
||||||
XMapRaised(dpy, win);
|
XMapRaised(dpy, win);
|
||||||
if (embed) {
|
if (embed) {
|
||||||
@@ -755,6 +764,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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in new issue
Block a user