skin engine softlock support for touchscreens:

Modify the %Tl() tag to add a new region 'lock' which will lock/unlock the wps/sbs from touches (hardware buttons still work)
You can also specify a region to work when locked by prepending ^ to the action name (this is probably about to change though)

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30218 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jonathan Gordon 2011-07-28 11:26:01 +00:00
parent b9f3230273
commit bb618dbd84
5 changed files with 28 additions and 5 deletions

View file

@ -250,6 +250,7 @@ enum {
ACTION_TOUCH_MUTE, ACTION_TOUCH_MUTE,
ACTION_TOUCH_SCROLLBAR, ACTION_TOUCH_SCROLLBAR,
ACTION_TOUCH_VOLUME, ACTION_TOUCH_VOLUME,
ACTION_TOUCH_SOFTLOCK,
#endif #endif
/* USB HID codes */ /* USB HID codes */

View file

@ -1039,7 +1039,7 @@ static int parse_lasttouch(struct skin_element *element,
struct touchaction {const char* s; int action;}; struct touchaction {const char* s; int action;};
static const struct touchaction touchactions[] = { static const struct touchaction touchactions[] = {
/* generic actions, convert to screen actions on use */ /* generic actions, convert to screen actions on use */
{"none", ACTION_TOUCHSCREEN}, {"none", ACTION_TOUCHSCREEN}, {"lock", ACTION_TOUCH_SOFTLOCK },
{"prev", ACTION_STD_PREV }, {"next", ACTION_STD_NEXT }, {"prev", ACTION_STD_PREV }, {"next", ACTION_STD_NEXT },
{"rwd", ACTION_STD_PREVREPEAT }, {"ffwd", ACTION_STD_NEXTREPEAT }, {"rwd", ACTION_STD_PREVREPEAT }, {"ffwd", ACTION_STD_NEXTREPEAT },
{"hotkey", ACTION_STD_HOTKEY}, {"select", ACTION_STD_OK }, {"hotkey", ACTION_STD_HOTKEY}, {"select", ACTION_STD_OK },
@ -1122,17 +1122,23 @@ static int parse_touchregion(struct skin_element *element,
region->value = 0; region->value = 0;
region->last_press = 0xffff; region->last_press = 0xffff;
region->press_length = PRESS; region->press_length = PRESS;
region->allow_while_locked = false;
action = element->params[p++].data.text; action = element->params[p++].data.text;
strcpy(temp, action); strcpy(temp, action);
action = temp; action = temp;
if (*action == '!') switch (*action)
{ {
region->reverse_bar = true; case '!':
action++; region->reverse_bar = true;
action++;
break;
case '^':
action++;
region->allow_while_locked = true;
break;
} }
if(!strcmp(pb_string, action)) if(!strcmp(pb_string, action))
region->action = ACTION_TOUCH_SCROLLBAR; region->action = ACTION_TOUCH_SCROLLBAR;
else if(!strcmp(vol_string, action)) else if(!strcmp(vol_string, action))

View file

@ -1378,6 +1378,10 @@ const char *get_token_value(struct gui_wps *gwps,
#endif #endif
case SKIN_TOKEN_MAIN_HOLD: case SKIN_TOKEN_MAIN_HOLD:
#ifdef HAVE_TOUCHSCREEN
if (data->touchscreen_locked)
return "t";
#endif
#ifdef HAS_BUTTON_HOLD #ifdef HAS_BUTTON_HOLD
if (button_hold()) if (button_hold())
#else #else

View file

@ -72,6 +72,12 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
regions = regions->next; regions = regions->next;
continue; continue;
} }
if (data->touchscreen_locked &&
(r->action != ACTION_TOUCH_SOFTLOCK && !r->allow_while_locked))
{
regions = regions->next;
continue;
}
needs_repeat = r->press_length != PRESS; needs_repeat = r->press_length != PRESS;
/* check if it's inside this viewport */ /* check if it's inside this viewport */
if (viewport_point_within_vp(&(r->wvp->vp), x, y)) if (viewport_point_within_vp(&(r->wvp->vp), x, y))
@ -150,6 +156,10 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
} }
switch (returncode) switch (returncode)
{ {
case ACTION_TOUCH_SOFTLOCK:
data->touchscreen_locked = !data->touchscreen_locked;
returncode = ACTION_NONE;
break;
case ACTION_WPS_PLAY: case ACTION_WPS_PLAY:
if (!audio_status()) if (!audio_status())
{ {

View file

@ -189,6 +189,7 @@ struct touchregion {
short int width; /* width */ short int width; /* width */
short int height; /* height */ short int height; /* height */
bool reverse_bar; /* if true 0% is the left or top */ bool reverse_bar; /* if true 0% is the left or top */
bool allow_while_locked;
enum { enum {
PRESS, /* quick press only */ PRESS, /* quick press only */
LONG_PRESS, /* Long press without repeat */ LONG_PRESS, /* Long press without repeat */
@ -308,6 +309,7 @@ struct wps_data
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
struct skin_token_list *touchregions; struct skin_token_list *touchregions;
bool touchscreen_locked;
#endif #endif
#ifdef HAVE_ALBUMART #ifdef HAVE_ALBUMART
struct skin_albumart *albumart; struct skin_albumart *albumart;