From 6338f63f03f41f92521df2eb41c2237ce165a814 Mon Sep 17 00:00:00 2001
From: Julien Pivotto <roidelapluie@esquimaux.be>
Date: Mon, 11 Jun 2007 10:13:16 +0000
Subject: [PATCH] Fix some bugs with minimized groupchats.

---
 src/chat_control.py      |  6 +-----
 src/gajim.py             | 41 +++++++++++++++++++++++------------
 src/groupchat_control.py | 10 +++------
 src/roster_window.py     | 46 +++++++++++++++++-----------------------
 4 files changed, 51 insertions(+), 52 deletions(-)

diff --git a/src/chat_control.py b/src/chat_control.py
index 0c1814dba6..e23f437e54 100644
--- a/src/chat_control.py
+++ b/src/chat_control.py
@@ -569,7 +569,6 @@ class ChatControlBase(MessageControl):
 			full_jid != self.parent_win.get_active_jid() or \
 			not self.parent_win.is_active() or not end)) or \
 			(gc_message and \
-			gajim.interface.minimized_controls.has_key(self.account) and \
 			jid in gajim.interface.minimized_controls[self.account])) and \
 			kind in ('incoming', 'incoming_queue'):
 				# we want to have save this message in events list
@@ -683,8 +682,6 @@ class ChatControlBase(MessageControl):
 		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
 
 		del win._controls[self.account][self.contact.jid]
@@ -825,8 +822,7 @@ class ChatControlBase(MessageControl):
 			room_jid, nick = gajim.get_room_and_nick_from_fjid(jid)
 			groupchat_control = gajim.interface.msg_win_mgr.get_control(
 				room_jid, self.account)
-			if gajim.interface.minimized_controls.has_key(self.account) and \
-			room_jid in gajim.interface.minimized_controls[self.account]:
+			if room_jid in gajim.interface.minimized_controls[self.account]:
 				groupchat_control = \
 					gajim.interface.minimized_controls[self.account][room_jid]
 			contact = \
diff --git a/src/gajim.py b/src/gajim.py
index 44c050a43b..9228e247d7 100755
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -396,6 +396,9 @@ class Interface:
 		prompt = data[2]
 		proposed_nick = data[3]
 		gc_control = self.msg_win_mgr.get_control(room_jid, account)
+		if not gc_control and \
+		room_jid in self.minimized_controls[account]:
+			gc_control = self.minimized_controls[account][room_jid]
 		if gc_control: # user may close the window before we are here
 			gc_control.show_change_nick_input_dialog(title, prompt, proposed_nick)
 
@@ -479,16 +482,18 @@ 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 self.msg_win_mgr.get_controls():
+		for ctrl in self.msg_win_mgr.get_controls() + \
+		self.minimized_controls[account].values():
 			if ctrl.account == account:
 				if status == 'offline' or (status == 'invisible' and \
-						gajim.connections[account].is_zeroconf):
+				gajim.connections[account].is_zeroconf):
 					ctrl.got_disconnected()
 				else:
 					# Other code rejoins all GCs, so we don't do it here
 					if not ctrl.type_id == message_control.TYPE_GC:
 						ctrl.got_connected()
-				ctrl.parent_win.redraw_tab(ctrl)
+				if ctrl.parent_win:
+					ctrl.parent_win.redraw_tab(ctrl)
 
 		self.roster.on_status_changed(account, status)
 		if account in self.show_vcard_when_connect:
@@ -687,7 +692,6 @@ class Interface:
 
 		groupchat_control = self.msg_win_mgr.get_control(jid, account)
 		if not groupchat_control and \
-		self.minimized_controls.has_key(account) and \
 		jid in self.minimized_controls[account]:
 			groupchat_control = self.minimized_controls[account][jid]
 		pm = False
@@ -798,6 +802,9 @@ class Interface:
 		jids = full_jid_with_resource.split('/', 1)
 		jid = jids[0]
 		gc_control = self.msg_win_mgr.get_control(jid, account)
+		if not gc_control and \
+		jid in self.minimized_controls[account]:
+			gc_control = self.minimized_controls[account][jid]
 		if gc_control and gc_control.type_id != message_control.TYPE_GC:
 			gc_control = None
 		if gc_control:
@@ -821,7 +828,7 @@ class Interface:
 				return
 
 			gc_control.print_conversation('Error %s: %s' % (array[1], array[2]))
-			if gc_control.parent_win.get_active_jid() == jid:
+			if gc_control.parent_win and gc_control.parent_win.get_active_jid() == jid:
 				gc_control.set_subject(gc_control.subject)
 			return
 
@@ -1021,6 +1028,9 @@ class Interface:
 
 		# Show avatar in roster or gc_roster
 		gc_ctrl = self.msg_win_mgr.get_control(jid, account)
+		if not gc_ctrl and \
+		jid in self.minimized_controls[account]:
+			gc_ctrl = self.minimized_controls[account][jid]
 		if gc_ctrl and gc_ctrl.type_id == message_control.TYPE_GC:
 			gc_ctrl.draw_avatar(resource)
 		else:
