~petersanchez/st

d2b75db8d7519a20af8bf09e9c205507f9ff828c — Avi Halachmi (:avih) 4 years ago b6d280d
mouse shortcuts: don't hardcode selpaste

Because selpaste is activated on release, a release flag was added to
mouse shortcuts which controls whether activation is on press/release,
and selpaste binding to button2 was moved to config.h .

button1 remains the only hardcoded mouse button - for selection + copy.
2 files changed, 26 insertions(+), 12 deletions(-)

M config.def.h
M x.c
M config.def.h => config.def.h +2 -1
@@ 162,7 162,8 @@ static uint forcemousemod = ShiftMask;
 * Beware that overloading Button1 will disable the selection.
 */
static MouseShortcut mshortcuts[] = {
	/* mask                 button   function        argument */
	/* mask                 button   function        argument       release */
	{ XK_ANY_MOD,           Button2, selpaste,       {.i = 0},      1 },
	{ XK_ANY_MOD,           Button4, ttysend,        {.s = "\031"} },
	{ XK_ANY_MOD,           Button5, ttysend,        {.s = "\005"} },
};

M x.c => x.c +24 -11
@@ 33,6 33,7 @@ typedef struct {
	uint button;
	void (*func)(const Arg *);
	const Arg arg;
	uint  release;
} MouseShortcut;

typedef struct {


@@ 165,6 166,7 @@ static void kpress(XEvent *);
static void cmessage(XEvent *);
static void resize(XEvent *);
static void focus(XEvent *);
static int mouseaction(XEvent *, uint);
static void brelease(XEvent *);
static void bpress(XEvent *);
static void bmotion(XEvent *);


@@ 416,11 418,27 @@ mousereport(XEvent *e)
	ttywrite(buf, len, 0);
}

int
mouseaction(XEvent *e, uint release)
{
	MouseShortcut *ms;

	for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) {
		if (ms->release == release &&
		    ms->button == e->xbutton.button &&
		    match(ms->mod, e->xbutton.state & ~forcemousemod)) {
			ms->func(&(ms->arg));
			return 1;
		}
	}

	return 0;
}

void
bpress(XEvent *e)
{
	struct timespec now;
	MouseShortcut *ms;
	int snap;

	if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) {


@@ 428,13 446,8 @@ bpress(XEvent *e)
		return;
	}

	for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) {
		if (e->xbutton.button == ms->button &&
		    match(ms->mod, e->xbutton.state & ~forcemousemod)) {
			ms->func(&(ms->arg));
			return;
		}
	}
	if (mouseaction(e, 0))
		return;

	if (e->xbutton.button == Button1) {
		/*


@@ 655,9 668,9 @@ brelease(XEvent *e)
		return;
	}

	if (e->xbutton.button == Button2)
		selpaste(NULL);
	else if (e->xbutton.button == Button1)
	if (mouseaction(e, 1))
		return;
	if (e->xbutton.button == Button1)
		mousesel(e, 1);
}