GConf support.
[speedometer] / ui.c
1 /****
2         Speedometer, shows your current speed using GPS
3         Copyright (C) 2008 Wellu Mäkinen <wellu@wellu.org>
4
5         This program is free software: you can redistribute it and/or modify
6         it under the terms of the GNU General Public License as published by
7         the Free Software Foundation, either version 3 of the License, or
8         (at your option) any later version.
9
10         This program is distributed in the hope that it will be useful,
11         but WITHOUT ANY WARRANTY; without even the implied warranty of
12         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13         GNU General Public License for more details.
14
15         You should have received a copy of the GNU General Public License
16         along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  ****/
18
19 #include <gtk/gtk.h>
20
21 #include "ui.h"
22 #include "callbacks.h"
23
24 #define IMAGE_PATH "/usr/share/speedometer/%d.png"
25
26 static void set_widget_bg_black(GtkWidget* widget) {
27         GdkColor black;
28         black.red = 0x0000;
29         black.blue = 0x0000;
30         black.green = 0x0000;
31         gtk_widget_modify_bg(GTK_WIDGET(widget), GTK_STATE_NORMAL, &black);
32 }
33
34 void load_images(AppData *appdata) {
35         g_print("Loading images\n");
36         guint i = 0;
37         while(i < 10) {
38                 char* path = g_malloc(30);
39                 g_sprintf(path, IMAGE_PATH, i);
40                 appdata->image_array[i] = gtk_image_new_from_file(path);
41                 g_print(path);
42                 g_print("\n");
43                 g_free(path);
44                 i++;
45         }
46 }
47
48 void load_initial_pixbufs(AppData* appdata) {
49
50         GdkPixbuf* zero = gtk_image_get_pixbuf(GTK_IMAGE(appdata->image_array[0]));
51
52         appdata->digit_array[0] = GTK_WIDGET(gtk_image_new_from_pixbuf(zero));
53         appdata->digit_array[1] = GTK_WIDGET(gtk_image_new_from_pixbuf(zero));
54         appdata->digit_array[2] = GTK_WIDGET(gtk_image_new_from_pixbuf(zero));
55 }
56
57 void set_nth_digit(AppData* appdata, guint n, guint value) {
58         //assert(nth >= 0 && nth < 3);
59
60         GtkWidget* image = appdata->digit_array[n];
61         GdkPixbuf* buf = gtk_image_get_pixbuf(GTK_IMAGE(appdata->image_array[value]));
62         gtk_image_set_from_pixbuf(GTK_IMAGE(image), buf);
63 }
64
65 void repaint_all_digits(AppData* appdata) {
66         gtk_widget_queue_draw(GTK_WIDGET(appdata->digit_array[0]));
67         gtk_widget_queue_draw(GTK_WIDGET(appdata->digit_array[1]));
68         gtk_widget_queue_draw(GTK_WIDGET(appdata->digit_array[2]));
69 }
70
71 void randomize(AppData* appdata) {
72
73         gint32 n = g_random_int_range(0, 3);
74         GtkWidget* image = appdata->digit_array[n];
75
76         gint32 m = g_random_int_range(0, 10);
77         GdkPixbuf* buf = gtk_image_get_pixbuf(GTK_IMAGE(appdata->image_array[m]));
78
79         g_print("Setting number %d to %d.. ", n+1, m);
80
81         gtk_image_set_from_pixbuf(GTK_IMAGE(image), buf);
82         gtk_widget_queue_draw(appdata->digit_array[n]);
83 }
84
85 void create_ui(AppData* appdata) {
86
87         GtkWidget *hbox;
88         GtkWidget *vbox;
89
90         vbox = gtk_vbox_new(FALSE, 0);
91         hbox = gtk_hbox_new(TRUE, 0);
92
93         GtkWidget* top_e = gtk_event_box_new();
94         GtkWidget* bottom_e = gtk_event_box_new();
95
96         g_signal_connect(G_OBJECT(top_e),
97                         "button_press_event",
98                         G_CALLBACK(top_event_box_button_press),
99                         appdata);
100
101         g_signal_connect(G_OBJECT(bottom_e),
102                         "button_press_event",
103                         G_CALLBACK(bottom_event_box_button_press),
104                         appdata);
105
106         g_signal_connect(G_OBJECT(appdata->window),
107                         "delete_event",
108                         G_CALLBACK(gtk_main_quit),
109                         NULL);
110
111     g_signal_connect(G_OBJECT(appdata->window),
112                 "key_press_event",
113                 G_CALLBACK(key_press_cb),
114                 appdata->window);
115
116         // add three digits to the hbox
117         gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(appdata->digit_array[0]), FALSE, FALSE, 0);
118         gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(appdata->digit_array[1]), FALSE, FALSE, 0);
119         gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(appdata->digit_array[2]), FALSE, FALSE, 0);
120
121         gtk_box_pack_start_defaults(GTK_BOX(vbox), top_e); // add event box on top
122         gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox); // numbers to the middle
123         gtk_box_pack_start_defaults(GTK_BOX(vbox), bottom_e); // add event box on bottom
124
125         gtk_container_add(GTK_CONTAINER(appdata->window), GTK_WIDGET(vbox));
126
127
128         // set backgrounds black
129         set_widget_bg_black(GTK_WIDGET(appdata->window));
130         set_widget_bg_black(bottom_e);
131         set_widget_bg_black(top_e);
132
133 }
134