From ded1053f8b525e78d1121fd7f0a764ec5cc8cc05 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Tue, 17 Mar 2026 05:52:37 -0400 Subject: Tab complete PM nics (private screen only). Also, no need to prefix messages with /m in server or private screens. --- src/complete.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/complete.c (limited to 'src/complete.c') diff --git a/src/complete.c b/src/complete.c new file mode 100644 index 0000000..0ac00a7 --- /dev/null +++ b/src/complete.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include "addrs.h" +#include "edbox.h" +#include "screen.h" +#include "irc.h" + +#define COMP_S1 1 +#define COMP_PM 2 +#define COMP_CHAN 3 + +#define MAX_PM_NICKS 10 + +static char search_pos = 0, in_progress = 0; +static char prefix[33]; + +char comp_pm_nicks[MAX_PM_NICKS][25]; +char (*list)[25] = comp_pm_nicks; + +static char pm_nick_pos = 0; /* insertion point for _add() */ + +void comp_add_pm_nick(const char *n) { + int i; + + for(i = 0; i < 25; i++) + if(strncmp(n, comp_pm_nicks[i], 24) == 0) + return; + + strncpy(comp_pm_nicks[pm_nick_pos], n, 24); + pm_nick_pos++; + pm_nick_pos %= MAX_PM_NICKS; +} + +char match(const char *p, const char *q) { + int len; + + len = strlen(prefix); + if(!len) return 0; + + while(len--) { + if(tolower(*p) != tolower(*q)) + return 0; + p++, q++; + } + return 1; +} + +void comp_complete_done(void) { + in_progress = 0; +} + +void comp_continue(void) { + search_pos %= MAX_PM_NICKS; + while(search_pos < MAX_PM_NICKS) { + if(match(prefix, list[search_pos])) { + edbox_set(list[search_pos]); + search_pos++; + return; + } + search_pos++; + } + edbox_set(prefix); + comp_complete_done(); +} + +void comp_start(void) { + if(scr_current != SCR_PRIV) + return; + + /* just insert the last nick if there's nothing to search for */ + if(!edbox_len) { + if(*last_pm_nick) edbox_set(last_pm_nick); + } else { + in_progress = COMP_PM; + search_pos = 0; + strncpy(prefix, edit_box, 24); + list = comp_pm_nicks; + comp_continue(); + } +} + +void comp_complete(void) { + if(in_progress) + comp_continue(); + else + comp_start(); +} + -- cgit v1.2.3