diff options
Diffstat (limited to 'apps/gui/skin_engine/skin_touchsupport.c')
-rw-r--r-- | apps/gui/skin_engine/skin_touchsupport.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/apps/gui/skin_engine/skin_touchsupport.c b/apps/gui/skin_engine/skin_touchsupport.c index 64c797942c..59687bd99b 100644 --- a/apps/gui/skin_engine/skin_touchsupport.c +++ b/apps/gui/skin_engine/skin_touchsupport.c | |||
@@ -37,11 +37,14 @@ | |||
37 | /** Disarms all touchregions. */ | 37 | /** Disarms all touchregions. */ |
38 | void skin_disarm_touchregions(struct wps_data *data) | 38 | void skin_disarm_touchregions(struct wps_data *data) |
39 | { | 39 | { |
40 | struct skin_token_list *regions = data->touchregions; | 40 | char* skin_buffer = get_skin_buffer(data); |
41 | struct skin_token_list *regions = SKINOFFSETTOPTR(skin_buffer, data->touchregions); | ||
41 | while (regions) | 42 | while (regions) |
42 | { | 43 | { |
43 | ((struct touchregion *)regions->token->value.data)->armed = false; | 44 | struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token); |
44 | regions = regions->next; | 45 | struct touchregion *region = SKINOFFSETTOPTR(skin_buffer, token->value.data); |
46 | region->armed = false; | ||
47 | regions = SKINOFFSETTOPTR(skin_buffer, regions->next); | ||
45 | } | 48 | } |
46 | } | 49 | } |
47 | 50 | ||
@@ -56,35 +59,39 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset, | |||
56 | short x,y; | 59 | short x,y; |
57 | short vx, vy; | 60 | short vx, vy; |
58 | int type = action_get_touchscreen_press(&x, &y); | 61 | int type = action_get_touchscreen_press(&x, &y); |
62 | struct skin_viewport *wvp; | ||
59 | struct touchregion *r, *temp = NULL; | 63 | struct touchregion *r, *temp = NULL; |
64 | char* skin_buffer = get_skin_buffer(data); | ||
60 | bool repeated = (type == BUTTON_REPEAT); | 65 | bool repeated = (type == BUTTON_REPEAT); |
61 | bool released = (type == BUTTON_REL); | 66 | bool released = (type == BUTTON_REL); |
62 | bool pressed = (type == BUTTON_TOUCHSCREEN); | 67 | bool pressed = (type == BUTTON_TOUCHSCREEN); |
63 | struct skin_token_list *regions = data->touchregions; | 68 | struct skin_token_list *regions = SKINOFFSETTOPTR(skin_buffer, data->touchregions); |
64 | bool needs_repeat; | 69 | bool needs_repeat; |
65 | 70 | ||
66 | while (regions) | 71 | while (regions) |
67 | { | 72 | { |
68 | r = (struct touchregion *)regions->token->value.data; | 73 | struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token); |
74 | r = SKINOFFSETTOPTR(skin_buffer, token->value.data); | ||
75 | wvp = SKINOFFSETTOPTR(skin_buffer, r->wvp); | ||
69 | /* make sure this region's viewport is visible */ | 76 | /* make sure this region's viewport is visible */ |
70 | if (r->wvp->hidden_flags&VP_DRAW_HIDDEN) | 77 | if (wvp->hidden_flags&VP_DRAW_HIDDEN) |
71 | { | 78 | { |
72 | regions = regions->next; | 79 | regions = SKINOFFSETTOPTR(skin_buffer, regions->next); |
73 | continue; | 80 | continue; |
74 | } | 81 | } |
75 | if (data->touchscreen_locked && | 82 | if (data->touchscreen_locked && |
76 | (r->action != ACTION_TOUCH_SOFTLOCK && !r->allow_while_locked)) | 83 | (r->action != ACTION_TOUCH_SOFTLOCK && !r->allow_while_locked)) |
77 | { | 84 | { |
78 | regions = regions->next; | 85 | regions = SKINOFFSETTOPTR(skin_buffer, regions->next); |
79 | continue; | 86 | continue; |
80 | } | 87 | } |
81 | needs_repeat = r->press_length != PRESS; | 88 | needs_repeat = r->press_length != PRESS; |
82 | /* check if it's inside this viewport */ | 89 | /* check if it's inside this viewport */ |
83 | if (viewport_point_within_vp(&(r->wvp->vp), x, y)) | 90 | if (viewport_point_within_vp(&(wvp->vp), x, y)) |
84 | { /* reposition the touch inside the viewport since touchregions | 91 | { /* reposition the touch inside the viewport since touchregions |
85 | * are relative to a preceding viewport */ | 92 | * are relative to a preceding viewport */ |
86 | vx = x - r->wvp->vp.x; | 93 | vx = x - wvp->vp.x; |
87 | vy = y - r->wvp->vp.y; | 94 | vy = y - wvp->vp.y; |
88 | /* now see if the point is inside this region */ | 95 | /* now see if the point is inside this region */ |
89 | if (vx >= r->x && vx < r->x+r->width && | 96 | if (vx >= r->x && vx < r->x+r->width && |
90 | vy >= r->y && vy < r->y+r->height) | 97 | vy >= r->y && vy < r->y+r->height) |
@@ -127,7 +134,7 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset, | |||
127 | } | 134 | } |
128 | } | 135 | } |
129 | } | 136 | } |
130 | regions = regions->next; | 137 | regions = SKINOFFSETTOPTR(skin_buffer, regions->next); |
131 | } | 138 | } |
132 | 139 | ||
133 | /* On release, all regions are disarmed. */ | 140 | /* On release, all regions are disarmed. */ |
@@ -214,7 +221,7 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset, | |||
214 | { | 221 | { |
215 | case F_T_CUSTOM: | 222 | case F_T_CUSTOM: |
216 | s->custom_setting | 223 | s->custom_setting |
217 | ->load_from_cfg(s->setting, data->value.text); | 224 | ->load_from_cfg(s->setting, SKINOFFSETTOPTR(skin_buffer, data->value.text)); |
218 | break; | 225 | break; |
219 | case F_T_INT: | 226 | case F_T_INT: |
220 | case F_T_UINT: | 227 | case F_T_UINT: |