NONE on-entry: edge = none threshold = def EDGE_NEW on-entry: edge = get_edge() set_timer() AREA on-entry: edge = none set_pointer() release touch touch, edge &= get_edge() tp_edge_scroll_post_events() dirty? no yes current = buttons.state & 0x01 old = buttons.old_state & 0x01 button = 0 is_top = 0 notify_axis(last_axis, 0.0) last_axis = -1 edge == right yes axis = scroll_vertical delta = dy edge == none no edge == bottom yes no axis = scroll_horizontal delta = dx no get_delta() notify_axis(axis, delta) last_axis = axis emit(scroll_event_posted) delta < threshold yes no last_axis != -1 EDGE on-entry: threshold = 0.01 timeout || scroll_event_posted yes yes no yes no get_edge() edge no yes