X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-ui%2Fcurs_lib.c;h=ac049bf4dee7e1ee2ffb476d73101e0235ea3506;hp=125e5ca07d400910353918d43b840b410b69d187;hb=17759b32873166573ee7bfaf298ae90434779ed7;hpb=fdb93a08e305b8755260144807e4d45106a9cb9f diff --git a/lib-ui/curs_lib.c b/lib-ui/curs_lib.c index 125e5ca..ac049bf 100644 --- a/lib-ui/curs_lib.c +++ b/lib-ui/curs_lib.c @@ -11,34 +11,15 @@ * please see the file GPL in the top level source directory. */ -#if HAVE_CONFIG_H -# include "config.h" -#endif +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_LANGINFO_YESEXPR #include -#endif - -#include -#include -#include -#include +#include +#include #include #include -#include "curses.h" #include "menu.h" #include "enter.h" @@ -54,33 +35,6 @@ ssize_t UngetCount = 0; static ssize_t UngetBufLen = 0; static event_t *KeyEvent; -void mutt_refresh (void) -{ - /* don't refresh when we are waiting for a child. */ - if (option (OPTKEEPQUIET)) - return; - - /* don't refresh in the middle of macros unless necessary */ - if (UngetCount && !option (OPTFORCEREFRESH)) - return; - - /* else */ - refresh (); -} - -/* Make sure that the next refresh does a full refresh. This could be - optmized by not doing it at all if DISPLAY is set as this might - indicate that a GUI based pinentry was used. Having an option to - customize this is of course the Mutt way. */ -void mutt_need_hard_redraw (void) -{ - if (!getenv ("DISPLAY")) { - keypad (stdscr, TRUE); - clearok (stdscr, TRUE); - set_option (OPTNEEDREDRAW); - } -} - event_t mutt_getch (void) { int ch; @@ -92,7 +46,7 @@ event_t mutt_getch (void) SigInt = 0; mutt_allow_interrupt (1); - ch = getch (); + ch = getch(); mutt_allow_interrupt (0); if (SigInt) @@ -101,20 +55,27 @@ event_t mutt_getch (void) if (ch == ERR) return err; - if ((ch & 0x80) && option (OPTMETAKEY)) { - /* send ALT-x as ESC-x */ - ch &= ~0x80; - mutt_ungetch (ch, 0); - ret.ch = '\033'; - ret.op = 0; - return ret; - } - ret.ch = ch; ret.op = 0; return (ch == ctrl ('G') ? err : ret); } +#ifndef waddnwstr +int waddwch(WINDOW *win, wchar_t wc) +{ + char buf[MB_LEN_MAX * 2]; + mbstate_t mbstate; + ssize_t n1, n2; + + p_clear(&mbstate, 1); + if ((n1 = wcrtomb(buf, wc, &mbstate)) == -1 + || (n2 = wcrtomb(buf + n1, 0, &mbstate)) == -1) + return -1; /* ERR */ + return waddstr(win, buf); +} +#endif + + int _mutt_get_field ( const char *field, char *buf, ssize_t buflen, int complete, int multiple, char ***files, int *numfiles) { @@ -124,16 +85,14 @@ int _mutt_get_field ( const char *field, char *buf, ssize_t buflen, ENTER_STATE *es = mutt_new_enter_state (); do { - CLEARLINE (LINES - 1); - addstr (field); + CLEARLINE(stdscr, LINES - 1); + waddstr (stdscr, field); mutt_refresh (); getyx (stdscr, y, x); - ret = - _mutt_enter_string (buf, buflen, y, x, complete, multiple, files, - numfiles, es); - } - while (ret == 1); - CLEARLINE (LINES - 1); + ret = _mutt_enter_string(buf, buflen, y, x, complete, multiple, files, + numfiles, es); + } while (ret == 1); + CLEARLINE(stdscr, LINES - 1); mutt_free_enter_state (&es); return (ret); @@ -154,15 +113,15 @@ void mutt_clear_error (void) { Errorbuf[0] = 0; if (!option (OPTNOCURSES)) - CLEARLINE (LINES - 1); + CLEARLINE(stdscr, LINES - 1); } -void mutt_edit_file (const char *editor, const char *data) +void mutt_edit_file(const char *data) { char cmd[LONG_STRING]; mutt_endwin (NULL); - mutt_expand_file_fmt (cmd, sizeof (cmd), editor, data); + m_quotefile_fmt(cmd, sizeof (cmd), mod_core.editor, data); if (mutt_system (cmd) == -1) mutt_error (_("Error running \"%s\"!"), cmd); keypad (stdscr, TRUE); @@ -172,12 +131,10 @@ void mutt_edit_file (const char *editor, const char *data) int mutt_yesorno (const char *msg, int def) { event_t ch; - char *yes = _("yes"); - char *no = _("no"); + const char *yes = _("yes"); + const char *no = _("no"); char *answer_string; ssize_t answer_string_len; - -#ifdef HAVE_LANGINFO_YESEXPR char *expr; regex_t reyes; regex_t reno; @@ -191,9 +148,8 @@ int mutt_yesorno (const char *msg, int def) !regcomp (&reyes, expr, REG_NOSUB | REG_EXTENDED); reno_ok = (expr = nl_langinfo (NOEXPR)) && expr[0] == '^' && !regcomp (&reno, expr, REG_NOSUB | REG_EXTENDED); -#endif - CLEARLINE (LINES - 1); + CLEARLINE(stdscr, LINES - 1); /* * In order to prevent the default answer to the question to wrapped @@ -201,11 +157,11 @@ int mutt_yesorno (const char *msg, int def) * ensure there is enough room for the answer and truncate the question * to fit. */ - answer_string = p_new(char, COLS + 1); - snprintf (answer_string, COLS + 1, " ([%s]/%s): ", def == M_YES ? yes : no, + answer_string = p_new(char, getmaxx(stdscr) + 1); + snprintf (answer_string, getmaxx(stdscr) + 1, " ([%s]/%s): ", def == M_YES ? yes : no, def == M_YES ? no : yes); answer_string_len = m_strlen(answer_string); - printw ("%.*s%s", COLS - answer_string_len, msg, answer_string); + wprintw (stdscr, "%.*s%s", getmaxx(stdscr) - answer_string_len, msg, answer_string); p_delete(&answer_string); for (;;) { @@ -218,20 +174,14 @@ int mutt_yesorno (const char *msg, int def) break; } -#ifdef HAVE_LANGINFO_YESEXPR answer[0] = ch.ch; if (reyes_ok ? (regexec (&reyes, answer, 0, 0, 0) == 0) : tolower (ch.ch) == *yes) -#else - if (tolower (ch.ch) == *yes) -#endif { def = M_YES; break; } else if ( -#ifdef HAVE_LANGINFO_YESEXPR reno_ok ? (regexec (&reno, answer, 0, 0, 0) == 0) : -#endif (tolower (ch.ch) == *no)) { def = M_NO; break; @@ -240,17 +190,16 @@ int mutt_yesorno (const char *msg, int def) } } -#ifdef HAVE_LANGINFO_YESEXPR if (reyes_ok) regfree (&reyes); if (reno_ok) regfree (&reno); -#endif if (def != -1) { - addstr ((char *) (def == M_YES ? yes : no)); + waddstr (stdscr, (char *) (def == M_YES ? yes : no)); mutt_refresh (); } + CLEARLINE(stdscr, LINES - 1); return (def); } @@ -260,10 +209,10 @@ void mutt_query_exit (void) mutt_flushinp (); curs_set (1); if (Timeout) - timeout (-1); /* restore blocking operation */ + wtimeout (stdscr, -1); /* restore blocking operation */ if (mutt_yesorno (_("Exit Madmutt?"), M_YES) == M_YES) { mutt_endwin (NULL); - exit (1); + mutt_exit(1); } mutt_clear_error (); mutt_curs_set (-1); @@ -280,15 +229,15 @@ void mutt_curses_error (const char *fmt, ...) va_end (ap); mutt_format_string (TmpErrorbuf, sizeof (TmpErrorbuf), - 0, COLS - 2, 0, 0, Errorbuf, sizeof (Errorbuf), 0); + 0, getmaxy(stdscr) - 2, 0, 0, Errorbuf, sizeof (Errorbuf), 0); snprintf (Errorbuf, sizeof (Errorbuf), "%s", TmpErrorbuf); /* overkill */ if (!option (OPTKEEPQUIET)) { BEEP (); - SETCOLOR (MT_COLOR_ERROR); - mvaddstr (LINES - 1, 0, Errorbuf); - clrtoeol (); - SETCOLOR (MT_COLOR_NORMAL); + SETCOLOR(stdscr, MT_COLOR_ERROR); + mvwaddstr (stdscr, LINES - 1, 0, Errorbuf); + wclrtoeol (stdscr); + SETCOLOR(stdscr, MT_COLOR_NORMAL); mutt_refresh (); } @@ -296,7 +245,7 @@ void mutt_curses_error (const char *fmt, ...) } void mutt_progress_bar (progress_t* progress, long pos) { - char posstr[SHORT_STRING]; + char posstr[STRING]; if (!pos) { if (!NetInc) @@ -333,14 +282,14 @@ void mutt_curses_message (const char *fmt, ...) va_end (ap); mutt_format_string (TmpErrorbuf, sizeof (TmpErrorbuf), - 0, COLS - 2, 0, 0, Errorbuf, sizeof (Errorbuf), 0); + 0, getmaxx(stdscr) - 2, 0, 0, Errorbuf, sizeof (Errorbuf), 0); snprintf (Errorbuf, sizeof (Errorbuf), "%s", TmpErrorbuf); /* overkill */ if (!option (OPTKEEPQUIET)) { - SETCOLOR (MT_COLOR_MESSAGE); - mvaddstr (LINES - 1, 0, Errorbuf); - clrtoeol (); - SETCOLOR (MT_COLOR_NORMAL); + SETCOLOR(stdscr, MT_COLOR_MESSAGE); + mvwaddstr (stdscr, LINES - 1, 0, Errorbuf); + wclrtoeol (stdscr); + SETCOLOR(stdscr, MT_COLOR_NORMAL); mutt_refresh (); } @@ -352,32 +301,44 @@ void mutt_show_error (void) if (option (OPTKEEPQUIET)) return; - SETCOLOR (option (OPTMSGERR) ? MT_COLOR_ERROR : MT_COLOR_MESSAGE); - CLEARLINE (LINES - 1); - addstr (Errorbuf); - SETCOLOR (MT_COLOR_NORMAL); + SETCOLOR(stdscr, option (OPTMSGERR) ? MT_COLOR_ERROR : MT_COLOR_MESSAGE); + CLEARLINE(stdscr, LINES - 1); + waddstr (stdscr, Errorbuf); + SETCOLOR(stdscr, MT_COLOR_NORMAL); } -void mutt_endwin (const char *msg) +void curses_initialize(void) { - if (!option (OPTNOCURSES)) { - CLEARLINE (LINES - 1); + initscr(); + ci_start_color(); + noecho(); + raw(); + keypad(stdscr, true); + typeahead(-1); + meta(stdscr, true); + curs_set(0); + ESCDELAY = 50; +} - attrset (A_NORMAL); - mutt_refresh (); - endwin (); - } +/* + * prompts the user to enter a keystroke, and displays the octal value back + * to the user. + */ +void mutt_what_key (void) +{ + int ch; - if (msg && *msg) { - puts (msg); - fflush (stdout); + mvwprintw(stdscr, LINES - 1, 0, _("Enter keys (^G to abort): ")); + do { + ch = getch(); + if (ch != ERR && ch != ctrl ('G')) { + mutt_message (_("Char = %s, Octal = %o, Decimal = %d"), + km_keyname (ch), ch, ch); + } } -} + while (ch != ERR && ch != ctrl ('G')); -void _mutt_perror (const char *s, const char* filename, int line) -{ - char *p = strerror (errno); - mutt_error ("%s: %s (errno = %d) from %s:%i", s, p ? p : _("unknown error"), errno, filename, line); + mutt_flushinp (); } int mutt_any_key_to_continue (const char *s) @@ -408,59 +369,35 @@ int mutt_any_key_to_continue (const char *s) return (ch); } -int mutt_do_pager (const char *banner, - const char *tempfile, int do_color, pager_t * info) -{ - int rc; - - if (!Pager || m_strcmp(Pager, "builtin") == 0) - rc = mutt_pager (banner, tempfile, do_color, info); - else { - char cmd[STRING]; - - mutt_endwin (NULL); - mutt_expand_file_fmt (cmd, sizeof (cmd), Pager, tempfile); - if (mutt_system (cmd) == -1) { - mutt_error (_("Error running \"%s\"!"), cmd); - rc = -1; - } - else - rc = 0; - mutt_unlink (tempfile); - } - - return rc; -} - int _mutt_enter_fname (const char *prompt, char *buf, ssize_t blen, int *redraw, int buffy, int multiple, char ***files, int *numfiles) { event_t ch; - mvaddstr (LINES - 1, 0, (char *) prompt); - addstr (_(" ('?' for list): ")); + mvwaddstr(stdscr, LINES - 1, 0, (char *) prompt); + waddstr(stdscr, _(" ('?' for list): ")); if (buf[0]) - addstr (buf); - clrtoeol (); + waddstr (stdscr, buf); + wclrtoeol (stdscr); mutt_refresh (); ch = mutt_getch (); if (ch.ch == -1) { - CLEARLINE (LINES - 1); + CLEARLINE(stdscr, LINES - 1); return (-1); } else if (ch.ch == '?') { mutt_refresh (); buf[0] = 0; - _mutt_select_file (buf, blen, M_SEL_FOLDER | (multiple ? M_SEL_MULTI : 0), - files, numfiles); + mutt_select_file (buf, blen, M_SEL_FOLDER | (multiple ? M_SEL_MULTI : 0), + files, numfiles); *redraw = REDRAW_FULL; } else { char *pc = p_new(char, m_strlen(prompt) + 3); - sprintf (pc, "%s: ", prompt); /* __SPRINTF_CHECKED__ */ + sprintf(pc, "%s: ", prompt); mutt_ungetch (ch.op ? 0 : ch.ch, ch.op ? ch.op : 0); if (_mutt_get_field (pc, buf, blen, (buffy ? M_EFILE : M_FILE) | M_CLEAR, multiple, files, @@ -493,7 +430,6 @@ void mutt_flushinp (void) flushinp (); } -#if (defined(USE_SLANG_CURSES) || defined(HAVE_CURS_SET)) /* The argument can take 3 values: * -1: restore the value of the last call * 0: make the cursor invisible @@ -513,16 +449,15 @@ void mutt_curs_set (int cursor) curs_set (2); /* cvvis */ } } -#endif -int mutt_multi_choice (char *prompt, char *letters) +int mutt_multi_choice (const char *prompt, const char *letters) { event_t ch; int choice; char *p; - mvaddstr (LINES - 1, 0, prompt); - clrtoeol (); + mvwaddstr (stdscr, LINES - 1, 0, prompt); + wclrtoeol (stdscr); for (;;) { mutt_refresh (); ch = mutt_getch (); @@ -544,29 +479,29 @@ int mutt_multi_choice (char *prompt, char *letters) } BEEP (); } - CLEARLINE (LINES - 1); + CLEARLINE(stdscr, LINES - 1); mutt_refresh (); return choice; } -/* - * addwch would be provided by an up-to-date curses library - */ - -int mutt_addwch (wchar_t wc) +ssize_t mutt_pretty_size(char *s, ssize_t len, ssize_t n) { - char buf[MB_LEN_MAX * 2]; - mbstate_t mbstate; - ssize_t n1, n2; + if (n == 0) + return m_strcpy(s, len, "0K"); - p_clear(&mbstate, 1); - if ((n1 = wcrtomb(buf, wc, &mbstate)) == -1 || - (n2 = wcrtomb(buf + n1, 0, &mbstate)) == -1) - return -1; /* ERR */ - else - return addstr (buf); -} + if (n < 10189) /* 0.1K - 9.9K */ + return snprintf(s, len, "%3.1fK", (n < 103) ? 0.1 : n / 1024.0); + + if (n < 1023949) /* 10K - 999K */ + /* 51 is magic which causes 10189/10240 to be rounded up to 10 */ + return snprintf(s, len, "%ldK", (n + 51) / 1024); + if (n < 10433332) /* 1.0M - 9.9M */ + return snprintf(s, len, "%3.1fM", n / 1048576.0); + + /* (10433332 + 52428) / 1048576 = 10 */ + return snprintf (s, len, "%ldM", (n + 52428) / 1048576); +} /* * This formats a string, a bit like @@ -599,7 +534,7 @@ void mutt_format_string (char *dest, ssize_t destlen, if (arboreal && wc < M_TREE_MAX) w = 1; /* hack */ else { - if (!IsWPrint (wc)) + if (!iswprint(wc)) wc = '?'; w = wcwidth (wc); } @@ -608,7 +543,7 @@ void mutt_format_string (char *dest, ssize_t destlen, break; min_width -= w; max_width -= w; - strncpy (p, scratch, k2); + m_strncpy(p, destlen, scratch, k2); p += k2; destlen -= k2; } @@ -674,10 +609,10 @@ void mutt_format_s_tree (char *dest, ssize_t destlen, /* * mutt_paddstr (n, s) is almost equivalent to - * mutt_format_string (bigbuf, big, n, n, 0, ' ', s, big, 0), addstr (bigbuf) + * mutt_format_string (bigbuf, big, n, n, 0, ' ', s, big, 0), waddstr (main_w, bigbuf) */ -void mutt_paddstr (int n, const char *s) +void mutt_paddstr(WINDOW *win, int n, const char *s) { wchar_t wc; int w; @@ -691,46 +626,16 @@ void mutt_paddstr (int n, const char *s) k = (k == -1) ? 1 : len; wc = CharsetReplacement; } - if (!IsWPrint (wc)) + if (!iswprint(wc)) wc = '?'; w = wcwidth (wc); if (w >= 0) { if (w > n) break; - addnstr ((char *) s, k); + waddnstr(win, (char *) s, k); n -= w; } } while (n-- > 0) - addch (' '); -} - -/* - * mutt_strwidth is like m_strlenexcept that it returns the width - * refering to the number of characters cells. - */ - -int mutt_strwidth (const char *s) -{ - wchar_t wc; - int w; - ssize_t k, n; - mbstate_t mbstate; - - if (!s) - return 0; - - n = m_strlen(s); - - p_clear(&mbstate, 1); - for (w = 0; n && (k = mbrtowc (&wc, s, n, &mbstate)); s += k, n -= k) { - if (k == -1 || k == -2) { - k = (k == -1) ? 1 : n; - wc = CharsetReplacement; - } - if (!IsWPrint (wc)) - wc = '?'; - w += wcwidth (wc); - } - return w; + waddch(win, ' '); }