Tk Source Code

Check-in [07d632f4]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Fix [92e4081d74]: Undefined behavior while touchpad scrolling
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | core-9-0-branch
Files: files | file ages | folders
SHA3-256: 07d632f4ee7d9faebd47d0c3a8143962f31f1aa5c349831a357091ef33af84c6
User & Date: jan.nijtmans 2025-08-16 22:12:21.495
References
2025-08-16
22:15 Closed ticket [92e4081d]: Undefined behavior while touchpad scrolling plus 6 other changes artifact: c64bd65d user: jan.nijtmans
Context
2025-08-16
22:19
Update changes check-in: 886f6e66 user: jan.nijtmans tags: core-9-0-branch
22:12
Fix [92e4081d74]: Undefined behavior while touchpad scrolling check-in: 07d632f4 user: jan.nijtmans tags: core-9-0-branch
15:55
Proposed fix (slightly modified) for [92e4081d74]: Undefined behavior while touchpad scrolling Closed-Leaf check-in: a4410a92 user: jan.nijtmans tags: bug-92e4081d74
2025-08-15
22:23
Merge 8.6 check-in: d266a4ff user: jan.nijtmans tags: core-9-0-branch
Changes
Unified Diff Ignore Whitespace Patch
Changes to macosx/tkMacOSXMouseEvent.c.
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568

	    }
	} else {
	    Tk_UpdatePointer(target, global.x, global.y, state);
	}
    } else {
	static unsigned long scrollCounter = 0;
	int delta;
	CGFloat Delta;
	Bool deltaIsPrecise = [theEvent hasPreciseScrollingDeltas];
	XEvent xEvent = {0};
	xEvent.xbutton.x = win_x;
	xEvent.xbutton.y = win_y;
	xEvent.xbutton.x_root = global.x;
	xEvent.xbutton.y_root = global.y;
	xEvent.xany.send_event = false;
	xEvent.xany.display = Tk_Display(target);
	xEvent.xany.window = Tk_WindowId(target);
	if (deltaIsPrecise) {
	    int deltaX = [theEvent scrollingDeltaX];
	    int deltaY = [theEvent scrollingDeltaY];
	    delta = (deltaX << 16) | (deltaY & 0xffff);
	    if (delta != 0) {
		xEvent.type = TouchpadScroll;
		xEvent.xbutton.state = state;
		xEvent.xkey.keycode = delta;
		xEvent.xany.serial = scrollCounter++;
		Tk_QueueWindowEvent(&xEvent, TCL_QUEUE_TAIL);







|











|
|







541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568

	    }
	} else {
	    Tk_UpdatePointer(target, global.x, global.y, state);
	}
    } else {
	static unsigned long scrollCounter = 0;
	unsigned delta;
	CGFloat Delta;
	Bool deltaIsPrecise = [theEvent hasPreciseScrollingDeltas];
	XEvent xEvent = {0};
	xEvent.xbutton.x = win_x;
	xEvent.xbutton.y = win_y;
	xEvent.xbutton.x_root = global.x;
	xEvent.xbutton.y_root = global.y;
	xEvent.xany.send_event = false;
	xEvent.xany.display = Tk_Display(target);
	xEvent.xany.window = Tk_WindowId(target);
	if (deltaIsPrecise) {
	    unsigned deltaX = (unsigned)(int)[theEvent scrollingDeltaX];
	    unsigned deltaY = (unsigned)(int)[theEvent scrollingDeltaY];
	    delta = (deltaX << 16) | (deltaY & 0xffff);
	    if (delta != 0) {
		xEvent.type = TouchpadScroll;
		xEvent.xbutton.state = state;
		xEvent.xkey.keycode = delta;
		xEvent.xany.serial = scrollCounter++;
		Tk_QueueWindowEvent(&xEvent, TCL_QUEUE_TAIL);
Changes to win/tkWinX.c.
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
	    if ( mod != 0 || lastMod != 0) {
		/* High resolution. */
		event.x.type = TouchpadScroll;
		event.x.xany.send_event = -1;
		event.key.nbytes = 0;
		event.x.xkey.state = state;
		event.x.xany.serial = scrollCounter++;
		event.x.xkey.keycode = (unsigned int)(-(delta << 16));
	    } else {
		event.x.type = MouseWheelEvent;
		event.x.xany.send_event = -1;
		event.key.nbytes = 0;
		event.x.xkey.state |= ShiftMask;
		event.x.xkey.keycode = delta;
	    }







|







1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
	    if ( mod != 0 || lastMod != 0) {
		/* High resolution. */
		event.x.type = TouchpadScroll;
		event.x.xany.send_event = -1;
		event.key.nbytes = 0;
		event.x.xkey.state = state;
		event.x.xany.serial = scrollCounter++;
		event.x.xkey.keycode = -((unsigned int)delta << 16);
	    } else {
		event.x.type = MouseWheelEvent;
		event.x.xany.send_event = -1;
		event.key.nbytes = 0;
		event.x.xkey.state |= ShiftMask;
		event.x.xkey.keycode = delta;
	    }