summaryrefslogtreecommitdiff
path: root/apps/plugins/lib
diff options
context:
space:
mode:
authorMaurus Cuelenaere <mcuelenaere@gmail.com>2008-06-06 18:29:46 +0000
committerMaurus Cuelenaere <mcuelenaere@gmail.com>2008-06-06 18:29:46 +0000
commite1753de41af9149b09fbacc6ac16515747d0b1f3 (patch)
tree82d98883cabd5fc4e4ea40398a0325d87ace27e8 /apps/plugins/lib
parentf9bf137b67d16a03100e392ab2171ae4a0ec0bba (diff)
downloadrockbox-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/SOURCES3
-rw-r--r--apps/plugins/lib/touchscreen.c133
-rw-r--r--apps/plugins/lib/touchscreen.h90
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_ */