new controls dialog; using gconf instead of hgw
authorJavier S. Pedro <maemo@javispedro.com>
Tue, 26 Jan 2010 18:21:57 +0000 (19:21 +0100)
committerJavier S. Pedro <maemo@javispedro.com>
Tue, 26 Jan 2010 18:23:53 +0000 (19:23 +0100)
18 files changed:
Makefile
debian/changelog
debian/rules
gammatab.h [deleted file]
gui/Makefile
gui/buttons.inc [new file with mode: 0644]
gui/controls.c
gui/drnoksnes.schemas.m4
gui/gconf.h [new file with mode: 0644]
gui/i18n/es_ES.po
gui/keys.c [new file with mode: 0644]
gui/plugin.c
gui/plugin.h
gui/settings.c
language.h [deleted file]
platform/hgw.cpp
platform/hgw.h
platform/platform.h

index 06844e3..e807f91 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -70,8 +70,8 @@ ifeq ($(CONF_HD), 1)
        CONF_EXIT_BUTTON ?= 1
 endif
 ifeq ($(CONF_HGW), 1)
        CONF_EXIT_BUTTON ?= 1
 endif
 ifeq ($(CONF_HGW), 1)
-       CPPFLAGS += -DCONF_HGW=1 -I/usr/include/hgw
-       LDLIBS += -lhgw
+       CPPFLAGS += -DCONF_HGW=1 -I/usr/include/hgw $(shell pkg-config --cflags gconf-2.0)
+       LDLIBS += -lhgw $(shell pkg-config --libs gconf-2.0)
        OBJS += platform/hgw.o
 endif
 ifeq ($(CONF_EXIT_BUTTON), 1)
        OBJS += platform/hgw.o
 endif
 ifeq ($(CONF_EXIT_BUTTON), 1)
index c3fe11c..01c3010 100644 (file)
@@ -1,8 +1,10 @@
 drnoksnes (1.2.6) unstable; urgency=low
 
 drnoksnes (1.2.6) unstable; urgency=low
 
-  * Using SDL_haa for scaling in Fremantle now. 
+  * Using SDL_haa for scaling in Fremantle now.
+  * Reworked GUI key mapping gconf entries.
+  * Using GConfClient instead of HGW.
 
 
- -- Javier S. Pedro <maemo@javispedro.com>  Thu, 21 Jan 2010 18:44:34 +0100
+ -- Javier S. Pedro <maemo@javispedro.com>  Sat, 23 Jan 2010 20:24:58 +0100
 
 drnoksnes (1.2.5) unstable; urgency=low
 
 
 drnoksnes (1.2.5) unstable; urgency=low
 
index a74a522..ceb692f 100755 (executable)
@@ -35,19 +35,21 @@ M4DEFS=-DMAEMO_MAJOR=$(MAEMO_VERSION)
 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
        CFLAGS += -O0
 else ifneq (,$(findstring armel,$(ARCH)))
 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
        CFLAGS += -O0
 else ifneq (,$(findstring armel,$(ARCH)))
-       CFLAGS += -O2
+       CFLAGS += -O2 -ffast-math
        GUI_CFLAGS += -Os
        ifneq (,$(findstring vfp,$(DEB_BUILD_OPTIONS)))
                CFLAGS += -march=armv6j -mtune=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp
                ASFLAGS += -march=armv6j -mfpu=vfp -mfloat-abi=softfp
        endif
        GUI_CFLAGS += -Os
        ifneq (,$(findstring vfp,$(DEB_BUILD_OPTIONS)))
                CFLAGS += -march=armv6j -mtune=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp
                ASFLAGS += -march=armv6j -mfpu=vfp -mfloat-abi=softfp
        endif
-       # Fixes hang while exiting in Diablo.
-       CFLAGS += -static-libgcc
+       ifeq ($(shell expr "$(MAEMO_VERSION)" "<" 5), 1)
+               # Fixes hang while exiting in Diablo.
+               CFLAGS += -static-libgcc
+       endif
 else ifneq (,$(findstring i386,$(ARCH)))
 else ifneq (,$(findstring i386,$(ARCH)))
-       CFLAGS += -O2
+       CFLAGS += -O2 -ffast-math
        GUI_CFLAGS += -O2
 else
        GUI_CFLAGS += -O2
 else
-       # Don't support anything else yet
+       # Don't support anything else
        crash
 endif
 
        crash
 endif
 
diff --git a/gammatab.h b/gammatab.h
deleted file mode 100644 (file)
index 60a0503..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-unsigned char gammatab[10][32]={
-       {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
-       0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F},
-       {0x00,0x01,0x02,0x03,0x04,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
-       0x11,0x12,0x13,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F},
-       {0x00,0x01,0x03,0x04,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,
-       0x12,0x13,0x14,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F},
-       {0x00,0x02,0x04,0x06,0x07,0x08,0x09,0x0A,0x0C,0x0D,0x0E,0x0F,0x0F,0x10,0x11,0x12,
-       0x13,0x14,0x15,0x16,0x16,0x17,0x18,0x19,0x19,0x1A,0x1B,0x1C,0x1C,0x1D,0x1E,0x1F},
-       {0x00,0x03,0x05,0x07,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,
-       0x14,0x15,0x16,0x17,0x17,0x18,0x19,0x19,0x1A,0x1B,0x1B,0x1C,0x1D,0x1D,0x1E,0x1F},
-       {0x00,0x05,0x07,0x09,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x14,0x15,
-       0x16,0x16,0x17,0x18,0x18,0x19,0x1A,0x1A,0x1B,0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1F},
-       {0x00,0x07,0x0A,0x0C,0x0D,0x0E,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x15,0x16,0x17,
-       0x17,0x18,0x18,0x19,0x1A,0x1A,0x1B,0x1B,0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1E,0x1F},
-       {0x00,0x0B,0x0D,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x16,0x17,0x17,0x18,0x18,
-       0x19,0x19,0x1A,0x1A,0x1B,0x1B,0x1B,0x1C,0x1C,0x1D,0x1D,0x1D,0x1E,0x1E,0x1E,0x1F},
-       {0x00,0x0F,0x11,0x13,0x14,0x15,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1A,0x1A,0x1A,
-       0x1B,0x1B,0x1B,0x1C,0x1C,0x1C,0x1C,0x1D,0x1D,0x1D,0x1D,0x1E,0x1E,0x1E,0x1E,0x1F},
-       {0x00,0x15,0x17,0x18,0x19,0x19,0x1A,0x1A,0x1B,0x1B,0x1B,0x1B,0x1C,0x1C,0x1C,0x1C,
-       0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1F}
-};
index b147f4e..266b950 100644 (file)
@@ -32,8 +32,10 @@ XGETTEXT:=xgettext
 XGETTEXT_OPTS:=--default-domain=$(GETTEXT_PACKAGE) --from-code=UTF-8 \
        --language=C --msgid-bugs-address=maemo@javispedro.com \
        --keyword=_ --keyword=N_
 XGETTEXT_OPTS:=--default-domain=$(GETTEXT_PACKAGE) --from-code=UTF-8 \
        --language=C --msgid-bugs-address=maemo@javispedro.com \
        --keyword=_ --keyword=N_
+EXTRA_GETTEXT_SRCS:=buttons.inc
 
 
-SRCS:=plugin.c state.c save.c controls.c cellrendererkey.c settings.c about.c
+SRCS:=plugin.c state.c save.c controls.c keys.c settings.c about.c \
+        cellrendererkey.c
 OBJS:=$(SRCS:.c=.o)
 
 POT:=$(GETTEXT_PACKAGE).pot
 OBJS:=$(SRCS:.c=.o)
 
 POT:=$(GETTEXT_PACKAGE).pot
@@ -50,7 +52,7 @@ all: drnoksnes_plugin.so $(DATA_FILES) $(MO_FILES)
 drnoksnes_plugin.so: $(OBJS)
        $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
 
 drnoksnes_plugin.so: $(OBJS)
        $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
 
-$(POT): $(SRCS)
+$(POT): $(SRCS) $(EXTRA_GETTEXT_SRCS)
        $(XGETTEXT) $(XGETTEXT_OPTS) -o$@ $^
 
 $(MO_FILES): %.mo: %.po
        $(XGETTEXT) $(XGETTEXT_OPTS) -o$@ $^
 
 $(MO_FILES): %.mo: %.po
diff --git a/gui/buttons.inc b/gui/buttons.inc
new file mode 100644 (file)
index 0000000..3b266fb
--- /dev/null
@@ -0,0 +1,28 @@
+HELP(button name,
+       button slug,
+       button action,
+       diablo binding for player 1,
+       fremantle binding for player 1)
+BUTTON("A", a, P(A), 48, 40)
+BUTTON("B", b, P(B), 20, 53)
+BUTTON("X", x, P(X), 32, 25)
+BUTTON("Y", y, P(Y), 45, 38)
+BUTTON("L", l, P(TL), 24, 37)
+BUTTON("R", r, P(TR), 22, 22)
+BUTTON("Start", start, P(START), 65, 65)
+BUTTON("Select", select, P(SELECT), 135, 58)
+BUTTON("↑", dn, P(UP), 111, 111)
+BUTTON("↓", ds, P(DOWN), 116, 116)
+BUTTON("←", dw, P(LEFT), 113, 113)
+BUTTON("→", de, P(RIGHT), 114, 114)
+BUTTON("←↑", dnw, P(UP) | P(LEFT), 0, 0)
+BUTTON("↑→", dne, P(UP) | P(RIGHT), 0, 0)
+BUTTON("←↓", dsw, P(DOWN) | P(LEFT), 0, 0)
+BUTTON("↓→", dse, P(DOWN) | P(RIGHT), 0, 0)
+ACTION(N_("Return to launcher"), quit, A(Quit), 9, 50)
+ACTION(N_("Fullscreen"), fullscreen, A(ToggleFullscreen), 72, 0)
+ACTION(N_("Quick Load 1"), quickload1, A(QuickLoad1), 0, 0)
+ACTION(N_("Quick Save 1"), quicksave1, A(QuickSave1), 0, 0)
+ACTION(N_("Quick Load 2"), quickload2, A(QuickLoad2), 0, 0)
+ACTION(N_("Quick Save 2"), quicksave2, A(QuickSave2), 0, 0)
+LAST
index c215585..e07d84f 100644 (file)
 *
 */
 
 *
 */
 
+#include <string.h>
 #include <gtk/gtk.h>
 #include <hildon/hildon-helper.h>
 
 #if MAEMO_VERSION >= 5
 #include <hildon/hildon-gtk.h>
 #include <hildon/hildon-pannable-area.h>
 #include <gtk/gtk.h>
 #include <hildon/hildon-helper.h>
 
 #if MAEMO_VERSION >= 5
 #include <hildon/hildon-gtk.h>
 #include <hildon/hildon-pannable-area.h>
+#include <hildon/hildon-button.h>
 #include <hildon/hildon-check-button.h>
 #include <hildon/hildon-check-button.h>
+#include <hildon/hildon-picker-button.h>
+#include <hildon/hildon-touch-selector.h>
+#include <pango/pango-attributes.h>
+#else
+#include <hildon/hildon-caption.h>
 #endif
 
 #endif
 
-#include "../platform/hgw.h"
 #include "plugin.h"
 #include "plugin.h"
-#include "cellrendererkey.h"
+#include "gconf.h"
 #include "i18n.h"
 
 static GtkDialog* dialog;
 #include "i18n.h"
 
 static GtkDialog* dialog;
-static GtkComboBox* combo;
-static GtkLabel* none_label;
-#if MAEMO_VERSION >= 5
-static HildonPannableArea* keys_scroll;
-#else
-static GtkScrolledWindow* keys_scroll;
-#endif
-static GtkListStore* keys_store;
-static GtkTreeView* keys_list;
+static int current_player;
 #if MAEMO_VERSION >= 5
 #if MAEMO_VERSION >= 5
-static HildonCheckButton* ts_show_check;
+static HildonCheckButton* keys_chk;
+static HildonButton* keys_btn;
+static HildonCheckButton* touch_chk;
+static HildonCheckButton* touch_show_chk;
 #else
 #else
