summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2010-04-26 01:32:20 +0000
committerDimitri Sokolyuk <demon@dim13.org>2010-04-26 01:32:20 +0000
commitca6e03940a92418aea09cfb1d3382f5d70e91d89 (patch)
treeac79620503d17d56844e0f35817ec935cc72c718
snow curses
-rw-r--r--Makefile8
-rw-r--r--snow.c98
2 files changed, 106 insertions, 0 deletions
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 <bsd.prog.mk>
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 <demon@dim13.org>
+ *
+ * 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 <sys/ioctl.h>
+#include <sys/queue.h>
+#include <curses.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+
+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;
+}