[oe-commits] org.oe.dev kobodeluxe: Fixed and patches.

thebohemian commit openembedded-commits at lists.openembedded.org
Tue Feb 12 00:59:10 UTC 2008


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

Author: thebohemian at openembedded.org
Branch: org.openembedded.dev
Revision: 7e91a33e25e4db6e39c13e5d76825e86b64370e0
ViewMTN: http://monotone.openembedded.org/revision/info/7e91a33e25e4db6e39c13e5d76825e86b64370e0
Files:
1
packages/kobodeluxe/files/buildfix.patch
packages/kobodeluxe/files/default-config
packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch
packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch
packages/kobodeluxe/files/kobodeluxe-putenv.patch
packages/kobodeluxe/files/kobodeluxe-sysconf-support.patch
packages/kobodeluxe/kobodeluxe_0.5.1.bb
Diffs:

#
# mt diff -r118a617db4118b3a38a8228d498c7dc59d711702 -r7e91a33e25e4db6e39c13e5d76825e86b64370e0
#
# 
# 
# delete "packages/kobodeluxe/files/buildfix.patch"
# 
# add_file "packages/kobodeluxe/files/default-config"
#  content [46257ad56eea9a725ce61d60791a7dc100217d6f]
# 
# add_file "packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch"
#  content [a81da9854c43a33ce55b8bda5930b97c3432a3da]
# 
# add_file "packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch"
#  content [cdf7d88a3c307e3234861a010c08d02718984c06]
# 
# add_file "packages/kobodeluxe/files/kobodeluxe-putenv.patch"
#  content [a98eaa1073b6536c57c61e4df76aace189795b2d]
# 
# add_file "packages/kobodeluxe/files/kobodeluxe-sysconf-support.patch"
#  content [1c09a303dbfdb24e5c9c15c96b075573198d7f20]
# 
# patch "packages/kobodeluxe/kobodeluxe_0.5.1.bb"
#  from [86d0cc4ba30bab1bfdef84b4944a8f2df96cdac3]
#    to [2040369b6c4f71d005b8c0e530e90fb9dd7efd50]
# 
============================================================
--- packages/kobodeluxe/files/default-config	46257ad56eea9a725ce61d60791a7dc100217d6f
+++ packages/kobodeluxe/files/default-config	46257ad56eea9a725ce61d60791a7dc100217d6f
@@ -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
============================================================
--- packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch	a81da9854c43a33ce55b8bda5930b97c3432a3da
+++ packages/kobodeluxe/files/kobodeluxe-dimension-autoswap.patch	a81da9854c43a33ce55b8bda5930b97c3432a3da
@@ -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;
============================================================
--- packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch	cdf7d88a3c307e3234861a010c08d02718984c06
+++ packages/kobodeluxe/files/kobodeluxe-menu-pointer.patch	cdf7d88a3c307e3234861a010c08d02718984c06
@@ -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%s
>>> DIFF TRUNCATED @ 16K






More information about the Openembedded-commits mailing list