Xinqi Bao's Git
projects
/
dmenu.git
/ blobdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
inline
| side by side
add ^a and ^e keybindings
[dmenu.git]
/
dmenu.c
diff --git
a/dmenu.c
b/dmenu.c
index
aef8ae5
..
4c87d6a
100644
(file)
--- a/
dmenu.c
+++ b/
dmenu.c
@@
-52,6
+52,7
@@
static void calcoffsetsh(void);
static void calcoffsetsv(void);
static char *cistrstr(const char *s, const char *sub);
static void cleanup(void);
static void calcoffsetsv(void);
static char *cistrstr(const char *s, const char *sub);
static void cleanup(void);
+static void drawcursor(void);
static void drawmenu(void);
static void drawmenuh(void);
static void drawmenuv(void);
static void drawmenu(void);
static void drawmenuh(void);
static void drawmenuv(void);
@@
-247,9
+248,7
@@
drawmenuh(void) {
dc.x += dc.w;
/* determine maximum items */
for(i = curr; i != next; i=i->right) {
dc.x += dc.w;
/* determine maximum items */
for(i = curr; i != next; i=i->right) {
- dc.w = textw(i->text);
- if(dc.w > mw / 3)
- dc.w = mw / 3;
+ dc.w = MIN(textw(i->text), mw / 3);
drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
dc.x += dc.w;
}
drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
dc.x += dc.w;
}
@@
-372,7
+371,7
@@
initfont(const char *fontstr) {
void
kpress(XKeyEvent * e) {
void
kpress(XKeyEvent * e) {
- char buf[
32
];
+ char buf[
sizeof text
];
int i, num;
unsigned int len;
KeySym ksym;
int i, num;
unsigned int len;
KeySym ksym;
@@
-395,7
+394,16
@@
kpress(XKeyEvent * e) {
switch (ksym) {
default: /* ignore other control sequences */
return;
switch (ksym) {
default: /* ignore other control sequences */
return;
- case XK_bracketleft:
+ case XK_a:
+ case XK_A:
+ cursor = 0;
+ break;
+ case XK_e:
+ case XK_E:
+ cursor = strlen(text);
+ break;
+ case XK_c:
+ case XK_C:
ksym = XK_Escape;
break;
case XK_h:
ksym = XK_Escape;
break;
case XK_h:
@@
-414,18
+422,16
@@
kpress(XKeyEvent * e) {
case XK_U:
text[0] = 0;
match(text);
case XK_U:
text[0] = 0;
match(text);
- drawmenu();
break;
case XK_w:
case XK_W:
break;
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
;
+ if(
cursor > 0
) {
+ i =
cursor
;
+ while(i
-- > 0 && text[i] == ' ');
+
while(i-- > 0 && text[i] != ' ')
;
+ memmove(text + i + 1, text + cursor, sizeof text - cursor);
+
cursor = i + 1
;
match(text);
match(text);
- drawmenu();
}
break;
}
}
break;
}
@@
-457,39
+463,43
@@
kpress(XKeyEvent * e) {
char *c;
if(!(fp = (FILE*)popen("sselp", "r")))
eprint("dmenu: Could not popen sselp\n");
char *c;
if(!(fp = (FILE*)popen("sselp", "r")))
eprint("dmenu: Could not popen sselp\n");
- c = fgets(
text + len, sizeof(text) - len
, fp);
+ c = fgets(
buf, sizeof buf
, fp);
pclose(fp);
if(c == NULL)
return;
}
pclose(fp);
if(c == NULL)
return;
}
- len = strlen(text);
- if(len && text[len-1] == '\n')
- text[--len] = '\0';
- match(text);
- drawmenu();
- return;
+ num = strlen(buf);
+ if(num && buf[num-1] == '\n')
+ buf[--num] = '\0';
+ break;
}
}
switch(ksym) {
default:
}
}
switch(ksym) {
default:
+ num = MIN(num, sizeof text - cursor);
if(num && !iscntrl((int) buf[0])) {
if(num && !iscntrl((int) buf[0])) {
- buf[num] = 0;
- memmove(text + cursor + num, text + cursor, sizeof text - cursor);
- strncpy(text + cursor, buf, sizeof text - cursor);
+ memmove(text + cursor + num, text + cursor, sizeof text - cursor - num);
+ memcpy(text + cursor, buf, num);
cursor+=num;
match(text);
}
break;
case XK_BackSpace:
if(cursor > 0) {
cursor+=num;
match(text);
}
break;
case XK_BackSpace:
if(cursor > 0) {
- memmove(text + cursor
+ -1, text + cursor, sizeof text - cursor
);
+ memmove(text + cursor
- 1, text + cursor, sizeof text - cursor + 1
);
cursor--;
match(text);
}
break;
cursor--;
match(text);
}
break;
+ case XK_Delete:
+ memmove(text + cursor, text + cursor + 1, sizeof text - cursor);
+ match(text);
+ break;
case XK_End:
case XK_End:
- if(!item)
- return;
+ if(cursor < len) {
+ cursor = len;
+ break;
+ }
while(next) {
sel = curr = next;
calcoffsets();
while(next) {
sel = curr = next;
calcoffsets();
@@
-502,8
+512,10
@@
kpress(XKeyEvent * e) {
running = False;
break;
case XK_Home:
running = False;
break;
case XK_Home:
- if(!item)
- return;
+ if(sel == item) {
+ cursor = 0;
+ break;
+ }
sel = curr = item;
calcoffsets();
break;
sel = curr = item;
calcoffsets();
break;
@@
-534,12
+546,10
@@
kpress(XKeyEvent * e) {
calcoffsets();
break;
case XK_Return:
calcoffsets();
break;
case XK_Return:
- if((e->state & ShiftMask)
&& *text
)
+ if((e->state & ShiftMask)
|| !sel
)
fprintf(stdout, "%s", text);
fprintf(stdout, "%s", text);
- else
if(sel)
+ else
fprintf(stdout, "%s", sel->text);
fprintf(stdout, "%s", sel->text);
- else if(*text)
- fprintf(stdout, "%s", text);
fflush(stdout);
running = False;
break;
fflush(stdout);
running = False;
break;
@@
-565,9
+575,6
@@
kpress(XKeyEvent * e) {
match(text);
break;
}
match(text);
break;
}
- len = strlen(text);
- cursor = MIN(cursor, len);
- cursor = MAX(cursor, 0);
drawmenu();
}
drawmenu();
}
@@
-618,13
+625,13
@@
readstdin(void) {
unsigned int len = 0, max = 0;
Item *i, *new;
unsigned int len = 0, max = 0;
Item *i, *new;
- i =
0
;
+ i =
NULL
;
while(fgets(buf, sizeof buf, stdin)) {
len = strlen(buf);
while(fgets(buf, sizeof buf, stdin)) {
len = strlen(buf);
- if
(buf[len -
1] == '\n')
- buf[
len - 1] = 0
;
+ if
(buf[len-
1] == '\n')
+ buf[
--len] = '\0'
;
if(!(p = strdup(buf)))
if(!(p = strdup(buf)))
- eprint("fatal: could not strdup() %u bytes\n",
strlen(buf)
);
+ eprint("fatal: could not strdup() %u bytes\n",
len
);
if(max < len) {
maxname = p;
max = len;
if(max < len) {
maxname = p;
max = len;
@@
-732,13
+739,9
@@
setup(Bool topbar) {
if(!dc.font.set)
XSetFont(dpy, dc.gc, dc.font.xfont->fid);
if(maxname)
if(!dc.font.set)
XSetFont(dpy, dc.gc, dc.font.xfont->fid);
if(maxname)
- cmdw = textw(maxname);
- if(cmdw > mw / 3)
- cmdw = mw / 3;
+ cmdw = MIN(textw(maxname), mw / 3);
if(prompt)
if(prompt)
- promptw = textw(prompt);
- if(promptw > mw / 5)
- promptw = mw / 5;
+ promptw = MIN(textw(prompt), mw / 5);
text[0] = 0;
match(text);
XMapRaised(dpy, win);
text[0] = 0;
match(text);
XMapRaised(dpy, win);
@@
-773,6
+776,9
@@
main(int argc, char *argv[]) {
}
else if(!strcmp(argv[i], "-b"))
topbar = False;
}
else if(!strcmp(argv[i], "-b"))
topbar = False;
+ else if(!strcmp(argv[i], "-e")) {
+ if(++i < argc) root = atoi(argv[i]);
+ }
else if(!strcmp(argv[i], "-l")) {
vlist = True;
calcoffsets = calcoffsetsv;
else if(!strcmp(argv[i], "-l")) {
vlist = True;
calcoffsets = calcoffsetsv;
@@
-797,7
+803,7
@@
main(int argc, char *argv[]) {
if(++i < argc) selfgcolor = argv[i];
}
else if(!strcmp(argv[i], "-v"))
if(++i < argc) selfgcolor = argv[i];
}
else if(!strcmp(argv[i], "-v"))
- eprint("dmenu-"VERSION", © 2006-20
09
dmenu engineers, see LICENSE for details\n");
+ eprint("dmenu-"VERSION", © 2006-20
10
dmenu engineers, see LICENSE for details\n");
else
eprint("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>] [-nf <color>]\n"
" [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");
else
eprint("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>] [-nf <color>]\n"
" [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");
@@
-806,7
+812,8
@@
main(int argc, char *argv[]) {
if(!(dpy = XOpenDisplay(NULL)))
eprint("dmenu: cannot open display\n");
screen = DefaultScreen(dpy);
if(!(dpy = XOpenDisplay(NULL)))
eprint("dmenu: cannot open display\n");
screen = DefaultScreen(dpy);
- root = RootWindow(dpy, screen);
+ if(!root)
+ root = RootWindow(dpy, screen);
if(isatty(STDIN_FILENO)) {
readstdin();
if(isatty(STDIN_FILENO)) {
readstdin();