adding frameskip and speedhacks options on gui
authorJavier S. Pedro <maemo@javispedro.com>
Tue, 18 Aug 2009 18:47:54 +0000 (20:47 +0200)
committerJavier S. Pedro <maemo@javispedro.com>
Tue, 18 Aug 2009 18:47:54 +0000 (20:47 +0200)
Also, setting initial folder and extension for snapshot saves.

gui/plugin.c
gui/save.c
platform/hgw.cpp
platform/hgw.h

index fe088dd..6bfe13c 100644 (file)
@@ -60,6 +60,9 @@ gchar* current_rom_file = 0;
 static GtkLabel* rom_label;
 static GtkCheckButton* audio_check;
 static GtkCheckButton* turbo_check;
+static GtkSpinButton* frameskip_spin;
+static GtkCheckButton* auto_framerate_check;
+static GtkComboBox* speedhacks_combo;
 
 static void set_rom(const char * rom_file)
 {
@@ -67,7 +70,7 @@ static void set_rom(const char * rom_file)
        if (current_rom_file) g_free(current_rom_file);
 
        current_rom_file = g_strdup(rom_file);
-       gtk_label_set_text(GTK_LABEL(rom_label), rom_file);
+       gtk_label_set_text(GTK_LABEL(rom_label), rom_file); // TODO UTF-8
 
        game_state_update();
        save_clear();
@@ -112,6 +115,15 @@ static void select_rom_callback(GtkWidget * button, gpointer data)
        }
 }
 
+static void auto_framerate_callback(GtkWidget * button, gpointer data)
+{
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_framerate_check))) {
+               gtk_widget_set_sensitive(GTK_WIDGET(frameskip_spin), FALSE);
+       } else {
+               gtk_widget_set_sensitive(GTK_WIDGET(frameskip_spin), TRUE);
+       }
+}
+
 static GtkWidget * load_plugin(void)
 {
        g_type_init();
@@ -120,36 +132,77 @@ static GtkWidget * load_plugin(void)
        GtkWidget* parent = gtk_vbox_new(FALSE, HILDON_MARGIN_DEFAULT);
        GtkWidget* rom_hbox = gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT);
        GtkWidget* opt_hbox = gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT);
+       GtkWidget* opt2_hbox = gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT);
 
        GtkWidget* selectRomBtn = gtk_button_new_with_label("Select ROM...");
        rom_label = GTK_LABEL(gtk_label_new(NULL));
 
+       GtkContainer* audio_cont =
+               GTK_CONTAINER(gtk_alignment_new(0.0, 0.0, 0.0, 0.0));
        audio_check =
                GTK_CHECK_BUTTON(gtk_check_button_new_with_label("Enable audio"));
+       GtkWidget* framerate_label = gtk_label_new("Frameskip:");
+       frameskip_spin =
+               GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0.0, 10.0, 1.0));
+       auto_framerate_check =
+               GTK_CHECK_BUTTON(gtk_check_button_new_with_label("Auto"));
        turbo_check =
-               GTK_CHECK_BUTTON(gtk_check_button_new_with_label("Turbo mode"));        
-
+               GTK_CHECK_BUTTON(gtk_check_button_new_with_label("Turbo mode"));
+       GtkContainer* speedhacks_cont =
+               GTK_CONTAINER(gtk_alignment_new(1.0, 0.0, 0.0, 0.0));
+       speedhacks_combo =
+               GTK_COMBO_BOX(gtk_combo_box_new_text());
 
        gtk_widget_set_size_request(GTK_WIDGET(selectRomBtn),
-                                                               180, 50);
+                                                               180, 46);
+       gtk_combo_box_append_text(speedhacks_combo, "No speedhacks");
+       gtk_combo_box_append_text(speedhacks_combo, "Safe hacks only");
+       gtk_combo_box_append_text(speedhacks_combo, "All speedhacks");
+
 
        gtk_box_pack_start(GTK_BOX(rom_hbox), selectRomBtn, FALSE, FALSE, 0);
