diff options
-rw-r--r-- | Makefile.debug | 5 | ||||
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/ui.c | 16 | ||||
-rw-r--r-- | src/ui_elements.c | 65 | ||||
-rw-r--r-- | src/ui_statusbar.c | 8 | ||||
-rw-r--r-- | src/ui_statusbar.h | 4 | ||||
-rw-r--r-- | src/ui_txtwindow.c | 12 | ||||
-rw-r--r-- | src/ui_txtwindow.h | 8 |
8 files changed, 70 insertions, 52 deletions
diff --git a/Makefile.debug b/Makefile.debug index 2faf3b2..134457c 100644 --- a/Makefile.debug +++ b/Makefile.debug @@ -45,4 +45,7 @@ clean: rm -f $(BIN) $(MAKE) -C tests clean -.PHONY: all debug release strip install uninstall clean +test: + $(MAKE) -C tests run + +.PHONY: all debug release strip install uninstall clean test @@ -34,8 +34,8 @@ enum msg_index { MSG_CRYPTCMD_ERR, MSG_NUM }; -static const char *msg_arr[] = { "Please wait, got a piped password ..", - "Please wait, busy ..", +static const char *msg_arr[] = { "Please wait, got a piped password", + "Please wait, busy", "check_fifo: %s is not a FIFO\n", "check_fifo: %s error(%d): %s\n", "fifo: cryptcreate busy", @@ -161,7 +161,6 @@ process_key(char key) { bool ret = false; - atmout = APP_TIMEOUT; if ( active != NULL ) { ret = ( active->cbs.ui_input(active->wnd, active->data, key) == DOUI_OK ? true : false ); } @@ -176,6 +175,9 @@ do_ui_update(bool timed_out) /* call all draw callback's */ erase(); + if (timed_out == TRUE && atmout > 0) { + atmout--; + } else atmout = APP_TIMEOUT; while (cur != NULL) { if (cur->cbs.ui_element != NULL) { cur->cbs.ui_element(cur->wnd, cur->data, timed_out); @@ -199,18 +201,18 @@ static void * ui_thrd(void *arg) { int cnd_ret; - struct timeval now; + struct timespec now; struct timespec wait; - gettimeofday(&now, NULL); + //gettimeofday(&now, NULL); + clock_gettime(CLOCK_REALTIME, &now); wait.tv_sec = now.tv_sec + UILOOP_TIMEOUT; - wait.tv_nsec = now.tv_usec * 1000; + wait.tv_nsec = now.tv_nsec * 1000; do_ui_update(true); ui_ipc_sempost(SEM_RD); pthread_mutex_lock(&mtx_update); while ( ui_ipc_getvalue(SEM_UI) > 0 ) { cnd_ret = pthread_cond_timedwait(&cnd_update, &mtx_update, &wait); - if (--atmout <= 0) ui_ipc_semtrywait(SEM_UI); pthread_mutex_lock(&mtx_busy); do_ui_update( (cnd_ret == ETIMEDOUT ? true : false) ); pthread_mutex_unlock(&mtx_busy); @@ -309,9 +311,9 @@ do_ui(void) continue; } if ( process_key(key) != true ) { - //ui_ipc_semtrywait(SEM_UI); - //ui_thrd_force_update(); + ui_ipc_semtrywait(SEM_UI); } + ui_thrd_force_update(); } stop_ui_thrd(); free_ui_elements(); diff --git a/src/ui_elements.c b/src/ui_elements.c index 427415a..9f4994d 100644 --- a/src/ui_elements.c +++ b/src/ui_elements.c @@ -19,51 +19,44 @@ #define PASSWD_YRELPOS (unsigned int)(PASSWD_HEIGHT / 2) + 1 #define INFOWND_WIDTH 25 #define INFOWND_HEIGHT 1 +#define BSTR_LEN 3 static struct input *pw_input; static struct anic *heartbeat; static struct statusbar *higher, *lower; static struct txtwindow *infownd; +static struct tctwindow *errwnd; static char *title = NULL; +static char busy_str[BSTR_LEN+1] = ".\0\0\0"; static int -lower_statusbar_update(WINDOW *win, struct statusbar *bar) +lower_statusbar_update(WINDOW *win, struct statusbar *bar, bool ui_timeout) { + if (ui_timeout == FALSE) return DOUI_OK; char *tmp = get_system_stat(); set_statusbar_text(bar, tmp); free(tmp); - return 0; -} - -static int -higher_statusbar_update(WINDOW *win, struct statusbar *bar) -{ - return 0; + return DOUI_OK; } static int -infownd_update(WINDOW *win, struct txtwindow *tw) +higher_statusbar_update(WINDOW *win, struct statusbar *bar, bool ui_timeout) { - char *tmp = (char*)(tw->userptr); - size_t len = strlen(tmp); - - if (tw->active) { - if ( len == 3 ) { - memset(tmp+1, '\0', 2); - } else strcat(tmp, "."); - } else (*tmp) = '.'; - return 0; + return DOUI_OK; } static int -mq_passwd_send(char *passwd) +infownd_update(WINDOW *win, struct txtwindow *tw, bool ui_timeout) { - int ret; - - ui_ipc_sempost(SEM_IN); - ret = ui_ipc_msgsend(MQ_PW, passwd); - return ret; + if (ui_timeout == TRUE && tw->active == TRUE) { + size_t len = strlen(busy_str); + if (len > BSTR_LEN) { + memset(busy_str, '\0', BSTR_LEN+1); + busy_str[0] = '.'; + } else strcat(busy_str, "."); + } + return DOUI_OK; } static int @@ -76,33 +69,44 @@ passwd_input_cb(WINDOW *wnd, void *data, int key) wtimeout(stdscr, -1); switch (key) { case UIKEY_ENTER: - mq_passwd_send(a->input); + ui_ipc_msgsend(MQ_PW, a->input); + ui_thrd_suspend(); clear_input(wnd, a); deactivate_input(pw_input); + ui_thrd_resume(); + ui_ipc_msgrecv(MQ_IF, ipc_buf); + + ui_thrd_suspend(); set_txtwindow_color(infownd, COLOR_PAIR(5), COLOR_PAIR(5)); set_txtwindow_title(infownd, "BUSY"); set_txtwindow_text(infownd, ipc_buf); set_txtwindow_active(infownd, true); ui_thrd_resume(); + sleep(2); ui_ipc_msgrecv(MQ_IF, ipc_buf); + ui_thrd_suspend(); set_txtwindow_color(infownd, COLOR_PAIR(4), COLOR_PAIR(4) | A_BOLD); set_txtwindow_title(infownd, "ERROR"); set_txtwindow_text(infownd, ipc_buf); ui_thrd_resume(); -// while (getch() != '\n') { } -wgetch(stdscr); + + while (wgetch(stdscr) != '\n') { }; + ui_thrd_suspend(); set_txtwindow_active(infownd, false); activate_input(pw_input); ui_thrd_resume(); + + //ui_thrd_force_update(); + ui_ipc_sempost(SEM_IN); break; case UIKEY_BACKSPACE: del_input(wnd, a); - ui_thrd_force_update(); + //ui_thrd_force_update(); break; case UIKEY_ESC: return DOUI_ERR; @@ -115,7 +119,7 @@ wgetch(stdscr); break; default: add_input(wnd, a, key); - ui_thrd_force_update(); + //ui_thrd_force_update(); } wtimeout(stdscr, 1000); return DOUI_OK; @@ -136,8 +140,6 @@ init_ui_elements(WINDOW *wnd_main, unsigned int max_x, unsigned int max_y) lower_statusbar_update); infownd = init_txtwindow_centered(INFOWND_WIDTH, INFOWND_HEIGHT, infownd_update); - infownd->userptr = calloc(4, sizeof(char)); - (*(char*)(infownd->userptr)) = '.'; register_input(NULL, pw_input, passwd_input_cb); register_statusbar(higher); @@ -159,7 +161,6 @@ free_ui_elements(void) free_anic_default(heartbeat); free_statusbar(higher); free_statusbar(lower); - free(infownd->userptr); free_txtwindow(infownd); free_ui(); if (title) { diff --git a/src/ui_statusbar.c b/src/ui_statusbar.c index 8fcfeb4..df88683 100644 --- a/src/ui_statusbar.c +++ b/src/ui_statusbar.c @@ -36,11 +36,6 @@ statusbar_cb(WINDOW *win, void *data, bool timed_out) size_t len; if (a == NULL) return (UICB_ERR_UNDEF); - if (timed_out == true) { - if (a->status_func != NULL) { - a->status_func(win, a); - } - } attron(a->attrs); len = strnlen(a->text, a->width); if (len < a->width) { @@ -50,6 +45,9 @@ statusbar_cb(WINDOW *win, void *data, bool timed_out) memset(tmp, ' ', a->width); tmp[a->width] = '\0'; strncpy((tmp + diff_pos), a->text, len); + if (a->status_func != NULL) { + a->status_func(win, a, timed_out); + } if (win != NULL) { mvwprintw(win, a->y, 0, tmp); } else { diff --git a/src/ui_statusbar.h b/src/ui_statusbar.h index 5139c14..65e9e12 100644 --- a/src/ui_statusbar.h +++ b/src/ui_statusbar.h @@ -8,11 +8,11 @@ struct statusbar { unsigned int y; unsigned int width; char *text; - int (*status_func)(WINDOW *, struct statusbar *); + int (*status_func)(WINDOW *, struct statusbar *, bool); chtype attrs; }; -typedef int (*status_func)(WINDOW *, struct statusbar *); +typedef int (*status_func)(WINDOW *, struct statusbar *, bool); struct statusbar * init_statusbar(unsigned int y, unsigned int width, chtype attrs, status_func cb_update); diff --git a/src/ui_txtwindow.c b/src/ui_txtwindow.c index 5852c32..90d152d 100644 --- a/src/ui_txtwindow.c +++ b/src/ui_txtwindow.c @@ -96,6 +96,11 @@ txtwindow_cb(WINDOW *win, void *data, bool timedout) if (a->active == true) { print_wnd(a); + if (a->window_func) { + attron(a->text_attrs); + a->window_func(win, a, timedout); + attroff(a->text_attrs); + } } return (UICB_OK); } @@ -173,3 +178,10 @@ set_txtwindow_color(struct txtwindow *a, chtype wnd, chtype txt) a->text_attrs = txt; } +void +set_txtwindow_dim(struct txtwindow *a, unsigned int w, unsigned int h) +{ + a->width = w; + a->height = h; +} + diff --git a/src/ui_txtwindow.h b/src/ui_txtwindow.h index 0ebbd9f..1e1bc3f 100644 --- a/src/ui_txtwindow.h +++ b/src/ui_txtwindow.h @@ -18,13 +18,12 @@ struct txtwindow { char *title; size_t title_len; char **text; - int (*window_func)(WINDOW *, struct txtwindow *); + int (*window_func)(WINDOW *, struct txtwindow *, bool); chtype attrs; chtype text_attrs; - void *userptr; }; -typedef int (*window_func)(WINDOW *, struct txtwindow *); +typedef int (*window_func)(WINDOW *, struct txtwindow *, bool); struct txtwindow * init_txtwindow(unsigned int x, unsigned int y, unsigned int width, unsigned int height, window_func cb_update); @@ -50,4 +49,7 @@ set_txtwindow_color(struct txtwindow *a, chtype wnd, chtype txt); void set_txtwindow_pos(struct txtwindow *a, unsigned int x, unsigned int y); +void +set_txtwindow_dim(struct txtwindow *a, unsigned int w, unsigned int h); + #endif |