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.

The program is nothing but a window with a lonely button, as shown here.

And pressing the button makes an inwin appear.

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;
Evas_Object
Efl_Canvas_Object Evas_Object
An Evas Object handle.
Definition: Evas_Common.h:185

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)
EINA_TRUE
#define EINA_TRUE
boolean value TRUE (numerical value 1)
Definition: eina_types.h:539
EINA_UNUSED
#define EINA_UNUSED
Used to indicate that a function parameter is purposely unused.
Definition: eina_types.h:339
elm_object_disabled_set
void elm_object_disabled_set(Evas_Object *obj, Eina_Bool disabled)
Set the disabled state of an Elementary object.
Definition: elm_main.c:1613
evas_object_hide
EVAS_API void evas_object_hide(Evas_Object *eo_obj)
Makes the given Evas object invisible.
Definition: evas_object_main.c:1823
{
if (inwin)
{
evas_object_del(inwin);
inwin = NULL;
return;
}
evas_object_del
EVAS_API void evas_object_del(Evas_Object *obj)
Marks the given Evas object for deletion (when Evas will free its memory).
Definition: evas_object_main.c:928
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;
}
elm_win_inwin_activate
void elm_win_inwin_activate(Elm_Inwin *obj)
Activates an inwin object, ensuring its visibility.
Definition: elm_inwin_eo.legacy.c:3

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;
elm_win_inwin_add
Evas_Object * elm_win_inwin_add(Evas_Object *parent)
Adds an inwin to the current window.
Definition: elm_inwin.c:50
elm_object_style_set
Eina_Bool elm_object_style_set(Evas_Object *obj, const char *style)
Set the style to used by a given widget.
Definition: elm_main.c:1583
elm_object_top_widget_get
Evas_Object * elm_object_top_widget_get(const Evas_Object *obj)
Get the top level parent of an Elementary widget.
Definition: elm_main.c:1840
evas_object_show
EVAS_API void evas_object_show(Evas_Object *eo_obj)
Makes the given Evas object visible.
Definition: evas_object_main.c:1814

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);
EVAS_HINT_EXPAND
#define EVAS_HINT_EXPAND
Use with evas_object_size_hint_weight_set(), evas_object_size_hint_weight_get(), evas_object_size_hin...
Definition: Evas_Common.h:297
EVAS_HINT_FILL
#define EVAS_HINT_FILL
Use with evas_object_size_hint_align_set(), evas_object_size_hint_align_get(), evas_object_size_hint_...
Definition: Evas_Common.h:298
elm_box_add
Evas_Object * elm_box_add(Evas_Object *parent)
Add a new box to the parent.
Definition: elm_box.c:363
elm_box_pack_end
void elm_box_pack_end(Elm_Box *obj, Efl_Canvas_Object *subobj)
Add an object at the end of the pack list.
Definition: elm_box_eo.legacy.c:57
elm_button_add
Evas_Object * elm_button_add(Evas_Object *parent)
Add a new button to the parent's canvas.
Definition: efl_ui_button.c:459
elm_win_inwin_content_get
Evas_Object * elm_win_inwin_content_get(const Evas_Object *obj)
Get the content of an inwin object.
Definition: elm_inwin.c:100
elm_win_inwin_content_set
void elm_win_inwin_content_set(Evas_Object *obj, Evas_Object *content)
Set the content of an inwin object.
Definition: elm_inwin.c:93
elm_label_add
Evas_Object * elm_label_add(Evas_Object *parent)
Add a new label to the parent.
Definition: elm_label.c:421
evas_object_size_hint_weight_set
EVAS_API void evas_object_size_hint_weight_set(Evas_Object *obj, double x, double y)
Sets the hints for an object's weight.
Definition: evas_object_main.c:2638
evas_object_size_hint_align_set
EVAS_API void evas_object_size_hint_align_set(Evas_Object *obj, double x, double y)
Sets the hints for an object's alignment.
Definition: evas_object_main.c:2650
evas_object_smart_callback_add
EVAS_API void evas_object_smart_callback_add(Evas_Object *eo_obj, const char *event, Evas_Smart_Cb func, const void *data)
Add (register) a callback function to the smart event specified by event on the smart object obj.
Definition: evas_object_smart.c:1040
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 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;
}
elm_object_part_content_set
void elm_object_part_content_set(Evas_Object *obj, const char *part, Evas_Object *content)
Set the content on part of a given container widget.
Definition: elm_main.c:1562
elm_hover_add
Evas_Object * elm_hover_add(Evas_Object *parent)
Adds a hover object to parent.
Definition: elm_hover.c:685
elm_win_inwin_content_unset
Evas_Object * elm_win_inwin_content_unset(Evas_Object *obj)
Unset the content of an inwin object.
Definition: elm_inwin.c:107
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.