Click on icons.
diff --git a/res/raw/rollo.c b/res/raw/rollo.c
index f6097cf..028d537 100644
--- a/res/raw/rollo.c
+++ b/res/raw/rollo.c
@@ -29,30 +29,14 @@
 #define STATE_FLING_DURATION            6
 #define STATE_FLING_END_POS             7
 
-#define SCROLL_HANDLE_POS               8
+#define STATE_START_SCROLL_X            8
+#define STATE_SELECTED_ICON_INDEX       9
+#define STATE_SELECTED_ICON_TEXTURE     10
 
-// Scratch variables ======
-#define SCRATCH_ADJUSTED_DECELERATION   0
+#define STATE_BORDERY0                  11
 
 // Drawing constants, should be parameters ======
-#define SCREEN_WIDTH_PX 480
-#define SCREEN_HEIGHT 854
-
-#define PAGE_PADDING_TOP_PX 80
-#define CELL_PADDING_TOP_PX 5
-#define ICON_HEIGHT_PX 64
-#define ICON_TEXTURE_HEIGHT_PX 128
-#define ICON_LABEL_GUTTER_PX 5
-#define CELL_PADDING_BOTTOM_PX 5
-#define ROW_GUTTER_PX 10
-
-#define PAGE_PADDING_LEFT_PX 22
-#define CELL_WIDTH_PX 105
-#define ICON_WIDTH_PX 64
-#define ICON_TEXTURE_WIDTH_PX 128
-
 #define VIEW_ANGLE 1.28700222f
-#define RADIUS 4.0f
 
 int
 count_pages(int iconCount)
@@ -89,9 +73,11 @@
     float iconWidthAngle = VIEW_ANGLE * ICON_WIDTH_PX / SCREEN_WIDTH_PX;
     float columnGutterAngle = iconWidthAngle * 0.70f;
 
-    float farIconSize = far_size(2 * ICON_WIDTH_PX / (float)SCREEN_WIDTH_PX);
+    float farIconSize = FAR_ICON_SIZE;
     float iconGutterHeight = farIconSize * 1.1f;
 
+    float farIconTextureSize = far_size(2 * ICON_TEXTURE_WIDTH_PX / (float)SCREEN_WIDTH_PX);
+
     float labelWidthPx = loadI32(ALLOC_PARAMS, PARAM_BUBBLE_WIDTH);
     float labelHeightPx = loadI32(ALLOC_PARAMS, PARAM_BUBBLE_HEIGHT);
 
@@ -101,18 +87,22 @@
     float labelTextureWidth = labelWidthPx / loadI32(ALLOC_PARAMS, PARAM_BUBBLE_BITMAP_WIDTH);
     float labelTextureHeight = labelHeightPx / loadI32(ALLOC_PARAMS, PARAM_BUBBLE_BITMAP_HEIGHT);
 
