summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_parser.c')
-rw-r--r--apps/gui/skin_engine/skin_parser.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 4de0aae3b2..8e7d79b44f 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -871,6 +871,9 @@ static int parse_progressbar_tag(struct skin_element* element,
871 struct skin_tag_parameter *param = get_param(element, 0); 871 struct skin_tag_parameter *param = get_param(element, 0);
872 int curr_param = 0; 872 int curr_param = 0;
873 char *image_filename = NULL; 873 char *image_filename = NULL;
874#ifdef HAVE_TOUCHSCREEN
875 bool suppress_touchregion = false;
876#endif
874 877
875 if (element->params_count == 0 && 878 if (element->params_count == 0 &&
876 element->tag->type != SKIN_TOKEN_PROGRESSBAR) 879 element->tag->type != SKIN_TOKEN_PROGRESSBAR)
@@ -1008,6 +1011,10 @@ static int parse_progressbar_tag(struct skin_element* element,
1008 } 1011 }
1009 else if (!strcmp(text, "horizontal")) 1012 else if (!strcmp(text, "horizontal"))
1010 pb->horizontal = true; 1013 pb->horizontal = true;
1014#ifdef HAVE_TOUCHSCREEN
1015 else if (!strcmp(text, "notouch"))
1016 suppress_touchregion = true;
1017#endif
1011 else if (curr_param == 4) 1018 else if (curr_param == 4)
1012 image_filename = text; 1019 image_filename = text;
1013 1020
@@ -1055,6 +1062,61 @@ static int parse_progressbar_tag(struct skin_element* element,
1055 token->type = SKIN_TOKEN_LIST_SCROLLBAR; 1062 token->type = SKIN_TOKEN_LIST_SCROLLBAR;
1056 pb->type = token->type; 1063 pb->type = token->type;
1057 1064
1065#ifdef HAVE_TOUCHSCREEN
1066 if (!suppress_touchregion &&
1067 (token->type == SKIN_TOKEN_VOLUMEBAR || token->type == SKIN_TOKEN_PROGRESSBAR))
1068 {
1069 struct touchregion *region = skin_buffer_alloc(sizeof(*region));
1070 struct skin_token_list *item;
1071 int wpad, hpad;
1072
1073 if (!region)
1074 return 0;
1075
1076 if (token->type == SKIN_TOKEN_VOLUMEBAR)
1077 region->action = ACTION_TOUCH_VOLUME;
1078 else
1079 region->action = ACTION_TOUCH_SCROLLBAR;
1080
1081 /* try to add some extra space on either end to make pressing the
1082 * full bar easier. ~5% on either side
1083 */
1084 wpad = pb->width * 5 / 100;
1085 if (wpad > 10)
1086 wpad = 10;
1087 hpad = pb->height * 5 / 100;
1088 if (hpad > 10)
1089 hpad = 10;
1090
1091 region->x = pb->x - wpad;
1092 if (region->x < 0)
1093 region->x = 0;
1094 region->width = pb->width + 2 * wpad;
1095 if (region->x + region->width > curr_vp->vp.x + curr_vp->vp.width)
1096 region->width = curr_vp->vp.x + curr_vp->vp.width - region->x;
1097
1098 region->y = pb->y - hpad;
1099 if (region->y < 0)
1100 region->y = 0;
1101 region->height = pb->height + 2 * hpad;
1102 if (region->y + region->height > curr_vp->vp.y + curr_vp->vp.height)
1103 region->height = curr_vp->vp.y + curr_vp->vp.height - region->y;
1104
1105 region->wvp = PTRTOSKINOFFSET(skin_buffer, curr_vp);
1106 region->reverse_bar = false;
1107 region->allow_while_locked = false;
1108 region->press_length = PRESS;
1109 region->last_press = 0xffff;
1110 region->armed = false;
1111 region->bar = PTRTOSKINOFFSET(skin_buffer, pb);
1112
1113 item = new_skin_token_list_item(NULL, region);
1114 if (!item)
1115 return WPS_ERROR_INVALID_PARAM;
1116 add_to_ll_chain(&wps_data->touchregions, item);
1117 }
1118#endif
1119
1058 return 0; 1120 return 0;
1059 1121
1060#else 1122#else
@@ -1429,6 +1491,7 @@ static int parse_touchregion(struct skin_element *element,
1429 region->last_press = 0xffff; 1491 region->last_press = 0xffff;
1430 region->press_length = PRESS; 1492 region->press_length = PRESS;
1431 region->allow_while_locked = false; 1493 region->allow_while_locked = false;
1494 region->bar = -1;
1432 action = get_param_text(element, p++); 1495 action = get_param_text(element, p++);
1433 1496
1434 /* figure out the action */ 1497 /* figure out the action */
@@ -2324,6 +2387,31 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
2324#else 2387#else
2325 wps_data->wps_loaded = wps_data->tree >= 0; 2388 wps_data->wps_loaded = wps_data->tree >= 0;
2326#endif 2389#endif
2390
2391#ifdef HAVE_TOUCHSCREEN
2392 /* Check if there are any touch regions from the skin and not just
2393 * auto-created ones for bars */
2394 struct skin_token_list *regions = SKINOFFSETTOPTR(skin_buffer,
2395 wps_data->touchregions);
2396 bool user_touch_region_found = false;
2397 while (regions)
2398 {
2399 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token);
2400 struct touchregion *r = SKINOFFSETTOPTR(skin_buffer, token->value.data);
2401
2402 if (r->action != ACTION_TOUCH_SCROLLBAR &&
2403 r->action != ACTION_TOUCH_VOLUME)
2404 {
2405 user_touch_region_found = true;
2406 break;
2407 }
2408 regions = SKINOFFSETTOPTR(skin_buffer, regions->next);
2409 }
2410 regions = SKINOFFSETTOPTR(skin_buffer, wps_data->touchregions);
2411 if (regions && !user_touch_region_found)
2412 wps_data->touchregions = -1;
2413#endif
2414
2327 skin_buffer = NULL; 2415 skin_buffer = NULL;
2328 return true; 2416 return true;
2329} 2417}