1 /* gcc -Wall -g $(pkg-config --cflags --libs gtk+-2.0 cairo) olpc-boot.c -o olpc-boot */
6 typedef struct _state {
7 GtkWidget *drawing_area;
11 typedef struct _color {
17 #define HEX_COLOR(r,g,b) {(r) / 255.0, (g) / 255.0, (b) / 255.0}
19 color_t background[2] = {
20 HEX_COLOR (0x75, 0x75, 0x75),
21 HEX_COLOR (0xdb, 0xdc, 0xdf)
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))
29 xoboot_expose_event (GtkWidget *widget,
30 GdkEventExpose *event,
33 state_t *state = closure;
36 cr = gdk_cairo_create (widget->window);
38 cairo_set_source_rgb (cr, LERP_COLORS (background[0],
49 create_window (state_t *state)
52 GtkWidget *drawing_area;
54 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
55 gtk_window_set_title (GTK_WINDOW (window), "OLPC Boot Animation Demo");
57 g_signal_connect (window, "destroy",
58 G_CALLBACK (gtk_main_quit), &window);
60 drawing_area = gtk_drawing_area_new ();
62 /* We want to force 640x480 to emulate the OLPC display */
63 gtk_widget_set_size_request (drawing_area, 640, 480);
65 gtk_container_add (GTK_CONTAINER (window), drawing_area);
67 g_signal_connect (drawing_area, "expose_event",
68 G_CALLBACK (xoboot_expose_event), state);
74 timeout_callback (gpointer closure)
76 state_t *state = closure;
78 state->progress += 0.01;
79 if (state->progress > 1.0)
80 state->progress = 1.0;
82 gtk_widget_queue_draw (state->drawing_area);
88 main (int argc, char *argv[])
92 gtk_init (&argc, &argv);
94 state.drawing_area = create_window (&state);
97 gtk_widget_show_all (gtk_widget_get_toplevel (state.drawing_area));
99 g_timeout_add (100, timeout_callback, &state);