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)
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
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
- # 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)))
- CFLAGS += -O2
+ CFLAGS += -O2 -ffast-math
GUI_CFLAGS += -O2
else
- # Don't support anything else yet
+ # Don't support anything else
crash
endif
+++ /dev/null
-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}
-};
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
drnoksnes_plugin.so: $(OBJS)
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
-$(POT): $(SRCS)
+$(POT): $(SRCS) $(EXTRA_GETTEXT_SRCS)
$(XGETTEXT) $(XGETTEXT_OPTS) -o$@ $^
$(MO_FILES): %.mo: %.po
--- /dev/null
+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
*
*/
+#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-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
-#include "../platform/hgw.h"
#include "plugin.h"
-#include "cellrendererkey.h"
+#include "gconf.h"
#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
-static HildonCheckButton* ts_show_check;
+static HildonCheckButton* keys_chk;
+static HildonButton* keys_btn;
+static HildonCheckButton* touch_chk;
+static HildonCheckButton* touch_show_chk;
#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
- 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
- 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
- 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,
- 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
- 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
- ts_show_check =
- GTK_CHECK_BUTTON(gtk_check_button_new_with_label("Show onscreen buttons"));
#endif
+ load_settings();
+
#if MAEMO_VERSION >= 5
- gtk_window_resize(GTK_WINDOW(dialog), 800, 380);
+ gtk_window_resize(GTK_WINDOW(dialog), 800, 360);
#else
- gtk_window_resize(GTK_WINDOW(dialog), 600, 340);
+ gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
#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(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));
}
<?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>
</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>
</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>
</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>
--- /dev/null
+#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
+
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"
msgid "<no rom selected>"
msgstr "<sin rom seleccionada>"
-#: plugin.c:234
+#: plugin.c:233
msgid "ROM"
msgstr "ROM"
-#: plugin.c:252
+#: plugin.c:251
msgid "Select ROM..."
msgstr "Seleccionar ROM..."
-#: plugin.c:269
+#: plugin.c:268
msgid "Sound"
msgstr "Sonido"
-#: plugin.c:275
+#: plugin.c:274
msgid "Target framerate"
msgstr "Velocidad objetivo"
-#: plugin.c:292
+#: plugin.c:291
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"
-#: plugin.c:311
+#: plugin.c:310
msgid "Enable sound"
msgstr "Activar sonido"
-#: plugin.c:316
+#: plugin.c:315
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"
-#: plugin.c:339
+#: plugin.c:338
msgid "Framerate:"
msgstr "Velocidad:"
-#: plugin.c:348
-#: settings.c:231
+#: plugin.c:347 settings.c:249
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"
-#: plugin.c:350
-#: settings.c:233
+#: plugin.c:349 settings.c:251
msgid "All speedhacks"
msgstr "Todos los hacks"
-#: plugin.c:449
+#: plugin.c:446
msgid "Settings…"
msgstr "Ajustes…"
-#: plugin.c:451
-#: plugin.c:460
+#: plugin.c:448 plugin.c:457
msgid "About…"
msgstr "Acerca de…"
-#: plugin.c:459
-#: settings.c:168
+#: plugin.c:456 settings.c:177
msgid "Settings"
msgstr "Ajustes"
-#: plugin.c:468
+#: plugin.c:465
msgid "Controls…"
msgstr "Controles…"
-#: plugin.c:472
+#: plugin.c:469
msgid "Advanced…"
msgstr "Avanzados…"
-#: plugin.c:534
+#: plugin.c:531
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"
-#: 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"
-#: settings.c:58
+#: settings.c:55
msgid "Fill the entire screen"
msgstr "Rellenar toda la pantalla"
-#: settings.c:61
+#: settings.c:58
msgid "Antialiased 2x zoom"
msgstr "Zoom 2x suavizado"
-#: settings.c:62
#: settings.c:64
-msgid "2x zoom"
-msgstr "Zoom 2x"
-
-#: settings.c:67
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"
-#: 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"
-#: settings.c:213
+#: settings.c:231
msgid "Zoom"
msgstr "Zoom"
-#: settings.c:225
+#: settings.c:243
msgid "Speedhacks"
msgstr "Speedhacks"
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"
+
#~ msgid "Simple 2x zoom (fast)"
#~ msgstr "Zoom 2X simple (rápido)"
+
#~ msgid "Original size"
#~ msgstr "Tamaño original"
-
--- /dev/null
+/*
+* 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));
+}
+
#include <hildon/hildon-caption.h>
#endif
-#include "../platform/hgw.h"
#include "plugin.h"
+#include "gconf.h"
#include "i18n.h"
static GtkWidget * load_plugin(void);
#if MAEMO_VERSION < 5
static void controls_item_callback(GtkWidget * button, gpointer data)
{
- controls_setup();
controls_dialog(get_parent_window());
}
#endif
if (current_rom_file) {
gconf_client_set_string(gcc, kGConfRomFile, current_rom_file, NULL);
}
-
- controls_setup();
}
static GtkWidget **load_menu(guint *nitems)
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);
+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);
#include <hildon/hildon-caption.h>
#endif
-#include "../platform/hgw.h"
#include "plugin.h"
+#include "gconf.h"
#include "i18n.h"
struct scaler {
};
static struct scaler scalers[] = {
+
#if MAEMO_VERSION == 5
-#if 0
#ifdef __arm__
- {"hdarm2x", ("2x zoom")},
-#else
- {"hdsoft2x", ("2x zoom")},
+ {"arm2x", N_("2x zoom")},
#endif /* __arm__ */
-#endif /* those above are not ready yet */
{"hdsq", N_("Scale to fit")},
{"hdfill", N_("Fill the entire screen")},
#elif MAEMO_VERSION == 4
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;
}
}
+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);
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);
#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,
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
{
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
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));
+ 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);
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
+++ /dev/null
-/*******************************************************************************
- 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)."
#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 "snes9x.h"
+#include "../gui/gconf.h"
#define DIE(format, ...) do { \
fprintf(stderr, "Died at %s:%d: ", __FILE__, __LINE__ ); \
abort(); \
} while (0);
-
bool hgwLaunched;
static HgwContext *hgw;
static void createActionMappingsOnly();
-static void parseGConfKeyMappings();
+static void parseGConfKeyMappings(GConfClient* gcc);
void HgwInit()
{
return;
}
+ g_type_init();
hgw = hgw_context_init();
if (!hgw) {
{
if (!hgwLaunched) return;
+ GConfClient *gcc = gconf_client_get_default();
+
Config.fullscreen = true;
char romFile[PATH_MAX + 1];
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;
}
+#endif
int speedhacks = 0;
if (hgw_conf_request_int(hgw, kGConfSpeedhacks, &speedhacks) == HGW_ERR_NONE) {
< 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);
Config.quitting = true;
break;
}
+
+ g_object_unref(G_OBJECT(gcc));
}
void HgwPollEvents()
// 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;
{ kGConfKeysPath "/" name, kAction##action, true }
#define BUTTON_LAST \
{ 0 }
+
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()
{
- // 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;
}
-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");
+ // 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++) {
- 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.
if (!Config.action[71] && !Config.joypad1Mapping[71]) {
Config.action[71] = kActionQuit;
}
+#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
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];
+ unsigned short joypad2Mapping[256];
unsigned char action[256];
- /** If true, next time the main loop is entered application will close */
- bool quitting;
} Config;
// Video