aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/base.c')
-rw-r--r--src/ui/base.c76
1 files changed, 48 insertions, 28 deletions
diff --git a/src/ui/base.c b/src/ui/base.c
index 74855b1..5607f4e 100644
--- a/src/ui/base.c
+++ b/src/ui/base.c
@@ -8,8 +8,7 @@ struct ui_window_root *ui_root = NULL;
void ui__default_draw_proc(struct ui_window_base *base)
{
- redrawwin(base->cwindow);
- wrefresh(base->cwindow);
+ wnoutrefresh(base->cwindow); /* root window calls doupdate */
}
void ui__init_window_base(struct ui_window_base *base)
@@ -37,13 +36,15 @@ void ui__init_window_dock(struct ui_window_dock *dock)
dock->focus = UI__WINDOW_FOCUS_NONE;
}
-void ui__init_window_root(struct ui_window_root *root)
+void ui__init_window_root(struct ui_window_root *root, WINDOW *cwindow)
{
- ui__init_window_dock(&root->super);
- root->super.super.type = UI__WINDOW_TYPE_ROOT;
- root->super.super.draw_proc = &ui__root_draw_proc;
- root->super.super.layout_proc = &ui__root_layout_proc;
+ ui__init_window_base(&root->super);
+ root->super.cwindow = cwindow;
+ root->super.type = UI__WINDOW_TYPE_ROOT;
+ root->super.draw_proc = &ui__root_draw_proc;
+ root->super.layout_proc = &ui__root_layout_proc;
+ root->content = NULL;
root->floating = NULL;
}
@@ -53,10 +54,13 @@ void ui__destroy_window_dock(struct ui_window_dock *dock);
void ui__window_destroy_root(struct ui_window_root *root)
{
+ if (root->content)
+ ui__destroy_window(root->content);
+
if (root->floating)
ui__destroy_window(root->floating);
- ui__destroy_window_dock(&root->super);
+ ui__destroy_window_base(&root->super);
}
void ui__destroy_window_dock(struct ui_window_dock *dock)
@@ -83,10 +87,10 @@ void ui__destroy_window(struct ui_window_base *base)
switch (base->type)
{
case UI__WINDOW_TYPE_ROOT:
- ui__window_destroy_root((struct ui_window_root *)base);
+ ui__window_destroy_root(ui__cast(root, base));
break;
case UI__WINDOW_TYPE_DOCK:
- ui__destroy_window_dock((struct ui_window_dock *)base);
+ ui__destroy_window_dock(ui__cast(dock, base));
break;
case UI__WINDOW_TYPE_BASE:
ui__destroy_window_base(base);
@@ -98,17 +102,25 @@ void ui__destroy_window(struct ui_window_base *base)
* which brings it to the "foreground", squashing whatever is behind it. */
struct ui_window_base *ui__find_focused(void)
{
- struct ui_window_base *window = (struct ui_window_base *)ui_root;
- if (ui_root->floating) return ui_root->floating;
+ struct ui_window_base *window = ui__cast(base, ui_root);
- while (true)
- {
- switch (window->type)
- {
- case UI__WINDOW_TYPE_DOCK:
+ while (true) {
+ switch (window->type) {
case UI__WINDOW_TYPE_ROOT:
{
- struct ui_window_dock *dock = (struct ui_window_dock *)window;
+ struct ui_window_root *root = ui__cast(root, window);
+ if (root->floating) {
+ window = root->floating;
+ } else if (root->content) {
+ window = root->content;
+ } else {
+ return window;
+ }
+ break;
+ }
+ case UI__WINDOW_TYPE_DOCK:
+ {
+ struct ui_window_dock *dock = ui__cast(dock, window);
if (dock->focus == UI__WINDOW_FOCUS_NONE || !dock->children[dock->focus])
{
@@ -121,7 +133,7 @@ struct ui_window_base *ui__find_focused(void)
}
}
- return (struct ui_window_base *)dock; /* the dock is focused if it is really a leaf */
+ return window; /* the dock is focused if it is really a leaf */
}
childfound:
@@ -159,10 +171,9 @@ void ui__traces_draw_proc(struct ui_window_base *base)
getmaxyx(base->cwindow, maxy, maxx);
for (int i = 1; i < maxy-1; ++i)
{
- mvwhline(base->cwindow, i, 1, '%', maxx-2);
+ mvwhline(base->cwindow, i, 1, '.', maxx-2);
}
- touchwin(base->cwindow);
- wrefresh(base->cwindow);
+ wnoutrefresh(base->cwindow);
}
void ui_init(void)
@@ -178,21 +189,24 @@ void ui_init(void)
curs_set(0);
- ui__init_window_root(ui_root);
- ui_root->super.super.cwindow = stdscr; /* initialize the ncurses window ourselves */
+ ui__init_window_root(ui_root, stdscr);
/* set up UI */
+ struct ui_window_dock *maindock = malloc(sizeof(struct ui_window_dock));
+ ui__init_window_dock(maindock);
+ ui__root_set_content(ui_root, ui__cast(base, maindock));
+
for (int i = 0; i < UI__WINDOW_DOCK_MAX; ++i)
{
if (i == UI__WINDOW_DOCK_LEFT) continue;
struct ui_window_base *win_traces = malloc(sizeof(struct ui_window_base));
ui__init_window_base(win_traces);
- ui__dock_add_child((struct ui_window_dock *)ui_root, win_traces, i, 1./5);
+ ui__dock_add_child(maindock, win_traces, i, 1./5);
win_traces->draw_proc = &ui__traces_draw_proc;
}
- ui__call_draw_proc((struct ui_window_base *)ui_root);
+ ui__call_draw_proc(ui__cast(base, ui_root));
}
void ui_handle(void)
@@ -214,8 +228,14 @@ void ui_handle(void)
}
else if (inp == KEY_RESIZE)
{
- ui__call_layout_proc((struct ui_window_base *)ui_root);
- ui__call_draw_proc((struct ui_window_base *)ui_root);
+ ui__call_layout_proc(ui__cast(base, ui_root));
+ ui__call_draw_proc(ui__cast(base, ui_root));
+ } else if (inp == NS('h')) {
+ ui__status_text = "Hello...";
+ ui__call_draw_proc(ui__cast(base, ui_root));
+ } else if (inp == NS('w')) {
+ ui__status_text = "World!";
+ ui__call_draw_proc(ui__cast(base, ui_root));
}
}