notcurses/src/demo/demo.c

194 lines
4.7 KiB
C
Raw Normal View History

#include <wchar.h>
#include <stdio.h>
2019-11-23 23:34:06 +00:00
#include <string.h>
#include <locale.h>
2019-11-19 14:10:28 +00:00
#include <unistd.h>
#include <getopt.h>
2019-11-17 10:04:41 +00:00
#include <stdlib.h>
2019-11-17 14:53:59 +00:00
#include <notcurses.h>
#include "demo.h"
2019-11-17 10:04:41 +00:00
struct timespec demodelay = {
.tv_sec = 1,
.tv_nsec = 0,
};
static void
usage(const char* exe, int status){
FILE* out = status == EXIT_SUCCESS ? stdout : stderr;
fprintf(out, "usage: %s [ -h ] [ -k ] [ -d ns ]\n", exe);
fprintf(out, " h: this message\n");
fprintf(out, " k: keep screen; do not switch to alternate\n");
fprintf(out, " d: delay in nanoseconds between demos\n");
exit(status);
}
2019-11-25 02:54:00 +00:00
static int
ext_demos(struct notcurses* nc){
2019-11-28 20:20:10 +00:00
if(sliding_puzzle_demo(nc)){
return -1;
}
if(unicodeblocks_demo(nc)){
return -1;
}
2019-11-25 23:10:07 +00:00
if(maxcolor_demo(nc)){
return -1;
}
if(box_demo(nc)){
2019-11-25 14:02:30 +00:00
return -1;
}
if(grid_demo(nc)){
2019-11-25 02:54:00 +00:00
return -1;
}
if(widecolor_demo(nc)){
return -1;
}
return 0;
}
static int
handle_opts(int argc, char** argv, notcurses_options* opts){
int c;
memset(opts, 0, sizeof(*opts));
opts->outfp = stdout;
while((c = getopt(argc, argv, "hkd:")) != EOF){
switch(c){
case 'h':
usage(*argv, EXIT_SUCCESS);
break;
case 'k':
opts->inhibit_alternate_screen = true;
break;
case 'd':{
char* eptr;
unsigned long ns = strtoul(optarg, &eptr, 0);
if(*eptr){
usage(*argv, EXIT_FAILURE);
}
demodelay.tv_sec = ns / 1000000000;
demodelay.tv_nsec = ns % 1000000000;
break;
}default:
usage(*argv, EXIT_FAILURE);
}
}
return 0;
}
2019-11-21 11:55:05 +00:00
// just fucking around...for now
int main(int argc, char** argv){
struct notcurses* nc;
notcurses_options nopts;
2019-11-21 11:38:21 +00:00
struct ncplane* ncp;
if(!setlocale(LC_ALL, "")){
fprintf(stderr, "Couldn't set locale based on user preferences\n");
return EXIT_FAILURE;
}
if(handle_opts(argc, argv, &nopts)){
return EXIT_FAILURE;
}
if((nc = notcurses_init(&nopts)) == NULL){
return EXIT_FAILURE;
}
2019-11-21 11:38:21 +00:00
if((ncp = notcurses_stdplane(nc)) == NULL){
fprintf(stderr, "Couldn't get standard plane\n");
goto err;
}
nanosleep(&demodelay, NULL);
int x, y, rows, cols;
ncplane_dimyx(ncp, &rows, &cols);
cell c;
2019-11-25 02:54:00 +00:00
cell_init(&c);
2019-11-26 02:34:47 +00:00
const char* cstr = "Δ";
2019-11-24 00:24:29 +00:00
cell_load(ncp, &c, cstr);
cell_set_fg(&c, 200, 0, 200);
2019-11-25 09:54:40 +00:00
int ys = 200 / (rows - 2);
2019-11-27 19:49:01 +00:00
for(y = 5 ; y < rows - 6 ; ++y){
2019-11-25 09:54:40 +00:00
cell_set_bg(&c, 0, y * ys , 0);
2019-11-27 19:49:01 +00:00
for(x = 5 ; x < cols - 6 ; ++x){
if(ncplane_cursor_move_yx(ncp, y, x)){
goto err;
}
2019-11-24 20:33:22 +00:00
if(ncplane_putc(ncp, &c) != (int)strlen(cstr)){
goto err;
}
}
}
2019-11-24 20:33:22 +00:00
cell_release(ncp, &c);
2019-11-26 02:34:47 +00:00
cell ul = CELL_TRIVIAL_INITIALIZER;
cell ur = CELL_TRIVIAL_INITIALIZER;
cell ll = CELL_TRIVIAL_INITIALIZER;
cell lr = CELL_TRIVIAL_INITIALIZER;
cell vl = CELL_TRIVIAL_INITIALIZER;
cell hl = CELL_TRIVIAL_INITIALIZER;
if(ncplane_rounded_box_cells(ncp, &ul, &ur, &ll, &lr, &hl, &vl)){
2019-11-26 02:34:47 +00:00
goto err;
}
cell_set_fg(&ul, 90, 0, 90);
cell_set_fg(&ur, 90, 0, 90);
cell_set_fg(&ll, 90, 0, 90);
cell_set_fg(&lr, 90, 0, 90);
cell_set_fg(&vl, 90, 0, 90);
cell_set_fg(&hl, 90, 0, 90);
cell_set_bg(&ul, 0, 0, 180);
cell_set_bg(&ur, 0, 0, 180);
cell_set_bg(&ll, 0, 0, 180);
cell_set_bg(&lr, 0, 0, 180);
cell_set_bg(&vl, 0, 0, 180);
cell_set_bg(&hl, 0, 0, 180);
2019-11-27 19:49:01 +00:00
if(ncplane_cursor_move_yx(ncp, 4, 4)){
goto err;
}
2019-11-27 19:49:01 +00:00
if(ncplane_box(ncp, &ul, &ur, &ll, &lr, &hl, &vl, rows - 6, cols - 6)){
2019-11-26 02:34:47 +00:00
goto err;
}
const char s1[] = " Die Welt ist alles, was der Fall ist. ";
2019-11-24 00:24:29 +00:00
const char str[] = " Wovon man nicht sprechen kann, darüber muss man schweigen. ";
2019-11-26 02:34:47 +00:00
if(ncplane_fg_rgb8(ncp, 192, 192, 192)){
2019-11-23 17:39:54 +00:00
goto err;
}
2019-11-26 02:34:47 +00:00
if(ncplane_bg_rgb8(ncp, 0, 40, 0)){
2019-11-23 17:28:42 +00:00
goto err;
}
2019-11-26 02:34:47 +00:00
if(ncplane_cursor_move_yx(ncp, rows / 2 - 2, (cols - strlen(s1) + 4) / 2)){
goto err;
}
if(ncplane_putstr(ncp, s1) != (int)strlen(s1)){
goto err;
}
if(ncplane_cursor_move_yx(ncp, rows / 2, (cols - strlen(str) + 4) / 2)){
goto err;
}
ncplane_styles_on(ncp, CELL_STYLE_ITALIC);
2019-11-23 23:34:06 +00:00
if(ncplane_putstr(ncp, str) != (int)strlen(str)){
2019-11-23 17:28:42 +00:00
goto err;
}
ncplane_styles_off(ncp, CELL_STYLE_ITALIC);
const wchar_t wstr[] = L"▏▁ ▂ ▃ ▄ ▅ ▆ ▇ █ █ ▇ ▆ ▅ ▄ ▃ ▂ ▁▕";
char mbstr[128];
if(wcstombs(mbstr, wstr, sizeof(mbstr)) <= 0){
2019-11-25 12:46:11 +00:00
goto err;
}
if(ncplane_cursor_move_yx(ncp, rows / 2 - 5, (cols - wcslen(wstr) + 4) / 2)){
goto err;
}
if(ncplane_putstr(ncp, mbstr) != (int)strlen(mbstr)){
2019-11-25 12:46:11 +00:00
goto err;
}
2019-11-23 17:28:42 +00:00
if(notcurses_render(nc)){
goto err;
}
nanosleep(&demodelay, NULL);
2019-11-25 02:54:00 +00:00
if(ext_demos(nc)){
goto err;
2019-11-24 19:09:53 +00:00
}
if(notcurses_stop(nc)){
2019-11-17 14:53:59 +00:00
return EXIT_FAILURE;
}
2019-11-17 10:04:41 +00:00
return EXIT_SUCCESS;
err:
notcurses_stop(nc);
return EXIT_FAILURE;
2019-11-17 10:04:41 +00:00
}