From d27563742e614929eba6a0ded7ab56a042050694 Mon Sep 17 00:00:00 2001 From: "n loewen (aider)" Date: Mon, 5 May 2025 08:57:34 +0100 Subject: [PATCH] fix: Improve divider dragging responsiveness and mouse handling --- git_time_machine.py | 50 ++++++++++++++------------------------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/git_time_machine.py b/git_time_machine.py index 8c5121c..cbb6283 100644 --- a/git_time_machine.py +++ b/git_time_machine.py @@ -99,53 +99,33 @@ def main(stdscr, filename): except curses.error: pass - # Force a mouse position check every loop iteration while dragging + # Set timeout for more responsive updates during dragging + if dragging_divider: + stdscr.timeout(1) # Very short timeout for responsive updates + else: + stdscr.timeout(-1) # Blocking mode when not dragging + + # Handle divider dragging - check mouse position every iteration when dragging if dragging_divider: - # Set a very short timeout to make the UI responsive - stdscr.timeout(1) try: + # Get current mouse position + curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION) _, mx, my, _, bstate = curses.getmouse() - # Always update divider position while dragging + # Update divider position based on mouse x position min_col = 10 max_col = width - 20 # leave space for right pane divider_col = max(min_col, min(mx, max_col)) - # Check for mouse button release - if bstate & curses.BUTTON1_RELEASED or not (bstate & curses.BUTTON1_PRESSED): + # Check if mouse button has been released + if not (bstate & curses.BUTTON1_PRESSED): dragging_divider = False - stdscr.timeout(-1) # Reset to blocking mode when done dragging except curses.error: - # If we can't get mouse state, try again on next iteration pass -# -# # Mouse click changes focus -# if key == curses.KEY_MOUSE: -# try: -# _, mx, my, _, bstate = curses.getmouse() -# -# if bstate & curses.BUTTON1_PRESSED: -# if dragging_divider: -# # Update divider while dragging -# min_col = 10 -# max_col = width - 20 # leave space for right pane -# divider_col = max(min_col, min(mx, max_col)) -# elif mx == divider_col: -# dragging_divider = True -# -# elif bstate & curses.BUTTON1_RELEASED: -# dragging_divider = False -# -# elif bstate & curses.BUTTON1_CLICKED: -# focus = "left" if mx < divider_col else "right" -# -# except curses.error: -# pass -# -# -# elif key in [ord('q'), 27]: -# break + # Exit on 'q' or ESC + if key in [ord('q'), 27]: + break # Left pane movement elif focus == "left":