aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiltjo Posthuma <hiltjo@codemadness.org>2014-05-12 14:39:37 +0200
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2014-05-14 07:48:25 +0200
commitcf890e5bf06a65a35fe195aa1ef8ae3e1eb55f51 (patch)
treeb6f946cb82d363cd6db0beb7ecf77e17f2928a20
parentbdb850a16a6d7a2d12b2bd5500a3b7d70290a74a (diff)
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.h6
-rw-r--r--st.c8
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 };
*/
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
--- 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;
}