Author: andar

Revision: 5679

Log:
        Fix terminal resizing support

Diff:
Modified: trunk/deluge/ui/console/screen.py
===================================================================
--- trunk/deluge/ui/console/screen.py   2009-08-19 02:14:29 UTC (rev 5678)
+++ trunk/deluge/ui/console/screen.py   2009-08-19 22:13:58 UTC (rev 5679)
@@ -35,6 +35,14 @@
 
 import curses
 import colors
+try:
+    import signal
+    from fcntl import ioctl
+    import termios
+    import struct
+except:
+    pass
+
 from deluge.log import LOG as log
 from twisted.internet import reactor
 
@@ -95,9 +103,23 @@
         # The offset to display lines
         self.display_lines_offset = 0
 
-        # Refresh the screen to display everything right away
+        # Keep track of the screen size
+        self.rows, self.cols = self.stdscr.getmaxyx()
+        try:
+            signal.signal(signal.SIGWINCH, self.on_resize)
+        except Exception, e:
+            log.debug("Unable to catch SIGWINCH signal!")
+
+        # Do a refresh right away to draw the screen
         self.refresh()
 
+    def on_resize(self, *args):
+        log.debug("on_resize_from_signal")
+        # Get the new rows and cols value
+        self.rows, self.cols = struct.unpack("hhhh", ioctl(0, 
termios.TIOCGWINSZ ,"\000"*8))[0:2]
+        curses.resizeterm(self.rows, self.cols)
+        self.refresh()
+
     def connectionLost(self, reason):
         self.close()
 
@@ -124,7 +146,6 @@
         :param text: str, the text to show
         """
 
-        rows, cols = self.stdscr.getmaxyx()
         def get_line_chunks(line):
             """
             Returns a list of 2-tuples (color string, text)
@@ -160,13 +181,13 @@
                 log.error("Passed a bad colored string..")
                 line_length = len(line)
 
-            if line_length >= (cols - 1):
+            if line_length >= (self.cols - 1):
                 s = ""
                 # The length of the text without the color tags
                 s_len = 0
                 # We need to split this over multiple lines
                 for chunk in get_line_chunks(line):
-                    if (len(chunk[1]) + s_len) < (cols - 1):
+                    if (len(chunk[1]) + s_len) < (self.cols - 1):
                         # This chunk plus the current string in 's' isn't over
                         # the maximum width, so just append the color tag and 
text
                         s += chunk[0] + chunk[1]
@@ -175,7 +196,7 @@
                         # The chunk plus the current string in 's' is too long.
                         # We need to take as much of the chunk and put it into 
's'
                         # with the color tag.
-                        remain = (cols - 1) - s_len
+                        remain = (self.cols - 1) - s_len
                         s += chunk[0] + chunk[1][:remain]
                         # We append the line since it's full
                         self.lines.append(s)
@@ -201,7 +222,6 @@
         :param row: int, the row number to write the string
 
         """
-        rows, cols = self.stdscr.getmaxyx()
         col = 0
         try:
             parsed = colors.parse_color_string(string)
@@ -212,7 +232,7 @@
         for index, (color, s) in enumerate(parsed):
             if index + 1 == len(parsed):
                 # This is the last string so lets append some " " to it
-                s += " " * (cols - (col + len(s)) - 1)
+                s += " " * (self.cols - (col + len(s)) - 1)
             self.stdscr.addstr(row, col, s, color)
             col += len(s)
 
@@ -223,14 +243,13 @@
         attribute and the status bars.
         """
         self.stdscr.clear()
-        rows, cols = self.stdscr.getmaxyx()
 
         # Update the status bars
         self.add_string(0, self.topbar)
-        self.add_string(rows - 2, self.bottombar)
+        self.add_string(self.rows - 2, self.bottombar)
 
         # The number of rows minus the status bars and the input line
-        available_lines = rows - 3
+        available_lines = self.rows - 3
         # If the amount of lines exceeds the number of rows, we need to figure 
out
         # which ones to display based on the offset
         if len(self.lines) > available_lines:
@@ -248,10 +267,11 @@
             self.add_string(index + 1, line)
 
         # Add the input string
-        self.add_string(rows - 1, self.input)
+        self.add_string(self.rows - 1, self.input)
 
         # Move the cursor
-        self.stdscr.move(rows - 1, self.input_cursor)
+        self.stdscr.move(self.rows - 1, self.input_cursor)
+        self.stdscr.redrawwin()
         self.stdscr.refresh()
 
     def doRead(self):
@@ -266,7 +286,6 @@
             reactor.stop()
 
     def _doRead(self):
-        rows, cols = self.stdscr.getmaxyx()
         # Read the character
         c = self.stdscr.getch()
 
@@ -339,14 +358,14 @@
 
         # Scrolling through buffer
         elif c == curses.KEY_PPAGE:
-            self.display_lines_offset += rows - 3
+            self.display_lines_offset += self.rows - 3
             # We substract 3 for the unavailable lines and 1 extra due to 
len(self.lines)
-            if self.display_lines_offset > (len(self.lines) - 4 - rows):
-                self.display_lines_offset = len(self.lines) - 4 - rows
+            if self.display_lines_offset > (len(self.lines) - 4 - self.rows):
+                self.display_lines_offset = len(self.lines) - 4 - self.rows
 
             self.refresh()
         elif c == curses.KEY_NPAGE:
-            self.display_lines_offset -= rows - 3
+            self.display_lines_offset -= self.rows - 3
             if self.display_lines_offset < 0:
                 self.display_lines_offset = 0
             self.refresh()
@@ -373,8 +392,8 @@
             self.tab_count = 0
 
         # Update the input string on the screen
-        self.add_string(rows - 1, self.input)
-        self.stdscr.move(rows - 1, self.input_cursor)
+        self.add_string(self.rows - 1, self.input)
+        self.stdscr.move(self.rows - 1, self.input_cursor)
         self.stdscr.refresh()
 
     def close(self):



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"deluge-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/deluge-commit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to