fixing diablo zeemote gui
[drnoksnes] / gui / controls.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 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;
50 static HildonCheckButton* zeemote_chk;
51 #else
52 static GtkCheckButton* keys_chk;
53 static GtkButton* keys_btn;
54 static GtkCheckButton* touch_chk;
55 static GtkCheckButton* touch_show_chk;
56 static GtkCheckButton* zeemote_chk;
57 #endif
58
59 static void load_settings()
60 {
61         gchar key_base[kGConfPlayerPathBufferLen];
62         const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
63         gchar *key = key_base + key_len;
64
65 #if MAEMO_VERSION >= 5
66         // Keyboard
67         strcpy(key, kGConfPlayerKeyboardEnable);
68         hildon_check_button_set_active(keys_chk,
69                 gconf_client_get_bool(gcc, key_base, NULL));
70
71         // Touchscreen
72         strcpy(key, kGConfPlayerTouchscreenEnable);
73         hildon_check_button_set_active(touch_chk,
74                 gconf_client_get_bool(gcc, key_base, NULL));
75         strcpy(key, kGConfPlayerTouchscreenShow);
76         hildon_check_button_set_active(touch_show_chk,
77                 gconf_client_get_bool(gcc, key_base, NULL));
78
79         // Zeemote
80         strcpy(key, kGConfPlayerZeemoteEnable);
81         hildon_check_button_set_active(zeemote_chk,
82                 gconf_client_get_bool(gcc, key_base, NULL));
83 #else
84         // Keyboard
85         strcpy(key, kGConfPlayerKeyboardEnable);
86         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(keys_chk),
87                 gconf_client_get_bool(gcc, key_base, NULL));
88
89         // Touchscreen
90         strcpy(key, kGConfPlayerTouchscreenEnable);
91         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(touch_chk),
92                 gconf_client_get_bool(gcc, key_base, NULL));
93         strcpy(key, kGConfPlayerTouchscreenShow);
94         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(touch_show_chk),
95                 gconf_client_get_bool(gcc, key_base, NULL));
96
97         // Zeemote
98         strcpy(key, kGConfPlayerZeemoteEnable);
99         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(zeemote_chk),
100                 gconf_client_get_bool(gcc, key_base, NULL));
101 #endif
102 }
103
104 static void save_settings()
105 {
106         gchar key_base[kGConfPlayerPathBufferLen];
107         const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
108         gchar *key = key_base + key_len;
109
110 #if MAEMO_VERSION >= 5
111         // Keyboard
112         strcpy(key, kGConfPlayerKeyboardEnable);
113         gconf_client_set_bool(gcc, key_base,
114                 hildon_check_button_get_active(keys_chk), NULL);
115
116         // Touchscreen
117         strcpy(key, kGConfPlayerTouchscreenEnable);
118         gconf_client_set_bool(gcc, key_base,
119                 hildon_check_button_get_active(touch_chk), NULL);
120         strcpy(key, kGConfPlayerTouchscreenShow);
121         gconf_client_set_bool(gcc, key_base,
122                 hildon_check_button_get_active(touch_show_chk), NULL);
123
124         // Zeemote
125         strcpy(key, kGConfPlayerZeemoteEnable);
126         gconf_client_set_bool(gcc, key_base,
127                 hildon_check_button_get_active(zeemote_chk), NULL);
128 #else /* MAEMO_VERSION < 5 */
129         // Keyboard
130         strcpy(key, kGConfPlayerKeyboardEnable);
131         gconf_client_set_bool(gcc, key_base,
132                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(keys_chk)), NULL);
133
134         // Touchscreen
135         strcpy(key, kGConfPlayerTouchscreenEnable);
136         gconf_client_set_bool(gcc, key_base,
137                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(touch_chk)), NULL);
138         strcpy(key, kGConfPlayerTouchscreenShow);
139         gconf_client_set_bool(gcc, key_base,
140                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(touch_show_chk)), NULL);
141
142         // Zeemote
143         strcpy(key, kGConfPlayerZeemoteEnable);
144         gconf_client_set_bool(gcc, key_base,
145                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(zeemote_chk)), NULL);
146 #endif
147 }
148
149 static void keys_btn_callback(GtkWidget * button, gpointer data)
150 {
151         keys_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data));
152 }
153
154 static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
155 {
156         if (response == GTK_RESPONSE_OK) {
157                 save_settings();
158                 settings_update_controls(current_player);
159         }
160
161         gtk_widget_destroy(GTK_WIDGET(dialog));
162 }
163
164 #if MAEMO_VERSION >= 5
165 static void set_button_layout(HildonButton* button,
166  GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group)
167 {
168         hildon_button_add_title_size_group(button, titles_size_group);
169         hildon_button_add_value_size_group(button, values_size_group);
170         hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
171 }
172 #endif
173
174 gchar* controls_describe(int player)
175 {
176         static gchar description[256];
177         unsigned char count = 0;
178
179         gchar key_base[kGConfPlayerPathBufferLen];
180         const int key_len = sprintf(key_base, kGConfPlayerPath, player);
181         gchar *key = key_base + key_len;
182
183         description[0] = '\0';
184
185         strcpy(key, kGConfPlayerKeyboardEnable);
186         if (gconf_client_get_bool(gcc, key_base, NULL)) {
187                 strcpy(description, _("Keyboard"));
188                 count++;
189         }
190
191         strcpy(key, kGConfPlayerTouchscreenEnable);
192         if (gconf_client_get_bool(gcc, key_base, NULL)) {
193                 if (count > 0) strcat(description, ", ");
194                 strcat(description, _("Touchscreen"));
195                 count++;
196         }
197
198         strcpy(key, kGConfPlayerZeemoteEnable);
199         if (gconf_client_get_bool(gcc, key_base, NULL)) {
200                 if (count > 0) strcat(description, ", ");
201                 strcat(description, _("Zeemote"));
202                 count++;
203         }
204
205         if (count == 0) {
206                 /* Add some text if there are no enabled controls */
207                 strcpy(description, _("Disabled"));
208         }
209
210         return description;
211 }
212
213 void controls_dialog(GtkWindow* parent, int player)
214 {
215         gchar* title = g_strdup_printf(_("Player %d controls"), player);
216         dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title,
217                 parent, GTK_DIALOG_MODAL,
218                 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
219                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
220         g_free(title);
221
222         current_player = player;
223
224 #if MAEMO_VERSION >= 5
225         GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
226         HildonPannableArea * pannable =
227                 HILDON_PANNABLE_AREA(hildon_pannable_area_new());
228         GtkSizeGroup * titles_size_group =
229                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
230         GtkSizeGroup * values_size_group =
231                  gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
232         PangoAttrList *pattrlist = pango_attr_list_new();
233         PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
234         attr->start_index = 0;
235         attr->end_index = G_MAXINT;
236         pango_attr_list_insert(pattrlist, attr);
237
238         GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Keys")));
239         gtk_label_set_attributes(separator_1, pattrlist);
240         gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
241
242         keys_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
243                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
244         gtk_button_set_label(GTK_BUTTON(keys_chk), _("Enable keyboard"));
245         set_button_layout(HILDON_BUTTON(keys_chk),
246                 titles_size_group, values_size_group);
247
248         keys_btn = HILDON_BUTTON(hildon_button_new_with_text(
249                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
250                 HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
251                 _("Configure keys…"), NULL));
252         set_button_layout(HILDON_BUTTON(keys_btn),
253                 titles_size_group, values_size_group);
254         g_signal_connect(G_OBJECT(keys_btn), "clicked",
255                                         G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
256
257         GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Touchscreen")));
258         gtk_label_set_attributes(separator_2, pattrlist);
259         gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
260
261         touch_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
262                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
263         gtk_button_set_label(GTK_BUTTON(touch_chk),
264                 _("Enable touchscreen buttons"));
265         set_button_layout(HILDON_BUTTON(touch_chk),
266                 titles_size_group, values_size_group);
267                 
268         touch_show_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
269                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
270         gtk_button_set_label(GTK_BUTTON(touch_show_chk),
271                 _("Show on-screen button grid"));
272         set_button_layout(HILDON_BUTTON(touch_show_chk),
273                 titles_size_group, values_size_group);
274
275 #if 0
276         GtkLabel* separator_3 = GTK_LABEL(gtk_label_new(_("Accelerometer")));
277         gtk_label_set_attributes(separator_3, pattrlist);
278         gtk_label_set_justify(separator_3, GTK_JUSTIFY_CENTER);
279         
280         GtkLabel* separator_4 = GTK_LABEL(gtk_label_new(_("Wiimote")));
281         gtk_label_set_attributes(separator_4, pattrlist);
282         gtk_label_set_justify(separator_4, GTK_JUSTIFY_CENTER);
283 #endif
284
285         GtkLabel* separator_5 = GTK_LABEL(gtk_label_new(_("Zeemote")));
286         gtk_label_set_attributes(separator_5, pattrlist);
287         gtk_label_set_justify(separator_5, GTK_JUSTIFY_CENTER);
288
289         zeemote_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
290                 HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
291         gtk_button_set_label(GTK_BUTTON(zeemote_chk), _("Enable Zeemote joystick"));
292         set_button_layout(HILDON_BUTTON(zeemote_chk),
293                 titles_size_group, values_size_group);
294
295         gtk_box_pack_start(box, GTK_WIDGET(separator_1),
296                 FALSE, FALSE, HILDON_MARGIN_HALF);
297         gtk_box_pack_start(box, GTK_WIDGET(keys_chk),
298                 FALSE, FALSE, 0);
299         gtk_box_pack_start(box, GTK_WIDGET(keys_btn),
300                 FALSE, FALSE, 0);
301         gtk_box_pack_start(box, GTK_WIDGET(separator_2),
302                 FALSE, FALSE, HILDON_MARGIN_HALF);
303         gtk_box_pack_start(box, GTK_WIDGET(touch_chk),
304                 FALSE, FALSE, 0);
305         gtk_box_pack_start(box, GTK_WIDGET(touch_show_chk),
306                 FALSE, FALSE, 0);
307 #if 0
308         gtk_box_pack_start(box, GTK_WIDGET(separator_3),
309                 FALSE, FALSE, HILDON_MARGIN_HALF);
310         gtk_box_pack_start(box, GTK_WIDGET(separator_4),
311                 FALSE, FALSE, HILDON_MARGIN_HALF);
312 #endif
313         gtk_box_pack_start(box, GTK_WIDGET(separator_5),
314                 FALSE, FALSE, HILDON_MARGIN_HALF);
315         gtk_box_pack_start(box, GTK_WIDGET(zeemote_chk),
316                 FALSE, FALSE, 0);
317
318         hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box));
319         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable));
320
321         pango_attr_list_unref(pattrlist);
322         g_object_unref(titles_size_group);
323         g_object_unref(values_size_group);
324 #else
325         GtkBox* keys_box = GTK_BOX(gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT));
326
327         keys_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
328                 _("Enable keyboard")));
329         keys_btn = GTK_BUTTON(gtk_button_new_with_label(_("Configure keys…")));
330         g_signal_connect(G_OBJECT(keys_btn), "clicked",
331                                         G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
332
333         gtk_box_pack_start_defaults(keys_box, GTK_WIDGET(keys_chk));
334         gtk_box_pack_start_defaults(keys_box, GTK_WIDGET(keys_btn));
335
336         GtkWidget* sep_1 = GTK_WIDGET(gtk_hseparator_new());
337         GtkBox* touch_box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
338
339         touch_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
340                 _("Enable touchscreen buttons")));
341         touch_show_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
342                 _("Show on-screen button grid")));
343
344         gtk_box_pack_start_defaults(touch_box, GTK_WIDGET(touch_chk));
345         gtk_box_pack_start_defaults(touch_box, GTK_WIDGET(touch_show_chk));
346
347         GtkWidget* sep_2 = GTK_WIDGET(gtk_hseparator_new());
348         zeemote_chk = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(
349                 _("Enable Zeemote joystick")));
350
351         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(keys_box));
352         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), sep_1);
353         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(touch_box));
354         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), sep_2);
355         gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(zeemote_chk));
356 #endif
357
358         load_settings();
359
360 #if MAEMO_VERSION >= 5
361         gtk_window_resize(GTK_WINDOW(dialog), 800, 360);
362 #else
363         gtk_window_resize(GTK_WINDOW(dialog), 450, 250);
364 #endif
365
366         g_signal_connect(G_OBJECT(dialog), "response",
367                                         G_CALLBACK (cb_dialog_response), NULL);
368         
369         gtk_widget_show_all(GTK_WIDGET(dialog));
370 }
371