@@ -1076,7 +1086,6 @@ class Interface:
 		# PrivateChatControl
 		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]
 
@@ -1085,7 +1094,10 @@ class Interface:
 		if control:
 			control.chg_contact_status(nick, show, status, array[4], array[5],
 				array[6], array[7], array[8], array[9], array[10], array[11])
-		if control and not control.parent_win:
+
+		contact = gajim.contacts.\
+			get_contact_with_highest_priority(account, room_jid)
+		if contact:
 			self.roster.draw_contact(room_jid, account)
 
 		ctrl = self.msg_win_mgr.get_control(fjid, account)
@@ -1114,7 +1126,6 @@ class Interface:
 
 		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]
 
@@ -1149,7 +1160,6 @@ class Interface:
 		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]
 
@@ -1303,7 +1313,7 @@ class Interface:
 				self.roster.join_gc_room(account, bm['jid'], bm['nick'],
 					bm['password'],
 					minimize = gajim.config.get('minimize_autojoined_rooms'))
-								
+
 	def handle_event_file_send_error(self, account, array):
 		jid = array[0]
 		file_props = array[1]
@@ -1615,7 +1625,8 @@ class Interface:
 		if self.instances[account].has_key('profile'):
 			win = self.instances[account]['profile']
 			win.vcard_published()
-		for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC):
+		for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC) + \
+		self.minimized_controls[account].values():
 			if gc_control.account == account:
 				show = gajim.SHOW_LIST[gajim.connections[account].connected]
 				status = gajim.connections[account].status
@@ -1643,7 +1654,8 @@ class Interface:
 		if gajim.connections[account].connected == invisible_show:
 			return
 		# join already open groupchats
-		for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC):
+		for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC) + \
+		self.minimized_controls[account].values():
 			if account != gc_control.account:
 				continue
 			room_jid = gc_control.room_jid
@@ -2127,8 +2139,7 @@ class Interface:
 		jid = gajim.get_jid_without_resource(fjid)
 		if type_ in ('printed_gc_msg', 'printed_marked_gc_msg', 'gc_msg'):
 			w = self.msg_win_mgr.get_window(jid, account)
-			if self.minimized_controls.has_key(account) and \
-			self.minimized_controls[account].has_key(jid):
+			if self.minimized_controls[account].has_key(jid):
 				if not w:
 					ctrl = self.minimized_controls[account][jid]
 					w = self.msg_win_mgr.create_window(ctrl.contact, \
@@ -2308,6 +2319,8 @@ class Interface:
 		for a in gajim.connections:
 			self.instances[a] = {'infos': {}, 'disco': {}, 'gc_config': {},
 				'search': {}}
+			if not a in self.minimized_controls:
+				self.minimized_controls[a] = {}
 			gajim.contacts.add_account(a)
 			gajim.groups[a] = {}
 			gajim.gc_connected[a] = {}
diff --git a/src/groupchat_control.py b/src/groupchat_control.py
index d698706f4e..317e192a17 100644
--- a/src/groupchat_control.py
+++ b/src/groupchat_control.py
@@ -100,8 +100,7 @@ class PrivateChatControl(ChatControl):
 	def __init__(self, parent_win, gc_contact, contact, account):
 		room_jid = contact.jid.split('/')[0]
 		room_ctrl = gajim.interface.msg_win_mgr.get_control(room_jid, account)
-		if gajim.interface.minimized_controls.has_key(account) and \
-		gajim.interface.minimized_controls[account].has_key(room_jid):
+		if gajim.interface.minimized_controls[account].has_key(room_jid):
 			room_ctrl = gajim.interface.minimized_controls[account][room_jid]
 		self.room_name = room_ctrl.name
 		self.gc_contact = gc_contact
@@ -788,7 +787,8 @@ class GroupchatControl(ChatControlBase):
 				gc_contact.show = 'offline'
 				gc_contact.status = ''
 				ctrl.update_ui()
-				ctrl.parent_win.redraw_tab(ctrl)
+				if ctrl.parent_win:
+					ctrl.parent_win.redraw_tab(ctrl)
 			gajim.contacts.remove_gc_contact(self.account, gc_contact)
 		gajim.gc_connected[self.account][self.room_jid] = False
 		ChatControlBase.got_disconnected(self)
@@ -1455,10 +1455,6 @@ class GroupchatControl(ChatControlBase):
 			del self.handlers[i]
 		# Remove unread events from systray
 		gajim.events.remove_events(self.account, self.room_jid)
-		contact = gajim.contacts.get_contact_with_highest_priority(self.account, \
-			self.room_jid)
-		if contact:
-			gajim.interface.roster.remove_contact(contact, self.account)
 
 	def allow_shutdown(self, method):
 		'''If check_selection is True, '''
diff --git a/src/roster_window.py b/src/roster_window.py
index 374fb425e1..bd60d3170b 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -588,8 +588,7 @@ class RosterWindow:
 		name = gobject.markup_escape_text(contact.get_shown_name())
 
 		# gets number of unread gc marked messages
-		if gajim.interface.minimized_controls.has_key(account) and \
-		jid in gajim.interface.minimized_controls[account]:
+		if jid in gajim.interface.minimized_controls[account]:
 			nb_unread = len(gajim.events.get_events(account, jid,
 				['printed_marked_gc_msg']))
 			nb_unread += \
@@ -748,38 +747,37 @@ class RosterWindow:
 			win.set_active_tab(room_jid,  account)
 			dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid)
 			return
