From 945dc664d8f9044970e631db66d660057f912843 Mon Sep 17 00:00:00 2001
From: "louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13"
 <louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13>
Date: Fri, 10 Sep 2010 21:51:13 +0000
Subject: fix some ncurses crash. fixed #1817

---
 src/gui.py      | 17 ++++++++++-------
 src/keyboard.py |  5 ++++-
 src/window.py   | 51 ++++++++++++++++++---------------------------------
 3 files changed, 32 insertions(+), 41 deletions(-)

(limited to 'src')

diff --git a/src/gui.py b/src/gui.py
index 1317a2c7..87fd517d 100644
--- a/src/gui.py
+++ b/src/gui.py
@@ -371,7 +371,7 @@ class Gui(object):
         (from one of our contacts)
         """
         from common import debug
-        debug('message: %s\n' % message)
+#        debug('message: %s\n' % message)
         if message['type'] == 'groupchat':
             return None
         # Differentiate both type of messages, and call the appropriate handler.
@@ -406,7 +406,7 @@ class Gui(object):
         When receiving "normal" messages (from someone in our roster)
         """
         from common import debug
-        debug('MESSAGE: %s\n' % (presence))
+#        debug('MESSAGE: %s\n' % (presence))
 
         return
 
@@ -414,7 +414,7 @@ class Gui(object):
         """
         """
         from common import debug
-        debug('PRESEEEEEEEEENCE: %s\n' % (presence))
+#        debug('PRESEEEEEEEEENCE: %s\n' % (presence))
         return
 
     def on_roster_update(self, iq):
@@ -423,7 +423,7 @@ class Gui(object):
         after a roster request, etc
         """
         from common import debug
-        debug("UPDATE: %s\n" % (iq))
+#        debug("UPDATE: %s\n" % (iq))
         for subscriber in iq['roster']['items']:
             debug("subscriber: %s\n" % (iq['roster']['items'][subscriber]['subscription']))
 
@@ -446,8 +446,8 @@ class Gui(object):
             if char in list(self.key_func.keys()):
                 self.key_func[char]()
             else:
-                # if len(char) > 1:
-                #     continue    # ignore non-handled keyboard shortcuts
+                if not char or len(char) > 1:
+                    continue    # ignore non-handled keyboard shortcuts
                 self.window.do_command(char)
 
     def current_room(self):
@@ -585,7 +585,7 @@ class Gui(object):
         Display the error on the room window
         """
         from common import debug
-        debug('ERROR: %s\n' % error)
+#        debug('ERROR: %s\n' % error)
         room = self.get_room_by_name(room_name)
         if not room:
             room = self.get_room_by_name('Info')
@@ -644,6 +644,8 @@ class Gui(object):
         """
         Triggered whenever a message is received from a multi-user chat room.
         """
+        from common import debug
+#        debug('GROUPCHAT message: %s\n' % message)
         delay_tag = message.find('{urn:xmpp:delay}delay')
         if delay_tag is not None:
             delayed = True
@@ -673,6 +675,7 @@ class Gui(object):
             return
         body = message['body']
         subject = message['subject']
+#        debug('======== %s, %s, %s, %s====\n'% (nick_from, room_from, body, subject))
         if subject:
             if nick_from:
                 self.add_message_to_room(room, _("%(nick)s changed the subject to: %(subject)s") % {'nick':nick_from, 'subject':subject}, time=date)
diff --git a/src/keyboard.py b/src/keyboard.py
index 5f7411c1..265fa00b 100644
--- a/src/keyboard.py
+++ b/src/keyboard.py
@@ -61,7 +61,10 @@ def read_char(s):
     if 240 <= first:
         (code, c) = get_next_byte(s) # 4 bytes char
         char += c
-    return char.decode('utf-8')# return all the concatened byte objets, decoded
+    try:
+        return char.decode('utf-8') # return all the concatened byte objets, decoded
+    except UnicodeDecodeError:
+        return None
 
 if __name__ == '__main__':
     import curses
diff --git a/src/window.py b/src/window.py
index 5979fc6d..9e9a7431 100644
--- a/src/window.py
+++ b/src/window.py
@@ -93,15 +93,11 @@ class UserList(Win):
         g_lock.acquire()
         self.win.erase()
         y = 0
