#include <stdlib.h>
#include <clutter/clutter.h>

static void
on_button_press_cb (ClutterStage *stage,
                    ClutterEvent *event,
                    gpointer      data)
{
  ClutterActor *rect;
  gint x, y;

  clutter_event_get_coords (event, &x, &y);
  rect = clutter_stage_get_actor_at_pos (stage, x, y);
  if (!rect)
    return;

  if (!CLUTTER_IS_RECTANGLE (rect))
    {
      g_print ("[!] No rectangle selected (%s selected instead)\n",
               g_type_name (G_OBJECT_TYPE (rect)));
      return;
    }

  g_print ("[*] Picked rectangle at (%d, %d)\n", x, y);
}

static void
on_key_press_cb (ClutterStage *stage,
                 ClutterEvent *event,
                 gpointer      data)
{
  ClutterKeyEvent *key_event = (ClutterKeyEvent *) event;

  if (clutter_key_event_symbol (key_event) == CLUTTER_Escape)
    clutter_main_quit ();
}

int
main (int argc, char *argv[])
{
  ClutterActor *stage;
  ClutterActor *vbox;
  ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff };
  ClutterColor label_color = { 0xff, 0xff, 0xff, 0x99 };
  gint i, j;

  clutter_init (&argc, &argv);

  stage = clutter_stage_get_default ();
  clutter_actor_set_size (stage, 800, 600);
  clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
  g_signal_connect (stage, "button-press-event",
                    G_CALLBACK (on_button_press_cb),
                    NULL);
  g_signal_connect (stage, "key-press-event",
                    G_CALLBACK (on_key_press_cb),
                    NULL);

  vbox = clutter_vbox_new ();
  clutter_box_set_default_padding (CLUTTER_BOX (vbox), 10, 0, 10, 0);
  clutter_actor_set_position (vbox, 100, 100);
  clutter_container_add_actor (CLUTTER_CONTAINER (stage), vbox);
  clutter_actor_show (vbox);

  for (i = 0; i < 3; i++)
    {
      ClutterActor *hbox;

      hbox = clutter_hbox_new ();

      for (j = 0; j < 3; j++)
        {
          ClutterActor *rect;
          ClutterPadding rect_padding;

          rect = clutter_rectangle_new_with_color (&label_color);
          clutter_actor_set_size (rect, 100, 100);

          rect_padding.top = rect_padding.bottom = 0;
          rect_padding.left = CLUTTER_UNITS_FROM_INT (10);
          rect_padding.right = CLUTTER_UNITS_FROM_INT (10);

          clutter_box_pack (CLUTTER_BOX (hbox), rect,
                            CLUTTER_PACK_START,
                            &rect_padding);
          clutter_actor_show (rect);

          g_print ("rect[%d][%d] - (x:%3d, y:%3d, w:%3d, h:%3d)\n",
                   i, j,
                   clutter_actor_get_x (rect),
                   clutter_actor_get_y (rect),
                   clutter_actor_get_width (rect),
                   clutter_actor_get_height (rect));
        }

      clutter_box_pack_defaults (CLUTTER_BOX (vbox), hbox);
      clutter_actor_show (hbox);

      g_print ("hbox[%d]    - (x:%3d, y:%3d, w:%3d, h:%3d)\n",
               i,
               clutter_actor_get_x (hbox),
               clutter_actor_get_y (hbox),
               clutter_actor_get_width (hbox),
               clutter_actor_get_height (hbox));

    }

  clutter_actor_show_all (stage);

  g_print ("vbox       - (x:%3d, y:%3d, w:%3d, h:%3d)\n",
           clutter_actor_get_x (vbox),
           clutter_actor_get_y (vbox),
           clutter_actor_get_width (vbox),
           clutter_actor_get_height (vbox));

  clutter_main ();

  return EXIT_SUCCESS;
}