chat windows opened in maximized state, stealing focus

Olaf Hering olaf at
Thu Jun 27 08:31:31 EDT 2019

Am Fri, 22 Mar 2019 07:56:25 +0100
schrieb Olaf Hering <olaf at>:

> If for some reason the connection to GroupWise, IRC or RocketChat has to be (re)stablished, pidgin will just open a maximized, non-foreground window over all other open windows. This window may sometimes still have the keyboard focus, so test one is about to type ends up in the wrong window.

I think the required fix in the release-2.x.y and default branch will look like shown below.

It unveiled an longstanding bug: 
irc_msg_topicinfo() marks every just joined channel with a topic as unread. IRC msg "333" is most likely not very useful, despite bug#13317. Bug#15502 exist to track this breakage. The call to purple_conv_chat_write() needs a flag to mark the message as read, not sure which of the existing PurpleMessageFlags allows that.

Now that chats are not stealing focus anymore once they are joined (joining is an asynchronous event that will happen multiple times at any random point in the future) it turned out that the IRC '/join #channel' command will not work anymore. If a channel is joined via the Buddy menu, gtk_blist_join_chat() uses the purple_conversation_present() API to present the joined chat. In this context it is known that the window must be shown. But a simple '/JOIN' typed into a chat window does not have any context. Such chat will be joined, but it will not have a UI representation. I'm not sure how to fix that. Perhaps the code that receives the typed text needs to extract potential commands and create an UI representation. Are there other protocols that have a concept of a manual '/JOIN' command?

Let me know if I shall open a pull request for this patch.


 pidgin/gtkblist.c |  7 ++++---
 pidgin/gtkconv.c  | 35 ++++++++---------------------------
 2 files changed, 12 insertions(+), 30 deletions(-)

--- a/pidgin/gtkblist.c
+++ b/pidgin/gtkblist.c
@@ -394,11 +394,12 @@ static void gtk_blist_join_chat(PurpleChat *chat)
 	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, name,
-	if (conv != NULL) {
+	if (conv)
-		purple_conversation_present(conv);
-	}
+	else
+		conv = purple_conversation_new(PURPLE_CONV_TYPE_CHAT, account, name);
+	purple_conversation_present(conv);
 	serv_join_chat(purple_account_get_connection(account), components);
--- a/pidgin/gtkconv.c
+++ b/pidgin/gtkconv.c
@@ -5312,8 +5312,8 @@ static void set_typing_font(GtkWidget *widget, GtkStyle *style, PidginConversati
  * Conversation UI operations
-static void
-private_gtkconv_new(PurpleConversation *conv, gboolean hidden)
+pidgin_conv_new(PurpleConversation *conv)
 	PidginConversation *gtkconv;
 	PurpleConversationType conv_type = purple_conversation_get_type(conv);
@@ -5429,10 +5429,7 @@ private_gtkconv_new(PurpleConversation *conv, gboolean hidden)
-	if (hidden)
-		pidgin_conv_window_add_gtkconv(hidden_convwin, gtkconv);
-	else
-		pidgin_conv_placement_place(gtkconv);
+	pidgin_conv_window_add_gtkconv(hidden_convwin, gtkconv);
 	if (nick_colors == NULL) {
 		nbr_nick_colors = NUM_NICK_COLORS;
@@ -5443,26 +5440,10 @@ private_gtkconv_new(PurpleConversation *conv, gboolean hidden)
-static void
-pidgin_conv_new_hidden(PurpleConversation *conv)
-	private_gtkconv_new(conv, TRUE);
-pidgin_conv_new(PurpleConversation *conv)
-	private_gtkconv_new(conv, FALSE);
-		purple_signal_emit(pidgin_conversations_get_handle(),
-				"conversation-displayed", PIDGIN_CONVERSATION(conv));
 static void
 received_im_msg_cb(PurpleAccount *account, char *sender, char *message,
 				   PurpleConversation *conv, PurpleMessageFlags flags)
-	PurpleConversationUiOps *ui_ops = pidgin_conversations_get_conv_ui_ops();
 	gboolean hide = FALSE;
 	guint timer;
@@ -5483,11 +5464,11 @@ received_im_msg_cb(PurpleAccount *account, char *sender, char *message,
-	if (hide) {
-		ui_ops->create_conversation = pidgin_conv_new_hidden;
+	if (hide)
 		purple_conversation_new(PURPLE_CONV_TYPE_IM, account, sender);
-		ui_ops->create_conversation = pidgin_conv_new;
-	}
+	else if (conv)
+		purple_conversation_present(conv);
 	/* Somebody wants to keep this conversation around, so don't time it out */
 	if (conv) {
@@ -7792,7 +7773,7 @@ pidgin_conv_attach(PurpleConversation *conv)
 	purple_conversation_set_data(conv, "unseen-state", NULL);
 	purple_conversation_set_ui_ops(conv, pidgin_conversations_get_conv_ui_ops());
-		private_gtkconv_new(conv, FALSE);
+		pidgin_conv_new(conv);
 	timer = GPOINTER_TO_INT(purple_conversation_get_data(conv, "close-timer"));
 	if (timer) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: Digitale Signatur von OpenPGP
URL: <>

More information about the Devel mailing list