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

enum
{
  START,
  HIDE,
  SHOW,
  DONE
};

static int state = START;

static void
on_fullscreen (ClutterStage *stage)
{
  g_debug ("fullscreen set, size: %.2fx%.2f, mapped: %s",
           clutter_actor_get_width (CLUTTER_ACTOR (stage)),
           clutter_actor_get_height (CLUTTER_ACTOR (stage)),
           CLUTTER_ACTOR_IS_MAPPED (stage) ? "true" : "false");
}

static void
on_unfullscreen (ClutterStage *stage)
{
  g_debug ("fullscreen unset, size: %.2fx%.2f, mapped: %s",
           clutter_actor_get_width (CLUTTER_ACTOR (stage)),
           clutter_actor_get_height (CLUTTER_ACTOR (stage)),
           CLUTTER_ACTOR_IS_MAPPED (stage) ? "true" : "false");
}

static gboolean
toggle_fullscreen (gpointer dummy)
{
  ClutterActor *stage = clutter_stage_get_default ();
  gboolean is_fullscreen = FALSE;

  g_object_get (G_OBJECT (stage), "fullscreen-set", &is_fullscreen, NULL);

  switch (state)
    {
    case START:
      g_debug ("start: is_fullscreen := %s", is_fullscreen ? "true" : "false");
      clutter_actor_hide (stage);
      state = HIDE;
      return TRUE;

    case HIDE:
      g_debug ("hide:  is_fullscreen := %s", is_fullscreen ? "true" : "false");
      clutter_actor_show (stage);
      state = SHOW;
      return TRUE;

    case SHOW:
      g_debug ("show:  is_fullscreen := %s", is_fullscreen ? "true" : "false");
      clutter_stage_set_fullscreen (CLUTTER_STAGE (stage), FALSE);
      state = DONE;
      return TRUE;

    case DONE:
      g_debug ("done:  is_fullscreen := %s", is_fullscreen ? "true" : "false");
      clutter_main_quit ();
      break;
    }

  return FALSE;
}

G_MODULE_EXPORT int
test_fullscreen_main (int argc, char *argv[])
{
  ClutterActor *stage;

  if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
    return 1;

  stage = clutter_stage_get_default ();
  g_signal_connect (stage,
                    "fullscreen", G_CALLBACK (on_fullscreen),
                    NULL);
  g_signal_connect (stage,
                    "unfullscreen", G_CALLBACK (on_unfullscreen),
                    NULL);

  clutter_stage_set_fullscreen (CLUTTER_STAGE (stage), TRUE);
  clutter_actor_show (stage);

  g_debug ("stage size: %.2fx%.2f, mapped: %s",
           clutter_actor_get_width (stage),
           clutter_actor_get_height (stage),
           CLUTTER_ACTOR_IS_MAPPED (stage) ? "true" : "false");

  g_timeout_add (1000, toggle_fullscreen, NULL);

  clutter_main ();

  return EXIT_SUCCESS;
}
