detach sessions from controls when the highest priority contact changes.

this way we don't get multiple tabs when the remote user moves to another resource.
This commit is contained in:
Brendan Taylor 2008-06-10 02:58:17 +00:00
parent 3ec61df48b
commit 399233f293
3 changed files with 37 additions and 14 deletions

View File

@ -1323,7 +1323,7 @@ sent a message to.'''
orphaned = filter(lambda s: not s.control, chat_sessions)
return orphaned[0]
except KeyError:
except (KeyError, IndexError):
return None
def make_new_session(self, jid, thread_id=None, type='chat', cls=None):
@ -2104,6 +2104,13 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
self.dispatch('ERROR_ANSWER', ('', jid_stripped,
errmsg, errcode))
if ptype == 'unavailable' and jid_stripped in self.sessions:
# automatically terminate sessions that they haven't sent a thread ID in
for sess in self.sessions[jid_stripped].values():
if not sess.received_thread_id:
sess.terminate()
del self.sessions[jid_stripped][sess.thread_id]
if avatar_sha and ptype != 'error':
if not self.vcard_shas.has_key(jid_stripped):
cached_vcard = self.get_cached_vcard(jid_stripped)

View File

@ -621,7 +621,7 @@ class Interface:
jid = array[0].split('/')[0]
keyID = array[5]
contact_nickname = array[7]
# Get the proper keyID
keyID = helpers.prepare_and_validate_gpg_keyID(account,
jid, keyID)
@ -647,6 +647,20 @@ class Interface:
if c.resource == resource:
contact1 = c
break
highest = gajim.contacts.get_highest_prio_contact_from_contacts(lcontact)
if not highest or \
(highest.priority < priority and highest.resource != resource) or \
(highest.resource == resource and highest.priority > priority):
# either this contact is the new highest priority contact or it was the
# highest and dropped in priority (so may no longer be the highest)
# disconnect sessions from this contact's chat controls so we
# don't have to open a new tab if a new session comes in
for ctrl in self.msg_win_mgr.get_chat_controls(jid, account):
ctrl.set_session(None)
if contact1:
if contact1.show in statuss:
old_show = statuss.index(contact1.show)

View File

@ -125,15 +125,12 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
pm = True
msg_type = 'pm'
jid_of_control = full_jid_with_resource
highest_contact = gajim.contacts.get_contact_with_highest_priority(
self.conn.name, jid)
if not pm:
if not highest_contact or not highest_contact.resource or \
resource == highest_contact.resource or highest_contact.show == 'offline':
jid_of_control = jid
# does this resource have the highest priority of any available?
is_highest = not highest_contact or not highest_contact.resource or \
resource == highest_contact.resource or highest_contact.show == 'offline'
# Handle chat states
contact = gajim.contacts.get_contact(self.conn.name, jid, resource)
@ -174,11 +171,10 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
advanced_notif_num = notify.get_advanced_notification('message_received',
self.conn.name, contact)
# Is it a first or next message received ?
first = False
if not self.control and not gajim.events.get_events(self.conn.name,
jid_of_control, [msg_type]):
first = True
if not pm and is_highest:
jid_of_control = jid
else:
jid_of_control = full_jid_with_resource
if not self.control:
# look for an existing chat control without a session
@ -186,7 +182,6 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
if ctrl:
self.control = ctrl
self.control.set_session(self)
first = False
if pm:
nickname = resource
@ -198,17 +193,24 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
xhtml=xhtml, form_node=form_node)
nickname = gajim.get_name_from_jid(self.conn.name, jid)
# Check and do wanted notifications
msg = msgtxt
if subject:
msg = _('Subject: %s') % subject + '\n' + msg
focused = False
# Is it a first or next message received ?
first = False
if self.control:
parent_win = self.control.parent_win
if self.control == parent_win.get_active_control() and \
parent_win.window.has_focus:
focused = True
elif not gajim.events.get_events(self.conn.name, \
jid_of_control, [msg_type]):
first = True
notify.notify('new_message', jid_of_control, self.conn.name, [msg_type,
first, nickname, msg, focused], advanced_notif_num)