From 0eb5dc649f34ca136d0160bf5d43961a2c3cea05 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Mon, 20 Apr 2009 01:41:56 +0000 Subject: beginings of a working touchscreen interface for the WPS. 2 new tags: %T|x|y|width|height|action| <- setup a region (relative to the current viewport) where if pressed the "action" will be done (currently play/stop/prev/next/menu/browse work, suggestions for others to add and better names welcome) %Tl <- used as a conditional to say if the touchscreen was touched in the last , use this to enable/disable button viewports or something... same syntax as other timeout tags cabbiev2 for the mr500 has been modified to demonstrate the new tags. press the pause/play button to pause playback. press the rockbox logo to get back to the menu. pretty icons needed to make this more usable :) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20753 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/wps_parser.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 4 deletions(-) (limited to 'apps/gui/wps_parser.c') diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c index 390df56cbb..290f370fe7 100644 --- a/apps/gui/wps_parser.c +++ b/apps/gui/wps_parser.c @@ -121,7 +121,7 @@ struct wps_tag { unsigned char refresh_type; const wps_tag_parse_func parse_func; }; - +static int skip_end_of_line(const char *wps_bufptr); /* prototypes of all special parse functions : */ static int parse_timeout(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); @@ -131,7 +131,7 @@ static int parse_dir_level(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); static int parse_setting(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); - + #ifdef HAVE_LCD_BITMAP static int parse_viewport_display(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); @@ -156,7 +156,18 @@ static int parse_albumart_load(const char *wps_bufptr, static int parse_albumart_conditional(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); #endif /* HAVE_ALBUMART */ - +#ifdef HAVE_TOUCHSCREEN +static int parse_touchregion(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data); +#else +static int fulline_tag_not_supported(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data) +{ + (void)token; (void)wps_data; + return skip_end_of_line(wps_bufptr); +} +#define parse_touchregion fulline_tag_not_supported +#endif #ifdef CONFIG_RTC #define WPS_RTC_REFRESH WPS_REFRESH_DYNAMIC #else @@ -337,7 +348,10 @@ static const struct wps_tag all_tags[] = { #endif { WPS_TOKEN_SETTING, "St", WPS_REFRESH_DYNAMIC, parse_setting }, - + + { WPS_TOKEN_LASTTOUCH, "Tl", WPS_REFRESH_DYNAMIC, parse_timeout }, + { WPS_NO_TOKEN, "T", 0, parse_touchregion }, + { WPS_TOKEN_UNKNOWN, "", 0, NULL } /* the array MUST end with an empty string (first char is \0) */ }; @@ -1142,6 +1156,70 @@ static int parse_albumart_conditional(const char *wps_bufptr, }; #endif /* HAVE_ALBUMART */ +#ifdef HAVE_TOUCHSCREEN + +struct touchaction {char* s; int action;}; +static struct touchaction touchactions[] = { + {"play", ACTION_WPS_PLAY }, {"stop", ACTION_WPS_STOP }, + {"prev", ACTION_WPS_SKIPPREV }, {"next", ACTION_WPS_SKIPNEXT }, + {"menu", ACTION_WPS_MENU }, {"browse", ACTION_WPS_BROWSE } +}; +static int parse_touchregion(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data) +{ + (void)token; + unsigned i; + struct touchregion *region; + const char *ptr = wps_bufptr; + const char *action; + int x,y,w,h; + + /* format: %T|x|y|width|height|action| + * action is one of: + * play - play/pause playback + * stop - stop playback, exit the wps + * prev - prev track + * next - next track + * ffwd + * rwd + * menu - go back to the main menu + * browse - go back to the file/db browser + */ + + if ((wps_data->touchregion_count +1 >= MAX_TOUCHREGIONS) || (*ptr != '|')) + return WPS_ERROR_INVALID_PARAM; + ptr++; + + if (!(ptr = parse_list("dddds", NULL, '|', ptr, &x, &y, &w, &h, &action))) + return WPS_ERROR_INVALID_PARAM; + + /* Check there is a terminating | */ + if (*ptr != '|') + return WPS_ERROR_INVALID_PARAM; + + /* should probably do some bounds checking here with the viewport... but later */ + region = &wps_data->touchregion[wps_data->touchregion_count]; + region->action = ACTION_NONE; + region->x = x; + region->y = y; + region->width = w; + region->height = h; + region->wvp = &wps_data->viewports[wps_data->num_viewports]; + i = 0; + while ((region->action == ACTION_NONE) && + (i < sizeof(touchactions)/sizeof(*touchactions))) + { + if (!strncmp(touchactions[i].s, action, strlen(touchactions[i].s))) + region->action = touchactions[i].action; + i++; + } + if (region->action == ACTION_NONE) + return WPS_ERROR_INVALID_PARAM; + wps_data->touchregion_count++; + return skip_end_of_line(wps_bufptr); +} +#endif + /* Parse a generic token from the given string. Return the length read */ static int parse_token(const char *wps_bufptr, struct wps_data *wps_data) { -- cgit v1.2.3