Fix some bugs and improve coding of minimized groupchats.

This commit is contained in:
Julien Pivotto 2007-05-07 21:02:48 +00:00
parent fb95530daf
commit 19df2a0f9e
8 changed files with 152 additions and 175 deletions

View File

@ -553,6 +553,7 @@ class ChatControlBase(MessageControl):
subject = None, old_kind = None, xhtml = None): subject = None, old_kind = None, xhtml = None):
'''prints 'chat' type messages''' '''prints 'chat' type messages'''
jid = self.contact.jid jid = self.contact.jid
account = self.account
full_jid = self.get_full_jid() full_jid = self.get_full_jid()
textview = self.conv_textview textview = self.conv_textview
end = False end = False
@ -566,24 +567,27 @@ class ChatControlBase(MessageControl):
return return
if kind == 'incoming': if kind == 'incoming':
gajim.last_message_time[self.account][full_jid] = time.time() gajim.last_message_time[self.account][full_jid] = time.time()
if (not self.parent_win.get_active_jid() or \
full_jid != self.parent_win.get_active_jid() or \ if kind in ('incoming', 'incoming_queue'):
not self.parent_win.is_active() or not end) and \
kind in ('incoming', 'incoming_queue'):
gc_message = False gc_message = False
if self.type_id == message_control.TYPE_GC: if self.type_id == message_control.TYPE_GC:
gc_message = True gc_message = True
if not gc_message or \ if not gc_message or \
(gc_message and (other_tags_for_text == ['marked'] or \ (gc_message and (other_tags_for_text == ['marked'] or \
gajim.config.get('notify_on_all_muc_messages'))): gajim.config.get('notify_on_all_muc_messages'))) or \
(gc_message and \
gajim.interface.minimized_controls.has_key(account) and \
jid in gajim.interface.minimized_controls[account]):
# we want to have save this message in events list # we want to have save this message in events list
# other_tags_for_text == ['marked'] --> highlighted gc message # other_tags_for_text == ['marked'] --> highlighted gc message
type_ = 'printed_' + self.type_id type_ = 'printed_' + self.type_id
event = 'message_received'
if gc_message: if gc_message:
type_ = 'printed_gc_msg' type_ = 'printed_gc_msg'
show_in_roster = notify.get_show_in_roster('message_received', event = 'gc_message_received'
show_in_roster = notify.get_show_in_roster(event,
self.account, self.contact) self.account, self.contact)
show_in_systray = notify.get_show_in_systray('message_received', show_in_systray = notify.get_show_in_systray(event,
self.account, self.contact) self.account, self.contact)
event = gajim.events.create_event(type_, None, event = gajim.events.create_event(type_, None,
show_in_roster = show_in_roster, show_in_roster = show_in_roster,
@ -593,6 +597,14 @@ class ChatControlBase(MessageControl):
if show_in_roster: if show_in_roster:
gajim.interface.roster.draw_contact(self.contact.jid, gajim.interface.roster.draw_contact(self.contact.jid,
self.account) self.account)
if not self.parent_win:
return
if (not self.parent_win.get_active_jid() or \
full_jid != self.parent_win.get_active_jid() or \
not self.parent_win.is_active() or not end) and \
kind in ('incoming', 'incoming_queue'):
self.parent_win.redraw_tab(self) self.parent_win.redraw_tab(self)
ctrl = gajim.interface.msg_win_mgr.get_control(full_jid, self.account) ctrl = gajim.interface.msg_win_mgr.get_control(full_jid, self.account)
if not self.parent_win.is_active(): if not self.parent_win.is_active():
@ -669,8 +681,12 @@ class ChatControlBase(MessageControl):
win.notebook.remove_page(ctrl_page) win.notebook.remove_page(ctrl_page)
control.unparent() control.unparent()
ctrl.parent_win = None
if not gajim.interface.minimized_controls.has_key(self.account):
gajim.interface.minimized_controls[self.account] = {}
gajim.interface.minimized_controls[self.account][self.contact.jid] = ctrl
gajim.connections[self.account].hidden_groupchats[self.contact.jid] = ctrl
del win._controls[self.account][self.contact.jid] del win._controls[self.account][self.contact.jid]
win.check_tabs() win.check_tabs()
@ -788,6 +804,8 @@ class ChatControlBase(MessageControl):
if not len(gajim.events.get_events(self.account, jid, ['printed_' + type_, if not len(gajim.events.get_events(self.account, jid, ['printed_' + type_,
type_])): type_])):
return return
if not self.parent_win:
return
if self.conv_textview.at_the_end() and \ if self.conv_textview.at_the_end() and \
self.parent_win.get_active_control() == self and \ self.parent_win.get_active_control() == self and \
self.parent_win.window.is_active(): self.parent_win.window.is_active():

View File

@ -70,7 +70,6 @@ class Connection(ConnectionHandlers):
self.last_time_to_reconnect = None self.last_time_to_reconnect = None
self.new_account_info = None self.new_account_info = None
self.bookmarks = [] self.bookmarks = []
self.hidden_groupchats = {}
self.annotations = {} self.annotations = {}
self.on_purpose = False self.on_purpose = False
self.last_io = gajim.idlequeue.current_time() self.last_io = gajim.idlequeue.current_time()

View File

@ -155,9 +155,8 @@ class Events:
self._events[account][new_jid] = self._events[account][old_jid] self._events[account][new_jid] = self._events[account][old_jid]
del self._events[account][old_jid] del self._events[account][old_jid]
def get_nb_events(self, types = [], account = None, ignore_types = []): def get_nb_events(self, types = [], account = None):
return self._get_nb_events(types = types, account = account, return self._get_nb_events(types = types, account = account)
ignore_types = ignore_types)
def get_events(self, account, jid = None, types = []): def get_events(self, account, jid = None, types = []):
'''if event is not specified, get all events from this jid, '''if event is not specified, get all events from this jid,
@ -187,7 +186,7 @@ class Events:
return first_event return first_event
def _get_nb_events(self, account = None, jid = None, attribute = None, def _get_nb_events(self, account = None, jid = None, attribute = None,
types = [], ignore_types = []): types = []):
'''return the number of pending events''' '''return the number of pending events'''
nb = 0 nb = 0
if account: if account:
@ -207,8 +206,6 @@ class Events:
for event in self._events[acct][j]: for event in self._events[acct][j]:
if types and event.type_ not in types: if types and event.type_ not in types:
continue continue
if ignore_types and event.type_ in ignore_types:
continue
if not attribute or \ if not attribute or \
attribute == 'systray' and event.show_in_systray or \ attribute == 'systray' and event.show_in_systray or \
attribute == 'roster' and event.show_in_roster: attribute == 'roster' and event.show_in_roster:

View File

@ -1052,9 +1052,10 @@ class Interface:
show = array[1] show = array[1]
status = array[2] status = array[2]
ctrl = self.msg_win_mgr.get_control(fjid, account)
# print status in chat window and update status/GPG image # print status in chat window and update status/GPG image
if self.msg_win_mgr.has_window(fjid, account): if ctrl:
ctrl = self.msg_win_mgr.get_control(fjid, account)
contact = ctrl.contact contact = ctrl.contact
contact.show = show contact.show = show
contact.status = status contact.status = status
@ -1066,44 +1067,42 @@ class Interface:
else: else:
ctrl.print_conversation(_('%s is now %s') % (nick, uf_show), ctrl.print_conversation(_('%s is now %s') % (nick, uf_show),
'status') 'status')
ctrl.parent_win.redraw_tab(ctrl) if ctrl.parent_win:
ctrl.parent_win.redraw_tab(ctrl)
if self.remote_ctrl: if self.remote_ctrl:
self.remote_ctrl.raise_signal('GCPresence', (account, array)) self.remote_ctrl.raise_signal('GCPresence', (account, array))
if room_jid in gajim.connections[account].hidden_groupchats:
my_nick = gajim.connections[account].hidden_groupchats[room_jid].nick
first = False
if not gajim.events.get_events(account, room_jid, ['change_status']):
first = True
array = array + (time.localtime(),)
event = gajim.events.create_event('change_status', array,
show_in_roster = False, show_in_systray = False)
gajim.events.add_event(account, room_jid, event)
# Change status icon if kicked or deconnected from gc
if array[3] == my_nick and array[1] in ('offline', 'error') and \
array[9] != '303':
gajim.gc_connected[account][room_jid] = False
gajim.interface.roster.draw_contact(room_jid, account)
elif array[3] == my_nick:
gajim.gc_connected[account][room_jid] = True
gajim.interface.roster.draw_contact(room_jid, account)
return
# Get the window and control for the updated status, this may be a # Get the window and control for the updated status, this may be a
# PrivateChatControl # PrivateChatControl
control = self.msg_win_mgr.get_control(room_jid, account) control = self.msg_win_mgr.get_control(room_jid, account)
if not control and \
self.minimized_controls.has_key(account) and \
room_jid in self.minimized_controls[account]:
control = self.minimized_controls[account][room_jid]
if control and control.type_id != message_control.TYPE_GC: if control and control.type_id != message_control.TYPE_GC:
return return
if control: if control:
control.chg_contact_status(nick, show, status, array[4], array[5], control.chg_contact_status(nick, show, status, array[4], array[5],
array[6], array[7], array[8], array[9], array[10]) array[6], array[7], array[8], array[9], array[10])
if not control.parent_win:
gajim.interface.roster.draw_contact(room_jid, account)
def handle_event_gc_msg(self, account, array): def handle_event_gc_msg(self, account, array):
# ('GC_MSG', account, (jid, msg, time, has_timestamp, htmlmsg)) # ('GC_MSG', account, (jid, msg, time, has_timestamp, htmlmsg))
jids = array[0].split('/', 1) jids = array[0].split('/', 1)
room_jid = jids[0] room_jid = jids[0]
gc_control = self.msg_win_mgr.get_control(room_jid, account)
if not gc_control and \
self.minimized_controls.has_key(account) and \
room_jid in self.minimized_controls[account]:
gc_control = self.minimized_controls[account][room_jid]
if not gc_control:
return
xhtml = array[4] xhtml = array[4]
if gajim.config.get('ignore_incoming_xhtml'): if gajim.config.get('ignore_incoming_xhtml'):
xhtml = None xhtml = None
if len(jids) == 1: if len(jids) == 1:
@ -1113,47 +1112,13 @@ class Interface:
# message from someone # message from someone
nick = jids[1] nick = jids[1]
if room_jid in gajim.connections[account].hidden_groupchats:
message = array[1]
tim = array[2]
first = False
if not gajim.events.get_events(account, room_jid, ['gc_msg',
'gc_chat']):
first = True
contact = gajim.contacts.get_contact_with_highest_priority(
account, room_jid)
advanced_notif_num = notify.get_advanced_notification\
('message_received', account, contact)
ctrl = gajim.connections[account].hidden_groupchats[room_jid]
type_event = 'gc_msg'
do_popup = False
is_history = False
show_in_systray = False
show_in_roster = True
if not array[3] and ctrl.needs_visual_notification(message):
do_popup = True
show_in_systray = True
if array[3] or nick == '':
is_history = True
type_event = 'gc_history'
show_in_roster = False
if not array[3]:
notify.notify('new_gc_message', room_jid, account, [do_popup,
first, nick, message, is_history], advanced_notif_num)
event = gajim.events.create_event(type_event, (nick, array[1],
array[2], array[3], xhtml), show_in_roster = show_in_roster,
show_in_systray = show_in_systray)
gajim.events.add_event(account, room_jid, event)
gajim.interface.roster.draw_contact(room_jid, account)
gajim.interface.roster.show_title()
return
gc_control = self.msg_win_mgr.get_control(room_jid, account)
if not gc_control:
return
gc_control.on_message(nick, array[1], array[2], array[3], xhtml) gc_control.on_message(nick, array[1], array[2], array[3], xhtml)
contact = gajim.contacts.\
get_contact_with_highest_priority(account, room_jid)
if contact:
gajim.interface.roster.draw_contact(room_jid, account)
if self.remote_ctrl: if self.remote_ctrl:
self.remote_ctrl.raise_signal('GCMessage', (account, array)) self.remote_ctrl.raise_signal('GCMessage', (account, array))
@ -1161,18 +1126,20 @@ class Interface:
#('GC_SUBJECT', account, (jid, subject, body, has_timestamp)) #('GC_SUBJECT', account, (jid, subject, body, has_timestamp))
jids = array[0].split('/', 1) jids = array[0].split('/', 1)
jid = jids[0] jid = jids[0]
if jid in gajim.connections[account].hidden_groupchats:
array = (array[0], array[1], array[2]) + (time.localtime(),)
event = gajim.events.create_event('change_subject',
array, show_in_roster = False, show_in_systray = False)
gajim.events.add_event(account, jid, event)
contact = gajim.contacts.\
get_contact_with_highest_priority(account, jid)
contact.status = array[1]
gajim.interface.roster.draw_contact(jid, account)
return
gc_control = self.msg_win_mgr.get_control(jid, account) gc_control = self.msg_win_mgr.get_control(jid, account)
if not gc_control and \
self.minimized_controls.has_key(account) and \
jid in self.minimized_controls[account]:
gc_control = self.minimized_controls[account][jid]
contact = gajim.contacts.\
get_contact_with_highest_priority(account, jid)
if contact:
contact.status = array[1]
gajim.interface.roster.draw_contact(jid, account)
if not gc_control: if not gc_control:
return return
gc_control.set_subject(array[1]) gc_control.set_subject(array[1])
@ -2203,6 +2170,7 @@ class Interface:
self.emoticons_menu = None self.emoticons_menu = None
# handler when an emoticon is clicked in emoticons_menu # handler when an emoticon is clicked in emoticons_menu
self.emoticon_menuitem_clicked = None self.emoticon_menuitem_clicked = None
self.minimized_controls = {}
self.default_colors = { self.default_colors = {
'inmsgcolor': gajim.config.get('inmsgcolor'), 'inmsgcolor': gajim.config.get('inmsgcolor'),
'outmsgcolor': gajim.config.get('outmsgcolor'), 'outmsgcolor': gajim.config.get('outmsgcolor'),

View File

@ -614,7 +614,8 @@ class GroupchatControl(ChatControlBase):
else: else:
kind = 'incoming' kind = 'incoming'
# muc-specific chatstate # muc-specific chatstate
self.parent_win.redraw_tab(self, 'newmsg') if self.parent_win:
self.parent_win.redraw_tab(self, 'newmsg')
else: else:
kind = 'status' kind = 'status'
@ -636,7 +637,8 @@ class GroupchatControl(ChatControlBase):
str(self.gc_count_nicknames_colors)) str(self.gc_count_nicknames_colors))
if highlight: if highlight:
# muc-specific chatstate # muc-specific chatstate
self.parent_win.redraw_tab(self, 'attention') if self.parent_win:
self.parent_win.redraw_tab(self, 'attention')
other_tags_for_name.append('bold') other_tags_for_name.append('bold')
other_tags_for_text.append('marked') other_tags_for_text.append('marked')
if sound == 'received': if sound == 'received':
@ -647,7 +649,8 @@ class GroupchatControl(ChatControlBase):
other_tags_for_text.append('gc_nickname_color_' + \ other_tags_for_text.append('gc_nickname_color_' + \
str(self.gc_custom_colors[contact])) str(self.gc_custom_colors[contact]))
self.check_and_possibly_add_focus_out_line() if self.parent_win:
self.check_and_possibly_add_focus_out_line()
ChatControlBase.print_conversation_line(self, text, kind, contact, tim, ChatControlBase.print_conversation_line(self, text, kind, contact, tim,
other_tags_for_name, [], other_tags_for_text, xhtml = xhtml) other_tags_for_name, [], other_tags_for_text, xhtml = xhtml)
@ -918,7 +921,12 @@ class GroupchatControl(ChatControlBase):
c.status = status c.status = status
if nick == self.nick and statusCode != '303': # We became offline if nick == self.nick and statusCode != '303': # We became offline
self.got_disconnected() self.got_disconnected()
self.parent_win.redraw_tab(self) contact = gajim.contacts.\
get_contact_with_highest_priority(self.account, self.room_jid)
if contact:
gajim.interface.roster.draw_contact(self.room_jid, self.account)
if self.parent_win:
self.parent_win.redraw_tab(self)
else: else:
iter = self.get_contact_iter(nick) iter = self.get_contact_iter(nick)
if not iter: if not iter:
@ -943,8 +951,8 @@ class GroupchatControl(ChatControlBase):
c.affiliation = affiliation c.affiliation = affiliation
c.status = status c.status = status
self.draw_contact(nick) self.draw_contact(nick)
if self.parent_win:
self.parent_win.redraw_tab(self) self.parent_win.redraw_tab(self)
if (time.time() - self.room_creation) > 30 and \ if (time.time() - self.room_creation) > 30 and \
nick != self.nick and statusCode != '303': nick != self.nick and statusCode != '303':
st = '' st = ''
@ -2017,47 +2025,47 @@ class GroupchatControl(ChatControlBase):
else: else:
self.revoke_owner(widget, jid) self.revoke_owner(widget, jid)
def read_queue(self, jid, account): #~ def read_queue(self, jid, account):
'''read queue and print messages containted in it''' #~ '''read queue and print messages containted in it'''
events = gajim.events.get_events(account, jid) #~ events = gajim.events.get_events(account, jid)
for event in events: #~ for event in events:
if event.type_ == 'change_subject': #~ if event.type_ == 'change_subject':
array = event.parameters #~ array = event.parameters
jids = array[0].split('/', 1) #~ jids = array[0].split('/', 1)
jid = jids[0] #~ jid = jids[0]
self.set_subject(array[1]) #~ self.set_subject(array[1])
text = None #~ text = None
if len(jids) > 1: #~ if len(jids) > 1:
text = _('%s has set the subject to %s') % (jids[1], array[1]) #~ text = _('%s has set the subject to %s') % (jids[1], array[1])
elif array[2]: #~ elif array[2]:
text = array[2] #~ text = array[2]
if text is not None: #~ if text is not None:
self.print_conversation(text, tim = array[3]) #~ self.print_conversation(text, tim = array[3])
if event.type_ == 'change_status': #~ if event.type_ == 'change_status':
array = event.parameters #~ array = event.parameters
nick = array[3] #~ nick = array[3]
if not nick: #~ if not nick:
return #~ return
room_jid = array[0] #~ room_jid = array[0]
fjid = room_jid + '/' + nick #~ fjid = room_jid + '/' + nick
show = array[1] #~ show = array[1]
status = array[2] #~ status = array[2]
self.chg_contact_status(nick, show, status, array[4], array[5], #~ self.chg_contact_status(nick, show, status, array[4], array[5],
array[6], array[7], array[8], array[9], array[10], array[11]) #~ array[6], array[7], array[8], array[9], array[10], array[11])
self.parent_win.redraw_tab(self) #~ self.parent_win.redraw_tab(self)
if event.type_ in ['gc_msg', 'gc_history']: #~ if event.type_ in ['gc_msg', 'gc_history']:
array = event.parameters #~ array = event.parameters
kind = array[0] #~ kind = array[0]
if kind == 'error' or kind == 'status': #~ if kind == 'error' or kind == 'status':
kind = 'info' #~ kind = 'info'
self.on_message(kind, array[1], array[2], array[3], array[4]) #~ self.on_message(kind, array[1], array[2], array[3], array[4])
gajim.events.remove_events(account, jid, #~ gajim.events.remove_events(account, jid,
types = ['change_status', 'gc_msg', 'gc_history', #~ types = ['change_status', 'gc_msg', 'gc_history',
'change_subject']) #~ 'change_subject'])
gajim.interface.roster.draw_contact(jid, account) #~ gajim.interface.roster.draw_contact(jid, account)
gajim.interface.roster.show_title() #~ gajim.interface.roster.show_title()

View File

@ -42,6 +42,8 @@ except ImportError:
def get_show_in_roster(event, account, contact): def get_show_in_roster(event, account, contact):
'''Return True if this event must be shown in roster, else False''' '''Return True if this event must be shown in roster, else False'''
if event == 'gc_message_received':
return True
num = get_advanced_notification(event, account, contact) num = get_advanced_notification(event, account, contact)
if num != None: if num != None:
if gajim.config.get_per('notifications', str(num), 'roster') == 'yes': if gajim.config.get_per('notifications', str(num), 'roster') == 'yes':
@ -153,25 +155,10 @@ def notify(event, jid, account, parameters, advanced_notif_num = None):
is_first_message = parameters[1] is_first_message = parameters[1]
nickname = parameters[2] nickname = parameters[2]
message = parameters[3] message = parameters[3]
if is_first_message and helpers.allow_sound_notification(
'first_message_received', advanced_notif_num):
do_sound = True
elif not is_first_message and helpers.allow_sound_notification(
'next_message_received', advanced_notif_num):
do_sound = True
if helpers.allow_showing_notification(account, 'notify_on_new_message', if helpers.allow_showing_notification(account, 'notify_on_new_message',
advanced_notif_num, is_first_message): advanced_notif_num, is_first_message):
do_popup = True do_popup = True
elif event == 'new_gc_message': if is_first_message and helpers.allow_sound_notification(
message_type = 'gc_msg'
do_popup = parameters[0]
is_first_message = parameters[1]
nickname = parameters[2]
message = parameters[3]
is_history = parameters[4]
if is_history:
pass
elif is_first_message and helpers.allow_sound_notification(
'first_message_received', advanced_notif_num): 'first_message_received', advanced_notif_num):
do_sound = True do_sound = True
elif not is_first_message and helpers.allow_sound_notification( elif not is_first_message and helpers.allow_sound_notification(
@ -260,19 +247,6 @@ def notify(event, jid, account, parameters, advanced_notif_num = None):
path = gtkgui_helpers.get_path_to_generic_or_avatar(img) path = gtkgui_helpers.get_path_to_generic_or_avatar(img)
popup(event_type, jid, account, message_type, popup(event_type, jid, account, message_type,
path_to_image = path, title = title, text = text) path_to_image = path, title = title, text = text)
elif event == 'new_gc_message':
event_type = _('New Groupchat Message')
room_jid = jid
name = gajim.connections[account].hidden_groupchats[room_jid].name
img = os.path.join(gajim.DATA_DIR, 'pixmaps', 'events',
'gc_invitation.png')
title = _('New Message on %s') % name
text = _('%(nickname)s: %(message)s') % {'nickname': nickname,
'message': message}
path = gtkgui_helpers.get_path_to_generic_or_avatar(img)
popup(event_type, jid, account, message_type,
path_to_image = path, title = title, text = text)
if do_sound: if do_sound:
snd_file = None snd_file = None
@ -462,8 +436,6 @@ class DesktopNotification:
ntype = 'presence.status' ntype = 'presence.status'
elif event_type == _('Connection Failed'): elif event_type == _('Connection Failed'):
ntype = 'connection.failed' ntype = 'connection.failed'
elif event_type == _('New Groupchat Message'):
ntype = 'im'
else: else:
# default failsafe values # default failsafe values
self.path_to_image = os.path.abspath( self.path_to_image = os.path.abspath(

View File

@ -728,7 +728,8 @@ class RosterWindow:
win.set_active_tab(room_jid, account) win.set_active_tab(room_jid, account)
dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid) dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid)
return return
if gajim.connections[account].hidden_groupchats.has_key(room_jid): if gajim.interface.minimized_controls.has_key(account) and \
room_jid in gajim.interface.minimized_controls[account]:
self.on_groupchat_maximized(None, room_jid, account) self.on_groupchat_maximized(None, room_jid, account)
return return
invisible_show = gajim.SHOW_LIST.index('invisible') invisible_show = gajim.SHOW_LIST.index('invisible')
@ -739,7 +740,11 @@ class RosterWindow:
if minimize: if minimize:
contact = gajim.contacts.create_contact(jid = room_jid, name = nick) contact = gajim.contacts.create_contact(jid = room_jid, name = nick)
gc_control = GroupchatControl(None, contact, account) gc_control = GroupchatControl(None, contact, account)
gajim.connections[account].hidden_groupchats[room_jid] = gc_control
if not gajim.interface.minimized_controls.has_key(account):
gajim.interface.minimized_controls[account] = {}
gajim.interface.minimized_controls[account][room_jid] = gc_control
self.add_groupchat_to_roster(account, room_jid) self.add_groupchat_to_roster(account, room_jid)
gajim.connections[account].join_gc(nick, room_jid, password) gajim.connections[account].join_gc(nick, room_jid, password)
if password: if password:
@ -2401,7 +2406,13 @@ class RosterWindow:
def on_groupchat_maximized(self, widget, jid, account): def on_groupchat_maximized(self, widget, jid, account):
'''When a groupshat is maximised''' '''When a groupshat is maximised'''
ctrl = gajim.connections[account].hidden_groupchats[jid] if not gajim.interface.minimized_controls.has_key(account):
return
if not gajim.interface.minimized_controls[account].has_key(jid):
return
ctrl = gajim.interface.minimized_controls[account][jid]
mw = gajim.interface.msg_win_mgr.get_window(ctrl.contact.jid, ctrl.account) mw = gajim.interface.msg_win_mgr.get_window(ctrl.contact.jid, ctrl.account)
if not mw: if not mw:
mw = gajim.interface.msg_win_mgr.create_window(ctrl.contact, \ mw = gajim.interface.msg_win_mgr.create_window(ctrl.contact, \
@ -2410,12 +2421,12 @@ class RosterWindow:
mw.new_tab(ctrl) mw.new_tab(ctrl)
mw.set_active_tab(jid, account) mw.set_active_tab(jid, account)
mw.window.present() mw.window.present()
ctrl.read_queue(jid, account)
contact = gajim.contacts.get_contact_with_highest_priority(account, jid) contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
self.remove_contact(contact, account) self.remove_contact(contact, account)
gajim.contacts.remove_contact(account, contact) gajim.contacts.remove_contact(account, contact)
self.draw_group(_('Groupchats'), account) self.draw_group(_('Groupchats'), account)
del gajim.connections[account].hidden_groupchats[jid] del gajim.interface.minimized_controls[account][jid]
def make_group_menu(self, event, iter): def make_group_menu(self, event, iter):
'''Make group's popup menu''' '''Make group's popup menu'''
@ -3177,8 +3188,11 @@ class RosterWindow:
else: else:
gajim.connections[account].change_status(status, txt, auto) gajim.connections[account].change_status(status, txt, auto)
if not gajim.interface.minimized_controls.has_key(account):
gajim.interface.minimized_controls[account] = {}
for gc_control in gajim.interface.msg_win_mgr.get_controls( for gc_control in gajim.interface.msg_win_mgr.get_controls(
message_control.TYPE_GC): message_control.TYPE_GC) + \
gajim.interface.minimized_controls[account].values():
if gc_control.account == account: if gc_control.account == account:
if gajim.gc_connected[account][gc_control.room_jid]: if gajim.gc_connected[account][gc_control.room_jid]:
gajim.connections[account].send_gc_status(gc_control.nick, gajim.connections[account].send_gc_status(gc_control.nick,
@ -3786,8 +3800,7 @@ class RosterWindow:
# check if we have unread or recent mesages # check if we have unread or recent mesages
unread = False unread = False
recent = False recent = False
if gajim.events.get_nb_events(ignore_types = ['gc_history', if gajim.events.get_nb_events() > 0:
'change_status', 'change_subject']) > 0:
unread = True unread = True
for win in gajim.interface.msg_win_mgr.windows(): for win in gajim.interface.msg_win_mgr.windows():
unrd = 0 unrd = 0
@ -3908,7 +3921,8 @@ class RosterWindow:
self.tree.collapse_row(path) self.tree.collapse_row(path)
else: else:
self.tree.expand_row(path, False) self.tree.expand_row(path, False)
elif gajim.connections[account].hidden_groupchats.has_key(jid): elif gajim.interface.minimized_controls.has_key(account) and \
gajim.interface.minimized_controls[account].has_key(jid):
self.on_groupchat_maximized(None, jid, account) self.on_groupchat_maximized(None, jid, account)
else: else:
first_ev = gajim.events.get_first_event(account, jid) first_ev = gajim.events.get_first_event(account, jid)

View File

@ -412,8 +412,9 @@ class RosterTooltip(NotificationAreaTooltip):
if self.account and prim_contact.jid in gajim.connections[ if self.account and prim_contact.jid in gajim.connections[
self.account].blocked_contacts: self.account].blocked_contacts:
name_markup += _(' [blocked]') name_markup += _(' [blocked]')
if self.account and gajim.connections[self.account].\ if self.account and \
hidden_groupchats.has_key(prim_contact.jid): gajim.interface.minimized_controls.has_key(self.account) and \
prim_contact.jid in gajim.interface.minimized_controls[self.account]:
name_markup += _(' [minimized]') name_markup += _(' [minimized]')
properties.append((name_markup, None)) properties.append((name_markup, None))