URI: 
       Allow mouse selection override using ShiftMask - st - simple terminal
  HTML git clone https://git.parazyd.org/st
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit cf890e5bf06a65a35fe195aa1ef8ae3e1eb55f51
   DIR parent bdb850a16a6d7a2d12b2bd5500a3b7d70290a74a
  HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Mon, 12 May 2014 14:39:37 +0200
       
       Allow mouse selection override 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 <hiltjo@codemadness.org>
       
       Diffstat:
         M config.def.h                        |       6 +++++-
         M st.c                                |       8 ++++----
       
       2 files changed, 9 insertions(+), 5 deletions(-)
       ---
   DIR diff --git a/config.def.h b/config.def.h
       @@ -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,
        };
   DIR diff --git 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;
                }