home · contact · privacy
Merge branch 'master' into 7drl2016
[plomrogue] / client / window_management.py
index 141cc656b6e92fa81427b704f9c87e006eabd570..9d787375fae78b383e9dd219f9227495f7c93389 100644 (file)
@@ -1,3 +1,8 @@
+# This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3
+# or any later version. For details on its copyright, license, and warranties,
+# see the file NOTICE in the root directory of the PlomRogue source package.
+
+
 import curses
 import types
 
@@ -13,10 +18,11 @@ screen_size = [0,0]
 
 
 class Window:
-    def __init__(self, title, draw_function, size):
+    def __init__(self, title, draw_function, size, draw_scroll_hints):
         self.title = title
         self.draw = types.MethodType(draw_function, self)
         self.size = size
+        self.draw_scroll_hints = draw_scroll_hints
 
 
 def set_windows():
@@ -90,9 +96,12 @@ def set_windows():
     curses.endwin()
     stdscr = curses.initscr()
     screen_size = stdscr.getmaxyx()
+    global windows
+    windows = []
     for config in windows_config:
         size = size_window(config["config"])
-        window = Window(config["title"], config["func"], size)
+        window = Window(config["title"], config["func"], size,
+                        config["scroll_hints"])
         windows.append(window)
         place_window(window)
     redraw_windows = True
@@ -101,14 +110,20 @@ def set_windows():
 def draw_screen():
 
     def healthy_addch(y, x, char, attr=0):
-        """Workaround for <http://stackoverflow.com/questions/7063128/>."""
+        """Wrap Python curses' addch() weirdnesses into sane interface.
+
+        Works around <http://stackoverflow.com/questions/7063128/> with
+        <https://stackoverflow.com/a/26797300> and enforces char to be a byte
+        instead of a single-char string.
+        """
         if y == screen_size[0] - 1 and x == screen_size[1] - 1:
             char_before = stdscr.inch(y, x - 1)
-            stdscr.addch(y, x - 1, char, attr)
+            stdscr.addch(y, x - 1, char.encode(), attr)
             stdscr.insstr(y, x - 1, " ")
-            stdscr.addch(y, x - 1, char_before)
+            stdscr.addch(y, x - 1,
+                         char_before & 0xFF, char_before & curses.A_ATTRIBUTES)
         else:
-            stdscr.addch(y, x, char, attr)
+            stdscr.addch(y, x, char.encode(), attr)
 
     def draw_window_border_lines():
         for win in windows:
@@ -204,7 +219,8 @@ def draw_screen():
         for win in windows:
             offset, winmap_size, winmap = win.draw()
             draw_winmap()
-            draw_scroll_hints()
+            if win.draw_scroll_hints:
+                draw_scroll_hints()
 
     stdscr.erase()
     draw_window_border_lines()