-       gtk_box_pack_end(GTK_BOX(rom_hbox), GTK_WIDGET(rom_label), TRUE, TRUE, 0);
-       gtk_box_pack_start(GTK_BOX(opt_hbox), GTK_WIDGET(audio_check), FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(rom_hbox), GTK_WIDGET(rom_label), TRUE, TRUE, 0);
+
+       gtk_container_add(audio_cont, GTK_WIDGET(audio_check));
+       gtk_box_pack_start(GTK_BOX(opt_hbox), GTK_WIDGET(audio_cont), TRUE, TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(opt_hbox), framerate_label, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(opt_hbox), GTK_WIDGET(frameskip_spin), FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(opt_hbox), GTK_WIDGET(auto_framerate_check), FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(opt_hbox), GTK_WIDGET(turbo_check), FALSE, FALSE, 0);
+
+       gtk_container_add(speedhacks_cont, GTK_WIDGET(speedhacks_combo));
+       gtk_box_pack_start(GTK_BOX(opt2_hbox), GTK_WIDGET(speedhacks_cont), TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(parent), rom_hbox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(parent), opt_hbox, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(parent), opt2_hbox, FALSE, FALSE, 0);
 
-       // Load current configuration from gconf
+       // Load current configuration from GConf
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(audio_check),
                !gconf_client_get_bool(gcc, kGConfDisableAudio, NULL));
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(turbo_check),
                gconf_client_get_bool(gcc, kGConfTurboMode, NULL));
+
+       int frameskip = gconf_client_get_int(gcc, kGConfFrameskip, NULL);
+       if (frameskip <= 0) {
+               gtk_widget_set_sensitive(GTK_WIDGET(frameskip_spin), FALSE);
+               gtk_spin_button_set_value(frameskip_spin, 0);
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_framerate_check), TRUE);
+       } else {
+               gtk_widget_set_sensitive(GTK_WIDGET(frameskip_spin), TRUE);
+               gtk_spin_button_set_value(frameskip_spin, frameskip - 1);
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_framerate_check), FALSE);
+       }
+
+       gtk_combo_box_set_active(speedhacks_combo,
+               gconf_client_get_int(gcc, kGConfSpeedhacks, NULL));
+
        set_rom(gconf_client_get_string(gcc, kGConfRomFile, NULL));
 
        // Connect signals
        g_signal_connect(G_OBJECT(selectRomBtn), "clicked",
-                                       G_CALLBACK (select_rom_callback), NULL);
+                                       G_CALLBACK(select_rom_callback), NULL);
+       g_signal_connect(G_OBJECT(auto_framerate_check), "toggled",
+                                       G_CALLBACK(auto_framerate_callback), NULL);
 
        return parent;
 }
