+++ /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 <gtk/gtk.h>
-#include <hildon/hildon-helper.h>
-
-#if MAEMO_VERSION >= 5
-#include <hildon/hildon-gtk.h>
-#include <hildon/hildon-check-button.h>
-#else
-#include <hildon/hildon-caption.h>
-#endif
-
-#include "../platform/hgw.h"
-#include "plugin.h"
-
-static GtkDialog* dialog;
-#if MAEMO_VERSION >= 5
-static HildonCheckButton* accu_check;
-#else
-#include <hildon/hildon-caption.h>
-static GtkCheckButton* xsp_check;
-#endif
-
-static void load_settings()
-{
-#if MAEMO_VERSION >= 5
- hildon_check_button_set_active(accu_check,
- gconf_client_get_bool(gcc, kGConfTransparency, NULL));
-#else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsp_check),
- gconf_client_get_bool(gcc, kGConfXSP, NULL));
-#endif
-}
-
-static void save_settings()
-{
-#if MAEMO_VERSION >= 5
- gconf_client_set_bool(gcc, kGConfTransparency,
- hildon_check_button_get_active(accu_check), NULL);
-#else
- gconf_client_set_bool(gcc, kGConfXSP,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(xsp_check)), NULL);
-#endif
-}
-
-static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
-{
- if (response == GTK_RESPONSE_OK) {
- save_settings();
- }
-
- gtk_widget_destroy(GTK_WIDGET(dialog));
-}
-
-void advanced_dialog(GtkWindow* parent)
-{
- dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("Advanced settings",
- parent, GTK_DIALOG_MODAL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
-
-#if MAEMO_VERSION >= 5
- accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
- HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
- gtk_button_set_label(GTK_BUTTON(accu_check), "Accurate graphics");
- gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(accu_check), FALSE, FALSE, 0);
-#else
- xsp_check = GTK_CHECK_BUTTON(gtk_check_button_new());
- GtkWidget* xsp_caption = hildon_caption_new(NULL,
- "Use hardware scaling", GTK_WIDGET(xsp_check), NULL,
- HILDON_CAPTION_OPTIONAL);
- gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(xsp_caption));
-#endif
-
- load_settings();
-
-#if MAEMO_VERSION >= 5
- gtk_window_resize(GTK_WINDOW(dialog), 800, 300);
-#else
- gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
-#endif
-
- g_signal_connect(G_OBJECT(dialog), "response",
- G_CALLBACK (cb_dialog_response), NULL);
-
- gtk_widget_show_all(GTK_WIDGET(dialog));
-}
-
</long>
</locale>
</schema>
-ifelse(eval(MAEMO_MAJOR < 5), 1, `dnl
<schema>
- <key>/schemas/apps/maemo/drnoksnes/xsp</key>
- <applyto>/apps/maemo/drnoksnes/xsp</applyto>
+ <key>/schemas/apps/maemo/drnoksnes/scaler</key>
+ <applyto>/apps/maemo/drnoksnes/scaler</applyto>
<owner>drnoksnes</owner>
- <type>bool</type>
- <default>true</default>
+ <type>string</type>
+ <default></default>
<locale name="C">
- <short>Pixel doubling</short>
+ <short>Scaler</short>
<long>
- Enable the use of the hardware pixel doubler. Without it,
- a slower, lower quality software scaler is used.
+ Name of the preferred scaler to use. Available scalers depend on
+ platform. Leave empty to select best scaler available.
</long>
</locale>
</schema>
-', `')dnl
<schema>
<key>/schemas/apps/maemo/drnoksnes/speedhacks</key>
<applyto>/apps/maemo/drnoksnes/speedhacks</applyto>
--- /dev/null
+#ifndef __I18N_H__
+#define __I18N_H__
+
+#define GETTEXT_PACKAGE "drnoksnes"
+
+#if CONF_NLS
+#include <libintl.h>
+#define _(String) dgettext(GETTEXT_PACKAGE, String)
+#ifdef gettext_noop
+#define N_(String) gettext_noop(String)
+#else
+#define N_(String) (String)
+#endif
+#else /* NLS is disabled */
+#define _(String) (String)
+#define N_(String) (String)
+#define textdomain(String) (String)
+#define gettext(String) (String)
+#define dgettext(Domain,String) (String)
+#define dcgettext(Domain,String,Type) (String)
+#define bindtextdomain(Domain,Directory) (Domain)
+#define bind_textdomain_codeset(Domain,Codeset) (Codeset)
+#endif /* CONF_NLS */
+
+#endif
+
#include "../platform/hgw.h"
#include "plugin.h"
+#include "i18n.h"
static GtkWidget * load_plugin(void);
static void unload_plugin(void);
controls_dialog(get_parent_window());
}
-static void advanced_item_callback(GtkWidget * button, gpointer data)
+static void settings_item_callback(GtkWidget * button, gpointer data)
{
- advanced_dialog(get_parent_window());
+ settings_dialog(get_parent_window());
}
static void about_item_callback(GtkWidget * button, gpointer data)
sound_check =
HILDON_CHECK_BUTTON(hildon_check_button_new(
HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
- gtk_button_set_label(GTK_BUTTON(sound_check), "Sound");
+ gtk_button_set_label(GTK_BUTTON(sound_check), _("Sound"));
framerate_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
- hildon_button_set_title(HILDON_BUTTON(framerate_picker), "Target framerate");
+ hildon_button_set_title(HILDON_BUTTON(framerate_picker),
+ _("Target framerate"));
HildonTouchSelector* framerate_sel =
HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
display_fps_check =
HILDON_CHECK_BUTTON(hildon_check_button_new(HILDON_SIZE_FINGER_HEIGHT));
gtk_button_set_label(GTK_BUTTON(display_fps_check),
- "Show while in game");
+ _("Show while in game"));
turbo_check =
HILDON_CHECK_BUTTON(hildon_check_button_new(HILDON_SIZE_FINGER_HEIGHT));
gtk_button_set_label(GTK_BUTTON(turbo_check),
*nitems = 3;
g_signal_connect(G_OBJECT(menu_items[0]), "clicked",
- G_CALLBACK(advanced_item_callback), NULL);
+ G_CALLBACK(settings_item_callback), NULL);
g_signal_connect(G_OBJECT(menu_items[1]), "clicked",
G_CALLBACK(controls_item_callback), NULL);
g_signal_connect(G_OBJECT(menu_items[2]), "clicked",
g_signal_connect(G_OBJECT(controls_item), "activate",
G_CALLBACK(controls_item_callback), NULL);
g_signal_connect(G_OBJECT(advanced_item), "activate",
- G_CALLBACK(advanced_item_callback), NULL);
+ G_CALLBACK(settings_item_callback), NULL);
g_signal_connect(G_OBJECT(menu_items[1]), "activate",
G_CALLBACK(about_item_callback), NULL);
#endif
void controls_setup();
void controls_dialog(GtkWindow* parent);
-/* advanced.c */
-void advanced_dialog(GtkWindow* parent);
+/* settings.c */
+void settings_dialog(GtkWindow* parent);
/* about.c */
void about_dialog(GtkWindow* parent);
--- /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 <gtk/gtk.h>
+#include <hildon/hildon-helper.h>
+
+#if MAEMO_VERSION >= 5
+#include <hildon/hildon-gtk.h>
+#include <hildon/hildon-check-button.h>
+#include <hildon/hildon-picker-button.h>
+#include <hildon/hildon-touch-selector.h>
+#else
+#include <hildon/hildon-caption.h>
+#endif
+
+#include "../platform/hgw.h"
+#include "plugin.h"
+#include "i18n.h"
+
+struct scaler {
+ const char * id;
+ const char * name;
+};
+
+static struct scaler scalers[] = {
+#if MAEMO_VERSION == 5
+#ifdef __arm__
+ {"hdarm2x", N_("Simple 2x zoom (fast)")},
+#else
+ {"hdsoft2x", N_("Simple 2x zoom")},
+#endif /* __arm__ */
+ {"hdfill", N_("Fill the entire screen")},
+#elif MAEMO_VERSION == 4
+#ifdef __arm__
+ {"xsp", N_("Antialiased 2x zoom (fast)")},
+ {"arm2x", N_("Simple 2x zoom")},
+#else
+ {"soft2x", N_("Simple 2x zoom")},
+#endif /* __arm__ */
+#endif /* MAEMO_VERSION */
+ {"none", N_("Original size")},
+};
+
+static GtkDialog* dialog;
+#if MAEMO_VERSION >= 5
+static HildonCheckButton* accu_check;
+static HildonPickerButton* scaler_picker;
+#else
+static GtkComboBox* scaler_combo;
+#endif
+
+static int find_scaler(const char * id)
+{
+
+}
+
+static void fill_scaler_list(GtkWidget* w)
+{
+ for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) {
+#if MAEMO_VERSION >= 5
+ hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(w),
+ _(scalers[i].name));
+#else
+ gtk_combo_box_append_text(GTK_COMBO_BOX(w), _(scalers[i].name));
+#endif
+ }
+}
+
+static void load_settings()
+{
+#if MAEMO_VERSION >= 5
+ hildon_check_button_set_active(accu_check,
+ gconf_client_get_bool(gcc, kGConfTransparency, NULL));
+#else
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsp_check),
+ gconf_client_get_bool(gcc, kGConfXSP, NULL));
+#endif
+}
+
+static void save_settings()
+{
+#if MAEMO_VERSION >= 5
+ gconf_client_set_bool(gcc, kGConfTransparency,
+ hildon_check_button_get_active(accu_check), NULL);
+#else
+ gconf_client_set_bool(gcc, kGConfXSP,
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(xsp_check)), NULL);
+#endif
+}
+
+static void cb_dialog_response(GtkWidget * button, gint response, gpointer data)
+{
+ if (response == GTK_RESPONSE_OK) {
+ save_settings();
+ }
+
+ gtk_widget_destroy(GTK_WIDGET(dialog));
+}
+
+#if MAEMO_VERSION >= 5
+static void set_button_layout(HildonButton* button, GtkSizeGroup* sizegroup)
+{
+ hildon_button_add_title_size_group(button, sizegroup);
+ hildon_button_add_value_size_group(button, sizegroup);
+ 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
+
+void settings_dialog(GtkWindow* parent)
+{
+ dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("Settings",
+ parent, GTK_DIALOG_MODAL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_OK,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL));
+
+#if MAEMO_VERSION >= 5
+ GtkSizeGroup * size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+ accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new(
+ HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT));
+ gtk_button_set_label(GTK_BUTTON(accu_check), "Accurate graphics");
+ set_button_layout(HILDON_BUTTON(accu_check), size_group);
+
+ scaler_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new(
+ HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
+ HILDON_BUTTON_ARRANGEMENT_VERTICAL));
+ hildon_button_set_title(HILDON_BUTTON(scaler_picker), "Zoom");
+ set_button_layout(HILDON_BUTTON(scaler_picker), size_group);
+
+ HildonTouchSelector* scaler_sel =
+ HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
+ fill_scaler_list(GTK_WIDGET(scaler_sel));
+ hildon_picker_button_set_selector(scaler_picker, scaler_sel);
+
+ gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(accu_check),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(scaler_picker),
+ FALSE, FALSE, 0);
+
+ g_object_unref(size_group);
+#else
+ xsp_check = GTK_CHECK_BUTTON(gtk_check_button_new());
+ GtkWidget* xsp_caption = hildon_caption_new(NULL,
+ "Use hardware scaling", GTK_WIDGET(xsp_check), NULL,
+ HILDON_CAPTION_OPTIONAL);
+ gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(xsp_caption));
+#endif
+
+ load_settings();
+
+#if MAEMO_VERSION >= 5
+ gtk_window_resize(GTK_WINDOW(dialog), 800, 300);
+#else
+ gtk_window_resize(GTK_WINDOW(dialog), 400, 200);
+#endif
+
+ g_signal_connect(G_OBJECT(dialog), "response",
+ G_CALLBACK (cb_dialog_response), NULL);
+
+ gtk_widget_show_all(GTK_WIDGET(dialog));
+}
+
Settings.Transparency = transparency ? TRUE : FALSE;
}
-#if CONF_XSP
- char xsp = TRUE;
- if (hgw_conf_request_bool(hgw, kGConfXSP, &xsp) == HGW_ERR_NONE) {
- if (!xsp) {
- free(Config.scaler);
- Config.scaler = strdup("2x");
- }
+ char scaler[NAME_MAX];
+ if (hgw_conf_request_bool(hgw, kGConfScaler, scaler) == HGW_ERR_NONE
+ && strlen(scaler) > 0) {
+ free(Config.scaler);
+ Config.scaler = strdup(scaler);
}
-#endif
char displayFramerate = FALSE;
if (hgw_conf_request_bool(hgw, kGConfDisplayFramerate, &displayFramerate) == HGW_ERR_NONE) {
#define kGConfDisplayFramerate kGConfPath "/" "display-framerate"
#define kGConfDisplayControls kGConfPath "/" "display-controls"
#define kGConfSpeedhacks kGConfPath "/" "speedhacks"
-#define kGConfXSP kGConfPath "/" "xsp"
#define kGConfMapping kGConfPath "/" "mapping"
#define kGConfKeysPath kGConfPath "/" "keys"
m_surface = reinterpret_cast<uint8*>(malloc(w * h * m_Bpp));
}
public:
- ~SWScaler()
+ virtual ~SWScaler()
{
free(m_surface);
};
static const Factory factory;
- const char * getName() const
+ virtual const char * getName() const
{
return "software 2x scaling";
}
m_surface = reinterpret_cast<uint8*>(malloc(w * h * m_Bpp));
}
public:
- ~ARMScaler()
+ virtual ~ARMScaler()
{
free(m_surface);
};
static const Factory factory;
- const char * getName() const
+ virtual const char * getName() const
{
return "software ARM 2x scaling";
}
}
};
const HDSW::Factory HDSW::factory;
-#endif
+
+#ifdef __arm__
+class HDARM : public ARMScaler
+{
+ HDARM(SDL_Surface* screen, int w, int h)
+ : SWScaler(screen, w, h)
+ {
+ hildon_set_non_compositing(true);
+ }
+
+public:
+ ~HDARM()
+ {
+ hildon_set_non_compositing(false);
+ };
+
+ class Factory : public ScalerFactory
+ {
+ const char * getName() const
+ {
+ return "hdarm2x";
+ }
+
+ bool canEnable(int bpp, int w, int h) const
+ {
+ return Config.fullscreen; // This makes sense only in fullscreen
+ }
+
+ Scaler* instantiate(SDL_Surface* screen, int w, int h) const
+ {
+ return new HDARM(screen, w, h);
+ }
+ };
+
+ static const Factory factory;
+
+ const char * getName() const
+ {
+ return "compositor disabled and software ARM 2x scaling";
+ }
+};
+const HDSW::Factory HDSW::factory;
+#endif /* __arm__ */
+#endif /* CONF_HD */
#if CONF_XSP
class XSPScaler : public Scaler
static const ScalerFactory* scalers[] = {
/* More useful scalers come first */
+#if CONF_HD && defined(__arm__)
+ &HDARM::factory, /* non-composited arm 2x scaling */
+#endif
#if CONF_HD
- &HDFillScaler::factory,
- &HDSquareScaler::factory,
+ &HDSquareScaler::factory, /* h-d assisted square scaling */
+ &HDSW::factory, /* non-composited soft 2x scaling */
#endif
#if CONF_XSP
- &XSPScaler::factory,
+ &XSPScaler::factory, /* n8x0 pixel doubling */
#endif
#ifdef __arm__
- &ARMScaler::factory,
+ &ARMScaler::factory, /* arm 2x scaling */
#endif
+ &SWScaler::factory, /* soft 2x scaling */
#if CONF_HD
- &HDSW::factory,
+ &HDDummy::factory, /* non composited */
#endif
- &SWScaler::factory,
+ &DummyScaler::factory, /* failsafe */
+/* The following scalers will not be automatically enabled, no matter what */
#if CONF_HD
- &HDDummy::factory,
+ &HDFillScaler::factory,
#endif
- &DummyScaler::factory,
};
/* Entry point functions */