summaryrefslogtreecommitdiff
path: root/packages/kobodeluxe/files
diff options
context:
space:
mode:
authorRobert Schuster <thebohemian@gmx.net>2008-02-12 00:30:46 +0000
committerRobert Schuster <thebohemian@gmx.net>2008-02-12 00:30:46 +0000
commit4a0a8f2bbfcec5145178091c5703be7f5dfc034c (patch)
treefe94109b28c038c46ce5d0320b8cbc7ed31e1785 /packages/kobodeluxe/files
parent9a5744657866150cbaf433bd3b32253fe26421ea (diff)
kobodeluxe: Fixed and patches.
- provide default configuration file - added patch that makes use of a default config file - wire device screen size into default config file - added a patch that allows complete game control with touchscreen - added a patch that automatically swaps display dimensions at startup
Diffstat (limited to 'packages/kobodeluxe/files')
-rw-r--r--packages/kobodeluxe/files/buildfix.patch21
-rw-r--r--packages/kobodeluxe/files/default-config70
-rw-r--r--packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch236
-rw-r--r--packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch266
-rw-r--r--packages/kobodeluxe/files/kobodeluxe-putenv.patch69
-rw-r--r--packages/kobodeluxe/files/kobodeluxe-sysconf-support.patch84
6 files changed, 725 insertions, 21 deletions
diff --git a/packages/kobodeluxe/files/buildfix.patch b/packages/kobodeluxe/files/buildfix.patch
deleted file mode 100644
index 01a97e14f2..0000000000
--- a/packages/kobodeluxe/files/buildfix.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-Index: kobodeluxe-0.5.1/graphics/gfxengine.cpp
-===================================================================
---- kobodeluxe-0.5.1.orig/graphics/gfxengine.cpp 2008-02-10 03:02:29.000000000 +0100
-+++ kobodeluxe-0.5.1/graphics/gfxengine.cpp 2008-02-10 03:03:45.000000000 +0100
-@@ -25,6 +25,7 @@
-
- #include <string.h>
- #include <math.h>
-+#include <stdlib.h>
-
- #include "gfxengine.h"
- #include "filters.h"
-@@ -765,7 +766,7 @@
- return 0;
-
- if(_centered && !_fullscreen)
-- SDL_putenv((char *)"SDL_VIDEO_CENTERED=1");
-+ putenv((char *)"SDL_VIDEO_CENTERED=1");
-
- log_printf(DLOG, "Opening screen...\n");
- if(!SDL_WasInit(SDL_INIT_VIDEO))
diff --git a/packages/kobodeluxe/files/default-config b/packages/kobodeluxe/files/default-config
new file mode 100644
index 0000000000..4a8f5f7a96
--- /dev/null
+++ b/packages/kobodeluxe/files/default-config
@@ -0,0 +1,70 @@
+#--------------------------------------------
+# Kobo Deluxe 0.5.1 Configuration File
+#--------------------------------------------
+# Switches - [no]<switch>
+# Values - <key> [<value>|"<string>"]
+#--------------------------------------------
+#--- System options --------------------------
+nologfile
+logformat 0
+logverbosity 2
+#--- Input options --------------------------
+nojoystick
+joystick_no 0
+mouse
+mousemode 1
+nobroken_numdia
+dia_emphasis 0
+noalways_fire
+mousecapture
+#--- Game options ---------------------------
+scrollradar 2
+filter
+timefilter 50
+countdown 5
+starfield 2
+stars 250
+overheatloud 100
+cannonloud 100
+#--- Sound settings -------------------------
+nosound
+music
+nocached_sounds
+samplerate 8000
+latency 50
+mixquality 1
+vol 100
+intro_vol 100
+sfx_vol 100
+music_vol 30
+reverb 100
+vol_boost 0
+#--- Video settings -------------------------
+fullscreen
+videodriver 0
+width WIDTH_HERE
+height HEIGHT_HERE
+autoswap
+aspect 1
+depth 0
+maxfps 100
+maxfpsstrict 0
+buffer 0
+shadow
+videomode -1
+vsync
+videopages -1
+#--- Graphics settings ----------------------
+scalemode 0
+nodither
+dither_type 2
+nobroken_rgba8
+alpha
+brightness 100
+contrast 100
+#--- File paths -----------------------------
+files ""
+gfx ""
+sfx ""
+scores ""
+wait 30
diff --git a/packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch b/packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch
new file mode 100644
index 0000000000..273e523103
--- /dev/null
+++ b/packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch
@@ -0,0 +1,236 @@
+Index: KoboDeluxe-0.5.1/graphics/gfxengine.cpp
+===================================================================
+--- KoboDeluxe-0.5.1.orig/graphics/gfxengine.cpp 2008-02-11 13:17:27.000000000 +0100
++++ KoboDeluxe-0.5.1/graphics/gfxengine.cpp 2008-02-11 15:27:57.000000000 +0100
+@@ -135,11 +135,13 @@
+
+ _width = w;
+ _height = h;
++
+ if(csengine)
+ cs_engine_set_size(csengine, w, h);
+
+ if(was_showing)
+ show();
++
+ }
+
+ void gfxengine_t::centered(int c)
+@@ -759,33 +761,13 @@
+ Display show/hide
+ ----------------------------------------------------------*/
+
+-int gfxengine_t::show()
++/** Helper method that returns the flags value needed for
++ * SDL_SetVideoMode() and SDL_VideoModeOK().
++ */
++int gfxengine_t::video_flags()
+ {
+ int flags = 0;
+
+- if(!is_open)
+- return -1;
+-
+- if(is_showing)
+- return 0;
+-
+- if(_centered && !_fullscreen)
+-#if HAVE_DECL_SDL_PUTENV
+- SDL_putenv("SDL_VIDEO_CENTERED=1");
+-#elif defined(HAVE_PUTENV)
+- putenv("SDL_VIDEO_CENTERED=1");
+-#else
+- #error Neither SDL_putenv() nor putenv() are available. Fix it!
+-#endif
+-
+- log_printf(DLOG, "Opening screen...\n");
+- if(!SDL_WasInit(SDL_INIT_VIDEO))
+- if(SDL_InitSubSystem(SDL_INIT_VIDEO) == -1)
+- {
+- log_printf(ELOG, "Failed to initialize SDL!\n");
+- return -2;
+- }
+-
+ switch(_driver)
+ {
+ case GFX_DRIVER_SDL2D:
+@@ -830,11 +812,72 @@
+ glSDL_VSync(_vsync);
+ flags |= xflags;
+
++ return flags;
++}
++
++bool gfxengine_t::check_mode_autoswap(int *w, int *h)
++{
++ log_printf(VLOG, "Trying display modes %dx%d and %dx%d if the first fails.\n", *w, *h, *h, *w);
++
++ int flags = video_flags();
++
++ SDL_Surface *test_surface = NULL;
++
++ // On some platforms SDL_VideoModeOK() cannot be trusted unfortunately.
++ if(!(test_surface = SDL_SetVideoMode(*w, *h, _depth, flags)))
++ {
++ if(!(test_surface = SDL_SetVideoMode(*h, *w, _depth, flags)))
++ {
++ log_printf(ELOG, "Failed with both display mode. Giving up!\n");
++ return false;
++ }
++
++ int temp = *w;
++ *w = *h;
++ *h = temp;
++
++ log_printf(VLOG, "Display dimensions swapped. Using %dx%d!\n", *w, *h);
++ }
++ else
++ log_printf(VLOG, "Stored display dimension worked. Using %dx%d!\n", *w, *h);
++
++ SDL_FreeSurface(test_surface);
++
++ return true;
++}
++
++int gfxengine_t::show()
++{
++ if(!is_open)
++ return -1;
++
++ if(is_showing)
++ return 0;
++
++ if(_centered && !_fullscreen)
++#if HAVE_DECL_SDL_PUTENV
++ SDL_putenv("SDL_VIDEO_CENTERED=1");
++#elif defined(HAVE_PUTENV)
++ putenv("SDL_VIDEO_CENTERED=1");
++#else
++ #error Neither SDL_putenv() nor putenv() are available. Fix it!
++#endif
++
++ log_printf(DLOG, "Opening screen...\n");
++ if(!SDL_WasInit(SDL_INIT_VIDEO))
++ if(SDL_InitSubSystem(SDL_INIT_VIDEO) == -1)
++ {
++ log_printf(ELOG, "Failed to initialize SDL!\n");
++ return -2;
++ }
++
++ int flags = video_flags();
++
+ screen_surface = SDL_SetVideoMode(_width, _height, _depth, flags);
+ if(!screen_surface)
+ {
+- log_printf(ELOG, "Failed to open display!\n");
+- return -3;
++ log_printf(ELOG, "Failed to open display with %dx%d! Giving up.\n", _width, _height);
++ return -3;
+ }
+
+ if(_driver != GFX_DRIVER_GLSDL)
+Index: KoboDeluxe-0.5.1/graphics/gfxengine.h
+===================================================================
+--- KoboDeluxe-0.5.1.orig/graphics/gfxengine.h 2008-02-11 13:24:51.000000000 +0100
++++ KoboDeluxe-0.5.1/graphics/gfxengine.h 2008-02-11 15:15:50.000000000 +0100
+@@ -54,6 +54,9 @@
+ class gfxengine_t
+ {
+ friend class window_t;
++
++ int video_flags();
++
+ public:
+ gfxengine_t();
+ virtual ~gfxengine_t();
+@@ -135,6 +138,7 @@
+ void title(const char *win, const char *icon);
+
+ /* Display show/hide */
++ bool check_mode_autoswap(int *, int *);
+ int show();
+ void hide();
+
+Index: KoboDeluxe-0.5.1/kobo.cpp
+===================================================================
+--- KoboDeluxe-0.5.1.orig/kobo.cpp 2008-02-11 13:16:24.000000000 +0100
++++ KoboDeluxe-0.5.1/kobo.cpp 2008-02-11 14:57:29.000000000 +0100
+@@ -641,8 +641,27 @@
+ gengine->title("Kobo Deluxe " VERSION, "kobodl");
+ gengine->driver((gfx_drivers_t)p->videodriver);
+
++ // Initializes gfxengine with all kinds of display properties.
++ // We need this at this point to make the autoswap check work
++ // properly. Since these properties are independent of other
++ // values that is no problem.
++ gengine->mode(0, p->fullscreen);
++ gengine->doublebuffer(p->doublebuf);
++ gengine->pages(p->pages);
++ gengine->vsync(p->vsync);
++ gengine->shadow(p->shadow);
++ gengine->cursor(0);
++
++ // Do the auto swap dance only if configured so.
++ if (prefs->autoswap)
++ {
++ if (!gengine->check_mode_autoswap(&p->width, &p->height))
++ return -1;
++ }
++
+ dw = p->width;
+ dh = p->height;
++
+ if(p->fullscreen)
+ {
+ // This game assumes 1:1 pixel aspect ratio, or 4:3
+@@ -696,13 +715,6 @@
+ yoffs = (int)((dh - gh) / 2 / gengine->yscale());
+ gengine->size(dw, dh);
+
+- gengine->mode(0, p->fullscreen);
+- gengine->doublebuffer(p->doublebuf);
+- gengine->pages(p->pages);
+- gengine->vsync(p->vsync);
+- gengine->shadow(p->shadow);
+- gengine->cursor(0);
+-
+ gengine->period(game.speed);
+ sound.period(game.speed);
+ gengine->timefilter(p->timefilter * 0.01f);
+Index: KoboDeluxe-0.5.1/prefs.cpp
+===================================================================
+--- KoboDeluxe-0.5.1.orig/prefs.cpp 2008-02-11 14:28:01.000000000 +0100
++++ KoboDeluxe-0.5.1/prefs.cpp 2008-02-11 14:30:15.000000000 +0100
+@@ -86,6 +86,7 @@
+ desc("Display Driver");
+ key("width", width, 640); desc("Horizontal Resolution");
+ key("height", height, 480); desc("Vertical Resolution");
++ yesno("autoswap", autoswap, 0); desc("Automatically swap display dimension");
+ key("aspect", aspect, 1000); desc("Pixel Aspect Ratio");
+ key("depth", depth, 0); desc("Display Depth");
+ key("maxfps", max_fps, 100); desc("Maximum fps");
+Index: KoboDeluxe-0.5.1/prefs.h
+===================================================================
+--- KoboDeluxe-0.5.1.orig/prefs.h 2008-02-11 14:28:01.000000000 +0100
++++ KoboDeluxe-0.5.1/prefs.h 2008-02-11 14:31:24.000000000 +0100
+@@ -76,6 +76,7 @@
+ int videodriver; //Internal video driver
+ int width; //Screen/window width
+ int height; //Screen/window height
++ int autoswap; // Automatically swap dimensions if initialization fails
+ int aspect; //Pixel aspect ratio * 1000
+ int depth; //Bits per pixel
+ int max_fps; //Maximum fps
+Index: KoboDeluxe-0.5.1/states.cpp
+===================================================================
+--- KoboDeluxe-0.5.1.orig/states.cpp 2008-02-11 14:32:13.000000000 +0100
++++ KoboDeluxe-0.5.1/states.cpp 2008-02-11 15:00:13.000000000 +0100
+@@ -117,6 +117,8 @@
+ switch (button)
+ {
+ case BTN_EXIT:
++ gsm.push(&st_ask_exit);
++ break;
+ case BTN_CLOSE:
+ gsm.push(&st_main_menu);
+ break;
diff --git a/packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch b/packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch
new file mode 100644
index 0000000000..160d3ce896
--- /dev/null
+++ b/packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch
@@ -0,0 +1,266 @@
+Index: KoboDeluxe-0.5.1/README
+===================================================================
+--- KoboDeluxe-0.5.1.orig/README 2008-02-11 01:10:23.000000000 +0100
++++ KoboDeluxe-0.5.1/README 2008-02-11 01:17:30.000000000 +0100
+@@ -39,6 +39,12 @@
+ key diagonals. Escape enters the meny system, from where it is possi-
+ ble to change settings, start a new game or exit the game.
+
++ In case the touchscreen support has been compiled in the menu can be
++ controlled by clicking the frame borders. Touching the inner part of
++ the screen is like a button press. In the game mode a click in the
++ upper right corner activates pause mode and the lower right corner es-
++ capes to the menu.
++
+ OPTIONS
+ Note that all relevant options can be also configured in the config
+ file, which can be edited directly, or using the options menus in the
+Index: KoboDeluxe-0.5.1/config.h
+===================================================================
+--- KoboDeluxe-0.5.1.orig/config.h 2008-02-11 00:23:20.000000000 +0100
++++ KoboDeluxe-0.5.1/config.h 2008-02-11 02:01:17.000000000 +0100
+@@ -95,6 +95,15 @@
+ #define MARGIN 8
+
+ /*
++ * Fraction of the screen size in which clicks are not considered
++ * clicks but movements in that direction (as regarded from the
++ * center of the screen) or other special things (pause & exit).
++ *
++ * Used only in touchscreen mode.
++ */
++#define POINTER_MARGIN_PERCENT 10
++
++/*
+ * (In XKobo, WSIZE was used where this is
+ * used now; in the game logic code.)
+ *
+Index: KoboDeluxe-0.5.1/configure.in
+===================================================================
+--- KoboDeluxe-0.5.1.orig/configure.in 2008-02-11 00:37:18.000000000 +0100
++++ KoboDeluxe-0.5.1/configure.in 2008-02-11 00:48:59.000000000 +0100
+@@ -195,6 +195,16 @@
+ CXXFLAGS="$CXXFLAGS -DHAVE_OPENGL"
+ fi
+
++AC_ARG_ENABLE(
++ touchscreen,
++ [AS_HELP_STRING(
++ [--enable-touchscreen],
++ [Compile menu control support suitable for touchscreens (default is no)])],
++ AC_DEFINE(
++ [ENABLE_TOUCHSCREEN],
++ [1],
++ [Set to 1 if the menusystem should support touchscreen input]),
++ [])
+
+ dnl-------------------------------------------------------
+ dnl Checks for header files.
+Index: KoboDeluxe-0.5.1/kobo.cpp
+===================================================================
+--- KoboDeluxe-0.5.1.orig/kobo.cpp 2008-02-11 00:24:57.000000000 +0100
++++ KoboDeluxe-0.5.1/kobo.cpp 2008-02-11 16:02:23.000000000 +0100
+@@ -28,6 +28,8 @@
+ // Use this to benchmark and create a new percentage table!
+ #undef TIME_PROGRESS
+
++#include <aconfig.h>
++
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <unistd.h>
+@@ -671,6 +673,10 @@
+ gh = dh;
+ }
+
++#if ENABLE_TOUCHSCREEN
++ gengine->setup_pointer_margin(dw, dh);
++#endif
++
+ // Scaling has 16ths granularity, so tiles scale properly!
+ gengine->scale((int)((gw * 16 + 8) / SCREEN_WIDTH) / 16.f,
+ (int)((gh * 16 + 8) / SCREEN_HEIGHT) / 16.f);
+@@ -1599,6 +1605,23 @@
+ {
+ }
+
++#ifdef ENABLE_TOUCHSCREEN
++void kobo_gfxengine_t::setup_pointer_margin(int dw, int dh)
++{
++ // Precalculates the border ranges. Mouse clicks outside these are handled
++ // specially.
++ pointer_margin_width_min = dw * POINTER_MARGIN_PERCENT / 100;
++ pointer_margin_width_max = dw - dw * POINTER_MARGIN_PERCENT / 100;
++ pointer_margin_height_min = dh * POINTER_MARGIN_PERCENT / 100;
++ pointer_margin_height_max = dh - dh * POINTER_MARGIN_PERCENT / 100;
++
++ log_printf(VLOG, "Pointer margin range [%d, %d, %d, %d]\n",
++ pointer_margin_width_min,
++ pointer_margin_width_max,
++ pointer_margin_height_min,
++ pointer_margin_height_max);
++}
++#endif
+
+ void kobo_gfxengine_t::frame()
+ {
+@@ -1800,11 +1823,57 @@
+ mouse_y - MARGIN - WSIZE/2);
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+- mouse_x = (int)(ev.motion.x / gengine->xscale()) - km.xoffs;
+- mouse_y = (int)(ev.motion.y / gengine->yscale()) - km.yoffs;
+- gsm.press(BTN_FIRE);
++ mouse_x = (int)(ev.button.x / gengine->xscale()) - km.xoffs;
++ mouse_y = (int)(ev.button.y / gengine->yscale()) - km.yoffs;
+ if(prefs->use_mouse)
+ {
++#if ENABLE_TOUCHSCREEN
++ if (ev.motion.x <= pointer_margin_width_min)
++ {
++ gsm.press(BTN_LEFT);
++ pointer_margin_used = true;
++ } else if (ev.motion.x >= pointer_margin_width_max)
++ {
++ // Upper right corner invokes pause.
++ // Lower right corner invokes exit.
++ // Otherwise it is just 'right'. :)
++ if (ev.motion.y <= pointer_margin_height_min)
++ {
++ gsm.press(BTN_PAUSE);
++ gamecontrol.press(BTN_PAUSE);
++ }
++ else
++ gsm.press((ev.motion.y >= pointer_margin_height_max
++ ? BTN_EXIT
++ : BTN_RIGHT));
++
++ pointer_margin_used = true;
++
++ }
++
++ if (ev.motion.y <= pointer_margin_height_min)
++ {
++ // Handle as 'up' only if it was not in the 'pause' area.
++ // Still handle as clicked, so 'fire' will not kick in.
++ if (ev.motion.x < pointer_margin_width_max)
++ gsm.press(BTN_UP);
++ pointer_margin_used = true;
++ } else if (ev.motion.y >= pointer_margin_height_max)
++ {
++ // Handle as 'down' only if it was not in the 'exit' area.
++ // Still handle as clicked, so 'fire' will not kick in.
++ if (ev.motion.x < pointer_margin_width_max)
++ gsm.press(BTN_DOWN);
++
++ pointer_margin_used = true;
++ }
++
++ if (!pointer_margin_used)
++ gsm.press(BTN_FIRE);
++#else
++ gsm.press(BTN_FIRE);
++#endif
++
+ gamecontrol.mouse_position(
+ mouse_x - 8 - MARGIN - WSIZE/2,
+ mouse_y - MARGIN - WSIZE/2);
+@@ -1824,10 +1893,24 @@
+ }
+ break;
+ case SDL_MOUSEBUTTONUP:
+- mouse_x = (int)(ev.motion.x / gengine->xscale()) - km.xoffs;
+- mouse_y = (int)(ev.motion.y / gengine->yscale()) - km.yoffs;
++ mouse_x = (int)(ev.button.x / gengine->xscale()) - km.xoffs;
++ mouse_y = (int)(ev.button.y / gengine->yscale()) - km.yoffs;
+ if(prefs->use_mouse)
+ {
++#if ENABLE_TOUCHSCREEN
++ // Resets all kinds of buttons that might have been activated by
++ // clicking in the pointer margin.
++ if (pointer_margin_used)
++ {
++ gsm.release(BTN_EXIT);
++ gsm.release(BTN_LEFT);
++ gsm.release(BTN_RIGHT);
++ gsm.release(BTN_UP);
++ gsm.release(BTN_DOWN);
++ pointer_margin_used = false;
++ }
++#endif
++
+ gamecontrol.mouse_position(
+ mouse_x - 8 - MARGIN - WSIZE/2,
+ mouse_y - MARGIN - WSIZE/2);
+@@ -2078,6 +2161,19 @@
+ int main(int argc, char *argv[])
+ {
+ int cmd_exit = 0;
++
++ printf(PACKAGE " - " VERSION " (touchscreen support: %s)\n",
++ (ENABLE_TOUCHSCREEN ? "yes" : "no"));
++ puts("Copyright (c) 1995, 1996 Akira Higuchi\n"
++ "Copyright (C) 1997 Masanao Izumo\n"
++ "Copyright (C) 1999-2001 Simon Peter\n"
++ "Copyright (C) 2002 Florian Schulze\n"
++ "Copyright (C) 2002 Jeremy Sheeley\n"
++ "Copyright (C) 2005 Erik Auerswald\n"
++ "Copyright (c) 1999-2007 David Olofson\n"
++ "This is free software; see the source for copying conditions. There is NO\n"
++ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
++
+ atexit(emergency_close);
+ signal(SIGTERM, breakhandler);
+ signal(SIGINT, breakhandler);
+Index: KoboDeluxe-0.5.1/kobo.h
+===================================================================
+--- KoboDeluxe-0.5.1.orig/kobo.h 2008-02-11 00:31:23.000000000 +0100
++++ KoboDeluxe-0.5.1/kobo.h 2008-02-11 02:19:29.000000000 +0100
+@@ -23,6 +23,8 @@
+ #ifndef _KOBO_H_
+ #define _KOBO_H_
+
++#include <aconfig.h>
++
+ #include "gfxengine.h"
+ #include "window.h"
+ #include "display.h"
+@@ -45,11 +47,25 @@
+
+ class kobo_gfxengine_t : public gfxengine_t
+ {
++#if ENABLE_TOUCHSCREEN
++ bool pointer_margin_used;
++
++ int pointer_margin_width_min;
++ int pointer_margin_width_max;
++ int pointer_margin_height_min;
++ int pointer_margin_height_max;
++#endif
++
+ void frame();
+ void pre_render();
+ void post_render();
+ public:
+ kobo_gfxengine_t();
++
++#if ENABLE_TOUCHSCREEN
++ void setup_pointer_margin(int, int);
++#endif
++
+ };
+
+ extern kobo_gfxengine_t *gengine;
+Index: KoboDeluxe-0.5.1/states.cpp
+===================================================================
+--- KoboDeluxe-0.5.1.orig/states.cpp 2008-02-11 03:06:41.000000000 +0100
++++ KoboDeluxe-0.5.1/states.cpp 2008-02-11 15:42:55.000000000 +0100
+@@ -963,8 +963,6 @@
+ break;
+
+ case BTN_FIRE:
+- if(!prefs->use_joystick)
+- break;
+ case BTN_START:
+ case BTN_SELECT:
+ sound.ui_ok();
diff --git a/packages/kobodeluxe/files/kobodeluxe-putenv.patch b/packages/kobodeluxe/files/kobodeluxe-putenv.patch
new file mode 100644
index 0000000000..05f7c72f81
--- /dev/null
+++ b/packages/kobodeluxe/files/kobodeluxe-putenv.patch
@@ -0,0 +1,69 @@
+Index: KoboDeluxe-0.5.1/configure.in
+===================================================================
+--- KoboDeluxe-0.5.1.orig/configure.in 2008-02-10 12:27:11.000000000 +0100
++++ KoboDeluxe-0.5.1/configure.in 2008-02-10 15:50:11.000000000 +0100
+@@ -159,7 +159,6 @@
+ )
+ LIBS="$LIBS -lSDL_image"
+
+-
+ dnl-------------------------------------------------------
+ dnl Checks for OpenGL
+ dnl-------------------------------------------------------
+@@ -214,13 +213,18 @@
+ dnl-------------------------------------------------------
+ dnl Checks for library functions.
+ dnl-------------------------------------------------------
++dnl SDL_putenv may not be available in all SDL ports
++AC_CHECK_DECLS(SDL_putenv,,,[#include <SDL.h>])
++
+ AC_CHECK_FUNCS(strdup strstr strchr strrchr)
+ AC_CHECK_FUNCS(snprintf _snprintf vsnprintf _vsnprintf)
+ AC_CHECK_FUNCS(pow sqrt)
+ AC_CHECK_FUNCS(munmap mkdir select stat)
+ AC_CHECK_FUNCS(atexit floor memmove memset memcmp)
+-AC_CHECK_FUNCS(gettimeofday)
++AC_CHECK_FUNCS(gettimeofday putenv)
+ AC_CHECK_FUNCS(getegid setgid)
++
++
+ AC_FUNC_MEMCMP
+ AC_FUNC_STRTOD
+ AC_FUNC_VPRINTF
+Index: KoboDeluxe-0.5.1/graphics/gfxengine.cpp
+===================================================================
+--- KoboDeluxe-0.5.1.orig/graphics/gfxengine.cpp 2008-02-10 12:41:31.000000000 +0100
++++ KoboDeluxe-0.5.1/graphics/gfxengine.cpp 2008-02-10 15:58:06.000000000 +0100
+@@ -21,10 +21,15 @@
+
+ #define DBG(x) x
+
++#include <aconfig.h>
++
+ #include "logger.h"
+
+ #include <string.h>
+ #include <math.h>
++#if not (HAVE_DECL_SDL_PUTENV) and defined (HAVE_PUTENV)
++#include <stdlib.h>
++#endif
+
+ #include "gfxengine.h"
+ #include "filters.h"
+@@ -764,8 +769,14 @@
+ if(is_showing)
+ return 0;
+
+- if(_centered && !_fullscreen)
+- SDL_putenv((char *)"SDL_VIDEO_CENTERED=1");
++ if(_centered && !_fullscreen)
++#if HAVE_DECL_SDL_PUTENV
++ SDL_putenv("SDL_VIDEO_CENTERED=1");
++#elif defined(HAVE_PUTENV)
++ putenv("SDL_VIDEO_CENTERED=1");
++#else
++ #error Neither SDL_putenv() nor putenv() are available. Fix it!
++#endif
+
+ log_printf(DLOG, "Opening screen...\n");
+ if(!SDL_WasInit(SDL_INIT_VIDEO))
diff --git a/packages/kobodeluxe/files/kobodeluxe-sysconf-support.patch b/packages/kobodeluxe/files/kobodeluxe-sysconf-support.patch
new file mode 100644
index 0000000000..1f62b31d71
--- /dev/null
+++ b/packages/kobodeluxe/files/kobodeluxe-sysconf-support.patch
@@ -0,0 +1,84 @@
+Index: KoboDeluxe-0.5.1/configure.in
+===================================================================
+--- KoboDeluxe-0.5.1.orig/configure.in 2008-02-10 20:51:37.000000000 +0100
++++ KoboDeluxe-0.5.1/configure.in 2008-02-10 21:40:09.000000000 +0100
+@@ -36,6 +36,7 @@
+ SCOREDIR='$(sharedstatedir)/kobo-deluxe/scores'
+ CONFIGDIR='HOME>>'
+ CONFIGFILE='.kobodlrc'
++USE_SYSCONF=1
+ EXEFILE=kobodl
+ case "$target_os" in
+ linux*)
+@@ -57,6 +58,7 @@
+ SCOREDIR='EXE>>scores'
+ CONFIGDIR='EXE>>'
+ CONFIGFILE='kobodl.cfg'
++ USE_SYSCONF=0
+ EXEFILE=kobodl.exe
+ MATHLIB=""
+ ;;
+@@ -68,6 +70,7 @@
+ SCOREDIR='EXE>>scores'
+ CONFIGDIR='EXE>>'
+ CONFIGFILE='kobodl.cfg'
++ USE_SYSCONF=0
+ EXEFILE=kobodl.exe
+ MATHLIB=""
+ ;;
+@@ -105,10 +108,12 @@
+ AM_CONDITIONAL(BUILD_MACOSX_BUNDLE, test x$build_macosx_bundle = xyes)
+ AM_CONDITIONAL(BUILD_SIMPLE_BUNDLE, test x$build_simple_bundle = xyes)
+ AM_CONDITIONAL(UNIX_SCOREDIR, test x$unix_scoredir = xyes)
++AC_DEFINE_UNQUOTED([USE_SYSCONF], [$USE_SYSCONF], [Define to 1 to use Unix-style sysconf dir for default configuration.])
+ AC_SUBST(DATADIR)
+ AC_SUBST(SCOREDIR)
+ AC_SUBST(CONFIGDIR)
+ AC_SUBST(CONFIGFILE)
++AC_SUBST(KOBO_SYSCONF)
+ AC_SUBST(EXEFILE)
+ AC_SUBST(MATHLIB)
+
+Index: KoboDeluxe-0.5.1/kobo.cpp
+===================================================================
+--- KoboDeluxe-0.5.1.orig/kobo.cpp 2008-02-10 20:57:32.000000000 +0100
++++ KoboDeluxe-0.5.1/kobo.cpp 2008-02-10 21:27:22.000000000 +0100
+@@ -1293,9 +1293,38 @@
+ FILE *f = fmap->fopen(KOBO_CONFIG_DIR "/" KOBO_CONFIG_FILE, "r");
+ if(f)
+ {
++ log_puts(VLOG, "Loading personal configuration from: "\
++ KOBO_CONFIG_DIR "/" KOBO_CONFIG_FILE "\n");
+ p->read(f);
+ fclose(f);
+ }
++#if USE_SYSCONF
++ /* On Unixen, where they have SYSCONF_DIR (usually /etc) try to get
++ * the default configuration from a file stored there before
++ * giving up.
++ *
++ * This gives packagers a chance to provide a proper default
++ * (playable) configuration for all those little Linux-based
++ * gadgets that are flying around.
++ */
++ else
++ {
++ f = fmap->fopen(SYSCONF_DIR "/kobo-deluxe/default-config", "r");
++ if(f)
++ {
++ log_puts(VLOG, "Loading configuration defaults from: "\
++ SYSCONF_DIR "/kobo-deluxe/default-config\n");
++
++ p->read(f);
++ fclose(f);
++ }
++ else
++ log_puts(VLOG, "Using built-in configuration defaults.\n");
++
++ }
++#else
++ log_puts(VLOG, "Using built-in configuration defaults.\n");
++#endif
+ }
+
+