-		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)
-			return
+		minimized_control_exists = False
+		if room_jid in gajim.interface.minimized_controls[account]:
+			minimized_control_exists = True
 		invisible_show = gajim.SHOW_LIST.index('invisible')
 		if gajim.connections[account].connected == invisible_show:
 			dialogs.ErrorDialog(
 				_('You cannot join a group chat while you are invisible'))
 			return
-		if minimize:
+		if minimize and not minimized_control_exists:
 			contact = gajim.contacts.create_contact(jid = room_jid, name = nick)
 			gc_control = GroupchatControl(None, contact, account)
-			if not gajim.interface.minimized_controls.has_key(account):
-				gajim.interface.minimized_controls[account] = {}
 			gajim.interface.minimized_controls[account][room_jid] = gc_control
 			gajim.connections[account].join_gc(nick, room_jid, password)
 			if password:
 				gajim.gc_passwords[room_jid] = password
 			self.add_groupchat_to_roster(account, room_jid)
 			return
-		if not gajim.interface.msg_win_mgr.has_window(room_jid, account):
+		if not minimized_control_exists and \
+			not gajim.interface.msg_win_mgr.has_window(room_jid, account):
 			self.new_room(room_jid, nick, account)
-		contact = gajim.contacts.get_contact_with_highest_priority(account, \
-			room_jid)
-		if contact:
-			self.add_groupchat_to_roster(account, room_jid)
-		gc_win = gajim.interface.msg_win_mgr.get_window(room_jid, account)
-		gc_win.set_active_tab(room_jid, account)
-		gc_win.window.present()
+		if not minimized_control_exists:
+			gc_win = gajim.interface.msg_win_mgr.get_window(room_jid, account)
+			gc_win.set_active_tab(room_jid, account)
+			gc_win.window.present()
 		gajim.connections[account].join_gc(nick, room_jid, password)
 		if password:
 			gajim.gc_passwords[room_jid] = password
+		contact = gajim.contacts.get_contact_with_highest_priority(account, \
+			room_jid)
+		if contact or minimized_control_exists:
+			self.add_groupchat_to_roster(account, room_jid)
 
 	def on_actions_menuitem_activate(self, widget):
 		self.make_menu()
@@ -2456,8 +2454,7 @@ class RosterWindow:
 		contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
 		menu = gtk.Menu()
 
-		if gajim.interface.minimized_controls.has_key(account) and \
-		jid in gajim.interface.minimized_controls[account]:
+		if jid in gajim.interface.minimized_controls[account]:
 			maximize_menuitem = gtk.ImageMenuItem(_('_Maximize'))
 			icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU)
 			maximize_menuitem.set_image(icon)
@@ -2487,8 +2484,6 @@ class RosterWindow:
 
 	def on_groupchat_maximized(self, widget, jid, account):
 		'''When a groupchat is maximised'''
-		if not gajim.interface.minimized_controls.has_key(account):
-			return
 		if not gajim.interface.minimized_controls[account].has_key(jid):
 			return
 
@@ -2502,13 +2497,15 @@ class RosterWindow:
 		mw.new_tab(ctrl)
 		mw.set_active_tab(jid, account)
 		mw.window.present()
+		del gajim.interface.minimized_controls[account][jid]
 
 		contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
+		if not contact:
+			return
 		if contact.groups == [_('Groupchats')]:
 			self.remove_contact(contact, account)
 			gajim.contacts.remove_contact(account, contact)
 			self.draw_group(_('Groupchats'), account)
-		del gajim.interface.minimized_controls[account][jid]
 
 	def make_group_menu(self, event, iter):
 		'''Make group's popup menu'''
@@ -3312,8 +3309,6 @@ class RosterWindow:
 				gajim.interface.status_sent_to_users[account] = {}
 			if gajim.interface.status_sent_to_groups.has_key(account):
 				gajim.interface.status_sent_to_groups[account] = {}
-			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(
 			message_control.TYPE_GC) + \
 			gajim.interface.minimized_controls[account].values():
@@ -4067,8 +4062,7 @@ class RosterWindow:
 				self.tree.collapse_row(path)
 			else:
 				self.tree.expand_row(path, False)
-		elif gajim.interface.minimized_controls.has_key(account) and \
-		gajim.interface.minimized_controls[account].has_key(jid):
+		elif jid in gajim.interface.minimized_controls[account]:
 			self.on_groupchat_maximized(None, jid, account)
 		else:
 			first_ev = gajim.events.get_first_event(account, jid)
-- 
GitLab