-static GtkCheckButton* ts_show_check;
-#endif
 
 
-enum
-{
-  BUTTON_COLUMN,
-  BUTTONENTRY_COLUMN,
-  N_COLUMNS
-};
-
-typedef struct ButtonEntry {
-       const char * name;
-       const char * gconf_key;
-       unsigned char scancode;
-       unsigned char default_scancode;
-} ButtonEntry;
-#define BUTTON_INITIALIZER(desc, name, default) \
-       { desc, kGConfKeysPath "/" name, 0, default }
-
-#define ACTION_INITIALIZER(...) BUTTON_INITIALIZER(__VA_ARGS__)
-
-#define BUTTON_LAST    \
-       { 0 }
-
-static ButtonEntry buttons[] = {
-       BUTTON_INITIALIZER("A", "a", 48),
-       BUTTON_INITIALIZER("B", "b", 20),
-       BUTTON_INITIALIZER("X", "x", 32),
-       BUTTON_INITIALIZER("Y", "y", 45),
-       BUTTON_INITIALIZER("L", "l", 24),
-       BUTTON_INITIALIZER("R", "r", 22),
-       BUTTON_INITIALIZER("Start", "start", 65),
-       BUTTON_INITIALIZER("Select", "select", 135),
-       BUTTON_INITIALIZER("Up", "up", 111),
-       BUTTON_INITIALIZER("Down", "down", 116),
-       BUTTON_INITIALIZER("Left", "left", 113),
-       BUTTON_INITIALIZER("Right", "right", 114),
-       ACTION_INITIALIZER("Return to launcher", "quit", 9),
-       ACTION_INITIALIZER("Fullscreen", "fullscreen", 72),
-       ACTION_INITIALIZER("Quick Load 1", "quickload1", 0),
-       ACTION_INITIALIZER("Quick Save 1", "quicksave1", 0),
-       ACTION_INITIALIZER("Quick Load 2", "quickload2", 0),
-       ACTION_INITIALIZER("Quick Save 2", "quicksave2", 0),
-       BUTTON_LAST
-};
-
-static void show_widgets()
-{
-       gtk_widget_show_all(GTK_WIDGET(combo));
-       gtk_widget_hide_all(GTK_WIDGET(none_label));
-       gtk_widget_hide_all(GTK_WIDGET(keys_scroll));
-       gtk_widget_hide_all(GTK_WIDGET(ts_show_check));
-       switch (gtk_combo_box_get_active(combo)) {
-               case 0:
-                       gtk_widget_show_all(GTK_WIDGET(none_label));
-                       break;
-               case 1: // Keys
-                       gtk_widget_show_all(GTK_WIDGET(keys_scroll));
-                       break;
-               case 2: // Touchscreen
-                       gtk_widget_show_all(GTK_WIDGET(ts_show_check));
-                       break;
-               case 3: // Touchscreen + keys
-                       gtk_widget_show_all(GTK_WIDGET(keys_scroll));
-                       gtk_widget_show_all(GTK_WIDGET(ts_show_check));
-                       break;
-               case 4: // Mouse
-                       break;
-               case 5: // Mouse + keys
-                       gtk_widget_show_all(GTK_WIDGET(keys_scroll));
-                       break;
-       }
-}
+#endif
 
 
-static gboolean load_key_config(GtkTreeModel *model, GtkTreePath *path,
-                                GtkTreeIter *iter, gpointer data)
+static void load_settings()
 {
 {
-       ButtonEntry *button_entry;
-
-       gtk_tree_model_get(model, iter,
-               BUTTONENTRY_COLUMN, &button_entry,
-               -1);
-
-       int scancode = gconf_client_get_int(gcc, button_entry->gconf_key, NULL);
-       button_entry->scancode = scancode;
+       gchar key_base[kGConfPlayerPathBufferLen];
+       const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
+       gchar *key = key_base + key_len;
 
 
-       gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, iter);
-
-       return FALSE;
+#if MAEMO_VERSION >= 5
+       strcpy(key, kGConfPlayerKeyboardEnable);
+       hildon_check_button_set_active(keys_chk,
+               gconf_client_get_bool(gcc, key_base, NULL));
+#else
+#endif
 }
 
 }
 
-static void load_config()
+static void save_settings()
 {
 {
-       GConfValue* mapping = gconf_client_get(gcc, kGConfMapping, NULL);
+       gchar key_base[kGConfPlayerPathBufferLen];
+       const int key_len = sprintf(key_base, kGConfPlayerPath, current_player);
+       gchar *key = key_base + key_len;
 
 
-       if (!mapping) {
-               mapping = gconf_value_new(GCONF_VALUE_INT);
-               gconf_value_set_int(mapping, 1);
-               gconf_client_set(gcc, kGConfMapping, mapping, NULL);
-       }
-
-       gtk_combo_box_set_active(combo, gconf_value_get_int(mapping));
-
-       gconf_client_preload(gcc, kGConfKeysPath, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-       gtk_tree_model_foreach(GTK_TREE_MODEL(keys_store), load_key_config, NULL);
-
-       gboolean ts_show_active =
-               gconf_client_get_bool(gcc, kGConfDisplayControls, NULL);
 #if MAEMO_VERSION >= 5
 #if MAEMO_VERSION >= 5
-       hildon_check_button_set_active(ts_show_check, ts_show_active);
+       strcpy(key, kGConfPlayerKeyboardEnable);
+       gconf_client_set_bool(gcc, key_base,
+               hildon_check_button_get_active(keys_chk), NULL);
 #else
 #else
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ts_show_check), ts_show_active);
-#endif 
-
-       show_widgets();
-       gconf_value_free(mapping);
+#endif
 }
 
 }
 
-static void
-accel_set_func (GtkTreeViewColumn *tree_column,
-                GtkCellRenderer   *cell,
-                GtkTreeModel      *model,
-                GtkTreeIter       *iter,
-                gpointer           data)
+static void keys_btn_callback(GtkWidget * button, gpointer data)
 {
 {
-       ButtonEntry *button_entry;
-
-       gtk_tree_model_get (model, iter,
-                                               BUTTONENTRY_COLUMN, &button_entry,
-                                               -1);
-
-       if (button_entry == NULL) {
-               g_object_set (G_OBJECT (cell),
-                       "visible", FALSE,
-                       NULL);
-       } else {
-               g_object_set (G_OBJECT (cell),
-                       "visible", TRUE,
-                       "editable", TRUE,
-                       "scancode", button_entry->scancode,
-                       "style", PANGO_STYLE_NORMAL,
-                       NULL);
-       }
+       keys_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data));
 }
 
 }
 
-static void
-cb_key_edited(GtkCellRendererText *cell, const char *path_string,
-       guint scancode, gpointer data)
+static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
 {
 {
-       GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
-       GtkTreeIter iter;
-       ButtonEntry *button_entry;
-
-       gtk_tree_model_get_iter(GTK_TREE_MODEL(keys_store), &iter, path);
-       gtk_tree_model_get(GTK_TREE_MODEL(keys_store), &iter,
-               BUTTONENTRY_COLUMN, &button_entry,
-               -1);
-
-       g_debug("Setting scancode for button %s to %u\n",
-               button_entry->name, scancode);
-       gconf_client_set_int(gcc, button_entry->gconf_key, scancode, NULL);
-
-       button_entry->scancode = scancode;
-       gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, &iter);
+       if (response == GTK_RESPONSE_OK) {
+               save_settings();
+               settings_update_controls(current_player);
+       }
 
 
-       gtk_tree_path_free(path);
+       gtk_widget_destroy(GTK_WIDGET(dialog));
 }
 
 }
 
-static void
-cb_key_cleared(GtkCellRendererText *cell, const char *path_string,
-       gpointer data)
+#if MAEMO_VERSION >= 5
+static void set_button_layout(HildonButton* button,
+ GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group)
 {
 {
-       GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
-       GtkTreeIter iter;
-       ButtonEntry *button_entry;
-
-       gtk_tree_model_get_iter(GTK_TREE_MODEL(keys_store), &iter, path);
-       gtk_tree_path_free(path);
-       gtk_tree_model_get(GTK_TREE_MODEL(keys_store), &iter,
-               BUTTONENTRY_COLUMN, &button_entry,
-               -1);
-
-       g_debug("Clearing scancode for button %s\n", button_entry->name);
-       gconf_client_set_int(gcc, button_entry->gconf_key, 0, NULL);
-               // prefer 0 value over unset key.
-
-       button_entry->scancode = 0;
+       hildon_button_add_title_size_group(button, titles_size_group);
+       hildon_button_add_value_size_group(button, values_size_group);
+       hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
 }
 }
-
-static void cb_ts_show_toggled(void * widget, gpointer data)
-{
-       gboolean active;
-#if MAEMO_VERSION >= 5
-       active = hildon_check_button_get_active(ts_show_check);
-#else
-       active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ts_show_check));
 #endif
 #endif
