X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Frain.c;h=14a536ba3f1e930b949d8761ea1ac819c21f6bfd;hp=f4a5e7f332ea9265e5a21f776eb2ca8d8d03c35d;hb=f3ec084eb66ba14feb6357b674fb85dd474933d8;hpb=9edffa2f21102c06dcf682d58b074c407bcedd0a diff --git a/test/rain.c b/test/rain.c index f4a5e7f3..14a536ba 100644 --- a/test/rain.c +++ b/test/rain.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2006,2008 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -26,9 +27,10 @@ * authorization. * ****************************************************************************/ /* - * $Id: rain.c,v 1.34 2008/05/24 23:34:34 tom Exp $ + * $Id: rain.c,v 1.51 2020/02/02 23:34:34 tom Exp $ */ #include +#include /* rain 11/3/1980 EPS/CITHEP */ @@ -66,31 +68,38 @@ typedef struct { static STATS drop_threads[MAX_THREADS]; #endif +#if HAVE_USE_WINDOW +static int +safe_wgetch(WINDOW *w, void *data GCC_UNUSED) +{ + return wgetch(w); +} +#endif + static void onsig(int n GCC_UNUSED) { - curs_set(1); - endwin(); + stop_curses(); ExitProgram(EXIT_FAILURE); } -static float +static double ranf(void) { long r = (rand() & 077777); - return ((float) r / 32768.); + return ((double) r / 32768.); } static int random_x(void) { - return (((float) (COLS - 4) * ranf()) + 2); + return (int) (((double) (COLS - 4) * ranf()) + 2); } static int random_y(void) { - return (((float) (LINES - 4) * ranf()) + 2); + return (int) (((double) (LINES - 4) * ranf()) + 2); } static int @@ -102,10 +111,7 @@ next_j(int j) --j; if (has_colors()) { int z = (int) (3 * ranf()); - chtype color = COLOR_PAIR(z); - if (z) - color |= A_BOLD; - attrset(color); + (void) attrset(AttrArg(COLOR_PAIR(z), (z ? A_BOLD : A_NORMAL))); } return j; } @@ -113,47 +119,47 @@ next_j(int j) static void part1(DATA * drop) { - mvaddch(drop->y, drop->x, '.'); + MvAddCh(drop->y, drop->x, '.'); } static void part2(DATA * drop) { - mvaddch(drop->y, drop->x, 'o'); + MvAddCh(drop->y, drop->x, 'o'); } static void part3(DATA * drop) { - mvaddch(drop->y, drop->x, 'O'); + MvAddCh(drop->y, drop->x, 'O'); } static void part4(DATA * drop) { - mvaddch(drop->y - 1, drop->x, '-'); - mvaddstr(drop->y, drop->x - 1, "|.|"); - mvaddch(drop->y + 1, drop->x, '-'); + MvAddCh(drop->y - 1, drop->x, '-'); + MvAddStr(drop->y, drop->x - 1, "|.|"); + MvAddCh(drop->y + 1, drop->x, '-'); } static void part5(DATA * drop) { - mvaddch(drop->y - 2, drop->x, '-'); - mvaddstr(drop->y - 1, drop->x - 1, "/ \\"); - mvaddstr(drop->y, drop->x - 2, "| O |"); - mvaddstr(drop->y + 1, drop->x - 1, "\\ /"); - mvaddch(drop->y + 2, drop->x, '-'); + MvAddCh(drop->y - 2, drop->x, '-'); + MvAddStr(drop->y - 1, drop->x - 1, "/ \\"); + MvAddStr(drop->y, drop->x - 2, "| O |"); + MvAddStr(drop->y + 1, drop->x - 1, "\\ /"); + MvAddCh(drop->y + 2, drop->x, '-'); } static void part6(DATA * drop) { - mvaddch(drop->y - 2, drop->x, ' '); - mvaddstr(drop->y - 1, drop->x - 1, " "); - mvaddstr(drop->y, drop->x - 2, " "); - mvaddstr(drop->y + 1, drop->x - 1, " "); - mvaddch(drop->y + 2, drop->x, ' '); + MvAddCh(drop->y - 2, drop->x, ' '); + MvAddStr(drop->y - 1, drop->x - 1, " "); + MvAddStr(drop->y, drop->x - 2, " "); + MvAddStr(drop->y + 1, drop->x - 1, " "); + MvAddCh(drop->y + 2, drop->x, ' '); } #ifdef USE_PTHREADS @@ -222,7 +228,11 @@ draw_drop(void *arg) * Find myself in the list of threads so we can count the number of loops. */ for (mystats = 0; mystats < MAX_THREADS; ++mystats) { +#if defined(_WIN32) && !defined(__WINPTHREADS_VERSION) + if (drop_threads[mystats].myself.p == pthread_self().p) +#else if (drop_threads[mystats].myself == pthread_self()) +#endif break; } @@ -252,7 +262,7 @@ draw_drop(void *arg) /* * The description of pthread_create() is misleading, since it implies that * threads will exit cleanly after their function returns. - * + * * Since they do not (and the number of threads is limited by system * resources), make a limited number of threads, and signal any that are * waiting when we want a thread past that limit. @@ -284,34 +294,80 @@ start_drop(DATA * data) static int get_input(void) { - return USING_WINDOW(stdscr, wgetch); + return USING_WINDOW1(stdscr, wgetch, safe_wgetch); +} + +static void +usage(void) +{ + static const char *msg[] = + { + "Usage: rain [options]" + ,"" + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(EXIT_FAILURE); } int -main(int argc GCC_UNUSED, - char *argv[]GCC_UNUSED) +main(int argc, char *argv[]) { + static const char *help[] = + { + "Commands:", + " q/Q exit the program", + " s do single-step", + " undo single-step", + "", + 0 + }; + bool done = FALSE; DATA drop; #ifndef USE_PTHREADS DATA last[MAX_DROP]; #endif int j = 0; + int ch; +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif - setlocale(LC_ALL, ""); + while ((ch = getopt(argc, argv, "d")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif + default: + usage(); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(); - CATCHALL(onsig); + setlocale(LC_ALL, ""); - initscr(); + InitAndCatch(initscr(), onsig); if (has_colors()) { int bg = COLOR_BLACK; start_color(); #if HAVE_USE_DEFAULT_COLORS - if (use_default_colors() == OK) + if (d_option && (use_default_colors() == OK)) bg = -1; #endif - init_pair(1, COLOR_BLUE, bg); - init_pair(2, COLOR_CYAN, bg); + init_pair(1, COLOR_BLUE, (short) bg); + init_pair(2, COLOR_CYAN, (short) bg); } nl(); noecho(); @@ -372,11 +428,17 @@ main(int argc GCC_UNUSED, case (KEY_RESIZE): break; #endif + case HELP_KEY_1: + popup_msg(stdscr, help); + break; + case ERR: + break; + default: + beep(); } napms(50); } - curs_set(1); - endwin(); + stop_curses(); #ifdef USE_PTHREADS printf("Counts per thread:\n"); for (j = 0; j < MAX_THREADS; ++j)