* please see the file GPL in the top level source directory.
*/
-#include <lib-lib/lib-lib.h>
+#include <lib-ui/lib-ui.h>
-#include <termios.h>
-#ifdef HAVE_LANGINFO_YESEXPR
#include <langinfo.h>
-#endif
+#include <termios.h>
+#include <lib-lua/lib-lua.h>
#include <lib-sys/unix.h>
#include <lib-sys/mutt_signal.h>
-#include "curses.h"
#include "menu.h"
#include "enter.h"
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;
SigInt = 0;
mutt_allow_interrupt (1);
- ch = getch ();
+ ch = getch();
mutt_allow_interrupt (0);
if (SigInt)
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)
{
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);
+ CLEARLINE(stdscr, LINES - 1);
mutt_free_enter_state (&es);
return (ret);
{
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);
- m_quotefile_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);
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;
!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
* 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 (;;) {
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;
}
}
-#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 ();
}
return (def);
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);
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 ();
}
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 ();
}
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);
+ if (initscr () == NULL) {
+ puts _("Error initializing terminal.");
+ exit (1);
+ }
+ ci_start_color();
+ keypad(stdscr, true);
+ cbreak();
+ noecho();
+ typeahead (-1); /* simulate smooth scrolling */
+ meta(stdscr, true);
+}
- 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)
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);
- m_quotefile_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 {
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
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 ();
}
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 addstr (buf);
-}
-
ssize_t mutt_pretty_size(char *s, ssize_t len, ssize_t n)
{
if (n == 0)
/*
* 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;
if (w >= 0) {
if (w > n)
break;
- addnstr ((char *) s, k);
+ waddnstr(win, (char *) s, k);
n -= w;
}
}
while (n-- > 0)
- addch (' ');
+ waddch(win, ' ');
}
-