* please see the file GPL in the top level source directory.
*/
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <lib-lib/mem.h>
+#include <lib-ui/lib-ui.h>
-#include <lib-ui/curses.h>
-#include <lib-ui/enter.h>
+#include "menu.h"
+#include "browser.h"
#include "mutt.h"
-#include "mutt_menu.h"
+#include "alias.h"
#include "keymap.h"
#include "history.h"
#include "buffy.h"
-
-#include <string.h>
+typedef struct {
+ wchar_t *wbuf;
+ size_t wbuflen;
+ size_t lastchar;
+ size_t curpos;
+ size_t begin;
+ int tabs;
+} ENTER_STATE;
/* redraw flags for mutt_enter_string() */
enum {
{
int n = wcwidth (wc);
- if (IsWPrint (wc) && n > 0)
+ if (iswprint(wc) && n > 0)
return n;
if (!(wc & ~0x7f))
return 2;
}
/* combining mark / non-spacing character */
-#define COMB_CHAR(wc) (IsWPrint (wc) && !wcwidth (wc))
+#define COMB_CHAR(wc) (iswprint(wc) && !wcwidth(wc))
static int my_wcswidth (const wchar_t * s, size_t n)
{
{
int n = wcwidth (wc);
- if (IsWPrint (wc) && n > 0)
- return mutt_addwch (wc);
+ if (iswprint(wc) && n > 0)
+ return waddwch(stdscr, wc);
if (!(wc & ~0x7f))
- return printw ("^%c", ((int) wc + 0x40) & 0x7f);
+ return wprintw (stdscr, "^%c", ((int) wc + 0x40) & 0x7f);
if (!(wc & ~0xffff))
- return printw ("\\u%04x", (int) wc);
- return printw ("\\u%08x", (int) wc);
+ return wprintw (stdscr, "\\u%04x", (int) wc);
+ return wprintw (stdscr, "\\u%08x", (int) wc);
}
static size_t width_ceiling (const wchar_t * s, size_t n, int w1)
}
}
-size_t my_mbstowcs (wchar_t ** pwbuf, size_t * pwbuflen, size_t i, const char *buf)
+static size_t my_mbstowcs (wchar_t ** pwbuf, size_t * pwbuflen, size_t i, const char *buf)
{
wchar_t wc;
mbstate_t st;
p_delete(&savebuf);
}
-/*
- * Returns:
- * 1 need to redraw the screen and call me again
- * 0 if input was given
- * -1 if abort.
- */
-
-int mutt_enter_string (char *buf, size_t buflen, int y, int x, int flags)
-{
- int rv;
- ENTER_STATE *es = mutt_new_enter_state ();
-
- rv = _mutt_enter_string (buf, buflen, y, x, flags, 0, NULL, NULL, es);
- mutt_free_enter_state (&es);
- return rv;
-}
-
-int _mutt_enter_string (char *buf, size_t buflen, int y, int x,
- int flags, int multiple, char ***files, int *numfiles,
- ENTER_STATE * state)
+static int
+mutt_enter_string(char *buf, size_t buflen, int y, int x, int flags,
+ int multiple, char ***files, int *numfiles,
+ ENTER_STATE *state)
{
int width = COLS - x - 1;
int redraw;
width_ceiling (state->wbuf, state->lastchar,
my_wcswidth (state->wbuf,
state->curpos) - width / 2);
- move (y, x);
+ wmove (stdscr, y, x);
w = 0;
for (i = state->begin; i < state->lastchar; i++) {
w += my_wcwidth (state->wbuf[i]);
break;
my_addwch (state->wbuf[i]);
}
- clrtoeol ();
- move (y,
- x + my_wcswidth (state->wbuf + state->begin,
- state->curpos - state->begin));
+ wclrtoeol (stdscr);
+ wmove (stdscr, y,
+ x + my_wcswidth (state->wbuf + state->begin,
+ state->curpos - state->begin));
}
mutt_refresh ();
if (tempbuf && templen == state->lastchar - i &&
!memcmp (tempbuf, state->wbuf + i,
(state->lastchar - i) * sizeof (wchar_t))) {
- mutt_select_file (buf, buflen,
- (flags & M_EFILE) ? M_SEL_FOLDER : 0);
+ mutt_select_file(buf, buflen, flags & M_EFILE ? M_SEL_FOLDER : 0,
+ NULL, NULL);
set_option (OPTNEEDREDRAW);
if (*buf)
replace_part (state, i, buf);
|| (tempbuf && templen == state->lastchar
&& !memcmp (tempbuf, state->wbuf,
state->lastchar * sizeof (wchar_t)))) {
- _mutt_select_file (buf, buflen,
- ((flags & M_EFILE) ? M_SEL_FOLDER : 0) |
- (multiple ? M_SEL_MULTI : 0), files, numfiles);
+ mutt_select_file(buf, buflen,
+ ((flags & M_EFILE) ? M_SEL_FOLDER : 0) |
+ (multiple ? M_SEL_MULTI : 0), files, numfiles);
set_option (OPTNEEDREDRAW);
if (*buf) {
mutt_pretty_mailbox (buf);
if (first && (flags & M_CLEAR)) {
first = 0;
- if (IsWPrint (wc)) /* why? */
+ if (iswprint(wc)) /* why? */
state->curpos = state->lastchar = 0;
}
rv = 0;
goto bye;
}
- else if (wc && (wc < ' ' || IsWPrint (wc))) { /* why? */
+ else if (wc && (wc < ' ' || iswprint(wc))) { /* why? */
if (state->lastchar >= state->wbuflen) {
state->wbuflen = state->lastchar + 20;
p_realloc(&state->wbuf, state->wbuflen);
return rv;
}
-void mutt_free_enter_state (ENTER_STATE ** esp)
+int _mutt_get_field(const char *field, char *buf, ssize_t buflen, int flags,
+ int multiple, char ***files, int *numfiles)
{
- if (!esp)
- return;
+ int ret;
+ int x, y;
+ ENTER_STATE es;
- p_delete(&(*esp)->wbuf);
- p_delete(esp);
+ p_clear(&es, 1);
+
+ do {
+ CLEARLINE(stdscr, LINES - 1);
+ waddstr (stdscr, field);
+ mutt_refresh ();
+ getyx (stdscr, y, x);
+ ret = mutt_enter_string(buf, buflen, y, x, flags, multiple, files,
+ numfiles, &es);
+ } while (ret == 1);
+ CLEARLINE(stdscr, LINES - 1);
+
+ p_delete(&es.wbuf);
+ return ret;
}
/*