-       gconf_client_set_bool(gcc, kGConfDisplayControls, active, NULL);
-}
 
 
-static void cb_combo_changed(GtkComboBox * widget, gpointer data)
+gchar* controls_describe(int player)
 {
 {
-       show_widgets();
-       gconf_client_set_int(gcc, kGConfMapping,
-               gtk_combo_box_get_active(combo), NULL);
-}
+       static gchar description[128];
 
 
-static void cb_dialog_response(GtkWidget * button, gpointer data)
-{
-       gtk_widget_destroy(GTK_WIDGET(dialog));
-}
+       gchar key_base[kGConfPlayerPathBufferLen];
+       const int key_len = sprintf(key_base, kGConfPlayerPath, player);
+       gchar *key = key_base + key_len;
 
 
-void controls_setup()
-{
-       int i;
-
-       // Check if all the keys exist. If not, fill them with default values.
-       // XXX Note that not filling a key will cause HGW to crash.
-
-       gconf_client_preload(gcc, kGConfKeysPath, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-       for (i = 0; buttons[i].name; i++) {
-               GConfValue *mapping = gconf_client_get(gcc, buttons[i].gconf_key, NULL);
-
-               if (!mapping) {
-                       // Not set; set to default.
-                       gconf_client_set_int(gcc, buttons[i].gconf_key,
-                               buttons[i].default_scancode, NULL);
-               } else {
-                       gconf_value_free(mapping);
-               }
+       description[0] = '\0';
+
+       strcpy(key, kGConfPlayerKeyboardEnable);
+       if (gconf_client_get_bool(gcc, key_base, NULL)) {
+               strcpy(description, _("Keyboard"));
        }
        }
+
+       if (description[0] == '\0') {
+               strcpy(description, _("Disabled"));
+       }
+
+       return description;
 }
 
 }
 
-void controls_dialog(GtkWindow* parent)
+void controls_dialog(GtkWindow* parent, int player)
 {
 {
-       dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Controls"),
+       gchar* title = g_strdup_printf(_("Player %d controls"), player);
+       dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title,
                parent, GTK_DIALOG_MODAL,
                parent, GTK_DIALOG_MODAL,
-               GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL));
-
-       combo = GTK_COMBO_BOX(gtk_combo_box_new_text());
-       gtk_combo_box_append_text(combo, "No controls/Use config file");
-       gtk_combo_box_append_text(combo, "Use physical keys");
-       gtk_combo_box_append_text(combo, "Use touchscreen");
-       gtk_combo_box_append_text(combo, "Use touchscreen + physical keys");
-       gtk_combo_box_append_text(combo, "Use SNES mouse");
-       gtk_combo_box_append_text(combo, "Use SNES mouse + physical keys");
+               GTK_STOCK_SAVE, GTK_RESPONSE_OK,
+               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
+       g_free(title);
 
 
-       none_label = GTK_LABEL(gtk_label_new("Check documentation for details."));
+       current_player = player;
 
 
-       keys_store = GTK_LIST_STORE(gtk_list_store_new(N_COLUMNS,
-               G_TYPE_STRING, G_TYPE_POINTER));
 #if MAEMO_VERSION >= 5
 #if MAEMO_VERSION >= 5
-       keys_list = GTK_TREE_VIEW(hildon_gtk_tree_view_new_with_model(
-               HILDON_UI_MODE_EDIT, GTK_TREE_MODEL(keys_store)));
-       keys_scroll = HILDON_PANNABLE_AREA(hildon_pannable_area_new());
-#else
-       keys_list = GTK_TREE_VIEW(
-               gtk_tree_view_new_with_model(GTK_TREE_MODEL(keys_store)));
-       keys_scroll = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL));
-       gtk_scrolled_window_set_policy(keys_scroll,
-               GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-#endif
+       GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF));
+       HildonPannableArea * pannable =
+               HILDON_PANNABLE_AREA(hildon_pannable_area_new());
+       GtkSizeGroup * titles_size_group =
+                gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+       GtkSizeGroup * values_size_group =
+                gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+       PangoAttrList *pattrlist = pango_attr_list_new();
+       PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE);
+       attr->start_index = 0;
+       attr->end_index = G_MAXINT;
+       pango_attr_list_insert(pattrlist, attr);
+
+       GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Keys")));
+       gtk_label_set_attributes(separator_1, pattrlist);
+       gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER);
+
+       keys_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
+               HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
+       gtk_button_set_label(GTK_BUTTON(keys_chk), _("Enable keyboard"));
+       set_button_layout(HILDON_BUTTON(keys_chk),
+               titles_size_group, values_size_group);
+
+       keys_btn = HILDON_BUTTON(hildon_button_new_with_text(
+               HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
+               HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
+               _("Configure keys..."), NULL));
+       set_button_layout(HILDON_BUTTON(keys_btn),
+               titles_size_group, values_size_group);
+       g_signal_connect(G_OBJECT(keys_btn), "clicked",
+                                       G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player));
+
+       GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Touchscreen")));
+       gtk_label_set_attributes(separator_2, pattrlist);
+       gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
+
+       touch_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
+               HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
+       gtk_button_set_label(GTK_BUTTON(touch_chk),
+               _("Enable touchscreen buttons"));
+       set_button_layout(HILDON_BUTTON(touch_chk),
+               titles_size_group, values_size_group);
+               
+       touch_show_chk = HILDON_CHECK_BUTTON(hildon_check_button_new(
+               HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
+       gtk_button_set_label(GTK_BUTTON(touch_show_chk),
+               _("Show on-screen button grid"));
+       set_button_layout(HILDON_BUTTON(touch_show_chk),
+               titles_size_group, values_size_group);
+
+       GtkLabel* separator_3 = GTK_LABEL(gtk_label_new(_("Accelerometer")));
+       gtk_label_set_attributes(separator_3, pattrlist);
+       gtk_label_set_justify(separator_3, GTK_JUSTIFY_CENTER);
+       
+       GtkLabel* separator_4 = GTK_LABEL(gtk_label_new(_("Wiimote")));
+       gtk_label_set_attributes(separator_4, pattrlist);
+       gtk_label_set_justify(separator_4, GTK_JUSTIFY_CENTER);
+       
+       GtkLabel* separator_5 = GTK_LABEL(gtk_label_new(_("Zeemote")));
+       gtk_label_set_attributes(separator_5, pattrlist);
+       gtk_label_set_justify(separator_5, GTK_JUSTIFY_CENTER);
+
+       gtk_box_pack_start(box, GTK_WIDGET(separator_1),
+               FALSE, FALSE, HILDON_MARGIN_HALF);
+       gtk_box_pack_start(box, GTK_WIDGET(keys_chk),
+               FALSE, FALSE, 0);
+       gtk_box_pack_start(box, GTK_WIDGET(keys_btn),
+               FALSE, FALSE, 0);
+       gtk_box_pack_start(box, GTK_WIDGET(separator_2),
+               FALSE, FALSE, HILDON_MARGIN_HALF);
+       gtk_box_pack_start(box, GTK_WIDGET(touch_chk),
+               FALSE, FALSE, 0);
+       gtk_box_pack_start(box, GTK_WIDGET(touch_show_chk),
+               FALSE, FALSE, 0);
+       gtk_box_pack_start(box, GTK_WIDGET(separator_3),
+               FALSE, FALSE, HILDON_MARGIN_HALF);
+       gtk_box_pack_start(box, GTK_WIDGET(separator_4),
+               FALSE, FALSE, HILDON_MARGIN_HALF);
+       gtk_box_pack_start(box, GTK_WIDGET(separator_5),
+               FALSE, FALSE, HILDON_MARGIN_HALF);
 
 
-       GtkCellRenderer* renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new());
-       GtkTreeViewColumn * column =
-                gtk_tree_view_column_new_with_attributes ("Button",
-                       gtk_cell_renderer_text_new(),
-                       "text", BUTTON_COLUMN,
-                       NULL);
-       gtk_tree_view_column_set_resizable(column, FALSE);
-       gtk_tree_view_column_set_expand(column, TRUE);
-       gtk_tree_view_append_column(keys_list, column);
-
-       renderer = GTK_CELL_RENDERER(cell_renderer_key_new());
-       column = gtk_tree_view_column_new_with_attributes("Key", renderer, NULL);
-       gtk_tree_view_column_set_cell_data_func(column, renderer, accel_set_func, NULL, NULL);
-       gtk_tree_view_column_set_resizable(column, FALSE);
-#if MAEMO_VERSION >= 5
-       gtk_tree_view_column_set_min_width(column, 340);
-#else
-       gtk_tree_view_column_set_min_width(column, 250);
-#endif
-       gtk_tree_view_append_column(keys_list, column);
-       gtk_tree_view_set_headers_visible(keys_list, TRUE);
-
-       int i;
-       for (i = 0; buttons[i].name; i++) {
-               GtkTreeIter iter;
-               gtk_list_store_append(keys_store, &iter);
-               gtk_list_store_set(keys_store, &iter,
-                       BUTTON_COLUMN, buttons[i].name,
-                       BUTTONENTRY_COLUMN, &buttons[i],
-                       -1);
-       }
+       hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box));
+       gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable));
 
 
-#if MAEMO_VERSION >= 5
-       ts_show_check = 
-        HILDON_CHECK_BUTTON(hildon_check_button_new(
-               HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
-       gtk_button_set_label(GTK_BUTTON(ts_show_check), "Show onscreen buttons");
+       pango_attr_list_unref(pattrlist);
+       g_object_unref(titles_size_group);
+       g_object_unref(values_size_group);
 #else
 #else
-       ts_show_check =
-        GTK_CHECK_BUTTON(gtk_check_button_new_with_label("Show onscreen buttons"));
 #endif
 
 #endif
 
+       load_settings();
+
 #if MAEMO_VERSION >= 5
 #if MAEMO_VERSION >= 5
-       gtk_window_resize(GTK_WINDOW(dialog), 800, 380);
+       gtk_window_resize(GTK_WINDOW(dialog), 800, 360);
 #else
 #else
-       gtk_window_resize(GTK_WINDOW(dialog), 600, 340);
+       gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
 #endif
 #endif
-       gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(combo),
-               FALSE, FALSE, HILDON_MARGIN_HALF);
-       gtk_container_add(GTK_CONTAINER(keys_scroll), GTK_WIDGET(keys_list));
-       gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(none_label));
-       gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(keys_scroll));
-       gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(ts_show_check), FALSE, FALSE, 0);
-
-       load_config();
 
        g_signal_connect(G_OBJECT(dialog), "response",
                                        G_CALLBACK (cb_dialog_response), NULL);
 
        g_signal_connect(G_OBJECT(dialog), "response",
                                        G_CALLBACK (cb_dialog_response), NULL);
-       g_signal_connect(G_OBJECT(combo), "changed",
-                                       G_CALLBACK(cb_combo_changed), NULL);
-       g_signal_connect(G_OBJECT(renderer), "accel_edited",
-                                       G_CALLBACK(cb_key_edited), NULL);
-       g_signal_connect(G_OBJECT(renderer), "accel_cleared",
-                    G_CALLBACK(cb_key_cleared), NULL);
-       g_signal_connect(G_OBJECT(ts_show_check), "toggled",
-                                       G_CALLBACK(cb_ts_show_toggled), NULL);
-
-       gtk_widget_show(GTK_WIDGET(dialog));
+       
+       gtk_widget_show_all(GTK_WIDGET(dialog));
 }
 
 }
 
