From 9d3ff8760367833173ef1a784870be19196dac74 Mon Sep 17 00:00:00 2001 From: bigfoot547 Date: Fri, 17 Nov 2023 03:29:48 -0600 Subject: the root window is now no longer a dock status bar and stuff TODO: check ncurses calls that can failgit add --all! --- src/ui/base.c | 76 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 28 deletions(-) (limited to 'src/ui/base.c') 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)); } } -- cgit v1.2.3-70-g09d2