about summary refs log tree commit diff stats
path: root/src/ui/window_list.c
diff options
context:
space:
mode:
authorMichael Vetter <jubalh@iodoru.org>2020-05-20 14:15:53 +0200
committerGitHub <noreply@github.com>2020-05-20 14:15:53 +0200
commit7862542c58cf8319b1609b01c24deedb797854fe (patch)
tree3f87ef6e933d4a6df49c0fd4e8a319618ef46444 /src/ui/window_list.c
parent7d7f0ef5a5a40257996df52aaff58599fddd11d5 (diff)
parent7b541d0a6d196499712f4e7c9854aa294ac16167 (diff)
downloadprofani-tty-7862542c58cf8319b1609b01c24deedb797854fe.tar.gz
Merge pull request #1341 from profanity-im/feature/urlopen
Add urlopen command
Diffstat (limited to 'src/ui/window_list.c')
-rw-r--r--src/ui/window_list.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/ui/window_list.c b/src/ui/window_list.c
index b1c01c41..e506a957 100644
--- a/src/ui/window_list.c
+++ b/src/ui/window_list.c
@@ -534,7 +534,7 @@ wins_close_by_num(int i)
                         }
                     }
                 }
-
+                autocomplete_free(window->urls_ac);
                 break;
             }
             case WIN_MUC:
@@ -546,6 +546,7 @@ wins_close_by_num(int i)
                 if (mucwin->last_msg_timestamp) {
                     g_date_time_unref(mucwin->last_msg_timestamp);
                 }
+                autocomplete_free(window->urls_ac);
                 break;
             }
             case WIN_PRIVATE:
@@ -553,6 +554,7 @@ wins_close_by_num(int i)
                 ProfPrivateWin *privwin = (ProfPrivateWin*)window;
                 autocomplete_remove(wins_ac, privwin->fulljid);
                 autocomplete_remove(wins_close_ac, privwin->fulljid);
+                autocomplete_free(window->urls_ac);
                 break;
             }
             case WIN_XML:
@@ -624,6 +626,7 @@ wins_new_chat(const char *const barejid)
             autocomplete_add(wins_close_ac, nick);
         }
     }
+    newwin->urls_ac = autocomplete_new();
 
     return newwin;
 }
@@ -638,6 +641,8 @@ wins_new_muc(const char *const roomjid)
     g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
     autocomplete_add(wins_ac, roomjid);
     autocomplete_add(wins_close_ac, roomjid);
+    newwin->urls_ac = autocomplete_new();
+
     return newwin;
 }
 
@@ -649,6 +654,7 @@ wins_new_config(const char *const roomjid, DataForm *form, ProfConfWinCallback s
     g_list_free(keys);
     ProfWin *newwin = win_create_config(roomjid, form, submit, cancel, userdata);
     g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
+
     return newwin;
 }
 
@@ -662,6 +668,8 @@ wins_new_private(const char *const fulljid)
     g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
     autocomplete_add(wins_ac, fulljid);
     autocomplete_add(wins_close_ac, fulljid);
+    newwin->urls_ac = autocomplete_new();
+
     return newwin;
 }
 
@@ -1141,3 +1149,36 @@ wins_get_next_unread(void)
     g_list_free(values);
     return NULL;
 }
+
+void
+wins_add_urls_ac(const ProfWin *const win, const ProfMessage *const message)
+{
+    GRegex *regex;
+    GMatchInfo *match_info;
+
+    regex = g_regex_new("https?://\\S+", 0, 0, NULL);
+    g_regex_match (regex, message->plain, 0, &match_info);
+
+    while (g_match_info_matches (match_info))
+    {
+        gchar *word = g_match_info_fetch (match_info, 0);
+
+        autocomplete_add(win->urls_ac, word);
+        // for people who run profanity a long time, we don't want to waste a lot of memory
+        autocomplete_remove_older_than_max(win->urls_ac, 20);
+
+        g_free (word);
+        g_match_info_next (match_info, NULL);
+    }
+
+    g_match_info_free (match_info);
+    g_regex_unref (regex);
+}
+
+char*
+wins_get_url(const char *const search_str, gboolean previous, void *context)
+{
+    ProfWin *win = (ProfWin*)context;
+
+    return autocomplete_complete(win->urls_ac, search_str, FALSE, previous);
+}