diff options
Diffstat (limited to 'ui.c')
-rw-r--r-- | ui.c | 75 |
1 files changed, 23 insertions, 52 deletions
@@ -15,6 +15,7 @@ #include <signal.h> #include "ui.h" +#include "ui_elements.h" #include "ui_ani.h" #include "ui_input.h" #include "ui_statusbar.h" @@ -40,11 +41,11 @@ static unsigned int max_x, max_y; static WINDOW *wnd_main; static struct nask_ui *nui = NULL; +static struct nask_input *nin = NULL; static pthread_t thrd; static unsigned int atmout = APP_TIMEOUT; static pthread_cond_t cnd_update = PTHREAD_COND_INITIALIZER; static pthread_mutex_t mtx_update = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t mtx_busy = PTHREAD_MUTEX_INITIALIZER; static sem_t sem_rdy; static sem_t /* TUI active? */ *sp_ui, /* Textfield input available? */ *sp_input; static mqd_t mq_passwd, mq_info; @@ -75,6 +76,12 @@ register_ui_elt(ui_callback uicb, void *data, WINDOW *wnd) } void +register_input(ui_input_callback ipcb, void *data, WINDOW *wnd) +{ + +} + +void unregister_ui_elt(void *data) { struct nask_ui *cur = nui, *next, *before = NULL; @@ -130,23 +137,21 @@ ui_thrd(void *arg) struct timeval now; struct timespec wait; - pthread_mutex_lock(&mtx_update); gettimeofday(&now, NULL); wait.tv_sec = now.tv_sec + UILOOP_TIMEOUT; wait.tv_nsec = now.tv_usec * 1000; do_ui_update(true); sem_post(&sem_rdy); while ( sem_getvalue(sp_ui, &i_sval) == 0 && i_sval > 0 ) { - pthread_mutex_unlock(&mtx_busy); + pthread_mutex_lock(&mtx_update); cnd_ret = pthread_cond_timedwait(&cnd_update, &mtx_update, &wait); + if (--atmout == 0) sem_trywait(sp_ui); + do_ui_update( (cnd_ret == ETIMEDOUT ? true : false) ); if (cnd_ret == ETIMEDOUT) { wait.tv_sec += UILOOP_TIMEOUT; } - pthread_mutex_lock(&mtx_busy); - if (--atmout == 0) sem_trywait(sp_ui); - do_ui_update( (cnd_ret == ETIMEDOUT ? true : false) ); + pthread_mutex_unlock(&mtx_update); } - pthread_mutex_unlock(&mtx_busy); pthread_mutex_unlock(&mtx_update); return (NULL); } @@ -154,7 +159,9 @@ ui_thrd(void *arg) void ui_thrd_force_update(void) { + pthread_mutex_lock(&mtx_update); pthread_cond_signal(&cnd_update); + pthread_mutex_unlock(&mtx_update); } WINDOW * @@ -225,7 +232,6 @@ process_key(char key, struct input *a, WINDOW *win) break; case UIKEY_ESC: retval = false; - ui_thrd_force_update(); break; case UIKEY_DOWN: case UIKEY_UP: @@ -238,28 +244,10 @@ process_key(char key, struct input *a, WINDOW *win) return (retval); } -static int -lower_statusbar_update(WINDOW *win, struct statusbar *bar) -{ - char *tmp = get_system_stat(); - set_statusbar_text(bar, tmp); - free(tmp); - return (0); -} - -static int -infownd_update(WINDOW *win, struct txtwindow *tw) -{ - return (0); -} - int do_ui(void) { - struct input *pw_input; struct anic *heartbeat; - struct statusbar *higher, *lower; - struct txtwindow *infownd; char key = '\0'; char *title = NULL, mq_msg[IPC_MQSIZ+1]; int i_sval = -1, ret = DOUI_ERR; @@ -273,22 +261,11 @@ do_ui(void) perror("init semaphore/messageq"); goto error; } + + /* init TUI and UI Elements (input field, status bar, etc) */ init_ui(); - pw_input = init_input((unsigned int)(max_x / 2)-PASSWD_XRELPOS, (unsigned int)(max_y / 2)-PASSWD_YRELPOS, PASSWD_WIDTH, "PASSWORD: ", IPC_MQSIZ, COLOR_PAIR(3), COLOR_PAIR(2)); - heartbeat = init_anic(0, 0, A_BOLD | COLOR_PAIR(1), "[%c]"); - higher = init_statusbar(0, max_x, A_BOLD | COLOR_PAIR(3), NULL); - lower = init_statusbar(max_y - 1, max_x, COLOR_PAIR(3), lower_statusbar_update); - infownd = init_txtwindow((unsigned int)(max_x / 2)-INFOWND_XRELPOS, (unsigned int)(max_y / 2)-INFOWND_YRELPOS, INFOWND_WIDTH, INFOWND_HEIGHT, COLOR_PAIR(4), COLOR_PAIR(4) | A_BOLD, infownd_update); + init_ui_elements(wnd_main, max_x, max_y); - register_input(NULL, pw_input); - register_statusbar(higher); - register_statusbar(lower); - register_anic(heartbeat); - register_txtwindow(infownd); - set_txtwindow_title(infownd, "WARNING"); - set_txtwindow_text(infownd, "String0---------------#\nString1--------------------#\nString2-----#"); - activate_input(wnd_main, pw_input); - set_statusbar_text(higher, title); if (run_ui_thrd() != 0) { goto error; } @@ -301,28 +278,22 @@ do_ui(void) if (key == -1) { continue; } - pthread_mutex_lock(&mtx_busy); if ( process_key(key, pw_input, wnd_main) == false ) { + curs_set(0); memset(mq_msg, '\0', IPC_MQSIZ+1); mq_receive(mq_info, mq_msg, IPC_MQSIZ+1, 0); + set_txtwindow_text(infownd, mq_msg); + set_txtwindow_active(infownd, true); + sleep(3); sem_trywait(sp_ui); } activate_input(wnd_main, pw_input); do_ui_update(false); - pthread_mutex_unlock(&mtx_busy); } ui_thrd_force_update(); stop_ui_thrd(); - unregister_ui_elt(lower); - unregister_ui_elt(higher); - unregister_ui_elt(heartbeat); - unregister_ui_elt(pw_input); - free_input(pw_input); - free_anic(heartbeat); - free_statusbar(higher); - free_statusbar(lower); - free_txtwindow(infownd); - free_ui(); + free_ui_elements(); + ret = DOUI_OK; mq_close(mq_passwd); mq_close(mq_info); |