From ca6e03940a92418aea09cfb1d3382f5d70e91d89 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 26 Apr 2010 01:32:20 +0000 Subject: snow curses --- Makefile | 8 ++++++ snow.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 Makefile create mode 100644 snow.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2e53210 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +# $Id$ + +PROG= snow +NOMAN= +DPADD= ${LIBCURSES} +LDADD= -lcurses + +.include diff --git a/snow.c b/snow.c new file mode 100644 index 0000000..b68b91e --- /dev/null +++ b/snow.c @@ -0,0 +1,98 @@ +/* $Id$ */ +/* + * Copyright (c) 2010 Dimitri Sokolyuk + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +struct particle { + int x; + int y; + int dy; + TAILQ_ENTRY(particle) link; +} *pp, *pnext; + +TAILQ_HEAD(, particle) head; + +extern int LINES; +extern int COLS; +static int d_flag = 0; + +void +resize(int signo) +{ + struct winsize ws; + + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) + resizeterm(ws.ws_row, ws.ws_col); +} + +void +die(int signo) +{ + d_flag = 1; +} + +int +main() +{ + initscr(); + curs_set(0); + + TAILQ_INIT(&head); + srandom(time(NULL)); + + signal(SIGWINCH, resize); + signal(SIGINT, die); + signal(SIGTERM, die); + signal(SIGHUP, die); + + while (!d_flag) { + erase(); + + for (pp = TAILQ_FIRST(&head); pp; pp = pnext) { + pnext = TAILQ_NEXT(pp, link); + if (pp->y > LINES || pp->x < 0 || pp->x > COLS) { + TAILQ_REMOVE(&head, pp, link); + free(pp); + } else { + mvprintw(pp->y, pp->x, "*"); + pp->y += pp->dy; + pp->x += 1 - random() % 3; + } + } + + pp = calloc(1, sizeof(struct particle)); + pp->dy = 1 + random() % 3; + pp->y = 0; + pp->x = random() % COLS; + TAILQ_INSERT_HEAD(&head, pp, link); + + refresh(); + usleep(50000); + } + + curs_set(1); + endwin(); + + return 0; +} -- cgit v1.2.3