From 8b8128c416001d520b5b5a2028849def6e6170e4 Mon Sep 17 00:00:00 2001 From: mathieui Date: Sun, 6 Nov 2011 16:26:27 +0100 Subject: Fixes #2286 (with /info) --- src/tabs.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/tabs.py b/src/tabs.py index 1209038c..b4e0cf1d 100644 --- a/src/tabs.py +++ b/src/tabs.py @@ -1859,6 +1859,7 @@ class ConversationTab(ChatTab): self.commands['unquery'] = (self.command_unquery, _("Usage: /unquery\nUnquery: close the tab"), None) self.commands['close'] = (self.command_unquery, _("Usage: /close\Close: close the tab"), None) self.commands['version'] = (self.command_version, _('Usage: /version\nVersion: get the software version of the current interlocutor (usually its XMPP client and Operating System)'), None) + self.commands['info'] = (self.command_info, _('Usage: /info\nInfo: get the status of the contact.'), None) self.resize() def completion(self): @@ -1882,6 +1883,18 @@ class ConversationTab(ChatTab): self.text_win.refresh() self.input.refresh() + def command_info(self, arg): + contact = roster.get_contact_by_jid(self.get_name()) + jid = JID(self.get_name()) + if jid.resource: + resource = contact.get_resource_by_fulljid(jid.full) + else: + resource = contact.get_highest_priority_resource() + if resource: + self._text_buffer.add_message("\x195}Status: %s\x193}" %resource.get_status(), None, None, None, None, None) + self.refresh() + self.core.doupdate() + def command_unquery(self, arg): self.core.close_tab() -- cgit v1.2.3 From b9c6f08a790358c990462287bed2062257c5ba7a Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Sun, 6 Nov 2011 16:50:10 +0100 Subject: =?UTF-8?q?Wasn=E2=80=99t=20that=20already=20remove,=20like,=20TWI?= =?UTF-8?q?CE=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/core.py b/src/core.py index 8c4ad258..c1220e4b 100644 --- a/src/core.py +++ b/src/core.py @@ -124,7 +124,6 @@ class Core(object): 'connect': (self.command_reconnect, _('Usage: /connect\nConnect: disconnect from the remote server if you are currently connected and then connect to it again'), None), 'server_cycle': (self.command_server_cycle, _('Usage: /server_cycle [domain] [message]\nServer Cycle: disconnect and reconnects in all the rooms in domain.'), None), 'bind': (self.command_bind, _('Usage: /bind \nBind: bind a key to an other key or to a “command”. For example "/bind ^H KEY_UP" makes Control + h do the same same than the Up key.'), None), -# nope 'pubsub': (self.command_pubsub, _('Usage: /pubsub \nPubsub: Open a pubsub browser on the given domain'), None), } self.key_func = { @@ -144,7 +143,6 @@ class Core(object): 'M-z': self.go_to_previous_tab, '^L': self.full_screen_redraw, 'M-j': self.go_to_room_number, -# 'M-c': self.coucou, } # Add handlers @@ -170,9 +168,6 @@ class Core(object): self.timed_events = set() - def coucou(self): - self.command_pubsub('pubsub.louiz.org') - def start(self): """ Init curses, create the first tab, etc @@ -206,7 +201,6 @@ class Core(object): self.information_win.resize(self.information_win_size, tabs.Tab.width, tabs.Tab.height - 2 - self.information_win_size, 0) - def resize_global_info_bar(self): """ Resize the GlobalInfoBar only once at each resize -- cgit v1.2.3 From 200019574d66c1a04d25e23eb0a0fcda7c25f445 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Sun, 6 Nov 2011 17:08:40 +0100 Subject: Use threads RLock to avoid crash on simultaneous refresh and resize. fixes #2180 --- src/core.py | 13 +++++++------ src/windows.py | 23 +++++++++++++---------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/core.py b/src/core.py index c1220e4b..29748f4b 100644 --- a/src/core.py +++ b/src/core.py @@ -45,6 +45,7 @@ from contact import Contact, Resource from text_buffer import TextBuffer from keyboard import read_char from theming import get_theme +from windows import g_lock # http://xmpp.org/extensions/xep-0045.html#errorstatus ERROR_AND_STATUS_CODES = { @@ -67,8 +68,6 @@ possible_show = {'available':None, 'xa':'xa' } -resize_lock = threading.Lock() - Status = collections.namedtuple('Status', 'show message') class Core(object): @@ -198,14 +197,16 @@ class Core(object): """ Resize the global_information_win only once at each resize. """ - self.information_win.resize(self.information_win_size, tabs.Tab.width, - tabs.Tab.height - 2 - self.information_win_size, 0) + with g_lock: + self.information_win.resize(self.information_win_size, tabs.Tab.width, + tabs.Tab.height - 2 - self.information_win_size, 0) def resize_global_info_bar(self): """ Resize the GlobalInfoBar only once at each resize """ - self.tab_win.resize(1, tabs.Tab.width, tabs.Tab.height - 2, 0) + with g_lock: + self.tab_win.resize(1, tabs.Tab.width, tabs.Tab.height - 2, 0) def on_exception(self, typ, value, trace): """ @@ -692,7 +693,7 @@ class Core(object): tabs.Tab.resize(self.stdscr) self.resize_global_information_win() self.resize_global_info_bar() - with resize_lock: + with g_lock: for tab in self.tabs: if config.get('lazy_resize', 'true') == 'true': tab.need_resize = True diff --git a/src/windows.py b/src/windows.py index 42c9bfa0..790dd858 100644 --- a/src/windows.py +++ b/src/windows.py @@ -24,7 +24,7 @@ import curses import string from config import config -from threading import Lock +from threading import RLock from contact import Contact, Resource from roster import RosterGroup, roster @@ -46,7 +46,7 @@ allowed_color_digits = ('0', '1', '2', '3', '4', '5', '6', '7') # first is a bool telling if this is the first line of the message. Line = collections.namedtuple('Line', 'msg start_pos end_pos') -g_lock = Lock() +g_lock = RLock() LINES_NB_LIMIT = 4096 @@ -79,7 +79,8 @@ class Win(object): """ Override if something has to be done on resize """ - self._resize(height, width, y, x) + with g_lock: + self._resize(height, width, y, x) def _refresh(self): self._win.noutrefresh() @@ -255,10 +256,11 @@ class UserList(Win): self._refresh() def resize(self, height, width, y, x): - self._resize(height, width, y, x) - self._win.attron(to_curses_attr(get_theme().COLOR_VERTICAL_SEPARATOR)) - self._win.vline(0, 0, curses.ACS_VLINE, self.height) - self._win.attroff(to_curses_attr(get_theme().COLOR_VERTICAL_SEPARATOR)) + with g_lock: + self._resize(height, width, y, x) + self._win.attron(to_curses_attr(get_theme().COLOR_VERTICAL_SEPARATOR)) + self._win.vline(0, 0, curses.ACS_VLINE, self.height) + self._win.attroff(to_curses_attr(get_theme().COLOR_VERTICAL_SEPARATOR)) class Topic(Win): def __init__(self): @@ -674,9 +676,10 @@ class TextWin(Win): self.addstr(' ') def resize(self, height, width, y, x, room=None): - self._resize(height, width, y, x) - if room: - self.rebuild_everything(room) + with g_lock: + self._resize(height, width, y, x) + if room: + self.rebuild_everything(room) def rebuild_everything(self, room): self.built_lines = [] -- cgit v1.2.3 From 7d861ee88514b38081f748a2b9f844eb56c6c349 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Sun, 6 Nov 2011 17:31:56 +0100 Subject: Fix another thing related to Room removale --- src/tabs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tabs.py b/src/tabs.py index b4e0cf1d..79412158 100644 --- a/src/tabs.py +++ b/src/tabs.py @@ -305,7 +305,7 @@ class ChatTab(Tab): # build the list of the recent words char_we_dont_want = string.punctuation+' ' words = list() - for msg in self.messages[:-40:-1]: + for msg in self._text_buffer.messages[:-40:-1]: if not msg: continue txt = xhtml.clean_text(msg.txt) @@ -494,7 +494,7 @@ class MucTab(ChatTab): """ /clear """ - self.messages = [] + self._text_buffer.messages = [] self.text_win.rebuild_everything(self._text_buffer) self.refresh() self.core.doupdate() -- cgit v1.2.3