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>
This commit is contained in:
Hiltjo Posthuma 2014-05-12 14:39:37 +02:00 committed by Roberto E. Vargas Caballero
parent bdb850a16a
commit cf890e5bf0
2 changed files with 9 additions and 5 deletions

View File

@ -154,6 +154,11 @@ static KeySym mappedkeys[] = { -1 };
*/ */
static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; 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[] = { static Key key[] = {
/* keysym mask string appkey appcursor crlf */ /* keysym mask string appkey appcursor crlf */
{ XK_KP_Home, ShiftMask, "\033[2J", 0, -1, 0}, { XK_KP_Home, ShiftMask, "\033[2J", 0, -1, 0},
@ -357,7 +362,6 @@ static Key key[] = {
* ButtonRelease and MotionNotify. * ButtonRelease and MotionNotify.
* If no match is found, regular selection is used. * If no match is found, regular selection is used.
*/ */
static uint selmasks[] = { static uint selmasks[] = {
[SEL_RECTANGULAR] = Mod1Mask, [SEL_RECTANGULAR] = Mod1Mask,
}; };

8
st.c
View File

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