X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-ui%2Fcurs_lib.c;h=437ffbcc187614edb3d370f71db05a1f5e1ae92f;hp=8e15f53bf21112516e6618e57881c295adc34452;hb=00f34116b32751764d42f81159c292d850c74bac;hpb=f435868132e200bfa71ac155f037cf64bf5414ba diff --git a/lib-ui/curs_lib.c b/lib-ui/curs_lib.c index 8e15f53..437ffbc 100644 --- a/lib-ui/curs_lib.c +++ b/lib-ui/curs_lib.c @@ -13,13 +13,8 @@ #include -#include -#ifdef HAVE_SYS_IOCTL_H -# include -#elif defined(HAVE_IOCTL_H) -# include -#endif #include +#include #include #include @@ -31,6 +26,7 @@ #include "mutt.h" #include "pager.h" #include "charset.h" +#include "madtty.h" /* not possible to unget more than one char under some curses libs, and it * is impossible to unget function keys in SLang, so roll our own input @@ -40,27 +36,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 */ - wrefresh (stdscr); -} - -void mutt_need_hard_redraw (void) -{ - keypad (stdscr, TRUE); - clearok (stdscr, TRUE); - set_option (OPTNEEDREDRAW); -} - event_t mutt_getch (void) { int ch; @@ -72,7 +47,7 @@ event_t mutt_getch (void) SigInt = 0; mutt_allow_interrupt (1); - ch = wgetch (stdscr); + ch = getch(); mutt_allow_interrupt (0); if (SigInt) @@ -86,6 +61,22 @@ event_t mutt_getch (void) 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) { @@ -95,14 +86,14 @@ int _mutt_get_field ( const char *field, char *buf, ssize_t buflen, ENTER_STATE *es = mutt_new_enter_state (); do { - CLEARLINE (LINES - 1); + 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); + CLEARLINE(stdscr, LINES - 1); mutt_free_enter_state (&es); return (ret); @@ -123,7 +114,7 @@ void mutt_clear_error (void) { Errorbuf[0] = 0; if (!option (OPTNOCURSES)) - CLEARLINE (LINES - 1); + CLEARLINE(stdscr, LINES - 1); } void mutt_edit_file(const char *data) @@ -159,7 +150,7 @@ int mutt_yesorno (const char *msg, int def) reno_ok = (expr = nl_langinfo (NOEXPR)) && expr[0] == '^' && !regcomp (&reno, expr, REG_NOSUB | REG_EXTENDED); - CLEARLINE (LINES - 1); + CLEARLINE(stdscr, LINES - 1); /* * In order to prevent the default answer to the question to wrapped @@ -167,11 +158,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); - wprintw (stdscr, "%.*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 (;;) { @@ -209,6 +200,7 @@ int mutt_yesorno (const char *msg, int def) waddstr (stdscr, (char *) (def == M_YES ? yes : no)); mutt_refresh (); } + CLEARLINE(stdscr, LINES - 1); return (def); } @@ -221,7 +213,7 @@ void mutt_query_exit (void) 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); @@ -238,15 +230,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); + SETCOLOR(stdscr, MT_COLOR_ERROR); mvwaddstr (stdscr, LINES - 1, 0, Errorbuf); wclrtoeol (stdscr); - SETCOLOR (MT_COLOR_NORMAL); + SETCOLOR(stdscr, MT_COLOR_NORMAL); mutt_refresh (); } @@ -291,14 +283,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); + SETCOLOR(stdscr, MT_COLOR_MESSAGE); mvwaddstr (stdscr, LINES - 1, 0, Errorbuf); wclrtoeol (stdscr); - SETCOLOR (MT_COLOR_NORMAL); + SETCOLOR(stdscr, MT_COLOR_NORMAL); mutt_refresh (); } @@ -310,50 +302,25 @@ void mutt_show_error (void) if (option (OPTKEEPQUIET)) return; - SETCOLOR (option (OPTMSGERR) ? MT_COLOR_ERROR : MT_COLOR_MESSAGE); - CLEARLINE (LINES - 1); + SETCOLOR(stdscr, option (OPTMSGERR) ? MT_COLOR_ERROR : MT_COLOR_MESSAGE); + CLEARLINE(stdscr, LINES - 1); waddstr (stdscr, Errorbuf); - SETCOLOR (MT_COLOR_NORMAL); + SETCOLOR(stdscr, MT_COLOR_NORMAL); } void curses_initialize(void) { + initscr(); + start_color(); + madtty_init_colors(); ci_start_color(); - keypad(stdscr, TRUE); - cbreak(); noecho(); - typeahead (-1); /* simulate smooth scrolling */ - meta(stdscr, TRUE); -} - -void curses_install(void) -{ - SETCOLOR(MT_COLOR_NORMAL); - wclear(stdscr); - mutt_error = mutt_curses_error; - mutt_message = mutt_curses_message; -} - -void mutt_endwin (const char *msg) -{ - if (!option (OPTNOCURSES)) { - CLEARLINE (LINES - 1); - - wattrset (stdscr, A_NORMAL); - mutt_refresh (); - endwin (); - } - - if (msg && *msg) { - puts (msg); - fflush (stdout); - } -} - -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); + raw(); + keypad(stdscr, true); + typeahead(-1); + meta(stdscr, true); + curs_set(0); + ESCDELAY = 50; } /* @@ -364,9 +331,9 @@ void mutt_what_key (void) { int ch; - mvwprintw (stdscr, LINES - 1, 0, _("Enter keys (^G to abort): ")); + mvwprintw(stdscr, LINES - 1, 0, _("Enter keys (^G to abort): ")); do { - ch = wgetch (stdscr); + ch = getch(); if (ch != ERR && ch != ctrl ('G')) { mutt_message (_("Char = %s, Octal = %o, Decimal = %d"), km_keyname (ch), ch, ch); @@ -411,8 +378,8 @@ int _mutt_enter_fname (const char *prompt, char *buf, ssize_t blen, { event_t ch; - mvwaddstr (stdscr, LINES - 1, 0, (char *) prompt); - waddstr (stdscr, _(" ('?' for list): ")); + mvwaddstr(stdscr, LINES - 1, 0, (char *) prompt); + waddstr(stdscr, _(" ('?' for list): ")); if (buf[0]) waddstr (stdscr, buf); wclrtoeol (stdscr); @@ -420,7 +387,7 @@ int _mutt_enter_fname (const char *prompt, char *buf, ssize_t blen, ch = mutt_getch (); if (ch.ch == -1) { - CLEARLINE (LINES - 1); + CLEARLINE(stdscr, LINES - 1); return (-1); } else if (ch.ch == '?') { @@ -515,29 +482,11 @@ int mutt_multi_choice (const char *prompt, const 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) -{ - 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 */ - else - return waddstr (stdscr, buf); -} - ssize_t mutt_pretty_size(char *s, ssize_t len, ssize_t n) { if (n == 0) @@ -663,10 +612,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), waddstr (stdscr, 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; @@ -686,44 +635,10 @@ void mutt_paddstr (int n, const char *s) if (w >= 0) { if (w > n) break; - waddnstr (stdscr, (char *) s, k); + waddnstr(win, (char *) s, k); n -= w; } } while (n-- > 0) - waddch (stdscr, ' '); -} - -/* this routine should be called after receiving SIGWINCH */ -void mutt_resize_screen (void) -{ - char *cp; - int fd; - struct winsize w; - - int rows, cols; - - rows = -1; - cols = -1; - if ((fd = open ("/dev/tty", O_RDONLY)) != -1) { - if (ioctl (fd, TIOCGWINSZ, &w) != -1) { - rows = w.ws_row; - cols = w.ws_col; - } - close (fd); - } - if (rows <= 0) { - if ((cp = getenv ("LINES")) != NULL) { - rows = atoi (cp); - } - else - rows = 24; - } - if (cols <= 0) { - if ((cp = getenv ("COLUMNS")) != NULL) - cols = atoi (cp); - else - cols = 80; - } - resizeterm (rows, cols); + waddch(win, ' '); }