dorne/cursetree/cursetree.c

75 lines
1.9 KiB
C

#include <stdlib.h>
#include "_ncurses.h"
#include "ncrswrap.h"
#include "node.h"
#include "tree.h"
int ct_init(struct ct_tree **const tree) {
/* Initialise NCurses Library & Root Node */
init_ncurses();
init_tree(tree);
return EXIT_SUCCESS;
}
void ct_redraw(void) {
/* TODO: hide doupdate() behind some other method */
/* flush ncurses virtual screen -> physical screen */
doupdate();
}
/* Recursively search the tree for update requests.
* Returns:
* 0 - success (no action required)
* 1 - success (request: redraw the screen)
*/
static int __update_rec(struct ct_node *const node) {
int result = 0;
struct ct_dims *dims;
if (node->flags & NFLAG_RESIZE) {
/* TODO: the child has requested a resizing, but resize_node()
* TODO: wastes CPU time resizing itself!
*/
dims = IS_ROOT_NODE(node) ? termdims() : dup_dims(node->surface->dims);
resize_node(node, dims);
result = 1;
}
if (node->surface->updatereq) {
sfflush(node->surface);
}
for (int i = 0; i < node->cindex; i++) {
result |= __update_rec(node->child[i]);
}
return result;
}
void ct_update(struct ct_tree *const tree) {
const int key = wgetch(curscr);
/* ncurses binds a SIGWINCH handler if SIGWINCH has SIG_DFL disposition
* when initscr(3x) is called. This handler emits KEY_RESIZE (decimal 410) to
* stdin. REF: manpages -> resizeterm(3x) initscr(3x) wgetch(3x)
*/
switch (key) {
case -1:
// wclear(tree->root->surface->win);
// mvwprintw(tree->root->surface->win, 0, 0, " \r-1\n");
// wrefresh(tree->root->surface->win);
return;
case KEY_RESIZE:
tree->root->flags |= NFLAG_RESIZE;
break;
default:
// wclear(tree->root->surface->win);
// mvwprintw(tree->root->surface->win, 0, 0, " \r%d\n", key);
// wrefresh(tree->root->surface->win);
break;
}
if (__update_rec(tree->root)) {
ct_redraw();
}
}