X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=anykey.c;h=b1ac9ef430a80df681ee1442e99d8bbc6712fe11;hp=7c801f1ce8b8bb6dbb3983346ff264330c8e1ab3;hb=56fc0d6dbca2d46ff2a79275ef6307c4e38bf6a1;hpb=d486cbddfe380de95a98646f7626426955e563ee diff --git a/anykey.c b/anykey.c index 7c801f1..b1ac9ef 100644 --- a/anykey.c +++ b/anykey.c @@ -23,8 +23,8 @@ #include #else #include -#endif #include +#endif #include #include #include "sigrok-cli.h" @@ -35,32 +35,38 @@ static DWORD stdin_mode; #else static struct termios term_orig; #endif +static unsigned int watch_id = 0; -static int received_anykey(int fd, int revents, void *cb_data) +static gboolean received_anykey(GIOChannel *source, + GIOCondition condition, void *data) { struct sr_session *session; - (void)fd; - (void)revents; + (void)source; + (void)condition; + session = data; - session = cb_data; - sr_session_source_remove(session, STDIN_FILENO); + watch_id = 0; sr_session_stop(session); - return TRUE; + return G_SOURCE_REMOVE; } -/* Turn off buffering on stdin. */ +/* Turn off buffering on stdin and watch for input. + */ void add_anykey(struct sr_session *session) { + GIOChannel *channel; + #ifdef _WIN32 stdin_handle = GetStdHandle(STD_INPUT_HANDLE); if (!GetConsoleMode(stdin_handle, &stdin_mode)) { /* TODO: Error handling. */ } - SetConsoleMode(stdin_handle, 0); + + channel = g_io_channel_win32_new_fd(0); #else struct termios term; @@ -68,17 +74,26 @@ void add_anykey(struct sr_session *session) memcpy(&term_orig, &term, sizeof(struct termios)); term.c_lflag &= ~(ECHO | ICANON | ISIG); tcsetattr(STDIN_FILENO, TCSADRAIN, &term); + + channel = g_io_channel_unix_new(STDIN_FILENO); #endif + g_io_channel_set_encoding(channel, NULL, NULL); + g_io_channel_set_buffered(channel, FALSE); - sr_session_source_add(session, STDIN_FILENO, G_IO_IN, -1, - received_anykey, session); + watch_id = g_io_add_watch(channel, G_IO_IN, &received_anykey, session); + g_io_channel_unref(channel); g_message("Press any key to stop acquisition."); } -/* Restore stdin attributes. */ +/* Remove the event watch and restore stdin attributes. + */ void clear_anykey(void) { + if (watch_id != 0) { + g_source_remove(watch_id); + watch_id = 0; + } #ifdef _WIN32 SetConsoleMode(stdin_handle, stdin_mode); #else