diff options
Diffstat (limited to 'apps/gui/skin_engine/skin_parser.c')
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 88 |
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 | } |