+static void
+part1(DATA * drop)
+{
+ mvaddch(drop->y, drop->x, '.');
+}
+
+static void
+part2(DATA * drop)
+{
+ mvaddch(drop->y, drop->x, 'o');
+}
+
+static void
+part3(DATA * drop)
+{
+ 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, '-');
+}
+
+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, '-');
+}
+
+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, ' ');
+}
+
+#ifdef USE_PTHREADS
+static void
+napsome(void)
+{
+ refresh();
+ napms(60);
+}
+
+/*
+ * This runs inside the mutex.
+ */
+static int
+really_draw(WINDOW *win, void *arg)
+{
+ DATA *data = (DATA *) arg;
+
+ (void) win;
+ next_j(data->state);
+ data->func(data);
+ return OK;
+}
+
+static void
+draw_part(void (*func) (DATA *), int state, DATA * data)
+{
+ data->func = func;
+ data->state = state;
+ use_window(stdscr, really_draw, (void *) data);
+ napsome();
+}
+
+static void *
+draw_drop(void *arg)
+{
+ DATA mydata;
+
+ mydata = *(DATA *) arg; /* make a copy of caller's data */
+
+ draw_part(part1, 0, &mydata);
+ draw_part(part2, 1, &mydata);
+ draw_part(part3, 2, &mydata);
+ draw_part(part4, 3, &mydata);
+ draw_part(part5, 4, &mydata);
+ draw_part(part6, 0, &mydata);
+
+ return NULL;
+}
+#endif
+
+static int
+get_input(void)
+{
+ int ch;
+ ch = USING_WINDOW(stdscr, wgetch);
+ return ch;
+}
+