aboutsummaryrefslogtreecommitdiff
path: root/ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'ui.c')
-rw-r--r--ui.c75
1 files changed, 23 insertions, 52 deletions
diff --git a/ui.c b/ui.c
index 55c7103..e5f4454 100644
--- a/ui.c
+++ b/ui.c
@@ -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);