Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 21 additions & 9 deletions Lib/idlelib/idle_test/test_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,27 +32,39 @@ def test_init(self):
class TestScrollEvent(unittest.TestCase):

def test_wheel_event(self):
# Fake widget class containing `yview` only.
# Fake widget class containing `xview` and `yview` only.
class _Widget:
def __init__(widget, *expected):
def __init__(widget, direction, *expected):
widget.state = state
widget.expected = expected
def xview(widget, *args):
self.assertEqual(widget.state&1, 1)
self.assertTupleEqual(widget.expected, args)
def yview(widget, *args):
self.assertEqual(widget.state&1, 0)
self.assertTupleEqual(widget.expected, args)
# Fake event class
class _Event:
pass
# (type, delta, num, amount)
tests = ((EventType.MouseWheel, 120, -1, -5),
(EventType.MouseWheel, -120, -1, 5),
(EventType.ButtonPress, -1, 4, -5),
(EventType.ButtonPress, -1, 5, 5))
# (type, delta, num, state, amount)
# If the first bit of state is set, scroll horizontally
tests = ((EventType.MouseWheel, 120, -1, 0, -5),
(EventType.MouseWheel, -120, -1, 0, 5),
(EventType.ButtonPress, -1, 4, 0, -5),
(EventType.ButtonPress, -1, 5, 0, 5),
(EventType.MouseWheel, 120, -1, 1, -5),
(EventType.MouseWheel, -120, -1, 1, 5),
(EventType.ButtonPress, -1, 4, 1, -5),
(EventType.ButtonPress, -1, 5, 1, 5))

event = _Event()
for ty, delta, num, amount in tests:
for ty, delta, num, state, amount in tests:
event.type = ty
event.delta = delta
event.num = num
res = tree.wheel_event(event, _Widget(SCROLL, amount, "units"))
event.state = state
res = tree.wheel_event(event,
_Widget(state, SCROLL, amount, "units"))
self.assertEqual(res, "break")


Expand Down
12 changes: 9 additions & 3 deletions Lib/idlelib/tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,19 +65,25 @@ def wheel_event(event, widget=None):
Macs use wheel down (delta = 1*n) to scroll up, so positive
delta means to scroll up on both systems.

On both Windows and X-11, if the first bit of event.state is
set, it means that we should scroll horizontally not vertically.

X-11 sends Control-Button-4,5 events instead.

The widget parameter is needed so browser label bindings can pass
the underlying canvas.

This function depends on widget.yview to not be overridden by
a subclass.
This function depends on widget.xview/widget.yview to not be
overridden by a subclass.
"""
up = {EventType.MouseWheel: event.delta > 0,
EventType.ButtonPress: event.num == 4}
lines = -5 if up[event.type] else 5
widget = event.widget if widget is None else widget
widget.yview(SCROLL, lines, 'units')
if event.state&1: # If the first bit is set, scroll horizontally
widget.xview(SCROLL, lines, 'units')
else:
widget.yview(SCROLL, lines, 'units')
return 'break'


Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Original file line number Diff line number Diff line change
Expand Up @@ -1942,6 +1942,7 @@ John Tromp
Diane Trout
Jason Trowbridge
Steven Troxler
Daniel Tsvetkov
Brent Tubbs
Anthony Tuininga
Erno Tukia
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed trackpad scrolling direction in :mod:`IDLE <idlelib>`
Loading