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 + #include #include #include @@ -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 + #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();