Skip to content

Commit 6f34e25

Browse files
fix(patch): cherry-pick ab6b229 to release/v0.16.0-preview.2-pr-13101 to patch version v0.16.0-preview.2 and create version 0.16.0-preview.3 (#13110)
Co-authored-by: Jacob Richman <jacob314@gmail.com>
1 parent dcc2a49 commit 6f34e25

5 files changed

Lines changed: 66 additions & 2 deletions

File tree

packages/cli/src/ui/contexts/MouseContext.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ export function MouseProvider({
100100
!handled &&
101101
event.name === 'move' &&
102102
event.col >= 0 &&
103-
event.row >= 0
103+
event.row >= 0 &&
104+
event.button === 'left'
104105
) {
105106
// Terminal apps only receive mouse move events when the mouse is down
106107
// so this always indicates a mouse drag that the user was expecting

packages/cli/src/ui/contexts/ScrollProvider.drag.test.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ describe('ScrollProvider Drag', () => {
113113
shift: false,
114114
ctrl: false,
115115
meta: false,
116+
button: 'left',
116117
});
117118
}
118119

@@ -125,6 +126,7 @@ describe('ScrollProvider Drag', () => {
125126
shift: false,
126127
ctrl: false,
127128
meta: false,
129+
button: 'left',
128130
});
129131
}
130132

@@ -142,6 +144,7 @@ describe('ScrollProvider Drag', () => {
142144
shift: false,
143145
ctrl: false,
144146
meta: false,
147+
button: 'left',
145148
});
146149
}
147150

@@ -159,6 +162,7 @@ describe('ScrollProvider Drag', () => {
159162
shift: false,
160163
ctrl: false,
161164
meta: false,
165+
button: 'left',
162166
});
163167
}
164168

@@ -172,6 +176,7 @@ describe('ScrollProvider Drag', () => {
172176
shift: false,
173177
ctrl: false,
174178
meta: false,
179+
button: 'none',
175180
});
176181
}
177182
expect(scrollBy).not.toHaveBeenCalled();
@@ -209,6 +214,7 @@ describe('ScrollProvider Drag', () => {
209214
shift: false,
210215
ctrl: false,
211216
meta: false,
217+
button: 'left',
212218
});
213219
}
214220

@@ -231,6 +237,7 @@ describe('ScrollProvider Drag', () => {
231237
shift: false,
232238
ctrl: false,
233239
meta: false,
240+
button: 'left',
234241
});
235242
}
236243

@@ -268,6 +275,7 @@ describe('ScrollProvider Drag', () => {
268275
shift: false,
269276
ctrl: false,
270277
meta: false,
278+
button: 'left',
271279
});
272280
}
273281

@@ -305,6 +313,7 @@ describe('ScrollProvider Drag', () => {
305313
shift: false,
306314
ctrl: false,
307315
meta: false,
316+
button: 'left',
308317
});
309318
}
310319

@@ -342,6 +351,7 @@ describe('ScrollProvider Drag', () => {
342351
shift: false,
343352
ctrl: false,
344353
meta: false,
354+
button: 'left',
345355
});
346356
}
347357

@@ -407,6 +417,7 @@ describe('ScrollProvider Drag', () => {
407417
shift: false,
408418
ctrl: false,
409419
meta: false,
420+
button: 'left',
410421
});
411422
}
412423

@@ -424,6 +435,7 @@ describe('ScrollProvider Drag', () => {
424435
shift: false,
425436
ctrl: false,
426437
meta: false,
438+
button: 'left',
427439
});
428440
}
429441
// Expect scrollTo to be called with target and duration 0

packages/cli/src/ui/contexts/ScrollProvider.test.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ describe('ScrollProvider', () => {
110110
shift: false,
111111
ctrl: false,
112112
meta: false,
113+
button: 'none',
113114
}) === true
114115
) {
115116
handled = true;
@@ -147,6 +148,7 @@ describe('ScrollProvider', () => {
147148
shift: false,
148149
ctrl: false,
149150
meta: false,
151+
button: 'none',
150152
}) === true
151153
) {
152154
handled = true;
@@ -193,6 +195,7 @@ describe('ScrollProvider', () => {
193195
shift: false,
194196
ctrl: false,
195197
meta: false,
198+
button: 'left',
196199
});
197200
}
198201

@@ -226,6 +229,7 @@ describe('ScrollProvider', () => {
226229
shift: false,
227230
ctrl: false,
228231
meta: false,
232+
button: 'left',
229233
});
230234
}
231235

