Xinqi Bao's Git
projects
/
dmenu.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
extended libdraw
[dmenu.git]
/
dmenu.c
diff --git
a/dmenu.c
b/dmenu.c
index
878bc95
..
8059f29
100644
(file)
--- a/
dmenu.c
+++ b/
dmenu.c
@@
-39,7
+39,7
@@
static void drawmenu(void);
static void drawmenuh(void);
static void drawmenuv(void);
static Bool grabkeyboard(void);
static void drawmenuh(void);
static void drawmenuv(void);
static Bool grabkeyboard(void);
-static void kpress(XKeyEvent *
e);
+static void kpress(XKeyEvent *e);
static void match(char *pattern);
static void readstdin(void);
static void run(void);
static void match(char *pattern);
static void readstdin(void);
static void run(void);
@@
-55,26
+55,26
@@
static char text[4096];
static int cmdw = 0;
static int promptw = 0;
static int ret = 0;
static int cmdw = 0;
static int promptw = 0;
static int ret = 0;
+static int screen;
static unsigned int lines = 0;
static unsigned int numlockmask = 0;
static unsigned int lines = 0;
static unsigned int numlockmask = 0;
+static unsigned int mw, mh;
+static unsigned long normcol[ColLast];
+static unsigned long selcol[ColLast];
static Bool running = True;
static Bool running = True;
+static DC dc;
+static Display *dpy;
static Item *allitems = NULL; /* first of all items */
static Item *item = NULL; /* first of pattern matching items */
static Item *sel = NULL;
static Item *next = NULL;
static Item *prev = NULL;
static Item *curr = NULL;
static Item *allitems = NULL; /* first of all items */
static Item *item = NULL; /* first of pattern matching items */
static Item *sel = NULL;
static Item *next = NULL;
static Item *prev = NULL;
static Item *curr = NULL;
-static Window win;
+static Window win
, parent
;
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr;
static void (*calcoffsets)(void) = calcoffsetsh;
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr;
static void (*calcoffsets)(void) = calcoffsetsh;
-Display *dpy;
-DC dc;
-int screen;
-unsigned int mw, mh;
-Window parent;
-
void
appenditem(Item *i, Item **list, Item **last) {
if(!(*last))
void
appenditem(Item *i, Item **list, Item **last) {
if(!(*last))
@@
-92,11
+92,11
@@
calcoffsetsh(void) {
w = promptw + cmdw + (2 * spaceitem);
for(next = curr; next; next = next->right)
w = promptw + cmdw + (2 * spaceitem);
for(next = curr; next; next = next->right)
- if((w += MIN(textw(next->text), mw / 3)) > mw)
+ if((w += MIN(textw(
&dc,
next->text), mw / 3)) > mw)
break;
w = promptw + cmdw + (2 * spaceitem);
for(prev = curr; prev && prev->left; prev = prev->left)
break;
w = promptw + cmdw + (2 * spaceitem);
for(prev = curr; prev && prev->left; prev = prev->left)
- if((w += MIN(textw(prev->left->text), mw / 3)) > mw)
+ if((w += MIN(textw(
&dc,
prev->left->text), mw / 3)) > mw)
break;
}
break;
}
@@
-143,7
+143,7
@@
cleanup(void) {
free(allitems);
allitems = itm;
}
free(allitems);
allitems = itm;
}
-
drawcleanup(
);
+
cleanupdraw(&dc
);
XDestroyWindow(dpy, win);
XUngrabKeyboard(dpy, CurrentTime);
}
XDestroyWindow(dpy, win);
XUngrabKeyboard(dpy, CurrentTime);
}
@@
-161,18
+161,18
@@
drawmenu(void) {
dc.y = 0;
dc.w = mw;
dc.h = mh;
dc.y = 0;
dc.w = mw;
dc.h = mh;
- drawtext(
NULL, dc.norm
);
+ drawtext(
&dc, NULL, normcol, False
);
/* print prompt? */
if(prompt) {
dc.w = promptw;
/* print prompt? */
if(prompt) {
dc.w = promptw;
- drawtext(
prompt, dc.sel
);
+ drawtext(
&dc, prompt, selcol, False
);
dc.x += dc.w;
}
dc.w = mw - dc.x;
/* print command */
if(cmdw && item && lines == 0)
dc.w = cmdw;
dc.x += dc.w;
}
dc.w = mw - dc.x;
/* print command */
if(cmdw && item && lines == 0)
dc.w = cmdw;
- drawtext(
*text ? text : NULL, dc.norm
);
+ drawtext(
&dc, *text ? text : NULL, normcol, False
);
if(curr) {
if(lines > 0)
drawmenuv();
if(curr) {
if(lines > 0)
drawmenuv();
@@
-189,16
+189,16
@@
drawmenuh(void) {
dc.x += cmdw;
dc.w = spaceitem;
dc.x += cmdw;
dc.w = spaceitem;
- drawtext(
curr->left ? "<" : NULL, dc.norm
);
+ drawtext(
&dc, curr->left ? "<" : NULL, normcol, False
);
dc.x += dc.w;
dc.x += dc.w;
- for(i = curr; i != next; i
=
i->right) {
- dc.w = MIN(textw(i->text), mw / 3);
- drawtext(
i->text, (sel == i) ? dc.sel : dc.norm
);
+ for(i = curr; i != next; i
=
i->right) {
+ dc.w = MIN(textw(
&dc,
i->text), mw / 3);
+ drawtext(
&dc, i->text, (sel == i) ? selcol : normcol, False
);
dc.x += dc.w;
}
dc.w = spaceitem;
dc.x = mw - dc.w;
dc.x += dc.w;
}
dc.w = spaceitem;
dc.x = mw - dc.w;
- drawtext(
next ? ">" : NULL, dc.norm
);
+ drawtext(
&dc, next ? ">" : NULL, normcol, False
);
}
void
}
void
@@
-208,12
+208,12
@@
drawmenuv(void) {
dc.w = mw - dc.x;
dc.h = dc.font.height + 2;
dc.y = dc.h;
dc.w = mw - dc.x;
dc.h = dc.font.height + 2;
dc.y = dc.h;
- for(i = curr; i != next; i
=
i->right) {
- drawtext(
i->text, (sel == i) ? dc.sel : dc.norm
);
+ for(i = curr; i != next; i
=
i->right) {
+ drawtext(
&dc, i->text, (sel == i) ? selcol : normcol, False
);
dc.y += dc.h;
}
dc.h = mh - dc.y;
dc.y += dc.h;
}
dc.h = mh - dc.y;
- drawtext(
NULL, dc.norm
);
+ drawtext(
&dc, NULL, normcol, False
);
}
Bool
}
Bool
@@
-230,7
+230,7
@@
grabkeyboard(void) {
}
void
}
void
-kpress(XKeyEvent *
e) {
+kpress(XKeyEvent *e) {
char buf[sizeof text];
int num;
unsigned int i, len;
char buf[sizeof text];
int num;
unsigned int i, len;
@@
-273,6
+273,7
@@
kpress(XKeyEvent * e) {
ksym = XK_Tab;
break;
case XK_j:
ksym = XK_Tab;
break;
case XK_j:
+ case XK_m:
ksym = XK_Return;
break;
case XK_n:
ksym = XK_Return;
break;
case XK_n:
@@
-455,7
+456,7
@@
run(void) {
/* main event loop */
while(running && !XNextEvent(dpy, &ev))
/* main event loop */
while(running && !XNextEvent(dpy, &ev))
- switch
(ev.type) {
+ switch(ev.type) {
case KeyPress:
kpress(&ev.xkey);
break;
case KeyPress:
kpress(&ev.xkey);
break;
@@
-491,12
+492,17
@@
setup(Bool topbar) {
}
XFreeModifiermap(modmap);
}
XFreeModifiermap(modmap);
- initfont(font);
+ dc.dpy = dpy;
+ normcol[ColBG] = getcolor(&dc, normbgcolor);
+ normcol[ColFG] = getcolor(&dc, normfgcolor);
+ selcol[ColBG] = getcolor(&dc, selbgcolor);
+ selcol[ColFG] = getcolor(&dc, selfgcolor);
+ initfont(&dc, font);
/* menu window */
wa.override_redirect = True;
wa.background_pixmap = ParentRelative;
/* menu window */
wa.override_redirect = True;
wa.background_pixmap = ParentRelative;
- wa.event_mask = ExposureMask |
ButtonPressMask |
KeyPressMask | VisibilityChangeMask;
+ wa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
/* menu window geometry */
mh = (dc.font.height + 2) * (lines + 1);
/* menu window geometry */
mh = (dc.font.height + 2) * (lines + 1);
@@
-531,11
+537,11
@@
setup(Bool topbar) {
DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
-
drawsetup(
);
+
setupdraw(&dc, win
);
if(maxname)
if(maxname)
- cmdw = MIN(textw(maxname), mw / 3);
+ cmdw = MIN(textw(
&dc,
maxname), mw / 3);
if(prompt)
if(prompt)
- promptw = MIN(textw(prompt), mw / 5);
+ promptw = MIN(textw(
&dc,
prompt), mw / 5);
text[0] = '\0';
match(text);
XMapRaised(dpy, win);
text[0] = '\0';
match(text);
XMapRaised(dpy, win);