source: neercs/trunk/src/screensaver.c @ 3942

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