Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
23051d78dd | |||
e2a280541e | |||
889512811d | |||
84a1bc5d0d | |||
f0a5b75d6a | |||
1cabeda550 | |||
41379f7c39 | |||
64ab2801fb |
@ -1,5 +1,5 @@
|
||||
# dmenu version
|
||||
VERSION = 4.7
|
||||
VERSION = 4.8
|
||||
|
||||
# paths
|
||||
PREFIX = /usr/local
|
||||
|
12
dmenu.1
12
dmenu.1
@ -100,6 +100,12 @@ Confirm input. Prints the input text to stdout and exits, returning success.
|
||||
.B Escape
|
||||
Exit without selecting an item, returning failure.
|
||||
.TP
|
||||
.B Ctrl-Left
|
||||
Move cursor to the start of the current word
|
||||
.TP
|
||||
.B Ctrl-Right
|
||||
Move cursor to the end of the current word
|
||||
.TP
|
||||
C\-a
|
||||
Home
|
||||
.TP
|
||||
@ -160,6 +166,12 @@ Paste from primary X selection
|
||||
C\-Y
|
||||
Paste from X clipboard
|
||||
.TP
|
||||
M\-b
|
||||
Move cursor to the start of the current word
|
||||
.TP
|
||||
M\-f
|
||||
Move cursor to the end of the current word
|
||||
.TP
|
||||
M\-g
|
||||
Home
|
||||
.TP
|
||||
|
53
dmenu.c
53
dmenu.c
@ -287,6 +287,22 @@ nextrune(int inc)
|
||||
return n;
|
||||
}
|
||||
|
||||
static void
|
||||
movewordedge(int dir)
|
||||
{
|
||||
if (dir < 0) { /* move cursor to the start of the word*/
|
||||
while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]))
|
||||
cursor = nextrune(-1);
|
||||
while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]))
|
||||
cursor = nextrune(-1);
|
||||
} else { /* move cursor to the end of the word */
|
||||
while (text[cursor] && strchr(worddelimiters, text[cursor]))
|
||||
cursor = nextrune(+1);
|
||||
while (text[cursor] && !strchr(worddelimiters, text[cursor]))
|
||||
cursor = nextrune(+1);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
keypress(XKeyEvent *ev)
|
||||
{
|
||||
@ -334,6 +350,14 @@ keypress(XKeyEvent *ev)
|
||||
XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
|
||||
utf8, utf8, win, CurrentTime);
|
||||
return;
|
||||
case XK_Left:
|
||||
movewordedge(-1);
|
||||
ksym = NoSymbol;
|
||||
break;
|
||||
case XK_Right:
|
||||
movewordedge(+1);
|
||||
ksym = NoSymbol;
|
||||
break;
|
||||
case XK_Return:
|
||||
case XK_KP_Enter:
|
||||
break;
|
||||
@ -345,6 +369,14 @@ keypress(XKeyEvent *ev)
|
||||
}
|
||||
else if (ev->state & Mod1Mask)
|
||||
switch(ksym) {
|
||||
case XK_b:
|
||||
movewordedge(-1);
|
||||
ksym = NoSymbol;
|
||||
break;
|
||||
case XK_f:
|
||||
movewordedge(+1);
|
||||
ksym = NoSymbol;
|
||||
break;
|
||||
case XK_g: ksym = XK_Home; break;
|
||||
case XK_G: ksym = XK_End; break;
|
||||
case XK_h: ksym = XK_Up; break;
|
||||
@ -359,6 +391,8 @@ keypress(XKeyEvent *ev)
|
||||
if (!iscntrl(*buf))
|
||||
insert(buf, len);
|
||||
break;
|
||||
case NoSymbol:
|
||||
break;
|
||||
case XK_Delete:
|
||||
if (text[cursor] == '\0')
|
||||
return;
|
||||
@ -467,10 +501,12 @@ paste(void)
|
||||
Atom da;
|
||||
|
||||
/* we have been given the current selection, now insert it into input */
|
||||
XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False,
|
||||
utf8, &da, &di, &dl, &dl, (unsigned char **)&p);
|
||||
if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False,
|
||||
utf8, &da, &di, &dl, &dl, (unsigned char **)&p)
|
||||
== Success && p) {
|
||||
insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p));
|
||||
XFree(p);
|
||||
}
|
||||
drawmenu();
|
||||
}
|
||||
|
||||
@ -539,22 +575,21 @@ run(void)
|
||||
static void
|
||||
setup(void)
|
||||
{
|
||||
int x, y, i = 0;
|
||||
int x, y, i, j;
|
||||
unsigned int du;
|
||||
XSetWindowAttributes swa;
|
||||
XIM xim;
|
||||
Window w, dw, *dws;
|
||||
XWindowAttributes wa;
|
||||
XClassHint ch = {"dmenu", "dmenu"};
|
||||
#ifdef XINERAMA
|
||||
XineramaScreenInfo *info;
|
||||
Window pw;
|
||||
int a, j, di, n, area = 0;
|
||||
int a, di, n, area = 0;
|
||||
#endif
|
||||
|
||||
/* init appearance */
|
||||
scheme[SchemeNorm] = drw_scm_create(drw, colors[SchemeNorm], 2);
|
||||
scheme[SchemeSel] = drw_scm_create(drw, colors[SchemeSel], 2);
|
||||
scheme[SchemeOut] = drw_scm_create(drw, colors[SchemeOut], 2);
|
||||
for (j = 0; j < SchemeLast; j++)
|
||||
scheme[j] = drw_scm_create(drw, colors[j], 2);
|
||||
|
||||
clip = XInternAtom(dpy, "CLIPBOARD", False);
|
||||
utf8 = XInternAtom(dpy, "UTF8_STRING", False);
|
||||
@ -564,6 +599,7 @@ setup(void)
|
||||
lines = MAX(lines, 0);
|
||||
mh = (lines + 1) * bh;
|
||||
#ifdef XINERAMA
|
||||
i = 0;
|
||||
if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) {
|
||||
XGetInputFocus(dpy, &w, &di);
|
||||
if (mon >= 0 && mon < n)
|
||||
@ -613,6 +649,7 @@ setup(void)
|
||||
win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
|
||||
CopyFromParent, CopyFromParent, CopyFromParent,
|
||||
CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
|
||||
XSetClassHint(dpy, win, &ch);
|
||||
|
||||
/* open input methods */
|
||||
xim = XOpenIM(dpy, NULL, NULL, NULL);
|
||||
|
2
drw.c
2
drw.c
@ -200,7 +200,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
||||
Clr *ret;
|
||||
|
||||
/* 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;
|
||||
|
||||
for (i = 0; i < clrcount; i++)
|
||||
|
Reference in New Issue
Block a user