1
0
Fork 0
forked from len0rd/rockbox

Pluginlib: Add support for general buttons. Add menu and quit buttons to Reversi. MRobe 500: Modify touch handler to return the previous data always rather than 0 when there is no touch.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22110 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Karl Kurbjun 2009-08-02 07:05:30 +00:00
parent e9b061a717
commit 0131a3873e
12 changed files with 439 additions and 220 deletions

View file

@ -668,6 +668,8 @@ static const struct plugin_api rockbox_api = {
#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) #if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID)
usb_hid_send, usb_hid_send,
#endif #endif
lcd_set_viewport,
}; };
int plugin_load(const char* plugin, const void* parameter) int plugin_load(const char* plugin, const void* parameter)

View file

@ -836,6 +836,8 @@ struct plugin_api {
#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) #if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID)
void (*usb_hid_send)(usage_page_t usage_page, int id); void (*usb_hid_send)(usage_page_t usage_page, int id);
#endif #endif
void (*lcd_set_viewport)(struct viewport* vp);
}; };
/* plugin header */ /* plugin header */

View file

@ -365,7 +365,7 @@ PLUGIN_HEADER
#define CALCULATOR_CLEAR BUTTON_TOPRIGHT #define CALCULATOR_CLEAR BUTTON_TOPRIGHT
#endif #endif
#include "lib/touchscreen.h" #include "lib/pluginlib_touchscreen.h"
static struct ts_raster calc_raster = { X_0_POS, Y_1_POS, static struct ts_raster calc_raster = { X_0_POS, Y_1_POS,
BUTTON_COLS*REC_WIDTH, BUTTON_ROWS*REC_HEIGHT, REC_WIDTH, REC_HEIGHT }; BUTTON_COLS*REC_WIDTH, BUTTON_ROWS*REC_HEIGHT, REC_WIDTH, REC_HEIGHT };
#endif #endif

View file

@ -54,7 +54,7 @@ pluginlib_albumart.c
pluginlib_actions.c pluginlib_actions.c
helper.c helper.c
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
touchscreen.c pluginlib_touchscreen.c
#endif #endif
md5.c md5.c

View file

