collections {
   group { name: "main";
      script {
         public timer_cb(val) {
            new x, y, w, h;
            new buf[32];

            /* set labels with object info */
            get_geometry(PART:"red_rect", x, y, w, h);
            snprintf(buf, sizeof(buf), "Timer called %d times.", val);
            set_text(PART:"label1", buf)
            snprintf(buf, sizeof(buf), "Object x: %d  w: %d", x, w);
            set_text(PART:"label2", buf)

            /* renew the timer */
            timer(1 / 30, "timer_cb", val + 1);
         }
      }
      parts {
         part { name: "bg";
            type: RECT;
            description { state: "default" 0.0;
               color: 255 255 255 255;
            }
         }
         part { name: "label1";
            type: TEXT;
            description { state: "default" 0.0;
               color: 0 0 0 255;
               text {
                  text: "";
                  font: "Sans";
                  size: 12;
                  align: 0.0 0.7;
               }
            }
         }
         part { name: "label2";
            type: TEXT;
            description { state: "default" 0.0;
               color: 0 0 0 255;
               text {
                  font: "Sans";
                  size: 12;
                  align: 0.0 0.8;
               }
            }
         }
         part { name: "red_rect";
            type: RECT;
            description { state: "default" 0.0;
               color: 255 0 0 255;
               max: 30 30;
               align: 0.1 0.2;
            }
            description { state: "default" 1.0;
               inherit: "default" 0.0;
               color: 0 0 255 255;
               max: 50 30;
               align: 0.9 0.2;
            }
         }
      }
      programs {
         /* move the red rect back an forth in a loop */
         program { name: "init";
            signal: "load";
            source: "";
            action: STATE_SET "default" 1.0;
            transition: SINUSOIDAL 1.0;
            target: "red_rect";
            after: "loop";
         }
         program { name: "loop";
            action: STATE_SET "default" 0.0;
            transition: SINUSOIDAL 1.0;
            target: "red_rect";
            after: "init";
         }
         /* run the timer_cb for the first time */
         program { name: "init2";
            signal: "load";
            source: "";
            script {
                timer_cb(0);
            }
         }
      }
   }
}
