+ Container::button_press(x, y, btn);
+ if(click_focus && btn==1)
+ set_selected_item(click_focus);
+ }
+}
+
+void List::touch_press(int x, int y, unsigned finger)
+{
+ if(finger==0)
+ {
+ dragging = true;
+ drag_start_x = x;
+ drag_start_y = y;
+ }
+}
+
+void List::touch_release(int x, int y, unsigned finger)
+{
+ if(finger==0)
+ {
+ int dx = x-drag_start_x;
+ int dy = y-drag_start_y;
+ if(dx*dx+dy*dy<25)
+ {
+ Container::touch_press(drag_start_x, drag_start_y, finger);
+ if(touch_focus)
+ set_selected_item(touch_focus);
+ Container::touch_motion(x, y, finger);
+ Container::touch_release(x, y, finger);
+ }
+ dragging = false;
+ }
+}
+
+void List::touch_motion(int, int y, unsigned finger)
+{
+ if(finger==0 && !items.empty() && dragging)
+ {
+ int dy = y-drag_start_y;
+ if(dy>0 && first_row<max_scroll)
+ {
+ int row_h = rows[first_row].height;
+ if(dy>row_h)
+ {
+ drag_start_y += row_h;
+ slider.set_value(max_scroll-(first_row+1));
+ }
+ }
+ else if(dy<0 && first_row>0)
+ {
+ int row_h = rows[first_row-1].height;
+ if(-dy>row_h)