-        for user in sorted(users):#sorted(users, compare_user):
+        for user in sorted(users):
             role_col = self.color_role[user.role]
             show_col = self.color_show[user.show]
-            self.win.attron(curses.color_pair(show_col))
-            self.addnstr(y, 0, theme.CHAR_STATUS, 1)
-            self.win.attroff(curses.color_pair(show_col))
-            self.win.attron(curses.color_pair(role_col))
-            self.addnstr(y, 1, user.nick, self.width-1)
-            self.win.attroff(curses.color_pair(role_col))
+            self.addstr(y, 0, theme.CHAR_STATUS, curses.color_pair(show_col))
+            self.addnstr(y, 1, user.nick, self.width-1, curses.color_pair(role_col))
             y += 1
             if y == self.height:
                 break
@@ -128,12 +124,12 @@ class Topic(Win):
         g_lock.acquire()
         self.win.erase()
         if not jid:
-            self.addnstr(0, 0, topic[:self.width-1], curses.color_pair(theme.COLOR_TOPIC_BAR))
-            while True:
-                try:
-                    self.win.addch(' ', curses.color_pair(theme.COLOR_TOPIC_BAR))
-                except:
-                    break
+            self.addnstr(0, 0, topic[:self.width-1], self.width-1, curses.color_pair(theme.COLOR_TOPIC_BAR))
+            (y, x) = self.win.getyx()
+            remaining_size = self.width - x
+            if remaining_size:
+                self.addnstr(' '*remaining_size, remaining_size,
+                             curses.color_pair(theme.COLOR_INFORMATION_BAR))
         elif jid:
             room = jid.split('/')[0]
             nick = '/'.join(jid.split('/')[1:])
@@ -182,13 +178,12 @@ class RoomInfo(Win):
             except:             # end of line
                 break
         (y, x) = self.win.getyx()
-        self.addstr(y, x-1, '] '+ current.name, curses.color_pair(theme.COLOR_INFORMATION_BAR))
+        self.addnstr(y, x-1, '] '+ current.name, len(current.name)+2, curses.color_pair(theme.COLOR_INFORMATION_BAR))
         self.print_scroll_position(current)
-        while True:
-            try:
-                self.addstr(' ', curses.color_pair(theme.COLOR_INFORMATION_BAR))
-            except:
-                break
+        (y, x) = self.win.getyx()
+        remaining_size = self.width - x
+        self.addnstr(' '*remaining_size, remaining_size,
+                     curses.color_pair(theme.COLOR_INFORMATION_BAR))
         self.win.refresh()
         g_lock.release()
 
@@ -314,10 +309,7 @@ class TextWin(Win):
         if not colorized:
             if color:
                 self.win.attron(curses.color_pair(color))
-            try:
-                self.addstr(y, x, txt)
-            except:  # bug 1665
-                pass
+            self.addstr(y, x, txt)
             if color:
                 self.win.attroff(curses.color_pair(color))
 
@@ -330,9 +322,7 @@ class TextWin(Win):
                 }
             for word in txt.split():
                 if word in list(special_words.keys()):
-                    self.win.attron(curses.color_pair(special_words[word]))
-                    self.addstr(word)
-                    self.win.attroff(curses.color_pair(special_words[word]))
+                    self.addstr(word, curses.color_pair(special_words[word]))
                 elif word.startswith('(') and word.endswith(')'):
                     self.addstr('(', curses.color_pair(color))
                     self.addstr(word[1:-1], curses.color_pair(theme.COLOR_CURLYBRACKETED_WORD))
@@ -342,13 +332,8 @@ class TextWin(Win):
                 elif word.startswith('[') and word.endswith(']'):
                     self.addstr(word[1:-1], curses.color_pair(theme.COLOR_BRACKETED_WORD))
                 else:
-                    self.win.attron(curses.color_pair(color))
-                    self.addstr(word)
-                    self.win.attroff(curses.color_pair(color))
-                try:
-                    self.addstr(' ')
-                except:
-                    pass
+                    self.addstr(word, curses.color_pair(color))
+                self.addnstr(' ', 1)
 
     def write_nickname(self, nickname, color):
         """
-- 
cgit v1.2.3