index 6d79887..56e01b7 100644 (file)
@@ -1,4 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
+define(`choose', `dnl
+ifelse(eval(MAEMO_MAJOR < 5), 1, `$1', `$2')dnl>
+')dnl
+define(`N_', `$*')dnl
 <gconfschemafile>
   <schemalist>
     <schema>
 <gconfschemafile>
   <schemalist>
     <schema>
       </locale>
     </schema>
     <schema>
       </locale>
     </schema>
     <schema>
-      <key>/schemas/apps/maemo/drnoksnes/display-controls</key>
-      <applyto>/apps/maemo/drnoksnes/display-controls</applyto>
-      <owner>drnoksnes</owner>
-      <type>bool</type>
-      <default>false</default>
-      <locale name="C">
-        <short>Display onscreen controls</short>
-        <long>
-          Display a grid with the onscreen controls if touchscreen controls
-          are enabled.
-        </long>
-      </locale>
-    </schema>
-    <schema>
       <key>/schemas/apps/maemo/drnoksnes/frameskip</key>
       <applyto>/apps/maemo/drnoksnes/frameskip</applyto>
       <owner>drnoksnes</owner>
       <key>/schemas/apps/maemo/drnoksnes/frameskip</key>
       <applyto>/apps/maemo/drnoksnes/frameskip</applyto>
       <owner>drnoksnes</owner>
       </locale>
     </schema>
     <schema>
       </locale>
     </schema>
     <schema>
-      <key>/schemas/apps/maemo/drnoksnes/mapping</key>
-      <applyto>/apps/maemo/drnoksnes/mapping</applyto>
-      <owner>drnoksnes</owner>
-      <type>int</type>
-      <default>1</default>
-      <locale name="C">
-        <short>Key mapping setting</short>
-        <long>
-          Set to 0 for None, 1 for Keyboard only, etc.
-        </long>
-      </locale>
-    </schema>
-    <schema>
       <key>/schemas/apps/maemo/drnoksnes/rom</key>
       <applyto>/apps/maemo/drnoksnes/rom</applyto>
       <owner>drnoksnes</owner>
       <key>/schemas/apps/maemo/drnoksnes/rom</key>
       <applyto>/apps/maemo/drnoksnes/rom</applyto>
       <owner>drnoksnes</owner>
         </long>
       </locale>
     </schema>
         </long>
       </locale>
     </schema>
+    <schema>
+     <key>/schemas/apps/maemo/drnoksnes/player1/keyboard/enable</key>
+      <applyto>/apps/maemo/drnoksnes/player1/keyboard/enable</applyto>
+      <owner>drnoksnes</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Player 1 keyboard</short>
+        <long>
+          Enable key mappings for player 1.
+        </long>
+      </locale>
+    </schema>
+dnl Player 1 keybindings
+define(`HELP', `')dnl
+define(`BUTTON', `dnl
+    <schema>
+     <key>/schemas/apps/maemo/drnoksnes/player1/keyboard/$2</key>
+      <applyto>/apps/maemo/drnoksnes/player1/keyboard/$2</applyto>
+      <owner>drnoksnes</owner>
+      <type>int</type>
+      <default>choose($4,$5)</default>
+      <locale name="C">
+        <short>$1 button</short>
+      </locale>
+    </schema>
+dnl')dnl
+define(`ACTION', `dnl
+    <schema>
+     <key>/schemas/apps/maemo/drnoksnes/player1/keyboard/$2</key>
+      <applyto>/apps/maemo/drnoksnes/player1/keyboard/$2</applyto>
+      <owner>drnoksnes</owner>
+      <type>int</type>
+      <default>choose($4,$5)</default>
+      <locale name="C">
+        <short>$1 action</short>
+      </locale>
+    </schema>
+dnl')dnl
+define(`LAST', `')dnl
+include(buttons.inc)dnl
+undefine(`HELP')dnl
+undefine(`BUTTON')dnl
+undefine(`ACTION')dnl
+undefine(`LAST')dnl
+    <schema>
+     <key>/schemas/apps/maemo/drnoksnes/player2/keyboard/enable</key>
+      <applyto>/apps/maemo/drnoksnes/player2/keyboard/enable</applyto>
+      <owner>drnoksnes</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+        <short>Player 2 keyboard</short>
+        <long>
+          Enable key mappings for player 2.
+        </long>
+      </locale>
+    </schema>
+dnl Player 2 keybindings
+define(`HELP', `')dnl
+define(`BUTTON', `dnl
+    <schema>
+     <key>/schemas/apps/maemo/drnoksnes/player2/keyboard/$2</key>
+      <applyto>/apps/maemo/drnoksnes/player2/keyboard/$2</applyto>
+      <owner>drnoksnes</owner>
+      <type>int</type>
+      <default>0</default>
+      <locale name="C">
+        <short>$1 button</short>
+      </locale>
+    </schema>
+dnl')dnl
+define(`ACTION', `')dnl
+define(`LAST', `')dnl
+include(buttons.inc)
+undefine(`HELP')dnl
+undefine(`BUTTON')dnl
+undefine(`ACTION')dnl
+undefine(`LAST')dnl
   </schemalist>
 </gconfschemafile>
   </schemalist>
 </gconfschemafile>
diff --git a/gui/gconf.h b/gui/gconf.h
new file mode 100644 (file)
index 0000000..c7ae3d0
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _GUI_GCONF_H_
+#define _GUI_GCONF_H_
+
+#define kGConfPath "/apps/maemo/drnoksnes"
+#define kGConfRomFile kGConfPath "/" "rom"
+#define kGConfSound kGConfPath "/" "sound"
+#define kGConfTurboMode kGConfPath "/" "turbo"
+#define kGConfFrameskip kGConfPath "/" "frameskip"
+#define kGConfTransparency kGConfPath "/" "transparency"
+#define kGConfScaler kGConfPath "/" "scaler"
+#define kGConfDisplayFramerate kGConfPath "/" "display-framerate"
+#define kGConfSpeedhacks kGConfPath "/" "speedhacks"
+
+#define kGConfPlayerPathBufferLen 128
+#define kGConfPlayerPath kGConfPath "/player%d"
+
+#define kGConfPlayerKeyboardPath "/" "keyboard"
+#define kGConfPlayerKeyboardEnable kGConfPlayerKeyboardPath "/" "enable"
+
+#endif
+
index 1f70fc8..0d75992 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DrNokSnes 1.2.5\n"
 "Report-Msgid-Bugs-To: maemo@javispedro.com\n"
 msgstr ""
 "Project-Id-Version: DrNokSnes 1.2.5\n"
 "Report-Msgid-Bugs-To: maemo@javispedro.com\n"
-"POT-Creation-Date: 2010-01-07 03:08+0100\n"
+"POT-Creation-Date: 2010-01-23 20:44+0100\n"
 "PO-Revision-Date: 2010-01-07 03:11+0100\n"
 "Last-Translator: Javier <javier@javispedro.com>\n"
 "Language-Team: Spanish <maemo@javispedro.com>\n"
 "PO-Revision-Date: 2010-01-07 03:11+0100\n"
 "Last-Translator: Javier <javier@javispedro.com>\n"
 "Language-Team: Spanish <maemo@javispedro.com>\n"
@@ -23,140 +23,187 @@ msgstr ""
 msgid "<no rom selected>"
 msgstr "<sin rom seleccionada>"
 
 msgid "<no rom selected>"
 msgstr "<sin rom seleccionada>"
 
-#: plugin.c:234
+#: plugin.c:233
 msgid "ROM"
 msgstr "ROM"
 
 msgid "ROM"
 msgstr "ROM"
 
-#: plugin.c:252
+#: plugin.c:251
 msgid "Select ROM..."
 msgstr "Seleccionar ROM..."
 
 msgid "Select ROM..."
 msgstr "Seleccionar ROM..."
 
-#: plugin.c:269
+#: plugin.c:268
 msgid "Sound"
 msgstr "Sonido"
 
 msgid "Sound"
 msgstr "Sonido"
 
-#: plugin.c:275
+#: plugin.c:274
 msgid "Target framerate"
 msgstr "Velocidad objetivo"
 
 msgid "Target framerate"
 msgstr "Velocidad objetivo"
 
-#: plugin.c:292
+#: plugin.c:291
 msgid "Show while in game"
 msgstr "Mostrar durante el juego"
 
 msgid "Show while in game"
 msgstr "Mostrar durante el juego"
 
-#: plugin.c:296
-#: plugin.c:314
+#: plugin.c:295 plugin.c:313
 msgid "Turbo mode"
 msgstr "Modo Turbo"
 
 msgid "Turbo mode"
 msgstr "Modo Turbo"
 
-#: plugin.c:311
+#: plugin.c:310
 msgid "Enable sound"
 msgstr "Activar sonido"
 
 msgid "Enable sound"
 msgstr "Activar sonido"
 
-#: plugin.c:316
+#: plugin.c:315
 msgid "Display framerate"
 msgstr "Mostrar velocidad"
 
 msgid "Display framerate"
 msgstr "Mostrar velocidad"
 
-#: plugin.c:335
-#: settings.c:206
+#: plugin.c:334 settings.c:224
 msgid "Accurate graphics"
 msgstr "Mejores gráficos"
 
 msgid "Accurate graphics"
 msgstr "Mejores gráficos"
 
-#: plugin.c:339
+#: plugin.c:338
 msgid "Framerate:"
 msgstr "Velocidad:"
 
 msgid "Framerate:"
 msgstr "Velocidad:"
 
-#: plugin.c:348
-#: settings.c:231
+#: plugin.c:347 settings.c:249
 msgid "No speedhacks"
 msgstr "Sin speedhacks"
 
 msgid "No speedhacks"
 msgstr "Sin speedhacks"
 
-#: plugin.c:349
-#: settings.c:232
+#: plugin.c:348 settings.c:250
 msgid "Safe hacks only"
 msgstr "Sólo hacks seguros"
 
 msgid "Safe hacks only"
 msgstr "Sólo hacks seguros"
 
-#: plugin.c:350
-#: settings.c:233
+#: plugin.c:349 settings.c:251
 msgid "All speedhacks"
 msgstr "Todos los hacks"
 
 msgid "All speedhacks"
 msgstr "Todos los hacks"
 
-#: plugin.c:449
+#: plugin.c:446
 msgid "Settings…"
 msgstr "Ajustes…"
 
 msgid "Settings…"
 msgstr "Ajustes…"
 
-#: plugin.c:451
-#: plugin.c:460
+#: plugin.c:448 plugin.c:457
 msgid "About…"
 msgstr "Acerca de…"
 
 msgid "About…"
 msgstr "Acerca de…"
 
-#: plugin.c:459
-#: settings.c:168
+#: plugin.c:456 settings.c:177
 msgid "Settings"
 msgstr "Ajustes"
 
 msgid "Settings"
 msgstr "Ajustes"
 
-#: plugin.c:468
+#: plugin.c:465
 msgid "Controls…"
 msgstr "Controles…"
 
 msgid "Controls…"
 msgstr "Controles…"
 
-#: plugin.c:472
+#: plugin.c:469
 msgid "Advanced…"
 msgstr "Avanzados…"
 
 msgid "Advanced…"
 msgstr "Avanzados…"
 
-#: plugin.c:534
+#: plugin.c:531
 msgid "No ROM selected"
 msgstr "Sin ROM seleccionada"
 
 msgid "No ROM selected"
 msgstr "Sin ROM seleccionada"
 
-#: plugin.c:539
+#: plugin.c:536
 msgid "ROM file does not exist"
 msgstr "El archivo ROM no existe"
 
 msgid "ROM file does not exist"
 msgstr "El archivo ROM no existe"
 
-#: controls.c:285
-#: settings.c:187
-msgid "Controls"
-msgstr "Controles"
+#: controls.c:119
+msgid "Keyboard"
+msgstr "Teclado"
 
 
-#: cellrendererkey.c:10
-msgid "Press key or…"
-msgstr "Pulsa tecla o…"
+#: controls.c:123
+msgid "Disabled"
+msgstr ""
+
+#: controls.c:131
+#, c-format
+msgid "Player %d controls"
+msgstr ""
+
+#: controls.c:154
+msgid "Keys"
+msgstr ""
+
+#: controls.c:160
+#, fuzzy
+msgid "Enable keyboard"
+msgstr "Activar sonido"
+
+#: controls.c:167
+msgid "Configure keys..."
+msgstr ""
 
 
-#: settings.c:57
+#: controls.c:173
+msgid "Touchscreen"
+msgstr ""
+
+#: controls.c:180
+msgid "Enable touchscreen buttons"
+msgstr ""
+
+#: controls.c:187
+msgid "Show on-screen button grid"
+msgstr ""
+
+#: controls.c:191
+msgid "Accelerometer"
+msgstr ""
+
+#: controls.c:195
+msgid "Wiimote"
+msgstr ""
+
+#: controls.c:199
+msgid "Zeemote"
+msgstr ""
+
+#: keys.c:267
+#, fuzzy, c-format
+msgid "Player %d keys"
+msgstr "Jugador 1"
+
+#: keys.c:270
+msgid "Defaults"
+msgstr ""
+
+#: settings.c:52 settings.c:59 settings.c:61
+msgid "2x zoom"
+msgstr "Zoom 2x"
+
+#: settings.c:54
 msgid "Scale to fit"
 msgstr "Ajustar a la pantalla"
 
 msgid "Scale to fit"
 msgstr "Ajustar a la pantalla"
 
-#: settings.c:58
+#: settings.c:55
 msgid "Fill the entire screen"
 msgstr "Rellenar toda la pantalla"
 
 msgid "Fill the entire screen"
 msgstr "Rellenar toda la pantalla"
 
-#: settings.c:61
+#: settings.c:58
 msgid "Antialiased 2x zoom"
 msgstr "Zoom 2x suavizado"
 
 msgid "Antialiased 2x zoom"
 msgstr "Zoom 2x suavizado"
 
-#: settings.c:62
 #: settings.c:64
 #: settings.c:64
-msgid "2x zoom"
-msgstr "Zoom 2x"
-
-#: settings.c:67
 msgid "No zoom"
 msgstr "Sin zoom"
 
 msgid "No zoom"
 msgstr "Sin zoom"
 
-#: settings.c:194
+#: settings.c:196
+msgid "Controls"
+msgstr "Controles"
+
+#: settings.c:203
 msgid "Player 1"
 msgstr "Jugador 1"
 
 msgid "Player 1"
 msgstr "Jugador 1"
 
-#: settings.c:194
-msgid "Keyboard"
-msgstr "Teclado"
+#: settings.c:212
+#, fuzzy
+msgid "Player 2"
+msgstr "Jugador 1"
 
 
-#: settings.c:200
+#: settings.c:218
 msgid "Advanced"
 msgstr "Avanzado"
 
 msgid "Advanced"
 msgstr "Avanzado"
 
-#: settings.c:213
+#: settings.c:231
 msgid "Zoom"
 msgstr "Zoom"
 
 msgid "Zoom"
 msgstr "Zoom"
 
-#: settings.c:225
+#: settings.c:243
 msgid "Speedhacks"
 msgstr "Speedhacks"
 
 msgid "Speedhacks"
 msgstr "Speedhacks"
 
@@ -164,11 +211,44 @@ msgstr "Speedhacks"
 msgid "About"
 msgstr "Acerca de"
 
 msgid "About"
 msgstr "Acerca de"
 
+#: cellrendererkey.c:10
+msgid "Press key or…"
+msgstr "Pulsa tecla o…"
+
+#: buttons.inc:22
+msgid "Return to launcher"
+msgstr ""
+
+#: buttons.inc:23
+msgid "Fullscreen"
+msgstr ""
+
+#: buttons.inc:24
+msgid "Quick Load 1"
+msgstr ""
+
+#: buttons.inc:25
+msgid "Quick Save 1"
+msgstr ""
+
+#: buttons.inc:26
+msgid "Quick Load 2"
+msgstr ""
+
+#: buttons.inc:27
+msgid "Quick Save 2"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Enable"
+#~ msgstr "Activar sonido"
+
 #, fuzzy
 #~ msgid "2x zoom "
 #~ msgstr "Zoom 2X simple"
 #, fuzzy
 #~ msgid "2x zoom "
 #~ msgstr "Zoom 2X simple"
+
 #~ msgid "Simple 2x zoom (fast)"
 #~ msgstr "Zoom 2X simple (rápido)"
 #~ msgid "Simple 2x zoom (fast)"
 #~ msgstr "Zoom 2X simple (rápido)"
+
 #~ msgid "Original size"
 #~ msgstr "Tamaño original"
 #~ msgid "Original size"
 #~ msgstr "Tamaño original"
-
diff --git a/gui/keys.c b/gui/keys.c
new file mode 100644 (file)
index 0000000..1a998c5
--- /dev/null
@@ -0,0 +1,342 @@
+/*
+* This file is part of DrNokSnes
+*
+* Copyright (C) 2009 Javier S. Pedro <maemo@javispedro.com>
+*
+* This software is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public License
+* as published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA
+*
+*/
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include <hildon/hildon-helper.h>
+
+#if MAEMO_VERSION >= 5
+#include <hildon/hildon-gtk.h>
+#include <hildon/hildon-pannable-area.h>
+#include <hildon/hildon-check-button.h>
+#endif
+
+#include "../platform/hgw.h"
+#include "plugin.h"
+#include "gconf.h"
+#include "cellrendererkey.h"
+#include "i18n.h"
+
+static GtkDialog* dialog;
+static int current_player;
+#if MAEMO_VERSION >= 5
+static HildonPannableArea* keys_scroll;
+#else
+static GtkScrolledWindow* keys_scroll;
+#endif
+static GtkListStore* keys_store;
+static GtkTreeView* keys_list;
+
+#define DIALOG_RESPONSE_DEFAULTS 1
+
+enum
+{
+  BUTTON_COLUMN,
+  BUTTONENTRY_COLUMN,
+  N_COLUMNS
+};
+
+typedef struct ButtonEntry {
+       const char * name;
+       const char * gconf_key;
+       unsigned char scancode;
+       gboolean changed;
+} ButtonEntry;
+
+static ButtonEntry buttons[] = {
+#define HELP(...)
+#define BUTTON(description, slug, actions, d, f) \
+       { description, G_STRINGIFY(slug), 0 },
+#define ACTION(description, slug, actions, d, f) \
+       { description, G_STRINGIFY(slug), 0 },
+#define LAST \
+       { 0 }
+#include "buttons.inc"
+#undef HELP
+#undef BUTTON
+#undef ACTION
+#undef LAST
+};
+
+typedef struct 
+{
+       gchar key_base[kGConfPlayerPathBufferLen];
+       int key_len;
+       gchar *key;
+} IteratorData;
+
+static gboolean load_key_config(GtkTreeModel *model, GtkTreePath *path,
+                                                               GtkTreeIter *iter, gpointer data)
+{
+       IteratorData *idata = (IteratorData*)data;
+       ButtonEntry *button_entry;
+
+       gtk_tree_model_get(model, iter,
+               BUTTONENTRY_COLUMN, &button_entry,
+               -1);
+
+       strcpy(idata->key, button_entry->gconf_key);
+       int scancode = gconf_client_get_int(gcc, idata->key_base, NULL);
+
+       button_entry->scancode = scancode;
+       button_entry->changed = FALSE;
+
+       gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, iter);
+
+       return FALSE;
+}
+
+static void load_settings()
+{
+       IteratorData idata;
+       idata.key_len = sprintf(idata.key_base,
+               kGConfPlayerPath kGConfPlayerKeyboardPath "/", current_player);
+       idata.key = idata.key_base + idata.key_len;
+       gtk_tree_model_foreach(GTK_TREE_MODEL(keys_store), load_key_config, &idata);
+}
+
+static gboolean save_key_config(GtkTreeModel *model, GtkTreePath *path,
+                                                               GtkTreeIter *iter, gpointer data)
+{
+       IteratorData *idata = (IteratorData*)data;
+       ButtonEntry *button_entry;
+
+       gtk_tree_model_get(model, iter,
+               BUTTONENTRY_COLUMN, &button_entry,
+               -1);
+
+       if (button_entry->changed) {
+               strcpy(idata->key, button_entry->gconf_key);
+               gconf_client_set_int(gcc, idata->key_base, button_entry->scancode, NULL);
+               button_entry->changed = FALSE;
+       }
+
+       gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, iter);
+
+       return FALSE;
+}
+
+static void save_settings()
+{
+       IteratorData idata;
+       idata.key_len = sprintf(idata.key_base,
+               kGConfPlayerPath kGConfPlayerKeyboardPath "/", current_player);
+       idata.key = idata.key_base + idata.key_len;
+       gtk_tree_model_foreach(GTK_TREE_MODEL(keys_store), save_key_config, &idata);
+}
+
+static gboolean get_default_key_config(GtkTreeModel *model, GtkTreePath *path,
+                                                               GtkTreeIter *iter, gpointer data)
+{
+       IteratorData *idata = (IteratorData*)data;
+       ButtonEntry *button_entry;
+
+       gtk_tree_model_get(model, iter,
+               BUTTONENTRY_COLUMN, &button_entry,
+               -1);
+
+       strcpy(idata->key, button_entry->gconf_key);
+       GConfValue *value = gconf_client_get_default_from_schema(gcc,
+               idata->key_base, NULL);
+       if (value) {
+               int scancode = gconf_value_get_int(value);
+               if (button_entry->scancode != scancode) {
+                       button_entry->scancode = scancode;
+                       button_entry->changed = TRUE;
+               }
+               gconf_value_free(value);
+       }
+
+       gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, iter);
+
+       return FALSE;
+}
+
+static void get_default_settings()
+{
+       IteratorData idata;
+       idata.key_len = sprintf(idata.key_base,
+               kGConfPlayerPath kGConfPlayerKeyboardPath "/", current_player);
+       idata.key = idata.key_base + idata.key_len;
+       gtk_tree_model_foreach(GTK_TREE_MODEL(keys_store),
+               get_default_key_config, &idata);
+}
+
+static void
+accel_set_func (GtkTreeViewColumn *tree_column,
+                GtkCellRenderer   *cell,
+                GtkTreeModel      *model,
+                GtkTreeIter       *iter,
+                gpointer           data)
+{
+       ButtonEntry *button_entry;
+
+       gtk_tree_model_get (model, iter,
+                                               BUTTONENTRY_COLUMN, &button_entry,
+                                               -1);
+
+       if (button_entry == NULL) {
+               g_object_set (G_OBJECT (cell),
+                       "visible", FALSE,
+                       NULL);
+       } else {
+               g_object_set (G_OBJECT (cell),
+                       "visible", TRUE,
+                       "editable", TRUE,
+                       "scancode", button_entry->scancode,
+                       "style", PANGO_STYLE_NORMAL,
+                       NULL);
+       }
+}
+
+static void
+cb_key_edited(GtkCellRendererText *cell, const char *path_string,
+       guint scancode, gpointer data)
+{
+       GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
+       GtkTreeIter iter;
+       ButtonEntry *button_entry;
+
+       gtk_tree_model_get_iter(GTK_TREE_MODEL(keys_store), &iter, path);
+       gtk_tree_model_get(GTK_TREE_MODEL(keys_store), &iter,
+               BUTTONENTRY_COLUMN, &button_entry,
+               -1);
+
+       button_entry->scancode = scancode;
+       button_entry->changed = TRUE;
+
+       gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, &iter);
+       gtk_tree_path_free(path);
+}
+
+static void
+cb_key_cleared(GtkCellRendererText *cell, const char *path_string,
+       gpointer data)
+{
+       GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
+       GtkTreeIter iter;
+       ButtonEntry *button_entry;
+
+       gtk_tree_model_get_iter(GTK_TREE_MODEL(keys_store), &iter, path);
+       gtk_tree_model_get(GTK_TREE_MODEL(keys_store), &iter,
+               BUTTONENTRY_COLUMN, &button_entry,
+               -1);
+
+       button_entry->scancode = 0;
+       button_entry->changed = TRUE;
+
+       gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, &iter);
+       gtk_tree_path_free(path);
+}
+
+static void cb_dialog_response(GtkWidget * sender, gint response, gpointer data)
+{
+       if (response == DIALOG_RESPONSE_DEFAULTS) {
+               get_default_settings();
+               return;
+       }
+
+       if (response == GTK_RESPONSE_OK) {
+               save_settings();
+       }
+
+       gtk_widget_destroy(GTK_WIDGET(dialog));
+}
+
+void keys_dialog(GtkWindow* parent, int player)
+{
+       gchar* title = g_strdup_printf(_("Player %d keys"), player);
+       dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title,
+               parent, GTK_DIALOG_MODAL,
+               _("Defaults"), DIALOG_RESPONSE_DEFAULTS,
+               GTK_STOCK_SAVE, GTK_RESPONSE_OK,
+               GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL));
+       g_free(title);
+
+       current_player = player;
+
+       keys_store = GTK_LIST_STORE(gtk_list_store_new(N_COLUMNS,
+               G_TYPE_STRING, G_TYPE_POINTER));
+#if MAEMO_VERSION >= 5
+       keys_list = GTK_TREE_VIEW(hildon_gtk_tree_view_new_with_model(
+               HILDON_UI_MODE_EDIT, GTK_TREE_MODEL(keys_store)));
+       keys_scroll = HILDON_PANNABLE_AREA(hildon_pannable_area_new());
+#else
+       keys_list = GTK_TREE_VIEW(
+               gtk_tree_view_new_with_model(GTK_TREE_MODEL(keys_store)));
+       keys_scroll = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL));
+       gtk_scrolled_window_set_policy(keys_scroll,
+               GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+#endif
+
+       GtkCellRenderer* renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new());
+       GtkTreeViewColumn * column =
+                gtk_tree_view_column_new_with_attributes ("Button",
+                       gtk_cell_renderer_text_new(),
+                       "text", BUTTON_COLUMN,
+                       NULL);
+       gtk_tree_view_column_set_resizable(column, FALSE);
+       gtk_tree_view_column_set_expand(column, TRUE);
+       gtk_tree_view_append_column(keys_list, column);
+
+       renderer = GTK_CELL_RENDERER(cell_renderer_key_new());
+       column = gtk_tree_view_column_new_with_attributes("Key", renderer, NULL);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, accel_set_func, NULL, NULL);
+       gtk_tree_view_column_set_resizable(column, FALSE);
+#if MAEMO_VERSION >= 5
+       gtk_tree_view_column_set_min_width(column, 340);
+#else
+       gtk_tree_view_column_set_min_width(column, 250);
+#endif
+       gtk_tree_view_append_column(keys_list, column);
+       gtk_tree_view_set_headers_visible(keys_list, TRUE);
+
+       int i;
+       for (i = 0; buttons[i].name; i++) {
+               GtkTreeIter iter;
+               gtk_list_store_append(keys_store, &iter);
+               gtk_list_store_set(keys_store, &iter,
+                       BUTTON_COLUMN, buttons[i].name,
+                       BUTTONENTRY_COLUMN, &buttons[i],
+                       -1);
+       }
+
+#if MAEMO_VERSION >= 5
+       gtk_window_resize(GTK_WINDOW(dialog), 800, 340);
+#else
+       gtk_window_resize(GTK_WINDOW(dialog), 600, 340);
+#endif
+       gtk_container_add(GTK_CONTAINER(keys_scroll), GTK_WIDGET(keys_list));
+       gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(keys_scroll));
+
+       load_settings();
+
+       g_signal_connect(G_OBJECT(dialog), "response",
+                                       G_CALLBACK (cb_dialog_response), NULL);
+       g_signal_connect(G_OBJECT(renderer), "accel_edited",
+                                       G_CALLBACK(cb_key_edited), NULL);
+       g_signal_connect(G_OBJECT(renderer), "accel_cleared",
+                    G_CALLBACK(cb_key_cleared), NULL);
+
+       gtk_widget_show_all(GTK_WIDGET(dialog));
+}
+
index f876901..f1cde36 100644 (file)
@@ -42,8 +42,8 @@
 #include <hildon/hildon-caption.h>
 #endif
 
 #include <hildon/hildon-caption.h>
 #endif
 
-#include "../platform/hgw.h"
 #include "plugin.h"
 #include "plugin.h"
+#include "gconf.h"
 #include "i18n.h"
 
 static GtkWidget * load_plugin(void);
 #include "i18n.h"
 
 static GtkWidget * load_plugin(void);
@@ -170,7 +170,6 @@ static void select_rom_callback(GtkWidget * button, gpointer data)
 #if MAEMO_VERSION < 5
 static void controls_item_callback(GtkWidget * button, gpointer data)
 {
 #if MAEMO_VERSION < 5
 static void controls_item_callback(GtkWidget * button, gpointer data)
 {
-       controls_setup();
        controls_dialog(get_parent_window());
 }
 #endif
        controls_dialog(get_parent_window());
 }
 #endif
@@ -436,8 +435,6 @@ static void write_config(void)
        if (current_rom_file) {
                gconf_client_set_string(gcc, kGConfRomFile, current_rom_file, NULL);
        }
        if (current_rom_file) {
                gconf_client_set_string(gcc, kGConfRomFile, current_rom_file, NULL);
        }
-
-       controls_setup();
 }
 
 static GtkWidget **load_menu(guint *nitems)
 }
 
 static GtkWidget **load_menu(guint *nitems)
index 090ff93..cd94ffb 100644 (file)
@@ -23,13 +23,16 @@ void save_load(GtkWindow* parent);
 void save_save(GtkWindow* parent);
 void save_save_as(GtkWindow* parent);
 
 void save_save(GtkWindow* parent);
 void save_save_as(GtkWindow* parent);
 
-/* controls.c */
-/** Fill in default controls */
-void controls_setup();
-void controls_dialog(GtkWindow* parent);
-
 /* settings.c */
 void settings_dialog(GtkWindow* parent);
 /* settings.c */
 void settings_dialog(GtkWindow* parent);
+void settings_update_controls(int player);
+
+/* controls.c */
+void controls_dialog(GtkWindow* parent, int player);
+gchar* controls_describe(int player);
+
+/* keys.c */
+void keys_dialog(GtkWindow* parent, int player);
 
 /* about.c */
 void about_dialog(GtkWindow* parent);
 
 /* about.c */
 void about_dialog(GtkWindow* parent);
index aa37982..9354de4 100644 (file)
@@ -36,8 +36,8 @@
 #include <hildon/hildon-caption.h>
 #endif
 
 #include <hildon/hildon-caption.h>
 #endif
 
-#include "../platform/hgw.h"
 #include "plugin.h"
 #include "plugin.h"
+#include "gconf.h"
 #include "i18n.h"
 
 struct scaler {
 #include "i18n.h"
 
 struct scaler {
@@ -46,14 +46,11 @@ struct scaler {
 };
 
 static struct scaler scalers[] = {
 };
 
 static struct scaler scalers[] = {
+
 #if MAEMO_VERSION == 5
 #if MAEMO_VERSION == 5
-#if 0
 #ifdef __arm__
 #ifdef __arm__
-       {"hdarm2x", ("2x zoom")},
-#else
-       {"hdsoft2x", ("2x zoom")},
+       {"arm2x", N_("2x zoom")},
 #endif /* __arm__ */
 #endif /* __arm__ */
-#endif /* those above are not ready yet */
        {"hdsq", N_("Scale to fit")},
        {"hdfill", N_("Fill the entire screen")},
 #elif MAEMO_VERSION == 4
        {"hdsq", N_("Scale to fit")},
        {"hdfill", N_("Fill the entire screen")},
 #elif MAEMO_VERSION == 4
@@ -69,7 +66,7 @@ static struct scaler scalers[] = {
 
 static GtkDialog* dialog;
 #if MAEMO_VERSION >= 5
 
 static GtkDialog* dialog;
 #if MAEMO_VERSION >= 5
-static HildonButton* player1_btn;
+static HildonButton* player1_btn, * player2_btn;
 static HildonCheckButton* accu_check;
 static HildonPickerButton* scaler_picker;
 static HildonPickerButton* speedhacks_picker;
 static HildonCheckButton* accu_check;
 static HildonPickerButton* scaler_picker;
 static HildonPickerButton* speedhacks_picker;
@@ -104,6 +101,18 @@ static void fill_scaler_list(GtkWidget* w)
        }
 }
 
        }
 }
 
+void settings_update_controls(int player)
+{
+       switch (player) {
+               case 1:
+                       hildon_button_set_value(player1_btn, controls_describe(1));
+                       break;
+               case 2:
+                       hildon_button_set_value(player2_btn, controls_describe(2));
+                       break;
+       }
+}
+
 static void load_settings()
 {
        gchar* scaler_id = gconf_client_get_string(gcc, kGConfScaler, NULL);
 static void load_settings()
 {
        gchar* scaler_id = gconf_client_get_string(gcc, kGConfScaler, NULL);
@@ -111,6 +120,8 @@ static void load_settings()
        if (scaler_num < 0) scaler_num = 0;
 
 #if MAEMO_VERSION >= 5
        if (scaler_num < 0) scaler_num = 0;
 
 #if MAEMO_VERSION >= 5
+       settings_update_controls(1);
+       settings_update_controls(1);
        hildon_check_button_set_active(accu_check,
                gconf_client_get_bool(gcc, kGConfTransparency, NULL));
        hildon_picker_button_set_active(scaler_picker, scaler_num);
        hildon_check_button_set_active(accu_check,
                gconf_client_get_bool(gcc, kGConfTransparency, NULL));
        hildon_picker_button_set_active(scaler_picker, scaler_num);
@@ -149,7 +160,7 @@ static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
 #if MAEMO_VERSION >= 5
 static void controls_btn_callback(GtkWidget * button, gpointer data)
 {
 #if MAEMO_VERSION >= 5
 static void controls_btn_callback(GtkWidget * button, gpointer data)
 {
-       controls_dialog(GTK_WINDOW(dialog));
+       controls_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data));
 }
 
 static void set_button_layout(HildonButton* button,
 }
 
 static void set_button_layout(HildonButton* button,
@@ -158,8 +169,6 @@ static void set_button_layout(HildonButton* button,
        hildon_button_add_title_size_group(button, titles_size_group);
        hildon_button_add_value_size_group(button, values_size_group);
        hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
        hildon_button_add_title_size_group(button, titles_size_group);
        hildon_button_add_value_size_group(button, values_size_group);
        hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0);
-       /*hildon_button_set_title_alignment(button, 0.0, 0.5);
-       hildon_button_set_value_alignment(button, 0.0, 0.5);*/
 }
 #endif
 
 }
 #endif
 
@@ -167,7 +176,7 @@ void settings_dialog(GtkWindow* parent)
 {
        dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Settings"),
                parent, GTK_DIALOG_MODAL,
 {
        dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Settings"),
                parent, GTK_DIALOG_MODAL,
-               GTK_STOCK_OK, GTK_RESPONSE_OK,
+               GTK_STOCK_SAVE, GTK_RESPONSE_OK,
                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
 
 #if MAEMO_VERSION >= 5
                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
 
 #if MAEMO_VERSION >= 5
@@ -191,12 +200,21 @@ void settings_dialog(GtkWindow* parent)
        player1_btn = HILDON_BUTTON(hildon_button_new_with_text(
                HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
                HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
        player1_btn = HILDON_BUTTON(hildon_button_new_with_text(
                HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
                HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
-               _("Player 1"), _("Keyboard")));
+               _("Player 1"), NULL));
        set_button_layout(HILDON_BUTTON(player1_btn),
                titles_size_group, values_size_group);
        g_signal_connect(G_OBJECT(player1_btn), "clicked",
                                        G_CALLBACK(controls_btn_callback), GINT_TO_POINTER(1));
 
        set_button_layout(HILDON_BUTTON(player1_btn),
                titles_size_group, values_size_group);
        g_signal_connect(G_OBJECT(player1_btn), "clicked",
                                        G_CALLBACK(controls_btn_callback), GINT_TO_POINTER(1));
 
+       player2_btn = HILDON_BUTTON(hildon_button_new_with_text(
+               HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
+               HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
+               _("Player 2"), NULL));
+       set_button_layout(HILDON_BUTTON(player2_btn),
+               titles_size_group, values_size_group);
+       g_signal_connect(G_OBJECT(player2_btn), "clicked",
+                                       G_CALLBACK(controls_btn_callback), GINT_TO_POINTER(2));
+
        GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Advanced")));
        gtk_label_set_attributes(separator_2, pattrlist);
        gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
        GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Advanced")));
        gtk_label_set_attributes(separator_2, pattrlist);
        gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER);
@@ -263,7 +281,7 @@ void settings_dialog(GtkWindow* parent)
        load_settings();
 
 #if MAEMO_VERSION >= 5
        load_settings();
 
 #if MAEMO_VERSION >= 5
-       gtk_window_resize(GTK_WINDOW(dialog), 800, 350);
+       gtk_window_resize(GTK_WINDOW(dialog), 800, 380);
 #else
        gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
 #endif
 #else
        gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
 #endif
diff --git a/language.h b/language.h
deleted file mode 100644 (file)
index 5c721a5..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
-  Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
-  (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
-                            Jerremy Koot (jkoot@snes9x.com)
-
-  (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net)
-
-  (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net),
-                            funkyass (funkyass@spam.shaw.ca),
-                            Joel Yliluoma (http://iki.fi/bisqwit/)
-                            Kris Bleakley (codeviolation@hotmail.com),
-                            Matthew Kendora,
-                            Nach (n-a-c-h@users.sourceforge.net),
-                            Peter Bortas (peter@bortas.org) and
-                            zones (kasumitokoduck@yahoo.com)
-
-  C4 x86 assembler and some C emulation code
-  (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com),
-                            _Demo_ (_demo_@zsnes.com), and Nach
-
-  C4 C++ code
-  (c) Copyright 2003 Brad Jorsch
-
-  DSP-1 emulator code
-  (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson,
-                            John Weidman, neviksti (neviksti@hotmail.com),
-                            Kris Bleakley, Andreas Naive
-
-  DSP-2 emulator code
-  (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and
-                     Lord Nightmare (lord_nightmare@users.sourceforge.net
-
-  OBC1 emulator code
-  (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and
-                            Kris Bleakley
-  Ported from x86 assembler to C by sanmaiwashi
-
-  SPC7110 and RTC C++ emulator code
-  (c) Copyright 2002 Matthew Kendora with research by
-                     zsKnight, John Weidman, and Dark Force
-
-  S-DD1 C emulator code
-  (c) Copyright 2003 Brad Jorsch with research by
-                     Andreas Naive and John Weidman
-  S-RTC C emulator code
-  (c) Copyright 2001 John Weidman
-  
-  ST010 C++ emulator code
-  (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora
-
-  Super FX x86 assembler emulator code 
-  (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault 
-
-  Super FX C emulator code 
-  (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman
-
-
-  SH assembler code partly based on x86 assembler code
-  (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) 
-
-  Specific ports contains the works of other authors. See headers in
-  individual files.
-  Snes9x homepage: http://www.snes9x.com
-  Permission to use, copy, modify and distribute Snes9x in both binary and
-  source form, for non-commercial purposes, is hereby granted without fee,
-  providing that this license information and copyright notice appear with
-  all copies and any derived work.
-  This software is provided 'as-is', without any express or implied
-  warranty. In no event shall the authors be held liable for any damages
-  arising from the use of this software.
-  Snes9x is freeware for PERSONAL USE only. Commercial users should
-  seek permission of the copyright holders first. Commercial use includes
-  charging money for Snes9x or software derived from Snes9x.
-  The copyright holders request that bug fixes and improvements to the code
-  should be forwarded to them so everyone can benefit from the modifications
-  in future versions.
-  Super NES and Super Nintendo Entertainment System are trademarks of
-  Nintendo Co., Limited and its subsidiary companies.
-*******************************************************************************/
-
-/* This is where all the GUI text strings will eventually end up */
-
-#define WINDOW_TITLE "Snes9X v%s for Windows(NK Custom)"
-
-#define MY_REG_KEY   "Software\\Emulators\\Snes9X"
-
-#define REG_KEY_VER  "1.31"
-
-#define DISCLAIMER_TEXT        "Snes9X v%s for Windows.\r\n" \
-        "(c) Copyright 1996 - 2002 Gary Henderson and Jerremy Koot.\r\n" \
-        "(c) Copyright 2001- 2004 John Weidman.\r\n" \
-       "(c) Copyright 2002 - 2004 blip, Brad Jorsch, funkyass, Joel Yliluoma, Kris Bleakley, Matthew Kendora, Nach, Peter Bortas, zones.\r\n\r\n" \
-       "Snes9X is a Super Nintendo Entertainment System\r\n" \
-               "emulator that allows you to play most games designed\r\n" \
-               "for the SNES on your PC.\r\n\r\n" \
-               "Please visit http://www.snes9x.com for\r\n" \
-               "up-to-the-minute information and help on Snes9X.\r\n\r\n" \
-               "Nintendo is a trade mark."
-
-
-#define APP_NAME "Snes9x"
-/* possible global strings */
-#define SNES9X_INFO "Snes9x: Information"
-#define SNES9X_WARN "Snes9x: WARNING!"
-#define SNES9X_DXS "Snes9X: DirectSound"
-#define SNES9X_SNDQ "Snes9X: Sound CPU Question"
-#define SNES9X_NP_ERROR "Snes9X: NetPlay Error"
-#define BUTTON_OK "&OK"
-#define BUTTON_CANCEL "&Cancel"
-
-/* Gamepad Dialog Strings */
-#define INPUTCONFIG_TITLE "Input Configuration"
-#define INPUTCONFIG_JPTOGGLE "Enable"
-#define INPUTCONFIG_DIAGTOGGLE "Toggle Diagonals"
-/* #define INPUTCONFIG_OK "&OK" */
-/* #define INPUTCONFIG_CANCEL "&Cancel" */
-#define INPUTCONFIG_JPCOMBO "Joypad #%d"
-#define INPUTCONFIG_LABEL_UP "Up"
-#define INPUTCONFIG_LABEL_DOWN "Down"
-#define INPUTCONFIG_LABEL_LEFT "Left"
-#define INPUTCONFIG_LABEL_RIGHT "Right"
-#define INPUTCONFIG_LABEL_A "A"
-#define INPUTCONFIG_LABEL_B "B"
-#define INPUTCONFIG_LABEL_X "X"
-#define INPUTCONFIG_LABEL_Y "Y"
-#define INPUTCONFIG_LABEL_L "L"
-#define INPUTCONFIG_LABEL_R "R"
-#define INPUTCONFIG_LABEL_START "Start"
-#define INPUTCONFIG_LABEL_SELECT "Select"
-#define INPUTCONFIG_LABEL_UPLEFT "Up Left"
-#define INPUTCONFIG_LABEL_UPRIGHT "Up Right"
-#define INPUTCONFIG_LABEL_DOWNRIGHT "Down Right"
-#define INPUTCONFIG_LABEL_DOWNLEFT "Down Left"
-#define INPUTCONFIG_LABEL_BLUE "Blue means the current key/button is already mapped; Red means it's a Snes9x/Windows reserved key."
-
-/* gaming buttons and axises */
-#define GAMEDEVICE_JOYNUMPREFIX "(J%d)"
-#define GAMEDEVICE_JOYBUTPREFIX "#[%d]"
-#define GAMEDEVICE_XNEG "Left"
-#define GAMEDEVICE_XPOS "Right"
-#define GAMEDEVICE_YPOS "Up"
-#define GAMEDEVICE_YNEG "Down"
-#define GAMEDEVICE_POVLEFT "POV Left"
-#define GAMEDEVICE_POVRIGHT "POV Right"
-#define GAMEDEVICE_POVUP "POV Up"
-#define GAMEDEVICE_POVDOWN "POV Down" 
-#define GAMEDEVICE_POVDNLEFT "POV Dn Left" 
-#define GAMEDEVICE_POVDNRIGHT "POV Dn Right" 
-#define GAMEDEVICE_POVUPLEFT  "POV Up Left" 
-#define GAMEDEVICE_POVUPRIGHT "POV Up Right" 
-#define GAMEDEVICE_ZPOS "Z Up"
-#define GAMEDEVICE_ZNEG "Z Down"
-#define GAMEDEVICE_RPOS "R Up"
-#define GAMEDEVICE_RNEG "R Down"
-#define GAMEDEVICE_UPOS "U Up"
-#define GAMEDEVICE_UNEG "U Down"
-#define GAMEDEVICE_VPOS "V Up"
-#define GAMEDEVICE_VNEG "V Down"
-#define GAMEDEVICE_BUTTON "Button %d"
-
-/* gaming general */
-#define GAMEDEVICE_DISABLED "Disabled"
-
-/* gaming keys */
-#define GAMEDEVICE_KEY "#%d"
-#define GAMEDEVICE_NUMPADPREFIX "Numpad-%c"
-#define GAMEDEVICE_VK_TAB "Tab"
-#define GAMEDEVICE_VK_BACK "Backspace"
-#define GAMEDEVICE_VK_CLEAR "Delete"
-#define GAMEDEVICE_VK_RETURN "Enter"
-#define GAMEDEVICE_VK_LSHIFT "LShift"
-#define GAMEDEVICE_VK_RSHIFT "RShift"
-#define GAMEDEVICE_VK_LCONTROL "LCTRL"
-#define GAMEDEVICE_VK_RCONTROL "RCTRL"
-#define GAMEDEVICE_VK_LMENU "LAlt"
-#define GAMEDEVICE_VK_RMENU "RAlt"
-#define GAMEDEVICE_VK_PAUSE "Pause"
-#define GAMEDEVICE_VK_CAPITAL "Capslock"
-#define GAMEDEVICE_VK_ESCAPE "Disabled"
-#define GAMEDEVICE_VK_SPACE "Space"
-#define GAMEDEVICE_VK_PRIOR "PgUp"
-#define GAMEDEVICE_VK_NEXT "PgDn"
-#define GAMEDEVICE_VK_HOME "Home"
-#define GAMEDEVICE_VK_END "End"
-#define GAMEDEVICE_VK_LEFT "Left"
-#define GAMEDEVICE_VK_RIGHT "Right"
-#define GAMEDEVICE_VK_UP "Up"
-#define GAMEDEVICE_VK_DOWN "Down"
-#define GAMEDEVICE_VK_SELECT "Select"
-#define GAMEDEVICE_VK_PRINT "Print"
-#define GAMEDEVICE_VK_EXECUTE "Execute"
-#define GAMEDEVICE_VK_SNAPSHOT "SnapShot"
-#define GAMEDEVICE_VK_INSERT "Insert"
-#define GAMEDEVICE_VK_DELETE "Delete"
-#define GAMEDEVICE_VK_HELP "Help"
-#define GAMEDEVICE_VK_LWIN "LWinKey"
-#define GAMEDEVICE_VK_RWIN "RWinKey"
-#define GAMEDEVICE_VK_APPS "AppKey"
-#define GAMEDEVICE_VK_MULTIPLY "Numpad *"
-#define GAMEDEVICE_VK_ADD "Numpad +"
-#define GAMEDEVICE_VK_SEPARATOR "\\"
-#define GAMEDEVICE_VK_OEM_1 "Semi-Colon"
-#define GAMEDEVICE_VK_OEM_7 "Apostrophe"
-#define GAMEDEVICE_VK_OEM_COMMA "Comma" 
-#define GAMEDEVICE_VK_OEM_PERIOD "Period" 
-#define GAMEDEVICE_VK_SUBTRACT "Numpad -"
-#define GAMEDEVICE_VK_DECIMAL "Numpad ."
-#define GAMEDEVICE_VK_DIVIDE "Numpad /"
-#define GAMEDEVICE_VK_NUMLOCK "Num-lock"
-#define GAMEDEVICE_VK_SCROLL "Scroll-lock"
-
-/* evil things I found in WinProc */
-
-#define WINPROC_TURBOMODE_ON "Turbo Mode Activated"
-#define WINPROC_TURBOMODE_OFF "Turbo Mode Deactivated"
-#define WINPROC_TURBOMODE_TEXT "Turbo Mode"
-#define WINPROC_HDMA_TEXT "HDMA emulation"
-#define WINPROC_BG1 "BG#1" /* Background Layers */
-#define WINPROC_BG2 "BG#2"
-#define WINPROC_BG3 "BG#3"
-#define WINPROC_BG4 "BG#4"
-#define WINPROC_SPRITES "Sprites"
-#define WINPROC_PADSWAP "Joypad swapping" 
-#define WINPROC_CONTROLERS0 "Multiplayer 5 on #0"
-#define WINPROC_CONTROLERS1 "Joypad on #0"
-#define WINPROC_CONTROLERS2 "Mouse on #1"
-#define WINPROC_CONTROLERS3 "Mouse on #0"
-#define WINPROC_CONTROLERS4 "Superscope on #1"
-#define WINPROC_CONTROLERS5 "Justifier 1 on #1"
-#define WINPROC_CONTROLERS6 "Justifier 2 on #1"
-#define WINPROC_BGHACK "Background layering hack"
-#define WINPROC_MODE7INTER "Mode 7 Interpolation"
-#define WINPROC_TRANSPARENCY "Transparency effects"
-#define WINPROC_CLIPWIN "Graphic clip windows"
-#define WINPROC_PAUSE "Pause"
-#define WINPROC_EMUFRAMETIME "Emulated frame time: %dms"
-#define WINPROC_AUTOSKIP "Auto Frame Skip"
-#define WINPROC_FRAMESKIP "Frame skip: %d"
-#define WINPROC_TURBO_R_ON "Turbo R Activated"
-#define WINPROC_TURBO_R_OFF "Turbo R Deactivated"
-#define WINPROC_TURBO_L_ON "Turbo L Activated"
-#define WINPROC_TURBO_L_OFF "Turbo L Deactivated"
-#define WINPROC_TURBO_X_ON "Turbo X Activated"
-#define WINPROC_TURBO_X_OFF "Turbo X Deactivated"
-#define WINPROC_TURBO_Y_ON "Turbo Y Activated"
-#define WINPROC_TURBO_Y_OFF "Turbo Y Deactivated"
-#define WINPROC_TURBO_A_ON "Turbo A Activated"
-#define WINPROC_TURBO_A_OFF "Turbo A Deactivated"
-#define WINPROC_TURBO_B_ON "Turbo B Activated"
-#define WINPROC_TURBO_B_OFF "Turbo B Deactivated"
-#define WINPROC_TURBO_SEL_ON "Turbo Select Activated"
-#define WINPROC_TURBO_SEL_OFF "Turbo Select Deactivated"
-#define WINPROC_TURBO_START_ON "Turbo Start Activated"
-#define WINPROC_TURBO_START_OFF "Turbo Start Deactivated"
-#define WINPROC_FILTER_RESTART "You will need to restart Snes9x before the output image\nprocessing option change will take effect."
-#define WINPROC_DISCONNECT "Disconnect from the NetPlay server first."
-#define WINPROC_NET_RESTART "Your game will be reset after the ROM has been sent due to\nyour 'Sync Using Reset Game' setting.\n\n"
-#define WINPROC_INTERPOLATED_SND "Interpolated sound"
-#define WINPROC_SYNC_SND "Sync sound"
-#define WINPROC_SND_OFF "Disabling the sound CPU emulation will help to improve\nemulation speed but you will not hear any sound effects\nor music. If you later want to re-enable the sound CPU\nemulation you will need to reset your game before it will\ntake effect.\n\nAre you sure this is what you want?"
-#define WINPROC_SND_RESTART "You will need to reset your game or load another one\nbefore enabling the sound CPU will take effect."
-
-/* Emulator Settings */
-
-#define EMUSET_TITLE "Emulation Settings"
-#define EMUSET_LABEL_FREEZE "Freeze Folder Directory"
-#define EMUSET_BROWSE "&Browse..."
-#define EMUSET_LABEL_ASRAM "Auto-Save S-RAM"
-#define EMUSET_LABEL_ASRAM_TEXT "seconds after last change (0 disables auto-save)"
-#define EMUSET_LABEL_SMAX "Skip at most"
-#define EMUSET_LABEL_SMAX_TEXT "frames in auto-frame rate mode"
-#define EMUSET_LABEL_STURBO "Skip Rendering"
-#define EMUSET_LABEL_STURBO_TEXT "frames in Turbo mode"
-#define EMUSET_TOGGLE_TURBO "Tab Toggles Turbo"
-
-/* Netplay Options */
-
-#define NPOPT_TITLE "Netplay Options"
-#define NPOPT_LABEL_PORTNUM "Socket Port Number"
-#define NPOPT_LABEL_PAUSEINTERVAL "Ask Server to Pause when"
-#define NPOPT_LABEL_PAUSEINTERVAL_TEXT "frames behind"
-#define NPOPT_LABEL_MAXSKIP "Maximum Frame Rate Skip"
-#define NPOPT_SYNCBYRESET "Sync By Reset"
-#define NPOPT_SENDROM "Send ROM Image to Client on Connect"
-#define NPOPT_ACTASSERVER "Act As Server"
-#define NPOPT_PORTNUMBLOCK "Port Settings"
-#define NPOPT_CLIENTSETTINGSBLOCK "Client Settings"
-#define NPOPT_SERVERSETTINGSBLOCK "Server Settings"
-
-/* Netplay Connect */
-
-
-#define NPCON_TITLE "Connect to Server"
-#define NPCON_LABEL_SERVERADDY "Server Address"
-#define NPCON_LABEL_PORTNUM "Port Number"
-#define NPCON_CLEARHISTORY "Clear History"
-
-
-/* Movie Messages */
-
-#define MOVIE_INFO_REPLAY "Movie replay"
-#define MOVIE_INFO_RECORD "Movie record"
-#define MOVIE_INFO_RERECORD "Movie re-record"
-#define MOVIE_INFO_REWIND "Movie rewind"
-#define MOVIE_INFO_STOP "Movie stop"
-#define MOVIE_INFO_END "Movie end"
-#define MOVIE_INFO_RECORDING_ENABLED "Recording enabled"
-#define MOVIE_INFO_RECORDING_DISABLED "Recording disabled"
-#define MOVIE_ERR_SNAPSHOT_WRONG_MOVIE "Snapshot not from this movie"
-#define MOVIE_ERR_SNAPSHOT_NOT_MOVIE "Not a movie snapshot"
-#define MOVIE_ERR_COULD_NOT_OPEN "Could not open movie file."
-#define MOVIE_ERR_NOT_FOUND "File not found."
-#define MOVIE_ERR_WRONG_FORMAT "File is wrong format."
-#define MOVIE_ERR_WRONG_VERSION "File is wrong version."
-
-
-/*  AVI Messages */
-
-#define AVI_CONFIGURATION_CHANGED "AVI recording stopped (configuration settings changed)."
index bccc6ed..bf19736 100644 (file)
@@ -2,9 +2,15 @@
 #include <libgen.h>
 #include <hgw/hgw.h>
 
 #include <libgen.h>
 #include <hgw/hgw.h>
 
+#include "snes9x.h"
+
+#include <glib.h>
+#include <gconf/gconf.h>
+#include <gconf/gconf-client.h>
+
 #include "platform.h"
 #include "hgw.h"
 #include "platform.h"
 #include "hgw.h"
-#include "snes9x.h"
+#include "../gui/gconf.h"
 
 #define DIE(format, ...) do { \
                fprintf(stderr, "Died at %s:%d: ", __FILE__, __LINE__ ); \
 
 #define DIE(format, ...) do { \
                fprintf(stderr, "Died at %s:%d: ", __FILE__, __LINE__ ); \
                abort(); \
        } while (0);
 
                abort(); \
        } while (0);
 
-
 bool hgwLaunched;
 static HgwContext *hgw;
 
 static void createActionMappingsOnly();
 bool hgwLaunched;
 static HgwContext *hgw;
 
 static void createActionMappingsOnly();
-static void parseGConfKeyMappings();
+static void parseGConfKeyMappings(GConfClient* gcc);
 
 void HgwInit()
 {
 
 void HgwInit()
 {
@@ -30,6 +35,7 @@ void HgwInit()
                return;
        }
 
                return;
        }
 
+       g_type_init();
        hgw = hgw_context_init();
 
        if (!hgw) {
        hgw = hgw_context_init();
 
        if (!hgw) {
@@ -55,6 +61,8 @@ void HgwConfig()
 {
        if (!hgwLaunched) return;
 
 {
        if (!hgwLaunched) return;
 
+       GConfClient *gcc = gconf_client_get_default();
+
        Config.fullscreen = true;
 
        char romFile[PATH_MAX + 1];
        Config.fullscreen = true;
 
        char romFile[PATH_MAX + 1];
@@ -99,10 +107,12 @@ void HgwConfig()
                Settings.DisplayFrameRate = displayFramerate ? TRUE : FALSE;
        }
 
                Settings.DisplayFrameRate = displayFramerate ? TRUE : FALSE;
        }
 
+#if TODO
        char displayControls = FALSE;
        if (hgw_conf_request_bool(hgw, kGConfDisplayControls, &displayControls) == HGW_ERR_NONE) {
                Config.touchscreenShow = displayControls ? true : false;
        }
        char displayControls = FALSE;
        if (hgw_conf_request_bool(hgw, kGConfDisplayControls, &displayControls) == HGW_ERR_NONE) {
                Config.touchscreenShow = displayControls ? true : false;
        }
+#endif
 
        int speedhacks = 0;
        if (hgw_conf_request_int(hgw, kGConfSpeedhacks, &speedhacks) == HGW_ERR_NONE) {
 
        int speedhacks = 0;
        if (hgw_conf_request_int(hgw, kGConfSpeedhacks, &speedhacks) == HGW_ERR_NONE) {
@@ -123,37 +133,17 @@ void HgwConfig()
                                < 0) {
                        Config.hacksFile = 0; // malloc error.
                }
                                < 0) {
                        Config.hacksFile = 0; // malloc error.
                }
-               // romFile[] is garbled from now on.
+               // remember that dirname garbles romFile.
        }
 
        }
 
-       int mappings = 0;
-       if (hgw_conf_request_int(hgw, kGConfMapping, &mappings) == HGW_ERR_NONE) {
-               switch (mappings) {
-                       case 0:
-                               // Do nothing, leave mappings as is.
-                               break;
-                       case 1: // Keys
-                               parseGConfKeyMappings();
-                               break;
-                       case 2: // Touchscreen
-                               Config.touchscreenInput = true;
-                               createActionMappingsOnly();
-                               break;
-                       case 3: // Touchscreen + keys
-                               Config.touchscreenInput = true;
-                               parseGConfKeyMappings();
-                               break;
-                       case 4: // Mouse
-                               Settings.Mouse = TRUE;
-                               Settings.ControllerOption = SNES_MOUSE_SWAPPED;
-                               createActionMappingsOnly();
-                               break;
-                       case 5: // Mouse + keys
-                               Settings.Mouse = TRUE;
-                               Settings.ControllerOption = SNES_MOUSE;
-                               parseGConfKeyMappings();
-                               break;
-               }
+       gchar key[kGConfPlayerPathBufferLen];
+       gchar *relKey = key + sprintf(key, kGConfPlayerPath, 1);
+
+       strcpy(relKey, kGConfPlayerKeyboardEnable);
+       if (gconf_client_get_bool(gcc, key, NULL)) {
+               parseGConfKeyMappings(gcc);
+       } else {
+               createActionMappingsOnly();
        }
 
        HgwStartCommand cmd = hgw_context_get_start_command(hgw);
        }
 
        HgwStartCommand cmd = hgw_context_get_start_command(hgw);
@@ -175,6 +165,8 @@ void HgwConfig()
                        Config.quitting = true;
                        break;
        }
                        Config.quitting = true;
                        break;
        }
+
+       g_object_unref(G_OBJECT(gcc));
 }
 
 void HgwPollEvents()
 }
 
 void HgwPollEvents()
@@ -214,7 +206,7 @@ void HgwPollEvents()
 
 // For now, please keep this in sync with ../gui/controls.c
 typedef struct ButtonEntry {
 
 // For now, please keep this in sync with ../gui/controls.c
 typedef struct ButtonEntry {
-       char * gconf_key;
+       const char * gconf_key;
        unsigned long mask;
        bool is_action;
 } ButtonEntry;
        unsigned long mask;
        bool is_action;
 } ButtonEntry;
@@ -224,67 +216,67 @@ typedef struct ButtonEntry {
        { kGConfKeysPath "/" name, kAction##action, true }
 #define BUTTON_LAST    \
        { 0 }
        { kGConfKeysPath "/" name, kAction##action, true }
 #define BUTTON_LAST    \
        { 0 }
+
 static const ButtonEntry buttons[] = {
 static const ButtonEntry buttons[] = {
-       BUTTON_INITIALIZER(A, "a"),
-       BUTTON_INITIALIZER(B, "b"),
-       BUTTON_INITIALIZER(X, "x"),
-       BUTTON_INITIALIZER(Y, "y"),
-       BUTTON_INITIALIZER(TL, "l"),
-       BUTTON_INITIALIZER(TR, "r"),
-       BUTTON_INITIALIZER(START, "start"),
-       BUTTON_INITIALIZER(SELECT, "select"),
-       BUTTON_INITIALIZER(UP, "up"),
-       BUTTON_INITIALIZER(DOWN, "down"),
-       BUTTON_INITIALIZER(LEFT, "left"),
-       BUTTON_INITIALIZER(RIGHT, "right"),
-       ACTION_INITIALIZER(Quit, "quit"),
-       ACTION_INITIALIZER(ToggleFullscreen, "fullscreen"),
-       ACTION_INITIALIZER(QuickLoad1, "quickload1"),
-       ACTION_INITIALIZER(QuickSave1, "quicksave1"),
-       ACTION_INITIALIZER(QuickLoad2, "quickload2"),
-       ACTION_INITIALIZER(QuickSave2, "quicksave2"),
-       BUTTON_LAST
+#define HELP(...)
+#define P(x) SNES_##x##_MASK
+#define A(x) kAction##x
+#define BUTTON(description, slug, actions, d, f) \
+       { G_STRINGIFY(slug), actions, false },
+#define ACTION(description, slug, actions, d, f) \
+       { G_STRINGIFY(slug), actions, true },
+#define LAST \
+       { 0 }
+#include "../gui/buttons.inc"
+#undef HELP
+#undef P
+#undef A
+#undef BUTTON
+#undef ACTION
+#undef LAST
 };
 
 static void createActionMappingsOnly()
 {
 };
 
 static void createActionMappingsOnly()
 {
-       // Discard any other mapping
-       ZeroMemory(Config.joypad1Mapping, sizeof(Config.joypad1Mapping));
-       ZeroMemory(Config.action, sizeof(Config.action));
-       
        // Map quit to fullscreen, escape and task switch.
        Config.action[72] = kActionQuit;
        Config.action[9] = kActionQuit;
        Config.action[71] = kActionQuit;
 }
 
        // Map quit to fullscreen, escape and task switch.
        Config.action[72] = kActionQuit;
        Config.action[9] = kActionQuit;
        Config.action[71] = kActionQuit;
 }
 
-static void parseGConfKeyMappings()
+static void parseGConfKeyMappings(GConfClient* gcc)
 {
 {
-       // Discard any other mapping
-       ZeroMemory(Config.joypad1Mapping, sizeof(Config.joypad1Mapping));
-       ZeroMemory(Config.action, sizeof(Config.action));
+       // Build player 1 keyboard gconf key relative path
+       gchar key[kGConfPlayerPathBufferLen];
+       gchar *relKey = key + sprintf(key,
+               kGConfPlayerPath kGConfPlayerKeyboardPath "/", 1);
 
        // If the user does not map fullscreen or quit
        bool quit_mapped = false;
 
        printf("Hgw: Using gconf key mappings\n");
 
        // If the user does not map fullscreen or quit
        bool quit_mapped = false;
 
        printf("Hgw: Using gconf key mappings\n");
+       // Thus ignoring config file key mappings
+       ZeroMemory(Config.joypad1Mapping, sizeof(Config.joypad1Mapping));
+       ZeroMemory(Config.action, sizeof(Config.action));
 
        int i, scancode;
        for (i = 0; buttons[i].gconf_key; i++) {
 
        int i, scancode;
        for (i = 0; buttons[i].gconf_key; i++) {
-               if (hgw_conf_request_int(hgw, buttons[i].gconf_key, &scancode) == HGW_ERR_NONE) {
-                       if (scancode <= 0 || scancode > 255) continue;
+               strcpy(relKey, buttons[i].gconf_key);
+               scancode = gconf_client_get_int(gcc, key, NULL);
 
 
-                       if (buttons[i].is_action) {
-                               Config.action[scancode] |= buttons[i].mask;
-                               if (buttons[i].mask & (kActionQuit | kActionToggleFullscreen)) {
-                                       quit_mapped = true;
-                               }
-                       } else {
-                               Config.joypad1Mapping[scancode] |= buttons[i].mask;
+               if (scancode <= 0 || scancode > 255) continue;
+
+               if (buttons[i].is_action) {
+                       Config.action[scancode] |= buttons[i].mask;
+                       if (buttons[i].mask & (kActionQuit | kActionToggleFullscreen)) {
+                               quit_mapped = true;
                        }
                        }
+               } else {
+                       Config.joypad1Mapping[scancode] |= buttons[i].mask;
                }
        }
 
                }
        }
 
+#if MAEMO && !CONF_EXIT_BUTTON
        // Safeguards
        if (!quit_mapped) {
                // Newbie user won't know how to quit game.
        // Safeguards
        if (!quit_mapped) {
                // Newbie user won't know how to quit game.
@@ -311,5 +303,6 @@ static void parseGConfKeyMappings()
        if (!Config.action[71] && !Config.joypad1Mapping[71]) {
                Config.action[71] = kActionQuit;
        }
        if (!Config.action[71] && !Config.joypad1Mapping[71]) {
                Config.action[71] = kActionQuit;
        }
+#endif
 }
 
 }
 
index 20698b5..885c5a2 100644 (file)
@@ -15,19 +15,5 @@ void HgwConfig();
 void HgwPollEvents();
 #endif
 
 void HgwPollEvents();
 #endif
 
-#define kGConfPath "/apps/maemo/drnoksnes"
-#define kGConfRomFile kGConfPath "/" "rom"
-#define kGConfSound kGConfPath "/" "sound"
-#define kGConfTurboMode kGConfPath "/" "turbo"
-#define kGConfFrameskip kGConfPath "/" "frameskip"
-#define kGConfTransparency kGConfPath "/" "transparency"
-#define kGConfScaler kGConfPath "/" "scaler"
-#define kGConfDisplayFramerate kGConfPath "/" "display-framerate"
-#define kGConfDisplayControls kGConfPath "/" "display-controls"
-#define kGConfSpeedhacks kGConfPath "/" "speedhacks"
-#define kGConfMapping kGConfPath "/" "mapping"
-#define kGConfKeysPath kGConfPath "/" "keys"
-
-
 #endif
 
 #endif
 
index 6abb423..8e510a6 100644 (file)
@@ -24,11 +24,12 @@ extern struct config {
        bool touchscreenInput;
        /** Display touchscreen controls grid */
        bool touchscreenShow;
        bool touchscreenInput;
        /** Display touchscreen controls grid */
        bool touchscreenShow;
+       /** If true, next time the main loop is entered application will close */
+       bool quitting;
        /** Current scancode->joypad mapping */
        unsigned short joypad1Mapping[256];
        /** Current scancode->joypad mapping */
        unsigned short joypad1Mapping[256];
+       unsigned short joypad2Mapping[256];
        unsigned char action[256];
        unsigned char action[256];
-       /** If true, next time the main loop is entered application will close */
-       bool quitting;
 } Config;
 
 // Video
 } Config;
 
 // Video