+    int selectedIconIndex = loadI32(ALLOC_STATE, STATE_SELECTED_ICON_INDEX);
 
     for (row=0; row<ROWS_PER_PAGE && icon<=lastIcon; row++) {
         float angle = centerAngle;
         angle -= (columnGutterAngle + iconWidthAngle) * 1.5f;
 
-        float iconTop = (farIconSize + iconGutterHeight) * 2.2f
+        float iconTop = (farIconSize + iconGutterHeight) * (2.0f + ICON_TOP_OFFSET)
                 - row * (farIconSize + iconGutterHeight);
         float iconBottom = iconTop - farIconSize;
 
         float labelTop = iconBottom - (.1 * farLabelHeight);
         float labelBottom = labelTop - farLabelHeight;
 
+        float iconTextureTop = iconTop + (0.5f * (farIconTextureSize - farIconSize));
+        float iconTextureBottom = iconTextureTop - farIconTextureSize;
+
         for (col=0; col<COLUMNS_PER_PAGE && icon<=lastIcon; col++) {
             // icon
             float sine = sinf(angle);
@@ -121,17 +111,26 @@
             float centerX = sine * RADIUS;
             float centerZ = cosine * RADIUS;
 
-            float iconLeftX = centerX  - (cosine * farIconSize * .5);
-            float iconRightX = centerX + (cosine * farIconSize * .5);
-            float iconLeftZ = centerZ + (sine * farIconSize * .5);
-            float iconRightZ = centerZ - (sine * farIconSize * .5);
+            float iconLeftX = centerX  - (cosine * farIconTextureSize * .5);
+            float iconRightX = centerX + (cosine * farIconTextureSize * .5);
+            float iconLeftZ = centerZ + (sine * farIconTextureSize * .5);
+            float iconRightZ = centerZ - (sine * farIconTextureSize * .5);
+
+            if (selectedIconIndex == icon) {
+                bindTexture(NAMED_PF, 0, loadI32(ALLOC_STATE, STATE_SELECTED_ICON_TEXTURE));
+                drawQuadTexCoords(
+                        iconLeftX, iconTextureTop, iconLeftZ,       0.0f, 0.0f,
+                        iconRightX, iconTextureTop, iconRightZ,     1.0f, 0.0f,
+                        iconRightX, iconTextureBottom, iconRightZ,  1.0f, 1.0f,
+                        iconLeftX, iconTextureBottom, iconLeftZ,    0.0f, 1.0f);
+            }
 
             bindTexture(NAMED_PF, 0, loadI32(ALLOC_ICON_IDS, icon));
             drawQuadTexCoords(
-                    iconLeftX, iconTop, iconLeftZ,       0.0f, 0.0f,
-                    iconRightX, iconTop, iconRightZ,     iconTextureWidth, 0.0f,
-                    iconRightX, iconBottom, iconRightZ,  iconTextureWidth, iconTextureHeight,
-                    iconLeftX, iconBottom, iconLeftZ,    0.0f, iconTextureHeight);
+                    iconLeftX, iconTextureTop, iconLeftZ,       0.0f, 0.0f,
+                    iconRightX, iconTextureTop, iconRightZ,     1.0f, 0.0f,
+                    iconRightX, iconTextureBottom, iconRightZ,  1.0f, 1.0f,
+                    iconLeftX, iconTextureBottom, iconLeftZ,    0.0f, 1.0f);
 
             // label
             float labelLeftX = centerX - farLabelWidth * 0.5f;
@@ -160,17 +159,6 @@
     int iconCount = loadI32(ALLOC_STATE, STATE_ICON_COUNT);
     int pageCount = count_pages(iconCount);
 
-    float densityScale = 2.0f / SCREEN_WIDTH_PX;
-    float screenTop = SCREEN_HEIGHT/(float)SCREEN_WIDTH_PX; // == (SCREEN_HEIGHT/2)*densityScale;
-
-    float pagePaddingTop = screenTop - (PAGE_PADDING_TOP_PX * densityScale);
-    float pageGutterY = ROW_GUTTER_PX * densityScale;
-    float cellHeight = (CELL_PADDING_TOP_PX + ICON_HEIGHT_PX + ICON_LABEL_GUTTER_PX
-            + loadI32(ALLOC_PARAMS, PARAM_BUBBLE_HEIGHT)
-            + CELL_PADDING_BOTTOM_PX + ROW_GUTTER_PX) * densityScale;
-    float cellPaddingTop = CELL_PADDING_TOP_PX * densityScale;
-    float iconLabelGutter = ICON_LABEL_GUTTER_PX * densityScale;
-
     float scrollXPx = loadI32(ALLOC_STATE, STATE_SCROLL_X);
     float maxScrollXPx = -(pageCount-1) * SCREEN_WIDTH_PX;
     int done = 0;
@@ -313,12 +301,26 @@
     draw_page(icon, lastIcon, -VIEW_ANGLE*currentPagePosition);
     draw_page(icon+iconsPerPage, lastIcon, (-VIEW_ANGLE*currentPagePosition)+VIEW_ANGLE);
     
-    // Draw the scroll handle ========================================
+    // Draw the border lines for debugging ========================================
     /*
     bindProgramVertex(NAMED_PVOrtho);
     bindProgramFragment(NAMED_PFText);
     bindProgramFragmentStore(NAMED_PFSText);
 
+    color(1.0f, 1.0f, 0.0f, 0.99f);
+    int i;
+    for (i=0; i<ROWS_PER_PAGE+1; i++) {
+        int y = loadI32(ALLOC_Y_BORDERS, i);
+        drawRect(0, y, SCREEN_WIDTH_PX, y+1, 0.0f);
+    }
+    for (i=0; i<COLUMNS_PER_PAGE+1; i++) {
+        int x = loadI32(ALLOC_X_BORDERS, i);
+        drawRect(x, 0, x+1, SCREEN_HEIGHT_PX, 0.0f);
+    }
+    */
+
+    // Draw the scroll handle ========================================
+    /*
     bindTexture(NAMED_PFText, 0, loadI32(ALLOC_PARAMS, PARAM_SCROLL_HANDLE_ID));
     float handleLeft = 40 + (320 * (scrollXPx/(float)(maxScrollXPx)));
     float handleTop = 680;