From 083bf34a7763aec7c95282e1b357ee4cf71c49fd Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Sat, 16 May 2020 21:52:30 +0200 Subject: [PATCH] Start urlopen feature Start https://github.com/profanity-im/profanity/issues/1340 --- src/command/cmd_ac.c | 23 +++++++++++++++++++++++ src/ui/buffer.c | 15 +++++++++++++++ src/ui/buffer.h | 1 + 3 files changed, 39 insertions(+) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 85800f99..713653b4 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -54,6 +54,7 @@ #include "xmpp/muc.h" #include "xmpp/xmpp.h" #include "xmpp/roster_list.h" +#include "ui/buffer.h" #ifdef HAVE_LIBGPGME #include "pgp/gpg.h" @@ -122,6 +123,7 @@ static char* _avatar_autocomplete(ProfWin *window, const char *const input, gboo static char* _correction_autocomplete(ProfWin *window, const char *const input, gboolean previous); static char* _correct_autocomplete(ProfWin *window, const char *const input, gboolean previous); static char* _software_autocomplete(ProfWin *window, const char *const input, gboolean previous); +static char* _urlopen_autocomplete(ProfWin *window, const char *const input, gboolean previous); static char* _script_autocomplete_func(const char *const prefix, gboolean previous, void *context); @@ -1721,6 +1723,7 @@ _cmd_ac_complete_params(ProfWin *window, const char *const input, gboolean previ g_hash_table_insert(ac_funcs, "/correction", _correction_autocomplete); g_hash_table_insert(ac_funcs, "/correct", _correct_autocomplete); g_hash_table_insert(ac_funcs, "/software", _software_autocomplete); + g_hash_table_insert(ac_funcs, "/urlopen", _urlopen_autocomplete); int len = strlen(input); char parsed[len+1]; @@ -3912,3 +3915,23 @@ _software_autocomplete(ProfWin *window, const char *const input, gboolean previo return result; } + +static char* +_urlopen_autocomplete(ProfWin *window, const char *const input, gboolean previous) +{ + if (window->type == WIN_CONSOLE){ + return NULL; + } + + ProfBuffEntry *entry = buffer_get_url(window->layout->buffer, NULL); + if (entry && entry->message) { + GString *result_str = g_string_new("/urlopen "); + g_string_append(result_str, entry->message); + char *result = result_str->str; + g_string_free(result_str, FALSE); + return result; + } + + return NULL; +} + diff --git a/src/ui/buffer.c b/src/ui/buffer.c index 54178632..9b7d3f14 100644 --- a/src/ui/buffer.c +++ b/src/ui/buffer.c @@ -162,6 +162,21 @@ buffer_get_entry_by_id(ProfBuff buffer, const char *const id) return NULL; } +ProfBuffEntry* +buffer_get_url(ProfBuff buffer, const char *const id) +{ + GSList *entries = buffer->entries; + while (entries) { + ProfBuffEntry *entry = entries->data; + if (strstr(entry->message, "http://")) { + return entry; + } + entries = g_slist_next(entries); + } + + return NULL; +} + static void _free_entry(ProfBuffEntry *entry) { diff --git a/src/ui/buffer.h b/src/ui/buffer.h index 997e2a49..f9b9030c 100644 --- a/src/ui/buffer.h +++ b/src/ui/buffer.h @@ -73,5 +73,6 @@ int buffer_size(ProfBuff buffer); ProfBuffEntry* buffer_get_entry(ProfBuff buffer, int entry); ProfBuffEntry* buffer_get_entry_by_id(ProfBuff buffer, const char *const id); gboolean buffer_mark_received(ProfBuff buffer, const char *const id); +ProfBuffEntry* buffer_get_url(ProfBuff buffer, const char *const id); #endif