1
0
mirror of https://github.com/irssi/irssi.git synced 2025-02-02 15:08:01 -05:00

Remove the need to buffer input by moving the 'gui key pressed' events

generation into term_gets.


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@4805 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Emanuele Giaquinta 2008-04-16 21:14:05 +00:00 committed by exg
parent 77dd63ac83
commit e361d2f498
4 changed files with 15 additions and 32 deletions

View File

@ -722,25 +722,12 @@ static void key_delete_to_next_space(void)
static void sig_input(void) static void sig_input(void)
{ {
unichar buffer[128];
int ret, i;
if (!active_entry) { if (!active_entry) {
/* no active entry yet - wait until we have it */ /* no active entry yet - wait until we have it */
return; return;
} }
ret = term_gets(buffer, sizeof(buffer)/sizeof(buffer[0])); term_gets();
if (ret == -1) {
/* lost terminal */
if (!term_detached)
signal_emit("command quit", 1, "Lost terminal");
} else {
for (i = 0; i < ret; i++) {
signal_emit("gui key pressed", 1,
GINT_TO_POINTER(buffer[i]));
}
}
} }
time_t get_idle_time(void) time_t get_idle_time(void)

View File

@ -19,6 +19,7 @@
*/ */
#include "module.h" #include "module.h"
#include "signals.h"
#include "settings.h" #include "settings.h"
#include "term.h" #include "term.h"
@ -384,16 +385,15 @@ void term_set_input_type(int type)
{ {
} }
int term_gets(unichar *buffer, int size) void term_gets(void)
{ {
int count;
#ifdef WIDEC_CURSES #ifdef WIDEC_CURSES
wint_t key; wint_t key;
#else #else
int key; int key;
#endif #endif
for (count = 0; count < size; ) { for (;;) {
#ifdef WIDEC_CURSES #ifdef WIDEC_CURSES
if (get_wch(&key) == ERR) if (get_wch(&key) == ERR)
#else #else
@ -405,8 +405,6 @@ int term_gets(unichar *buffer, int size)
continue; continue;
#endif #endif
buffer[count++] = key; signal_emit("gui key pressed", 1, GINT_TO_POINTER(key));
} }
return count;
} }

View File

@ -608,40 +608,40 @@ void term_set_input_type(int type)
} }
} }
int term_gets(unichar *buffer, int size) void term_gets(void)
{ {
int ret, i, char_len; int ret, i, char_len;
if (term_detached) if (term_detached)
return 0; return;
/* fread() doesn't work */ /* fread() doesn't work */
if (size > sizeof(term_inbuf)-term_inbuf_pos)
size = sizeof(term_inbuf)-term_inbuf_pos;
ret = read(fileno(current_term->in), ret = read(fileno(current_term->in),
term_inbuf + term_inbuf_pos, size); term_inbuf + term_inbuf_pos, sizeof(term_inbuf)-term_inbuf_pos);
if (ret == 0) { if (ret == 0) {
/* EOF - terminal got lost */ /* EOF - terminal got lost */
if (auto_detach) if (auto_detach)
term_detach(); term_detach();
else
ret = -1; ret = -1;
} else if (ret == -1 && (errno == EINTR || errno == EAGAIN)) } else if (ret == -1 && (errno == EINTR || errno == EAGAIN))
ret = 0; ret = 0;
if (ret == -1)
signal_emit("command quit", 1, "Lost terminal");
if (ret > 0) { if (ret > 0) {
/* convert input to unichars. */ /* convert input to unichars. */
term_inbuf_pos += ret; term_inbuf_pos += ret;
ret = 0;
for (i = 0; i < term_inbuf_pos; ) { for (i = 0; i < term_inbuf_pos; ) {
unichar key;
char_len = input_func(term_inbuf+i, term_inbuf_pos-i, char_len = input_func(term_inbuf+i, term_inbuf_pos-i,
buffer); &key);
if (char_len < 0) if (char_len < 0)
break; break;
signal_emit("gui key pressed", 1, GINT_TO_POINTER(key));
i += char_len; i += char_len;
buffer++;
ret++;
} }
if (i >= term_inbuf_pos) if (i >= term_inbuf_pos)
@ -651,6 +651,4 @@ int term_gets(unichar *buffer, int size)
term_inbuf_pos -= i; term_inbuf_pos -= i;
} }
} }
return ret;
} }

View File

@ -86,7 +86,7 @@ void term_stop(void);
/* keyboard input handling */ /* keyboard input handling */
void term_set_input_type(int type); void term_set_input_type(int type);
int term_gets(unichar *buffer, int size); void term_gets(void);
/* internal */ /* internal */
void term_common_init(void); void term_common_init(void);