/* cut prompt to given width and recalculate its' width */ void ncurses_update_real_prompt(ncurses_window_t *n) { g_assert(n); #if 0 /* XXX: shortening */ const int _maxlen = n->window && n->window->_maxx ? n->window->_maxx : 80; const int maxlen = ncurses_noecho ? _maxlen - 3 : _maxlen / 3; xfree(n->prompt_real); if (maxlen <= 6) /* we assume the terminal is too narrow to display any input with prompt */ n->prompt_real = NULL; else { #ifdef USE_UNICODE n->prompt_real = normal_to_wcs(n->prompt); #else n->prompt_real = (CHAR_T *) xstrdup(n->prompt); #endif } n->prompt_real_len = xwcslen(n->prompt_real); if (n->prompt_real_len > maxlen) { /* need to cut it */ const CHAR_T *dots = (CHAR_T *) TEXT("..."); #ifdef USE_UNICODE const wchar_t udots[2] = { 0x2026, 0 }; if (console_charset_is_utf8) /* use unicode hellip, if using utf8 */ dots = udots; #endif { const int dotslen = xwcslen(dots); const int taillen = (maxlen - dotslen) / 2; /* rounded down */ const int headlen = (maxlen - dotslen) - taillen; /* rounded up */ CHAR_T *tmp = xmalloc(sizeof(CHAR_T) * (maxlen + 1)); xwcslcpy(tmp, n->prompt_real, headlen + 1); xwcslcpy(tmp + headlen, dots, dotslen + 1); xwcslcpy(tmp + headlen + dotslen, n->prompt_real + n->prompt_real_len - taillen, taillen + 1); xfree(n->prompt_real); n->prompt_real = tmp; n->prompt_real_len = maxlen; } } #endif }
inline CHAR_T *wcs_array_join(CHAR_T **array, const CHAR_T *sep) { char **arr; char *sp = wcs_to_normal(sep); char *tmp; CHAR_T *ret; int i; arr = xmalloc( (g_strv_length((char **) array)+1) * sizeof(char *)); for (i = 0; array[i]; i++) arr[i] = wcs_to_normal(array[i]); tmp = g_strjoinv(sp, arr); ret = normal_to_wcs(tmp); g_strfreev(arr); xfree(tmp); xfree(sp); return ret; }