Browse Source

Cleanup

master
cancel 6 years ago
parent
commit
737acc91ec
  1. 43
      term_util.c
  2. 26
      term_util.h
  3. 12
      tui_main.c

43
term_util.c

@ -42,8 +42,7 @@ void qnav_deinit() {
while (qnav_stack.count != 0) while (qnav_stack.count != 0)
qnav_stack_pop(); qnav_stack_pop();
} }
void qnav_stack_push(Qnav_type_tag tag, int height, int width, void qnav_stack_push(Qblock_type_tag tag, int height, int width, Qblock* out) {
Qnav_block* out) {
#ifndef NDEBUG #ifndef NDEBUG
for (Usz i = 0; i < qnav_stack.count; ++i) { for (Usz i = 0; i < qnav_stack.count; ++i) {
assert(qnav_stack.blocks[i] != out); assert(qnav_stack.blocks[i] != out);
@ -65,17 +64,17 @@ void qnav_stack_push(Qnav_type_tag tag, int height, int width,
qnav_stack.stack_changed = true; qnav_stack.stack_changed = true;
} }
Qnav_block* qnav_top_block() { Qblock* qnav_top_block() {
if (qnav_stack.count == 0) if (qnav_stack.count == 0)
return NULL; return NULL;
return qnav_stack.blocks[qnav_stack.count - 1]; return qnav_stack.blocks[qnav_stack.count - 1];
} }
void qnav_free_block(Qnav_block* qb); void qnav_free_block(Qblock* qb);
void qnav_stack_pop() { void qnav_stack_pop() {
assert(qnav_stack.count > 0); assert(qnav_stack.count > 0);
if (qnav_stack.count == 0) if (qnav_stack.count == 0)
return; return;
Qnav_block* qb = qnav_stack.blocks[qnav_stack.count - 1]; Qblock* qb = qnav_stack.blocks[qnav_stack.count - 1];
WINDOW* content_window = qb->content_window; WINDOW* content_window = qb->content_window;
WINDOW* outer_window = qb->outer_window; WINDOW* outer_window = qb->outer_window;
qnav_free_block(qb); qnav_free_block(qb);
@ -85,13 +84,13 @@ void qnav_stack_pop() {
qnav_stack.blocks[qnav_stack.count] = NULL; qnav_stack.blocks[qnav_stack.count] = NULL;
qnav_stack.stack_changed = true; qnav_stack.stack_changed = true;
} }
void qnav_draw_box_attr(Qnav_block* qb, unsigned int attr) { void qnav_draw_box_attr(Qblock* qb, unsigned int attr) {
wborder(qb->outer_window, ACS_VLINE | attr, ACS_VLINE | attr, wborder(qb->outer_window, ACS_VLINE | attr, ACS_VLINE | attr,
ACS_HLINE | attr, ACS_HLINE | attr, ACS_ULCORNER | attr, ACS_HLINE | attr, ACS_HLINE | attr, ACS_ULCORNER | attr,
ACS_URCORNER | attr, ACS_LLCORNER | attr, ACS_LRCORNER | attr); ACS_URCORNER | attr, ACS_LLCORNER | attr, ACS_LRCORNER | attr);
} }
void qnav_draw_box(Qnav_block* qb) { qnav_draw_box_attr(qb, A_DIM); } void qnav_draw_box(Qblock* qb) { qnav_draw_box_attr(qb, A_DIM); }
void qnav_draw_title(Qnav_block* qb, char const* title, int attr) { void qnav_draw_title(Qblock* qb, char const* title, int attr) {
wmove(qb->outer_window, 0, 2); wmove(qb->outer_window, 0, 2);
attr_t attrs = A_NORMAL; attr_t attrs = A_NORMAL;
short pair = 0; short pair = 0;
@ -101,24 +100,24 @@ void qnav_draw_title(Qnav_block* qb, char const* title, int attr) {
wattr_set(qb->outer_window, attrs, pair, NULL); wattr_set(qb->outer_window, attrs, pair, NULL);
} }
void qnav_set_title(Qnav_block* qb, char const* title) { qb->title = title; } void qblock_set_title(Qblock* qb, char const* title) { qb->title = title; }
void qnav_print_frame(Qnav_block* qb, bool active) { void qblock_print_frame(Qblock* qb, bool active) {
qnav_draw_box_attr(qb, active ? A_NORMAL : A_DIM); qnav_draw_box_attr(qb, active ? A_NORMAL : A_DIM);
if (qb->title) { if (qb->title) {
qnav_draw_title(qb, qb->title, active ? A_NORMAL : A_DIM); qnav_draw_title(qb, qb->title, active ? A_NORMAL : A_DIM);
} }
} }
WINDOW* qmsg_window(Qmsg* qm) { return qm->nav_block.content_window; } WINDOW* qmsg_window(Qmsg* qm) { return qm->qblock.content_window; }
void qmsg_set_title(Qmsg* qm, char const* title) { void qmsg_set_title(Qmsg* qm, char const* title) {
qnav_set_title(&qm->nav_block, title); qblock_set_title(&qm->qblock, title);
} }
Qmsg* qmsg_push(int height, int width) { Qmsg* qmsg_push(int height, int width) {
Qmsg* qm = malloc(sizeof(Qmsg)); Qmsg* qm = malloc(sizeof(Qmsg));
qnav_stack_push(Qnav_type_qmsg, height, width, &qm->nav_block); qnav_stack_push(Qblock_type_qmsg, height, width, &qm->qblock);
return qm; return qm;
} }
@ -134,7 +133,7 @@ bool qmsg_drive(Qmsg* qm, int key) {
return false; return false;
} }
Qmsg* qmsg_of(Qnav_block* qb) { return ORCA_CONTAINER_OF(qb, Qmsg, nav_block); } Qmsg* qmsg_of(Qblock* qb) { return ORCA_CONTAINER_OF(qb, Qmsg, qblock); }
Qmenu* qmenu_create(int id) { Qmenu* qmenu_create(int id) {
Qmenu* qm = (Qmenu*)malloc(sizeof(Qmenu)); Qmenu* qm = (Qmenu*)malloc(sizeof(Qmenu));
@ -165,9 +164,9 @@ void qmenu_push_to_nav(Qmenu* qm) {
set_menu_grey(qm->ncurses_menu, A_DIM); set_menu_grey(qm->ncurses_menu, A_DIM);
int menu_min_h, menu_min_w; int menu_min_h, menu_min_w;
scale_menu(qm->ncurses_menu, &menu_min_h, &menu_min_w); scale_menu(qm->ncurses_menu, &menu_min_h, &menu_min_w);
qnav_stack_push(Qnav_type_qmenu, menu_min_h, menu_min_w, &qm->nav_block); qnav_stack_push(Qblock_type_qmenu, menu_min_h, menu_min_w, &qm->qblock);
set_menu_win(qm->ncurses_menu, qm->nav_block.outer_window); set_menu_win(qm->ncurses_menu, qm->qblock.outer_window);
set_menu_sub(qm->ncurses_menu, qm->nav_block.content_window); set_menu_sub(qm->ncurses_menu, qm->qblock.content_window);
post_menu(qm->ncurses_menu); post_menu(qm->ncurses_menu);
} }
@ -180,13 +179,13 @@ void qmenu_free(Qmenu* qm) {
free(qm); free(qm);
} }
void qnav_free_block(Qnav_block* qb) { void qnav_free_block(Qblock* qb) {
switch (qb->tag) { switch (qb->tag) {
case Qnav_type_qmsg: { case Qblock_type_qmsg: {
Qmsg* qm = qmsg_of(qb); Qmsg* qm = qmsg_of(qb);
free(qm); free(qm);
} break; } break;
case Qnav_type_qmenu: { case Qblock_type_qmenu: {
Qmenu* qm = qmenu_of(qb); Qmenu* qm = qmenu_of(qb);
qmenu_free(qm); qmenu_free(qm);
} break; } break;
@ -237,6 +236,4 @@ bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action) {
return false; return false;
} }
Qmenu* qmenu_of(Qnav_block* qb) { Qmenu* qmenu_of(Qblock* qb) { return ORCA_CONTAINER_OF(qb, Qmenu, qblock); }
return ORCA_CONTAINER_OF(qb, Qmenu, nav_block);
}

26
term_util.h

@ -40,29 +40,29 @@ int fg_bg(Color_name fg, Color_name bg) {
void term_util_init_colors(); void term_util_init_colors();
typedef enum { typedef enum {
Qnav_type_qmsg, Qblock_type_qmsg,
Qnav_type_qmenu, Qblock_type_qmenu,
} Qnav_type_tag; } Qblock_type_tag;
typedef struct { typedef struct {
Qnav_type_tag tag; Qblock_type_tag tag;
WINDOW* outer_window; WINDOW* outer_window;
WINDOW* content_window; WINDOW* content_window;
char const* title; char const* title;
} Qnav_block; } Qblock;
typedef struct { typedef struct {
Qnav_block* blocks[16]; Qblock* blocks[16];
Usz count; Usz count;
bool stack_changed; bool stack_changed;
} Qnav_stack; } Qnav_stack;
typedef struct { typedef struct {
Qnav_block nav_block; Qblock qblock;
} Qmsg; } Qmsg;
typedef struct { typedef struct {
Qnav_block nav_block; Qblock qblock;
MENU* ncurses_menu; MENU* ncurses_menu;
ITEM* ncurses_items[32]; ITEM* ncurses_items[32];
Usz items_count; Usz items_count;
@ -90,22 +90,22 @@ typedef union {
void qnav_init(); void qnav_init();
void qnav_deinit(); void qnav_deinit();
void qnav_set_title(Qnav_block* qb, char const* title); Qblock* qnav_top_block();
Qnav_block* qnav_top_block();
void qnav_stack_pop(); void qnav_stack_pop();
void qnav_print_frame(Qnav_block* qb, bool active);
void qblock_print_frame(Qblock* qb, bool active);
void qblock_set_title(Qblock* qb, char const* title);
Qmsg* qmsg_push(int height, int width); Qmsg* qmsg_push(int height, int width);
WINDOW* qmsg_window(Qmsg* qm); WINDOW* qmsg_window(Qmsg* qm);
void qmsg_set_title(Qmsg* qm, char const* title); void qmsg_set_title(Qmsg* qm, char const* title);
bool qmsg_drive(Qmsg* qm, int key); bool qmsg_drive(Qmsg* qm, int key);
Qmsg* qmsg_of(Qnav_block* qb); Qmsg* qmsg_of(Qblock* qb);
Qmenu* qmenu_create(); Qmenu* qmenu_create();
void qmenu_add_choice(Qmenu* qm, char const* text, int id); void qmenu_add_choice(Qmenu* qm, char const* text, int id);
void qmenu_add_spacer(Qmenu* qm); void qmenu_add_spacer(Qmenu* qm);
void qmenu_push_to_nav(Qmenu* qm); void qmenu_push_to_nav(Qmenu* qm);
bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action); bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action);
Qmenu* qmenu_of(Qnav_block* qb); Qmenu* qmenu_of(Qblock* qb);
extern Qnav_stack qnav_stack; extern Qnav_stack qnav_stack;

12
tui_main.c

@ -1458,7 +1458,7 @@ void push_main_menu() {
qmenu_add_spacer(qm); qmenu_add_spacer(qm);
qmenu_add_choice(qm, "Quit", Main_menu_quit); qmenu_add_choice(qm, "Quit", Main_menu_quit);
qmenu_push_to_nav(qm); qmenu_push_to_nav(qm);
qnav_set_title(&qm->nav_block, "ORCA"); qblock_set_title(&qm->qblock, "ORCA");
} }
void push_controls_msg() { void push_controls_msg() {
@ -1737,9 +1737,9 @@ int main(int argc, char** argv) {
drew_any = true; drew_any = true;
} }
for (Usz i = 0; i < qnav_stack.count; ++i) { for (Usz i = 0; i < qnav_stack.count; ++i) {
Qnav_block* qb = qnav_stack.blocks[i]; Qblock* qb = qnav_stack.blocks[i];
if (qnav_stack.stack_changed) { if (qnav_stack.stack_changed) {
qnav_print_frame(qb, i == qnav_stack.count - 1); qblock_print_frame(qb, i == qnav_stack.count - 1);
} }
touchwin(qb->outer_window); touchwin(qb->outer_window);
wnoutrefresh(qb->outer_window); wnoutrefresh(qb->outer_window);
@ -1823,15 +1823,15 @@ int main(int argc, char** argv) {
goto quit; goto quit;
} }
Qnav_block* qb = qnav_top_block(); Qblock* qb = qnav_top_block();
if (qb) { if (qb) {
switch (qb->tag) { switch (qb->tag) {
case Qnav_type_qmsg: { case Qblock_type_qmsg: {
Qmsg* qm = qmsg_of(qb); Qmsg* qm = qmsg_of(qb);
if (qmsg_drive(qm, key)) if (qmsg_drive(qm, key))
qnav_stack_pop(); qnav_stack_pop();
} break; } break;
case Qnav_type_qmenu: { case Qblock_type_qmenu: {
Qmenu* qm = qmenu_of(qb); Qmenu* qm = qmenu_of(qb);
Qmenu_action act; Qmenu_action act;
if (qmenu_drive(qm, key, &act)) { if (qmenu_drive(qm, key, &act)) {

Loading…
Cancel
Save