forked from len0rd/rockbox
1) Implement generic touchscreen detection library for the plugins
2) Adapt minesweeper, pegbox & calculator to it 3) Simplify gui/bitmap/list.c git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17695 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
f9bf137b67
commit
e1753de41a
7 changed files with 382 additions and 12 deletions
|
@ -39,3 +39,6 @@ bmp_smooth_scale.c
|
|||
#endif
|
||||
pluginlib_actions.c
|
||||
helper.c
|
||||
#ifdef HAVE_TOUCHPAD
|
||||
touchscreen.c
|
||||
#endif
|
||||
|
|
133
apps/plugins/lib/touchscreen.c
Normal file
133
apps/plugins/lib/touchscreen.c
Normal file
|
@ -0,0 +1,133 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "plugin.h"
|
||||
|
||||
#ifdef HAVE_TOUCHPAD
|
||||
|
||||
#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_TOUCHPAD */
|
90
apps/plugins/lib/touchscreen.h
Normal file
90
apps/plugins/lib/touchscreen.h
Normal file
|
@ -0,0 +1,90 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef _PLUGIN_LIB_TOUCHSCREEN_H_
|
||||
#define _PLUGIN_LIB_TOUCHSCREEN_H_
|
||||
|
||||
#ifdef HAVE_TOUCHPAD
|
||||
|
||||
struct ts_mapping
|
||||
{
|
||||
int tl_x; /* top left */
|
||||
int tl_y;
|
||||
int width;
|
||||
int height;
|
||||
};
|
||||
|
||||
struct ts_mappings
|
||||
{
|
||||
struct ts_mapping *mappings;
|
||||
int amount;
|
||||
};
|
||||
|
||||
unsigned int touchscreen_map(struct ts_mappings *map, int x, int y);
|
||||
|
||||
struct ts_raster
|
||||
{
|
||||
int tl_x; /* top left */
|
||||
int tl_y;
|
||||
int width;
|
||||
int height;
|
||||
int raster_width;
|
||||
int raster_height;
|
||||
};
|
||||
|
||||
struct ts_raster_result
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
unsigned int touchscreen_map_raster(struct ts_raster *map, int x, int y, struct ts_raster_result *result);
|
||||
|
||||
struct ts_raster_button_mapping
|
||||
{
|
||||
struct ts_raster *raster;
|
||||
bool drag_drop_enable; /* ... */
|
||||
bool double_click_enable; /* ... */
|
||||
bool click_enable; /* ... */
|
||||
bool move_progress_enable; /* ... */
|
||||
bool two_d_movement_enable; /* ... */
|
||||
struct ts_raster_result two_d_from; /* ... */
|
||||
int _prev_x; /* Internal: DO NOT MODIFY! */
|
||||
int _prev_y; /* Internal: DO NOT MODIFY! */
|
||||
int _prev_btn_state; /* Internal: DO NOT MODIFY! */
|
||||
};
|
||||
|
||||
struct ts_raster_button_result
|
||||
{
|
||||
enum{
|
||||
TS_ACTION_NONE,
|
||||
TS_ACTION_MOVE,
|
||||
TS_ACTION_CLICK,
|
||||
TS_ACTION_DOUBLE_CLICK,
|
||||
TS_ACTION_DRAG_DROP,
|
||||
TS_ACTION_TWO_D_MOVEMENT
|
||||
} action;
|
||||
struct ts_raster_result from;
|
||||
struct ts_raster_result to;
|
||||
};
|
||||
|
||||
struct ts_raster_button_result touchscreen_raster_map_button(struct ts_raster_button_mapping *map, int x, int y, int button);
|
||||
|
||||
#endif /* HAVE_TOUCHPAD */
|
||||
#endif /* _PLUGIN_LIB_TOUCHSCREEN_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue