Allow mouse selection override using ShiftMask
authorHiltjo Posthuma <hiltjo@codemadness.org>
Mon, 12 May 2014 12:39:37 +0000 (14:39 +0200)
committerRoberto E. Vargas Caballero <k0ga@shike2.com>
Wed, 14 May 2014 05:48:25 +0000 (07:48 +0200)
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 <hiltjo@codemadness.org>
config.def.h
st.c

index 646a88a..6e2be9a 100644 (file)
@@ -154,6 +154,11 @@ static KeySym mappedkeys[] = { -1 };
  */
 static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
 
+/* Override mouse-select while mask is active (when MODE_MOUSE is set).
+ * Note that if you want to use ShiftMask with selmasks, set this to an other
+ * modifier, set to 0 to not use it. */
+static uint forceselmod = ShiftMask;
+
 static Key key[] = {
        /* keysym           mask            string      appkey appcursor crlf */
        { XK_KP_Home,       ShiftMask,      "\033[2J",       0,   -1,    0},
@@ -357,7 +362,6 @@ static Key key[] = {
  * ButtonRelease and MotionNotify.
  * If no match is found, regular selection is used.
  */
-
 static uint selmasks[] = {
        [SEL_RECTANGULAR] = Mod1Mask,
 };
diff --git a/st.c b/st.c
index 5946c7c..78d8a01 100644 (file)
--- 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;
        }