In this example, we demonstrate the use of Evas box objects.
We cover changing boxes' layouts (with a custom layout, besides the ones provided by Evas), box padding and alignment influence on the layouts, insertion and removal of box items.
The interesting part of the code starts, naturally, when we add a box object to the canvas. Just after it, we place five rectangles, with random colors, inside of it. Those rectangles get a minimum size hint of 50 pixels on each axis, which will be respected by most of the box's possible layouts:
Just like in other Evas examples, we have a white background on the canvas and a red border around the container object of interest, the box, to mark its boundaries. Resizing of the canvas will keep the box's proportion with regard to the whole canvas', so that you can experiment with different sizes of the box to accommodate its children:
The next two numerical commands are for the vertical equivalent of the last and the stack one, respectively. Try them out to get their looks.
#ifdef HAVE_CONFIG_H
#include "config.h"
#else
#define PACKAGE_EXAMPLES_DIR "."
#endif
#include <Ecore.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "evas-common.h"
#define WIDTH (640)
#define HEIGHT (480)
static const char *border_img_path = PACKAGE_EXAMPLES_DIR EVAS_IMAGE_FOLDER "/red.png";
static const char *commands = \
"commands are:\n"
"\ta - change the box's alignment values\n"
"\tp - change the box's padding values\n"
"\t1 - change the box's layout to horizontal\n"
"\t2 - change the box's layout to vertical\n"
"\t3 - change the box's layout to horizontal homogeneous\n"
"\t4 - change the box's layout to vertical homogeneous\n"
"\t5 - change the box's layout to horizontal maximum size homogeneous\n"
"\t6 - change the box's layout to vertical maximum size homogeneous\n"
"\t7 - change the box's layout to horizontal flow\n"
"\t8 - change the box's layout to vertical flow\n"
"\t9 - change the box's layout to stack\n"
"\t0 - change the box's layout to a custom-made one\n"
"\tCtrl + NUMBER - insert a new child object at that position in the box\n"
"\tShift + NUMBER - remove the child object at that position in the box\n"
"\th - print help\n";
struct example_data
{
Ecore_Evas *ee;
};
static struct example_data d;
static void
{
int x, y, w, h;
int xx, yy, ww, hh;
int count;
ww = w / (count ? : 1);
hh = h / (count ? : 1);
if (ww < 1) ww = 1;
if (hh < 1) hh = 1;
xx = x;
yy = y;
{
xx += ww;
yy += hh;
}
}
_new_rectangle_add(
Evas *e)
{
return o;
}
static void
void *einfo)
{
if (strcmp(ev->
key,
"h") == 0)
{
printf("%s", commands);
return;
}
{
int pos;
if (!obj) goto list_free;
list_free:
return;
}
{
int pos;
o_ = _new_rectangle_add(d.evas);
return;
}
if (strcmp(ev->
key,
"a") == 0)
{
double h, v;
h = v = 1.0;
h = v = -1.0;
h = v = 0.0;
h = v = 0.5;
printf("Applying new alignment values (%.1f, %.1f) on the box\n",
h, v);
return;
}
if (strcmp(ev->
key,
"p") == 0)
{
int h, v;
if (h == 0)
h = v = 50;
else
h = v = 0;
printf("Applying new padding values (%d, %d) on the box\n",
h, v);
return;
}
if (strcmp(ev->
key,
"1") == 0)
{
printf("Applying '%s' layout on the box\n",
"horizontal");
return;
}
if (strcmp(ev->
key,
"2") == 0)
{
printf("Applying '%s' layout on the box\n",
"vertical");
return;
}
if (strcmp(ev->
key,
"3") == 0)
{
NULL);
printf("Applying '%s' layout on the box\n",
"horizontal homogeneous");
return;
}
if (strcmp(ev->
key,
"4") == 0)
{
printf("Applying '%s' layout on the box\n",
"vertical homogeneous");
return;
}
if (strcmp(ev->
key,
"5") == 0)
{
NULL, NULL);
printf("Applying '%s' layout on the box\n",
"horizontal maximum size homogeneous");
return;
}
if (strcmp(ev->
key,
"6") == 0)
{
NULL, NULL);
printf("Applying '%s' layout on the box\n",
"vertical maximum size homogeneous");
return;
}
if (strcmp(ev->
key,
"7") == 0)
{
printf("Applying '%s' layout on the box\n",
"horizontal flow");
return;
}
if (strcmp(ev->
key,
"8") == 0)
{
printf("Applying '%s' layout on the box\n",
"vertical flow");
return;
}
if (strcmp(ev->
key,
"9") == 0)
{
printf("Applying '%s' layout on the box\n",
"stack");
return;
}
if (strcmp(ev->
key,
"0") == 0)
{
printf("Applying '%s' layout on the box\n",
"CUSTOM");
return;
}
}
static void
{
}
static void
_canvas_resize_cb(Ecore_Evas *ee)
{
int w, h;
}
int
main(void)
{
int i;
return EXIT_FAILURE;
if (!d.ee)
goto panic;
for (i = 1; i <= 5; i++)
{
o, rand() % 256, rand() % 256, rand() % 256, 255);
{
fprintf(stderr, "Error appending child object on the box!\n");
goto error;
}
}
printf("%s", commands);
_canvas_resize_cb(d.ee);
return 0;
error:
return -1;
panic:
fprintf(stderr, "error: Requires at least one Evas engine built and linked"
" to ecore-evas for this example to run properly.\n");
return -2;
}
@ EVAS_CALLBACK_KEY_DOWN
Key Press Event.
Definition: Evas_Common.h:430
EAPI int ecore_evas_init(void)
Inits the Ecore_Evas system.
Definition: ecore_evas.c:602
EAPI void ecore_evas_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
Sets a callback for Ecore_Evas delete request events.
Definition: ecore_evas.c:1176
EAPI void ecore_evas_show(Ecore_Evas *ee)
Shows an Ecore_Evas' window.
Definition: ecore_evas.c:1480
EAPI Evas * ecore_evas_get(const Ecore_Evas *ee)
Gets an Ecore_Evas's Evas.
Definition: ecore_evas.c:1300
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:1039
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:1140
EAPI int ecore_evas_shutdown(void)
Shuts down the Ecore_Evas system.
Definition: ecore_evas.c:666
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:1321
void ecore_main_loop_begin(void)
Runs the application main loop.
Definition: ecore_main.c:1311
#define EINA_TRUE
boolean value TRUE (numerical value 1)
Definition: eina_types.h:539
EVAS_API 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
EVAS_API void evas_object_box_layout_homogeneous_vertical(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a homogeneous vertical box.
Definition: evas_box_eo.legacy.c:153
EVAS_API void evas_object_box_align_get(const Evas_Box *obj, double *horizontal, double *vertical)
Get the alignment of the whole bounding box of contents, for a given box object.
Definition: evas_box_eo.legacy.c:9
EVAS_API void evas_object_box_layout_homogeneous_max_size_horizontal(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a maximum size, homogeneous horizontal box.
Definition: evas_box_eo.legacy.c:45
EVAS_API void evas_object_box_layout_flow_vertical(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a flow vertical box.
Definition: evas_box_eo.legacy.c:51
EVAS_API void evas_object_box_layout_homogeneous_horizontal(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a homogeneous horizontal box.
Definition: evas_box_eo.legacy.c:123
EVAS_API void evas_object_box_layout_vertical(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a (basic) vertical box.
Definition: evas_box_eo.legacy.c:39
EVAS_API void evas_object_box_layout_flow_horizontal(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a flow horizontal box.
Definition: evas_box_eo.legacy.c:159
EVAS_API void evas_object_box_layout_horizontal(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a (basic) horizontal box.
Definition: evas_box_eo.legacy.c:33
EVAS_API void evas_object_box_padding_set(Evas_Box *obj, int horizontal, int vertical)
Set the (space) padding between cells set for a given box object.
Definition: evas_box_eo.legacy.c:15
EVAS_API void evas_object_box_align_set(Evas_Box *obj, double horizontal, double vertical)
Set the alignment of the whole bounding box of contents, for a given box object.
Definition: evas_box_eo.legacy.c:3
EVAS_API void evas_object_box_layout_stack(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a stacking box.
Definition: evas_box_eo.legacy.c:147
EVAS_API void evas_object_box_padding_get(const Evas_Box *obj, int *horizontal, int *vertical)
Get the (space) padding between cells set for a given box object.
Definition: evas_box_eo.legacy.c:21
EVAS_API void evas_object_box_layout_homogeneous_max_size_vertical(Evas_Box *obj, Evas_Object_Box_Data *priv, void *data)
Layout function which sets the box o to a maximum size, homogeneous vertical box.
Definition: evas_box_eo.legacy.c:129
EVAS_API 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:478
EVAS_API 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
EVAS_API void evas_object_image_border_set(Evas_Object *obj, int l, int r, int t, int b)
Dimensions of this image's border, a region that does not scale with the center area.
Definition: evas_image_legacy.c:117
EVAS_API void evas_object_image_border_center_fill_set(Evas_Object *obj, Evas_Border_Fill_Mode fill)
Specifies how the center part of the object (not the borders) should be drawn when EFL is rendering i...
Definition: evas_image_legacy.c:145
EVAS_API void evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key)
Set the source file from where an image object must fetch the real image data (it may be an Eet file,...
Definition: evas_image_legacy.c:194
EVAS_API Evas_Object * evas_object_image_filled_add(Evas *eo_e)
Creates a new image object that automatically scales its bound image to the object's area,...
Definition: evas_image_legacy.c:35
@ EVAS_BORDER_FILL_NONE
Image's center region is not to be rendered.
Definition: Evas_Legacy.h:5721
Key press event.
Definition: Evas_Legacy.h:314
const char * key
The logical key : (eg shift+1 == exclamation)
Definition: Evas_Legacy.h:320