On Mon, May 12, 2014 at 1:07 PM, Raphaël Proust <[email protected]> wrote:
> [...]
> It makes sense. Although applications might be binding Shift+Mouse for
> their own purpose (not expecting X to interfere with their input). I
> don't care too much which is chosen because I tend to not use the
> mouse in the terminal, but I think it's worth considering and
> discussing a bit.
>
Definitely, is it enough to make ShiftMask configurable?

> We can rephrase the question: What are sane terminal managers? (And
> thus, which one should st make effort to work with?)
>
st should work (and generally does already work) well with tmux in my opinion.

>> As described in the post you linked
>> (http://lists.suckless.org/dev/1402/20050.html) maybe ShiftMask can be
>> added as a configurable shortcut to allow shortcuts using ShiftMask
>> and also allow things like rectangular (SEL_RECTANGULAR) to work?
>
> I think that an entry in config.c is a good idea. Then people can
> customise based on their terminal manager(s) of choice.
>
The attached updated patch makes ShiftMask configurable and allows to
use selmasks too (SEL_RECTANGULAR).

Kind regards,
Hiltjo
From ea61df8ef63067a1e1863442b994a123435edbf9 Mon Sep 17 00:00:00 2001
From: Hiltjo Posthuma <[email protected]>
Date: Mon, 12 May 2014 11:58:06 +0000
Subject: [PATCH] Allow forced mouse selection using ShiftMask

Similar to xterm or urxvt holding shift before selecting text with the mouse
allows to override copying text. For example in tmux with "mode-mouse on" or
vim (compiled with --with-x), mc, htop, etc.

forceselmod in config.h sets the modifier to use this mode, by default
ShiftMask.

Signed-off-by: Hiltjo Posthuma <[email protected]>
---
 st.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/st.c b/st.c
index 5946c7c..78d8a01 100644
--- a/st.c
+++ b/st.c
@@ -765,7 +765,7 @@ selsnap(int mode, int *x, int *y, int direction) {
 void
 getbuttoninfo(XEvent *e) {
 	int type;
-	uint state = e->xbutton.state &~Button1Mask;
+	uint state = e->xbutton.state & ~(Button1Mask | forceselmod);
 
 	sel.alt = IS_SET(MODE_ALTSCREEN);
 
@@ -858,7 +858,7 @@ bpress(XEvent *e) {
 	struct timeval now;
 	Mousekey *mk;
 
-	if(IS_SET(MODE_MOUSE)) {
+	if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) {
 		mousereport(e);
 		return;
 	}
@@ -1090,7 +1090,7 @@ xsetsel(char *str) {
 
 void
 brelease(XEvent *e) {
-	if(IS_SET(MODE_MOUSE)) {
+	if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) {
 		mousereport(e);
 		return;
 	}
@@ -1113,7 +1113,7 @@ void
 bmotion(XEvent *e) {
 	int oldey, oldex, oldsby, oldsey;
 
-	if(IS_SET(MODE_MOUSE)) {
+	if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) {
 		mousereport(e);
 		return;
 	}
-- 
1.9.2

Reply via email to