]> git.cworth.org Git - xoboot/blob - xoboot.c
ee6828997d3cd596492267b39ee4d4d70dcbe8af
[xoboot] / xoboot.c
1 /* gcc -Wall -g $(pkg-config --cflags --libs gtk+-2.0 cairo) olpc-boot.c -o olpc-boot */
2
3 #include <gtk/gtk.h>
4 #include <cairo.h>
5
6 typedef struct _state {
7     GtkWidget *drawing_area;
8     double progress;
9 } state_t;
10
11 typedef struct _color {
12     double r;
13     double g;
14     double b;
15 } color_t;
16
17 #define HEX_COLOR(r,g,b) {(r) / 255.0, (g) / 255.0, (b) / 255.0}
18
19 color_t background[2] = {
20     HEX_COLOR (0x75, 0x75, 0x75),
21     HEX_COLOR (0xdb, 0xdc, 0xdf)
22 };
23
24 #define LERP(a,b,t) ((a) + (t) * ((b) - (a)))
25 #define LERP_COLORS(c0, c1, t) LERP((c0).r, (c1).r, (t)), \
26                                LERP((c0).g, (c1).g, (t)), \
27                                LERP((c0).b, (c1).b, (t))
28 static gboolean
29 xoboot_expose_event (GtkWidget      *widget,
30                       GdkEventExpose *event,
31                       gpointer        closure)
32 {
33     state_t *state = closure;
34     cairo_t *cr;
35
36     cr = gdk_cairo_create (widget->window);
37
38     cairo_set_source_rgb (cr, LERP_COLORS (background[0],
39                                            background[1],
40                                            state->progress));
41     cairo_paint (cr);
42
43     cairo_destroy (cr);
44
45     return TRUE;
46 }
47
48 static GtkWidget *
49 create_window (state_t *state)
50 {
51     GtkWidget *window;
52     GtkWidget *drawing_area;
53
54     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
55     gtk_window_set_title (GTK_WINDOW (window), "OLPC Boot Animation Demo");
56
57     g_signal_connect (window, "destroy",
58                       G_CALLBACK (gtk_main_quit), &window);
59
60     drawing_area = gtk_drawing_area_new ();
61
62     /* We want to force 640x480 to emulate the OLPC display */
63     gtk_widget_set_size_request (drawing_area, 640, 480);
64
65     gtk_container_add (GTK_CONTAINER (window), drawing_area);
66
67     g_signal_connect (drawing_area, "expose_event",
68                       G_CALLBACK (xoboot_expose_event), state);
69
70     return drawing_area;
71 }
72
73 static gint
74 timeout_callback (gpointer closure)
75 {
76     state_t *state = closure;
77
78     state->progress += 0.01;
79     if (state->progress > 1.0)
80         state->progress = 1.0;
81     else
82         gtk_widget_queue_draw (state->drawing_area);
83
84     return TRUE;
85 }
86
87 int
88 main (int argc, char *argv[])
89 {
90     state_t state;
91
92     gtk_init (&argc, &argv);
93
94     state.drawing_area = create_window (&state);
95     state.progress = 0.0;
96
97     gtk_widget_show_all (gtk_widget_get_toplevel (state.drawing_area));
98
99     g_timeout_add (100, timeout_callback, &state);
100
101     gtk_main ();
102
103     return 0;
104 }