This example shows how to register a custom layout to be used by the Edje box part. It will use edje_box_layout_register() for that.
To play with this example, use the keyboard modifier keys and number keys together. The Ctrl key is used for adding elements, and Shift is used for removing them. For instance, Ctrl + 3 will insert a new rectangle object in the 3rd position of the box, while Shift + 6 will try to remove the 6th element of the box.
This example is very similar to the other box example, has a structure with global data, a callback for key down events where we create or delete rectangle objects and add or remove them to/from the box part.
But the important part is the next one:
static void
{
int x, y, w, h;
int xx, yy, ww, hh;
int count;
ww = w / (count ? count : 1);
hh = h / (count ? count : 1);
if (ww < 1) ww = 1;
if (hh < 1) hh = 1;
xx = x;
yy = y;
{
evas_object_move(opt->
obj, xx, yy);
xx += ww;
yy += hh;
}
This code implements our custom layout, which will position every object added to the box in a diagonal through the size of the box part. Notice that it just calculates the position and offset based on the size of the box and number of children, and then moves each child to the respective position.
Later on the main
function, everything we need to do is to register this custom layout function with edje:
And use it inside the box.edc file:
part {
name: "example/box";
type: BOX;
description {
state: "default" 0.0;
box {
layout: "custom_layout";
padding: 2 2;
align: 0.5 0.5;
min: 1 1;
}
rel1 {
relative: 0.0 0.2;
offset: 0 0;
to: "bg";
}
rel2 {
relative: 1.0 1.0;
offset: -1 -61;
to: "bg";
}
}
} // example/box
The example's window should look like this picture:
The full source code follows:
#ifdef HAVE_CONFIG_H
# include "config.h"
#else
# define EINA_UNUSED
#endif
#ifndef PACKAGE_DATA_DIR
#define PACKAGE_DATA_DIR "."
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <Ecore.h>
#include <Evas.h>
static const char commands[] = \
"commands are:\n"
"\tShift + any key - remove box\n"
"\tCtrl + any key - insert box\n"
"\tEsc - exit\n"
"\th - print help\n";
static void
{
int x, y, w, h;
int xx, yy, ww, hh;
int count;
ww = w / (count ? count : 1);
hh = h / (count ? count : 1);
if (ww < 1) ww = 1;
if (hh < 1) hh = 1;
xx = x;
yy = y;
{
evas_object_move(opt->
obj, xx, yy);
xx += ww;
yy += hh;
}
}
new_greenie_block(
Evas *e)
{
evas_object_resize(o, 10, 10);
return o;
}
static void
{
const Evas_Modifier *mods;
if (!strcmp(ev->
key,
"h"))
{
printf(commands);
return;
}
{
int pos;
obj = edje_object_part_box_remove_at(edje_obj, "example/box", pos);
if (obj)
return;
}
{
int pos;
obj = new_greenie_block(evas);
if (!edje_object_part_box_insert_at(edje_obj, "example/box", obj, pos))
edje_object_part_box_append(edje_obj, "example/box", obj);
return;
}
if (!strcmp(ev->
key,
"Escape"))
}
box_new(Ecore_Evas *ee, const char *edje_file_path, const char *name, int x, int y, int w, int h)
{
evas_object_move(edje_obj, x, y);
evas_object_resize(edje_obj, w, h);
if (!edje_object_file_set(edje_obj, edje_file_path, "example/group2"))
{
printf("error: could not load file object.\n");
}
return edje_obj;
}
static void
on_resize(Ecore_Evas *ee)
{
int w;
int h;
evas_object_resize(bg, w, h);
evas_object_resize(edje_obj, w, h);
}
static void
{
}
int
{
const char *edje_file = PACKAGE_DATA_DIR"/box.edj";
Ecore_Evas *ee;
int w;
int h;
int i;
return EXIT_FAILURE;
goto shutdown_ecore_evas;
if (!ee) goto shutdown_edje;
evas_object_resize(bg, w, h);
edje_obj = box_new(ee, edje_file, "box", 0, 0, w, h);
for (i = 1; i <= 5; i++)
{
evas_object_size_hint_min_set(o, 50, 50);
evas_object_resize(o, 50, 50);
if (!edje_object_part_box_append(edje_obj, "example/box", o))
{
fprintf(stderr, "error appending child object!\n");
return 1;
}
}
printf(commands);
return EXIT_SUCCESS;
shutdown_edje:
shutdown_ecore_evas:
return EXIT_FAILURE;
}
To compile use this command:
* gcc -o edje-box2 edje-box2.c -DPACKAGE_BIN_DIR=\"/Where/enlightenment/is/installed/bin\" -DPACKAGE_LIB_DIR=\"/Where/enlightenment/is/installed/lib\"
* -DPACKAGE_DATA_DIR=\"/Where/enlightenment/is/installed/share\"
* `pkg-config --cflags --libs evas ecore ecore-evas edje`
*
* edje_cc box.edc
*
int edje_init(void)
Initializes the Edje library.
Definition: edje_main.c:35
EAPI Ecore_Evas * ecore_evas_new(const char *engine_name, int x, int y, int w, int h, const char *extra_options)
Creates a new Ecore_Evas based on engine name and common parameters.
Definition: ecore_evas.c:1059
EAPI int ecore_evas_shutdown(void)
Shuts down the Ecore_Evas system.
Definition: ecore_evas.c:668
EAPI void ecore_evas_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
Gets the geometry of an Ecore_Evas.
Definition: ecore_evas.c:1382
EAPI void ecore_evas_callback_resize_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
Sets a callback for Ecore_Evas resize events.
Definition: ecore_evas.c:1160
void ecore_main_loop_quit(void)
Quits the main loop once all the events currently on the queue have been processed.
Definition: ecore_main.c:1289
Key press event.
Definition: Evas_Legacy.h:313
#define EINA_LIST_FOREACH(list, l, _data)
Definition for the macro to iterate over a list.
Definition: eina_list.h:1427
#define EINA_UNUSED
Definition: eina_types.h:321
EAPI void ecore_evas_free(Ecore_Evas *ee)
Frees an Ecore_Evas.
Definition: ecore_evas.c:1103
EAPI int ecore_evas_init(void)
Inits the Ecore_Evas system.
Definition: ecore_evas.c:604
void edje_box_layout_register(const char *name, Evas_Object_Box_Layout func, void *(*layout_data_get)(void *), void(*layout_data_free)(void *), void(*free_data)(void *), void *data)
Registers a custom layout to be used in edje boxes.
Definition: edje_util.c:3310
Efl_Canvas_Object Evas_Object
Definition: Evas_Common.h:180
Edje Graphical Design Library.
EAPI Evas * ecore_evas_get(const Ecore_Evas *ee)
Gets an Ecore_Evas's Evas.
Definition: ecore_evas.c:1320
EAPI void * ecore_evas_data_get(const Ecore_Evas *ee, const char *key)
Retrieves user data associated with an Ecore_Evas.
Definition: ecore_evas.c:1112
const Evas_Modifier * evas_key_modifier_get(const Evas *eo_e)
Returns a handle to the list of modifier keys registered in the canvas e.
Definition: evas_key.c:35
void evas_object_geometry_get(const Evas_Object *eo_obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
Retrieves the position and (rectangular) size of the given Evas object.
Definition: evas_object_main.c:1374
void evas_object_event_callback_add(Evas_Object *eo_obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data)
Add (register) a callback function to a given Evas object event.
Definition: evas_callbacks.c:489
Key Press Event.
Definition: Evas_Common.h:414
const char * key
The logical key : (eg shift+1 == exclamation)
Definition: Evas_Legacy.h:320
void ecore_main_loop_begin(void)
Runs the application main loop.
Definition: ecore_main.c:1279
void evas_object_focus_set(Efl_Canvas_Object *obj, Eina_Bool focus)
Indicates that this object is the keyboard event receiver on its canvas.
Definition: efl_canvas_object_eo.legacy.c:39
void evas_object_show(Evas_Object *eo_obj)
Makes the given Evas object visible.
Definition: evas_object_main.c:1853
Eo Evas
Definition: Evas_Common.h:158
Evas_Object * obj
Pointer to the box child object, itself.
Definition: Evas_Common.h:2862
Definition: Evas_Common.h:2837
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:962
Evas_Object * evas_object_rectangle_add(Evas *e)
Adds a rectangle to the given evas.
Definition: evas_object_rectangle.c:78
Definition: eina_list.h:326
Evas_Object_Box_Option struct fields
Definition: Evas_Common.h:2860
void evas_object_name_set(Evas_Object *eo_obj, const char *name)
Sets the name of the given Evas object to the given name.
Definition: evas_name.c:5
Eina_Bool evas_key_modifier_is_set(const Evas_Modifier *m, const char *keyname)
Checks the state of a given modifier of the default seat, at the time of the call.
Definition: evas_key.c:76
EAPI void ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data)
Stores user data in an Ecore_Evas structure.
Definition: ecore_evas.c:1123
EAPI void ecore_evas_callback_destroy_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
Sets a callback for Ecore_Evas destroy events.
Definition: ecore_evas.c:1205
EAPI void ecore_evas_show(Ecore_Evas *ee)
Shows an Ecore_Evas' window.
Definition: ecore_evas.c:1500
void evas_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
Sets the general/main color of the given Evas object to the given one.
Definition: evas_object_main.c:2063
static unsigned int eina_list_count(const Eina_List *list)
Gets the count of the number of items in a list.
int edje_shutdown(void)
Shuts down the Edje library.
Definition: edje_main.c:264