]> git.cworth.org Git - xoboot/blob - xoboot.c
Initial commit of xoboot
[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 static gboolean
12 xoboot_expose_event (GtkWidget      *widget,
13                       GdkEventExpose *event,
14                       gpointer        closure)
15 {
16     state_t *state = closure;
17     cairo_t *cr;
18
19     cr = gdk_cairo_create (widget->window);
20
21     cairo_set_source_rgb (cr, state->progress, 0, 0);
22     cairo_paint (cr);
23
24     cairo_destroy (cr);
25
26     return TRUE;
27 }
28
29 static GtkWidget *
30 create_window (state_t *state)
31 {
32     GtkWidget *window;
33     GtkWidget *drawing_area;
34
35     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
36     gtk_window_set_title (GTK_WINDOW (window), "OLPC Boot Animation Demo");
37
38     g_signal_connect (window, "destroy",
39                       G_CALLBACK (gtk_main_quit), &window);
40
41     drawing_area = gtk_drawing_area_new ();
42
43     /* We want to force 640x480 to emulate the OLPC display */
44     gtk_widget_set_size_request (drawing_area, 640, 480);
45
46     gtk_container_add (GTK_CONTAINER (window), drawing_area);
47
48     g_signal_connect (drawing_area, "expose_event",
49                       G_CALLBACK (xoboot_expose_event), state);
50
51     return drawing_area;
52 }
53
54 static gint
55 timeout_callback (gpointer closure)
56 {
57     state_t *state = closure;
58
59     state->progress += 0.01;
60     if (state->progress > 1.0)
61         state->progress = 1.0;
62     else
63         gtk_widget_queue_draw (state->drawing_area);
64
65     return TRUE;
66 }
67
68 int
69 main (int argc, char *argv[])
70 {
71     state_t state;
72
73     gtk_init (&argc, &argv);
74
75     state.drawing_area = create_window (&state);
76     state.progress = 0.0;
77
78     gtk_widget_show_all (gtk_widget_get_toplevel (state.drawing_area));
79
80     g_timeout_add (100, timeout_callback, &state);
81
82     gtk_main ();
83
84     return 0;
85 }