aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/complete.c62
1 files changed, 59 insertions, 3 deletions
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 */