about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/command.c31
-rw-r--r--src/xmpp/presence.c12
-rw-r--r--src/xmpp/xmpp.h2
3 files changed, 44 insertions, 1 deletions
diff --git a/src/command/command.c b/src/command/command.c
index cebb10c2..d22e3953 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -74,6 +74,7 @@ static gboolean _cmd_set_boolean_preference(gchar *arg, struct cmd_help_t help,
     const char * const display, preference_t pref);
 
 static void _cmd_complete_parameters(char *input, int *size);
+static void _sub_autocomplete(char *input, int *size);
 static void _notify_autocomplete(char *input, int *size);
 static void _titlebar_autocomplete(char *input, int *size);
 static void _theme_autocomplete(char *input, int *size);
@@ -965,6 +966,7 @@ cmd_reset_autocomplete()
     accounts_reset_all_search();
     accounts_reset_enabled_search();
     prefs_reset_boolean_choice();
+    presence_reset_sub_request_search();
     autocomplete_reset(help_ac);
     autocomplete_reset(notify_ac);
     autocomplete_reset(sub_ac);
@@ -1181,13 +1183,13 @@ _cmd_complete_parameters(char *input, int *size)
 
     _parameter_autocomplete(input, size, "/connect",
         accounts_find_enabled);
-    _parameter_autocomplete_with_ac(input, size, "/sub", sub_ac);
     _parameter_autocomplete_with_ac(input, size, "/help", help_ac);
     _parameter_autocomplete_with_ac(input, size, "/who", who_ac);
     _parameter_autocomplete_with_ac(input, size, "/prefs", prefs_ac);
     _parameter_autocomplete_with_ac(input, size, "/log", log_ac);
     _parameter_autocomplete_with_ac(input, size, "/disco", disco_ac);
 
+    _sub_autocomplete(input, size);
     _notify_autocomplete(input, size);
     _autoaway_autocomplete(input, size);
     _titlebar_autocomplete(input, size);
@@ -3074,6 +3076,33 @@ _parameter_autocomplete_with_ac(char *input, int *size, char *command,
 }
 
 static void
+_sub_autocomplete(char *input, int *size)
+{
+    char *found = NULL;
+    char *auto_msg = NULL;
+    char inp_cpy[*size];
+    int i;
+
+    if ((strncmp(input, "/sub allow ", 11) == 0) && (*size > 11)) {
+        for (i = 11; i < *size; i++) {
+            inp_cpy[i-11] = input[i];
+        }
+        inp_cpy[(*size) - 11] = '\0';
+        found = presence_sub_request_find(inp_cpy);
+        if (found != NULL) {
+            auto_msg = (char *) malloc((11 + (strlen(found) + 1)) * sizeof(char));
+            strcpy(auto_msg, "/sub allow ");
+            strcat(auto_msg, found);
+            inp_replace_input(input, auto_msg, size);
+            free(auto_msg);
+            free(found);
+        }
+    } else if ((strncmp(input, "/sub ", 5) == 0) && (*size > 5)) {
+        _parameter_autocomplete_with_ac(input, size, "/sub", sub_ac);
+    }
+}
+
+static void
 _notify_autocomplete(char *input, int *size)
 {
     char *found = NULL;
diff --git a/src/xmpp/presence.c b/src/xmpp/presence.c
index 1bd1ec93..4f450f70 100644
--- a/src/xmpp/presence.c
+++ b/src/xmpp/presence.c
@@ -141,6 +141,18 @@ presence_free_sub_requests(void)
     autocomplete_free(sub_requests_ac);
 }
 
+char *
+presence_sub_request_find(char * search_str)
+{
+    return autocomplete_complete(sub_requests_ac, search_str);
+}
+
+void
+presence_reset_sub_request_search(void)
+{
+    autocomplete_reset(sub_requests_ac);
+}
+
 void
 presence_update(const resource_presence_t presence_type, const char * const msg,
     const int idle)
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index c38674b4..ff30ba90 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -105,6 +105,8 @@ void message_send_duck(const char * const query);
 void presence_subscription(const char * const jid, const jabber_subscr_t action);
 GSList* presence_get_subscription_requests(void);
 gint presence_sub_request_count(void);
+void presence_reset_sub_request_search(void);
+char * presence_sub_request_find(char * search_str);
 void presence_join_room(Jid *jid);
 void presence_change_room_nick(const char * const room, const char * const nick);
 void presence_leave_chat_room(const char * const room_jid);