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>
43 static GtkDialog* dialog;
44 static int current_player;
45 #if MAEMO_VERSION >= 5
46 static HildonCheckButton* keys_chk;
47 static HildonButton* keys_btn;
48 static HildonCheckButton* touch_chk;
49 static HildonCheckButton* touch_show_chk;
51 static HildonCheckButton* zeemote_chk;
53 #else /* MAEMO_VERSION < 5 */
54 static GtkCheckButton* keys_chk;
55 static GtkButton* keys_btn;
56 static GtkCheckButton* touch_chk;
57 static GtkCheckButton* touch_show_chk;
59 static GtkCheckButton* zeemote_chk;
61 #endif /* MAEMO_VERSION */
63 static void load_settings()
65 gchar key_base[kGConfPlayerPathBufferLen];
66 const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
67 gchar *key = key_base + key_len;
69 #if MAEMO_VERSION >= 5
71 strcpy(key, kGConfPlayerKeyboardEnable);
72 hildon_check_button_set_active(keys_chk,
73 gconf_client_get_bool(gcc, key_base, NULL));
76 strcpy(key, kGConfPlayerTouchscreenEnable);
77 hildon_check_button_set_active(touch_chk,
78 gconf_client_get_bool(gcc, key_base, NULL));
79 strcpy(key, kGConfPlayerTouchscreenShow);
80 hildon_check_button_set_active(touch_show_chk,
81 gconf_client_get_bool(gcc, key_base, NULL));
84 strcpy(key, kGConfPlayerZeemoteEnable);
85 hildon_check_button_set_active(zeemote_chk,
86 gconf_client_get_bool(gcc, key_base, NULL));
88 #else /* MAEMO_VERSION < 5 */
90 strcpy(key, kGConfPlayerKeyboardEnable);
91 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(keys_chk),
92 gconf_client_get_bool(gcc, key_base, NULL));
95 strcpy(key, kGConfPlayerTouchscreenEnable);
96 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(touch_chk),
97 gconf_client_get_bool(gcc, key_base, NULL));
98 strcpy(key, kGConfPlayerTouchscreenShow);
99 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(touch_show_chk),
100 gconf_client_get_bool(gcc, key_base, NULL));
103 strcpy(key, kGConfPlayerZeemoteEnable);
104 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(zeemote_chk),
105 gconf_client_get_bool(gcc, key_base, NULL));
107 #endif /* MAEMO_VERSION */
110 static void save_settings()
112 gchar key_base[kGConfPlayerPathBufferLen];
113 const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
114 gchar *key = key_base + key_len;
116 #if MAEMO_VERSION >= 5
118 strcpy(key, kGConfPlayerKeyboardEnable);
119 gconf_client_set_bool(gcc, key_base,
120 hildon_check_button_get_active(keys_chk), NULL);
123 strcpy(key, kGConfPlayerTouchscreenEnable);
124 gconf_client_set_bool(gcc, key_base,
125 hildon_check_button_get_active(touch_chk), NULL);
126 strcpy(key, kGConfPlayerTouchscreenShow);
127 gconf_client_set_bool(gcc, key_base,
128 hildon_check_button_get_active(touch_show_chk), NULL);
131 strcpy(key, kGConfPlayerZeemoteEnable);
132 gconf_client_set_bool(gcc, key_base,
133 hildon_check_button_get_active(zeemote_chk), NULL);
135 #else /* MAEMO_VERSION < 5 */
137 strcpy(key, kGConfPlayerKeyboardEnable);
138 gconf_client_set_bool(gcc, key_base,
139 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(keys_chk)), NULL);
142 strcpy(key, kGConfPlayerTouchscreenEnable);
143 gconf_client_set_bool(gcc, key_base,
144 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(touch_chk)), NULL);
145 strcpy(key, kGConfPlayerTouchscreenShow);
146 gconf_client_set_bool(gcc, key_base,
147 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(touch_show_chk)), NULL);
150 strcpy(key, kGConfPlayerZeemoteEnable);
151 gconf_client_set_bool(gcc, key_base,
152 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(zeemote_chk)), NULL);
154 #endif /* MAEMO_VERSION */
157 static void keys_btn_callback(GtkWidget * button, gpointer data)
159 keys_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data));
162 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
164 if (response == GTK_RESPONSE_OK) {
166 settings_update_controls(current_player);
169 gtk_widget_destroy(GTK_WIDGET(dialog));
172 #if MAEMO_VERSION >= 5
173 static void set_button_layout(HildonButton* button,
174 GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group)
176 hildon_button_add_title_size_group(button, titles_size_group);
177 hildon_button_add_value_size_group(button, values_size_group);
178 hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
182 gchar* controls_describe(int player)
184 static gchar description[256];
185 unsigned char count = 0;
187 gchar key_base[kGConfPlayerPathBufferLen];
188 const int key_len = sprintf(key_base, kGConfPlayerPath, player);
189 gchar *key = key_base + key_len;
191 description[0] = '\0';
193 strcpy(key, kGConfPlayerKeyboardEnable);
194 if (gconf_client_get_bool(gcc, key_base, NULL)) {
195 strcpy(description, _("Keyboard"));
199 strcpy(key, kGConfPlayerTouchscreenEnable);
200 if (gconf_client_get_bool(gcc, key_base, NULL)) {
201 if (count > 0) strcat(description, ", ");
202 strcat(description, _("Touchscreen"));
207 strcpy(key, kGConfPlayerZeemoteEnable);
208 if (gconf_client_get_bool(gcc, key_base, NULL)) {
209 if (count > 0) strcat(description, ", ");
210 strcat(description, _("Zeemote"));
216 /* Add some text if there are no enabled controls */
217 strcpy(description, _("Disabled"));
223 void controls_dialog(GtkWindow* parent, int player)
225 gchar* title = g_strdup_printf(_("Player %d controls"), player);
226 dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title,
227 parent, GTK_DIALOG_MODAL,
228 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
229 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
232 current_player = player;
234 #if MAEMO_VERSION >= 5
235 GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
236 HildonPannableArea * pannable =
237 HILDON_PANNABLE_AREA(hildon_pannable_area_new());
238 GtkSizeGroup * titles_size_group =
239 gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
240 GtkSizeGroup * values_size_group =
241 gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
242 PangoAttrList *pattrlist = pango_attr_list_new();
243 PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
244 attr->start_index = 0;
245 attr->end_index = G_MAXINT;
246 pango_attr_list_insert(pattrlist, attr);
248 GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Keys")));
249 gtk_label_set_attributes(separator_1, pattrlist);
250 gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
252 keys_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
253 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
254 gtk_button_set_label(GTK_BUTTON(keys_chk), _("Enable keyboard"));
255 set_button_layout(HILDON_BUTTON(keys_chk),
256 titles_size_group, values_size_group);
258 keys_btn = HILDON_BUTTON(hildon_button_new_with_text(
259 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
260 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
261 _("Configure keys…"), NULL));
262 set_button_layout(HILDON_BUTTON(keys_btn),
263 titles_size_group, values_size_group);
264 g_signal_connect(G_OBJECT(keys_btn), "clicked",
265 G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
267 GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Touchscreen")));
268 gtk_label_set_attributes(separator_2, pattrlist);
269 gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
271 touch_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
272 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
273 gtk_button_set_label(GTK_BUTTON(touch_chk),
274 _("Enable touchscreen buttons"));
275 set_button_layout(HILDON_BUTTON(touch_chk),
276 titles_size_group, values_size_group);
278 touch_show_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
279 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
280 gtk_button_set_label(GTK_BUTTON(touch_show_chk),
281 _("Show on-screen button grid"));
282 set_button_layout(HILDON_BUTTON(touch_show_chk),
283 titles_size_group, values_size_group);
286 GtkLabel* separator_3 = GTK_LABEL(gtk_label_new(_("Accelerometer")));
287 gtk_label_set_attributes(separator_3, pattrlist);
288 gtk_label_set_justify(separator_3, GTK_JUSTIFY_CENTER);
290 GtkLabel* separator_4 = GTK_LABEL(gtk_label_new(_("Wiimote")));
291 gtk_label_set_attributes(separator_4, pattrlist);
292 gtk_label_set_justify(separator_4, GTK_JUSTIFY_CENTER);
295 GtkLabel* separator_5 = GTK_LABEL(gtk_label_new(_("Zeemote")));
296 gtk_label_set_attributes(separator_5, pattrlist);
297 gtk_label_set_justify(separator_5, GTK_JUSTIFY_CENTER);
299 zeemote_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
300 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
301 gtk_button_set_label(GTK_BUTTON(zeemote_chk), _("Enable Zeemote joystick"));
302 set_button_layout(HILDON_BUTTON(zeemote_chk),
303 titles_size_group, values_size_group);
305 gtk_box_pack_start(box, GTK_WIDGET(separator_1),
306 FALSE, FALSE, HILDON_MARGIN_HALF);
307 gtk_box_pack_start(box, GTK_WIDGET(keys_chk),
309 gtk_box_pack_start(box, GTK_WIDGET(keys_btn),
311 gtk_box_pack_start(box, GTK_WIDGET(separator_2),
312 FALSE, FALSE, HILDON_MARGIN_HALF);
313 gtk_box_pack_start(box, GTK_WIDGET(touch_chk),
315 gtk_box_pack_start(box, GTK_WIDGET(touch_show_chk),
318 gtk_box_pack_start(box, GTK_WIDGET(separator_3),
319 FALSE, FALSE, HILDON_MARGIN_HALF);
320 gtk_box_pack_start(box, GTK_WIDGET(separator_4),
321 FALSE, FALSE, HILDON_MARGIN_HALF);
324 gtk_box_pack_start(box, GTK_WIDGET(separator_5),
325 FALSE, FALSE, HILDON_MARGIN_HALF);
326 gtk_box_pack_start(box, GTK_WIDGET(zeemote_chk),
330 hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box));
331 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable));
333 pango_attr_list_unref(pattrlist);
334 g_object_unref(titles_size_group);
335 g_object_unref(values_size_group);
337 GtkBox* keys_box = GTK_BOX(gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT));
339 keys_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
340 _("Enable keyboard")));
341 keys_btn = GTK_BUTTON(gtk_button_new_with_label(_("Configure keys…")));
342 g_signal_connect(G_OBJECT(keys_btn), "clicked",
343 G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
345 gtk_box_pack_start_defaults(keys_box, GTK_WIDGET(keys_chk));
346 gtk_box_pack_start_defaults(keys_box, GTK_WIDGET(keys_btn));
348 GtkWidget* sep_1 = GTK_WIDGET(gtk_hseparator_new());
349 GtkBox* touch_box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
351 touch_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
352 _("Enable touchscreen buttons")));
353 touch_show_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
354 _("Show on-screen button grid")));
356 gtk_box_pack_start_defaults(touch_box, GTK_WIDGET(touch_chk));
357 gtk_box_pack_start_defaults(touch_box, GTK_WIDGET(touch_show_chk));
360 GtkWidget* sep_2 = GTK_WIDGET(gtk_hseparator_new());
361 zeemote_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
362 _("Enable Zeemote joystick")));
365 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(keys_box));
366 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), sep_1);
367 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(touch_box));
369 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), sep_2);
370 gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(zeemote_chk));
372 #endif /* MAEMO_VERSION */
376 #if MAEMO_VERSION >= 5
377 gtk_window_resize(GTK_WINDOW(dialog), 800, 360);
379 gtk_window_resize(GTK_WINDOW(dialog), 450, 250);
382 g_signal_connect(G_OBJECT(dialog), "response",
383 G_CALLBACK (cb_dialog_response), NULL);
385 gtk_widget_show_all(GTK_WIDGET(dialog));