@ -0,0 +1,249 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2008 by Maurus Cuelenaere
* Copyright (C) 2009 by Karl Kurbjun
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "plugin.h"
#ifdef HAVE_TOUCHSCREEN
#include "pluginlib_touchscreen.h"
/*******************************************************************************
* Touchbutton functions: These functions allow the plugin to specify a button
* location that, in turn gets mapped to a button press return value.
******************************************************************************/
/* touchbutton_get:
* This function checks the touchbutton structure passed to it for hits. When
* one is found it returns action.
* inputs:
* struct touchbutton *data: This is intended to be an array of
* touchbuttons of size num_buttons. Each element in the array defines
* one button.
* int button: This is the button return value from a button_get() call.
* It is used to determine REPEAT/RELEASE events.
* int num_buttons: This tells touchbutton_get how many elements are in
* data.
* return:
* If a touch occured over one of the defined buttons, return action, else
* return 0.
*/
int touchbutton_get(struct touchbutton *data, int button, int num_buttons) {
short x,y;
/* Get the x/y location of the button press, this is set by button_get when
* a button is pulled from the queue.
*/
x = rb->button_get_data() >> 16;
y = (short) rb->button_get_data();
struct viewport *v;
int i;
/* Loop over the data array to check if any of the buttons were pressed */
for (i=0; i<num_buttons; i++) {
v=&data[i].vp;
/* See if the point is inside the button viewport */
if( x >= v->x && x < (v->x + v->width) &&
y >= v->y && y < (v->y + v->height) ) {
if( ((button & BUTTON_REPEAT) && data[i].repeat) ||
((button & BUTTON_REL) && !data[i].repeat) ) {
return data[i].action;
}
}
}
return 0;
}
/* touchbutton_draw:
* This function draws the button with the associated text as long as the
* invisible flag is not set. Support for pixmaps needs to be added.
* inputs:
* struct touchbutton *data: This is intended to be an array of
* touchbuttons of size num_buttons. Each element in the array defines
* one button.
* int num_buttons: This tells touchbutton_get how many elements are in
* data.
* return:
* If a touch occured over one of the defined buttons, return action, else
* return 0.
*/
void touchbutton_draw(struct touchbutton *data, int num_buttons) {
int i;
/* These store the width and height of the title offset */
int title_width, title_height;
/* Loop over all the elements in data */
for(i=0; i<num_buttons; i++) {
/* Is this a visible button? */
if(!data[i].invisible) {
/* Set the current viewport to the button so that all drawing
* operations are within the button location.
*/
rb->lcd_set_viewport(&data[i].vp);
/* Get the string size so that the title can be centered. */
rb->lcd_getstringsize(data[i].title, &title_width, &title_height);
/* Center the title vertically */
title_height=(data[i].vp.height-title_height)/2;
/* If the above calculation was negative, reset to 0 */
if(title_height<0) {
title_height=0;
}
/* Center the title horizontally */
title_width=(data[i].vp.width-title_width)/2;
/* If the above calculation was negative, reset to 0 */
if(title_width<0) {
title_width=0;
}
/* If the width offset was 0, use a scrolling puts, else center and
* print the title.
*/
if(title_width==0) {
rb->lcd_puts_scroll(0, 0, data[i].title);
} else {
rb->lcd_putsxy(title_width, title_height, data[i].title);
}
/* Draw bounding box around the button location. */
rb->lcd_drawrect( 0, 0, data[i].vp.width, data[i].vp.height);
}
}
rb->lcd_set_viewport(NULL); /* Go back to the default viewport */
}
/*******************************************************************************
* Touchmap functions: Not sure how exactly these functions are used, comments
* needed!!!
******************************************************************************/
unsigned int touchscreen_map(struct ts_mappings *map, int x, int y)
{
int i;
for(i=0; i < map->amount; i++)
{
#define _MAP(x) (map->mappings[x])
if(x > _MAP(i).tl_x && x < (_MAP(i).tl_x+_MAP(i).width)
&& y > _MAP(i).tl_y && y < (_MAP(i).tl_y+_MAP(i).height))
return i;
}
return -1;
}
unsigned int touchscreen_map_raster(struct ts_raster *map, int x, int y, struct ts_raster_result *result)
{
int res1_x, res2_x, res1_y, res2_y;
if((x - map->tl_x) < 0 ||
(x - map->tl_x) > map->width)
return -1;
res1_x = (x - map->tl_x)/(map->raster_width);
res2_x = (x - map->tl_x)%(map->raster_width);
if((y - map->tl_y) < 0 ||
(y - map->tl_y) > map->height)
return -1;
res1_y = (y - map->tl_y)/(map->raster_height);
res2_y = (y - map->tl_y)%(map->raster_height);
if(res2_x == 0 || res2_y == 0) /* pen hit a raster boundary */
return -2;
else
{
(*result).x = res1_x;
(*result).y = res1_y;
return 1;
}
}
struct ts_raster_button_result touchscreen_raster_map_button(struct ts_raster_button_mapping *map, int x, int y, int button)
{
struct ts_raster_button_result ret = {0, {0, 0}, {0, 0}};
struct ts_raster_result tmp;
ret.action = TS_ACTION_NONE;
if(touchscreen_map_raster(map->raster, x, y, &tmp) != 1)
return ret;
#define NOT_HANDLED (ret.action == TS_ACTION_NONE)
if((button == BUTTON_REPEAT) && (map->_prev_btn_state != BUTTON_REPEAT) && map->drag_drop_enable)
{
map->_prev_x = tmp.x;
map->_prev_y = tmp.y;
}
if((button == BUTTON_REL) && (map->_prev_btn_state == BUTTON_REPEAT) && map->drag_drop_enable)
{
ret.action = TS_ACTION_DRAG_DROP;
ret.from.x = map->_prev_x;
ret.from.y = map->_prev_y;
ret.to.x = tmp.x;
ret.to.y = tmp.y;
}
if((button == BUTTON_REL) && map->double_click_enable && NOT_HANDLED)
{
if(map->_prev_x == tmp.x && map->_prev_y == tmp.y)
{
ret.action = TS_ACTION_DOUBLE_CLICK;
ret.from.x = ret.to.x = tmp.x;
ret.from.y = ret.to.y = tmp.y;
}
else
{
map->_prev_x = tmp.x;
map->_prev_y = tmp.y;
}
}
if((button & BUTTON_REL || button & BUTTON_REPEAT) && map->two_d_movement_enable && NOT_HANDLED)
{
if((map->two_d_from.x == tmp.x) ^ (map->two_d_from.y == tmp.y))
{
ret.action = TS_ACTION_TWO_D_MOVEMENT;
ret.from.x = map->two_d_from.x;
ret.from.y = map->two_d_from.y;
ret.to.x = map->two_d_from.x + (map->two_d_from.x == tmp.x ? 0 : (tmp.x > map->two_d_from.x ? 1 : -1));
ret.to.y = map->two_d_from.y + (map->two_d_from.y == tmp.y ? 0 : (tmp.y > map->two_d_from.y ? 1 : -1));
}
else
ret.action = TS_ACTION_NONE;
}
if(map->click_enable && (button & BUTTON_REL) && NOT_HANDLED)
{
ret.action = TS_ACTION_CLICK;
ret.from.x = ret.to.x = tmp.x;
ret.from.y = ret.to.y = tmp.y;
}
if(map->move_progress_enable && NOT_HANDLED)
{
ret.action = TS_ACTION_MOVE;
ret.from.x = ret.to.x = tmp.x;
ret.from.y = ret.to.y = tmp.y;
}
map->_prev_btn_state = button;
return ret;
}
#endif /* HAVE_TOUCHSCREEN */

