Tizen Native API  9.0
Inwin - General overview

Inwin is a very simple widget to show, so this example will be a very simple one, just using all of the available API.

And the code is just as simple. We being with some global variables to keep track of our Inwin.

static Evas_Object *inwin = NULL;
static const char *styles[] = {
     "default",
     "minimal",
     "minimal_vertical"
};
static int current_style = 0;

And two callbacks used by the buttons the above screenshot showed. In these, we check if inwin exists and execute the proper action on it. If it's not there anymore, then we were abandoned to our luck, so we disabled ourselves.

static void
_inwin_hide(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
{
   if (inwin)
     {
        evas_object_hide(inwin);
        return;
     }
   elm_object_text_set(obj, "No inwin!");
   elm_object_disabled_set(obj, EINA_TRUE);
}

static void
_inwin_destroy(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
{
   if (inwin)
     {
        evas_object_del(inwin);
        inwin = NULL;
        return;
     }
   elm_object_text_set(obj, "No inwin!");
   elm_object_disabled_set(obj, EINA_TRUE);
}

The lonely button from the beginning, when clicked, will call the following function, which begins by checking if an inwin exists, and if it's there, we bring it back to the front and exit from our function without any further ado.

static void
_btn_click_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
{
   Evas_Object *o, *parent;

   if (inwin)
     {
        elm_win_inwin_activate(inwin);
        return;
     }

But if no inwin is there to show, we need to create one. First we need the top-most window for the program, as no inwin can be created using other objects as parents. Then we create our popup, set the next style in the list and show it.

   parent = elm_object_top_widget_get(obj);
   inwin = elm_win_inwin_add(parent);
   elm_object_style_set(inwin, styles[current_style]);
   evas_object_show(inwin);

   current_style = (current_style + 1) % 3;

As for the content of our inwin, it's just a box with a label and some buttons inside.

   o = elm_box_add(parent);
   evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
   elm_win_inwin_content_set(inwin, o);
   evas_object_show(o);

   o = elm_label_add(parent);
   elm_object_text_set(o, "Click on the first button to hide the Inwin.<ps>"
                       "Second to destroy it<ps>");
   evas_object_show(o);

   elm_box_pack_end(elm_win_inwin_content_get(inwin), o);

   o = elm_button_add(parent);
   elm_object_text_set(o, "Hide");
   evas_object_show(o);

   evas_object_smart_callback_add(o, "clicked", _inwin_hide, NULL);

   elm_box_pack_end(elm_win_inwin_content_get(inwin), o);

   o = elm_button_add(parent);
   elm_object_text_set(o, "Destroy");
   evas_object_show(o);

   evas_object_smart_callback_add(o, "clicked", _inwin_destroy, NULL);

   elm_box_pack_end(elm_win_inwin_content_get(inwin), o);
}

Now, all the code above shows how every object must always be set as content for some other object, be it by setting the full content, packing it in a box or table or working as icon for some other widget. But we didn't do anything like that for the inwin, this one is just created and shown and everything works. Other widgets can be used this way, but they would need to be placed and resized manually or nothing would be shown correctly. The inwin, however, sets itself as a children of the top-level window and will be resized as the parent window changes too.

Another characteristic of Inwin is that when it's shown above everyone else, it will work kind of like a modal window, blocking any other widget from receiving events until the window is manually dismissed by pressing some button to close it or having blocking task signalling its completion so normal operations can be resumed. This is unlike the Elm_Hover widget, that would show its content on top of the designated target, but clicking anywhere else would dismiss it automatically.

To illustrate that last point, when we close the main window and an inwin is still there, we'll take out the content from the inwin and place it in a hover.

static void
_win_del_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
{
   if (inwin)
     {
        Evas_Object *hover, *o = elm_win_inwin_content_unset(inwin);
        evas_object_del(inwin);
        inwin = NULL;
        hover = elm_hover_add(obj);
        elm_hover_target_set(hover, obj);
        elm_object_part_content_set(hover, "middle", o);
        evas_object_show(hover);
        return;
     }
   evas_object_del(obj);
}

And the rest of the program doesn't have anything else related to inwin, so it won't be shown here, but you can find it in inwin_example.c.