2 * This file is part of DrNokSnes
4 * Copyright (C) 2009 Javier S. Pedro <maemo@javispedro.com>
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.
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.
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
25 #include <hildon/hildon-helper.h>
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>
36 #include <hildon/hildon-caption.h>
48 static struct scaler scalers[] = {
50 #if MAEMO_VERSION == 5
52 {"arm2x", N_("2x zoom")},
54 {"hdsq", N_("Scale to fit")},
55 {"hdfill", N_("Fill the entire screen")},
56 #elif MAEMO_VERSION == 4
58 {"xsp", N_("Antialiased 2x zoom")},
59 {"arm2x", N_("2x zoom")},
61 {"soft2x", N_("2x zoom")},
63 #endif /* MAEMO_VERSION */
64 {"none", N_("No zoom")},
67 static GtkDialog* dialog;
68 #if MAEMO_VERSION >= 5
69 static HildonButton* player1_btn, * player2_btn;
70 static HildonCheckButton* accu_check;
71 static HildonCheckButton* saver_check;
72 static HildonPickerButton* scaler_picker;
73 static HildonPickerButton* speedhacks_picker;
75 static GtkComboBox* scaler_combo;
78 static int find_scaler(const char * id)
80 gchar* lid = g_ascii_strdown(id, -1);
82 for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
83 if (strcmp(id, scalers[i].id) == 0) {
93 static void fill_scaler_list(GtkWidget* w)
95 for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
96 #if MAEMO_VERSION >= 5
97 hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(w),
100 gtk_combo_box_append_text(GTK_COMBO_BOX(w), _(scalers[i].name));
105 void settings_update_controls(int player)
109 hildon_button_set_value(player1_btn, controls_describe(1));
112 hildon_button_set_value(player2_btn, controls_describe(2));
117 static void load_settings()
119 gchar* scaler_id = gconf_client_get_string(gcc, kGConfScaler, NULL);
120 int scaler_num = find_scaler(scaler_id);
121 if (scaler_num < 0) scaler_num = 0;
123 #if MAEMO_VERSION >= 5
124 settings_update_controls(1);
125 settings_update_controls(1);
126 hildon_check_button_set_active(accu_check,
127 gconf_client_get_bool(gcc, kGConfTransparency, NULL));
128 hildon_check_button_set_active(saver_check,
129 gconf_client_get_bool(gcc, kGConfSaver, NULL));
130 hildon_picker_button_set_active(scaler_picker, scaler_num);
131 hildon_picker_button_set_active(speedhacks_picker,
132 gconf_client_get_int(gcc, kGConfSpeedhacks, NULL));
134 gtk_combo_box_set_active(scaler_combo, scaler_num);
138 static void save_settings()
141 #if MAEMO_VERSION >= 5
142 gconf_client_set_bool(gcc, kGConfTransparency,
143 hildon_check_button_get_active(accu_check), NULL);
144 gconf_client_set_bool(gcc, kGConfSaver,
145 hildon_check_button_get_active(saver_check), NULL);
146 scaler_num = hildon_picker_button_get_active(scaler_picker);
147 gconf_client_set_int(gcc, kGConfSpeedhacks,
148 hildon_picker_button_get_active(speedhacks_picker), NULL);
150 scaler_num = gtk_combo_box_get_active(scaler_combo);
152 if (scaler_num < 0) scaler_num = 0;
153 gconf_client_set_string(gcc, kGConfScaler, scalers[scaler_num].id, NULL);
156 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
158 if (response == GTK_RESPONSE_OK) {
162 gtk_widget_destroy(GTK_WIDGET(dialog));
165 #if MAEMO_VERSION >= 5
166 static void controls_btn_callback(GtkWidget * button, gpointer data)
168 controls_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data));
171 static void set_button_layout(HildonButton* button,
172 GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group)
174 hildon_button_add_title_size_group(button, titles_size_group);
175 hildon_button_add_value_size_group(button, values_size_group);
176 hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
180 void settings_dialog(GtkWindow* parent)
182 dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Settings"),
183 parent, GTK_DIALOG_MODAL,
184 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
185 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
187 #if MAEMO_VERSION >= 5
188 GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
189 HildonPannableArea * pannable =
190 HILDON_PANNABLE_AREA(hildon_pannable_area_new());
191 GtkSizeGroup * titles_size_group =
192 gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
193 GtkSizeGroup * values_size_group =
194 gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
195 PangoAttrList *pattrlist = pango_attr_list_new();
196 PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
197 attr->start_index = 0;
198 attr->end_index = G_MAXINT;
199 pango_attr_list_insert(pattrlist, attr);
201 GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Controls")));
202 gtk_label_set_attributes(separator_1, pattrlist);
203 gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
205 player1_btn = HILDON_BUTTON(hildon_button_new_with_text(
206 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
207 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
208 _("Player 1"), NULL));
209 set_button_layout(HILDON_BUTTON(player1_btn),
210 titles_size_group, values_size_group);
211 g_signal_connect(G_OBJECT(player1_btn), "clicked",
212 G_CALLBACK(controls_btn_callback), GINT_TO_POINTER(1));
214 player2_btn = HILDON_BUTTON(hildon_button_new_with_text(
215 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
216 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
217 _("Player 2"), NULL));
218 set_button_layout(HILDON_BUTTON(player2_btn),
219 titles_size_group, values_size_group);
220 g_signal_connect(G_OBJECT(player2_btn), "clicked",
221 G_CALLBACK(controls_btn_callback), GINT_TO_POINTER(2));
223 GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Advanced")));
224 gtk_label_set_attributes(separator_2, pattrlist);
225 gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
227 accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
228 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
229 gtk_button_set_label(GTK_BUTTON(accu_check), _("Accurate graphics"));
230 set_button_layout(HILDON_BUTTON(accu_check),
231 titles_size_group, values_size_group);
233 saver_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
234 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
235 gtk_button_set_label(GTK_BUTTON(saver_check),
236 _("Pause game in the background"));
237 set_button_layout(HILDON_BUTTON(saver_check),
238 titles_size_group, values_size_group);
240 scaler_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
241 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
242 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
243 hildon_button_set_title(HILDON_BUTTON(scaler_picker), _("Zoom"));
244 set_button_layout(HILDON_BUTTON(scaler_picker),
245 titles_size_group, values_size_group);
247 HildonTouchSelector* scaler_sel =
248 HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
249 fill_scaler_list(GTK_WIDGET(scaler_sel));
250 hildon_picker_button_set_selector(scaler_picker, scaler_sel);
252 speedhacks_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
253 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
254 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
255 hildon_button_set_title(HILDON_BUTTON(speedhacks_picker), _("Speedhacks"));
256 set_button_layout(HILDON_BUTTON(speedhacks_picker),
257 titles_size_group, values_size_group);
259 HildonTouchSelector* speedhacks_sel =
260 HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
261 hildon_touch_selector_append_text(speedhacks_sel, _("No speedhacks"));
262 hildon_touch_selector_append_text(speedhacks_sel, _("Safe hacks only"));
263 hildon_touch_selector_append_text(speedhacks_sel, _("All speedhacks"));
264 hildon_picker_button_set_selector(speedhacks_picker, speedhacks_sel);
266 gtk_box_pack_start(box, GTK_WIDGET(separator_1),
267 FALSE, FALSE, HILDON_MARGIN_HALF);
268 gtk_box_pack_start(box, GTK_WIDGET(player1_btn),
270 gtk_box_pack_start(box, GTK_WIDGET(separator_2),
271 FALSE, FALSE, HILDON_MARGIN_HALF);
272 gtk_box_pack_start(box, GTK_WIDGET(accu_check),
274 gtk_box_pack_start(box, GTK_WIDGET(saver_check),
276 gtk_box_pack_start(box, GTK_WIDGET(scaler_picker),
278 gtk_box_pack_start(box, GTK_WIDGET(speedhacks_picker),
281 hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box));
282 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable));
284 pango_attr_list_unref(pattrlist);
285 g_object_unref(titles_size_group);
286 g_object_unref(values_size_group);
288 xsp_check = GTK_CHECK_BUTTON(gtk_check_button_new());
289 GtkWidget* xsp_caption = hildon_caption_new(NULL,
290 "Use hardware scaling", GTK_WIDGET(xsp_check), NULL,
291 HILDON_CAPTION_OPTIONAL);
292 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(xsp_caption));
297 #if MAEMO_VERSION >= 5
298 gtk_window_resize(GTK_WINDOW(dialog), 800, 380);
300 gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
303 g_signal_connect(G_OBJECT(dialog), "response",
304 G_CALLBACK (cb_dialog_response), NULL);
306 gtk_widget_show_all(GTK_WIDGET(dialog));