Fix touchregions muting volume, and change &<action> to mean 'needs long press but only fire once'. Use *<action> for 'long press and allow repeats'
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29653 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
86c4ec7277
commit
443b134983
6 changed files with 44 additions and 31 deletions
|
@ -248,6 +248,8 @@ enum {
|
||||||
ACTION_TOUCH_SHUFFLE,
|
ACTION_TOUCH_SHUFFLE,
|
||||||
ACTION_TOUCH_REPMODE,
|
ACTION_TOUCH_REPMODE,
|
||||||
ACTION_TOUCH_MUTE,
|
ACTION_TOUCH_MUTE,
|
||||||
|
ACTION_TOUCH_SCROLLBAR,
|
||||||
|
ACTION_TOUCH_VOLUME,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* USB HID codes */
|
/* USB HID codes */
|
||||||
|
|
|
@ -1030,6 +1030,7 @@ static int parse_touchregion(struct skin_element *element,
|
||||||
region->reverse_bar = false;
|
region->reverse_bar = false;
|
||||||
region->value = 0;
|
region->value = 0;
|
||||||
region->last_press = 0xffff;
|
region->last_press = 0xffff;
|
||||||
|
region->press_length = PRESS;
|
||||||
action = element->params[p++].data.text;
|
action = element->params[p++].data.text;
|
||||||
|
|
||||||
strcpy(temp, action);
|
strcpy(temp, action);
|
||||||
|
@ -1042,20 +1043,23 @@ static int parse_touchregion(struct skin_element *element,
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!strcmp(pb_string, action))
|
if(!strcmp(pb_string, action))
|
||||||
region->type = WPS_TOUCHREGION_SCROLLBAR;
|
region->action = ACTION_TOUCH_SCROLLBAR;
|
||||||
else if(!strcmp(vol_string, action))
|
else if(!strcmp(vol_string, action))
|
||||||
region->type = WPS_TOUCHREGION_VOLUME;
|
region->action = ACTION_TOUCH_VOLUME;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
region->type = WPS_TOUCHREGION_ACTION;
|
|
||||||
|
|
||||||
if (*action == '&')
|
if (*action == '&')
|
||||||
{
|
{
|
||||||
action++;
|
action++;
|
||||||
region->repeat = true;
|
region->press_length = LONG_PRESS;
|
||||||
|
}
|
||||||
|
else if(*action == '*')
|
||||||
|
{
|
||||||
|
action++;
|
||||||
|
region->press_length = REPEAT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
region->repeat = false;
|
region->press_length = PRESS;
|
||||||
|
|
||||||
imax = ARRAYLEN(touchactions);
|
imax = ARRAYLEN(touchactions);
|
||||||
for (i = 0; i < imax; i++)
|
for (i = 0; i < imax; i++)
|
||||||
|
|
|
@ -62,6 +62,7 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
|
||||||
bool released = (type == BUTTON_REL);
|
bool released = (type == BUTTON_REL);
|
||||||
bool pressed = (type == BUTTON_TOUCHSCREEN);
|
bool pressed = (type == BUTTON_TOUCHSCREEN);
|
||||||
struct skin_token_list *regions = data->touchregions;
|
struct skin_token_list *regions = data->touchregions;
|
||||||
|
bool needs_repeat;
|
||||||
|
|
||||||
while (regions)
|
while (regions)
|
||||||
{
|
{
|
||||||
|
@ -72,6 +73,7 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
|
||||||
regions = regions->next;
|
regions = regions->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
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))
|
||||||
{ /* reposition the touch inside the viewport since touchregions
|
{ /* reposition the touch inside the viewport since touchregions
|
||||||
|
@ -87,10 +89,25 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
|
||||||
vy -= r->y;
|
vy -= r->y;
|
||||||
|
|
||||||
|
|
||||||
switch(r->type)
|
switch(r->action)
|
||||||
{
|
{
|
||||||
case WPS_TOUCHREGION_ACTION:
|
case ACTION_TOUCH_SCROLLBAR:
|
||||||
if (r->armed && ((repeated && r->repeat) || (released && !r->repeat)))
|
case ACTION_TOUCH_VOLUME:
|
||||||
|
if (edge_offset)
|
||||||
|
{
|
||||||
|
if(r->width > r->height)
|
||||||
|
*edge_offset = vx*100/r->width;
|
||||||
|
else
|
||||||
|
*edge_offset = vy*100/r->height;
|
||||||
|
if (r->reverse_bar)
|
||||||
|
*edge_offset = 100 - *edge_offset;
|
||||||
|
}
|
||||||
|
temp = r;
|
||||||
|
returncode = r->action;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (r->armed && ((repeated && needs_repeat) ||
|
||||||
|
(released && !needs_repeat)))
|
||||||
{
|
{
|
||||||
last_action = r->action;
|
last_action = r->action;
|
||||||
returncode = r->action;
|
returncode = r->action;
|
||||||
|
@ -102,19 +119,6 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
|
||||||
r->last_press = current_tick;
|
r->last_press = current_tick;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
if (edge_offset)
|
|
||||||
{
|
|
||||||
if(r->width > r->height)
|
|
||||||
*edge_offset = vx*100/r->width;
|
|
||||||
else
|
|
||||||
*edge_offset = vy*100/r->height;
|
|
||||||
if (r->reverse_bar)
|
|
||||||
*edge_offset = 100 - *edge_offset;
|
|
||||||
}
|
|
||||||
returncode = r->type;
|
|
||||||
temp = r;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,6 +130,8 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
|
||||||
skin_disarm_touchregions(data);
|
skin_disarm_touchregions(data);
|
||||||
if (retregion && temp)
|
if (retregion && temp)
|
||||||
*retregion = temp;
|
*retregion = temp;
|
||||||
|
if (temp && temp->press_length == LONG_PRESS)
|
||||||
|
temp->armed = false;
|
||||||
|
|
||||||
if (returncode != ACTION_NONE)
|
if (returncode != ACTION_NONE)
|
||||||
{
|
{
|
||||||
|
|
|
@ -188,13 +188,12 @@ struct touchregion {
|
||||||
short int y; /* y-pos */
|
short int y; /* y-pos */
|
||||||
short int width; /* width */
|
short int width; /* width */
|
||||||
short int height; /* height */
|
short int height; /* height */
|
||||||
enum {
|
|
||||||
WPS_TOUCHREGION_ACTION,
|
|
||||||
WPS_TOUCHREGION_SCROLLBAR,
|
|
||||||
WPS_TOUCHREGION_VOLUME
|
|
||||||
} type; /* type of touch region */
|
|
||||||
bool reverse_bar; /* if true 0% is the left or top */
|
bool reverse_bar; /* if true 0% is the left or top */
|
||||||
bool repeat; /* requires the area be held for the action */
|
enum {
|
||||||
|
PRESS, /* quick press only */
|
||||||
|
LONG_PRESS, /* Long press without repeat */
|
||||||
|
REPEAT, /* long press allowing repeats */
|
||||||
|
} press_length;
|
||||||
int action; /* action this button will return */
|
int action; /* action this button will return */
|
||||||
bool armed; /* A region is armed on press. Only armed regions are triggered
|
bool armed; /* A region is armed on press. Only armed regions are triggered
|
||||||
on repeat or release. */
|
on repeat or release. */
|
||||||
|
|
|
@ -217,7 +217,7 @@ static int skintouch_to_wps(struct wps_data *data)
|
||||||
case ACTION_STD_HOTKEY:
|
case ACTION_STD_HOTKEY:
|
||||||
return ACTION_WPS_HOTKEY;
|
return ACTION_WPS_HOTKEY;
|
||||||
#endif
|
#endif
|
||||||
case WPS_TOUCHREGION_SCROLLBAR:
|
case ACTION_TOUCH_SCROLLBAR:
|
||||||
skin_get_global_state()->id3->elapsed = skin_get_global_state()->id3->length*offset/100;
|
skin_get_global_state()->id3->elapsed = skin_get_global_state()->id3->length*offset/100;
|
||||||
if (!skin_get_global_state()->paused)
|
if (!skin_get_global_state()->paused)
|
||||||
#if (CONFIG_CODEC == SWCODEC)
|
#if (CONFIG_CODEC == SWCODEC)
|
||||||
|
@ -231,7 +231,7 @@ static int skintouch_to_wps(struct wps_data *data)
|
||||||
audio_resume();
|
audio_resume();
|
||||||
#endif
|
#endif
|
||||||
return ACTION_TOUCHSCREEN;
|
return ACTION_TOUCHSCREEN;
|
||||||
case WPS_TOUCHREGION_VOLUME:
|
case ACTION_TOUCH_VOLUME:
|
||||||
{
|
{
|
||||||
const int min_vol = sound_min(SOUND_VOLUME);
|
const int min_vol = sound_min(SOUND_VOLUME);
|
||||||
const int max_vol = sound_max(SOUND_VOLUME);
|
const int max_vol = sound_max(SOUND_VOLUME);
|
||||||
|
|
|
@ -602,7 +602,9 @@ display cycling round the defined sublines. See
|
||||||
& Invoke the action specified when the user presses in the defined
|
& Invoke the action specified when the user presses in the defined
|
||||||
touchscreen area.\\
|
touchscreen area.\\
|
||||||
\end{tagmap}
|
\end{tagmap}
|
||||||
If the action starts with \& then the area must be held. Possible actions are:
|
If the action starts with \& then the area must be held.
|
||||||
|
If the action starts with \* then the area must be held and allows repeat presses.
|
||||||
|
Possible actions are:
|
||||||
|
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[play] -- Play/pause playback.
|
\item[play] -- Play/pause playback.
|
||||||
|
|
Loading…
Reference in a new issue