diff options
| author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2008-06-06 18:29:46 +0000 |
|---|---|---|
| committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2008-06-06 18:29:46 +0000 |
| commit | e1753de41af9149b09fbacc6ac16515747d0b1f3 (patch) | |
| tree | 82d98883cabd5fc4e4ea40398a0325d87ace27e8 /apps/plugins/lib | |
| parent | f9bf137b67d16a03100e392ab2171ae4a0ec0bba (diff) | |
| download | rockbox-e1753de41af9149b09fbacc6ac16515747d0b1f3.zip rockbox-e1753de41af9149b09fbacc6ac16515747d0b1f3.tar.gz rockbox-e1753de41af9149b09fbacc6ac16515747d0b1f3.tar.bz2 rockbox-e1753de41af9149b09fbacc6ac16515747d0b1f3.tar.xz | |
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
Diffstat (limited to 'apps/plugins/lib')
| -rw-r--r-- | apps/plugins/lib/SOURCES | 3 | ||||
| -rw-r--r-- | apps/plugins/lib/touchscreen.c | 133 | ||||
| -rw-r--r-- | apps/plugins/lib/touchscreen.h | 90 |
3 files changed, 226 insertions, 0 deletions
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES index 58074f5..c5c3a25 100644 --- a/apps/plugins/lib/SOURCES +++ b/apps/plugins/lib/SOURCES @@ -39,3 +39,6 @@ bmp_smooth_scale.c #endif pluginlib_actions.c helper.c +#ifdef HAVE_TOUCHPAD +touchscreen.c +#endif diff --git a/apps/plugins/lib/touchscreen.c b/apps/plugins/lib/touchscreen.c new file mode 100644 index 0000000..9acee9c --- /dev/null +++ b/apps/plugins/lib/touchscreen.c @@ -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 */ diff --git a/apps/plugins/lib/touchscreen.h b/apps/plugins/lib/touchscreen.h new file mode 100644 index 0000000..e7bc000 --- /dev/null +++ b/apps/plugins/lib/touchscreen.h @@ -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_ */ |