when we get a message from a contact and we have a window with this resource, print it there. see #1697
This commit is contained in:
parent
af3f46bdb4
commit
db7766ea7e
63
src/gajim.py
63
src/gajim.py
|
@ -214,7 +214,7 @@ class Interface:
|
|||
title = data[1]
|
||||
prompt = data[2]
|
||||
proposed_nick = data[3]
|
||||
gc_control = gajim.interface.msg_win_mgr.get_control(room_jid, account)
|
||||
gc_control = self.msg_win_mgr.get_control(room_jid, account)
|
||||
if gc_control: # user may close the window before we are here
|
||||
gc_control.show_change_nick_input_dialog(title, prompt, proposed_nick)
|
||||
|
||||
|
@ -256,7 +256,7 @@ class Interface:
|
|||
(jid_from, file_props))
|
||||
conn.disconnect_transfer(file_props)
|
||||
return
|
||||
ctrl = gajim.interface.msg_win_mgr.get_control(jid_from, account)
|
||||
ctrl = self.msg_win_mgr.get_control(jid_from, account)
|
||||
if ctrl and ctrl.type_id == message_control.TYPE_GC:
|
||||
ctrl.print_conversation('Error %s: %s' % (array[2], array[1]))
|
||||
|
||||
|
@ -281,7 +281,7 @@ class Interface:
|
|||
model[self.roster.status_message_menuitem_iter][3] = True
|
||||
|
||||
# Inform all controls for this account of the connection state change
|
||||
for ctrl in gajim.interface.msg_win_mgr.get_controls(
|
||||
for ctrl in self.msg_win_mgr.get_controls(
|
||||
type = message_control.TYPE_GC):
|
||||
if ctrl.account == account:
|
||||
if status == 'offline':
|
||||
|
@ -470,6 +470,7 @@ class Interface:
|
|||
# chatstate))
|
||||
jid = gajim.get_jid_without_resource(array[0])
|
||||
resource = gajim.get_resource_from_jid(array[0])
|
||||
fjid = jid + '/' + resource
|
||||
msg_type = array[4]
|
||||
chatstate = array[6]
|
||||
msg_id = array[7]
|
||||
|
@ -485,11 +486,11 @@ class Interface:
|
|||
elif gajim.connections[account].connected in (2, 3): # we're online or chat
|
||||
show_notification = True
|
||||
|
||||
chat_control = gajim.interface.msg_win_mgr.get_control(jid, account)
|
||||
chat_control = self.msg_win_mgr.get_control(jid, account)
|
||||
if chat_control and chat_control.type_id == message_control.TYPE_GC:
|
||||
# it's a Private Message
|
||||
fjid = array[0]
|
||||
if not gajim.interface.msg_win_mgr.has_window(fjid, account) and \
|
||||
if not self.msg_win_mgr.has_window(fjid, account) and \
|
||||
not gajim.awaiting_events[account].has_key(fjid):
|
||||
if show_notification:
|
||||
room_jid, nick = gajim.get_room_and_nick_from_fjid(fjid)
|
||||
|
@ -509,6 +510,11 @@ class Interface:
|
|||
not gajim.contacts.get_contact(account, jid):
|
||||
return
|
||||
|
||||
# Look for a chat control that has the given resource, or default to one
|
||||
# without resource
|
||||
ctrl = self.msg_win_mgr.get_control(fjid, account)
|
||||
if ctrl:
|
||||
chat_control = ctrl
|
||||
# Handle chat states
|
||||
contact = gajim.contacts.get_first_contact_from_jid(account, jid)
|
||||
if contact:
|
||||
|
@ -534,8 +540,7 @@ class Interface:
|
|||
return
|
||||
|
||||
first = False
|
||||
if not gajim.interface.msg_win_mgr.has_window(jid, account) and \
|
||||
not gajim.awaiting_events[account].has_key(jid):
|
||||
if not chat_control and not gajim.awaiting_events[account].has_key(jid):
|
||||
first = True
|
||||
if gajim.config.get('notify_on_new_message'):
|
||||
show_notification = False
|
||||
|
@ -576,12 +581,12 @@ class Interface:
|
|||
fjid = array[0]
|
||||
jids = fjid.split('/', 1)
|
||||
jid = jids[0]
|
||||
gcs = gajim.interface.msg_win_mgr.get_controls(message_control.TYPE_GC)
|
||||
gcs = self.msg_win_mgr.get_controls(message_control.TYPE_GC)
|
||||
for gc_control in gcs:
|
||||
if jid == gc_control.contact.jid:
|
||||
if len(jids) > 1: # it's a pm
|
||||
nick = jids[1]
|
||||
if not gajim.interface.msg_win_mgr.get_control(fjid, account):
|
||||
if not self.msg_win_mgr.get_control(fjid, account):
|
||||
tv = gc_control.list_treeview
|
||||
model = tv.get_model()
|
||||
i = gc_control.get_contact_iter(nick)
|
||||
|
@ -593,7 +598,7 @@ class Interface:
|
|||
name = nick, show = show)
|
||||
c = gajim.contacts.contact_from_gc_contct(c)
|
||||
self.roster.new_chat(c, account, private_chat = True)
|
||||
ctrl = gajim.interface.msg_win_mgr.get_control(fjid, account)
|
||||
ctrl = self.msg_win_mgr.get_control(fjid, account)
|
||||
ctrl.print_conversation('Error %s: %s' % (array[1], array[2]),
|
||||
'status')
|
||||
return
|
||||
|
@ -750,19 +755,19 @@ class Interface:
|
|||
# show avatar in chat
|
||||
win = None
|
||||
ctrl = None
|
||||
if resource and gajim.interface.msg_win_mgr.has_window(
|
||||
if resource and self.msg_win_mgr.has_window(
|
||||
jid + '/' + resource, account):
|
||||
win = gajim.interface.msg_win_mgr.get_window(jid + '/' + resource,
|
||||
win = self.msg_win_mgr.get_window(jid + '/' + resource,
|
||||
account)
|
||||
ctrl = win.get_control(jid + '/' + resource, account)
|
||||
elif gajim.interface.msg_win_mgr.has_window(jid, account):
|
||||
win = gajim.interface.msg_win_mgr.get_window(jid, account)
|
||||
elif self.msg_win_mgr.has_window(jid, account):
|
||||
win = self.msg_win_mgr.get_window(jid, account)
|
||||
ctrl = win.get_control(jid, account)
|
||||
if win and ctrl.type_id != message_control.TYPE_GC:
|
||||
ctrl.show_avatar()
|
||||
|
||||
# Show avatar in roster or gc_roster
|
||||
gc_ctrl = gajim.interface.msg_win_mgr.get_control(jid, account)
|
||||
gc_ctrl = self.msg_win_mgr.get_control(jid, account)
|
||||
if gc_ctrl and gc_ctrl.type_id == message_control.TYPE_GC:
|
||||
gc_ctrl.draw_avatar(resource)
|
||||
else:
|
||||
|
@ -813,8 +818,8 @@ class Interface:
|
|||
show = array[1]
|
||||
status = array[2]
|
||||
# print status in chat window and update status/GPG image
|
||||
if gajim.interface.msg_win_mgr.has_window(fjid, account):
|
||||
ctrl = gajim.interface.msg_win_mgr.get_control(fjid, account)
|
||||
if self.msg_win_mgr.has_window(fjid, account):
|
||||
ctrl = self.msg_win_mgr.get_control(fjid, account)
|
||||
contact = ctrl.contact
|
||||
contact.show = show
|
||||
contact.status = status
|
||||
|
@ -825,12 +830,12 @@ class Interface:
|
|||
ctrl.draw_banner()
|
||||
|
||||
# Get the window and control for the updated status, this may be a PrivateChatControl
|
||||
control = gajim.interface.msg_win_mgr.get_control(room_jid, account)
|
||||
control = self.msg_win_mgr.get_control(room_jid, account)
|
||||
if control:
|
||||
control.chg_contact_status(nick, show, status, array[4], array[5], array[6],
|
||||
array[7], array[8], array[9], array[10])
|
||||
# Find any PM chat through this room, and tell it to update.
|
||||
pm_control = gajim.interface.msg_win_mgr.get_control(fjid, account)
|
||||
pm_control = self.msg_win_mgr.get_control(fjid, account)
|
||||
if pm_control:
|
||||
pm_control.parent_win.redraw_tab(pm_control)
|
||||
if self.remote_ctrl:
|
||||
|
@ -840,7 +845,7 @@ class Interface:
|
|||
# ('GC_MSG', account, (jid, msg, time))
|
||||
jids = array[0].split('/', 1)
|
||||
room_jid = jids[0]
|
||||
gc_control = gajim.interface.msg_win_mgr.get_control(room_jid, account)
|
||||
gc_control = self.msg_win_mgr.get_control(room_jid, account)
|
||||
if not gc_control:
|
||||
return
|
||||
if len(jids) == 1:
|
||||
|
@ -857,7 +862,7 @@ class Interface:
|
|||
#('GC_SUBJECT', account, (jid, subject, body))
|
||||
jids = array[0].split('/', 1)
|
||||
jid = jids[0]
|
||||
gc_control = gajim.interface.msg_win_mgr.get_control(jid, account)
|
||||
gc_control = self.msg_win_mgr.get_control(jid, account)
|
||||
if not gc_control:
|
||||
return
|
||||
gc_control.set_subject(array[1])
|
||||
|
@ -1209,7 +1214,7 @@ class Interface:
|
|||
'''SIGNED_IN event is emitted when we sign in, so handle it'''
|
||||
# join already open groupchats
|
||||
self.roster.actions_menu_needs_rebuild = True
|
||||
for gc_control in gajim.interface.msg_win_mgr.get_controls(message_control.TYPE_GC):
|
||||
for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC):
|
||||
if account != gc_control.account:
|
||||
continue
|
||||
room_jid = gc_control.room_jid
|
||||
|
@ -1494,19 +1499,19 @@ class Interface:
|
|||
def handle_event(self, account, jid, typ):
|
||||
w = None
|
||||
if typ == message_control.TYPE_GC:
|
||||
w = gajim.interface.msg_win_mgr.get_window(jid, account)
|
||||
w = self.msg_win_mgr.get_window(jid, account)
|
||||
elif typ == message_control.TYPE_CHAT:
|
||||
if gajim.interface.msg_win_mgr.has_window(jid, account):
|
||||
w = gajim.interface.msg_win_mgr.get_window(jid, account)
|
||||
if self.msg_win_mgr.has_window(jid, account):
|
||||
w = self.msg_win_mgr.get_window(jid, account)
|
||||
else:
|
||||
contact = gajim.contacts.get_first_contact_from_jid(account, jid)
|
||||
self.roster.new_chat(contact, account)
|
||||
w = gajim.interface.msg_win_mgr.get_window(jid, account)
|
||||
w = self.msg_win_mgr.get_window(jid, account)
|
||||
ctrl = w.get_control
|
||||
gajim.last_message_time[account][jid] = 0 # long time ago
|
||||
elif typ == message_control.TYPE_PM:
|
||||
if gajim.interface.msg_win_mgr.has_window(jid, account):
|
||||
w = gajim.interface.msg_win_mgr.get_window(jid, account)
|
||||
if self.msg_win_mgr.has_window(jid, account):
|
||||
w = self.msg_win_mgr.get_window(jid, account)
|
||||
else:
|
||||
room_jid, nick = jid.split('/', 1)
|
||||
gc_contact = gajim.contacts.get_gc_contact(account, room_jid,
|
||||
|
@ -1519,7 +1524,7 @@ class Interface:
|
|||
name = nick, show = show)
|
||||
c = gajim.contacts.contact_from_gc_contact(gc_contact)
|
||||
self.roster.new_chat(c, account, private_chat = True)
|
||||
w = gajim.interface.msg_win_mgr.get_window(jid, account)
|
||||
w = self.msg_win_mgr.get_window(jid, account)
|
||||
elif typ in ('normal', 'file-request', 'file-request-error',
|
||||
'file-send-error', 'file-error', 'file-stopped', 'file-completed'):
|
||||
# Get the first single message event
|
||||
|
|
|
@ -1936,7 +1936,16 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
|
|||
def on_message(self, jid, msg, tim, account, encrypted = False,
|
||||
msg_type = '', subject = None, resource = ''):
|
||||
'''when we receive a message'''
|
||||
contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
||||
contact = None
|
||||
# Try to catch the contact with correct resource
|
||||
if resource:
|
||||
fjid = jid + '/' + resource
|
||||
contact = gajim.contacts.get_contact(account, jid, resource)
|
||||
# Default to highest prio
|
||||
if not contact:
|
||||
fjid = jid
|
||||
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
||||
jid)
|
||||
if not contact:
|
||||
keyID = ''
|
||||
attached_keys = gajim.config.get_per('accounts', account,
|
||||
|
@ -1961,7 +1970,7 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
|
|||
# Do we have a queue?
|
||||
qs = gajim.awaiting_events[account]
|
||||
no_queue = True
|
||||
if qs.has_key(jid):
|
||||
if qs.has_key(fjid):
|
||||
no_queue = False
|
||||
popup = False
|
||||
if autopopup and (autopopupaway or gajim.connections[account].connected \
|
||||
|
@ -1975,25 +1984,30 @@ _('If "%s" accepts this request you will know his or her status.') % jid)
|
|||
return
|
||||
|
||||
# We print if window is opened and it's not a single message
|
||||
if gajim.interface.msg_win_mgr.has_window(jid, account) and msg_type != 'normal':
|
||||
# Look for a chat control that has the given resource, or default to one
|
||||
# without resource
|
||||
ctrl = gajim.interface.msg_win_mgr.get_control(fjid, account)
|
||||
if not ctrl:
|
||||
gajim.interface.msg_win_mgr.get_control(jid, account)
|
||||
if ctrl and msg_type != 'normal':
|
||||
typ = ''
|
||||
if msg_type == 'error':
|
||||
typ = 'status'
|
||||
ctrl = gajim.interface.msg_win_mgr.get_control(jid, account)
|
||||
ctrl.print_conversation(msg, typ, tim = tim, encrypted = encrypted,
|
||||
subject = subject)
|
||||
return
|
||||
|
||||
# We save it in a queue
|
||||
if no_queue:
|
||||
qs[jid] = []
|
||||
qs[fjid] = []
|
||||
kind = 'chat'
|
||||
if msg_type == 'normal':
|
||||
kind = 'normal'
|
||||
qs[jid].append((kind, (msg, subject, msg_type, tim, encrypted, resource)))
|
||||
qs[fjid].append((kind, (msg, subject, msg_type, tim, encrypted,
|
||||
resource)))
|
||||
self.nb_unread += 1
|
||||
if popup:
|
||||
if not gajim.interface.msg_win_mgr.has_window(jid, account):
|
||||
if not ctrl:
|
||||
self.new_chat(contact, account)
|
||||
if path:
|
||||
self.tree.expand_row(path[0:1], False)
|
||||
|
|
Loading…
Reference in New Issue