~metalune/dmenu

e2a280541eab62717d6a9a72d047c832e5cb1edc — Quentin Rameau 3 years ago 8895128
add key bindings for moving to the word start or end

Mod1+b/^Left and Mod1+f/^Right
2 files changed, 46 insertions(+), 0 deletions(-)

M dmenu.1
M dmenu.c
M dmenu.1 => dmenu.1 +12 -0
@@ 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

M dmenu.c => dmenu.c +34 -0
@@ 288,6 288,22 @@ nextrune(int inc)
}

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)
{
	char buf[32];


@@ 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;