選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

188 行
4.6 KiB

  1. /*
  2. * neercs console-based window manager
  3. * Copyright (c) 2006-2010 Sam Hocevar <sam@hocevar.net>
  4. * 2008-2010 Jean-Yves Lamoureux <jylam@lnxscene.org>
  5. * All Rights Reserved
  6. *
  7. * This program is free software. It comes without any warranty, to
  8. * the extent permitted by applicable law. You can redistribute it
  9. * and/or modify it under the terms of the Do What The Fuck You Want
  10. * To Public License, Version 2, as published by Sam Hocevar. See
  11. * http://sam.zoy.org/wtfpl/COPYING for more details.
  12. */
  13. #include "config.h"
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <sys/types.h>
  18. #include <signal.h>
  19. #include <sys/wait.h>
  20. #include <errno.h>
  21. #include <unistd.h>
  22. #include <caca.h>
  23. #include "neercs.h"
  24. void screensaver_init(struct screen_list *screen_list)
  25. {
  26. screensaver_flying_toasters_init(screen_list);
  27. }
  28. void screensaver_kill(struct screen_list *screen_list)
  29. {
  30. screensaver_flying_toasters_kill(screen_list);
  31. }
  32. void draw_screensaver(struct screen_list *screen_list)
  33. {
  34. screensaver_flying_toasters(screen_list);
  35. }
  36. /* Flying Toasters */
  37. #define COUNT 15
  38. #define PRECISION 100
  39. char toaster_text[3][99] = { {
  40. " __._ \n"
  41. " .-'== _',\n"
  42. " <|_= .-' |\n"
  43. " | --| \\'.-_ \n"
  44. " | | \\ \" _.\n"
  45. " `-_|.-\\_.-\n"},
  46. {
  47. " __._ \n"
  48. " .-'== _',\n"
  49. " \\|_= .-' |\n"
  50. " | --| __'-.\n"
  51. " | | ___.-\n"
  52. " `-_|.-\n"},
  53. {
  54. " _- __._\n"
  55. " /.-'== _',_.-.\n"
  56. " \\|_= .-'/ _.'\n"
  57. " | --| / .-\n"
  58. " | | _.|\n"
  59. " `-_|.-\n"}
  60. };
  61. char toaster_mask[3][99] = { {
  62. " __._ \n"
  63. " .-'== _',\n"
  64. " <|_=X.-'XX|\n"
  65. " |X--|XXX\\'.-_ \n"
  66. " |XXX|X\\XX\"X_.\n"
  67. " `-_|.-\\_.-\n"},
  68. {
  69. " __._ \n"
  70. " .-'== _',\n"
  71. " \\|_= .-'XX|\n"
  72. " |X--|XX__'-.\n"
  73. " |XXX|X___.-\n"
  74. " `-_|.-\n"},
  75. {
  76. " _- __._\n"
  77. " /.-'== _',_.-.\n"
  78. " \\|_= .-'/XX_.'\n"
  79. " |X--|X/X.-\n"
  80. " |XXX|XX_.|\n"
  81. " `-_|.-\n"}
  82. };
  83. struct flying_toaster
  84. {
  85. int x[COUNT], y[COUNT], s[COUNT];
  86. caca_canvas_t **toaster;
  87. caca_canvas_t **mask;
  88. };
  89. void screensaver_flying_toasters_init(struct screen_list *screen_list)
  90. {
  91. struct flying_toaster *flying_toaster;
  92. int w = caca_get_canvas_width(screen_list->cv);
  93. int h = caca_get_canvas_height(screen_list->cv);
  94. int i;
  95. flying_toaster = malloc(sizeof(struct flying_toaster));
  96. flying_toaster->toaster =
  97. (caca_canvas_t **) malloc(sizeof(caca_canvas_t *) * 3);
  98. flying_toaster->mask =
  99. (caca_canvas_t **) malloc(sizeof(caca_canvas_t *) * 3);
  100. for (i = 0; i < 3; i++)
  101. {
  102. flying_toaster->toaster[i] = caca_create_canvas(0, 0);
  103. flying_toaster->mask[i] = caca_create_canvas(0, 0);
  104. caca_import_canvas_from_memory(flying_toaster->toaster[i],
  105. toaster_text[i],
  106. strlen(toaster_text[i]), "utf8");
  107. caca_import_canvas_from_memory(flying_toaster->mask[i],
  108. toaster_mask[i],
  109. strlen(toaster_mask[i]), "utf8");
  110. }
  111. for (i = 0; i < COUNT; i++)
  112. {
  113. flying_toaster->x[i] = (rand() % w) * PRECISION;
  114. flying_toaster->y[i] = (rand() % h) * PRECISION;
  115. flying_toaster->s[i] = (rand() % 3) * PRECISION;
  116. }
  117. screen_list->screensaver.data = flying_toaster;
  118. }
  119. void screensaver_flying_toasters_kill(struct screen_list *screen_list)
  120. {
  121. struct flying_toaster *flying_toaster = screen_list->screensaver.data;
  122. caca_free_canvas(flying_toaster->toaster[0]);
  123. caca_free_canvas(flying_toaster->toaster[1]);
  124. caca_free_canvas(flying_toaster->toaster[2]);
  125. free(flying_toaster->toaster);
  126. free(flying_toaster);
  127. screen_list->screensaver.data = NULL;
  128. }
  129. void screensaver_flying_toasters(struct screen_list *screen_list)
  130. {
  131. struct flying_toaster *d = screen_list->screensaver.data;
  132. int i, w, h, x, y, s;
  133. if (!d)
  134. return;
  135. w = caca_get_canvas_width(screen_list->cv);
  136. h = caca_get_canvas_height(screen_list->cv);
  137. caca_set_color_ansi(screen_list->cv, CACA_WHITE, CACA_BLACK);
  138. caca_clear_canvas(screen_list->cv);
  139. for (i = 0; i < COUNT; i++)
  140. {
  141. x = d->x[i] / PRECISION;
  142. y = d->y[i] / PRECISION;
  143. s = d->s[i] / PRECISION;
  144. caca_blit(screen_list->cv, x, y, d->toaster[s], d->mask[s]);
  145. d->x[i] -= 40;
  146. d->y[i] += 10;
  147. if (d->x[i] / PRECISION + caca_get_canvas_width(d->toaster[s]) <= 0)
  148. d->x[i] = ((rand() % w) / 3 + w) * PRECISION;
  149. if (d->y[i] / PRECISION >= h)
  150. d->y[i] = ((rand() % h) / 2 - h) * PRECISION;
  151. d->s[i] = ((d->s[i] + 24) % (3 * PRECISION));
  152. }
  153. }