From 637930a378b1e098fab00108f542f8eb1b865488 Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Tue, 26 Jan 2010 19:21:57 +0100 Subject: [PATCH] new controls dialog; using gconf instead of hgw --- Makefile | 4 +- debian/changelog | 6 +- debian/rules | 12 +- gammatab.h | 22 --- gui/Makefile | 6 +- gui/buttons.inc | 28 +++ gui/controls.c | 458 ++++++++++++++++------------------------------ gui/drnoksnes.schemas.m4 | 110 ++++++++--- gui/gconf.h | 21 +++ gui/i18n/es_ES.po | 182 ++++++++++++------ gui/keys.c | 342 ++++++++++++++++++++++++++++++++++ gui/plugin.c | 5 +- gui/plugin.h | 13 +- gui/settings.c | 44 +++-- language.h | 328 --------------------------------- platform/hgw.cpp | 131 +++++++------ platform/hgw.h | 14 -- platform/platform.h | 5 +- 18 files changed, 887 insertions(+), 844 deletions(-) delete mode 100644 gammatab.h create mode 100644 gui/buttons.inc create mode 100644 gui/gconf.h create mode 100644 gui/keys.c delete mode 100644 language.h diff --git a/Makefile b/Makefile index 06844e3..e807f91 100644 --- a/Makefile +++ b/Makefile @@ -70,8 +70,8 @@ ifeq ($(CONF_HD), 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) diff --git a/debian/changelog b/debian/changelog index c3fe11c..01c3010 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,10 @@ 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 Thu, 21 Jan 2010 18:44:34 +0100 + -- Javier S. Pedro Sat, 23 Jan 2010 20:24:58 +0100 drnoksnes (1.2.5) unstable; urgency=low diff --git a/debian/rules b/debian/rules index a74a522..ceb692f 100755 --- a/debian/rules +++ b/debian/rules @@ -35,19 +35,21 @@ M4DEFS=-DMAEMO_MAJOR=$(MAEMO_VERSION) 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 diff --git a/gammatab.h b/gammatab.h deleted file mode 100644 index 60a0503..0000000 --- a/gammatab.h +++ /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} -}; diff --git a/gui/Makefile b/gui/Makefile index b147f4e..266b950 100644 --- a/gui/Makefile +++ b/gui/Makefile @@ -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_ +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 @@ -50,7 +52,7 @@ all: drnoksnes_plugin.so $(DATA_FILES) $(MO_FILES) drnoksnes_plugin.so: $(OBJS) $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ -$(POT): $(SRCS) +$(POT): $(SRCS) $(EXTRA_GETTEXT_SRCS) $(XGETTEXT) $(XGETTEXT_OPTS) -o$@ $^ $(MO_FILES): %.mo: %.po diff --git a/gui/buttons.inc b/gui/buttons.inc new file mode 100644 index 0000000..3b266fb --- /dev/null +++ b/gui/buttons.inc @@ -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 diff --git a/gui/controls.c b/gui/controls.c index c215585..e07d84f 100644 --- a/gui/controls.c +++ b/gui/controls.c @@ -20,363 +20,225 @@ * */ +#include #include #include #if MAEMO_VERSION >= 5 #include #include +#include #include +#include +#include +#include +#else +#include #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)); } diff --git a/gui/drnoksnes.schemas.m4 b/gui/drnoksnes.schemas.m4 index 6d79887..56e01b7 100644 --- a/gui/drnoksnes.schemas.m4 +++ b/gui/drnoksnes.schemas.m4 @@ -1,4 +1,8 @@ +define(`choose', `dnl +ifelse(eval(MAEMO_MAJOR < 5), 1, `$1', `$2')dnl> +')dnl +define(`N_', `$*')dnl @@ -15,20 +19,6 @@ - /schemas/apps/maemo/drnoksnes/display-controls - /apps/maemo/drnoksnes/display-controls - drnoksnes - bool - false - - Display onscreen controls - - Display a grid with the onscreen controls if touchscreen controls - are enabled. - - - - /schemas/apps/maemo/drnoksnes/frameskip /apps/maemo/drnoksnes/frameskip drnoksnes @@ -42,19 +32,6 @@ - /schemas/apps/maemo/drnoksnes/mapping - /apps/maemo/drnoksnes/mapping - drnoksnes - int - 1 - - Key mapping setting - - Set to 0 for None, 1 for Keyboard only, etc. - - - - /schemas/apps/maemo/drnoksnes/rom /apps/maemo/drnoksnes/rom drnoksnes @@ -134,5 +111,84 @@ + + /schemas/apps/maemo/drnoksnes/player1/keyboard/enable + /apps/maemo/drnoksnes/player1/keyboard/enable + drnoksnes + bool + true + + Player 1 keyboard + + Enable key mappings for player 1. + + + +dnl Player 1 keybindings +define(`HELP', `')dnl +define(`BUTTON', `dnl + + /schemas/apps/maemo/drnoksnes/player1/keyboard/$2 + /apps/maemo/drnoksnes/player1/keyboard/$2 + drnoksnes + int + choose($4,$5) + + $1 button + + +dnl')dnl +define(`ACTION', `dnl + + /schemas/apps/maemo/drnoksnes/player1/keyboard/$2 + /apps/maemo/drnoksnes/player1/keyboard/$2 + drnoksnes + int + choose($4,$5) + + $1 action + + +dnl')dnl +define(`LAST', `')dnl +include(buttons.inc)dnl +undefine(`HELP')dnl +undefine(`BUTTON')dnl +undefine(`ACTION')dnl +undefine(`LAST')dnl + + /schemas/apps/maemo/drnoksnes/player2/keyboard/enable + /apps/maemo/drnoksnes/player2/keyboard/enable + drnoksnes + bool + false + + Player 2 keyboard + + Enable key mappings for player 2. + + + +dnl Player 2 keybindings +define(`HELP', `')dnl +define(`BUTTON', `dnl + + /schemas/apps/maemo/drnoksnes/player2/keyboard/$2 + /apps/maemo/drnoksnes/player2/keyboard/$2 + drnoksnes + int + 0 + + $1 button + + +dnl')dnl +define(`ACTION', `')dnl +define(`LAST', `')dnl +include(buttons.inc) +undefine(`HELP')dnl +undefine(`BUTTON')dnl +undefine(`ACTION')dnl +undefine(`LAST')dnl diff --git a/gui/gconf.h b/gui/gconf.h new file mode 100644 index 0000000..c7ae3d0 --- /dev/null +++ b/gui/gconf.h @@ -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 + diff --git a/gui/i18n/es_ES.po b/gui/i18n/es_ES.po index 1f70fc8..0d75992 100644 --- a/gui/i18n/es_ES.po +++ b/gui/i18n/es_ES.po @@ -8,7 +8,7 @@ msgid "" 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 \n" "Language-Team: Spanish \n" @@ -23,140 +23,187 @@ msgstr "" msgid "" msgstr "" -#: 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" @@ -164,11 +211,44 @@ 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" - diff --git a/gui/keys.c b/gui/keys.c new file mode 100644 index 0000000..1a998c5 --- /dev/null +++ b/gui/keys.c @@ -0,0 +1,342 @@ +/* +* This file is part of DrNokSnes +* +* Copyright (C) 2009 Javier S. Pedro +* +* 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 +#include +#include + +#if MAEMO_VERSION >= 5 +#include +#include +#include +#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)); +} + diff --git a/gui/plugin.c b/gui/plugin.c index f876901..f1cde36 100644 --- a/gui/plugin.c +++ b/gui/plugin.c @@ -42,8 +42,8 @@ #include #endif -#include "../platform/hgw.h" #include "plugin.h" +#include "gconf.h" #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) { - controls_setup(); 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); } - - controls_setup(); } static GtkWidget **load_menu(guint *nitems) diff --git a/gui/plugin.h b/gui/plugin.h index 090ff93..cd94ffb 100644 --- a/gui/plugin.h +++ b/gui/plugin.h @@ -23,13 +23,16 @@ void save_load(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); +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); diff --git a/gui/settings.c b/gui/settings.c index aa37982..9354de4 100644 --- a/gui/settings.c +++ b/gui/settings.c @@ -36,8 +36,8 @@ #include #endif -#include "../platform/hgw.h" #include "plugin.h" +#include "gconf.h" #include "i18n.h" struct scaler { @@ -46,14 +46,11 @@ 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 @@ -69,7 +66,7 @@ static struct scaler scalers[] = { 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; @@ -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); @@ -111,6 +120,8 @@ static void load_settings() 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); @@ -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) { - controls_dialog(GTK_WINDOW(dialog)); + controls_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data)); } 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_set_title_alignment(button, 0.0, 0.5); - hildon_button_set_value_alignment(button, 0.0, 0.5);*/ } #endif @@ -167,7 +176,7 @@ void settings_dialog(GtkWindow* parent) { 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 @@ -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, - _("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); @@ -263,7 +281,7 @@ void settings_dialog(GtkWindow* parent) 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 diff --git a/language.h b/language.h deleted file mode 100644 index 5c721a5..0000000 --- a/language.h +++ /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)." diff --git a/platform/hgw.cpp b/platform/hgw.cpp index bccc6ed..bf19736 100644 --- a/platform/hgw.cpp +++ b/platform/hgw.cpp @@ -2,9 +2,15 @@ #include #include +#include "snes9x.h" + +#include +#include +#include + #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__ ); \ @@ -12,12 +18,11 @@ abort(); \ } while (0); - bool hgwLaunched; static HgwContext *hgw; static void createActionMappingsOnly(); -static void parseGConfKeyMappings(); +static void parseGConfKeyMappings(GConfClient* gcc); void HgwInit() { @@ -30,6 +35,7 @@ void HgwInit() return; } + g_type_init(); hgw = hgw_context_init(); if (!hgw) { @@ -55,6 +61,8 @@ void HgwConfig() { if (!hgwLaunched) return; + GConfClient *gcc = gconf_client_get_default(); + Config.fullscreen = true; char romFile[PATH_MAX + 1]; @@ -99,10 +107,12 @@ void HgwConfig() 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) { @@ -123,37 +133,17 @@ void HgwConfig() < 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); @@ -175,6 +165,8 @@ void HgwConfig() Config.quitting = true; break; } + + g_object_unref(G_OBJECT(gcc)); } void HgwPollEvents() @@ -214,7 +206,7 @@ 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; @@ -224,67 +216,67 @@ typedef struct 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. @@ -311,5 +303,6 @@ static void parseGConfKeyMappings() if (!Config.action[71] && !Config.joypad1Mapping[71]) { Config.action[71] = kActionQuit; } +#endif } diff --git a/platform/hgw.h b/platform/hgw.h index 20698b5..885c5a2 100644 --- a/platform/hgw.h +++ b/platform/hgw.h @@ -15,19 +15,5 @@ void HgwConfig(); 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 diff --git a/platform/platform.h b/platform/platform.h index 6abb423..8e510a6 100644 --- a/platform/platform.h +++ b/platform/platform.h @@ -24,11 +24,12 @@ extern struct config { 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 -- 1.7.9.5