void prof_run(const int disable_tls, char *log_level, char *account_name) { _init(disable_tls, log_level); log_info("Starting main event loop"); inp_non_block(); GTimer *timer = g_timer_new(); gboolean cmd_result = TRUE; jabber_conn_status_t conn_status = jabber_get_connection_status(); char inp[INP_WIN_MAX]; int size = 0; ui_update_screen(); if (account_name != NULL) { char *cmd = "/connect"; snprintf(inp, sizeof(inp), "%s %s", cmd, account_name); process_input(inp); } else if (prefs_get_string(PREF_CONNECT_ACCOUNT) != NULL) { char *cmd = "/connect"; snprintf(inp, sizeof(inp), "%s %s", cmd, prefs_get_string(PREF_CONNECT_ACCOUNT)); process_input(inp); } while(cmd_result == TRUE) { wint_t ch = ERR; size = 0; while(ch != '\n') { conn_status = jabber_get_connection_status(); if (conn_status == JABBER_CONNECTED) { _handle_idle_time(); } gdouble elapsed = g_timer_elapsed(timer, NULL); gint remind_period = prefs_get_notify_remind(); if (remind_period > 0 && elapsed >= remind_period) { notify_remind(); g_timer_start(timer); } ui_handle_special_keys(&ch, inp, size); ui_update_screen(); jabber_process_events(); ch = inp_get_char(inp, &size); if (ch != ERR) { ui_reset_idle_time(); } } inp[size++] = '\0'; cmd_result = process_input(inp); } g_timer_destroy(timer); }
char * inp_readline(void) { free(inp_line); inp_line = NULL; p_rl_timeout.tv_sec = inp_timeout / 1000; p_rl_timeout.tv_usec = inp_timeout % 1000 * 1000; FD_ZERO(&fds); FD_SET(fileno(rl_instream), &fds); errno = 0; r = select(FD_SETSIZE, &fds, NULL, NULL, &p_rl_timeout); if (r < 0) { if (errno != EINTR) { char *err_msg = strerror(errno); log_error("Readline failed: %s", err_msg); } 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') { prof_handle_activity(); } ui_reset_idle_time(); if (!get_password) { _inp_write(rl_line_buffer, rl_point); } inp_nonblocking(TRUE); } else { inp_nonblocking(FALSE); prof_handle_idle(); } if (inp_line) { return strdup(inp_line); } else { return NULL; } }