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;
/* 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,
};

8
st.c
View file

@ -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;
}