[pyrepl-checkins] r56178 - pyrepl/trunk/pyrepl/pyrepl
arigo at codespeak.net
arigo at codespeak.net
Mon Jun 30 11:16:41 CEST 2008
Author: arigo
Date: Mon Jun 30 11:16:39 2008
New Revision: 56178
Modified:
pyrepl/trunk/pyrepl/pyrepl/unix_console.py
Log:
Experimental: only hide the cursor when doing non-minor updates. (A
minor update is one that is done by inserting or replacing a single
character.) This was reached by tweaking stuff until it looks
reasonable on a high-latency connection. There is still room for
improvement (e.g. deleting chars in the middle of a line makes the
whole end of the line blink) but I'm already mostly happy with this.
Modified: pyrepl/trunk/pyrepl/pyrepl/unix_console.py
==============================================================================
--- pyrepl/trunk/pyrepl/pyrepl/unix_console.py (original)
+++ pyrepl/trunk/pyrepl/pyrepl/unix_console.py Mon Jun 30 11:16:39 2008
@@ -151,16 +151,17 @@
self.event_queue = unix_eventqueue.EventQueue(self.input_fd)
self.partial_char = ''
+ self.cursor_visible = 1
def change_encoding(self, encoding):
self.encoding = encoding
def refresh(self, screen, (cx, cy)):
# this function is still too long (over 90 lines)
- self.__maybe_write_code(self._civis)
if not self.__gone_tall:
while len(self.screen) < min(len(screen), self.height):
+ self.__hide_cursor()
self.__move(0, len(self.screen) - 1)
self.__write("\n")
self.__posxy = 0, len(self.screen)
@@ -203,6 +204,7 @@
# use hardware scrolling if we have it.
if old_offset > offset and self._ri:
+ self.__hide_cursor()
self.__write_code(self._cup, 0, 0)
self.__posxy = 0, old_offset
for i in range(old_offset - offset):
@@ -210,6 +212,7 @@
oldscr.pop(-1)
oldscr.insert(0, "")
elif old_offset < offset and self._ind:
+ self.__hide_cursor()
self.__write_code(self._cup, self.height - 1, 0)
self.__posxy = 0, old_offset + self.height - 1
for i in range(offset - old_offset):
@@ -223,22 +226,23 @@
oldscr,
newscr):
if oldline != newline:
- self.write_changed_line(y, oldline, newline, px)
+ self.__write_changed_line(y, oldline, newline, px)
y = len(newscr)
while y < len(oldscr):
+ self.__hide_cursor()
self.__move(0, y)
self.__posxy = 0, y
self.__write_code(self._el)
y += 1
- self.__maybe_write_code(self._cnorm)
+ self.__show_cursor()
- self.flushoutput()
self.screen = screen
self.move_cursor(cx, cy)
+ self.flushoutput()
- def write_changed_line(self, y, oldline, newline, px):
+ def __write_changed_line(self, y, oldline, newline, px):
# this is frustrating; there's no reason to test (say)
# self.dch1 inside the loop -- but alternative ways of
# structuring this function are equally painful (I'm trying to
@@ -262,6 +266,7 @@
elif (self.dch1 and self.ich1 and len(newline) == self.width
and x < len(newline) - 2
and newline[x+1:-1] == oldline[x:-2]):
+ self.__hide_cursor()
self.__move(self.width - 2, y)
self.__posxy = self.width - 2, y
self.__write_code(self.dch1)
@@ -270,12 +275,12 @@
self.__write(newline[x])
self.__posxy = x + 1, y
else:
+ self.__hide_cursor()
self.__move(x, y)
if len(oldline) > len(newline):
self.__write_code(self._el)
self.__write(newline[x:])
self.__posxy = len(newline), y
- self.flushoutput()
def __write(self, text):
self.__buffer.append((text, 0))
@@ -414,9 +419,19 @@
def set_cursor_vis(self, vis):
if vis:
- self.__maybe_write_code(self._cnorm)
+ self.__show_cursor()
else:
+ self.__hide_cursor()
+
+ def __hide_cursor(self):
+ if self.cursor_visible:
self.__maybe_write_code(self._civis)
+ self.cursor_visible = 0
+
+ def __show_cursor(self):
+ if not self.cursor_visible:
+ self.__maybe_write_code(self._cnorm)
+ self.cursor_visible = 1
def repaint_prep(self):
if not self.__gone_tall:
More information about the pyrepl-checkins
mailing list