View file

@ -8,6 +8,7 @@
* $Id$ * $Id$
* *
* Copyright (C) 2008 by Maurus Cuelenaere * Copyright (C) 2008 by Maurus Cuelenaere
* Copyright (C) 2009 by Karl Kurbjun
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -26,6 +27,28 @@
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
/*******************************************************************************
* Touchbutton
******************************************************************************/
struct touchbutton {
/* Each button has it's own viewport to define colors, drawstyle, location*/
struct viewport vp;
bool repeat; /* requires the area be held for the action */
int action; /* action this button will return */
bool invisible; /* Is this an invisible button? */
char *title; /* Specify a title */
fb_data *pixmap; /* Currently unused, but will allow for a graphic */
};
/* Get: tests for a button press and returns action. */
int touchbutton_get(struct touchbutton *data, int button, int num_buttons);
/* Draw: Draws all visible buttons */
void touchbutton_draw(struct touchbutton *data, int num_buttons);
/*******************************************************************************
* Touch mapping
******************************************************************************/
struct ts_mapping struct ts_mapping
{ {
int tl_x; /* top left */ int tl_x; /* top left */

View file

@ -1,135 +0,0 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2008 by Maurus Cuelenaere
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "plugin.h"
#ifdef HAVE_TOUCHSCREEN
#include "touchscreen.h"
unsigned int touchscreen_map(struct ts_mappings *map, int x, int y)
{
int i;
for(i=0; i < map->amount; i++)
{
#define _MAP(x) (map->mappings[x])
if(x > _MAP(i).tl_x && x < (_MAP(i).tl_x+_MAP(i).width)
&& y > _MAP(i).tl_y && y < (_MAP(i).tl_y+_MAP(i).height))
return i;
}
return -1;
}
unsigned int touchscreen_map_raster(struct ts_raster *map, int x, int y, struct ts_raster_result *result)
{
int res1_x, res2_x, res1_y, res2_y;
if((x - map->tl_x) < 0 ||
(x - map->tl_x) > map->width)
return -1;
res1_x = (x - map->tl_x)/(map->raster_width);
res2_x = (x - map->tl_x)%(map->raster_width);
if((y - map->tl_y) < 0 ||
(y - map->tl_y) > map->height)
return -1;
res1_y = (y - map->tl_y)/(map->raster_height);
res2_y = (y - map->tl_y)%(map->raster_height);
if(res2_x == 0 || res2_y == 0) /* pen hit a raster boundary */
return -2;
else
{
(*result).x = res1_x;
(*result).y = res1_y;
return 1;
}
}
struct ts_raster_button_result touchscreen_raster_map_button(struct ts_raster_button_mapping *map, int x, int y, int button)
{
struct ts_raster_button_result ret = {0, {0, 0}, {0, 0}};
struct ts_raster_result tmp;
ret.action = TS_ACTION_NONE;
if(touchscreen_map_raster(map->raster, x, y, &tmp) != 1)
return ret;
#define NOT_HANDLED (ret.action == TS_ACTION_NONE)
if((button == BUTTON_REPEAT) && (map->_prev_btn_state != BUTTON_REPEAT) && map->drag_drop_enable)
{
map->_prev_x = tmp.x;
map->_prev_y = tmp.y;
}
if((button == BUTTON_REL) && (map->_prev_btn_state == BUTTON_REPEAT) && map->drag_drop_enable)
{
ret.action = TS_ACTION_DRAG_DROP;
ret.from.x = map->_prev_x;
ret.from.y = map->_prev_y;
ret.to.x = tmp.x;
ret.to.y = tmp.y;
}
if((button == BUTTON_REL) && map->double_click_enable && NOT_HANDLED)
{
if(map->_prev_x == tmp.x && map->_prev_y == tmp.y)
{
ret.action = TS_ACTION_DOUBLE_CLICK;
ret.from.x = ret.to.x = tmp.x;
ret.from.y = ret.to.y = tmp.y;
}
else
{
map->_prev_x = tmp.x;
map->_prev_y = tmp.y;
}
}
if((button & BUTTON_REL || button & BUTTON_REPEAT) && map->two_d_movement_enable && NOT_HANDLED)
{
if((map->two_d_from.x == tmp.x) ^ (map->two_d_from.y == tmp.y))
{
ret.action = TS_ACTION_TWO_D_MOVEMENT;
ret.from.x = map->two_d_from.x;
ret.from.y = map->two_d_from.y;
ret.to.x = map->two_d_from.x + (map->two_d_from.x == tmp.x ? 0 : (tmp.x > map->two_d_from.x ? 1 : -1));
ret.to.y = map->two_d_from.y + (map->two_d_from.y == tmp.y ? 0 : (tmp.y > map->two_d_from.y ? 1 : -1));
}
else
ret.action = TS_ACTION_NONE;
}
if(map->click_enable && (button & BUTTON_REL) && NOT_HANDLED)
{
ret.action = TS_ACTION_CLICK;
ret.from.x = ret.to.x = tmp.x;
ret.from.y = ret.to.y = tmp.y;
}
if(map->move_progress_enable && NOT_HANDLED)
{
ret.action = TS_ACTION_MOVE;
ret.from.x = ret.to.x = tmp.x;
ret.from.y = ret.to.y = tmp.y;
}
map->_prev_btn_state = button;
return ret;
}
#endif /* HAVE_TOUCHSCREEN */

View file

@ -340,7 +340,7 @@ char str[30];
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
#include "lib/touchscreen.h" #include "lib/pluginlib_touchscreen.h"
static struct ts_raster mine_raster = { 0, 0, MAX_WIDTH, MAX_HEIGHT, TileSize, TileSize }; static struct ts_raster mine_raster = { 0, 0, MAX_WIDTH, MAX_HEIGHT, TileSize, TileSize };
#endif #endif

View file

@ -520,7 +520,7 @@ PLUGIN_HEADER
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
#include "lib/touchscreen.h" #include "lib/pluginlib_touchscreen.h"
static struct ts_raster pegbox_raster = static struct ts_raster pegbox_raster =
{ BOARD_X, BOARD_Y, COLS*PIECE_WIDTH, ROWS*PIECE_HEIGHT, { BOARD_X, BOARD_Y, COLS*PIECE_WIDTH, ROWS*PIECE_HEIGHT,
PIECE_WIDTH, PIECE_HEIGHT }; PIECE_WIDTH, PIECE_HEIGHT };

View file

@ -32,11 +32,9 @@ Use the arrow keys to move cursor, and press TOGGLE to place a stone.
At any time during the game, press MENU to bring up the game menu with At any time during the game, press MENU to bring up the game menu with
further options: further options:
- Save - Save
- Reload - Reload
- Clear - Clear
*/ */
#include "plugin.h" #include "plugin.h"
@ -139,6 +137,75 @@ static cursor_wrap_mode_t cursor_wrap_mode;
static bool quit_plugin; static bool quit_plugin;
static bool game_finished; static bool game_finished;
#ifdef HAVE_TOUCHSCREEN
#include "lib/pluginlib_touchscreen.h"
/* This uses the touchscreen library functions/structures. */
/* This defines the number of buttons used; only used in this C file. */
#define TOUCHBUTTON_COUNT 3
/* Define the button locations, widths and heights */
#if LCD_HEIGHT < LCD_WIDTH
/* Define Menu button x, y, width, height */
#define B_MENU_X LEGEND_X(0)
#define B_MENU_Y (LCD_HEIGHT/4)
#define B_MENU_W (LCD_WIDTH-LEGEND_X(0))
#define B_MENU_H (LCD_HEIGHT/4)
/* Define Quit Button x, y, width, height */
#define B_QUIT_X LEGEND_X(0)
#define B_QUIT_Y (LCD_HEIGHT/2)
#define B_QUIT_W (LCD_WIDTH-LEGEND_X(0))
#define B_QUIT_H (LCD_HEIGHT/4)
#else
/* Define Menu button x, y, width, height */
#define B_MENU_X (LCD_WIDTH/2)
#define B_MENU_Y LEGEND_Y(0)
#define B_MENU_W (LCD_WIDTH/4)
#define B_MENU_H (2*CELL_HEIGHT)
/* Define Quit Button x, y, width, height */
#define B_QUIT_X (LCD_WIDTH-LCD_WIDTH/4)
#define B_QUIT_Y LEGEND_Y(0)
#define B_QUIT_W (LCD_WIDTH/4)
#define B_QUIT_H (2*CELL_HEIGHT)
#endif
/* This is the button initialization/definition. The first element is the
* Viewport. This is defined in lcd.h, but the elements are:
* int x - X location of button/viewport
* int y - Y location of button/viewport
* int width - Width of button/viewport
* int height - Height of button/viewport
* int font - Font to be used on button/viewport
* int drawmode- Modes defined in lcd.h
* unsigned fg_pattern - foreground color
* unsigned bg_pattern - backbround color
* unsigned lss_pattern - Selector colors (currently unused)
* unsigned lse_pattern - |
* unsigned lst_pattern - \/
*
* The rest of the touch button elements are:
* bool repeat - requires the area be held for the action
* int action - action this button will return
* bool invisible - Is this an invisible button?
* char *title - Specify a title
* fb_data *pixmap- Currently unused, but will allow for a graphic
*/
struct touchbutton reversi_buttons[TOUCHBUTTON_COUNT] =
{
{ {B_MENU_X, B_MENU_Y, B_MENU_W, B_MENU_H, FONT_UI,
STYLE_DEFAULT, 0, 0xFFFF, 0, 0, 0},
false, REVERSI_BUTTON_MENU, false, "Menu", NULL },
{ {B_QUIT_X, B_QUIT_Y, B_QUIT_W, B_QUIT_H, FONT_UI,
STYLE_DEFAULT, 0, 0xFFFF, 0, 0, 0},
false, REVERSI_BUTTON_QUIT, false, "Quit", NULL },
{ {0, 0, XOFS+BOARD_WIDTH, YOFS+BOARD_HEIGHT, 0,
STYLE_DEFAULT, 0, 0xFFFF, 0, 0, 0},
false, REVERSI_BUTTON_MAKE_MOVE, true, NULL, NULL }
};
#endif
/* Initialises the state of the game (starts a new game) */ /* Initialises the state of the game (starts a new game) */
static void reversi_gui_init(void) { static void reversi_gui_init(void) {
@ -184,8 +251,12 @@ static void reversi_gui_draw_cell(int x, int y, int color) {
int i; int i;
if (color == WHITE) { if (color == WHITE) {
for (i = 0; i < CELL_LINE_THICKNESS; i++) { for (i = 0; i < CELL_LINE_THICKNESS; i++) {
rb->lcd_drawrect(x+STONE_MARGIN+i, y+STONE_MARGIN+i, rb->lcd_drawrect(
CELL_WIDTH+1-2*(STONE_MARGIN+i), CELL_HEIGHT+1-2*(STONE_MARGIN+i)); x+STONE_MARGIN+i,
y+STONE_MARGIN+i,
CELL_WIDTH+1-2*(STONE_MARGIN+i),
CELL_HEIGHT+1-2*(STONE_MARGIN+i)
);
} }
} else if (color == BLACK) { } else if (color == BLACK) {
rb->lcd_fillrect(x+STONE_MARGIN, y+STONE_MARGIN, rb->lcd_fillrect(x+STONE_MARGIN, y+STONE_MARGIN,
@ -249,6 +320,10 @@ static void reversi_gui_display_board(void) {
y = LEGEND_Y(r); y = LEGEND_Y(r);
rb->lcd_drawrect(x, y, CELL_WIDTH+1, CELL_HEIGHT+1); rb->lcd_drawrect(x, y, CELL_WIDTH+1, CELL_HEIGHT+1);
#if defined(HAVE_TOUCHSCREEN)
touchbutton_draw(reversi_buttons, TOUCHBUTTON_COUNT);
#endif
/* Update the screen */ /* Update the screen */
rb->lcd_update(); rb->lcd_update();
} }
@ -299,7 +374,10 @@ static bool reversi_gui_choose_strategy(
break; break;
} }
} }
result = rb->set_option(prompt, &index, INT, strategy_settings, num_items, NULL);
result =
rb->set_option(prompt, &index, INT, strategy_settings, num_items, NULL);
(*player) = strategy_values[index]; (*player) = strategy_values[index];
if((*player)->init_func) if((*player)->init_func)
@ -339,7 +417,8 @@ static bool reversi_gui_menu(void) {
break; break;
case 4: /* Cursor wrap mode */ case 4: /* Cursor wrap mode */
num_items = sizeof(cursor_wrap_mode_values)/sizeof(cursor_wrap_mode_values[0]); num_items = sizeof(cursor_wrap_mode_values) /
sizeof(cursor_wrap_mode_values[0]);
index = 0; index = 0;
for (i = 0; i < num_items; i++) { for (i = 0; i < num_items; i++) {
if (cursor_wrap_mode == cursor_wrap_mode_values[i]) { if (cursor_wrap_mode == cursor_wrap_mode_values[i]) {
@ -372,7 +451,8 @@ static bool reversi_gui_menu(void) {
* Returns true iff the cursor would be really moved. In any case, the * Returns true iff the cursor would be really moved. In any case, the
* new cursor position is stored in (new_row, new_col). * new cursor position is stored in (new_row, new_col).
*/ */
static bool reversi_gui_cursor_pos_vmove(int row_delta, int *new_row, int *new_col) { static bool
reversi_gui_cursor_pos_vmove(int row_delta, int *new_row, int *new_col) {
*new_row = cur_row + row_delta; *new_row = cur_row + row_delta;
*new_col = cur_col; *new_col = cur_col;
@ -421,7 +501,8 @@ static bool reversi_gui_cursor_pos_vmove(int row_delta, int *new_row, int *new_c
* Returns true iff the cursor would be really moved. In any case, the * Returns true iff the cursor would be really moved. In any case, the
* new cursor position is stored in (new_row, new_col). * new cursor position is stored in (new_row, new_col).
*/ */
static bool reversi_gui_cursor_pos_hmove(int col_delta, int *new_row, int *new_col) { static bool
reversi_gui_cursor_pos_hmove(int col_delta, int *new_row, int *new_col) {
*new_row = cur_row; *new_row = cur_row;
*new_col = cur_col + col_delta; *new_col = cur_col + col_delta;
@ -554,39 +635,62 @@ enum plugin_status plugin_start(const void *parameter) {
continue; continue;
} }
/***********************************************************************
* Button handling code happens below here
**********************************************************************/
button = rb->button_get(true); button = rb->button_get(true);
/* The touchscreen buttons can act as true buttons so OR them in */
#ifdef HAVE_TOUCHSCREEN
button |= touchbutton_get(reversi_buttons, button, TOUCHBUTTON_COUNT);
#endif
switch (button) { /* All of these button presses wait for the release event */
if(button&BUTTON_REL) {
#ifdef REVERSI_BUTTON_QUIT #ifdef REVERSI_BUTTON_QUIT
/* Exit game */ if(button&REVERSI_BUTTON_QUIT) {
case REVERSI_BUTTON_QUIT:
exit = true; exit = true;
break; }
#endif #endif
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
case BUTTON_TOUCHSCREEN: if(button&BUTTON_TOUCHSCREEN) {
button_x = rb->button_get_data() >> 16; button_x = rb->button_get_data();
button_y = rb->button_get_data() & 0xffff; button_y = button_x & 0xffff;
if( (CELL_R(button_y)>(BOARD_SIZE-1)) || button_x >>= 16;
(CELL_C(button_x)>(BOARD_SIZE-1)) )
/* Check if the click was in the gameboard, if so move cursor.
* This has to happen before MAKE_MOVE is processed.
*/
if( (CELL_R(button_y)<BOARD_SIZE) &&
(CELL_C(button_x)<BOARD_SIZE) )
{ {
break;
} else {
reversi_gui_move_cursor(CELL_R(button_y), CELL_C(button_x)); reversi_gui_move_cursor(CELL_R(button_y), CELL_C(button_x));
} }
}
#endif #endif
#ifdef REVERSI_BUTTON_ALT_MAKE_MOVE if( (button&REVERSI_BUTTON_MENU)
case REVERSI_BUTTON_ALT_MAKE_MOVE: #if defined(REVERSI_BUTTON_MENU_LONGPRESS)
&& (lastbutton&BUTTON_REPEAT)
#endif #endif
case REVERSI_BUTTON_MAKE_MOVE: ) {
#ifdef REVERSI_BUTTON_MAKE_MOVE_PRE if (reversi_gui_menu()) {
if ((button == REVERSI_BUTTON_MAKE_MOVE) return PLUGIN_USB_CONNECTED;
&& (lastbutton != REVERSI_BUTTON_MAKE_MOVE_PRE)) }
draw_screen = true;
}
if(button&REVERSI_BUTTON_MAKE_MOVE
#if defined(REVERSI_BUTTON_MAKE_MOVE_SHORTPRESS)
&& !(lastbutton&BUTTON_REPEAT)
#endif
) {
/* If you touch the game board instead of hitting menu after it
* has completed the game will exit out.
*/
if (game_finished)
break; break;
#endif
if (game_finished) break;
if (reversi_make_move(&game, cur_row, cur_col, cur_player) > 0) { if (reversi_make_move(&game, cur_row, cur_col, cur_player) > 0) {
/* Move was made. Global changes on the board are possible */ /* Move was made. Global changes on the board are possible */
draw_screen = true; /* Redraw the screen next time */ draw_screen = true; /* Redraw the screen next time */
@ -607,66 +711,42 @@ enum plugin_status plugin_start(const void *parameter) {
/* Ignore any button presses during the splash */ /* Ignore any button presses during the splash */
rb->button_clear_queue(); rb->button_clear_queue();
} }
break; }
}
/* These button presses will run on a release or a repeat event */
if(button&BUTTON_REL || button&BUTTON_REPEAT) {
/* Move cursor left */ /* Move cursor left */
#ifdef REVERSI_BUTTON_ALT_LEFT if(button&REVERSI_BUTTON_LEFT) {
case REVERSI_BUTTON_ALT_LEFT:
case (REVERSI_BUTTON_ALT_LEFT | BUTTON_REPEAT):
#endif
case REVERSI_BUTTON_LEFT:
case (REVERSI_BUTTON_LEFT | BUTTON_REPEAT):
if (reversi_gui_cursor_pos_hmove(-1, &row, &col)) { if (reversi_gui_cursor_pos_hmove(-1, &row, &col)) {
reversi_gui_move_cursor(row, col); reversi_gui_move_cursor(row, col);
} }
break; }
/* Move cursor right */ /* Move cursor right */
#ifdef REVERSI_BUTTON_ALT_RIGHT if(button&REVERSI_BUTTON_RIGHT) {
case REVERSI_BUTTON_ALT_RIGHT:
case (REVERSI_BUTTON_ALT_RIGHT | BUTTON_REPEAT):
#endif
case REVERSI_BUTTON_RIGHT:
case (REVERSI_BUTTON_RIGHT | BUTTON_REPEAT):
if (reversi_gui_cursor_pos_hmove(1, &row, &col)) { if (reversi_gui_cursor_pos_hmove(1, &row, &col)) {
reversi_gui_move_cursor(row, col); reversi_gui_move_cursor(row, col);
} }
break; }
/* Move cursor up */ /* Move cursor up */
case REVERSI_BUTTON_UP: if(button&REVERSI_BUTTON_UP) {
case (REVERSI_BUTTON_UP | BUTTON_REPEAT):
if (reversi_gui_cursor_pos_vmove(-1, &row, &col)) { if (reversi_gui_cursor_pos_vmove(-1, &row, &col)) {
reversi_gui_move_cursor(row, col); reversi_gui_move_cursor(row, col);
} }
break; }
/* Move cursor down */ /* Move cursor down */
case REVERSI_BUTTON_DOWN: if(button&REVERSI_BUTTON_DOWN) {
case (REVERSI_BUTTON_DOWN | BUTTON_REPEAT):
if (reversi_gui_cursor_pos_vmove(1, &row, &col)) { if (reversi_gui_cursor_pos_vmove(1, &row, &col)) {
reversi_gui_move_cursor(row, col); reversi_gui_move_cursor(row, col);
} }
break; }
case REVERSI_BUTTON_MENU:
#ifdef REVERSI_BUTTON_MENU_PRE
if (lastbutton != REVERSI_BUTTON_MENU_PRE) {
break;
}
#endif
if (reversi_gui_menu()) {
return PLUGIN_USB_CONNECTED;
}
draw_screen = true;
break;
default:
if (rb->default_event_handler(button) == SYS_USB_CONNECTED) {
/* Quit if USB has been connected */
return PLUGIN_USB_CONNECTED;
}
break;
} }
if (rb->default_event_handler(button) == SYS_USB_CONNECTED) {
/* Quit if USB has been connected */
return PLUGIN_USB_CONNECTED;
}
if (button != BUTTON_NONE) { if (button != BUTTON_NONE) {
lastbutton = button; lastbutton = button;
} }

View file

@ -42,11 +42,10 @@
#define REVERSI_BUTTON_DOWN BUTTON_DOWN #define REVERSI_BUTTON_DOWN BUTTON_DOWN
#define REVERSI_BUTTON_LEFT BUTTON_LEFT #define REVERSI_BUTTON_LEFT BUTTON_LEFT
#define REVERSI_BUTTON_RIGHT BUTTON_RIGHT #define REVERSI_BUTTON_RIGHT BUTTON_RIGHT
#define REVERSI_BUTTON_MAKE_MOVE_PRE BUTTON_MENU #define REVERSI_BUTTON_MAKE_MOVE BUTTON_MENU
#define REVERSI_BUTTON_MAKE_MOVE (BUTTON_MENU | BUTTON_REL) #define REVERSI_BUTTON_MAKE_MOVE_SHORTPRESS
#define REVERSI_BUTTON_ALT_MAKE_MOVE (BUTTON_MENU | BUTTON_DOWN) #define REVERSI_BUTTON_MENU_LONGPRESS
#define REVERSI_BUTTON_MENU_PRE BUTTON_MENU #define REVERSI_BUTTON_MENU BUTTON_MENU
#define REVERSI_BUTTON_MENU (BUTTON_MENU | BUTTON_REPEAT)
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
(CONFIG_KEYPAD == IRIVER_H300_PAD) (CONFIG_KEYPAD == IRIVER_H300_PAD)
@ -63,10 +62,8 @@
(CONFIG_KEYPAD == IPOD_1G2G_PAD) (CONFIG_KEYPAD == IPOD_1G2G_PAD)
#define REVERSI_BUTTON_UP BUTTON_MENU #define REVERSI_BUTTON_UP BUTTON_MENU
#define REVERSI_BUTTON_DOWN BUTTON_PLAY #define REVERSI_BUTTON_DOWN BUTTON_PLAY
#define REVERSI_BUTTON_LEFT BUTTON_LEFT #define REVERSI_BUTTON_LEFT (BUTTON_LEFT | BUTTON_SCROLL_BACK)
#define REVERSI_BUTTON_RIGHT BUTTON_RIGHT #define REVERSI_BUTTON_RIGHT (BUTTON_RIGHT | BUTTON_SCROLL_FWD)
#define REVERSI_BUTTON_ALT_LEFT BUTTON_SCROLL_BACK
#define REVERSI_BUTTON_ALT_RIGHT BUTTON_SCROLL_FWD
#define REVERSI_BUTTON_MAKE_MOVE (BUTTON_SELECT | BUTTON_REL) #define REVERSI_BUTTON_MAKE_MOVE (BUTTON_SELECT | BUTTON_REL)
#define REVERSI_BUTTON_MENU (BUTTON_MENU | BUTTON_SELECT) #define REVERSI_BUTTON_MENU (BUTTON_MENU | BUTTON_SELECT)

View file

@ -110,16 +110,17 @@ inline bool button_hold(void)
int button_read_device(int *data) int button_read_device(int *data)
{ {
static int old_data;
int button_read = BUTTON_NONE; int button_read = BUTTON_NONE;
short touch_x, touch_y, touch_z1, touch_z2; short touch_x, touch_y, touch_z1, touch_z2;
static bool hold_button_old = false; static bool hold_button_old = false;
*data = 0; *data = old_data;
/* Handle touchscreen */ /* Handle touchscreen */
if (tsc2100_read_touch(&touch_x, &touch_y, &touch_z1, &touch_z2)) if (tsc2100_read_touch(&touch_x, &touch_y, &touch_z1, &touch_z2))
{ {
*data = touch_to_pixels(&touch_x, &touch_y); old_data = *data = touch_to_pixels(&touch_x, &touch_y);
button_read |= touchscreen_to_pixels(touch_x, touch_y, data); button_read |= touchscreen_to_pixels(touch_x, touch_y, data);
} }