Add options to not clear display and not set title

`nyancat -esnf 1` will (quite nicely) display a single frame and
then terminate, in a matter that is perfect for generate MOTDs.
`nyancat -esnf 10` (for example) will run through the animation
(though it may not work perfectly, depending on the size of your
terminal and various other things)
This commit is contained in:
Kevin Lange 2012-04-01 15:16:05 -05:00
parent 022fed78f0
commit ed320b7e75

View File

@ -111,6 +111,17 @@ int show_counter = 1;
*/ */
int frame_count = 0; int frame_count = 0;
/*
* Clear the screen between frames (as opposed to reseting
* the cursor position)
*/
int clear_screen = 1;
/*
* Force-set the terminal title.
*/
int set_title = 1;
/* /*
* Environment to use for setjmp/longjmp * Environment to use for setjmp/longjmp
* when breaking out of options handler * when breaking out of options handler
@ -146,7 +157,11 @@ int max_col = 50;
* and exit the application. * and exit the application.
*/ */
void finish() { void finish() {
printf("\033[?25h\033[0m\033[H\033[2J"); if (clear_screen) {
printf("\033[?25h\033[0m\033[H\033[2J");
} else {
printf("\033[0m\n");
}
exit(0); exit(0);
} }
@ -311,13 +326,19 @@ int main(int argc, char ** argv) {
/* Process arguments */ /* Process arguments */
int index, c; int index, c;
while ((c = getopt_long(argc, argv, "hitnf:r:R:c:C:W:H:", long_opts, &index)) != -1) { while ((c = getopt_long(argc, argv, "eshitnf:r:R:c:C:W:H:", long_opts, &index)) != -1) {
if (!c) { if (!c) {
if (long_opts[index].flag == 0) { if (long_opts[index].flag == 0) {
c = long_opts[index].val; c = long_opts[index].val;
} }
} }
switch (c) { switch (c) {
case 'e':
clear_screen = 0;
break;
case 's':
set_title = 0;
break;
case 'i': /* Show introduction */ case 'i': /* Show introduction */
show_intro = 1; show_intro = 1;
break; break;
@ -654,12 +675,18 @@ int main(int argc, char ** argv) {
} }
/* Attempt to set terminal title */ /* Attempt to set terminal title */
printf("\033kNyanyanyanyanyanyanya...\033\134"); if (set_title) {
printf("\033]1;Nyanyanyanyanyanyanya...\007"); printf("\033kNyanyanyanyanyanyanya...\033\134");
printf("\033]2;Nyanyanyanyanyanyanya...\007"); printf("\033]1;Nyanyanyanyanyanyanya...\007");
printf("\033]2;Nyanyanyanyanyanyanya...\007");
}
/* Clear the screen */ if (clear_screen) {
printf("\033[H\033[2J\033[?25l"); /* Clear the screen */
printf("\033[H\033[2J\033[?25l");
} else {
printf("\033[s");
}
if (show_intro) { if (show_intro) {
/* Display the MOTD */ /* Display the MOTD */
@ -690,11 +717,17 @@ int main(int argc, char ** argv) {
fflush(stdout); fflush(stdout);
usleep(400000); usleep(400000);
printf("\033[H"); /* Reset cursor */ if (clear_screen) {
printf("\033[H"); /* Reset cursor */
} else {
printf("\033[u");
}
} }
/* Clear the screen again */ if (clear_screen) {
printf("\033[H\033[2J\033[?25l"); /* Clear the screen again */
printf("\033[H\033[2J\033[?25l");
}
} }
/* Store the start time */ /* Store the start time */
@ -707,6 +740,12 @@ int main(int argc, char ** argv) {
char last = 0; /* Last color index rendered */ char last = 0; /* Last color index rendered */
size_t y, x; /* x/y coordinates of what we're drawing */ size_t y, x; /* x/y coordinates of what we're drawing */
while (playing) { while (playing) {
/* Reset cursor */
if (clear_screen) {
printf("\033[H");
} else {
printf("\033[u");
}
/* Render the frame */ /* Render the frame */
for (y = min_row; y < max_row; ++y) { for (y = min_row; y < max_row; ++y) {
for (x = min_col; x < max_col; ++x) { for (x = min_col; x < max_col; ++x) {
@ -765,8 +804,6 @@ int main(int argc, char ** argv) {
/* Loop animation */ /* Loop animation */
i = 0; i = 0;
} }
/* Reset cursor */
printf("\033[H");
/* Wait */ /* Wait */
usleep(90000); usleep(90000);
} }