Skip to content
Snippets Groups Projects
Commit 399233f2 authored by Brendan Taylor's avatar Brendan Taylor
Browse files

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.
parent 3ec61df4
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
......@@ -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)
......
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment