diff --git a/main.c b/main.c index daa42bb..5ab0c69 100644 --- a/main.c +++ b/main.c @@ -195,11 +195,14 @@ static int needs_translation(const char *text) if (words < 1 && strlen(text) < 6) return 0; /* Pre-filter: if text contains common words from skip languages, skip */ - static const struct { const char *lang; const char *words[23]; } lang_words[] = { + static const struct { const char *lang; const char *words[33]; } lang_words[] = { {"swedish", {"jag", "och", "att", "det", "inte", "var", - "som", "för", "med", "har", "den", "kan", - "ska", "till", "eller", "men", "där", - "när", "från", "ett", "en", "ta", + "som", "med", "har", "den", "kan", + "ska", "till", "eller", "men", + "ett", "en", "ta", "vad", "hur", + "dig", "du", "vi", "de", "sig", + "hade", "sedan", "bara", + "\xc3\xa4r", "\xc3\xa5", "f\xc3\xb6r", NULL}}, {"english", {"the", "and", "that", "this", "with", "have", "was", "are", "you", "not", @@ -1178,7 +1181,7 @@ static void handle_input(char *line) const char *chan = args ? args : current_channel(); if (chan[0]) irc_send_raw("PART %s", chan); - } else if (strcasecmp(cmd, "msg") == 0 && args) { + } else if ((strcasecmp(cmd, "msg") == 0 || strcasecmp(cmd, "w") == 0) && args) { char *target = args; char *text = strchr(args, ' '); if (text) { @@ -1663,6 +1666,24 @@ int main(int argc, char *argv[]) input_pos = 0; redraw_input(input_line, input_len, input_pos); } + } else if (ch == 'C') { + /* Arrow right */ + if (input_pos < input_len) { + unsigned char c = input_line[input_pos]; + size_t clen = 1; + if ((c & 0xE0) == 0xC0) clen = 2; + else if ((c & 0xF0) == 0xE0) clen = 3; + else if ((c & 0xF8) == 0xF0) clen = 4; + input_pos += clen; + if (input_pos > input_len) input_pos = input_len; + redraw_input(input_line, input_len, input_pos); + } + } else if (ch == 'D') { + /* Arrow left */ + if (input_pos > 0) { + input_pos -= utf8_back(input_line, input_pos); + redraw_input(input_line, input_len, input_pos); + } } continue; } @@ -1732,7 +1753,30 @@ int main(int argc, char *argv[]) char (*nlist)[NICK_LEN] = NULL; int ncount = 0; - if (current_level >= WL_CHAN) { + /* Check if completing after /msg or /w */ + int after_msg = 0; + input_line[input_len] = '\0'; + if (strncasecmp(input_line, "/msg ", 5) == 0 || + strncasecmp(input_line, "/w ", 3) == 0) { + after_msg = 1; + } + + /* On window 1 with empty input, auto-insert /msg */ + if (current_level == WL_STATUS && input_len == 0 && pm_nick_count > 0) { + after_msg = 1; + memcpy(input_line, "/msg ", 5); + input_len = 5; + input_pos = 5; + tab_start = 5; + tab_prefix_len = 0; + tab_end = 5; + tab_idx = 0; + } + + if (after_msg) { + nlist = pm_nicks; + ncount = pm_nick_count; + } else if (current_level >= WL_CHAN) { int cidx = current_level - WL_CHAN; nlist = win_chans[cidx].nicks; ncount = win_chans[cidx].nick_count;