@@ -258,6 +262,7 @@ describe('ScrollProvider', () => {
258262
shift: false,
259263
ctrl: false,
260264
meta: false,
265+
button: 'none',
261266
};
262267
for (const callback of mockUseMouseCallbacks) {
263268
callback(mouseEvent);
@@ -303,6 +308,7 @@ describe('ScrollProvider', () => {
303308
shift: false,
304309
ctrl: false,
305310
meta: false,
311+
button: 'none',
306312
});
307313
callback({
308314
name: 'scroll-down',
@@ -311,6 +317,7 @@ describe('ScrollProvider', () => {
311317
shift: false,
312318
ctrl: false,
313319
meta: false,
320+
button: 'none',
314321
});
315322
callback({
316323
name: 'scroll-up',
@@ -319,6 +326,7 @@ describe('ScrollProvider', () => {
319326
shift: false,
320327
ctrl: false,
321328
meta: false,
329+
button: 'none',
322330
});
323331
}
324332

@@ -358,6 +366,7 @@ describe('ScrollProvider', () => {
358366
shift: false,
359367
ctrl: false,
360368
meta: false,
369+
button: 'none',
361370
});
362371
callback({
363372
name: 'scroll-down',
@@ -366,6 +375,7 @@ describe('ScrollProvider', () => {
366375
shift: false,
367376
ctrl: false,
368377
meta: false,
378+
button: 'none',
369379
});
370380
callback({
371381
name: 'scroll-down',
@@ -374,6 +384,7 @@ describe('ScrollProvider', () => {
374384
shift: false,
375385
ctrl: false,
376386
meta: false,
387+
button: 'none',
377388
});
378389
}
379390

@@ -417,6 +428,7 @@ describe('ScrollProvider', () => {
417428
shift: false,
418429
ctrl: false,
419430
meta: false,
431+
button: 'left',
420432
});
421433
}
422434

@@ -429,6 +441,7 @@ describe('ScrollProvider', () => {
429441
shift: false,
430442
ctrl: false,
431443
meta: false,
444+
button: 'left',
432445
});
433446
}
434447

@@ -441,6 +454,7 @@ describe('ScrollProvider', () => {
441454
shift: false,
442455
ctrl: false,
443456
meta: false,
457+
button: 'left',
444458
});
445459
}
446460

@@ -475,6 +489,7 @@ describe('ScrollProvider', () => {
475489
shift: false,
476490
ctrl: false,
477491
meta: false,
492+
button: 'left',
478493
});
479494
}
480495

@@ -487,6 +502,7 @@ describe('ScrollProvider', () => {
487502
shift: false,
488503
ctrl: false,
489504
meta: false,
505+
button: 'left',
490506
});
491507
}
492508

@@ -498,6 +514,7 @@ describe('ScrollProvider', () => {
498514
shift: false,
499515
ctrl: false,
500516
meta: false,
517+
button: 'left',
501518
});
502519
}
503520

packages/cli/src/ui/utils/mouse.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ describe('mouse utils', () => {
2727
shift: false,
2828
meta: false,
2929
ctrl: false,
30+
button: 'left',
3031
});
3132
expect(result!.length).toBe(input.length);
3233
});
@@ -43,6 +44,7 @@ describe('mouse utils', () => {
4344
shift: false,
4445
meta: false,
4546
ctrl: false,
47+
button: 'left',
4648
});
4749
});
4850

@@ -58,6 +60,7 @@ describe('mouse utils', () => {
5860
shift: true,
5961
meta: true,
6062
ctrl: true,
63+
button: 'left',
6164
});
6265
});
6366

@@ -67,6 +70,7 @@ describe('mouse utils', () => {
6770
const result = parseSGRMouseEvent(input);
6871
expect(result).not.toBeNull();
6972
expect(result!.event.name).toBe('move');
73+
expect(result!.event.button).toBe('left');
7074
});
7175

7276
it('parses SGR scroll events', () => {
@@ -100,6 +104,7 @@ describe('mouse utils', () => {
100104
shift: false,
101105
meta: false,
102106
ctrl: false,
107+
button: 'left',
103108
});
104109
expect(result!.length).toBe(6);
105110
});

packages/cli/src/ui/utils/mouse.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export interface MouseEvent {
3333
shift: boolean;
3434
meta: boolean;
3535
ctrl: boolean;
36+
button: 'left' | 'middle' | 'right' | 'none';
3637
}
3738

3839
export type MouseHandler = (event: MouseEvent) => void | boolean;
@@ -71,6 +72,20 @@ export function getMouseEventName(
7172
}
7273
}
7374

75+
function getButtonFromCode(code: number): MouseEvent['button'] {
76+
const button = code & 3;
77+
switch (button) {
78+
case 0:
79+
return 'left';
80+
case 1:
81+
return 'middle';
82+
case 2:
83+
return 'right';
84+
default:
85+
return 'none';
86+
}
87+
}
88+
7489
export function parseSGRMouseEvent(
7590
buffer: string,
7691
): { event: MouseEvent; length: number } | null {
@@ -98,6 +113,7 @@ export function parseSGRMouseEvent(
98113
shift,
99114
col,
100115
row,
116+
button: getButtonFromCode(buttonCode),
101117
},
102118
length: match[0].length,
103119
};
@@ -165,8 +181,21 @@ export function parseX11MouseEvent(
165181
}
166182

167183
if (name) {
184+
let button = getButtonFromCode(b);
185+
if (name === 'left-release' && button === 'none') {
186+
button = 'left';
187+
}
188+
168189
return {
169-
event: { name, ctrl, meta, shift, col, row },
190+
event: {
191+
name,
192+
ctrl,
193+
meta,
194+
shift,
195+
col,
196+
row,
197+
button,
198+
},
170199
length: match[0].length,
171200
};
172201
}

0 commit comments

Comments
 (0)