--- button.c- 2025-05-16 01:19:08.000000000 +0200 +++ button.c 2025-07-26 13:32:13.723884409 +0200 @@ -2892,15 +2892,15 @@ static SelectUnit EvalSelectUnit(XtermWidget xw, - Time buttonDownTime, - SelectUnit defaultUnit, - unsigned int button) + XButtonEvent *event, + SelectUnit defaultUnit) { + Time buttonDownTime = event->time; TScreen *screen = TScreenOf(xw); SelectUnit result; int delta; - if (button != screen->lastButton) { + if (event->button != screen->lastButton) { delta = screen->multiClickTime + 1; } else if (screen->lastButtonUpTime == (Time) 0) { /* first time and once in a blue moon */ @@ -2922,6 +2922,11 @@ result = defaultUnit; } else #endif + if ((event->state & ShiftMask)) { + screen->numberOfClicks = 1; + screen->andPasteToo = !(event->state & ControlMask); + result = Select_WORD; + } else if (delta > screen->multiClickTime) { screen->numberOfClicks = 1; result = defaultUnit; @@ -2943,9 +2948,8 @@ if (SendMousePosition(xw, event)) return; screen->selectUnit = EvalSelectUnit(xw, - event->xbutton.time, - Select_CHAR, - event->xbutton.button); + &event->xbutton, + Select_CHAR); screen->replyToEmacs = False; #if OPT_READLINE @@ -3010,9 +3014,8 @@ CELL cell; screen->selectUnit = EvalSelectUnit(xw, - event->time, - Select_CHAR, - event->button); + event, + Select_CHAR); if (screen->numberOfClicks > 1) { PointToCELL(screen, event->y, event->x, &cell); screen->replyToEmacs = True; @@ -3179,6 +3182,10 @@ } } SelectSet(xw, event, params, num_params); + if (screen->andPasteToo) { + xtermGetSelection((Widget) xw, event->xbutton.time, params, num_params, NULL); + screen->andPasteToo = False; + } screen->eventMode = NORMAL; } @@ -3245,9 +3252,8 @@ || !(SCREEN_FLAG(screen, dclick3_deletes))) #endif screen->selectUnit = EvalSelectUnit(xw, - event->xbutton.time, - screen->selectUnit, - event->xbutton.button); + &event->xbutton, + screen->selectUnit); screen->replyToEmacs = False; #if OPT_READLINE --- ptyx.h- 2025-06-24 01:54:48.000000000 +0200 +++ ptyx.h 2025-07-26 13:24:07.273850979 +0200 @@ -3031,6 +3031,7 @@ Time selection_time; /* latest event timestamp */ Time lastButtonUpTime; unsigned lastButton; + Boolean andPasteToo; #define MAX_CUT_BUFFER 8 /* CUT_BUFFER0 to CUT_BUFFER7 */ #define MAX_SELECTIONS (MAX_SELECTION_CODES + MAX_CUT_BUFFER)