mirror of
https://github.com/dankamongmen/notcurses.git
synced 2024-11-02 09:40:15 +00:00
demo: simplify HUD code, print top to bottom
This commit is contained in:
parent
bc9ecd86a8
commit
78fdad0f43
@ -5,6 +5,7 @@
|
||||
// about to run, running, and just runned. the user can move this HUD with
|
||||
// their mouse. it should always be on the top of the z-stack, unless hidden.
|
||||
struct ncplane* hud = NULL;
|
||||
static struct elem* elems; // tracks the last n demos
|
||||
|
||||
static bool hud_hidden;
|
||||
static bool plot_hidden;
|
||||
@ -40,12 +41,6 @@ typedef struct elem {
|
||||
static struct ncmenu* menu;
|
||||
static struct ncplane* about; // "about" modal popup
|
||||
|
||||
static struct elem* elems;
|
||||
static struct elem* running;
|
||||
// which line we're writing the next entry to. once this becomes -1, we stop decrementing
|
||||
// it, and throw away the oldest entry each time.
|
||||
static int writeline = HUD_ROWS - 2;
|
||||
|
||||
#define MENUSTR_TOGGLE_HUD "Toggle HUD"
|
||||
#define MENUSTR_TOGGLE_PLOT "Toggle FPS plot"
|
||||
#define MENUSTR_RESTART "Restart"
|
||||
@ -282,15 +277,22 @@ hud_refresh(struct ncplane* n){
|
||||
return 0;
|
||||
}
|
||||
|
||||
static elem**
|
||||
hud_print_finished(int* line){
|
||||
elem** hook = &elems;
|
||||
elem* e = elems;
|
||||
static int
|
||||
hud_print_finished(elem* list){
|
||||
elem* e = list;
|
||||
if(hud){
|
||||
hud_refresh(hud);
|
||||
}
|
||||
int line = 0;
|
||||
while(e){
|
||||
hook = &e->next;
|
||||
if(++line == HUD_ROWS - 1){
|
||||
if(e->next){
|
||||
free(e->next->name);
|
||||
free(e->next);
|
||||
e->next = NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(hud){
|
||||
cell c = CELL_TRIVIAL_INITIALIZER;
|
||||
ncplane_base(hud, &c);
|
||||
@ -299,21 +301,20 @@ hud_print_finished(int* line){
|
||||
ncplane_set_fg(hud, 0);
|
||||
ncplane_set_fg_alpha(hud, CELL_ALPHA_OPAQUE);
|
||||
cell_release(hud, &c);
|
||||
if(ncplane_printf_yx(hud, *line, 1, "%d", e->frames) < 0){
|
||||
return NULL;
|
||||
if(ncplane_printf_yx(hud, line, 1, "%d", e->frames) < 0){
|
||||
return -1;
|
||||
}
|
||||
if(ncplane_printf_yx(hud, *line, 7, "%ju.%02jus", e->totalns / GIG,
|
||||
if(ncplane_printf_yx(hud, line, 7, "%ju.%02jus", e->totalns / GIG,
|
||||
(e->totalns % GIG) / (GIG / 100)) < 0){
|
||||
return NULL;
|
||||
return -1;
|
||||
}
|
||||
if(ncplane_putstr_yx(hud, *line, 18, e->name) < 0){
|
||||
return NULL;
|
||||
if(ncplane_putstr_yx(hud, line, 18, e->name) < 0){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
++*line;
|
||||
e = e->next;
|
||||
}
|
||||
return hook;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct ncplane* hud_create(struct notcurses* nc){
|
||||
@ -400,61 +401,28 @@ int fpsplot_release(void){
|
||||
|
||||
// currently running demo is always at y = HUD_ROWS-2
|
||||
int hud_completion_notify(const demoresult* result){
|
||||
if(running){
|
||||
running->totalns = result->timens;
|
||||
running->frames = result->stats.renders;
|
||||
if(elems){
|
||||
elems->totalns = result->timens;
|
||||
elems->frames = result->stats.renders;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// inform the HUD of an upcoming demo
|
||||
int hud_schedule(const char* demoname){
|
||||
elem* cure;
|
||||
int line = writeline;
|
||||
// once we pass through this conditional:
|
||||
// * cure is ready to write to, and print at y = HUD_ROWS - 2
|
||||
// * hooks is ready to enqueue cure to
|
||||
// * reused entries have been printed, if any exist
|
||||
if(line <= 0){
|
||||
cure = elems;
|
||||
elems = cure->next;
|
||||
line = 1;
|
||||
free(cure->name);
|
||||
}else{
|
||||
--writeline;
|
||||
cure = malloc(sizeof(*cure));
|
||||
}
|
||||
elem** hook = hud_print_finished(&line);
|
||||
if(hook == NULL){
|
||||
free(cure);
|
||||
elem* cure = malloc(sizeof(*cure));
|
||||
if(!cure){
|
||||
return -1;
|
||||
}
|
||||
*hook = cure;
|
||||
cure->next = elems;
|
||||
cure->name = strdup(demoname);
|
||||
cure->next = NULL;
|
||||
cure->totalns = 0;
|
||||
cure->frames = 0;
|
||||
elems = cure;
|
||||
struct timespec cur;
|
||||
clock_gettime(CLOCK_MONOTONIC, &cur);
|
||||
cure->startns = timespec_to_ns(&cur);
|
||||
running = cure;
|
||||
if(hud){
|
||||
ncplane_set_fg_alpha(hud, CELL_ALPHA_OPAQUE);
|
||||
ncplane_set_fg(hud, 0);
|
||||
ncplane_set_bg_alpha(hud, CELL_ALPHA_BLEND);
|
||||
ncplane_set_bg(hud, 0);
|
||||
if(ncplane_printf_yx(hud, line, 1, "%d", cure->frames) < 0){
|
||||
return -1;
|
||||
}
|
||||
if(ncplane_printf_yx(hud, line, 7, "%ju.%02jus", cure->totalns / GIG,
|
||||
(cure->totalns % GIG) / (GIG / 100)) < 0){
|
||||
return -1;
|
||||
}
|
||||
if(ncplane_putstr_yx(hud, line, 18, cure->name) < 0){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return hud_print_finished(elems);
|
||||
}
|
||||
|
||||
// wake up every 100ms and render a frame so the HUD doesn't appear locked up.
|
||||
@ -524,8 +492,8 @@ int demo_render(struct notcurses* nc){
|
||||
if(!hud_hidden){
|
||||
ncplane_move_top(hud);
|
||||
}
|
||||
uint64_t ns = timespec_to_ns(&ts) - running->startns;
|
||||
++running->frames;
|
||||
uint64_t ns = timespec_to_ns(&ts) - elems->startns;
|
||||
++elems->frames;
|
||||
cell c = CELL_TRIVIAL_INITIALIZER;
|
||||
ncplane_base(hud, &c);
|
||||
ncplane_set_bg(hud, cell_bg(&c));
|
||||
@ -533,14 +501,14 @@ int demo_render(struct notcurses* nc){
|
||||
ncplane_set_fg(hud, 0x002080);
|
||||
ncplane_set_fg_alpha(hud, CELL_ALPHA_OPAQUE);
|
||||
cell_release(hud, &c);
|
||||
if(ncplane_printf_yx(hud, HUD_ROWS - 2, 1, "%d", running->frames) < 0){
|
||||
if(ncplane_printf_yx(hud, 1, 1, "%d", elems->frames) < 0){
|
||||
return -1;
|
||||
}
|
||||
if(ncplane_printf_yx(hud, HUD_ROWS - 2, 7, "%ju.%02jus",
|
||||
if(ncplane_printf_yx(hud, 1, 7, "%ju.%02jus",
|
||||
ns / GIG, (ns % GIG) / (GIG / 100)) < 0){
|
||||
return -1;
|
||||
}
|
||||
if(ncplane_putstr_yx(hud, HUD_ROWS - 2, 18, running->name) < 0){
|
||||
if(ncplane_putstr_yx(hud, 1, 18, elems->name) < 0){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user