about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2016-02-03 22:19:29 +0000
committerJames Booth <boothj5@gmail.com>2016-02-03 22:19:29 +0000
commit30116dd922d57e6676118b47a7c59bdaa838406d (patch)
treebaf7de23db7e978bd97e4714708504d5df9d41f4
parent46b27bcbd8ca0dd89194c4192446d5386eb6013d (diff)
downloadprofani-tty-30116dd922d57e6676118b47a7c59bdaa838406d.tar.gz
Update autocompleters on roster nick change/clear
fixes #720
-rw-r--r--src/command/commands.c9
-rw-r--r--src/window_list.c26
-rw-r--r--src/window_list.h2
3 files changed, 37 insertions, 0 deletions
diff --git a/src/command/commands.c b/src/command/commands.c
index c8c01778..d4e635c1 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -2665,10 +2665,15 @@ cmd_roster(ProfWin *window, const char *const command, gchar **args)
         }
 
         const char *barejid = p_contact_barejid(contact);
+
+        // TODO wait for result stanza before updating
+        const char *oldnick = p_contact_name(contact);
+        wins_change_nick(barejid, oldnick, name);
         roster_change_name(contact, name);
         GSList *groups = p_contact_groups(contact);
         roster_send_name_change(barejid, name, groups);
 
+
         cons_show("Nickname for %s set to: %s.", jid, name);
 
         return TRUE;
@@ -2693,6 +2698,10 @@ cmd_roster(ProfWin *window, const char *const command, gchar **args)
         }
 
         const char *barejid = p_contact_barejid(contact);
+
+        // TODO wait for result stanza before updating
+        const char *oldnick = p_contact_name(contact);
+        wins_remove_nick(barejid, oldnick);
         roster_change_name(contact, NULL);
         GSList *groups = p_contact_groups(contact);
         roster_send_name_change(barejid, NULL, groups);
diff --git a/src/window_list.c b/src/window_list.c
index e4ef8a64..62576b84 100644
--- a/src/window_list.c
+++ b/src/window_list.c
@@ -221,6 +221,32 @@ wins_private_nick_change(const char *const roomjid, const char *const oldnick, c
     jid_destroy(oldjid);
 }
 
+void
+wins_change_nick(const char *const barejid, const char *const oldnick, const char *const newnick)
+{
+    ProfChatWin *chatwin = wins_get_chat(barejid);
+    if (chatwin) {
+        if (oldnick) {
+            autocomplete_remove(wins_ac, oldnick);
+            autocomplete_remove(wins_close_ac, oldnick);
+        }
+        autocomplete_add(wins_ac, newnick);
+        autocomplete_add(wins_close_ac, newnick);
+    }
+}
+
+void
+wins_remove_nick(const char *const barejid, const char *const oldnick)
+{
+    ProfChatWin *chatwin = wins_get_chat(barejid);
+    if (chatwin) {
+        if (oldnick) {
+            autocomplete_remove(wins_ac, oldnick);
+            autocomplete_remove(wins_close_ac, oldnick);
+        }
+    }
+}
+
 ProfWin*
 wins_get_current(void)
 {
diff --git a/src/window_list.h b/src/window_list.h
index 3c4c29fe..7037e80e 100644
--- a/src/window_list.h
+++ b/src/window_list.h
@@ -48,6 +48,8 @@ ProfWin* wins_new_private(const char *const fulljid);
 gboolean wins_chat_exists(const char *const barejid);
 GList* wins_get_private_chats(const char *const roomjid);
 void wins_private_nick_change(const char *const roomjid, const char *const oldnick, const char *const newnick);
+void wins_change_nick(const char *const barejid, const char *const oldnick, const char *const newnick);
+void wins_remove_nick(const char *const barejid, const char *const oldnick);
 
 ProfWin* wins_get_console(void);
 ProfChatWin* wins_get_chat(const char *const barejid);