Enlightenment CVS committal Author : ningerso Project : e17 Module : libs/ewl
Dir : e17/libs/ewl/src/bin/tests/widget Modified Files: ewl_widget.c Log Message: Add tutorial for widget creation. =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/bin/tests/widget/ewl_widget.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ewl_widget.c 4 Jan 2007 07:49:23 -0000 1.3 +++ ewl_widget.c 7 Jan 2007 04:51:27 -0000 1.4 @@ -5,6 +5,104 @@ #include <string.h> #include <stdlib.h> +/** + * @addtogroup Ewl_Widget + * @section widget_tut Tutorial + * + * Small as small can be + * (originally at http://everburning.com/news/small-as-small-can-be) + * + * Whats the minimum amount of work you need to do to create your own EWL + * widget? Just want something you can build on but dont know where to start? + * + * Well, hopefully this should give you the base for starting your widget. + * Assuming youre creating a widget called My_Widget, the EWL convention is to + * have a my_widget.c and my_widget.h files. There are only a couple things you + * need to implement to get a working widget. + * + * First, my_widget.h. + * + * @code + * #ifndef MY_WIDGET_H + * #define MY_WIDGET_H + * + * #include <Ewl.h> + * + * #define MY_WIDGET(w) ((My_Widget *)w) + * #define MY_WIDGET_TYPE "my_widget" + * + * typedef struct My_Widget My_Widget; + * struct My_Widget + * { + * Ewl_Widget widget; + * }; + * + * Ewl_Widget *my_widget_new(void); + * int my_widget_init(My_Widget *w); + * + * #endif + * @endcode + * + * That wasnt so bad. What have we got? Well, the MY_WIDGET(w) define gives us a + * simple macro to cast other widgets to our widget. The second define, + * MY_WIDGET_TYPE, is a simple macro containing the type name of the widget. + * Well use that a bit later (and in any type checking we add to our widget.) + * + * We then create the widget structure. In this case were inheriting from + * Ewl_Widget so its the first item in our struct (and not a pointer, thats + * important). This is how EWLs inhertiance works. The widget youre inheriting + * from is the first item in the struct and not a pointer. You will now be able + * to call any of the methods of the inherited class on the new class. + * + * We then declare two methods. The convention in EWL is that the _new() + * function always takes no parameters (void). There is also always a _init() + * function that takes the widget as its only parameter and returns an int, if + * the initialization succeeded or failed. + * + * With that out of the way, lets take a look at my_widget.c. + * + * @code + * #include "my_widget.h" + * + * Ewl_Widget * + * my_widget_new(void) + * { + * Ewl_Widget *w; + * + * w = calloc(1, sizeof(My_Widget))); + * if (!w) return NULL; + * + * if (!my_widget_init(MY_WIDGET(w))) + * { + * free(w); + * return NULL; + * } + * return w; + * } + * + * int + * my_widget_init(My_Widget *w) + * { + * if (!ewl_widget_init(EWL_WIDGET(w))) + * return 0; + * + * ewl_widget_appearance_set(EWL_WIDGET(w), MY_WIDGET_TYPE); + * ewl_widget_inherit(EWL_WIDGET(w), MY_WIDGET_TYPE); + * + * return 1; + * } + * @endcode + * + * Thats pretty simple. We create a new widget, initialize it and thats about + * it. In my_widget_init() we make sure we call ewl_widget_init() as thats the + * widget we are inheriting from and we then set our inheritance and appearance + * strings (notice the use of our type define from earlier). + * + * With that youve got a simple widget. It doesnt do much, but it exists. Build + * on as you will. + * + */ + static int create_test(Ewl_Container *box); static void ewl_widget_cb_toggle(Ewl_Widget *w, void *ev, void *data); static void ewl_widget_cb_first_click(Ewl_Widget *w, void *ev, void *data); ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs