+ unsigned change = 3;
+ if(btn==4)
+ {
+ change = min(first_row, change);
+ slider.set_value(max_scroll-(first_row-change));
+ }
+ else if(btn==5)
+ {
+ change = min(max_scroll-first_row, change);
+ slider.set_value(max_scroll-(first_row+change));
+ }
+ }
+ else
+ {
+ 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)