aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorAnselm R. Garbe <arg@suckless.org>2007-02-19 15:49:50 +0100
committerAnselm R. Garbe <arg@suckless.org>2007-02-19 15:49:50 +0100
commit665488a6eedeecf743e44bd9624105c8b47c4f97 (patch)
tree6b564bcab3807ef1c470a44a079e3d22e82ff996 /main.c
parent1e01ca03176e6e845a2a300545061e7384c4836d (diff)
downloaddmenu-665488a6eedeecf743e44bd9624105c8b47c4f97.tar.gz
dmenu-665488a6eedeecf743e44bd9624105c8b47c4f97.tar.bz2
dmenu-665488a6eedeecf743e44bd9624105c8b47c4f97.zip
removed draw.c, implemented C-w handling (backward word deletion)
Diffstat (limited to 'main.c')
-rw-r--r--main.c127
1 files changed, 125 insertions, 2 deletions
diff --git a/main.c b/main.c
index f1f71fd..0840643 100644
--- a/main.c
+++ b/main.c
@@ -44,6 +44,22 @@ static Item *curr = NULL;
static Window root;
static Window win;
+static unsigned int
+textnw(const char *text, unsigned int len) {
+ XRectangle r;
+
+ if(dc.font.set) {
+ XmbTextExtents(dc.font.set, text, len, NULL, &r);
+ return r.width;
+ }
+ return XTextWidth(dc.font.xfont, text, len);
+}
+
+static unsigned int
+textw(const char *text) {
+ return textnw(text, strlen(text)) + dc.font.height;
+}
+
static void
calcoffsets(void) {
unsigned int tw, w;
@@ -71,6 +87,53 @@ calcoffsets(void) {
}
static void
+drawtext(const char *text, unsigned long col[ColLast]) {
+ int x, y, w, h;
+ static char buf[256];
+ unsigned int len, olen;
+ XGCValues gcv;
+ XRectangle r = { dc.x, dc.y, dc.w, dc.h };
+
+ XSetForeground(dpy, dc.gc, col[ColBG]);
+ XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
+ if(!text)
+ return;
+ w = 0;
+ olen = len = strlen(text);
+ if(len >= sizeof buf)
+ len = sizeof buf - 1;
+ memcpy(buf, text, len);
+ buf[len] = 0;
+ h = dc.font.ascent + dc.font.descent;
+ y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
+ x = dc.x + (h / 2);
+ /* shorten text if necessary */
+ while(len && (w = textnw(buf, len)) > dc.w - h)
+ buf[--len] = 0;
+ if(len < olen) {
+ if(len > 1)
+ buf[len - 1] = '.';
+ if(len > 2)
+ buf[len - 2] = '.';
+ if(len > 3)
+ buf[len - 3] = '.';
+ }
+ if(w > dc.w)
+ return; /* too long */
+ gcv.foreground = col[ColFG];
+ if(dc.font.set) {
+ XChangeGC(dpy, dc.gc, GCForeground, &gcv);
+ XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc,
+ x, y, buf, len);
+ }
+ else {
+ gcv.font = dc.font.xfont->fid;
+ XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
+ XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
+ }
+}
+
+static void
drawmenu(void) {
Item *i;
@@ -111,6 +174,54 @@ drawmenu(void) {
XFlush(dpy);
}
+static unsigned long
+getcolor(const char *colstr) {
+ Colormap cmap = DefaultColormap(dpy, screen);
+ XColor color;
+
+ if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
+ eprint("error, cannot allocate color '%s'\n", colstr);
+ return color.pixel;
+}
+
+static void
+setfont(const char *fontstr) {
+ char *def, **missing;
+ int i, n;
+
+ missing = NULL;
+ if(dc.font.set)
+ XFreeFontSet(dpy, dc.font.set);
+ dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
+ if(missing)
+ XFreeStringList(missing);
+ if(dc.font.set) {
+ XFontSetExtents *font_extents;
+ XFontStruct **xfonts;
+ char **font_names;
+ dc.font.ascent = dc.font.descent = 0;
+ font_extents = XExtentsOfFontSet(dc.font.set);
+ n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
+ for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
+ if(dc.font.ascent < (*xfonts)->ascent)
+ dc.font.ascent = (*xfonts)->ascent;
+ if(dc.font.descent < (*xfonts)->descent)
+ dc.font.descent = (*xfonts)->descent;
+ xfonts++;
+ }
+ }
+ else {
+ if(dc.font.xfont)
+ XFreeFont(dpy, dc.font.xfont);
+ dc.font.xfont = NULL;
+ if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)))
+ eprint("error, cannot load font: '%s'\n", fontstr);
+ dc.font.ascent = dc.font.xfont->ascent;
+ dc.font.descent = dc.font.xfont->descent;
+ }
+ dc.font.height = dc.font.ascent + dc.font.descent;
+}
+
static void
match(char *pattern) {
unsigned int plen;
@@ -151,8 +262,8 @@ match(char *pattern) {
static void
kpress(XKeyEvent * e) {
char buf[32];
- int num, prev_nitem;
- unsigned int i, len;
+ int i, num, prev_nitem;
+ unsigned int len;
KeySym ksym;
len = strlen(text);
@@ -188,6 +299,18 @@ kpress(XKeyEvent * e) {
match(text);
drawmenu();
return;
+ case XK_w:
+ case XK_W:
+ if(len) {
+ i = len - 1;
+ while(i >= 0 && text[i] == ' ')
+ text[i--] = 0;
+ while(i >= 0 && text[i] != ' ')
+ text[i--] = 0;
+ match(text);
+ drawmenu();
+ }
+ return;
}
}
if(CLEANMASK(e->state) & Mod1Mask) {