Skip to content

Commit c79754e

Browse files
committed
Fix for older versions of curses
1 parent 6165fdc commit c79754e

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

asciimatics/event.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class MouseEvent(Event):
4646
LEFT_CLICK = 1
4747
RIGHT_CLICK = 2
4848
DOUBLE_CLICK = 4
49+
# Note: older versions of curses (e.g. in pypy) do not support up/down
4950
SCROLL_UP = 8
5051
SCROLL_DOWN = 16
5152

asciimatics/screen.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2599,10 +2599,11 @@ def get_event(self) -> Optional[Event]:
25992599
buttons |= MouseEvent.LEFT_CLICK
26002600
if (bstate & curses.BUTTON3_PRESSED != 0 or bstate & curses.BUTTON3_CLICKED != 0):
26012601
buttons |= MouseEvent.RIGHT_CLICK
2602-
if (bstate & curses.BUTTON4_PRESSED != 0 or bstate & curses.BUTTON4_CLICKED != 0):
2603-
buttons |= MouseEvent.SCROLL_UP
2604-
if (bstate & curses.BUTTON5_PRESSED != 0 or bstate & curses.BUTTON5_CLICKED != 0):
2605-
buttons |= MouseEvent.SCROLL_DOWN
2602+
if hasattr(curses, "BUTTON5_PRESSED"):
2603+
if (bstate & curses.BUTTON4_PRESSED != 0 or bstate & curses.BUTTON4_CLICKED != 0):
2604+
buttons |= MouseEvent.SCROLL_UP
2605+
if (bstate & curses.BUTTON5_PRESSED != 0 or bstate & curses.BUTTON5_CLICKED != 0):
2606+
buttons |= MouseEvent.SCROLL_DOWN
26062607
if bstate & curses.BUTTON1_DOUBLE_CLICKED != 0:
26072608
buttons |= MouseEvent.DOUBLE_CLICK
26082609
return MouseEvent(x, y, buttons)

tests/test_screen.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -711,10 +711,11 @@ def _inject_mouse(screen, x, y, button):
711711
bstate |= curses.BUTTON3_CLICKED
712712
if button & MouseEvent.DOUBLE_CLICK != 0:
713713
bstate |= curses.BUTTON1_DOUBLE_CLICKED
714-
if button & MouseEvent.SCROLL_UP != 0:
715-
bstate |= curses.BUTTON4_CLICKED
716-
if button & MouseEvent.SCROLL_DOWN != 0:
717-
bstate |= curses.BUTTON5_CLICKED
714+
if hasattr(curses, "BUTTON5_PRESSED"):
715+
if button & MouseEvent.SCROLL_UP != 0:
716+
bstate |= curses.BUTTON4_CLICKED
717+
if button & MouseEvent.SCROLL_DOWN != 0:
718+
bstate |= curses.BUTTON5_CLICKED
718719
curses.ungetmouse(0, x, y, 0, bstate)
719720

720721
def test_key_input(self):
@@ -791,21 +792,23 @@ def internal_checks(screen):
791792
self.assertEqual(ev.buttons, MouseEvent.DOUBLE_CLICK)
792793
self.assertIsNone(screen.get_event())
793794

794-
# Check scroll up
795-
self._inject_mouse(screen, 1, 1, MouseEvent.SCROLL_UP)
796-
ev = screen.get_event()
797-
self.assertEqual(ev.x, 1)
798-
self.assertEqual(ev.y, 1)
799-
self.assertEqual(ev.buttons, MouseEvent.SCROLL_UP)
800-
self.assertIsNone(screen.get_event())
795+
# Not all curses versions support scrolling...
796+
if hasattr(curses, "BUTTON5_PRESSED"):
797+
# Check scroll up
798+
self._inject_mouse(screen, 1, 1, MouseEvent.SCROLL_UP)
799+
ev = screen.get_event()
800+
self.assertEqual(ev.x, 1)
801+
self.assertEqual(ev.y, 1)
802+
self.assertEqual(ev.buttons, MouseEvent.SCROLL_UP)
803+
self.assertIsNone(screen.get_event())
801804

802-
# Check scroll up
803-
self._inject_mouse(screen, 1, 1, MouseEvent.SCROLL_DOWN)
804-
ev = screen.get_event()
805-
self.assertEqual(ev.x, 1)
806-
self.assertEqual(ev.y, 1)
807-
self.assertEqual(ev.buttons, MouseEvent.SCROLL_DOWN)
808-
self.assertIsNone(screen.get_event())
805+
# Check scroll up
806+
self._inject_mouse(screen, 1, 1, MouseEvent.SCROLL_DOWN)
807+
ev = screen.get_event()
808+
self.assertEqual(ev.x, 1)
809+
self.assertEqual(ev.y, 1)
810+
self.assertEqual(ev.buttons, MouseEvent.SCROLL_DOWN)
811+
self.assertIsNone(screen.get_event())
809812

810813
Screen.wrapper(internal_checks, height=15)
811814

0 commit comments

Comments
 (0)