removing some compiler warnings
[drnoksnes] / gui / settings.c
1 /*
2 * This file is part of DrNokSnes
3 *
4 * Copyright (C) 2009 Javier S. Pedro <maemo@javispedro.com>
5 *
6 * This software is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 2.1 of
9 * the License, or (at your option) any later version.
10 *
11 * This software is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this software; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 *
21 */
22
23 #include <string.h>
24 #include <gtk/gtk.h>
25 #include <hildon/hildon-helper.h>
26
27 #if MAEMO_VERSION >= 5
28 #include <hildon/hildon-gtk.h>
29 #include <hildon/hildon-pannable-area.h>
30 #include <hildon/hildon-button.h>
31 #include <hildon/hildon-check-button.h>
32 #include <hildon/hildon-picker-button.h>
33 #include <hildon/hildon-touch-selector.h>
34 #include <pango/pango-attributes.h>
35 #else
36 #include <hildon/hildon-caption.h>
37 #endif
38
39 #include "plugin.h"
40 #include "gconf.h"
41 #include "i18n.h"
42
43 struct scaler {
44         const char * id;
45         const char * name;
46 };
47
48 static struct scaler scalers[] = {
49 #if MAEMO_VERSION == 5
50 #ifdef __arm__
51         {"arm2x", N_("2x zoom")},
52 #endif /* __arm__ */
53         {"haasq", N_("Scale to fit")},
54         {"haafill", N_("Fill the entire screen")},
55 #elif MAEMO_VERSION == 4
56 #ifdef __arm__
57         {"xsp", N_("Antialiased 2x zoom")},
58         {"arm2x", N_("2x zoom")},
59 #else
60         {"soft2x", N_("2x zoom")},
61 #endif /* __arm__ */
62 #endif /* MAEMO_VERSION */
63         {"none", N_("No zoom")},
64 };
65
66 static GtkDialog* dialog;
67 #if MAEMO_VERSION >= 5
68 static HildonButton* player1_btn, * player2_btn;
69 static HildonCheckButton* accu_check;
70 static HildonCheckButton* saver_check;
71 static HildonPickerButton* scaler_picker;
72 static HildonPickerButton* speedhacks_picker;
73 #else
74 static GtkComboBox* scaler_combo;
75 static GtkCheckButton* saver_check;
76 #endif
77
78 static int find_scaler(const char * id)
79 {
80         if (!id) return -1;
81
82         gchar* lid = g_ascii_strdown(id, -1);
83         
84         for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
85                 if (strcmp(id, scalers[i].id) == 0) {
86                         g_free(lid);
87                         return i;
88                 }
89         }
90
91         g_free(lid);
92         return -1;
93 }
94
95 static void fill_scaler_list(GtkWidget* w)
96 {
97         for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
98 #if MAEMO_VERSION >= 5
99                 hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(w),
100                         _(scalers[i].name));
101 #else
102                 gtk_combo_box_append_text(GTK_COMBO_BOX(w), _(scalers[i].name));
103 #endif
104         }
105 }
106
107 void settings_update_controls(int player)
108 {
109 #if MAEMO_VERSION >= 5
110         switch (player) {
111                 case 1:
112                         hildon_button_set_value(player1_btn, controls_describe(1));
113                         break;
114                 case 2:
115                         hildon_button_set_value(player2_btn, controls_describe(2));
116                         break;
117         }
118 #endif
119 }
120
121 static void load_settings()
122 {
123         gchar* scaler_id = gconf_client_get_string(gcc, kGConfScaler, NULL);
124         int scaler_num = find_scaler(scaler_id);
125         if (scaler_num < 0) scaler_num = 0;
126
127 #if MAEMO_VERSION >= 5
128         settings_update_controls(1);
129         settings_update_controls(2);
130         hildon_check_button_set_active(accu_check,
131                 gconf_client_get_bool(gcc, kGConfTransparency, NULL));
132         hildon_check_button_set_active(saver_check,
133                 gconf_client_get_bool(gcc, kGConfSaver, NULL));
134         hildon_picker_button_set_active(scaler_picker, scaler_num);
135         hildon_picker_button_set_active(speedhacks_picker,
136                 gconf_client_get_int(gcc, kGConfSpeedhacks, NULL));
137 #else
138         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(saver_check),
139                 gconf_client_get_bool(gcc, kGConfSaver, NULL));
140         gtk_combo_box_set_active(scaler_combo, scaler_num);
141 #endif
142 }
143
144 static void save_settings()
145 {
146         int scaler_num = 0;
147 #if MAEMO_VERSION >= 5
148         gconf_client_set_bool(gcc, kGConfTransparency,
149                 hildon_check_button_get_active(accu_check), NULL);
150         gconf_client_set_bool(gcc, kGConfSaver,
151                 hildon_check_button_get_active(saver_check), NULL);
152         scaler_num = hildon_picker_button_get_active(scaler_picker);
153         gconf_client_set_int(gcc, kGConfSpeedhacks,
154                 hildon_picker_button_get_active(speedhacks_picker), NULL);
155 #else
156         scaler_num = gtk_combo_box_get_active(scaler_combo);
157         gconf_client_set_bool(gcc, kGConfSaver,
158                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(saver_check)), NULL);
159 #endif
160         if (scaler_num < 0) scaler_num = 0;
161         gconf_client_set_string(gcc, kGConfScaler, scalers[scaler_num].id, NULL);
162 }
163
164 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
165 {
166         if (response == GTK_RESPONSE_OK) {
167                 save_settings();
168         }
169
170         gtk_widget_destroy(GTK_WIDGET(dialog));
171 }
172
173 #if MAEMO_VERSION >= 5
174 static void controls_btn_callback(GtkWidget * button, gpointer data)
175 {
176         controls_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data));
177 }
178
179 static void set_button_layout(HildonButton* button,
180  GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group)
181 {
182         hildon_button_add_title_size_group(button, titles_size_group);
183         hildon_button_add_value_size_group(button, values_size_group);
184         hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
185 }
186 #endif
187
188 void settings_dialog(GtkWindow* parent)
189 {
190         dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Settings"),
191                 parent, GTK_DIALOG_MODAL,
192                 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
193                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
194
195 #if MAEMO_VERSION >= 5
196         GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
197         HildonPannableArea * pannable =
198                 HILDON_PANNABLE_AREA(hildon_pannable_area_new());
199         GtkSizeGroup * titles_size_group =
200                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
201         GtkSizeGroup * values_size_group =
202                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
203         PangoAttrList *pattrlist = pango_attr_list_new();
204         PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
205         attr->start_index = 0;
206         attr->end_index = G_MAXINT;
207         pango_attr_list_insert(pattrlist, attr);
208
209         GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Controls")));
210         gtk_label_set_attributes(separator_1, pattrlist);
211         gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
212
213         player1_btn = HILDON_BUTTON(hildon_button_new_with_text(
214                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
215                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
216                 _("Player 1"), NULL));
217         set_button_layout(HILDON_BUTTON(player1_btn),
218                 titles_size_group, values_size_group);
219         g_signal_connect(G_OBJECT(player1_btn), "clicked",
220                                         G_CALLBACK(controls_btn_callback), GINT_TO_POINTER(1));
221
222         player2_btn = HILDON_BUTTON(hildon_button_new_with_text(
223                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
224                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
225                 _("Player 2"), NULL));
226         set_button_layout(HILDON_BUTTON(player2_btn),
227                 titles_size_group, values_size_group);
228         g_signal_connect(G_OBJECT(player2_btn), "clicked",
229                                         G_CALLBACK(controls_btn_callback), GINT_TO_POINTER(2));
230
231         GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Advanced")));
232         gtk_label_set_attributes(separator_2, pattrlist);
233         gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
234
235         accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
236                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
237         gtk_button_set_label(GTK_BUTTON(accu_check), _("Accurate graphics"));
238         set_button_layout(HILDON_BUTTON(accu_check),
239                 titles_size_group, values_size_group);
240
241         saver_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
242                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
243         gtk_button_set_label(GTK_BUTTON(saver_check),
244                 _("Pause game in the background"));
245         set_button_layout(HILDON_BUTTON(saver_check),
246                 titles_size_group, values_size_group);
247
248         scaler_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
249                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
250                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
251         hildon_button_set_title(HILDON_BUTTON(scaler_picker), _("Zoom"));
252         set_button_layout(HILDON_BUTTON(scaler_picker),
253                 titles_size_group, values_size_group);
254
255         HildonTouchSelector* scaler_sel =
256                 HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
257         fill_scaler_list(GTK_WIDGET(scaler_sel));
258         hildon_picker_button_set_selector(scaler_picker, scaler_sel);
259
260         speedhacks_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
261                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
262                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
263         hildon_button_set_title(HILDON_BUTTON(speedhacks_picker), _("Speedhacks"));
264         set_button_layout(HILDON_BUTTON(speedhacks_picker),
265                 titles_size_group, values_size_group);
266
267         HildonTouchSelector* speedhacks_sel =
268                 HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
269         hildon_touch_selector_append_text(speedhacks_sel, _("No speedhacks"));
270         hildon_touch_selector_append_text(speedhacks_sel, _("Safe hacks only"));
271         hildon_touch_selector_append_text(speedhacks_sel, _("All speedhacks"));
272         hildon_picker_button_set_selector(speedhacks_picker, speedhacks_sel);
273
274         gtk_box_pack_start(box, GTK_WIDGET(separator_1),
275                 FALSE, FALSE, HILDON_MARGIN_HALF);
276         gtk_box_pack_start(box, GTK_WIDGET(player1_btn),
277                 FALSE, FALSE, 0);
278         gtk_box_pack_start(box, GTK_WIDGET(player2_btn),
279                 FALSE, FALSE, 0);
280         gtk_box_pack_start(box, GTK_WIDGET(separator_2),
281                 FALSE, FALSE, HILDON_MARGIN_HALF);
282         gtk_box_pack_start(box, GTK_WIDGET(accu_check),
283                 FALSE, FALSE, 0);
284         gtk_box_pack_start(box, GTK_WIDGET(saver_check),
285                 FALSE, FALSE, 0);
286         gtk_box_pack_start(box, GTK_WIDGET(scaler_picker),
287                 FALSE, FALSE, 0);
288         gtk_box_pack_start(box, GTK_WIDGET(speedhacks_picker),
289                 FALSE, FALSE, 0);
290
291         hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box));
292         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable));
293
294         pango_attr_list_unref(pattrlist);
295         g_object_unref(titles_size_group);
296         g_object_unref(values_size_group);
297 #else
298         GtkSizeGroup * size_group =
299                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
300
301         scaler_combo = GTK_COMBO_BOX(gtk_combo_box_new_text());
302         fill_scaler_list(GTK_WIDGET(scaler_combo));
303         GtkWidget* scaler_caption = hildon_caption_new(size_group,
304                 _("Zoom"), GTK_WIDGET(scaler_combo), NULL,
305                 HILDON_CAPTION_OPTIONAL);
306
307         saver_check = GTK_CHECK_BUTTON(gtk_check_button_new());
308         GtkWidget* saver_caption = hildon_caption_new(size_group,
309                 _("Pause game in the background"), GTK_WIDGET(saver_check), NULL,
310                 HILDON_CAPTION_OPTIONAL);
311
312         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), scaler_caption);
313         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), saver_caption);
314
315         g_object_unref(size_group);
316 #endif
317
318         load_settings();
319
320 #if MAEMO_VERSION >= 5
321         gtk_window_resize(GTK_WINDOW(dialog), 800, 380);
322 #endif
323
324         g_signal_connect(G_OBJECT(dialog), "response",
325                                         G_CALLBACK (cb_dialog_response), NULL);
326         
327         gtk_widget_show_all(GTK_WIDGET(dialog));
328 }
329