@@ -167,10 +220,20 @@ static void unload_plugin(void)
 
 static void write_config(void)
 {
+       // Write settings to GConf
        gconf_client_set_bool(gcc, kGConfDisableAudio,
                gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(audio_check)), NULL);
        gconf_client_set_bool(gcc, kGConfTurboMode,
                gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(turbo_check)), NULL);
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_framerate_check))) {
+               gconf_client_set_int(gcc, kGConfFrameskip, 0, NULL);
+       } else {
+               gconf_client_set_int(gcc, kGConfFrameskip,
+                       gtk_spin_button_get_value(frameskip_spin) + 1, NULL);
+       }
+       gconf_client_set_int(gcc, kGConfSpeedhacks,
+               gtk_combo_box_get_active(speedhacks_combo), NULL);
+
        if (current_rom_file) {
                gconf_client_set_string(gcc, kGConfRomFile, current_rom_file, NULL);
        } else {
index 0b34204..006394e 100644 (file)
 #include <libgnomevfs/gnome-vfs-ops.h>
 #include <libgnomevfs/gnome-vfs-xfer.h>
 #include <hildon/hildon-file-chooser-dialog.h>
+#include <hildon/hildon-banner.h>
 
 #include "plugin.h"
 
 static gchar * cur_save_uri = NULL;
 
 // Pulling nearly all of gnomevfs just to copy a file. *sigh*.
-static void copy_file(const char * source_uri, const char * dest_uri)
+static GnomeVFSResult copy_file(const char * source_uri, const char * dest_uri)
 {
        GnomeVFSURI* src = gnome_vfs_uri_new(source_uri);
        GnomeVFSURI* dst = gnome_vfs_uri_new(dest_uri);
@@ -49,6 +50,19 @@ static void copy_file(const char * source_uri, const char * dest_uri)
 
        gnome_vfs_uri_unref(src);
        gnome_vfs_uri_unref(dst);
+
+       return res;
+}
+
+static gboolean show_result(GnomeVFSResult res, GtkWindow* parent, const char* msg)
+{
+       if (res == GNOME_VFS_OK) {
+               hildon_banner_show_information(GTK_WIDGET(parent), NULL, msg);
+               return TRUE;
+       } else {
+               hildon_banner_show_information(GTK_WIDGET(parent), NULL, "Failed");
+               return FALSE;
+       }
 }
 
 void save_clear()
@@ -71,7 +85,15 @@ static gchar * show_dialog(GtkWindow* parent, GtkFileChooserAction action)
        dialog = hildon_file_chooser_dialog_new_with_properties(GTK_WINDOW(parent), 
                "action", action, "local-only", FALSE, "filter", filter, NULL);
 
-       // TODO Default path
+       hildon_file_chooser_dialog_set_extension(HILDON_FILE_CHOOSER_DIALOG(dialog),
+               "snsg");
+#if defined(MAEMO)
+       {
+               gchar * games_dir = g_strdup_printf("%s/.games", g_getenv("MYDOCSDIR"));
+               gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), games_dir);
+               g_free(games_dir);
+       }
+#endif
 
        gtk_widget_show_all(GTK_WIDGET(dialog));
        if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) {
@@ -90,10 +112,10 @@ void save_load(GtkWindow* parent)
        if (uri) {
                const gchar * frz_file = game_state_get_frz_file();
                gchar * frz_uri = gnome_vfs_get_uri_from_local_path(frz_file);
-               copy_file(uri, frz_uri);
+               show_result(copy_file(uri, frz_uri), parent, "Game loaded");
                g_free(frz_uri);
        }
-       
+
        if (cur_save_uri) {
                g_free(cur_save_uri);
        }
@@ -105,7 +127,7 @@ void save_save(GtkWindow* parent)
        if (cur_save_uri) {
                const gchar * frz_file = game_state_get_frz_file();
                gchar * frz_uri = gnome_vfs_get_uri_from_local_path(frz_file);
-               copy_file(frz_uri, cur_save_uri);
+               show_result(copy_file(frz_uri, cur_save_uri), parent, "Game saved");
                g_free(frz_uri);
        } else {
                save_save_as(parent);
@@ -119,9 +141,11 @@ void save_save_as(GtkWindow* parent)
        if (uri) {
                const gchar * frz_file = game_state_get_frz_file();
                gchar * frz_uri = gnome_vfs_get_uri_from_local_path(frz_file);
-               copy_file(frz_uri, uri);
+               gboolean res = show_result(copy_file(frz_uri, uri), parent, "Game saved");
                g_free(frz_uri);
 
+               if (!res) return;
+
                if (cur_save_uri) {
                        g_free(cur_save_uri);
                }
index f39d10e..091a8ad 100644 (file)
@@ -72,6 +72,25 @@ void HgwConfig()
                Settings.TurboMode = turbo ? TRUE : FALSE;
        }
 
+       int frameskip = 0;
+       if (hgw_conf_request_int(hgw, kGConfFrameskip, &frameskip) == HGW_ERR_NONE) {
+               Settings.SkipFrames = (frameskip > 0 ? frameskip : AUTO_FRAMERATE);
+       }
+
+       int speedhacks = 0;
+       if (hgw_conf_request_int(hgw, kGConfFrameskip, &speedhacks) == HGW_ERR_NONE) {
+               if (speedhacks <= 0) {
+                       Settings.HacksEnabled = FALSE;
+                       Settings.HacksFilter = FALSE;
+               } else if (speedhacks == 1) {
+                       Settings.HacksEnabled = TRUE;
+                       Settings.HacksFilter = TRUE;
+               } else {
+                       Settings.HacksEnabled = TRUE;
+                       Settings.HacksFilter = FALSE;
+               }
+       }
+
        HgwStartCommand cmd = hgw_context_get_start_command(hgw);
        switch (cmd) {
                default:
index eb5d8db..a953b6f 100644 (file)
@@ -14,6 +14,8 @@ void HgwPollEvents();
 #define kGConfRomFile kGConfPath "rom"
 #define kGConfDisableAudio kGConfPath "no_audio"
 #define kGConfTurboMode kGConfPath "turbo"
+#define kGConfFrameskip kGConfPath "frameskip"
+#define kGConfSpeedhacks kGConfPath "speedhacks"
 
 #endif