--- button.c- 2025-12-04 10:22:53.000000000 +0100 +++ button.c 2025-12-24 22:40:03.707895659 +0100 @@ -2944,15 +2944,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 */ @@ -2974,6 +2974,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; @@ -2996,9 +3001,8 @@ return; screen->selectUnit = EvalSelectUnit(xw, - event->xbutton.time, - Select_CHAR, - event->xbutton.button); + &event->xbutton, + Select_CHAR); screen->replyToEmacs = False; #if OPT_READLINE @@ -3066,9 +3070,8 @@ return; 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; @@ -3235,6 +3238,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; } @@ -3301,9 +3308,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-12-19 02:15:26.000000000 +0100 +++ ptyx.h 2025-12-24 22:40:03.710895659 +0100 @@ -3054,6 +3054,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)