X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=lib-ui%2Fcurs_lib.c;h=3c0f440a675a8b1b1d154740031c4c7d22fc5379;hb=6fb2acab15d7fd84a287cc50ef472d34018636bd;hp=936edda6ecfbbef089fd091d60155f6c3606d3c3;hpb=9946738a6a1c27a5602a14d1afe2eea2389732b2;p=apps%2Fmadmutt.git diff --git a/lib-ui/curs_lib.c b/lib-ui/curs_lib.c index 936edda..3c0f440 100644 --- a/lib-ui/curs_lib.c +++ b/lib-ui/curs_lib.c @@ -14,6 +14,11 @@ #include #include +#ifdef HAVE_SYS_IOCTL_H +# include +#elif defined(HAVE_IOCTL_H) +# include +#endif #include #include @@ -38,29 +43,23 @@ 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 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; + /* don't refresh in the middle of macros unless necessary */ + if (UngetCount && !option (OPTFORCEREFRESH)) + return; - /* else */ - refresh (); + /* else */ + wrefresh (stdscr); } -/* 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) @@ -74,7 +73,7 @@ event_t mutt_getch (void) SigInt = 0; mutt_allow_interrupt (1); - ch = getch (); + ch = wgetch (stdscr); mutt_allow_interrupt (0); if (SigInt) @@ -83,15 +82,6 @@ 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); @@ -107,7 +97,7 @@ int _mutt_get_field ( const char *field, char *buf, ssize_t buflen, do { CLEARLINE (LINES - 1); - addstr (field); + waddstr (stdscr, field); mutt_refresh (); getyx (stdscr, y, x); ret = _mutt_enter_string(buf, buflen, y, x, complete, multiple, files, @@ -182,7 +172,7 @@ int mutt_yesorno (const char *msg, int def) snprintf (answer_string, COLS + 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", COLS - answer_string_len, msg, answer_string); p_delete(&answer_string); for (;;) { @@ -217,7 +207,7 @@ int mutt_yesorno (const char *msg, int def) regfree (&reno); if (def != -1) { - addstr ((char *) (def == M_YES ? yes : no)); + waddstr (stdscr, (char *) (def == M_YES ? yes : no)); mutt_refresh (); } return (def); @@ -229,7 +219,7 @@ 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); @@ -255,8 +245,8 @@ void mutt_curses_error (const char *fmt, ...) if (!option (OPTKEEPQUIET)) { BEEP (); SETCOLOR (MT_COLOR_ERROR); - mvaddstr (LINES - 1, 0, Errorbuf); - clrtoeol (); + mvwaddstr (stdscr, LINES - 1, 0, Errorbuf); + wclrtoeol (stdscr); SETCOLOR (MT_COLOR_NORMAL); mutt_refresh (); } @@ -307,8 +297,8 @@ void mutt_curses_message (const char *fmt, ...) if (!option (OPTKEEPQUIET)) { SETCOLOR (MT_COLOR_MESSAGE); - mvaddstr (LINES - 1, 0, Errorbuf); - clrtoeol (); + mvwaddstr (stdscr, LINES - 1, 0, Errorbuf); + wclrtoeol (stdscr); SETCOLOR (MT_COLOR_NORMAL); mutt_refresh (); } @@ -323,16 +313,34 @@ void mutt_show_error (void) SETCOLOR (option (OPTMSGERR) ? MT_COLOR_ERROR : MT_COLOR_MESSAGE); CLEARLINE (LINES - 1); - addstr (Errorbuf); + waddstr (stdscr, Errorbuf); SETCOLOR (MT_COLOR_NORMAL); } +void curses_initialize(void) +{ + 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); - attrset (A_NORMAL); + wattrset (stdscr, A_NORMAL); mutt_refresh (); endwin (); } @@ -349,6 +357,27 @@ void _mutt_perror (const char *s, const char* filename, int line) mutt_error ("%s: %s (errno = %d) from %s:%i", s, p ? p : _("unknown error"), errno, filename, line); } +/* + * prompts the user to enter a keystroke, and displays the octal value back + * to the user. + */ +void mutt_what_key (void) +{ + int ch; + + mvwprintw (stdscr, LINES - 1, 0, _("Enter keys (^G to abort): ")); + do { + ch = wgetch (stdscr); + 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')); + + mutt_flushinp (); +} + int mutt_any_key_to_continue (const char *s) { struct termios t; @@ -383,11 +412,11 @@ int _mutt_enter_fname (const char *prompt, char *buf, ssize_t blen, { 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 (); @@ -398,8 +427,8 @@ int _mutt_enter_fname (const char *prompt, char *buf, ssize_t blen, 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 { @@ -438,7 +467,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 @@ -458,7 +486,6 @@ void mutt_curs_set (int cursor) curs_set (2); /* cvvis */ } } -#endif int mutt_multi_choice (const char *prompt, const char *letters) { @@ -466,8 +493,8 @@ int mutt_multi_choice (const char *prompt, const char *letters) int choice; char *p; - mvaddstr (LINES - 1, 0, prompt); - clrtoeol (); + mvwaddstr (stdscr, LINES - 1, 0, prompt); + wclrtoeol (stdscr); for (;;) { mutt_refresh (); ch = mutt_getch (); @@ -509,7 +536,7 @@ int mutt_addwch (wchar_t wc) (n2 = wcrtomb(buf + n1, 0, &mbstate)) == -1) return -1; /* ERR */ else - return addstr (buf); + return waddstr (stdscr, buf); } ssize_t mutt_pretty_size(char *s, ssize_t len, ssize_t n) @@ -637,7 +664,7 @@ 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 (stdscr, bigbuf) */ void mutt_paddstr (int n, const char *s) @@ -660,11 +687,44 @@ void mutt_paddstr (int n, const char *s) if (w >= 0) { if (w > n) break; - addnstr ((char *) s, k); + waddnstr (stdscr, (char *) s, k); n -= w; } } while (n-- > 0) - addch (' '); + 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); +}