# HG changeset patch # User Mikael Berthe # Date 1175625028 -7200 # Node ID 334ae9f498f17494dd542ab117223174c85093f4 # Parent 03a38b7ad2e0d1c4ed25a4e31cbc26e2b65c426a Add some more iline functions (Lego12239) diff -r 03a38b7ad2e0 -r 334ae9f498f1 mcabber/src/commands.c --- a/mcabber/src/commands.c Wed Mar 14 21:33:17 2007 +0100 +++ b/mcabber/src/commands.c Tue Apr 03 20:30:28 2007 +0200 @@ -71,6 +71,8 @@ static void do_help(char *arg); static void do_pgp(char *arg); static void do_iline(char *arg); +static void do_screen_refresh(char *arg); +static void do_chat_disable(char *arg); // Global variable for the commands list static GSList *Commands; @@ -134,6 +136,8 @@ COMPL_JID, COMPL_STATUS, &do_status_to); cmd_add("version", "Show mcabber version", 0, 0, &do_version); cmd_add("iline", "Manipulate input buffer", 0, 0, &do_iline); + cmd_add("screen_refresh", "Redraw mcabber screen", 0, 0, &do_screen_refresh); + cmd_add("chat_disable", "Disable chat mode", 0, 0, &do_chat_disable); // Status category compl_add_category_word(COMPL_STATUS, "online"); @@ -2727,6 +2731,12 @@ readline_forward_kill_word(); } else if (!strcasecmp(arg, "word_bdel")) { readline_backward_kill_word(); + } else if (!strcasecmp(arg, "word_upcase")) { + readline_updowncase_word(1); + } else if (!strcasecmp(arg, "word_downcase")) { + readline_updowncase_word(0); + } else if (!strcasecmp(arg, "word_capit")) { + readline_capitalize_word(); } else if (!strcasecmp(arg, "fchar")) { readline_forward_char(); } else if (!strcasecmp(arg, "bchar")) { @@ -2735,7 +2745,7 @@ readline_forward_kill_char(); } else if (!strcasecmp(arg, "char_bdel")) { readline_backward_kill_char(); - } else if (!strcasecmp(arg, "char_swp")) { + } else if (!strcasecmp(arg, "char_swap")) { readline_transpose_chars(); } else if (!strcasecmp(arg, "hist_prev")) { readline_hist_prev(); @@ -2751,9 +2761,27 @@ readline_backward_kill_iline(); } else if (!strcasecmp(arg, "send_multiline")) { readline_send_multiline(); + } else if (!strcasecmp(arg, "iline_accept")) { + readline_accept_line(); + } else if (!strcasecmp(arg, "iline_accept_down_hist")) { // May be too long + readline_accept_line_down_hist(); + } else if (!strcasecmp(arg, "compl_cancel")) { + readline_cancel_completion(); + } else if (!strcasecmp(arg, "compl_do")) { + readline_do_completion(); } } +static void do_screen_refresh(char *arg) +{ + readline_refresh_screen(); +} + +static void do_chat_disable(char *arg) +{ + readline_disable_chat_mode(); +} + static void do_connect(char *arg) { mcabber_connect(); diff -r 03a38b7ad2e0 -r 334ae9f498f1 mcabber/src/screen.c --- a/mcabber/src/screen.c Wed Mar 14 21:33:17 2007 +0100 +++ b/mcabber/src/screen.c Tue Apr 03 20:30:28 2007 +0200 @@ -51,6 +51,10 @@ static unsigned short int Roster_Width; static inline void check_offset(int); +static void scr_cancel_current_completion(void); +static void scr_end_current_completion(void); +static void scr_insert_text(const char*); +static void scr_handle_tab(void); static GHashTable *winbufhash; @@ -2313,26 +2317,25 @@ // Move back to the start of the current or previous word void readline_backward_word(void) { - char *old_ptr_inputLine = ptr_inputline; - int spaceallowed = 1; + int i = 0; if (ptr_inputline == inputLine) return; - for (ptr_inputline = prev_char(ptr_inputline, inputLine) ; - ptr_inputline > inputLine ; - ptr_inputline = prev_char(ptr_inputline, inputLine)) { + if (iswalnum(get_char(ptr_inputline)) && + !iswalnum(get_char(prev_char(ptr_inputline, inputLine)))) + i--; + + for( ; + ptr_inputline > inputLine; + ptr_inputline = prev_char(ptr_inputline, inputLine)) { if (!iswalnum(get_char(ptr_inputline))) { - if (iswblank(get_char(ptr_inputline))) { - if (!spaceallowed) break; - } else spaceallowed = 0; - } else spaceallowed = 0; + if (i) { + ptr_inputline = next_char(ptr_inputline); + break; + } + } else i++; } - if (ptr_inputline < prev_char(old_ptr_inputLine, inputLine) - && iswblank(get_char(ptr_inputline)) - && iswblank(get_char(next_char(ptr_inputline)))) - ptr_inputline = next_char(ptr_inputline); - check_offset(-1); } @@ -2340,15 +2343,54 @@ // Move forward to the end of the next word void readline_forward_word(void) { - int spaceallowed = 1; + int stopsymbol_allowed = 1; + + while (*ptr_inputline) { + if (!iswalnum(get_char(ptr_inputline))) { + if (!stopsymbol_allowed) break; + } else stopsymbol_allowed = 0; + ptr_inputline = next_char(ptr_inputline); + } + + check_offset(1); +} + +void readline_updowncase_word(int upcase) +{ + int stopsymbol_allowed = 1; while (*ptr_inputline) { - ptr_inputline = next_char(ptr_inputline); if (!iswalnum(get_char(ptr_inputline))) { - if (iswblank(get_char(ptr_inputline))) { - if (!spaceallowed) break; - } else spaceallowed = 0; - } else spaceallowed = 0; + if (!stopsymbol_allowed) break; + } else { + stopsymbol_allowed = 0; + if (upcase) + *ptr_inputline = towupper(get_char(ptr_inputline)); + else + *ptr_inputline = towlower(get_char(ptr_inputline)); + } + ptr_inputline = next_char(ptr_inputline); + } + + check_offset(1); +} + +void readline_capitalize_word(void) +{ + int stopsymbol_allowed = 1; + int upcased = 0; + + while (*ptr_inputline) { + if (!iswalnum(get_char(ptr_inputline))) { + if (!stopsymbol_allowed) break; + } else { + stopsymbol_allowed = 0; + if (!upcased) { + *ptr_inputline = towupper(get_char(ptr_inputline)); + upcased = 1; + } else *ptr_inputline = towlower(get_char(ptr_inputline)); + } + ptr_inputline = next_char(ptr_inputline); } check_offset(1); @@ -2370,6 +2412,93 @@ check_offset(1); } +int readline_accept_line(void) +{ + scr_CheckAutoAway(TRUE); + if (process_line(inputLine)) + return 255; + // Add line to history + scr_cmdhisto_addline(inputLine); + // Reset the line + ptr_inputline = inputLine; + *ptr_inputline = 0; + inputline_offset = 0; + + // Reset history line pointer + cmdhisto_cur = NULL; + + return 0; +} + +int readline_accept_line_down_hist(void) +{ + scr_CheckAutoAway(TRUE); + if (process_line(inputLine)) + return 255; + // Add line to history + scr_cmdhisto_addline(inputLine); + // Reset the line + ptr_inputline = inputLine; + *ptr_inputline = 0; + inputline_offset = 0; + + // Use next history line instead of a blank line + const char *l = scr_cmdhisto_next("", 0); + if (l) strcpy(inputLine, l); + // Reset backup history line + cmdhisto_backup[0] = 0; + + return 0; +} + +void readline_cancel_completion(void) +{ + scr_cancel_current_completion(); + scr_end_current_completion(); + check_offset(-1); +} + +void readline_do_completion(void) +{ + int i, n; + + if (scr_get_multimode() != 2) { + // Not in verbatim multi-line mode + scr_handle_tab(); + } else { + // Verbatim multi-line mode: expand tab + char tabstr[9]; + n = 8 - (ptr_inputline - inputLine) % 8; + for (i = 0; i < n; i++) + tabstr[i] = ' '; + tabstr[i] = '\0'; + scr_insert_text(tabstr); + } + check_offset(0); +} + +void readline_refresh_screen(void) +{ + scr_CheckAutoAway(TRUE); + ParseColors(); + scr_Resize(); + redrawwin(stdscr); +} + +void readline_disable_chat_mode(void) +{ + scr_CheckAutoAway(TRUE); + currentWindow = NULL; + chatmode = FALSE; + if (current_buddy) + buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, FALSE); + scr_RosterVisibility(1); + scr_UpdateChatStatus(FALSE); + top_panel(chatPanel); + top_panel(inputPanel); + update_panels(); +} + void readline_hist_prev(void) { const char *l = scr_cmdhisto_prev(inputLine, ptr_inputline-inputLine); @@ -2915,49 +3044,16 @@ readline_forward_char(); break; case 7: // Ctrl-g - scr_cancel_current_completion(); - scr_end_current_completion(); - check_offset(-1); + readline_cancel_completion(); break; case 9: // Tab - if (scr_get_multimode() != 2) { - // Not in verbatim multi-line mode - scr_handle_tab(); - } else { - // Verbatim multi-line mode: expand tab - char tabstr[9]; - int i, n; - n = 8 - (ptr_inputline - inputLine) % 8; - for (i = 0; i < n; i++) - tabstr[i] = ' '; - tabstr[i] = '\0'; - scr_insert_text(tabstr); - } - check_offset(0); + readline_do_completion(); break; case 13: // Enter + if (readline_accept_line() == 255) return 255; + break; case 15: // Ctrl-o ("accept-line-and-down-history") - scr_CheckAutoAway(TRUE); - if (process_line(inputLine)) - return 255; - // Add line to history - scr_cmdhisto_addline(inputLine); - // Reset the line - ptr_inputline = inputLine; - *ptr_inputline = 0; - inputline_offset = 0; - - if (key == 13) // Enter - { - // Reset history line pointer - cmdhisto_cur = NULL; - } else { // down-history - // Use next history line instead of a blank line - const char *l = scr_cmdhisto_next("", 0); - if (l) strcpy(inputLine, l); - // Reset backup history line - cmdhisto_backup[0] = 0; - } + if (readline_accept_line_down_hist() == 255) return 255; break; case KEY_UP: readline_hist_prev(); @@ -3010,25 +3106,13 @@ readline_forward_word(); break; case 12: // Ctrl-l - scr_CheckAutoAway(TRUE); - ParseColors(); - scr_Resize(); - redrawwin(stdscr); + readline_refresh_screen(); break; case KEY_RESIZE: scr_Resize(); break; case 27: // ESC - scr_CheckAutoAway(TRUE); - currentWindow = NULL; - chatmode = FALSE; - if (current_buddy) - buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, FALSE); - scr_RosterVisibility(1); - scr_UpdateChatStatus(FALSE); - top_panel(chatPanel); - top_panel(inputPanel); - update_panels(); + readline_disable_chat_mode(); break; default: display_char = TRUE; diff -r 03a38b7ad2e0 -r 334ae9f498f1 mcabber/src/screen.h --- a/mcabber/src/screen.h Wed Mar 14 21:33:17 2007 +0100 +++ b/mcabber/src/screen.h Tue Apr 03 20:30:28 2007 +0200 @@ -132,8 +132,16 @@ void readline_backward_kill_word(void); void readline_backward_word(void); void readline_forward_word(void); +void readline_updowncase_word(int); +void readline_capitalize_word(void); void readline_backward_char(void); void readline_forward_char(void); +int readline_accept_line(void); +int readline_accept_line_down_hist(void); +void readline_cancel_completion(void); +void readline_do_completion(void); +void readline_refresh_screen(void); +void readline_disable_chat_mode(void); void readline_hist_prev(void); void readline_hist_next(void); void readline_backward_kill_char(void); diff -r 03a38b7ad2e0 -r 334ae9f498f1 mcabber/src/utf8.h --- a/mcabber/src/utf8.h Wed Mar 14 21:33:17 2007 +0100 +++ b/mcabber/src/utf8.h Tue Apr 03 20:30:28 2007 +0200 @@ -21,6 +21,8 @@ # define iswblank(c) (c == ' ') # define iswalnum(c) isalnum(c) # define iswprint(c) isprint(c) +# define towupper(c) toupper(c) +# define towlower(c) tolower(c) #endif extern int utf8_mode;