kobodeluxe: Fixed and patches.
authorRobert Schuster <thebohemian@gmx.net>
Tue, 12 Feb 2008 00:30:46 +0000 (00:30 +0000)
committerRobert Schuster <thebohemian@gmx.net>
Tue, 12 Feb 2008 00:30:46 +0000 (00:30 +0000)
  - 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

packages/kobodeluxe/files/buildfix.patch [deleted file]
packages/kobodeluxe/files/default-config [new file with mode: 0644]
packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch [new file with mode: 0644]
packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch [new file with mode: 0644]
packages/kobodeluxe/files/kobodeluxe-putenv.patch [new file with mode: 0644]
packages/kobodeluxe/files/kobodeluxe-sysconf-support.patch [new file with mode: 0644]
packages/kobodeluxe/kobodeluxe_0.5.1.bb

diff --git a/packages/kobodeluxe/files/buildfix.patch b/packages/kobodeluxe/files/buildfix.patch
deleted file mode 100644 (file)
index 01a97e1..0000000
+++ /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 (file)
index 0000000..4a8f5f7
--- /dev/null
@@ -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 (file)
index 0000000..273e523
--- /dev/null
@@ -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 (file)
index 0000000..160d3ce
--- /dev/null
@@ -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 (file)
index 0000000..05f7c72
--- /dev/null
@@ -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 (file)
index 0000000..1f62b31
--- /dev/null
@@ -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
+ }
index 25f2f3c..cc3f85b 100644 (file)
@@ -5,7 +5,7 @@ LICENSE = "GPL"
 AUTHOR = "David Olofson <david@olofson.net>"
 HOMEPAGE = "http://olofson.net/kobodl"
 
-PR = "r1"
+PR = "r3"
 
 DEPENDS = "libsdl-image virtual/libsdl"
 
@@ -13,7 +13,11 @@ RDEPENDS_${PN} = "${PN}-data"
 
 SRC_URI = "http://olofson.net/kobodl/download/KoboDeluxe-${PV}.tar.bz2 \
                                         file://debian-kobo.patch;patch=1 \
-                                        file://buildfix.patch;patch=1 \
+                                        file://kobodeluxe-putenv.patch;patch=1 \
+                                        file://kobodeluxe-sysconf-support.patch;patch=1 \
+                                        file://kobodeluxe-menu-pointer.patch;patch=1 \
+                                        file://kobodeluxe-dimension-autoswap.patch;patch=1 \
+           file://default-config \
           "
 
 S = "${WORKDIR}/KoboDeluxe-${PV}"
@@ -22,10 +26,26 @@ inherit autotools
 
 export SDL_CONFIG = "${STAGING_BINDIR_CROSS}/sdl-config"
 
-EXTRA_OECONF = "--disable-opengl --disable-sdltest"
+EXTRA_OECONF = "--disable-opengl --disable-sdltest --enable-touchscreen"
+
+do_configure_prepend() {
+  sed -i \
+    -e "s|width WIDTH_HERE|width ${MACHINE_DISPLAY_WIDTH_PIXELS}|" \
+    -e "s|height HEIGHT_HERE|height ${MACHINE_DISPLAY_HEIGHT_PIXELS}|" \
+    ${WORKDIR}/default-config
+}
+
+do_install_append() {
+  # Provide a default (working) configuration file
+  install -d ${D}${sysconfdir}/kobo-deluxe
+  install -m 755 ${WORKDIR}/default-config ${D}${sysconfdir}/kobo-deluxe
+}
 
 PACKAGES += "${PN}-data"
 
+FILES_${PN} += "${sysconfdir}"
+CONFFILES_${PN} = "${sysconfdir}/kobo-deluxe/default-config"
+
 FILES_${PN}-data = "${datadir}"
 
 PACKAGE_ARCH_${PN}-data = "all"