diff options
| author | Hiltjo Posthuma <hiltjo@codemadness.org> | 2014-05-12 14:39:37 +0200 |
|---|---|---|
| committer | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2014-05-14 07:48:25 +0200 |
| commit | cf890e5bf06a65a35fe195aa1ef8ae3e1eb55f51 (patch) | |
| tree | b6f946cb82d363cd6db0beb7ecf77e17f2928a20 | |
| parent | bdb850a16a6d7a2d12b2bd5500a3b7d70290a74a (diff) | |
| download | st-cf890e5bf06a65a35fe195aa1ef8ae3e1eb55f51.tar.gz st-cf890e5bf06a65a35fe195aa1ef8ae3e1eb55f51.zip | |
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>
| -rw-r--r-- | config.def.h | 6 | ||||
| -rw-r--r-- | st.c | 8 |
2 files changed, 9 insertions, 5 deletions
diff --git a/config.def.h b/config.def.h index 646a88a..6e2be9a 100644 --- a/config.def.h +++ b/config.def.h | |||
| @@ -154,6 +154,11 @@ static KeySym mappedkeys[] = { -1 }; | |||
| 154 | */ | 154 | */ |
| 155 | static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; | 155 | static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; |
| 156 | 156 | ||
| 157 | /* Override mouse-select while mask is active (when MODE_MOUSE is set). | ||
| 158 | * Note that if you want to use ShiftMask with selmasks, set this to an other | ||
| 159 | * modifier, set to 0 to not use it. */ | ||
| 160 | static uint forceselmod = ShiftMask; | ||
| 161 | |||
| 157 | static Key key[] = { | 162 | static Key key[] = { |
| 158 | /* keysym mask string appkey appcursor crlf */ | 163 | /* keysym mask string appkey appcursor crlf */ |
| 159 | { XK_KP_Home, ShiftMask, "\033[2J", 0, -1, 0}, | 164 | { XK_KP_Home, ShiftMask, "\033[2J", 0, -1, 0}, |
| @@ -357,7 +362,6 @@ static Key key[] = { | |||
| 357 | * ButtonRelease and MotionNotify. | 362 | * ButtonRelease and MotionNotify. |
| 358 | * If no match is found, regular selection is used. | 363 | * If no match is found, regular selection is used. |
| 359 | */ | 364 | */ |
| 360 | |||
| 361 | static uint selmasks[] = { | 365 | static uint selmasks[] = { |
| 362 | [SEL_RECTANGULAR] = Mod1Mask, | 366 | [SEL_RECTANGULAR] = Mod1Mask, |
| 363 | }; | 367 | }; |
| @@ -765,7 +765,7 @@ selsnap(int mode, int *x, int *y, int direction) { | |||
| 765 | void | 765 | void |
| 766 | getbuttoninfo(XEvent *e) { | 766 | getbuttoninfo(XEvent *e) { |
| 767 | int type; | 767 | int type; |
| 768 | uint state = e->xbutton.state &~Button1Mask; | 768 | uint state = e->xbutton.state & ~(Button1Mask | forceselmod); |
| 769 | 769 | ||
| 770 | sel.alt = IS_SET(MODE_ALTSCREEN); | 770 | sel.alt = IS_SET(MODE_ALTSCREEN); |
| 771 | 771 | ||
| @@ -858,7 +858,7 @@ bpress(XEvent *e) { | |||
| 858 | struct timeval now; | 858 | struct timeval now; |
| 859 | Mousekey *mk; | 859 | Mousekey *mk; |
| 860 | 860 | ||
| 861 | if(IS_SET(MODE_MOUSE)) { | 861 | if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) { |
| 862 | mousereport(e); | 862 | mousereport(e); |
| 863 | return; | 863 | return; |
| 864 | } | 864 | } |
| @@ -1090,7 +1090,7 @@ xsetsel(char *str) { | |||
| 1090 | 1090 | ||
| 1091 | void | 1091 | void |
| 1092 | brelease(XEvent *e) { | 1092 | brelease(XEvent *e) { |
| 1093 | if(IS_SET(MODE_MOUSE)) { | 1093 | if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) { |
| 1094 | mousereport(e); | 1094 | mousereport(e); |
| 1095 | return; | 1095 | return; |
| 1096 | } | 1096 | } |
| @@ -1113,7 +1113,7 @@ void | |||
| 1113 | bmotion(XEvent *e) { | 1113 | bmotion(XEvent *e) { |
| 1114 | int oldey, oldex, oldsby, oldsey; | 1114 | int oldey, oldex, oldsby, oldsey; |
| 1115 | 1115 | ||
| 1116 | if(IS_SET(MODE_MOUSE)) { | 1116 | if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) { |
| 1117 | mousereport(e); | 1117 | mousereport(e); |
| 1118 | return; | 1118 | return; |
| 1119 | } | 1119 | } |
