1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-06-23 21:45:30 +00:00

Moved command processing to main loop, allow resize during password prompt

This commit is contained in:
James Booth 2015-02-05 00:58:23 +00:00
parent 30180ac8bb
commit a70aa0255f
6 changed files with 53 additions and 28 deletions

View File

@ -82,10 +82,18 @@ prof_run(const int disable_tls, char *log_level, char *account_name)
log_info("Starting main event loop");
char *line = NULL;
while(cont) {
_check_autoaway();
cont = ui_readline();
line = ui_readline();
if (line) {
cont = cmd_process_input(line);
free(line);
line = NULL;
} else {
cont = TRUE;
}
#ifdef HAVE_LIBOTR
otr_poll();

View File

@ -198,7 +198,7 @@ ui_close(void)
endwin();
}
gboolean
char *
ui_readline(void)
{
return inp_readline();
@ -2249,15 +2249,9 @@ ui_win_unread(int index)
char *
ui_ask_password(void)
{
char *passwd = malloc(sizeof(char) * (MAX_PASSWORD_SIZE + 1));
status_bar_get_password();
status_bar_update_virtual();
inp_block();
inp_get_password(passwd);
// inp_non_block(prefs_get_inpblock());
inp_nonblocking(TRUE);
return passwd;
return inp_get_password();
}
void

View File

@ -74,7 +74,8 @@ static gint no_input_count = 0;
static fd_set fds;
static int r;
static gboolean cmd_result = TRUE;
static char *inp_line = NULL;
static gboolean get_password = FALSE;
static void _inp_win_update_virtual(void);
static int _inp_printable(const wint_t ch);
@ -132,9 +133,11 @@ create_input_window(void)
_inp_win_update_virtual();
}
gboolean
char *
inp_readline(void)
{
free(inp_line);
inp_line = NULL;
FD_ZERO(&fds);
FD_SET(fileno(rl_instream), &fds);
errno = 0;
@ -142,13 +145,16 @@ inp_readline(void)
if (r < 0) {
char *err_msg = strerror(errno);
log_error("Readline failed: %s", err_msg);
return TRUE;
return NULL;
}
if (FD_ISSET(fileno(rl_instream), &fds)) {
rl_callback_read_char();
if (rl_line_buffer && rl_line_buffer[0] != '/' && rl_line_buffer[0] != '\0' && rl_line_buffer[0] != '\n') {
if (rl_line_buffer &&
rl_line_buffer[0] != '/' &&
rl_line_buffer[0] != '\0' &&
rl_line_buffer[0] != '\n') {
prof_handle_activity();
}
@ -168,7 +174,11 @@ inp_readline(void)
p_rl_timeout.tv_usec = inp_timeout * 1000;
}
return cmd_result;
if (inp_line) {
return strdup(inp_line);
} else {
return NULL;
}
}
void
@ -213,6 +223,8 @@ inp_nonblocking(gboolean reset)
}
}
}
log_info("Timeout: %d", inp_timeout);
}
void
@ -228,19 +240,29 @@ inp_close(void)
rl_callback_handler_remove();
}
void
inp_get_password(char *passwd)
char*
inp_get_password(void)
{
werase(inp_win);
wmove(inp_win, 0, 0);
pad_start = 0;
_inp_win_update_virtual();
doupdate();
noecho();
mvwgetnstr(inp_win, 0, 1, passwd, MAX_PASSWORD_SIZE);
wmove(inp_win, 0, 0);
echo();
char *password = NULL;
get_password = TRUE;
while (!password) {
password = inp_readline();
ui_update();
werase(inp_win);
wmove(inp_win, 0, 0);
pad_start = 0;
_inp_win_update_virtual();
doupdate();
}
get_password = FALSE;
status_bar_clear();
return password;
}
void
@ -378,10 +400,11 @@ static void
_inp_rl_linehandler(char *line)
{
if (line && *line) {
add_history(line);
if (!get_password) {
add_history(line);
}
}
cmd_result = cmd_process_input(line);
free(line);
inp_line = line;
}
static int

View File

@ -40,13 +40,13 @@
#define INP_WIN_MAX 1000
void create_input_window(void);
gboolean inp_readline(void);
char* inp_readline(void);
void inp_nonblocking(gboolean reset);
void inp_close(void);
void inp_win_clear(void);
void inp_win_resize(void);
void inp_put_back(void);
void inp_block(void);
void inp_get_password(char *passwd);
char* inp_get_password(void);
#endif

View File

@ -233,7 +233,7 @@ void ui_update_presence(const resource_presence_t resource_presence,
void ui_about(void);
void ui_statusbar_new(const int win);
gboolean ui_readline(void);
char* ui_readline(void);
void ui_input_clear(void);
void ui_input_nonblocking(gboolean);
void ui_write(char *line, int offset);

View File

@ -329,9 +329,9 @@ void ui_update_presence(const resource_presence_t resource_presence,
void ui_about(void) {}
void ui_statusbar_new(const int win) {}
gboolean ui_readline(void)
char* ui_readline(void)
{
return TRUE;
return NULL;
}
void ui_inp_history_append(char *inp) {}