From 1a058c3579fe31e82f5370ff6fee629375dbbb2b Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Sun, 13 Feb 2011 22:26:05 +0100 Subject: Make it possible to define bold in the theme files --- data/themes/dark | 2 +- data/themes/poezio | 2 +- src/common.py | 5 ++ src/theme.py | 4 +- src/windows.py | 141 +++++++++++++++++++++++++++-------------------------- 5 files changed, 80 insertions(+), 74 deletions(-) diff --git a/data/themes/dark b/data/themes/dark index a5a09af1..1fa9ed00 100644 --- a/data/themes/dark +++ b/data/themes/dark @@ -37,7 +37,7 @@ COLOR_TAB_PRIVATE = 9 # Nickname colors LIST_COLOR_NICKNAMES = [ - 1, 2, 3, 4, 5, 6 + 1, 2, 3, 4, 5, 6, -2, -4, -5, -6 ] COLOR_OWN_NICK = 7 diff --git a/data/themes/poezio b/data/themes/poezio index 1cd49aff..c5556280 100644 --- a/data/themes/poezio +++ b/data/themes/poezio @@ -40,7 +40,7 @@ COLOR_TAB_PRIVATE = 28 # Nickname colors LIST_COLOR_NICKNAMES = [ - 1, 2, 3, 4, 5, 6, + 1, 2, 3, 4, 5, 6, -2, -4, -5, -6 ] COLOR_OWN_NICK = 7 diff --git a/src/common.py b/src/common.py index f910892d..0940757e 100644 --- a/src/common.py +++ b/src/common.py @@ -205,3 +205,8 @@ def shell_split(string): return ret except ValueError: return string.split() + +def curses_color_pair(color): + if color < 0: + return curses.color_pair(-color) | curses.A_BOLD + return curses.color_pair(color) diff --git a/src/theme.py b/src/theme.py index 830284bb..42bc3aed 100644 --- a/src/theme.py +++ b/src/theme.py @@ -70,7 +70,7 @@ COLOR_TAB_PRIVATE = 28 # Nickname colors LIST_COLOR_NICKNAMES = [ - 1, 2, 3, 4, 5, 6, + 1, 2, 3, 4, 5, 6, -2, -4, -5, -6 ] COLOR_OWN_NICK = 7 @@ -87,7 +87,7 @@ COLOR_STATUS_ONLINE = 41 COLOR_INFORMATION_BAR = 42 COLOR_TOPIC_BAR = 42 COLOR_PRIVATE_ROOM_BAR = 28 -COLOR_SCROLLABLE_NUMBER = 39 +COLOR_SCROLLABLE_NUMBER = -39 COLOR_SELECTED_ROW = 42 COLOR_PRIVATE_NAME = 42 COLOR_CONVERSATION_NAME = 42 diff --git a/src/windows.py b/src/windows.py index dfb75006..3f23341c 100644 --- a/src/windows.py +++ b/src/windows.py @@ -47,6 +47,7 @@ from tabs import MIN_WIDTH, MIN_HEIGHT from sleekxmpp.xmlstream.stanzabase import JID import theme +import common g_lock = Lock() @@ -89,7 +90,7 @@ class Win(object): """ (y, x) = self._win.getyx() size = self.width-x - self.addnstr(' '*size, size, curses.color_pair(color)) + self.addnstr(' '*size, size, common.curses_color_pair(color)) class UserList(Win): def __init__(self): @@ -118,7 +119,7 @@ class UserList(Win): self.pos = 0 def draw_plus(self, y): - self.addstr(y, self.width-2, '++', curses.color_pair(theme.COLOR_MORE_INDICATOR)) + self.addstr(y, self.width-2, '++', common.curses_color_pair(theme.COLOR_MORE_INDICATOR)) def refresh(self, users): with g_lock: @@ -136,8 +137,8 @@ class UserList(Win): show_col = theme.COLOR_STATUS_NONE else: show_col = self.color_show[user.show] - self.addstr(y, 0, theme.CHAR_STATUS, curses.color_pair(show_col)) - self.addstr(y, 1, user.nick[:self.width-2], curses.color_pair(role_col)) + self.addstr(y, 0, theme.CHAR_STATUS, common.curses_color_pair(show_col)) + self.addstr(y, 1, user.nick[:self.width-2], common.curses_color_pair(role_col)) y += 1 if y == self.height: break @@ -150,9 +151,9 @@ class UserList(Win): def resize(self, height, width, y, x, stdscr): self._resize(height, width, y, x, stdscr) - self._win.attron(curses.color_pair(theme.COLOR_VERTICAL_SEPARATOR)) + self._win.attron(common.curses_color_pair(theme.COLOR_VERTICAL_SEPARATOR)) self._win.vline(0, 0, curses.ACS_VLINE, self.height) - self._win.attroff(curses.color_pair(theme.COLOR_VERTICAL_SEPARATOR)) + self._win.attroff(common.curses_color_pair(theme.COLOR_VERTICAL_SEPARATOR)) class Topic(Win): def __init__(self): @@ -169,12 +170,12 @@ class Topic(Win): msg = topic[:self.width-1] else: msg = self._message[:self.width-1] - self.addstr(0, 0, msg, curses.color_pair(theme.COLOR_TOPIC_BAR)) + self.addstr(0, 0, msg, common.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)) + common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) self._refresh() def set_message(self, message): @@ -194,7 +195,7 @@ class GlobalInfoBar(Win): comp = lambda x: x.nb with g_lock: self._win.erase() - self.addstr(0, 0, "[", curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(0, 0, "[", common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) sorted_tabs = sorted(tabs, key=comp) for tab in sorted_tabs: color = tab.get_color_state() @@ -202,16 +203,16 @@ class GlobalInfoBar(Win): color == theme.COLOR_TAB_NORMAL: continue try: - self.addstr("%s" % str(tab.nb), curses.color_pair(color)) - self.addstr("|", curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr("%s" % str(tab.nb), common.curses_color_pair(color)) + self.addstr("|", common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) except: # end of line break (y, x) = self._win.getyx() - self.addstr(y, x-1, '] ', curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(y, x-1, '] ', common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) (y, x) = self._win.getyx() remaining_size = self.width - x self.addnstr(' '*remaining_size, remaining_size, - curses.color_pair(theme.COLOR_INFORMATION_BAR)) + common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) self._refresh() class InfoWin(Win): @@ -230,7 +231,7 @@ class InfoWin(Win): """ if window.pos > 0: plus = ' -PLUS(%s)-' % window.pos - self.addstr(plus, curses.color_pair(theme.COLOR_SCROLLABLE_NUMBER) | curses.A_BOLD) + self.addstr(plus, common.curses_color_pair(theme.COLOR_SCROLLABLE_NUMBER)) class PrivateInfoWin(InfoWin): """ @@ -255,9 +256,9 @@ class PrivateInfoWin(InfoWin): def write_room_name(self, room): jid = JID(room.name) room_name, nick = jid.bare, jid.resource - self.addstr(nick, curses.color_pair(theme.COLOR_PRIVATE_NAME)) + self.addstr(nick, common.curses_color_pair(theme.COLOR_PRIVATE_NAME)) txt = ' from room %s' % room_name - self.addstr(txt, curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(txt, common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) class ConversationInfoWin(InfoWin): """ @@ -315,27 +316,27 @@ class ConversationInfoWin(InfoWin): else: presence = resource.get_presence() color = RosterWin.color_show[presence] - self.addstr('[', curses.color_pair(theme.COLOR_INFORMATION_BAR)) - self.addstr(" ", curses.color_pair(color)) - self.addstr(']', curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr('[', common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(" ", common.curses_color_pair(color)) + self.addstr(']', common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) def write_contact_informations(self, contact): """ Write the informations about the contact """ if not contact: - self.addstr("(contact not in roster)", curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr("(contact not in roster)", common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) return display_name = contact.get_name() or contact.get_bare_jid() - self.addstr('%s '%(display_name), curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr('%s '%(display_name), common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) def write_contact_jid(self, jid): """ Just write the jid that we are talking to """ - self.addstr('[', curses.color_pair(theme.COLOR_INFORMATION_BAR)) - self.addstr(jid.full, curses.color_pair(theme.COLOR_CONVERSATION_NAME)) - self.addstr('] ', curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr('[', common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(jid.full, common.curses_color_pair(theme.COLOR_CONVERSATION_NAME)) + self.addstr('] ', common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) class ConversationStatusMessageWin(InfoWin): """ @@ -364,7 +365,7 @@ class ConversationStatusMessageWin(InfoWin): self._refresh() def write_status_message(self, resource): - self.addstr(resource.get_status(), curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(resource.get_status(), common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) class MucInfoWin(InfoWin): """ @@ -392,16 +393,16 @@ class MucInfoWin(InfoWin): def write_room_name(self, room): """ """ - self.addstr('[', curses.color_pair(theme.COLOR_INFORMATION_BAR)) - self.addnstr(room.name, len(room.name), curses.color_pair(theme.COLOR_GROUPCHAT_NAME)) - self.addstr('] ', curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr('[', common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) + self.addnstr(room.name, len(room.name), common.curses_color_pair(theme.COLOR_GROUPCHAT_NAME)) + self.addstr('] ', common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) def write_disconnected(self, room): """ Shows a message if the room is not joined """ if not room.joined: - self.addstr(' -!- Not connected ', curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(' -!- Not connected ', common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) def write_own_nick(self, room): """ @@ -412,7 +413,7 @@ class MucInfoWin(InfoWin): return if len(nick) > 13: nick = nick[:13]+'…' - self.addstr(nick, curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(nick, common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) def write_role(self, room): """ @@ -429,7 +430,7 @@ class MucInfoWin(InfoWin): if own_user.affiliation != 'none': txt += own_user.affiliation+', ' txt += own_user.role+')' - self.addstr(txt, curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(txt, common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) class TextWin(Win): def __init__(self): @@ -559,7 +560,7 @@ class TextWin(Win): def write_line_separator(self): """ """ - self.addnstr('- '*(self.width//2-1)+'-', self.width, curses.color_pair(theme.COLOR_NEW_TEXT_SEPARATOR)) + self.addnstr('- '*(self.width//2-1)+'-', self.width, common.curses_color_pair(theme.COLOR_NEW_TEXT_SEPARATOR)) def write_text(self, y, x, txt, color, colorized): """ @@ -568,10 +569,10 @@ class TextWin(Win): txt = txt if not colorized: if color: - self._win.attron(curses.color_pair(color)) + self._win.attron(common.curses_color_pair(color)) self.addstr(y, x, txt) if color: - self._win.attroff(curses.color_pair(color)) + self._win.attroff(common.curses_color_pair(color)) else: # Special messages like join or quit special_words = { @@ -589,17 +590,17 @@ class TextWin(Win): splitted = txt.split() for word in splitted: if word in list(special_words.keys()): - self.addstr(word, curses.color_pair(special_words[word])) + self.addstr(word, common.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)) - self.addstr(')', curses.color_pair(color)) + self.addstr('(', common.curses_color_pair(color)) + self.addstr(word[1:-1], common.curses_color_pair(theme.COLOR_CURLYBRACKETED_WORD)) + self.addstr(')', common.curses_color_pair(color)) elif word.startswith('{') and word.endswith('}'): - self.addstr(word[1:-1], curses.color_pair(theme.COLOR_ACCOLADE_WORD)) + self.addstr(word[1:-1], common.curses_color_pair(theme.COLOR_ACCOLADE_WORD)) elif word.startswith('[') and word.endswith(']'): - self.addstr(word[1:-1], curses.color_pair(theme.COLOR_BRACKETED_WORD)) + self.addstr(word[1:-1], common.curses_color_pair(theme.COLOR_BRACKETED_WORD)) else: - self.addstr(word, curses.color_pair(color)) + self.addstr(word, common.curses_color_pair(color)) self.addstr(' ') def write_nickname(self, nickname, color): @@ -608,23 +609,23 @@ class TextWin(Win): and return the number of written characters """ if color: - self._win.attron(curses.color_pair(color)) + self._win.attron(common.curses_color_pair(color)) self.addstr(nickname) if color: - self._win.attroff(curses.color_pair(color)) + self._win.attroff(common.curses_color_pair(color)) self.addstr("> ") def write_time(self, time): """ Write the date on the yth line of the window """ - self.addstr(theme.CHAR_TIME_LEFT, curses.color_pair(theme.COLOR_TIME_LIMITER)) - self.addstr(time['hour'], curses.color_pair(theme.COLOR_TIME_NUMBERS)) - self.addstr(':', curses.color_pair(theme.COLOR_TIME_SEPARATOR)) - self.addstr(time['minute'], curses.color_pair(theme.COLOR_TIME_NUMBERS)) - self.addstr(':', curses.color_pair(theme.COLOR_TIME_SEPARATOR)) - self.addstr(time['second'], curses.color_pair(theme.COLOR_TIME_NUMBERS)) - self.addstr(theme.CHAR_TIME_RIGHT, curses.color_pair(theme.COLOR_TIME_LIMITER)) + self.addstr(theme.CHAR_TIME_LEFT, common.curses_color_pair(theme.COLOR_TIME_LIMITER)) + self.addstr(time['hour'], common.curses_color_pair(theme.COLOR_TIME_NUMBERS)) + self.addstr(':', common.curses_color_pair(theme.COLOR_TIME_SEPARATOR)) + self.addstr(time['minute'], common.curses_color_pair(theme.COLOR_TIME_NUMBERS)) + self.addstr(':', common.curses_color_pair(theme.COLOR_TIME_SEPARATOR)) + self.addstr(time['second'], common.curses_color_pair(theme.COLOR_TIME_NUMBERS)) + self.addstr(theme.CHAR_TIME_RIGHT, common.curses_color_pair(theme.COLOR_TIME_LIMITER)) self.addstr(' ') def resize(self, height, width, y, x, stdscr, room=None): @@ -655,7 +656,7 @@ class HelpText(Win): self.txt = txt with g_lock: self._win.erase() - self.addstr(0, 0, self.txt[:self.width-1], curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(0, 0, self.txt[:self.width-1], common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) self.finish_line(theme.COLOR_INFORMATION_BAR) self._refresh() @@ -1000,15 +1001,15 @@ class Input(Win): with g_lock: self._win.erase() if self.color: - self._win.attron(curses.color_pair(self.color)) + self._win.attron(common.curses_color_pair(self.color)) self.addstr(self.text[self.line_pos:self.line_pos+self.width-1]) if self.color: (y, x) = self._win.getyx() size = self.width-x - self.addnstr(' '*size, size, curses.color_pair(self.color)) + self.addnstr(' '*size, size, common.curses_color_pair(self.color)) self.addstr(0, self.pos, '') # WTF, this works but .move() doesn't… if self.color: - self._win.attroff(curses.color_pair(self.color)) + self._win.attroff(common.curses_color_pair(self.color)) self._refresh() def refresh(self): @@ -1131,7 +1132,7 @@ class CommandInput(Input): """ with g_lock: self._win.erase() - self.addstr(self.help_message, curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(self.help_message, common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) cursor_pos = self.pos + len(self.help_message) if len(self.help_message): self.addstr(' ') @@ -1150,7 +1151,7 @@ class VerticalSeparator(Win): def rewrite_line(self): with g_lock: - self._win.vline(0, 0, curses.ACS_VLINE, self.height, curses.color_pair(theme.COLOR_VERTICAL_SEPARATOR)) + self._win.vline(0, 0, curses.ACS_VLINE, self.height, common.curses_color_pair(theme.COLOR_VERTICAL_SEPARATOR)) self._refresh() def resize(self, height, width, y, x, stdscr): @@ -1253,13 +1254,13 @@ class RosterWin(Win): Draw the indicator that shows that the list is longer than what is displayed """ - self.addstr(y, self.width-5, '++++', curses.color_pair(theme.COLOR_MORE_INDICATOR)) + self.addstr(y, self.width-5, '++++', common.curses_color_pair(theme.COLOR_MORE_INDICATOR)) def draw_roster_information(self, roster): """ """ self.addstr('Roster: %s/%s contacts' % (roster.get_nb_connected_contacts(), roster.get_contact_len())\ - , curses.color_pair(theme.COLOR_INFORMATION_BAR)) + , common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) self.finish_line(theme.COLOR_INFORMATION_BAR) def draw_group(self, y, group, colored): @@ -1267,7 +1268,7 @@ class RosterWin(Win): Draw a groupname on a line """ if colored: - self._win.attron(curses.color_pair(theme.COLOR_SELECTED_ROW)) + self._win.attron(common.curses_color_pair(theme.COLOR_SELECTED_ROW)) if group.folded: self.addstr(y, 0, '[+] ') else: @@ -1275,7 +1276,7 @@ class RosterWin(Win): contacts = " (%s/%s)" % (group.get_nb_connected_contacts(), len(group)) self.addstr(y, 4, group.name + contacts) if colored: - self._win.attroff(curses.color_pair(theme.COLOR_SELECTED_ROW)) + self._win.attroff(common.curses_color_pair(theme.COLOR_SELECTED_ROW)) def draw_contact_line(self, y, contact, colored): """ @@ -1300,25 +1301,25 @@ class RosterWin(Win): contact.get_bare_jid(), nb,) else: display_name = '%s%s' % (contact.get_bare_jid(), nb,) - self.addstr(y, 1, " ", curses.color_pair(color)) + self.addstr(y, 1, " ", common.curses_color_pair(color)) if resource: self.addstr(y, 2, ' [+]' if contact._folded else ' [-]') self.addstr(' ') if colored: - self.addstr(display_name, curses.color_pair(theme.COLOR_SELECTED_ROW)) + self.addstr(display_name, common.curses_color_pair(theme.COLOR_SELECTED_ROW)) else: self.addstr(display_name) if contact.get_ask() == 'asked': - self.addstr('?', curses.color_pair(theme.COLOR_HIGHLIGHT_TEXT)) + self.addstr('?', common.curses_color_pair(theme.COLOR_HIGHLIGHT_TEXT)) def draw_resource_line(self, y, resource, colored): """ Draw a specific resource line """ color = RosterWin.color_show[resource.get_presence()] - self.addstr(y, 4, " ", curses.color_pair(color)) + self.addstr(y, 4, " ", common.curses_color_pair(color)) if colored: - self.addstr(y, 6, resource.get_jid().full, curses.color_pair(theme.COLOR_SELECTED_ROW)) + self.addstr(y, 6, resource.get_jid().full, common.curses_color_pair(theme.COLOR_SELECTED_ROW)) else: self.addstr(y, 6, resource.get_jid().full) @@ -1345,12 +1346,12 @@ class ContactInfoWin(Win): presence = resource.get_presence() else: presence = 'unavailable' - self.addstr(0, 0, '%s (%s)'%(jid, presence,), curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(0, 0, '%s (%s)'%(jid, presence,), common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) self.finish_line(theme.COLOR_INFORMATION_BAR) self.addstr(1, 0, 'Subscription: %s' % (contact.get_subscription(),)) if contact.get_ask(): if contact.get_ask() == 'asked': - self.addstr(' Ask: %s' % (contact.get_ask(),), curses.color_pair(theme.COLOR_HIGHLIGHT_TEXT)) + self.addstr(' Ask: %s' % (contact.get_ask(),), common.curses_color_pair(theme.COLOR_HIGHLIGHT_TEXT)) else: self.addstr(' Ask: %s' % (contact.get_ask(),)) @@ -1358,7 +1359,7 @@ class ContactInfoWin(Win): """ draw the group information """ - self.addstr(0, 0, group.name, curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(0, 0, group.name, common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) self.finish_line(theme.COLOR_INFORMATION_BAR) def refresh(self, selected_row): @@ -1434,7 +1435,7 @@ class ListWin(Win): if not txt: continue if line is self.lines[self._selected_row]: - self.addstr(y, x, txt[:size], curses.color_pair(theme.COLOR_INFORMATION_BAR)) + self.addstr(y, x, txt[:size], common.curses_color_pair(theme.COLOR_INFORMATION_BAR)) else: self.addstr(y, x, txt[:size]) x += size @@ -1488,7 +1489,7 @@ class ColumnHeaderWin(Win): txt = col size = self._columns_sizes[col] txt += ' ' * (size-len(txt)) - self.addstr(0, x, txt, curses.color_pair(theme.COLOR_COLUMN_HEADER)) + self.addstr(0, x, txt, common.curses_color_pair(theme.COLOR_COLUMN_HEADER)) x += size self._refresh() -- cgit v1.2.3