From: <enl...@li...> - 2004-05-06 23:34:25
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Modified Files: ecore_recipes.xml esmart_recipes.xml Log Message: - fix the dates in the ecore_config and esmart_trans examples - update ecore_config for exit -> shutdown change - update linkage of esmart examples - add an esmart_container example =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/ecore_recipes.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- ecore_recipes.xml 27 Apr 2004 10:59:32 -0000 1.2 +++ ecore_recipes.xml 6 May 2004 23:34:18 -0000 1.3 @@ -58,7 +58,7 @@ <surname>sinclair</surname> <email>ze...@pe...</email> </author> - <date>25 May 2004</date> + <date>25 April 2004</date> </sectioninfo> <title>Recipe: Ecore Config Introduction</title> @@ -101,7 +101,7 @@ free(str); - ecore_config_exit(); + ecore_config_shutdown(); return 0; } </programlisting> @@ -127,7 +127,7 @@ </para> <para> -ecore_config_exit is then called to shutdown the Ecore_Config system before the program exits. +ecore_config_shutdown is then called to shutdown the Ecore_Config system before the program exits. </para> <example> =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/esmart_recipes.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- esmart_recipes.xml 27 Apr 2004 10:59:32 -0000 1.2 +++ esmart_recipes.xml 6 May 2004 23:34:18 -0000 1.3 @@ -57,7 +57,7 @@ <surname>sinclair</surname> <email>ze...@pe...</email> </author> - <date>25 May 2004</date> + <date>25 April 2004</date> </sectioninfo> <title>Recipe: Esmart Trans Introduction</title> @@ -299,7 +299,8 @@ <title>Simple makefile</title> <programlisting> CFLAGS = `ecore-config --cflags` `evas-config --cflags` `esmart-config --cflags` -LIBS = `ecore-config --libs` `evas-config --libs` `esmart-config --libs` +LIBS = `ecore-config --libs` `evas-config --libs` `esmart-config --libs` \ + -lesmart_trans_x11 all: gcc -o trans_example trans_example.c $(CFLAGS) $(LIBS) @@ -311,9 +312,870 @@ library. These -config scripts know where each of the includes and libraries resides and sets up the appropriate linking and include paths for the compilation. </para> +</section> + +<!-- +####################################################### +--> + +<!-- +####################################################### +A simple recipe on using esmart containers +####################################################### +--> +<section> +<sectioninfo> + <author> + <firstname>dan</firstname> + <surname>sinclair</surname> + <email>ze...@pe...</email> + </author> + <date>30 April 2004</date> +</sectioninfo> + +<title>Recipe: Esmart Container Introduction</title> + +<para> +There is usually a desire while designing an apps UI to group common elements together +and have their layout depend on one another. To this end the Esmart Container +libary has been created. It has been designed to handle the hard parts of the +layout, and in the cases where it does not do what you need, the layout portions of +the container are extensible and changeable. +</para> + +<para> +This recipe will give the basics of using an Esmart container. The final product is +a program that will let you see some of the different layout combinations of the +default container. The layout will be done by Edje with callbacks to the program +to change the container layout, and to tell if the user clicked on a container +element. +</para> + +<example> +<title>Includes and declarations</title> +<programlisting> +#include <Ecore.h> +#include <Ecore_Evas.h> +#include <Edje.h> +#include <Esmart/Esmart_Container.h> +#include <getopt.h> + +static void make_gui(const char *theme); +static void container_build(int align, int direction, int fill); +static void _set_text(int align, int direction); +static void _setup_edje_callbacks(Evas_Object *o); +static void _right_click_cb(void* data, Evas_Object* o, const char* emmission, + const char* source); +static void _left_click_cb(void* data, Evas_Object* o, const char* emmission, + const char* source); +static void _item_selected(void* data, Evas_Object* o, const char* emmission, + const char* source); + +static Ecore_Evas *ee; +static Evas_Object *edje; +static Evas_Object *container; + +char *str_list[] = {"item 1", "item 2", + "item 3", "item 4", + "item 5"}; +</programlisting> +</example> +<para> +As with other EFL programs we need to include Ecore, Ecore_Evas, Edje and as this is a +container example, the Esmart/Esmart_Container header. Getopt will be used to allow for +some command line processing. +</para> + +<para> +Next comes the function prototypes which will be described later when we get to their +implementations. Then a few global variables to be used throughout the program. +The str_list array is the content to be stored in the container. +</para> + +<example> +<title>main</title> +<programlisting> +int main(int argc, char ** argv) { + int align = 0; + int direction = 0; + int fill = 0; + int ret = 0; + int c; + char *theme = NULL; + + while((c = getopt(argc, argv, "a:d:f:t:")) != -1) { + switch(c) { + case 'a': + align = atoi(optarg); + break; + + case 'd': + direction = atoi(optarg); + break; + + case 'f': + fill = atoi(optarg); + break; + + case 't': + theme = strdup(optarg); + break; + + default: + printf("Unknown option string\n"); + break; + } + } + + if (theme == NULL) { + printf("Need a theme defined\n"); + exit(-1); + } +</programlisting> +</example> +<para> +The beginning of the main function gets the options out of the +command line arguments and sets up the default display. As you can +see, we require a theme to display. This could be made more intelligent, +searching default install directories and the users application +directories, but this example takes the easy way out and forces the theme +to be a command line option. +</para> + +<example> +<title>Initialization</title> +<programlisting> + if (!ecore_init()) { + printf("Can't init ecore, bad\n"); + ret = 1; + goto EXIT; + } + ecore_app_args_set(argc, (const char **)argv); + + if (!ecore_evas_init()) { + printf("Can't init ecore_evas, bad\n"); + ret = 1; + goto EXIT_ECORE; + } + + if (!edje_init()) { + printf("Can't init edje, bad\n"); + ret = 1; + goto EXIT_ECORE_EVAS; + } + edje_frametime_set(1.0 / 60.0); + + make_gui(theme); + container_build(align, direction, fill); + + ecore_main_loop_begin(); +</programlisting> +</example> +<para> +After receiving the command line arguments, we then proceed to +initializing the required libraries, Ecore, Ecore_Evas and Edje. +We take the additional step of setting the Edje frame rate. +</para> + +<para> +Once the initialization is complete we create the initial GUI for the +app. I have separated the building of the container out into a +separate function to make the container code easier to locate in the example. +</para> + +<para> +Once everything is created we call ecore_main_loop_begin and wait for +events to occur. +</para> + +<example> +<title>Shutdown</title> +<programlisting> + edje_shutdown(); + +EXIT_ECORE_EVAS: + ecore_evas_shutdown(); + +EXIT_ECORE: + ecore_shutdown(); + +EXIT: + return ret; +} +</programlisting> +</example> +<para> +The usual end routine, be good programmers and shutdown everything we started. +</para> + +<example> +<title>Window callbacks</title> +<programlisting> +static int sig_exit_cb(void *data, int ev_type, void *ev) { + ecore_main_loop_quit(); + return 1; +} + +static void win_del_cb(Ecore_Evas *ee) { + ecore_main_loop_quit(); +} + +static void win_resize_cb(Ecore_Evas *ee) { + int w, h; + int minw, minh; + int maxw, maxh; + Evas_Object *o = NULL; + + if (ee) { + ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); + ecore_evas_size_min_get(ee, &minw, &minh); + ecore_evas_size_max_get(ee, &maxw, &maxh); + + if ((w >= minw) && (h >= minh) && (h <= maxh) && (w <= maxw)) { + if ((o = evas_object_name_find(ecore_evas_get(ee), "edje"))) + evas_object_resize(o, w, h); + } + } +} +</programlisting> +</example> +<para> +Next we setup some generic callbacks to be used by the UI. This will be the exit, destroy +and resize callbacks. Again, the usual EFL style functions. +</para> + +<example> +<title>make_gui</title> +<programlisting> +static void make_gui(const char *theme) { + Evas *evas = NULL; + Evas_Object *o = NULL; + Evas_Coord minw, minh; + + ee = NULL; + edje = NULL; + container = NULL; + + ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, sig_exit_cb, NULL); + + ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 300, 400); + ecore_evas_title_set(ee, "Container Example"); + + ecore_evas_callback_delete_request_set(ee, win_del_cb); + ecore_evas_callback_resize_set(ee, win_resize_cb); + evas = ecore_evas_get(ee); + + // create the edje + edje = edje_object_add(evas); + evas_object_move(edje, 0, 0); + + if (edje_object_file_set(edje, theme, "container_ex")) { + evas_object_name_set(edje, "edje"); + + edje_object_size_min_get(edje, &minw, &minh); + ecore_evas_size_min_set(ee, (int)minw, (int)minh); + evas_object_resize(edje, (int)minw, (int)minh); + ecore_evas_resize(ee, (int)minw, (int)minh); + + edje_object_size_max_get(edje, &minw, &minh); + ecore_evas_size_max_set(ee, (int)minw, (int)minh); + evas_object_show(edje); + + } else { + printf("Unable to open (%s) for edje theme\n", theme); + exit(-1); + } + _setup_edje_callbacks(edje); + ecore_evas_show(ee); +} +</programlisting> +</example> +<para> +The GUI consists of the Ecore_Evas containing the canvas itself, and the Edje that +we will be using to control our layout. The make_gui function sets up the callbacks +defined above and creates the Ecore_Evas. +</para> + +<para> +Once we have the Evas and the callbacks are defined, we create the Edje object that +will define our layout. The edje_object_add call is used to create the object on the Evas, +and once thats done, we take the theme passed in by the user and set our Edje to +use said theme, the "container_ex" parameter is the name of the group +inside the EET that we are to use. +</para> + +<para> +Once the theme file is set to the Edje, we use the values in the theme file to setup +the size ranges for the app, and show the Edje. We then setup the callbacks on the +Edje and show the Ecore_Evas. +</para> + +<example> +<title>Edje Callbacks</title> +<programlisting> +static void _setup_edje_callbacks(Evas_Object *o) { + edje_object_signal_callback_add(o, "left_click", + "left_click", _left_click_cb, NULL); + edje_object_signal_callback_add(o, "right_click", + "right_click", _right_click_cb, NULL); +} +</programlisting> +</example> +<para> +The program will have two main callbacks attached to the Edje, one for the left click signal and +one for the right click signal. These will be used to switch the direction/alignment of the +container. The second and third parameters of the callbacks need to match the data emitted with the +signal from Edje, this will be seen later when we look at the EDC file. The third parameter is +the function to call, and the last, any data we wish to be passed into the callback. +</para> + +<example> +<title>container_build</title> +<programlisting> +static void container_build(int align, int direction, int fill_policy) { + int len = 0; + int i = 0; + const char *edjefile = NULL; + + container = esmart_container_new(ecore_evas_get(ee)); + evas_object_name_set(container, "the_container"); + esmart_container_direction_set(container, direction); + esmart_container_alignment_set(container, align); + esmart_container_padding_set(container, 1, 1, 1, 1); + esmart_container_spacing_set(container, 1); + esmart_container_fill_policy_set(container, fill_policy); + + evas_object_layer_set(container, 0); + edje_object_part_swallow(edje, "container", container); +</programlisting> +</example> +<para> +The container_build function will create the container and set our data elements in said +container. The creation is easy enough with a call to esmart_container_new giving back the +Evas_Object that is the container. Once the container is created we can set a name on the +container to make reference easier. +</para> +<para> +Next, we set the direction, which is either (CONTAINER_DIRECTION_VERTICAL or +CONTAINER_DIRECTION_HORIZONTAL) [or in this case, an int being passed from the command +line as the two directions map to 1 and 0 respectively]. The direction tells the container +which way the elements will be drawn. +</para> + +<para> +After the direction we set the alignment of the container. The alignment tells the container +where to draw the elements. The possible values are: CONTAINER_ALIGN_CENTER, CONTAINER_ALIGN_LEFT, +CONTAINER_ALIGN_RIGHT, CONTAINER_ALIGN_TOP and CONTAINER_ALIGN_BOTTOM. With the default +layout, left and right only apply to a vertical container, and top and bottom only apply +to a horizontal container, although center applies to both. +</para> + +<para> +If we wanted to use a different layout scheme then the default, we could place a call to +esmart_container_layout_plugin_set(container, "name") where the name is the name of +the plugin to use. The default setting is the container named "default". +</para> + +<para> +Once the directions and alignment are set, the spacing and padding of the container are +specified. The padding specifes the space around the outside of the container taking four +numeric parameters: left, right, top and bottom. The spacing parameter specifies +the space between elements in the container. +</para> + +<para> +We then continue and set the fill policy of the container. This specifies how the +elements are positioned to fill the space in the container. The possible values are: +CONTAINER_FILL_POLICY_NONE, CONTAINER_FILL_POLICY_KEEP_ASPECT, CONTAINER_FILL_POLICY_FILL_X, +CONTAINER_FILL_POLICY_FILL_Y, CONTAINER_FILL_POLICY_FILL and CONTAINER_FILL_POLICY_HOMOGENOUS. +</para> + +<para> +Once the container is fully specified we set the containers layer, and then swallow the +container into the edje and the part named "container". +</para> + +<example> +<title>Adding Elements to the Container</title> +<programlisting> + len = (sizeof(str_list) / sizeof(str_list[0])); + for(i = 0; i < len; i++) { + Evas_Coord w, h; + Evas_Object *t = edje_object_add(ecore_evas_get(ee)); + + edje_object_file_get(edje, &edjefile, NULL); + if (edje_object_file_set(t, edjefile, "element")) { + edje_object_size_min_get(t, &w, &h); + evas_object_resize(t, (int)w, (int)h); + + if (edje_object_part_exists(t, "element.value")) { + edje_object_part_text_set(t, "element.value", str_list[i]); + evas_object_show(t); + int *i_ptr = (int *)malloc(sizeof(int)); + *i_ptr = (i + 1); + + edje_object_signal_callback_add(t, "item_selected", + "item_selected", _item_selected, i_ptr); + + esmart_container_element_append(container, t); + } else { + printf("Missing element.value part\n"); + evas_object_del(t); + } + } else { + printf("Missing element part\n"); + evas_object_del(t); + } + } + evas_object_show(container); + _set_text(align, direction); +} +</programlisting> +</example> +<para> +Now that we have a container, we can add some elements to be displayed. Each of the +entries in the str_list array defined at the beginning of the program will be added +into the container as a text part. +</para> + +<para> +For each element we create a new Edje object on the Evas. We then need to know the +name of the theme file used to create our main Edje, so we call edje_object_file_get +which will set edjefile to said value. +</para> + +<para> +We then try to set the group named "element" onto the newly created +element. If this fails we print an error and delete the object. +</para> + +<para> +As long as we have found the group "element" we can attempt to grab the part +for our element, "element.value". If this part exists, we set the text +value of the part to our current string and show the part. +</para> + +<para> +A callback is created through edje_object_signal_callback_add and attached to the +new element. This will be called if the "item_selected" signal is sent from the Edje. +The i_ptr value shows how data can be attached to the element, when the user clicks +on an element its number will be printed to the console. +</para> + +<para> +Once the element is created we add it to the container (in this case, appending the +element). +</para> + +<para> +To finish, the container is show and we do some extra work to display information about +the container in the header through the call _show_text. +</para> + +<example> +<title>_set_text</title> +<programlisting> +static void _set_text(int align, int direction) { + Evas_Object *t = edje_object_add(ecore_evas_get(ee)); + const char *edjefile; + + if (direction == CONTAINER_DIRECTION_VERTICAL) + edje_object_part_text_set(edje, "header_text_direction", "vertical"); + else + edje_object_part_text_set(edje, "header_text_direction", "horizontal"); + + if (align == CONTAINER_ALIGN_CENTER) + edje_object_part_text_set(edje, "header_text_align", "center"); + + else if (align == CONTAINER_ALIGN_TOP) + edje_object_part_text_set(edje, "header_text_align", "top"); + + else if (align == CONTAINER_ALIGN_BOTTOM) + edje_object_part_text_set(edje, "header_text_align", "bottom"); + + else if (align == CONTAINER_ALIGN_RIGHT) + edje_object_part_text_set(edje, "header_text_align", "right"); + + else if (align == CONTAINER_ALIGN_LEFT) + edje_object_part_text_set(edje, "header_text_align", "left"); +} +</programlisting> +</example> +<para> +The _set_text routine takes the current direction and alignment of the container and sets +some text in the header of the program. This is just a simple communication with the user +of the current container settings. +</para> + +<example> +<title>_left_click_cb</title> +<programlisting> +static void _left_click_cb(void* data, Evas_Object* o, const char* emmission, + const char* source) { + Container_Direction dir = esmart_container_direction_get(container); + Container_Direction new_dir = (dir + 1) % 2; + Container_Alignment align = esmart_container_alignment_get(container); + + esmart_container_direction_set(container, new_dir); + + if (align != CONTAINER_ALIGN_CENTER) { + if (new_dir == CONTAINER_DIRECTION_HORIZONTAL) + align = CONTAINER_ALIGN_TOP; + else + align = CONTAINER_ALIGN_LEFT; + } + esmart_container_alignment_set(container, align); + _set_text(align, new_dir); +} +</programlisting> +</example> +<para> +When the user clicks the left mouse button on the screen this callback will be executed. We take +the current container direction information and switch to the other direction. (e.g. horizontal +becomes vertical and visa versa.) We also reset the alignment if we are not currently aligned +center to make sure everything is valid for the new direction. The text in the header is +updated to be current. +</para> + +<example> +<title>_right_click_cb</title> +<programlisting> +static void _right_click_cb(void* data, Evas_Object* o, const char* emmission, + const char* source) { + Container_Direction dir = esmart_container_direction_get(container); + Container_Alignment align = esmart_container_alignment_get(container); + + if (dir == CONTAINER_DIRECTION_HORIZONTAL) { + if (align == CONTAINER_ALIGN_TOP) + align = CONTAINER_ALIGN_CENTER; + + else if (align == CONTAINER_ALIGN_CENTER) + align = CONTAINER_ALIGN_BOTTOM; + + else + align = CONTAINER_ALIGN_TOP; + + } else { + if (align == CONTAINER_ALIGN_LEFT) + align = CONTAINER_ALIGN_CENTER; + + else if (align == CONTAINER_ALIGN_CENTER) + align = CONTAINER_ALIGN_RIGHT; + + else + align = CONTAINER_ALIGN_LEFT; + } + esmart_container_alignment_set(container, align); + _set_text(align, esmart_container_direction_get(container)); +} +</programlisting> +</example> +<para> +The right click callback will cycle through the available alignments for a given +direction as the user clicks the right mouse button. +</para> + +<example> +<title>_item_selected</title> +<programlisting> +static void _item_selected(void* data, Evas_Object* o, const char* emmission, + const char* source) { + printf("You clicked on the item with number %d\n", *((int *)data)); +} +</programlisting> +</example> +<para> +Finally the _item_selected callback will be executed when the user middle clicks +on an item in the container. The data will contain the number set for that element +in the create routine above. +</para> + +<para> +Thats the end of the code for the app, next comes the required EDC for everything +to display and function correctly. +</para> + +<example> +<title>The Edc</title> +<programlisting> +fonts { + font: "Vera.ttf" "Vera"; +} + +collections { + group { + name, "container_ex"; + min, 300, 300; + max, 800, 800; + + parts { + part { + name, "bg"; + type, RECT; + mouse_events, 1; + + description { + state, "default" 0.0; + color, 0 0 0 255; + + rel1 { + relative, 0.0 0.1; + offset, 0 0; + } + rel2 { + relative, 1.0 1.0; + offset, 0 0; + } + } + } + + part { + name, "header"; + type, RECT; + mouse_events, 0; + + description { + state, "default" 0.0; + color, 255 255 255 255; + + rel1 { + relative, 0.0 0.0; + offset, 0 0; + } + + rel2 { + relative, 1.0 0.1; + offset, 0 0; + } + } + } + + part { + name, "header_text_direction"; + type, TEXT; + mouse_events, 0; + + description { + state, "default" 0.0; + color, 0 0 0 255; + + rel1 { + relative, 0.0 0.0; + offset, 0 10; + to, "header"; + } + rel2 { + relative, 1.0 1.0; + offset, 0 0; + to, "header"; + } + text { + text, "direction"; + font, "Vera"; + size, 10; + } + } + } + + part { + name, "header_text_align"; + type, TEXT; + mouse_events, 0; + + description { + state, "default" 0.0; + color, 0 0 0 255; + + rel1 { + relative, 0.0 0.0; + offset, 0 0; + to, "header_text_direction"; + } + rel2 { + relative, 1.0 1.0; + offset, 110 0; + to, "header_text_direction"; + } + text { + text, "align"; + font, "Vera"; + size, 10; + } + } + } +</programlisting> +</example> +<para> +This EDC file expects to have the Vera font embedded inside it, as defined by the +font section at the beginning. This means when you compile the edc you either need +the Vera.ttf file in the current directory or give edje_cc the -fd flag and specify +the directory to the font. +</para> + +<para> +After the fonts are defined the main collections are defined. The first collection +is the main portion of the app itself, the "container_ex" group. This group +specifes the main window of the app. As such it contains the parts for the background, +the header, and the header text. These parts are all fairly standard with some (minimal) +alignment done between them. +</para> + +<example> +<title>The Container Part</title> +<programlisting> + part { + name, "container"; + type, RECT; + mouse_events, 1; + + description { + state, "default" 0.0; + visible, 1; + + rel1 { + relative, 0.0 0.0; + offset, 0 0; + to, bg; + } + rel2 { + relative, 1.0 1.0; + offset, 0 0; + to, bg; + } + color, 0 0 0 0; + } + } + } + programs { + program { + name, "left_click"; + signal, "mouse,clicked,1"; + source, "container"; + action, SIGNAL_EMIT "left_click" "left_click"; + } + + program { + name, "right_click"; + signal, "mouse,clicked,3"; + source, "container"; + action, SIGNAL_EMIT "right_click" "right_click"; + } + } + } +</programlisting> +</example> +<para> +The container part is then defined. The part itself is pretty simple, just positioned +relative to the background and set to receive mouse events. After the parts are defined +we specify the programs for this group, of which there are two. The first program +"left_click" specifies what is to happen on a click event of the first mouse button. +</para> + +<para> +The action is to emit a signal, the two parameters after SIGNAL_EMIT match up to the values +put in the callback in the application code. +</para> + +<para> +There is a similar callback for the third mouse button as the first, just emitting a slightly +different signal. +</para> + +<example> +<title>The Element Group</title> +<programlisting> + group { + name, "element"; + min, 80 18; + max, 800 18; + + parts { + part { + name, "element.value"; + type, TEXT; + mouse_events, 1; + effect, NONE; + + description { + state, "default" 0.0; + visible, 1; + + rel1 { + relative, 0.0 0.0; + offset, 0 0; + } + rel2 { + relative, 1.0 1.0; + offset, 0 0; + } + color, 255 255 255 255; + + text { + text, ""; + font, "Vera"; + size, 10; + } + } + } + } + programs { + program { + name, "center_click"; + signal, "mouse,clicked,2"; + source, "element.value"; + action, SIGNAL_EMIT "item_selected" "item_selected"; + } + } + } +} +</programlisting> +</example> +<para> +The element group specifies how each element of the container is to be +displayed. You will notice that the names given here match up to the +names seached for in the application code itself while creating the elements. +</para> + +<para> +There is one program in this group which will emit a signal of "item_selected" +when the middle mouse button is pressed while hovering over one of the +elements in the list. +</para> + +<para> +Thats the end of the EDC code. To compile the app code, a makefile similar to that below +could be used. +</para> + +<example> +<title>Makefile</title> +<programlisting> +CFLAGS = `ecore-config --cflags` `evas-config --cflags` `esmart-config --cflags` +LIBS = `ecore-config --libs` `evas-config --libs` `esmart-config --libs` \ + -lesmart_container + +container_ex: container/container_ex.c + gcc -o container/container_ex container/container_ex.c $(CFLAGS) $(LIBS) +</programlisting> +</example> + +<para> +And to create the EET file, a simple 'edje_cc default.edc' should suffice as long +as the Vera.ttf file is in the current directory. +</para> + +<para> +Thats it, assuming everything goes as planned, you should have a simple app in which +clicking the right/left mouse buttons moves the container to different portions of the window. +While clicking the middle mouse button on elements prints out the number of the element printed. +</para> </section> +<!-- +####################################################### +--> </chapter> + |
From: <enl...@li...> - 2004-05-07 00:41:29
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Modified Files: esmart_recipes.xml Log Message: - fix esmart trans header include =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/esmart_recipes.xml,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- esmart_recipes.xml 6 May 2004 23:34:18 -0000 1.3 +++ esmart_recipes.xml 7 May 2004 00:41:18 -0000 1.4 @@ -80,7 +80,7 @@ #include <stdio.h> #include <Ecore.h> #include <Ecore_Evas.h> -#include <Esmart/Esmart_Trans.h> +#include <Esmart/Esmart_Trans_X11.h> int sig_exit_cb(void *data, int ev_type, void *ev); void win_del_cb(Ecore_Evas *ee); |
From: <enl...@li...> - 2004-06-15 04:18:16
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Modified Files: ecore_recipes.xml Log Message: - fix the ecore_config example to conform to the new api. - make the ecore_config_init check ECORE_CONFIG_ERR_SUCC instead of 0 dj2 =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/ecore_recipes.xml,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore_recipes.xml 6 May 2004 23:34:18 -0000 1.3 +++ ecore_recipes.xml 15 Jun 2004 04:18:04 -0000 1.4 @@ -80,20 +80,20 @@ float j; char *str; - if (ecore_config_init("foo") != 0) { + if (ecore_config_init("foo") != ECORE_CONFIG_ERR_SUCC) { printf("Cannot init Ecore_Config"); return 1; } - ecore_config_default_int("/int_example", 1); - ecore_config_default_string("/this/is/a/string/example", "String"); - ecore_config_default_float("/float/example", 2.22); + ecore_config_int_default("/int_example", 1); + ecore_config_string_default("/this/is/a/string/example", "String"); + ecore_config_float_default("/float/example", 2.22); ecore_config_load(); - i = ecore_config_get_int("/int_example"); - str = ecore_config_get_string("/this/is/a/string/example"); - j = ecore_config_get_float("/float/example"); + i = ecore_config_int_get("/int_example"); + str = ecore_config_string_get("/this/is/a/string/example"); + j = ecore_config_float_get("/float/example"); printf("str is (%s)\n", str); printf("i is (%d)\n", i); @@ -114,14 +114,14 @@ <para> For each configuration variable you are getting from Ecore_Config, you can assign a default value in the case -that the user does not have a config.db file. The defaults are assigned with the ecore_config_default_* where * +that the user does not have a config.db file. The defaults are assigned with the ecore_config_*_default where * is one of the Ecore_Config types. The first parameter is the key under which this is to be accessed. These keys must be unique over your program. The value passed is of the type appropriated for this call. </para> <para> The ecore_config_load call will read the values from the config.db file into Ecore_Config. After which we can -access the files with the ecore_config_get_* methods (again * is the type of data desired). These routines +access the files with the ecore_config_*_get methods (again * is the type of data desired). These routines take the key name for this item and return the value associated with that key. Each function returns a type that corresponds to the function call name. </para> |
From: <enl...@li...> - 2004-06-15 05:16:27
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Modified Files: ecore_recipes.xml Log Message: Add an introduction to Ecore_Ipc recipe. Its not great, but its a start. =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/ecore_recipes.xml,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- ecore_recipes.xml 15 Jun 2004 04:18:04 -0000 1.4 +++ ecore_recipes.xml 15 Jun 2004 05:16:15 -0000 1.5 @@ -165,5 +165,355 @@ </para> </section> +<!-- +####################################### +Introduction to Ecore_Ipc +####################################### +--> +<section> +<sectioninfo> + <author> + <firstname>dan</firstname> + <surname>sinclair</surname> + <email>ze...@pe...</email> + </author> + <date>14 June 2004</date> +</sectioninfo> + +<title>Recipe: Ecore Ipc Introduction</title> +<para> +The Ecore_Ipc library provides a robust and efficient wrapper around the Ecore_Con module. +Ecore_Ipc allows you to set up your server communications and handles all of the tricky stuff +under the hood. This recipe will give a simple example of an Ecore client and an Ecore server. +</para> + +<para> +When working with Ecore_Ipc, when writing a client or a server app an Ecore_Ipc_Server +object will be created. This is because in either case it is a server being manipulated, +either the one being setup, or the one being communicated with. After that, everything +is easy. +</para> + +<example> +<title>Ecore_Ipc client: preamble</title> +<programlisting> +#include <Ecore.h> +#include <Ecore_Ipc.h> + +int sig_exit_cb(void *data, int ev_type, void *ev); +int handler_server_add(void *data, int ev_type, void *ev); +int handler_server_del(void *data, int ev_type, void *ev); +int handler_server_data(void *data, int ev_type, void *ev); +</programlisting> +</example> +<para> +The Ecore.h file is included so we can have access to the exit signal type. The functions +will be explained later when their callbacks are hooked up. +</para> + +<example> +<title>Ecore_Ipc client: main setup</title> +<programlisting> +int main(int argc, char ** argv) { + Ecore_Ipc_Server *server; + + if (!ecore_init()) { + printf("unable to init ecore\n"); + return 1; + } + + if (!ecore_ipc_init()) { + printf("unable to init ecore_con\n"); + ecore_shutdown(); + return 1; + } + ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, sig_exit_cb, NULL); +</programlisting> +</example> +<para> +As mentioned earlier, even though we are writing a client app, we still use an Ecore_Ipc_Server +object. Using Ecore_Ipc requires the setup of Ecore itself. This is done with a simple call to ecore_init(). +Ecore_Ipc is then setup with a call to ecore_ipc_init(). If either of these return 0, the appropriate +action is taken to undo any initialization take to this point. The ECORE_EVENT_SIGNAL_EXIT callback +is hooked up so we can exit gracefully if required. +</para> + +<example> +<title>Ecore_Ipc client: main creating client</title> +<programlisting> + server = ecore_ipc_server_connect(ECORE_IPC_REMOTE_SYSTEM, + "localhost", 9999, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, + handler_server_add, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, + handler_server_del, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA, + handler_server_data, NULL); +</programlisting> +</example> +<para> +In this example we are creating a remote connection to the server named "localhost" on the port 9999. This +is done with the ecore_ipc_server_connect() method. The first parameter is the type of connection being made, +which can be one of: ECORE_IPC_REMOTE_SYSTEM, ECORE_IPC_LOCAL_SYSTEM, or ECORE_IPC_LOCAL_USER. If +OpenSSL was available when Ecore_Ipc was compiled, ECORE_IPC_USE_SSL can be or'd with the connection type +to create an SSL connection. +</para> + +<para> +The three calls to ecore_event_handler_add() setup the callbacks for the different types of events +we will be receiving from the server. A server was added, a server was deleted, or the server +sent us data. +</para> + +<example> +<title>Ecore_Ipc client: main end</title> +<programlisting> + ecore_ipc_server_send(server, 3, 4, 0, 0, 0, "Look ma, no pants", 17); + + ecore_main_loop_begin(); + + ecore_ipc_server_del(server); + ecore_ipc_shutdown(); + ecore_shutdown(); + return 0; +} +</programlisting> +</example> +<para> +For the purposes of this example, the client is sending a message on startup to the server, which +the server will respond to. The client message is sent with the ecore_ipc_server_send() command. +ecore_ipc_server_send() takes the server to send to, the message major, message minor, a reference, +a reference to, a response, the data and a size. These parameters, except for the server are up the +the client and can refer to anything required. This hopefully gives the maximum flexibility +in creating client/server IPC apps. +</para> + +<para> +After the server message is sent we enter into the main ecore loop and wait for events. If +the main loop is exited we delete the server object, shutdown Ecore_Ipc with a call to +ecore_ipc_shutdown(), and shutdown ecore through ecore_shutdown(). +</para> + +<example> +<title>Ecore_Ipc client: sig_exit_cb</title> +<programlisting> +int sig_exit_cb(void *data, int ev_type, void *ev) { + ecore_main_loop_quit(); + return 1; +} +</programlisting> +</example> +<para> +The sig_exit_cb() just tells ecore to quit the main loop. +</para> + +<example> +<title>Ecore_Ipc client: the callbacks</title> +<programlisting> +int handler_server_add(void *data, int ev_type, void *ev) { + Ecore_Ipc_Event_Server_Add *e = (Ecore_Ipc_Event_Server_Add *)ev; + printf("Got a server add %p\n", e->server); + return 1; +} + +int handler_server_del(void *data, int ev_type, void *ev) { + Ecore_Ipc_Event_Server_Del *e = (Ecore_Ipc_Event_Server_Del *)ev; + printf("Got a server del %p\n", e->server); + return 1; +} + +int handler_server_data(void *data, int ev_type, void *ev) { + Ecore_Ipc_Event_Server_Data *e = (Ecore_Ipc_Event_Server_Data *)ev; + printf("Got server data %p [%i] [%i] [%i] (%s)\n", e->server, e->major, + e->minor, e->size, (char *)e->data); + return 1; +} +</programlisting> +</example> +<para> +These three callbacks, handler_server_add(), handler_server_del(), and handler_server_data() +are body of the client handling all events related to the server we are connected to. Each +of the callbacks has an associated event structure, Ecore_Ipc_Event_Server_Add, +Ecore_Ipc_Event_Server_Del and Ecore_Ipc_Event_Server_Data containing information on the +event itself. +</para> + +<para> +When we first connect to the server the handler_server_add() callback will be executed +allowing any setup to be accomplished. +</para> + +<para> +If the server breaks the connection the handler_server_del() callback will be executed +allowing any required cleanup. +</para> + +<para> +When the server sends data to the client the handler_server_data callback will the executed. +Which in this example just prints some information about the message itself and the +message body. +</para> + +<para> +And thats the client. The code itself is pretty simple thanks to the abstractions provided by +Ecore. +</para> + +<example> +<title>Ecore_Ipc server: preamble</title> +<programlisting> +#include <Ecore.h> +#include <Ecore_Ipc.h> + +int sig_exit_cb(void *data, int ev_type, void *ev); +int handler_client_add(void *data, int ev_type, void *ev); +int handler_client_del(void *data, int ev_type, void *ev); +int handler_client_data(void *data, int ev_type, void *ev); +</programlisting> +</example> +<para> +As with the client, the Ecore.h header is included to get access the to the exit signal. +The Ecore_Ipc.h header is required for apps making use of the Ecore_Ipc library. Each +sign handler will be explained with its code. +</para> + +<example> +<title>Ecore_Ipc server: main setup</title> +<programlisting> +int main(int argc, char ** argv) { + Ecore_Ipc_Server *server; + + if (!ecore_init()) { + printf("Failed to init ecore\n"); + return 1; + } + + if (!ecore_ipc_init()) { + printf("failed to init ecore_con\n"); + ecore_shutdown(); + return 1; + } + + ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, sig_exit_cb, NULL); +</programlisting> +</example> +<para> +This is the same as the client setup above. +</para> + +<example> +<title>Ecore_Ipc server: main creating server</title> +<programlisting> + server = ecore_ipc_server_add(ECORE_IPC_REMOTE_SYSTEM, "localhost", 9999, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD, handler_client_add, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, handler_client_del, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, handler_client_data, NULL); +</programlisting> +</example> +<para> +Unlike the client, for the server we add a listener to port 9999 on the machine "localhost" through +the call ecore_ipc_server_add(). This will create and return the server object to us. +We then hook in the required signal handlers, the difference to the client being we want +CLIENT events this time instead of SERVER events. +</para> + +<example> +<title>Ecore_Ipc client: main end</title> +<programlisting> + ecore_main_loop_begin(); + + ecore_ipc_server_del(server); + ecore_ipc_shutdown(); + ecore_shutdown(); + return 0; +} +</programlisting> +</example> +<para> +This again is identical to the client shutdown, minus the sending of data to the server. +</para> + +<example> +<title>Ecore_Ipc server: sig_exit callback</title> +<programlisting> +</programlisting> +</example> +<para> +The sig_exit_cb() is again identical to that seen in the client. +</para> + +<example> +<title>Ecore_Ipc server: the callbacks</title> +<programlisting> +int handler_client_add(void *data, int ev_type, void *ev) { + Ecore_Ipc_Event_Client_Add *e = (Ecore_Ipc_Event_Client_Add *)ev; + printf("client %p connected to server\n", e->client); + return 1; +} + +int handler_client_del(void *data, int ev_type, void *ev) { + Ecore_Ipc_Event_Client_Del *e = (Ecore_Ipc_Event_Client_Del *)ev; + printf("client %p disconnected from server\n", e->client); + return 1; +} + +int handler_client_data(void *data, int ev_type, void *ev) { + Ecore_Ipc_Event_Client_Data *e = (Ecore_Ipc_Event_Client_Data *)ev; + printf("client %p sent [%i] [%i] [%i] (%s)\n", e->client, e->major, + e->minor, e->size, (char *)e->data); + + ecore_ipc_client_send(e->client, 3, 4, 0, 0, 0, "Pants On!", 9); + return 1; +} +</programlisting> +</example> +<para> +The event callbacks are similar to those seen in the client app. The main +difference is that the events are _Client_ events instead of _Server_ events. +</para> + +<para> +The add callback is when a client connects to our server, with the del callback +being its opposite when the client disconnects. The data callback is for +when a client sends data to the server. +</para> + +<para> +At the end of the handler_client_data callback we do a call to ecore_ipc_client_send(). +This sends data to the client. As with sending data to the server, the parameters are: +the client to send to, major number, minor number, reference, reference to, response, +data and the data size. +</para> + +<example> +<title>Ecore_Ipc: compilation</title> +<programlisting> +CC = gcc + +all: server client + +server: server.c + $(CC) -o server server.c `ecore-config --cflags --libs` + +client: client.c + $(CC) -o client client.c `ecore-config --cflags --libs` + +clean: + rm server client +</programlisting> +</example> +<para> +As with other ecore apps, it is very easy to compile an Ecore_Ipc app. As long as your +Ecore was compiled with Ecore_Ipc, simply invoking the 'ecore-config --cflags --libs' command +will add all of the required library paths and linker information. +</para> + +<para> +As seen in this example, Ecore_Ipc is an easy to use library to create client/server +apps. +</para> + + +</section> </chapter> |
From: <enl...@li...> - 2004-07-02 18:12:44
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook Modified Files: eflcookbook.xml Log Message: - take the intro text off of the website and put it into the cookbook to add a bit of meat to each section =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/eflcookbook.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- eflcookbook.xml 30 Jun 2004 17:44:47 -0000 1.2 +++ eflcookbook.xml 2 Jul 2004 18:12:37 -0000 1.3 @@ -1,47 +1,32 @@ <?xml version='1.0' encoding="UTF-8"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR1//EN" "file:///usr/share/sgml/docbook/xml-dtd-4.3CR1/docbookx.dtd" [ -<!ENTITY bookinfo SYSTEM "xml/bookinfo.xml"> -<!ENTITY intro SYSTEM "xml/intro.xml"> -<!ENTITY imlib_recipes SYSTEM "xml/imlib_recipes.xml"> -<!ENTITY edb_eet_recipes SYSTEM "xml/edb_eet_recipes.xml"> -<!ENTITY evas_recipes SYSTEM "xml/evas_recipes.xml"> -<!ENTITY ecore_recipes SYSTEM "xml/ecore_recipes.xml"> -<!ENTITY esmart_recipes SYSTEM "xml/esmart_recipes.xml"> -<!ENTITY etox_recipes SYSTEM "xml/etox_recipes.xml"> -<!ENTITY edje_edc_recipes SYSTEM "xml/edje_edc_recipes.xml"> -<!ENTITY edje_recipes SYSTEM "xml/edje_recipes.xml"> -<!ENTITY ewl_recipes SYSTEM "xml/ewl_recipes.xml"> - + <!ENTITY bookinfo SYSTEM "xml/bookinfo.xml"> + <!ENTITY intro SYSTEM "xml/intro.xml"> + <!ENTITY imlib_recipes SYSTEM "xml/imlib_recipes.xml"> + <!ENTITY edb_eet_recipes SYSTEM "xml/edb_eet_recipes.xml"> + <!ENTITY evas_recipes SYSTEM "xml/evas_recipes.xml"> + <!ENTITY ecore_recipes SYSTEM "xml/ecore_recipes.xml"> + <!ENTITY esmart_recipes SYSTEM "xml/esmart_recipes.xml"> + <!ENTITY etox_recipes SYSTEM "xml/etox_recipes.xml"> + <!ENTITY edje_edc_recipes SYSTEM "xml/edje_edc_recipes.xml"> + <!ENTITY edje_recipes SYSTEM "xml/edje_recipes.xml"> + <!ENTITY ewl_recipes SYSTEM "xml/ewl_recipes.xml"> ]> - - <book> + &bookinfo; -&bookinfo; - -<!-- Chapters Go Here --> - -&intro; - -&imlib_recipes; - -&evas_recipes; -&ecore_recipes; - -&edb_eet_recipes; - -&esmart_recipes; - -&etox_recipes; - -&edje_edc_recipes; -&edje_recipes; - -&ewl_recipes; - - - - + <!-- Chapters Go Here --> + &intro; + &imlib_recipes; + &evas_recipes; + &ecore_recipes; + &edb_eet_recipes; + &esmart_recipes; + &etox_recipes; + &edje_recipes; + &edje_edc_recipes; + &ewl_recipes; </book> + |
From: <enl...@li...> - 2004-07-02 18:12:47
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Modified Files: bookinfo.xml ecore_recipes.xml edb_eet_recipes.xml edje_recipes.xml esmart_recipes.xml etox_recipes.xml evas_recipes.xml imlib_recipes.xml intro.xml Log Message: - take the intro text off of the website and put it into the cookbook to add a bit of meat to each section =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/bookinfo.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- bookinfo.xml 21 Feb 2004 07:45:56 -0000 1.1 +++ bookinfo.xml 2 Jul 2004 18:12:38 -0000 1.2 @@ -1,38 +1,35 @@ <bookinfo> - -<title>The EFL Cookbook</title> - -<authorgroup> - <author> - <surname>Various</surname> + <title>The EFL Cookbook</title> + <authorgroup> + <author> + <surname>Various</surname> </author> <editor> - <firstname>Ben</firstname> - <surname>Rockwood</surname> - <othername>technikolor</othername> - <affiliation> - <orgname>The Enlightenment Project</orgname> - <address> <email>be...@cu...</email> </address> - </affiliation> + <firstname>Ben</firstname> + <surname>Rockwood</surname> + <othername>technikolor</othername> + <affiliation> + <orgname>The Enlightenment Project</orgname> + <address> <email>be...@cu...</email> </address> + </affiliation> </editor> -</authorgroup> - - <revhistory> + </authorgroup> - <revision> - <revnumber>v0.1</revnumber> - <date>Feb 20th, 2004</date> - <authorinitials>br</authorinitials> - <revremark>Initial document</revremark> - </revision> - - </revhistory> + <revhistory> + <revision> + <revnumber>v0.1</revnumber> + <date>Feb 20th, 2004</date> + <authorinitials>br</authorinitials> + <revremark>Initial document</revremark> + </revision> + </revhistory> + + <abstract> + <para> + Stuff. + </para> + </abstract> +</bookinfo> - <abstract> - <para> - Stuff. - </para> - </abstract> -</bookinfo> =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/ecore_recipes.xml,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- ecore_recipes.xml 15 Jun 2004 05:16:15 -0000 1.5 +++ ecore_recipes.xml 2 Jul 2004 18:12:38 -0000 1.6 @@ -41,9 +41,51 @@ <title>Ecore</title> <para> -Ecore provides a powerful event handling and modularized abstraction layer which -ties and bind your applications various components together in a nearly seemless -manner. +What is Ecore? Ecore is the core event abstraction layer and X abstraction +layer that makes doing selections, Xdnd, general X stuff, and event loops, +timeouts and idle handlers fast, optimized, and convenient. It's a +separate library so anyone can make use of the work put into Ecore to +make this job easy for applications. +</para> + +<para> +Ecore is completely modular. At its base is the event handlers and +timers, and initialization and shutdown functions. The abstraction +modules for Ecore include: +</para> + +<itemizedlist mark='bullet'> + <listitem> + Ecore X + </listitem> + <listitem> + Ecore FB + </listitem> + <listitem> + Ecore EVAS + </listitem> + <listitem> + Ecore TXT + </listitem> + <listitem> + Ecore Job + </listitem> + <listitem> + Ecore IPC + </listitem> + <listitem> + Ecore Con + </listitem> + <listitem> + Ecore Config + </listitem> +</itemizedlist> + +<para> +Ecore is so modular and powerful that it can be extremely useful even +in non-graphics programing by itself. As an example, several web servers +have been written that were based solely on Ecore and the Ecore_Con module +for abstract socket communication. </para> <!-- @@ -57,6 +99,7 @@ <firstname>dan</firstname> <surname>sinclair</surname> <email>ze...@pe...</email> + <othername>dj2</othername> </author> <date>25 April 2004</date> </sectioninfo> @@ -176,6 +219,7 @@ <firstname>dan</firstname> <surname>sinclair</surname> <email>ze...@pe...</email> + <othername>dj2</othername> </author> <date>14 June 2004</date> </sectioninfo> =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/edb_eet_recipes.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- edb_eet_recipes.xml 21 Feb 2004 07:45:56 -0000 1.1 +++ edb_eet_recipes.xml 2 Jul 2004 18:12:38 -0000 1.2 @@ -41,8 +41,51 @@ <title>EDB & EET</title> <para> -The libs. +EDB is a database convenience library wrapped around the Berkeley DB 2.7.7 by +Sleepycat Software. It is intended to make accessing database information portable, +easy, fast and efficient. </para> +<para> +EET is a tiny library designed to write arbitary chunks of data to a file and +optionally compress each chunk (very much like a zip file) and allows for fast +random-access reading of the file later on. It does not do zip as a zip itself +has more complexity than is needed, and it was much simpler to impliment this once here. +</para> + +<para> +EDB provides an excellent method of storing and retrieving application configuration +information, although it can be used for more extensively than that. +Ebits, the predecessor to Edje, even used EDB as a container for Ebits themes +prior to EET. An Edb consists of a series of key/value pairs, which can consist of a +variety of data types, including integers, floating point values, strings, and binary +data. The simplified API provides simple, complete, and unified functions for managing +and accessing your database. +</para> + +<para> +In addition to the library, a variety of tools are available to access and +modify your EDBs. The edb_ed tool provides a simple command line interface that can +easily be scripted, especially useful for use with the GNU autotools suite. The edb_vt_ed +tool provides an easy to use curses interface. Finally, edb_gtk_ed provides an elegant +and easy GUI interface, especially useful for end user editing of configuration +data contained in EDBs. +</para> + +<para> +Eet is extremely fast, small and simple. Eet files can be very small and highly +compressed, making them very optimal for just sending across the internet without +having to archive, compress or decompress and install them. They allow for +lightning-fast random-acess reads once created, making them perfect for storing +data that is written once (or rarely) and read many times, but the program does +not want to have to read it all in at once. +</para> + +<para> +It also can encode and decode data structures in memory, as well as image data for +saving to Eet files or sending across the network to other machines, or just writing +to arbitary files on the system. All data is encoded in a platform independant way +and can be written and read by any architecture. +</para> </chapter> =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/edje_recipes.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- edje_recipes.xml 21 Feb 2004 07:45:56 -0000 1.1 +++ edje_recipes.xml 2 Jul 2004 18:12:38 -0000 1.2 @@ -44,5 +44,46 @@ Edje is a complex graphical design and layout library. </para> +<para> +It's purpose is to be a sequel to "Ebits" which to date has serviced the needs of +Enlightenment development for version 0.17. The original design paramteres under +which Ebits came about were a lot more restricted than the resulting use of +them, thus Edje was born. +</para> + +<para> +Edje is a more complex layout engine compared to Ebits. It doesn't pretend to do +containering and regular layout like a widget set. It still inherits the more simplistic +layout ideas behind Ebits, but it now does them a lot more cleanly, allowing for easy +expansion, and the ability to cover much more ground than Ebits ever could. For the +purposes of Enlightenment 0.17, Edje should serve all the purposes of creating visual +elements (borders of windows, scrollbars, etc.) and allow the designer the ability to +animate, layout and control the look and feel of any program using Edje as its basic +GUI constructor. This library allows for multiple collections of Layouts in one file, +sharing the same image database and thus allowing a whole theme to be conveneintly +packaged into one file and shipped around. +</para> + +<para> +Edje, unlike Ebits, separates the layout and behavior logic. Edje files ship with an +image database, used by all the parts in all the collections to source graphical data. +It has a directory of logical part names pointing to the part collection entry ID in the +file (thus allowing for multiple logical names to point to the same part collection, +allowing for the sharing of data between display elements). Each part collection consists +of a list of visual parts, as well as a list of programs. A program is a conditionally run +program that if a particular event occurs (a button is pressed, a mouse enters or leaves +a part) will trigger an action that may affect other parts. In this way a part collection +can be "programmed" via its file so as to hilight buttons when the mouse passes over them +or show hidden parts when a button is clicked somewhere. The actions performed in changing +from one state to another are also allowed to transition over a period of time, allowing animation. +</para> + +<para> +This separation and simplistic event driven style of programming can produce almost any look +and feel one could want for basic visual elements. Anything more complex is likely +the domain of an application or widget set that may use Edje as a conveneient way of +being able to configure parts of the display. +</para> </chapter> + =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/esmart_recipes.xml,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- esmart_recipes.xml 7 May 2004 00:41:18 -0000 1.4 +++ esmart_recipes.xml 2 Jul 2004 18:12:38 -0000 1.5 @@ -56,6 +56,7 @@ <firstname>dan</firstname> <surname>sinclair</surname> <email>ze...@pe...</email> + <othername>dj2</othername> </author> <date>25 April 2004</date> </sectioninfo> @@ -329,6 +330,7 @@ <firstname>dan</firstname> <surname>sinclair</surname> <email>ze...@pe...</email> + <othername>dj2</othername> </author> <date>30 April 2004</date> </sectioninfo> =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/etox_recipes.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- etox_recipes.xml 30 Jun 2004 17:44:48 -0000 1.1 +++ etox_recipes.xml 2 Jul 2004 18:12:38 -0000 1.2 @@ -41,10 +41,10 @@ <title>Etox</title> <para> -Etox provides a power library for manipulation and layout of text in your -EVAS/EFL application, which Estyle provides a veritile text stylization -library and toolset that can be used with or without Etox. +Etox is a type setting and text layout library based on Evas. Etox helps you when +it comes to displaying, moving, resizing, layering, clipping, aligning and +coloring fonts in different styles, and more. </para> - </chapter> + =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/evas_recipes.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_recipes.xml 21 Feb 2004 07:45:56 -0000 1.1 +++ evas_recipes.xml 2 Jul 2004 18:12:38 -0000 1.2 @@ -41,16 +41,24 @@ <title>EVAS</title> <para> -Evas is a hardware-accelerated canvas API for X-Windows that can draw anti-aliased text, smooth super and sub-sampled images, alpha-blend, as well as drop down to using normal X11 primitives such as pixmaps, lines and rectangles for speed if your CPU or graphics hardware are too slow. +Evas is a hardware-accelerated canvas API for X-Windows that can draw anti-aliased text, +smooth super and sub-sampled images, alpha-blend, as well as drop down to using normal +X11 primitives such as pixmaps, lines and rectangles for speed if your CPU or graphics +hardware are too slow. </para> <para> -Evas abstracts any need to know much about what the characteristics of your XServer's display are, what depth or what magic visuals etc, it has. The most you need to tell Evas is how many colors (at a maximum) to use if the display is not a truecolor display. By default it is suggested to use 216 colors (as this equates to a 6x6x6 color cube - exactly the same color cube Netscape, Mozilla, gdkrgb etc. use so colors will be shared). If Evas can't allocate enough colors it keeps reducing the size of the color cube until it reaches plain black and white. This way, it can display on anything from a black and white only terminal to 16 color VGA to 256 color and all the way up through 15, 16, 24 and 32bit color. Here are some screen shots of a demo Evas application to show the rendering output in different situations +Evas abstracts any need to know much about the characteristics of your XServer's +display, what depth or what magic visuals, it has. The most you need to tell Evas is +how many colors (at a maximum) to use if the display is not a truecolor display. +By default it is suggested to use 216 colors (as this equates to a 6x6x6 color cube - +exactly the same color cube Netscape, Mozilla, gdkrgb etc. use so colors will be shared). +If Evas can't allocate enough colors it keeps reducing the size of the color cube until +it reaches plain black and white. This way, it can display on anything from a black +and white only terminal to 16 color VGA to 256 color and all the way up through +15, 16, 24 and 32bit color. </para> - - - <section> <sectioninfo> <firstname>Norman</firstname> @@ -65,7 +73,5 @@ </section> - - - </chapter> + =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/imlib_recipes.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- imlib_recipes.xml 21 Feb 2004 07:45:56 -0000 1.1 +++ imlib_recipes.xml 2 Jul 2004 18:12:38 -0000 1.2 @@ -41,8 +41,55 @@ <title>Imlib2</title> <para> -Imlib2 provides a powerful engine for image manipulation and rendering. +Imlib2 is the successor to Imlib. It is not just a newer version - it is a completely +new library. Imlib2 can be installed alongside Imlib 1.x without any problems since +they are effectively different libraries - but they Have very similar functionality. </para> +<para> +Imlib2 can do the following: +</para> + +<itemizedlist mark='bullet'> + <listitem>Load image files from disk in one of many formats</listitem> + <listitem>Save images to disk in one of many formats</listitem> + <listitem>Render image data onto other images</listitem> + <listitem>Render images to an X-Windows drawable</listitem> + <listitem>Produce pixmaps and pixmap masks of Images</listitem> + <listitem>Apply filters to images</listitem> + <listitem>Rotate images</listitem> + <listitem>Accept RGBA Data for images</listitem> + <listitem>Scale images</listitem> + <listitem>Alpha blend Images on other images or drawables</listitem> + <listitem>Apply color correction and modification tables and factors to images</listitem> + <listitem>Render images onto images with color correction and modification tables</listitem> + <listitem>Render truetype anti-aliased text</listitem> + <listitem>Render truetype anti-aliased text at any angle</listitem> + <listitem>Render anti-aliased lines</listitem> + <listitem>Render rectangles</listitem> + <listitem>Render linear multi-colored gradients</listitem> + <listitem>Cache data intelligently for maximum performance</listitem> + <listitem>Allocate colors automatically</listitem> + <listitem>Allow full control over caching and color allocation</listitem> + <listitem>Provide highly optimized MMX assembly for core routines</listitem> + <listitem>Provide plug-in filter interface</listitem> + <listitem>Provide on-the-fly runtime plug-in image loading and saving interface</listitem> + <listitem>Fastest image compositing, rendering and manipulation library for X</listitem> +</itemizedlist> + +<para> +If what you want isn't in the list above somewhere then likely Imlib2 does not do it. +If it does, it likely does it faster than any other library you can find (this includes +gdk-pixbuf, gdkrgb, etc.) primarily because of highly optimized code and a smart subsystem +that does the dirty work for you and picks up the pieces for you so you can be lazy and +let Imlib2 do all the optimizations for you. +</para> + +<para> +Imlib2 can run without a display, so it can be easily used for background image +processing for web sites or servers - it only requires the X libraries to be installed +- that is all - it does not require an XServer to run unless you wish to display images. +</para> </chapter> + =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/intro.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- intro.xml 21 Feb 2004 07:45:56 -0000 1.1 +++ intro.xml 2 Jul 2004 18:12:38 -0000 1.2 @@ -1,14 +1,23 @@ <chapter> -<title>Introduction</title> + <title>Introduction</title> -<para> -This book....... -</para> - - -<para> -More intro. -</para> + <para> + With the decision to re-write Enlightenment for DR17, came the decision to build + a support infrastructure that could support Enlightenment well into the future + and other projects needing a solid base of libraries. This formed the basis + of the Enlightenment Foundation Libraries (EFL). + </para> + + <para> + The EFL has grown to encompass many of the features required by the window manager development + and many of the applications that will be run on top of that WM. There are currently + libraries to handle transparency, configuration, video, core event loops, and interface + abstraction. + </para> + + <para> + This book is an attempt to be your road map through this foundation. + </para> </chapter> |
From: <enl...@li...> - 2004-07-02 18:17:03
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Modified Files: ecore_recipes.xml imlib_recipes.xml Log Message: - make the bulleted lists compact so they look better =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/ecore_recipes.xml,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- ecore_recipes.xml 2 Jul 2004 18:12:38 -0000 1.6 +++ ecore_recipes.xml 2 Jul 2004 18:16:56 -0000 1.7 @@ -54,7 +54,7 @@ modules for Ecore include: </para> -<itemizedlist mark='bullet'> +<itemizedlist mark="bullet" spacing="compact"> <listitem> Ecore X </listitem> =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/imlib_recipes.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- imlib_recipes.xml 2 Jul 2004 18:12:38 -0000 1.2 +++ imlib_recipes.xml 2 Jul 2004 18:16:56 -0000 1.3 @@ -50,7 +50,7 @@ Imlib2 can do the following: </para> -<itemizedlist mark='bullet'> +<itemizedlist mark="bullet" spacing="compact"> <listitem>Load image files from disk in one of many formats</listitem> <listitem>Save images to disk in one of many formats</listitem> <listitem>Render image data onto other images</listitem> |
From: <enl...@li...> - 2004-07-02 22:13:42
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/ecore Log Message: Directory /cvsroot/enlightenment/e17/docs/cookbook/xml/ecore added to the repository |
From: <enl...@li...> - 2004-07-02 22:14:00
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/esmart Log Message: Directory /cvsroot/enlightenment/e17/docs/cookbook/xml/esmart added to the repository |
From: <enl...@li...> - 2004-07-02 22:14:18
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/evas Log Message: Directory /cvsroot/enlightenment/e17/docs/cookbook/xml/evas added to the repository |
From: <enl...@li...> - 2004-07-02 22:17:52
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/ecore Added Files: ecore_config_intro.xml ecore_ipc_intro.xml Log Message: - move the recipies out into their individual files for easier maintenance - remove the example from the top of every file as there is one in the README - fixup the README to explain how to add recipies with the new directories. |
From: <enl...@li...> - 2004-07-02 22:17:52
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/esmart Added Files: esmart_container_intro.xml esmart_trans_intro.xml Log Message: - move the recipies out into their individual files for easier maintenance - remove the example from the top of every file as there is one in the README - fixup the README to explain how to add recipies with the new directories. |
From: <enl...@li...> - 2004-07-02 22:17:53
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/evas Added Files: evas_key_bindings.xml Log Message: - move the recipies out into their individual files for easier maintenance - remove the example from the top of every file as there is one in the README - fixup the README to explain how to add recipies with the new directories. |
From: <enl...@li...> - 2004-07-02 22:18:28
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook Modified Files: README eflcookbook.xml Log Message: - move the recipies out into their individual files for easier maintenance - remove the example from the top of every file as there is one in the README - fixup the README to explain how to add recipies with the new directories. =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/README,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- README 21 Feb 2004 07:45:56 -0000 1.1 +++ README 2 Jul 2004 22:17:44 -0000 1.2 @@ -13,7 +13,7 @@ as the popular O'Reilly cookbooks (example: http://cookbooks.oreilly.com/). Any is free to contribute to this document, and as such is a perpetual work-in-progress. The document is split into chapters, each covering -a diffrent componant, or set of componants, that make up the collective +a different component, or set of components, that make up the collective EFL. @@ -25,7 +25,7 @@ recipe is in the form of a problem (or task) and solution. The key to a good recipe, just as a cooking recipe, is to be complete. Whenever possible or practical you should include complete code -examples, from the pre-proccessor directives (#include...) to the final +examples, from the pre-processor directives (#include...) to the final closing bracket, so that inexperienced or new coders aren't confused by where your code snippet goes. [ More here ] @@ -40,9 +40,8 @@ important thing is to concentrate on the content. In the xml/ directory are several XML files, which -are individual chapters of the document. There is a commented -out example of how to add a recipe in each file, but lets review -the basics of DocBook/XML... +are individual chapters of the document. There is an example +of how to add a recipe below, but lets review the basics of DocBook/XML... DocBook comes in a variety of flavors, including SGML and XML. We're using XML, which if your new to XML in general, looks @@ -50,8 +49,8 @@ each tag, there is no tag in XML which can stand alone without being closed, so everything is done in open/close pairs. A <book> is made up of <chapter>s which are made up of <para>graphs and <section>s, which are -themeselves made up of <para>graphs. Each <section> and <chapter> -can be given a <title>. Like HTML, certain charrectors are special +themselves made up of <para>graphs. Each <section> and <chapter> +can be given a <title>. Like HTML, certain characters are special and can not be used literally, so the "&" symbol becomes "&", the "<" symbol becomes "<", and the ">" symbol becomes ">". @@ -60,14 +59,14 @@ <programlisting>, which works similarly to the HTML <pre> tag to maintain program indentation, etc. <figure>s and <example>s are special because they can have <title>s which are listed in figure index -in the begining of the book. <figure>s can also include <graphic>s +in the beginning of the book. <figure>s can also include <graphic>s for screenshots. In the img/ directory you can place your graphics to be included. Remember that because files in the xml/ directory are included into the main DocBook/XML document in the root directory -before being rendered that your refereances to images should +before being rendered that your references to images should be in the form "img/my_shot.png", not "../img/my_shot.png". SVG, JPEG, PNG and other formats can be used in DocBook/XML, but -for portablity purposes it is recommended that you confine yourself +for portability purposes it is recommended that you confine yourself to using PNG. The framework of the document is in place, therefore @@ -77,13 +76,43 @@ recipe. There should be 1 new section per recipe. Sub-sections for a recipe can be used, but are discouraged. + Each individual section is written in a separate file to +allow easier maintenance of the book. Each of these files resides +in a directory related to the chapter in reference. So all ecore +sections are in the ecore directory. + + An individual section has a format as seen below. Once the section +is written an entry needs to be made into the chapter xml file and +an entry into the eflcookbook.xml file. + + Into the eflcookbook.xml file you will need to add something +like: + + <!ENTITY ecore_ipc_intro SYSTEM "xml/ecore/ecore_ipc_intro.xml"> + +This sets up an XML entity reference to your section. Then into the +chapter file you will add an entry like: + + &ecore_ipc_intro; + +Where you want the section to appear. The value is the 2nd parameter +to the ENTITY tag above. + The following is an example of what you would add: -------------------------------------------------------------------- <section> +<sectioninfo> + <author> + <firstname>Ben</firstname> + <lastname>Rockwood</lastname> + <email>be...@cu...</email> + </author> + <data>2 July 2004</data> +</sectioninfo> + <title>Recipe: Simple Drag-N-Drop</title> <!-- This is a DocBook/XML comment --> -<!-- Recipe added by: Ben Rockwood --> <para> This is the first paragraph of the recipe about @@ -111,7 +140,7 @@ </para> <figure> -<title>An illistration or screenshot </title> +<title>An illustration or screenshot </title> <graphic format='PNG' align='center' fileref='img/my_image.png' /> </figure> @@ -132,17 +161,16 @@ -------------------------------------------------------------------- You can use as many <para>graphs as you need, and line breaks in the XML -source, like XML, are unimportant. The only place your indentation/line-breaks +source, like HTML, are unimportant. The only place your indentation/line-breaks will matter is within the <programlisting> or <screen> tags. I'll point out putting a slash at the end of a tag will close it at the same time, so <para /> is functionally the same as <para></para>, as you see in the <graphic>s tag above. Thats it! Pretty simple. At least 90% of your recipe will -be in <para>'s, and for the rest just follow the examples in each file, -or refer back here. Don't bother trying to get fancy with your syntax; -simplicity is best. Just remember to make sure you close all your tags, -and you'll do fine. +be in <para>'s, and for the rest just follow the example above. +Don't bother trying to get fancy with your syntax; simplicity is best. +Just remember to make sure you close all your tags, and you'll do fine. @@ -166,7 +194,7 @@ http://docbook.org/xml/index.html Install each of the above and modify the Makefile as needed to -fit your enviroment. Gentoo installs of the XSL and DTDs are possbile, but +fit your environment. Gentoo installs of the XSL and DTDs are possible, but personally discouraged. !!!!!!!!!!!!!NOTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/eflcookbook.xml,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- eflcookbook.xml 2 Jul 2004 18:12:37 -0000 1.3 +++ eflcookbook.xml 2 Jul 2004 22:17:44 -0000 1.4 @@ -1,6 +1,8 @@ <?xml version='1.0' encoding="UTF-8"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR1//EN" "file:///usr/share/sgml/docbook/xml-dtd-4.3CR1/docbookx.dtd" [ + + <!-- This is the main book info --> <!ENTITY bookinfo SYSTEM "xml/bookinfo.xml"> <!ENTITY intro SYSTEM "xml/intro.xml"> <!ENTITY imlib_recipes SYSTEM "xml/imlib_recipes.xml"> @@ -12,6 +14,17 @@ <!ENTITY edje_edc_recipes SYSTEM "xml/edje_edc_recipes.xml"> <!ENTITY edje_recipes SYSTEM "xml/edje_recipes.xml"> <!ENTITY ewl_recipes SYSTEM "xml/ewl_recipes.xml"> + + <!-- ecore --> + <!ENTITY ecore_config_intro SYSTEM "xml/ecore/ecore_config_intro.xml"> + <!ENTITY ecore_ipc_intro SYSTEM "xml/ecore/ecore_ipc_intro.xml"> + + <!-- evas --> + <!ENTITY evas_key_bindings SYSTEM "xml/evas/evas_key_bindings.xml"> + + <!-- esmart --> + <!ENTITY esmart_trans_intro SYSTEM "xml/esmart/esmart_trans_intro.xml"> + <!ENTITY esmart_container_intro SYSTEM "xml/esmart/esmart_container_intro.xml"> ]> <book> @@ -30,3 +43,4 @@ &ewl_recipes; </book> + |
From: <enl...@li...> - 2004-07-02 22:18:30
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Modified Files: ecore_recipes.xml edb_eet_recipes.xml edje_edc_recipes.xml edje_recipes.xml esmart_recipes.xml etox_recipes.xml evas_recipes.xml ewl_recipes.xml imlib_recipes.xml Log Message: - move the recipies out into their individual files for easier maintenance - remove the example from the top of every file as there is one in the README - fixup the README to explain how to add recipies with the new directories. =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/ecore_recipes.xml,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- ecore_recipes.xml 2 Jul 2004 18:16:56 -0000 1.7 +++ ecore_recipes.xml 2 Jul 2004 22:17:45 -0000 1.8 @@ -1,41 +1,4 @@ <!-- Ecore & Modules Recipes --> -<!-- -################################################### -This example section is commented out: - -<section> -<title>Recipe: Example</title> - -<para> -This is the first paragraph of the recipe. -</para> - -<example> -<title>Code Example Title</title> -<programlisting> -// Sample EDC -images { - image, "background.png" LOSSY 95; -} - -collections { - group { - name, "test"; - min, 32 32; - max, 1024 768; - ... -</programlisting> -</example> - -<para> -Another paragraph. Don't forget to replace less-than and greater-than -symbols with the proper < and > even in your program listings. -</para> -</section> -################################################# ---> - -<!-- \/ \/ \/ CONTENT \/ \/ \/ --> <chapter> <title>Ecore</title> @@ -55,30 +18,14 @@ </para> <itemizedlist mark="bullet" spacing="compact"> - <listitem> - Ecore X - </listitem> - <listitem> - Ecore FB - </listitem> - <listitem> - Ecore EVAS - </listitem> - <listitem> - Ecore TXT - </listitem> - <listitem> - Ecore Job - </listitem> - <listitem> - Ecore IPC - </listitem> - <listitem> - Ecore Con - </listitem> - <listitem> - Ecore Config - </listitem> + <listitem>Ecore X</listitem> + <listitem>Ecore FB</listitem> + <listitem>Ecore EVAS</listitem> + <listitem>Ecore TXT</listitem> + <listitem>Ecore Job</listitem> + <listitem>Ecore IPC</listitem> + <listitem>Ecore Con</listitem> + <listitem>Ecore Config</listitem> </itemizedlist> <para> @@ -88,476 +35,9 @@ for abstract socket communication. </para> -<!-- -####################################### -Introduction to Ecore_Config -####################################### ---> -<section> -<sectioninfo> - <author> - <firstname>dan</firstname> - <surname>sinclair</surname> - <email>ze...@pe...</email> - <othername>dj2</othername> - </author> - <date>25 April 2004</date> -</sectioninfo> - -<title>Recipe: Ecore Config Introduction</title> - -<para> -The Ecore_Config module provides the programmer with a very simple way to setup -configuration files for their program. This recipe will give an example of how to -integrate the beginnings of Ecore_Config into your program and use it to get -configuration data. -</para> - -<example> -<title>Simple Ecore_Config program</title> -<programlisting> -#include <Ecore_Config.h> - -int main(int argc, char ** argv) { - int i; - float j; - char *str; - - if (ecore_config_init("foo") != ECORE_CONFIG_ERR_SUCC) { - printf("Cannot init Ecore_Config"); - return 1; - } - - ecore_config_int_default("/int_example", 1); - ecore_config_string_default("/this/is/a/string/example", "String"); - ecore_config_float_default("/float/example", 2.22); - - ecore_config_load(); - - i = ecore_config_int_get("/int_example"); - str = ecore_config_string_get("/this/is/a/string/example"); - j = ecore_config_float_get("/float/example"); - - printf("str is (%s)\n", str); - printf("i is (%d)\n", i); - printf("j is (%f)\n", j); - - free(str); - - ecore_config_shutdown(); - return 0; -} -</programlisting> -</example> -<para> -As you can see from this example the basic usage of Ecore_Config is simple. The system is initialized with -a call to ecore_config_init(PROGRAM_NAME). The program name setting control where Ecore_Config will look for -your configuration database. The directory and file name are: ~/.e/apps/PROGRAM_NAME/config.db. -</para> - -<para> -For each configuration variable you are getting from Ecore_Config, you can assign a default value in the case -that the user does not have a config.db file. The defaults are assigned with the ecore_config_*_default where * -is one of the Ecore_Config types. The first parameter is the key under which this is to be accessed. These keys -must be unique over your program. The value passed is of the type appropriated for this call. -</para> - -<para> -The ecore_config_load call will read the values from the config.db file into Ecore_Config. After which we can -access the files with the ecore_config_*_get methods (again * is the type of data desired). These routines -take the key name for this item and return the value associated with that key. Each function returns a type -that corresponds to the function call name. -</para> - -<para> -ecore_config_shutdown is then called to shutdown the Ecore_Config system before the program exits. -</para> - -<example> -<title>Compilation command</title> -<programlisting> -gcc -o ecore_config_example ecore_config_example.c `ecore-config --cflags --libs` -</programlisting> -</example> -<para> -To compile the program you can use the ecore-config script to get all of the required linking and library information -for Ecore_Config. - -If you run this program as is you will receive the values put into ecore_config as the defaults as output. -Once you know the program is working, you can create a simple config.db file to read the values. -</para> - -<example> -<title>Simple config.db script (build_cfg_db.sh)</title> -<programlisting> -#!/bin/sh - -DB=config.db - -edb_ed $DB add /int_example int 2 -edb_ed $DB add /this/is/a/string/example str "this is a string" -edb_ed $DB add /float/example float 42.10101 -</programlisting> -</example> -<para> -When build_cfg_db.sh is executed it will create a config.db file in the current directory. This file can -then be copied into ~/.e/apps/PROGRAM_NAME/config.db where PROGRAM_NAME is the value passed into -ecore_config_init. Once the file is copied in place, executing the test program again will show the values -given in the config file instead of the defaults. You can specify as many, or as few of the configuration -keys in the config file and Ecore_Config will either show the user value or the default value. -</para> -</section> - -<!-- -####################################### -Introduction to Ecore_Ipc -####################################### ---> -<section> -<sectioninfo> - <author> - <firstname>dan</firstname> - <surname>sinclair</surname> - <email>ze...@pe...</email> - <othername>dj2</othername> - </author> - <date>14 June 2004</date> -</sectioninfo> - -<title>Recipe: Ecore Ipc Introduction</title> -<para> -The Ecore_Ipc library provides a robust and efficient wrapper around the Ecore_Con module. -Ecore_Ipc allows you to set up your server communications and handles all of the tricky stuff -under the hood. This recipe will give a simple example of an Ecore client and an Ecore server. -</para> - -<para> -When working with Ecore_Ipc, when writing a client or a server app an Ecore_Ipc_Server -object will be created. This is because in either case it is a server being manipulated, -either the one being setup, or the one being communicated with. After that, everything -is easy. -</para> - -<example> -<title>Ecore_Ipc client: preamble</title> -<programlisting> -#include <Ecore.h> -#include <Ecore_Ipc.h> - -int sig_exit_cb(void *data, int ev_type, void *ev); -int handler_server_add(void *data, int ev_type, void *ev); -int handler_server_del(void *data, int ev_type, void *ev); -int handler_server_data(void *data, int ev_type, void *ev); -</programlisting> -</example> -<para> -The Ecore.h file is included so we can have access to the exit signal type. The functions -will be explained later when their callbacks are hooked up. -</para> - -<example> -<title>Ecore_Ipc client: main setup</title> -<programlisting> -int main(int argc, char ** argv) { - Ecore_Ipc_Server *server; - - if (!ecore_init()) { - printf("unable to init ecore\n"); - return 1; - } - - if (!ecore_ipc_init()) { - printf("unable to init ecore_con\n"); - ecore_shutdown(); - return 1; - } - ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, sig_exit_cb, NULL); -</programlisting> -</example> -<para> -As mentioned earlier, even though we are writing a client app, we still use an Ecore_Ipc_Server -object. Using Ecore_Ipc requires the setup of Ecore itself. This is done with a simple call to ecore_init(). -Ecore_Ipc is then setup with a call to ecore_ipc_init(). If either of these return 0, the appropriate -action is taken to undo any initialization take to this point. The ECORE_EVENT_SIGNAL_EXIT callback -is hooked up so we can exit gracefully if required. -</para> - -<example> -<title>Ecore_Ipc client: main creating client</title> -<programlisting> - server = ecore_ipc_server_connect(ECORE_IPC_REMOTE_SYSTEM, - "localhost", 9999, NULL); - ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, - handler_server_add, NULL); - ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, - handler_server_del, NULL); - ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA, - handler_server_data, NULL); -</programlisting> -</example> -<para> -In this example we are creating a remote connection to the server named "localhost" on the port 9999. This -is done with the ecore_ipc_server_connect() method. The first parameter is the type of connection being made, -which can be one of: ECORE_IPC_REMOTE_SYSTEM, ECORE_IPC_LOCAL_SYSTEM, or ECORE_IPC_LOCAL_USER. If -OpenSSL was available when Ecore_Ipc was compiled, ECORE_IPC_USE_SSL can be or'd with the connection type -to create an SSL connection. -</para> - -<para> -The three calls to ecore_event_handler_add() setup the callbacks for the different types of events -we will be receiving from the server. A server was added, a server was deleted, or the server -sent us data. -</para> - -<example> -<title>Ecore_Ipc client: main end</title> -<programlisting> - ecore_ipc_server_send(server, 3, 4, 0, 0, 0, "Look ma, no pants", 17); - - ecore_main_loop_begin(); - - ecore_ipc_server_del(server); - ecore_ipc_shutdown(); - ecore_shutdown(); - return 0; -} -</programlisting> -</example> -<para> -For the purposes of this example, the client is sending a message on startup to the server, which -the server will respond to. The client message is sent with the ecore_ipc_server_send() command. -ecore_ipc_server_send() takes the server to send to, the message major, message minor, a reference, -a reference to, a response, the data and a size. These parameters, except for the server are up the -the client and can refer to anything required. This hopefully gives the maximum flexibility -in creating client/server IPC apps. -</para> - -<para> -After the server message is sent we enter into the main ecore loop and wait for events. If -the main loop is exited we delete the server object, shutdown Ecore_Ipc with a call to -ecore_ipc_shutdown(), and shutdown ecore through ecore_shutdown(). -</para> - -<example> -<title>Ecore_Ipc client: sig_exit_cb</title> -<programlisting> -int sig_exit_cb(void *data, int ev_type, void *ev) { - ecore_main_loop_quit(); - return 1; -} -</programlisting> -</example> -<para> -The sig_exit_cb() just tells ecore to quit the main loop. -</para> - -<example> -<title>Ecore_Ipc client: the callbacks</title> -<programlisting> -int handler_server_add(void *data, int ev_type, void *ev) { - Ecore_Ipc_Event_Server_Add *e = (Ecore_Ipc_Event_Server_Add *)ev; - printf("Got a server add %p\n", e->server); - return 1; -} - -int handler_server_del(void *data, int ev_type, void *ev) { - Ecore_Ipc_Event_Server_Del *e = (Ecore_Ipc_Event_Server_Del *)ev; - printf("Got a server del %p\n", e->server); - return 1; -} - -int handler_server_data(void *data, int ev_type, void *ev) { - Ecore_Ipc_Event_Server_Data *e = (Ecore_Ipc_Event_Server_Data *)ev; - printf("Got server data %p [%i] [%i] [%i] (%s)\n", e->server, e->major, - e->minor, e->size, (char *)e->data); - return 1; -} -</programlisting> -</example> -<para> -These three callbacks, handler_server_add(), handler_server_del(), and handler_server_data() -are body of the client handling all events related to the server we are connected to. Each -of the callbacks has an associated event structure, Ecore_Ipc_Event_Server_Add, -Ecore_Ipc_Event_Server_Del and Ecore_Ipc_Event_Server_Data containing information on the -event itself. -</para> - -<para> -When we first connect to the server the handler_server_add() callback will be executed -allowing any setup to be accomplished. -</para> - -<para> -If the server breaks the connection the handler_server_del() callback will be executed -allowing any required cleanup. -</para> - -<para> -When the server sends data to the client the handler_server_data callback will the executed. -Which in this example just prints some information about the message itself and the -message body. -</para> - -<para> -And thats the client. The code itself is pretty simple thanks to the abstractions provided by -Ecore. -</para> - -<example> -<title>Ecore_Ipc server: preamble</title> -<programlisting> -#include <Ecore.h> -#include <Ecore_Ipc.h> - -int sig_exit_cb(void *data, int ev_type, void *ev); -int handler_client_add(void *data, int ev_type, void *ev); -int handler_client_del(void *data, int ev_type, void *ev); -int handler_client_data(void *data, int ev_type, void *ev); -</programlisting> -</example> -<para> -As with the client, the Ecore.h header is included to get access the to the exit signal. -The Ecore_Ipc.h header is required for apps making use of the Ecore_Ipc library. Each -sign handler will be explained with its code. -</para> - -<example> -<title>Ecore_Ipc server: main setup</title> -<programlisting> -int main(int argc, char ** argv) { - Ecore_Ipc_Server *server; - - if (!ecore_init()) { - printf("Failed to init ecore\n"); - return 1; - } - - if (!ecore_ipc_init()) { - printf("failed to init ecore_con\n"); - ecore_shutdown(); - return 1; - } - - ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, sig_exit_cb, NULL); -</programlisting> -</example> -<para> -This is the same as the client setup above. -</para> - -<example> -<title>Ecore_Ipc server: main creating server</title> -<programlisting> - server = ecore_ipc_server_add(ECORE_IPC_REMOTE_SYSTEM, "localhost", 9999, NULL); - ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD, handler_client_add, NULL); - ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, handler_client_del, NULL); - ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, handler_client_data, NULL); -</programlisting> -</example> -<para> -Unlike the client, for the server we add a listener to port 9999 on the machine "localhost" through -the call ecore_ipc_server_add(). This will create and return the server object to us. -We then hook in the required signal handlers, the difference to the client being we want -CLIENT events this time instead of SERVER events. -</para> - -<example> -<title>Ecore_Ipc client: main end</title> -<programlisting> - ecore_main_loop_begin(); - - ecore_ipc_server_del(server); - ecore_ipc_shutdown(); - ecore_shutdown(); - return 0; -} -</programlisting> -</example> -<para> -This again is identical to the client shutdown, minus the sending of data to the server. -</para> - -<example> -<title>Ecore_Ipc server: sig_exit callback</title> -<programlisting> -</programlisting> -</example> -<para> -The sig_exit_cb() is again identical to that seen in the client. -</para> - -<example> -<title>Ecore_Ipc server: the callbacks</title> -<programlisting> -int handler_client_add(void *data, int ev_type, void *ev) { - Ecore_Ipc_Event_Client_Add *e = (Ecore_Ipc_Event_Client_Add *)ev; - printf("client %p connected to server\n", e->client); - return 1; -} - -int handler_client_del(void *data, int ev_type, void *ev) { - Ecore_Ipc_Event_Client_Del *e = (Ecore_Ipc_Event_Client_Del *)ev; - printf("client %p disconnected from server\n", e->client); - return 1; -} - -int handler_client_data(void *data, int ev_type, void *ev) { - Ecore_Ipc_Event_Client_Data *e = (Ecore_Ipc_Event_Client_Data *)ev; - printf("client %p sent [%i] [%i] [%i] (%s)\n", e->client, e->major, - e->minor, e->size, (char *)e->data); - - ecore_ipc_client_send(e->client, 3, 4, 0, 0, 0, "Pants On!", 9); - return 1; -} -</programlisting> -</example> -<para> -The event callbacks are similar to those seen in the client app. The main -difference is that the events are _Client_ events instead of _Server_ events. -</para> - -<para> -The add callback is when a client connects to our server, with the del callback -being its opposite when the client disconnects. The data callback is for -when a client sends data to the server. -</para> - -<para> -At the end of the handler_client_data callback we do a call to ecore_ipc_client_send(). -This sends data to the client. As with sending data to the server, the parameters are: -the client to send to, major number, minor number, reference, reference to, response, -data and the data size. -</para> - -<example> -<title>Ecore_Ipc: compilation</title> -<programlisting> -CC = gcc - -all: server client - -server: server.c - $(CC) -o server server.c `ecore-config --cflags --libs` - -client: client.c - $(CC) -o client client.c `ecore-config --cflags --libs` - -clean: - rm server client -</programlisting> -</example> -<para> -As with other ecore apps, it is very easy to compile an Ecore_Ipc app. As long as your -Ecore was compiled with Ecore_Ipc, simply invoking the 'ecore-config --cflags --libs' command -will add all of the required library paths and linker information. -</para> - -<para> -As seen in this example, Ecore_Ipc is an easy to use library to create client/server -apps. -</para> +&ecore_config_intro; +&ecore_ipc_intro; +</chapter> -</section> -</chapter> =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/edb_eet_recipes.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- edb_eet_recipes.xml 2 Jul 2004 18:12:38 -0000 1.2 +++ edb_eet_recipes.xml 2 Jul 2004 22:17:45 -0000 1.3 @@ -1,41 +1,4 @@ <!-- EDB & EET Recipes --> -<!-- -################################################### -This example section is commented out: - -<section> -<title>Recipe: Example</title> - -<para> -This is the first paragraph of the recipe. -</para> - -<example> -<title>Code Example Title</title> -<programlisting> -// Sample EDC -images { - image, "background.png" LOSSY 95; -} - -collections { - group { - name, "test"; - min, 32 32; - max, 1024 768; - ... -</programlisting> -</example> - -<para> -Another paragraph. Don't forget to replace less-than and greater-than -symbols with the proper < and > even in your program listings. -</para> -</section> -################################################# ---> - -<!-- \/ \/ \/ CONTENT \/ \/ \/ --> <chapter> <title>EDB & EET</title> @@ -89,3 +52,4 @@ </para> </chapter> + =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/edje_edc_recipes.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- edje_edc_recipes.xml 21 Feb 2004 07:45:56 -0000 1.1 +++ edje_edc_recipes.xml 2 Jul 2004 22:17:45 -0000 1.2 @@ -1,41 +1,4 @@ <!-- Edje EDC Recipes --> -<!-- -################################################### -This example section is commented out: - -<section> -<title>Recipe: Example</title> - -<para> -This is the first paragraph of the recipe. -</para> - -<example> -<title>Code Example Title</title> -<programlisting> -// Sample EDC -images { - image, "background.png" LOSSY 95; -} - -collections { - group { - name, "test"; - min, 32 32; - max, 1024 768; - ... -</programlisting> -</example> - -<para> -Another paragraph. Don't forget to replace less-than and greater-than -symbols with the proper < and > even in your program listings. -</para> -</section> -################################################# ---> - -<!-- \/ \/ \/ CONTENT \/ \/ \/ --> <chapter> <title>Edje EDC</title> @@ -45,5 +8,5 @@ interface designs... </para> - </chapter> + =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/edje_recipes.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- edje_recipes.xml 2 Jul 2004 18:12:38 -0000 1.2 +++ edje_recipes.xml 2 Jul 2004 22:17:45 -0000 1.3 @@ -1,41 +1,4 @@ <!-- Edje Recipes --> -<!-- -################################################### -This example section is commented out: - -<section> -<title>Recipe: Example</title> - -<para> -This is the first paragraph of the recipe. -</para> - -<example> -<title>Code Example Title</title> -<programlisting> -// Sample EDC -images { - image, "background.png" LOSSY 95; -} - -collections { - group { - name, "test"; - min, 32 32; - max, 1024 768; - ... -</programlisting> -</example> - -<para> -Another paragraph. Don't forget to replace less-than and greater-than -symbols with the proper < and > even in your program listings. -</para> -</section> -################################################# ---> - -<!-- \/ \/ \/ CONTENT \/ \/ \/ --> <chapter> <title>Edje</title> @@ -87,3 +50,4 @@ </chapter> + =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/esmart_recipes.xml,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- esmart_recipes.xml 2 Jul 2004 18:12:38 -0000 1.5 +++ esmart_recipes.xml 2 Jul 2004 22:17:45 -0000 1.6 @@ -1,41 +1,4 @@ <!-- Esmart Recipes --> -<!-- -################################################### -This example section is commented out: - -<section> -<title>Recipe: Example</title> - -<para> -This is the first paragraph of the recipe. -</para> - -<example> -<title>Code Example Title</title> -<programlisting> -// Sample EDC -images { - image, "background.png" LOSSY 95; -} - -collections { - group { - name, "test"; - min, 32 32; - max, 1024 768; - ... -</programlisting> -</example> - -<para> -Another paragraph. Don't forget to replace less-than and greater-than -symbols with the proper < and > even in your program listings. -</para> -</section> -################################################# ---> - -<!-- \/ \/ \/ CONTENT \/ \/ \/ --> <chapter> <title>Esmart</title> @@ -45,1138 +8,8 @@ to your EVAS and EFL based applications. </para> -<!-- -####################################################### -A simple recipe to get an esmart trans window up -####################################################### ---> -<section> -<sectioninfo> - <author> - <firstname>dan</firstname> - <surname>sinclair</surname> - <email>ze...@pe...</email> - <othername>dj2</othername> - </author> - <date>25 April 2004</date> -</sectioninfo> - -<title>Recipe: Esmart Trans Introduction</title> - -<para> -Transparency is increasingly becoming a common trait of applications. To this -end, the Esmart_Trans object has been created. This object will do all of the -hard work to produce a transparent background for your program. -</para> - -<para> -Esmart trans makes the integration of a transparent background into your application -very easy. You need to create the trans object, and then make sure you update it -as the window is moved or resized. -</para> - -<example> -<title>Includes and declarations</title> -<programlisting> -#include <stdio.h> -#include <Ecore.h> -#include <Ecore_Evas.h> -#include <Esmart/Esmart_Trans_X11.h> - -int sig_exit_cb(void *data, int ev_type, void *ev); -void win_del_cb(Ecore_Evas *ee); -void win_resize_cb(Ecore_Evas *ee); -void win_move_cb(Ecore_Evas *ee); - -static void _freshen_trans(Ecore_Evas *ee); -void make_gui(); -</programlisting> -</example> -<para> -Every application that uses an Esmart_Trans object is going to require the Ecore, -Ecore_Evas and the Esmart/Esmart_Trans header files. - -The next four declarations are callbacks from ecore for events on our window, exit, delete, -resize, and move respectively. - -The last two declarations are convenience functions being used in the example and do -not need to be in your program. -</para> - -<example> -<title>main</title> -<programlisting> -int main(int argc, char ** argv) { - int ret = 0; - - if (!ecore_init()) { - printf("Error initializing ecore\n"); - ret = 1; - goto ECORE_SHUTDOWN; - } - - if (!ecore_evas_init()) { - printf("Error initializing ecore_evas\n"); - ret = 1; - goto ECORE_SHUTDOWN; - } - make_gui(); - ecore_main_loop_begin(); - - ecore_evas_shutdown(); - -ECORE_SHUTDOWN: - ecore_shutdown(); - - return ret; -} -</programlisting> -</example> -<para> -The main routine for this example is pretty simple. Ecore and Ecore_Evas are both -initialized, with appropriate error checking. We then create the gui and start -the main ecore event loop. When ecore exits we shut everything down and return. -</para> - -<example> -<title>exit and del callbacks</title> -<programlisting> -int sig_exit_cb(void *data, int ev_type, void *ev) { - ecore_main_loop_quit(); - return 1; -} - -void win_del_cb(Ecore_Evas *ee) { - ecore_main_loop_quit(); -} -</programlisting> -</example> -<para> -The exit and del callbacks are the generic ecore callbacks. -</para> - -<example> -<title>_freshen_trans</title> -<programlisting> -static void _freshen_trans(Ecore_Evas *ee) { - int x, y, w, h; - Evas_Object *o; - - if (!ee) return; - - ecore_evas_geometry_get(ee, &x, &y, &w, &h); - o = evas_object_name_find(ecore_evas_get(ee), "bg"); - - if (!o) { - fprintf(stderr, "Trans object not found, bad, very bad\n"); - ecore_main_loop_quit(); - } - esmart_trans_x11_freshen(o, x, y, w, h); -} -</programlisting> -</example> -<para> -The _freshen_trans routine is a helper routine to update the image that the trans -is shown. This will be called when we need to update our image to whats currently -under the window. - -The function grabs the current size of the ecore_evas, and then gets the object -with the name "bg" (this name is the same as the name we give our trans when -we create it). Then, as long as the trans object exists, we tell esmart to -freshen the image being displayed. -</para> - -<example> -<title>resize_cb</title> -<programlisting> -void win_resize_cb(Ecore_Evas *ee) { - int w, h; - int minw, minh; - int maxw, maxh; - Evas_Object *o = NULL; - - if (ee) { - ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); - ecore_evas_size_min_get(ee, &minw, &minh); - ecore_evas_size_max_get(ee, &maxw, &maxh); - - if ((w >= minw) && (h >= minh) && (h <= maxh) && (w <= maxw)) { - if ((o = evas_object_name_find(ecore_evas_get(ee), "bg"))) - evas_object_resize(o, w, h); - } - } - _freshen_trans(ee); -} -</programlisting> -</example> -<para> -When the window is resized we need to update our evas to the correct size and then -update the trans object to display that much of the background. - -We grab the current size of the window (ecore_evas_geometry_get) and the min/max -size of the window. As long as our currently desired size is within the min/max -bounds set for our window, we grab the "bg" (same as title again) object and -resize it. - -Once the resizing is done, we call the _freshen_trans routine to update the image -displayed on the bg. -</para> - -<example> -<title>move_cb</title> -<programlisting> -void win_move_cb(Ecore_Evas *ee) { - _freshen_trans(ee); -} -</programlisting> -</example> -<para> -When the window is moved we need to freshen the image displayed as the transparency. -</para> - -<example> -<title>Setup ecore/ecore_evas</title> -<programlisting> -void make_gui() { - Evas *evas = NULL; - Ecore_Evas *ee = NULL; - Evas_Object *trans = NULL; - int x, y, w, h; - - ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, sig_exit_cb, NULL); - - ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 300, 200); - ecore_evas_title_set(ee, "trans demo"); - - ecore_evas_callback_delete_request_set(ee, win_del_cb); - ecore_evas_callback_resize_set(ee, win_resize_cb); - ecore_evas_callback_move_set(ee, win_move_cb); - - evas = ecore_evas_get(ee); -</programlisting> -</example> -<para> -The first portion of make_gui is concerned with setting up ecore and ecore_evas. -First the exit callback is hooked into ECORE_EVENT_SIGNAL_EXIT, then the -Ecore_Evas object is created with the software X11 engine. The window title is -set and we hook in the callbacks written above, delete, resize and move. Finally we -grab the evas for the created Ecore_Evas. -</para> - -<example> -<title>Creating Esmart_Trans object</title> -<programlisting> - trans = esmart_trans_x11_new(evas); - evas_object_move(trans, 0, 0); - evas_object_layer_set(trans, -5); - evas_object_name_set(trans, "bg"); - - ecore_evas_geometry_get(ee, &x, &y, &w, &h); - evas_object_resize(trans, w, h); - - evas_object_show(trans); - ecore_evas_show(ee); - - esmart_trans_x11_freshen(trans, x, y, w, h); -} -</programlisting> -</example> -<para> -Once everything is setup we can create the trans object. The trans is to be created -in the evas returned by ecore_evas_get. This initial creation is done by the call -to esmart_trans_x11_new(evas). Once we have the object, we move it so it starts at -position (0, 0) (the upper left corner), set the layer to -5 and name the object -"bg" (as used above). - -Then we grab the current size of the ecore_evas and use that to resize the trans -object to the window size. Once everything is resized we show the trans and -show the ecore_evas. - -As a final step, we freshen the image on the transparency to what is currently under -the window so it is up to date. -</para> - -<example> -<title>Simple makefile</title> -<programlisting> -CFLAGS = `ecore-config --cflags` `evas-config --cflags` `esmart-config --cflags` -LIBS = `ecore-config --libs` `evas-config --libs` `esmart-config --libs` \ - -lesmart_trans_x11 - -all: - gcc -o trans_example trans_example.c $(CFLAGS) $(LIBS) -</programlisting> -</example> -<para> -In order to compile the above program we need to include the library information -for ecore, ecore_evas and esmart. This is done through the -config scripts for each -library. These -config scripts know where each of the includes and libraries resides -and sets up the appropriate linking and include paths for the compilation. -</para> -</section> - -<!-- -####################################################### ---> - -<!-- -####################################################### -A simple recipe on using esmart containers -####################################################### ---> -<section> -<sectioninfo> - <author> - <firstname>dan</firstname> - <surname>sinclair</surname> - <email>ze...@pe...</email> - <othername>dj2</othername> - </author> - <date>30 April 2004</date> -</sectioninfo> - -<title>Recipe: Esmart Container Introduction</title> - -<para> -There is usually a desire while designing an apps UI to group common elements together -and have their layout depend on one another. To this end the Esmart Container -libary has been created. It has been designed to handle the hard parts of the -layout, and in the cases where it does not do what you need, the layout portions of -the container are extensible and changeable. -</para> - -<para> -This recipe will give the basics of using an Esmart container. The final product is -a program that will let you see some of the different layout combinations of the -default container. The layout will be done by Edje with callbacks to the program -to change the container layout, and to tell if the user clicked on a container -element. -</para> - -<example> -<title>Includes and declarations</title> -<programlisting> -#include <Ecore.h> -#include <Ecore_Evas.h> -#include <Edje.h> -#include <Esmart/Esmart_Container.h> -#include <getopt.h> - -static void make_gui(const char *theme); -static void container_build(int align, int direction, int fill); -static void _set_text(int align, int direction); -static void _setup_edje_callbacks(Evas_Object *o); -static void _right_click_cb(void* data, Evas_Object* o, const char* emmission, - const char* source); -static void _left_click_cb(void* data, Evas_Object* o, const char* emmission, - const char* source); -static void _item_selected(void* data, Evas_Object* o, const char* emmission, - const char* source); - -static Ecore_Evas *ee; -static Evas_Object *edje; -static Evas_Object *container; - -char *str_list[] = {"item 1", "item 2", - "item 3", "item 4", - "item 5"}; -</programlisting> -</example> -<para> -As with other EFL programs we need to include Ecore, Ecore_Evas, Edje and as this is a -container example, the Esmart/Esmart_Container header. Getopt will be used to allow for -some command line processing. -</para> - -<para> -Next comes the function prototypes which will be described later when we get to their -implementations. Then a few global variables to be used throughout the program. -The str_list array is the content to be stored in the container. -</para> - -<example> -<title>main</title> -<programlisting> -int main(int argc, char ** argv) { - int align = 0; - int direction = 0; - int fill = 0; - int ret = 0; - int c; - char *theme = NULL; - - while((c = getopt(argc, argv, "a:d:f:t:")) != -1) { - switch(c) { - case 'a': - align = atoi(optarg); - break; - - case 'd': - direction = atoi(optarg); - break; - - case 'f': - fill = atoi(optarg); - break; - - case 't': - theme = strdup(optarg); - break; - - default: - printf("Unknown option string\n"); - break; - } - } - - if (theme == NULL) { - printf("Need a theme defined\n"); - exit(-1); - } -</programlisting> -</example> -<para> -The beginning of the main function gets the options out of the -command line arguments and sets up the default display. As you can -see, we require a theme to display. This could be made more intelligent, -searching default install directories and the users application -directories, but this example takes the easy way out and forces the theme -to be a command line option. -</para> - -<example> -<title>Initialization</title> -<programlisting> - if (!ecore_init()) { - printf("Can't init ecore, bad\n"); - ret = 1; - goto EXIT; - } - ecore_app_args_set(argc, (const char **)argv); - - if (!ecore_evas_init()) { - printf("Can't init ecore_evas, bad\n"); - ret = 1; - goto EXIT_ECORE; - } - - if (!edje_init()) { - printf("Can't init edje, bad\n"); - ret = 1; - goto EXIT_ECORE_EVAS; - } - edje_frametime_set(1.0 / 60.0); - - make_gui(theme); - container_build(align, direction, fill); - - ecore_main_loop_begin(); -</programlisting> -</example> -<para> -After receiving the command line arguments, we then proceed to -initializing the required libraries, Ecore, Ecore_Evas and Edje. -We take the additional step of setting the Edje frame rate. -</para> - -<para> -Once the initialization is complete we create the initial GUI for the -app. I have separated the building of the container out into a -separate function to make the container code easier to locate in the example. -</para> - -<para> -Once everything is created we call ecore_main_loop_begin and wait for -events to occur. -</para> - -<example> -<title>Shutdown</title> -<programlisting> - edje_shutdown(); - -EXIT_ECORE_EVAS: - ecore_evas_shutdown(); - -EXIT_ECORE: - ecore_shutdown(); - -EXIT: - return ret; -} -</programlisting> -</example> -<para> -The usual end routine, be good programmers and shutdown everything we started. -</para> - -<example> -<title>Window callbacks</title> -<programlisting> -static int sig_exit_cb(void *data, int ev_type, void *ev) { - ecore_main_loop_quit(); - return 1; -} - -static void win_del_cb(Ecore_Evas *ee) { - ecore_main_loop_quit(); -} - -static void win_resize_cb(Ecore_Evas *ee) { - int w, h; - int minw, minh; - int maxw, maxh; - Evas_Object *o = NULL; - - if (ee) { - ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); - ecore_evas_size_min_get(ee, &minw, &minh); - ecore_evas_size_max_get(ee, &maxw, &maxh); - - if ((w >= minw) && (h >= minh) && (h <= maxh) && (w <= maxw)) { - if ((o = evas_object_name_find(ecore_evas_get(ee), "edje"))) - evas_object_resize(o, w, h); - } - } -} -</programlisting> -</example> -<para> -Next we setup some generic callbacks to be used by the UI. This will be the exit, destroy -and resize callbacks. Again, the usual EFL style functions. -</para> - -<example> -<title>make_gui</title> -<programlisting> -static void make_gui(const char *theme) { - Evas *evas = NULL; - Evas_Object *o = NULL; - Evas_Coord minw, minh; - - ee = NULL; - edje = NULL; - container = NULL; - - ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, sig_exit_cb, NULL); - - ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 300, 400); - ecore_evas_title_set(ee, "Container Example"); - - ecore_evas_callback_delete_request_set(ee, win_del_cb); - ecore_evas_callback_resize_set(ee, win_resize_cb); - evas = ecore_evas_get(ee); - - // create the edje - edje = edje_object_add(evas); - evas_object_move(edje, 0, 0); - - if (edje_object_file_set(edje, theme, "container_ex")) { - evas_object_name_set(edje, "edje"); - - edje_object_size_min_get(edje, &minw, &minh); - ecore_evas_size_min_set(ee, (int)minw, (int)minh); - evas_object_resize(edje, (int)minw, (int)minh); - ecore_evas_resize(ee, (int)minw, (int)minh); - - edje_object_size_max_get(edje, &minw, &minh); - ecore_evas_size_max_set(ee, (int)minw, (int)minh); - evas_object_show(edje); - - } else { - printf("Unable to open (%s) for edje theme\n", theme); - exit(-1); - } - _setup_edje_callbacks(edje); - ecore_evas_show(ee); -} -</programlisting> -</example> -<para> -The GUI consists of the Ecore_Evas containing the canvas itself, and the Edje that -we will be using to control our layout. The make_gui function sets up the callbacks -defined above and creates the Ecore_Evas. -</para> - -<para> -Once we have the Evas and the callbacks are defined, we create the Edje object that -will define our layout. The edje_object_add call is used to create the object on the Evas, -and once thats done, we take the theme passed in by the user and set our Edje to -use said theme, the "container_ex" parameter is the name of the group -inside the EET that we are to use. -</para> - -<para> -Once the theme file is set to the Edje, we use the values in the theme file to setup -the size ranges for the app, and show the Edje. We then setup the callbacks on the -Edje and show the Ecore_Evas. -</para> - -<example> -<title>Edje Callbacks</title> -<programlisting> -static void _setup_edje_callbacks(Evas_Object *o) { - edje_object_signal_callback_add(o, "left_click", - "left_click", _left_click_cb, NULL); - edje_object_signal_callback_add(o, "right_click", - "right_click", _right_click_cb, NULL); -} -</programlisting> -</example> -<para> -The program will have two main callbacks attached to the Edje, one for the left click signal and -one for the right click signal. These will be used to switch the direction/alignment of the -container. The second and third parameters of the callbacks need to match the data emitted with the -signal from Edje, this will be seen later when we look at the EDC file. The third parameter is -the function to call, and the last, any data we wish to be passed into the callback. -</para> - -<example> -<title>container_build</title> -<programlisting> -static void container_build(int align, int direction, int fill_policy) { - int len = 0; - int i = 0; - const char *edjefile = NULL; - - container = esmart_container_new(ecore_evas_get(ee)); - evas_object_name_set(container, "the_container"); - esmart_container_direction_set(container, direction); - esmart_container_alignment_set(container, align); - esmart_container_padding_set(container, 1, 1, 1, 1); - esmart_container_spacing_set(container, 1); - esmart_container_fill_policy_set(container, fill_policy); - - evas_object_layer_set(container, 0); - edje_object_part_swallow(edje, "container", container); -</programlisting> -</example> -<para> -The container_build function will create the container and set our data elements in said -container. The creation is easy enough with a call to esmart_container_new giving back the -Evas_Object that is the container. Once the container is created we can set a name on the -container to make reference easier. -</para> - -<para> -Next, we set the direction, which is either (CONTAINER_DIRECTION_VERTICAL or -CONTAINER_DIRECTION_HORIZONTAL) [or in this case, an int being passed from the command -line as the two directions map to 1 and 0 respectively]. The direction tells the container -which way the elements will be drawn. -</para> - -<para> -After the direction we set the alignment of the container. The alignment tells the container -where to draw the elements. The possible values are: CONTAINER_ALIGN_CENTER, CONTAINER_ALIGN_LEFT, -CONTAINER_ALIGN_RIGHT, CONTAINER_ALIGN_TOP and CONTAINER_ALIGN_BOTTOM. With the default -layout, left and right only apply to a vertical container, and top and bottom only apply -to a horizontal container, although center applies to both. -</para> - -<para> -If we wanted to use a different layout scheme then the default, we could place a call to -esmart_container_layout_plugin_set(container, "name") where the name is the name of -the plugin to use. The default setting is the container named "default". -</para> - -<para> -Once the directions and alignment are set, the spacing and padding of the container are -specified. The padding specifes the space around the outside of the container taking four -numeric parameters: left, right, top and bottom. The spacing parameter specifies -the space between elements in the container. -</para> - -<para> -We then continue and set the fill policy of the container. This specifies how the -elements are positioned to fill the space in the container. The possible values are: -CONTAINER_FILL_POLICY_NONE, CONTAINER_FILL_POLICY_KEEP_ASPECT, CONTAINER_FILL_POLICY_FILL_X, -CONTAINER_FILL_POLICY_FILL_Y, CONTAINER_FILL_POLICY_FILL and CONTAINER_FILL_POLICY_HOMOGENOUS. -</para> - -<para> -Once the container is fully specified we set the containers layer, and then swallow the -container into the edje and the part named "container". -</para> - -<example> -<title>Adding Elements to the Container</title> -<programlisting> - len = (sizeof(str_list) / sizeof(str_list[0])); - for(i = 0; i < len; i++) { - Evas_Coord w, h; - Evas_Object *t = edje_object_add(ecore_evas_get(ee)); - - edje_object_file_get(edje, &edjefile, NULL); - if (edje_object_file_set(t, edjefile, "element")) { - edje_object_size_min_get(t, &w, &h); - evas_object_resize(t, (int)w, (int)h); - - if (edje_object_part_exists(t, "element.value")) { - edje_object_part_text_set(t, "element.value", str_list[i]); - evas_object_show(t); - int *i_ptr = (int *)malloc(sizeof(int)); - *i_ptr = (i + 1); - - edje_object_signal_callback_add(t, "item_selected", - "item_selected", _item_selected, i_ptr); - - esmart_container_element_append(container, t); - } else { - printf("Missing element.value part\n"); - evas_object_del(t); - } - } else { - printf("Missing element part\n"); - evas_object_del(t); - } - } - evas_object_show(container); - _set_text(align, direction); -} -</programlisting> -</example> -<para> -Now that we have a container, we can add some elements to be displayed. Each of the -entries in the str_list array defined at the beginning of the program will be added -into the container as a text part. -</para> - -<para> -For each element we create a new Edje object on the Evas. We then need to know the -name of the theme file used to create our main Edje, so we call edje_object_file_get -which will set edjefile to said value. -</para> - -<para> -We then try to set the group named "element" onto the newly created -element. If this fails we print an error and delete the object. -</para> - -<para> -As long as we have found the group "element" we can attempt to grab the part -for our element, "element.value". If this part exists, we set the text -value of the part to our current string and show the part. -</para> - -<para> -A callback is created through edje_object_signal_callback_add and attached to the -new element. This will be called if the "item_selected" signal is sent from the Edje. -The i_ptr value shows how data can be attached to the element, when the user clicks -on an element its number will be printed to the console. -</para> - -<para> -Once the element is created we add it to the container (in this case, appending the -element). -</para> - -<para> -To finish, the container is show and we do some extra work to display information about -the container in the header through the call _show_text. -</para> - -<example> -<title>_set_text</title> -<programlisting> -static void _set_text(int align, int direction) { - Evas_Object *t = edje_object_add(ecore_evas_get(ee)); - const char *edjefile; - - if (direction == CONTAINER_DIRECTION_VERTICAL) - edje_object_part_text_set(edje, "header_text_direction", "vertical"); - else - edje_object_part_text_set(edje, "header_text_direction", "horizontal"); - - if (align == CONTAINER_ALIGN_CENTER) - edje_object_part_text_set(edje, "header_text_align", "center"); - - else if (align == CONTAINER_ALIGN_TOP) - edje_object_part_text_set(edje, "header_text_align", "top"); - - else if (align == CONTAINER_ALIGN_BOTTOM) - edje_object_part_text_set(edje, "header_text_align", "bottom"); - - else if (align == CONTAINER_ALIGN_RIGHT) - edje_object_part_text_set(edje, "header_text_align", "right"); - - else if (align == CONTAINER_ALIGN_LEFT) - edje_object_part_text_set(edje, "header_text_align", "left"); -} -</programlisting> -</example> -<para> -The _set_text routine takes the current direction and alignment of the container and sets -some text in the header of the program. This is just a simple communication with the user -of the current container settings. -</para> - -<example> -<title>_left_click_cb</title> -<programlisting> -static void _left_click_cb(void* data, Evas_Object* o, const char* emmission, - const char* source) { - Container_Direction dir = esmart_container_direction_get(container); - Container_Direction new_dir = (dir + 1) % 2; - Container_Alignment align = esmart_container_alignment_get(container); - - esmart_container_direction_set(container, new_dir); - - if (align != CONTAINER_ALIGN_CENTER) { - if (new_dir == CONTAINER_DIRECTION_HORIZONTAL) - align = CONTAINER_ALIGN_TOP; - else - align = CONTAINER_ALIGN_LEFT; - } - esmart_container_alignment_set(container, align); - _set_text(align, new_dir); -} -</programlisting> -</example> -<para> -When the user clicks the left mouse button on the screen this callback will be executed. We take -the current container direction information and switch to the other direction. (e.g. horizontal -becomes vertical and visa versa.) We also reset the alignment if we are not currently aligned -center to make sure everything is valid for the new direction. The text in the header is -updated to be current. -</para> - -<example> -<title>_right_click_cb</title> -<programlisting> -static void _right_click_cb(void* data, Evas_Object* o, const char* emmission, - const char* source) { - Container_Direction dir = esmart_container_direction_get(container); - Container_Alignment align = esmart_container_alignment_get(container); - - if (dir == CONTAINER_DIRECTION_HORIZONTAL) { - if (align == CONTAINER_ALIGN_TOP) - align = CONTAINER_ALIGN_CENTER; - - else if (align == CONTAINER_ALIGN_CENTER) - align = CONTAINER_ALIGN_BOTTOM; - - else - align = CONTAINER_ALIGN_TOP; - - } else { - if (align == CONTAINER_ALIGN_LEFT) - align = CONTAINER_ALIGN_CENTER; - - else if (align == CONTAINER_ALIGN_CENTER) - align = CONTAINER_ALIGN_RIGHT; - - else - align = CONTAINER_ALIGN_LEFT; - } - esmart_container_alignment_set(container, align); - _set_text(align, esmart_container_direction_get(container)); -} -</programlisting> -</example> -<para> -The right click callback will cycle through the available alignments for a given -direction as the user clicks the right mouse button. -</para> - -<example> -<title>_item_selected</title> -<programlisting> -static void _item_selected(void* data, Evas_Object* o, const char* emmission, - const char* source) { - printf("You clicked on the item with number %d\n", *((int *)data)); -} -</programlisting> -</example> -<para> -Finally the _item_selected callback will be executed when the user middle clicks -on an item in the container. The data will contain the number set for that element -in the create routine above. -</para> - -<para> -Thats the end of the code for the app, next comes the required EDC for everything -to display and function correctly. -</para> - -<example> -<title>The Edc</title> -<programlisting> -fonts { - font: "Vera.ttf" "Vera"; -} - -collections { - group { - name, "container_ex"; - min, 300, 300; - max, 800, 800; - - parts { - part { - name, "bg"; - type, RECT; - mouse_events, 1; - - description { - state, "default" 0.0; - color, 0 0 0 255; - - rel1 { - relative, 0.0 0.1; - offset, 0 0; - } - rel2 { - relative, 1.0 1.0; - offset, 0 0; - } - } - } - - part { - name, "header"; - type, RECT; - mouse_events, 0; - - description { - state, "default" 0.0; - color, 255 255 255 255; - - rel1 { - relative, 0.0 0.0; - offset, 0 0; - } - - rel2 { - relative, 1.0 0.1; - offset, 0 0; - } - } - } - - part { - name, "header_text_direction"; - type, TEXT; - mouse_events, 0; - - description { - state, "default" 0.0; - color, 0 0 0 255; - - rel1 { - relative, 0.0 0.0; - offset, 0 10; - to, "header"; - } - rel2 { - relative, 1.0 1.0; - offset, 0 0; - to, "header"; - } - text { - text, "direction"; - font, "Vera"; - size, 10; - } - } - } - - part { - name, "header_text_align"; - type, TEXT; - mouse_events, 0; - - description { - state, "default" 0.0; - color, 0 0 0 255; - - rel1 { - relative, 0.0 0.0; - offset, 0 0; - to, "header_text_direction"; - } - rel2 { - relative, 1.0 1.0; - offset, 110 0; - to, "header_text_direction"; - } - text { - text, "align"; - font, "Vera"; - size, 10; - } - } - } -</programlisting> -</example> -<para> -This EDC file expects to have the Vera font embedded inside it, as defined by the -font section at the beginning. This means when you compile the edc you either need -the Vera.ttf file in the current directory or give edje_cc the -fd flag and specify -the directory to the font. -</para> - -<para> -After the fonts are defined the main collections are defined. The first collection -is the main portion of the app itself, the "container_ex" group. This group -specifes the main window of the app. As such it contains the parts for the background, -the header, and the header text. These parts are all fairly standard with some (minimal) -alignment done between them. -</para> - -<example> -<title>The Container Part</title> -<programlisting> - part { - name, "container"; - type, RECT; - mouse_events, 1; - - description { - state, "default" 0.0; - visible, 1; - - rel1 { - relative, 0.0 0.0; - offset, 0 0; - to, bg; - } - rel2 { - relative, 1.0 1.0; - offset, 0 0; - to, bg; - } - color, 0 0 0 0; - } - } - } - programs { - program { - name, "left_click"; - signal, "mouse,clicked,1"; - source, "container"; - action, SIGNAL_EMIT "left_click" "left_click"; - } - - program { - name, "right_click"; - signal, "mouse,clicked,3"; - source, "container"; - action, SIGNAL_EMIT "right_click" "right_click"; - } - } - } -</programlisting> -</example> -<para> -The container part is then defined. The part itself is pretty simple, just positioned -relative to the background and set to receive mouse events. After the parts are defined -we specify the programs for this group, of which there are two. The first program -"left_click" specifies what is to happen on a click event of the first mouse button. -</para> - -<para> -The action is to emit a signal, the two parameters after SIGNAL_EMIT match up to the values -put in the callback in the application code. -</para> - -<para> -There is a similar callback for the third mouse button as the first, just emitting a slightly -different signal. -</para> - -<example> -<title>The Element Group</title> -<programlisting> - group { - name, "element"; - min, 80 18; - max, 800 18; - - parts { - part { - name, "element.value"; - type, TEXT; - mouse_events, 1; - effect, NONE; - - description { - state, "default" 0.0; - visible, 1; - - rel1 { - relative, 0.0 0.0; - offset, 0 0; - } - rel2 { - relative, 1.0 1.0; - offset, 0 0; - } - color, 255 255 255 255; - - text { - text, ""; - font, "Vera"; - size, 10; - } - } - } - } - programs { - program { - name, "center_click"; - signal, "mouse,clicked,2"; - source, "element.value"; - action, SIGNAL_EMIT "item_selected" "item_selected"; - } - } - } -} -</programlisting> -</example> -<para> -The element group specifies how each element of the container is to be -displayed. You will notice that the names given here match up to the -names seached for in the application code itself while creating the elements. -</para> - -<para> -There is one program in this group which will emit a signal of "item_selected" -when the middle mouse button is pressed while hovering over one of the -elements in the list. -</para> - -<para> -Thats the end of the EDC code. To compile the app code, a makefile similar to that below -could be used. -</para> - -<example> -<title>Makefile</title> -<programlisting> -CFLAGS = `ecore-config --cflags` `evas-config --cflags` `esmart-config --cflags` -LIBS = `ecore-config --libs` `evas-config --libs` `esmart-config --libs` \ - -lesmart_container - -container_ex: container/container_ex.c - gcc -o container/container_ex container/container_ex.c $(CFLAGS) $(LIBS) -</programlisting> -</example> - -<para> -And to create the EET file, a simple 'edje_cc default.edc' should suffice as long -as the Vera.ttf file is in the current directory. -</para> - -<para> -Thats it, assuming everything goes as planned, you should have a simple app in which -clicking the right/left mouse buttons moves the container to different portions of the window. -While clicking the middle mouse button on elements prints out the number of the element printed. -</para> -</section> - -<!-- -####################################################### ---> +&esmart_trans_intro; +&esmart_container_intro; ... [truncated message content] |
From: <enl...@li...> - 2004-07-02 22:25:48
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/evas Modified Files: evas_key_bindings.xml Log Message: - make the comment make sense =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/evas/evas_key_bindings.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_key_bindings.xml 2 Jul 2004 22:17:45 -0000 1.1 +++ evas_key_bindings.xml 2 Jul 2004 22:25:42 -0000 1.2 @@ -1,9 +1,8 @@ <!-- ####################################################### -A simple recipe on using esmart containers +Setting up key bindings in evas ####################################################### --> - <section> <sectioninfo> <firstname>Norman</firstname> |
From: <enl...@li...> - 2004-07-03 02:38:38
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/ewl Log Message: Directory /cvsroot/enlightenment/e17/docs/cookbook/xml/ewl added to the repository |
From: <enl...@li...> - 2004-07-03 02:39:35
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/ewl Added Files: ewl_intro.xml Log Message: - minor changes to the Ewl introduction text - add an Ewl introduction section |
From: <enl...@li...> - 2004-07-03 02:39:35
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Modified Files: ewl_recipes.xml Log Message: - minor changes to the Ewl introduction text - add an Ewl introduction section =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/ewl_recipes.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- ewl_recipes.xml 2 Jul 2004 22:17:45 -0000 1.2 +++ ewl_recipes.xml 3 Jul 2004 02:39:29 -0000 1.3 @@ -4,9 +4,17 @@ <title>EWL</title> <para> -The Enlightenment Widget Library provides a full blown widget kit similar in feel to -GTK, QT or MOTIF, but based apon the power of the Enlightenment Foundation Libraries. +The Enlightened Widget Library (EWL) is a widget toolkit that builds upon the +foundations constructed by the other libs in the EFL. Ewl uses Evas as its rendering +backend and its appearence is abstracted out for Edje to handle. </para> +<para> +EWL is similar in feel to many of the other toolkits out there including +GTK, QT or MOTIF. The APIs differ by the concepts are the same. +</para> + +&ewl_intro; + </chapter> |
From: <enl...@li...> - 2004-07-03 02:40:05
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook Modified Files: eflcookbook.xml Log Message: - minor changes to the Ewl introduction text - add an Ewl introduction section =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/eflcookbook.xml,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- eflcookbook.xml 2 Jul 2004 22:17:44 -0000 1.4 +++ eflcookbook.xml 3 Jul 2004 02:39:29 -0000 1.5 @@ -25,6 +25,9 @@ <!-- esmart --> <!ENTITY esmart_trans_intro SYSTEM "xml/esmart/esmart_trans_intro.xml"> <!ENTITY esmart_container_intro SYSTEM "xml/esmart/esmart_container_intro.xml"> + + <!-- ewl --> + <!ENTITY ewl_intro SYSTEM "xml/ewl/ewl_intro.xml"> ]> <book> |
From: <enl...@li...> - 2004-07-03 04:05:56
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/evoak Log Message: Directory /cvsroot/enlightenment/e17/docs/cookbook/xml/evoak added to the repository |
From: <enl...@li...> - 2004-07-03 04:07:23
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/evoak Added Files: evoak_hello_eh.xml Log Message: - add a chapter for Evoak to the cookbook - add a very simple introduction, just a simple hello app. |
From: <enl...@li...> - 2004-07-03 04:07:23
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml Added Files: evoak_recipes.xml Log Message: - add a chapter for Evoak to the cookbook - add a very simple introduction, just a simple hello app. |
From: <enl...@li...> - 2004-07-03 04:07:52
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook Modified Files: eflcookbook.xml Log Message: - add a chapter for Evoak to the cookbook - add a very simple introduction, just a simple hello app. =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/eflcookbook.xml,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- eflcookbook.xml 3 Jul 2004 02:39:29 -0000 1.5 +++ eflcookbook.xml 3 Jul 2004 04:07:16 -0000 1.6 @@ -14,6 +14,7 @@ <!ENTITY edje_edc_recipes SYSTEM "xml/edje_edc_recipes.xml"> <!ENTITY edje_recipes SYSTEM "xml/edje_recipes.xml"> <!ENTITY ewl_recipes SYSTEM "xml/ewl_recipes.xml"> + <!ENTITY evoak_recipes SYSTEM "xml/evoak_recipes.xml"> <!-- ecore --> <!ENTITY ecore_config_intro SYSTEM "xml/ecore/ecore_config_intro.xml"> @@ -28,6 +29,9 @@ <!-- ewl --> <!ENTITY ewl_intro SYSTEM "xml/ewl/ewl_intro.xml"> + + <!-- evoak --> + <!ENTITY evoak_hello_eh SYSTEM "xml/evoak/evoak_hello_eh.xml"> ]> <book> @@ -44,6 +48,7 @@ &edje_recipes; &edje_edc_recipes; &ewl_recipes; + &evoak_recipes; </book> |
From: <enl...@li...> - 2004-07-04 18:48:59
|
Enlightenment CVS committal Author : dj2 Project : e17 Module : docs Dir : e17/docs/cookbook/xml/evoak Modified Files: evoak_hello_eh.xml Log Message: - convert the > to > =================================================================== RCS file: /cvsroot/enlightenment/e17/docs/cookbook/xml/evoak/evoak_hello_eh.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evoak_hello_eh.xml 3 Jul 2004 04:07:16 -0000 1.1 +++ evoak_hello_eh.xml 4 Jul 2004 18:43:27 -0000 1.2 @@ -174,7 +174,7 @@ <example> <title>Compilation</title> <screen> -zero@oberon [evoak_intro] -> gcc -o hello_evoak main.c \ +zero@oberon [evoak_intro] -> gcc -o hello_evoak main.c \ `evoak-config --cflags --libs` </screen> </example> |