From 5fc2f41a80a1ef6f62b95dc96ee352564a5ff221 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Wed, 18 Mar 2026 01:00:56 -0400 Subject: Nick completion in channels --- src/complete.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/complete.c b/src/complete.c index f7ec731..130a015 100644 --- a/src/complete.c +++ b/src/complete.c @@ -17,6 +17,7 @@ static char prefix[33]; char comp_pm_nicks[MAX_PM_NICKS][25]; char comp_pm_chans[MAX_PM_NICKS][25]; +char comp_chan_nicks[MAX_PM_NICKS][25]; char (*list)[25] = comp_pm_nicks; char (*add_to)[25] = comp_pm_nicks; @@ -61,6 +62,60 @@ char match(const char *p, const char *q) { return 1; } +void scrape_nick(char *p) { + char i; + + if(*p == '<' || *p == 0xbc) { + /* normal or inverse < in column 0 is a nick */ + p++; + } else if(*p == '*' && p[1] == ' ') { + p += 2; /* /me action, skip the "* " */ + } else { + return; + } + + if(*p & 0x80) /* skip highlighted own nick! */ + return; + + for(i = 0; i < 24; i++) { + switch(p[i]) { + case '>': + case 0xbe: /* inverse > */ + case ' ': + list[pm_nick_pos++][i] = 0; + return; /* found one, terminate and return */ + case 0: + list[pm_nick_pos][0] = 0; + return; /* if it ends with a null, it's not a nick */ + default: + list[pm_nick_pos][i] = p[i]; + break; + } + } + list[pm_nick_pos][0] = 0; +} + +void find_chan_nicks(void) { + signed char i; + char *p; + + add_to = comp_chan_nicks; + pm_nick_pos = 0; + + for(i = 22; i >= 0; i--) { + p = screen_bot_addrs[scr_current] + 40 * i; + scrape_nick(p); + if(pm_nick_pos == MAX_PM_NICKS) + return; + } + for(i = 24; i >= 0; i--) { + scrape_nick(p); + p = screen_top_addrs[scr_current] + 40 * i; + if(pm_nick_pos == MAX_PM_NICKS) + return; + } +} + void comp_complete_done(void) { in_progress = 0; } @@ -89,9 +144,10 @@ void comp_start(void) { } else if(scr_current == SCR_PRIV) { p = last_pm_nick; list = comp_pm_nicks; - } else { - /* channel screens not yet supported */ - return; + } else if(scr_names[scr_current][0] == '#') { + p = last_pm_nick; // XXX: there should be a last_hilite_nick! + find_chan_nicks(); + list = comp_chan_nicks; } /* just insert the last nick/chan if there's nothing to search for */ -- cgit v1.2.3