Theme - Using overlays

Overlays are like extensions in that you tell Elementary that some other theme contains the styles you need for your program. The difference is that they will be look in first, so they can override the default style of any widget.

There's not much to say about them that hasn't been said in our previous example about extensions, so going quickly through the code we have a function to load or unload the theme, which will be called when we click any button.

#include <Elementary.h>
static void
_btn_clicked_cb(void *data, Evas_Object *obj, void *ev)
{
static int loaded = 1;
if (loaded)
elm_theme_overlay_del(NULL, "./theme_example.edj");
else
elm_theme_overlay_add(NULL, "./theme_example.edj");
loaded = 1 - loaded;
}

And the main function, creating the window and adding some buttons to it. We load our theme as an overlay and nothing else. Notice there's no style set for any button there, which means they should be using the default that we override.

EAPI_MAIN int
elm_main(int argc, char *argv[])
{
Evas_Object *win, *box, *btn;
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
elm_theme_overlay_add(NULL, "./theme_example.edj");
win = elm_win_util_standard_add("theme", "Theme example");
elm_win_autodel_set(win, EINA_TRUE);
box = elm_box_add(win);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(box);
btn = elm_button_add(win);
elm_object_text_set(btn, "Button 1");
elm_box_pack_end(box, btn);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, NULL);
btn = elm_button_add(win);
elm_object_text_set(btn, "Button 2");
elm_box_pack_end(box, btn);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, NULL);
btn = elm_button_add(win);
elm_object_text_set(btn, "Button 3");
elm_box_pack_end(box, btn);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, NULL);
btn = elm_button_add(win);
elm_object_text_set(btn, "Button 4");
elm_box_pack_end(box, btn);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, NULL);
evas_object_resize(win, 300, 320);
evas_object_show(win);
return 0;
}

That's pretty much it. The full code is here and the definition of the theme is the same as before, and can be found in here.