chiark / gitweb /
Correct handling of [RET] in files and menus.
authorSimon Tatham <anakin@pobox.com>
Thu, 7 Dec 2023 07:12:48 +0000 (07:12 +0000)
committerSimon Tatham <anakin@pobox.com>
Thu, 7 Dec 2023 07:12:48 +0000 (07:12 +0000)
(a) turned out curses was returning it as \n not \r
(b) also, in a file, it should go down a line _or exit_.

cursesclient.py

index 4e00e4f93fc5930536cae3ebe64c8b19f7fcea67..d51df5b4122dca315085e0db1582fcd221edfd0b 100644 (file)
@@ -228,7 +228,7 @@ class Menu:
         self.cc.activity_stack[-1] = activity
 
     def handle_key(self, ch):
-        if ch in {ord('q'), ord('Q'), 13}:
+        if ch in {ord('q'), ord('Q'), 10, 13}:
             return 'quit'
 
 class EscMenu(Menu):
@@ -282,8 +282,11 @@ class File:
             self.down_screen()
         elif ch in {ord('-'), ord('b'), ord('B'), curses.KEY_PPAGE}:
             self.up_screen()
-        elif ch in {13, curses.KEY_DOWN}:
+        elif ch == curses.KEY_DOWN:
             self.down_line()
+        elif ch in {10, 13}:
+            if not self.down_line():
+                return 'quit'
         elif ch in {curses.KEY_UP}:
             self.up_line()
         elif ch in {ord('0'), curses.KEY_HOME}:
@@ -372,19 +375,21 @@ class ObjectFile(File):
         self.cc.print_at(self.cc.scr_h - 1, 0, sl_rendered)
 
     def move_to(self, pos):
+        old_linepos = self.linepos
         self.linepos = pos
         self.linepos = max(self.linepos, self.cc.scr_h - 1)
         self.linepos = min(self.linepos, len(self.lines))
+        return self.linepos != old_linepos
 
     def move_by(self, delta):
-        self.move_to(self.linepos + delta)
-
-    def down_screen(self): self.move_by(self.cc.scr_h - 1)
-    def up_screen(self): self.move_by(-(self.cc.scr_h - 1))
-    def down_line(self): self.move_by(+1)
-    def up_line(self): self.move_by(-1)
-    def goto_top(self): self.move_to(0)
-    def goto_bottom(self): self.move_to(len(self.lines))
+        return self.move_to(self.linepos + delta)
+
+    def down_screen(self): return self.move_by(self.cc.scr_h - 1)
+    def up_screen(self): return self.move_by(-(self.cc.scr_h - 1))
+    def down_line(self): return self.move_by(+1)
+    def up_line(self): return self.move_by(-1)
+    def goto_top(self): return self.move_to(0)
+    def goto_bottom(self): return self.move_to(len(self.lines))
 
 class StatusFile(ObjectFile):
     def __init__(self, cc, feed, title):