Enlightenment CVS committal

Author  : werkt
Project : misc
Module  : ewler

Dir     : misc/ewler/src


Modified Files:
        Makefile.am ewler.h file.c form.c inspector.c main.c project.c 
        widget.c 
Added Files:
        callback.c 


Log Message:
Callback manager has been added and several bugs have been fixed.  See TODO for
more information.

===================================================================
RCS file: /cvsroot/enlightenment/misc/ewler/src/Makefile.am,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- Makefile.am 13 Aug 2005 00:10:39 -0000      1.11
+++ Makefile.am 15 Aug 2005 04:49:12 -0000      1.12
@@ -10,6 +10,7 @@
 bin_PROGRAMS = ewler
 
 ewler_SOURCES = \
+       callback.c \
        file.c \
        form.c \
        inspector.c \
===================================================================
RCS file: /cvsroot/enlightenment/misc/ewler/src/ewler.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- ewler.h     13 Aug 2005 00:10:39 -0000      1.6
+++ ewler.h     15 Aug 2005 04:49:12 -0000      1.7
@@ -26,6 +26,11 @@
 
 typedef struct Ewler_Form Ewler_Form;
 
+/* callback.c */
+extern int callbacks_init( void );
+extern void callbacks_update( Ecore_List *selected );
+extern EWL_CALLBACK_DEFN(callbacks_toggle);
+
 /* file.c */
 extern void file_project_save( Ewler_Project *p );
 extern int file_project_open( Ewler_Project *p );
@@ -194,6 +199,8 @@
        char *source;
 
        Ecore_Hash *elems;
+
+       Ecore_List *callbacks[EWL_CALLBACK_MAX];
 };
 
 struct Ewler_Widget_Elem {
===================================================================
RCS file: /cvsroot/enlightenment/misc/ewler/src/file.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- file.c      13 Aug 2005 00:10:39 -0000      1.1
+++ file.c      15 Aug 2005 04:49:12 -0000      1.2
@@ -9,6 +9,37 @@
 #include "ewler.h"
 #include "config.h"
 
+static char *callback_names[] = {
+       "EWL_CALLBACK_EXPOSE", 
+       "EWL_CALLBACK_REALIZE", 
+       "EWL_CALLBACK_UNREALIZE", 
+       "EWL_CALLBACK_SHOW", 
+       "EWL_CALLBACK_HIDE", 
+       "EWL_CALLBACK_DESTROY", 
+       "EWL_CALLBACK_DELETE_WINDOW", 
+       "EWL_CALLBACK_CONFIGURE", 
+       "EWL_CALLBACK_REPARENT", 
+       "EWL_CALLBACK_KEY_DOWN", 
+       "EWL_CALLBACK_KEY_UP", 
+       "EWL_CALLBACK_MOUSE_DOWN", 
+       "EWL_CALLBACK_MOUSE_UP", 
+       "EWL_CALLBACK_MOUSE_MOVE", 
+       "EWL_CALLBACK_MOUSE_WHEEL", 
+       "EWL_CALLBACK_FOCUS_IN", 
+       "EWL_CALLBACK_FOCUS_OUT", 
+       "EWL_CALLBACK_SELECT", 
+       "EWL_CALLBACK_DESELECT", 
+       "EWL_CALLBACK_CLICKED", 
+       "EWL_CALLBACK_DOUBLE_CLICKED", 
+       "EWL_CALLBACK_HILITED", 
+       "EWL_CALLBACK_VALUE_CHANGED", 
+       "EWL_CALLBACK_STATE_CHANGED", 
+       "EWL_CALLBACK_APPEARANCE_CHANGED", 
+       "EWL_CALLBACK_WIDGET_ENABLE", 
+       "EWL_CALLBACK_WIDGET_DISABLE", 
+       "EWL_CALLBACK_PASTE"
+};
+
 void
 file_project_save( Ewler_Project *p )
 {
@@ -491,6 +522,7 @@
                Ecore_List *names, *names_stack;
                char *widget_name;
                char *name;
+               int i;
 
                exml_start(xml);
                exml_tag_set(xml, "widget");
@@ -542,6 +574,22 @@
                ecore_list_destroy(names_stack);
                ecore_list_destroy(elems_stack);
 
+               for( i=0;i<EWL_CALLBACK_MAX;i++ ) {
+                       char *handler;
+
+                       if( !w->callbacks[i] )
+                               continue;
+
+                       ecore_list_goto_first(w->callbacks[i]);
+                       while( (handler = ecore_list_next(w->callbacks[i])) ) {
+                               exml_start(xml);
+                               exml_tag_set(xml, "callback");
+                               exml_attribute_set(xml, "name", 
callback_names[i]);
+                               exml_value_set(xml, handler);
+                               exml_end(xml);
+                       }
+               }
+
                ecore_list_prepend(widget_stack, children);
 
                widget_name = (char *) ewl_widget_name_get(w->w);
@@ -628,8 +676,33 @@
                        ecore_list_prepend(elems_stack, elems);
                        ecore_list_prepend(w_stack, parent);
                        w = widget_new(type);
+                       ewler_w = ewl_widget_data_get(w, "EWLER_WIDGET");
                        ewl_container_child_append(EWL_CONTAINER(parent), w);
-                       ecore_list_append(f->widgets, ewl_widget_data_get(w, 
"EWLER_WIDGET"));
+                       ecore_list_append(f->widgets, ewler_w);
+               } else if( !strcmp(tag, "callback") ) {
+                       int callback;
+                       char *handler;
+                       char *name;
+
+                       name = exml_attribute_get(xml, "name");
+                       handler = exml_value_get(xml);
+
+                       if( name ) {
+                               for( 
callback=0;callback<EWL_CALLBACK_MAX;callback++ )
+                                       if( !strcmp(name, 
callback_names[callback]) )
+                                               break;
+                               
+                               if( callback < EWL_CALLBACK_MAX && handler ) {
+                                       if( !ewler_w->callbacks[callback] ) {
+                                               ewler_w->callbacks[callback] = 
ecore_list_new();
+                                               
ecore_list_set_free_cb(ewler_w->callbacks[callback], free);
+                                       }
+
+                                       
ecore_list_append(ewler_w->callbacks[callback], strdup(handler));
+                               }
+                       }
+
+                       goto next;
                } else if( !strcmp(tag, "attr") ) {
                        char *name;
                        Ewler_Widget_Elem *elem;
@@ -673,6 +746,7 @@
 
                                next = exml_down(xml);
                        } else {
+next:
                                while( !(next = exml_next_nomove(xml)) &&
                                                         elems != 
f->overlay->elems ) {
                                        if( ecore_list_nodes(elems_stack) == 
ecore_list_nodes(w_stack) )
===================================================================
RCS file: /cvsroot/enlightenment/misc/ewler/src/form.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- form.c      13 Aug 2005 00:10:39 -0000      1.22
+++ form.c      15 Aug 2005 04:49:12 -0000      1.23
@@ -84,18 +84,24 @@
 {
        Ewl_Event_Mouse_Down *ev = ev_data;
 
+       if( active_form->menu ) {
+               ewl_widget_destroy(active_form->menu);
+               active_form->menu = NULL;
+       }
+
        switch( ev->button ) {
                case 1:
                        if( !widget_under_cursor &&
                                        !(ev->modifiers & 
(EWL_KEY_MODIFIER_CTRL | EWL_KEY_MODIFIER_SHIFT)) )
                                form_deselect_all();
-                       widget_under_cursor = false;
                        break;
                case 3:
                        if( ecore_list_nodes(active_form->selected) )
                                form_menu(ev->x, ev->y);
                        break;
        }
+
+       widget_under_cursor = false;
 }
 
 void
@@ -127,10 +133,13 @@
 
        active_form = ecore_list_goto_first(forms);
 
-       if( active_form )
+       if( active_form ) {
                inspector_update(active_form->selected);
-       else
+               callbacks_update(active_form->selected);
+       } else {
                inspector_update(NULL);
+               callbacks_update(NULL);
+       }
 }
 
 EWL_CALLBACK_DEFN(form_new)
@@ -373,8 +382,10 @@
                        while( (ewler_w = 
ecore_list_goto_first(form->selected)) )
                                form_destroy(form, ewler_w);
 
-                       if( active_form && active_form->selected )
-                               inspector_update( active_form->selected );
+                       if( active_form && active_form->selected ) {
+                               inspector_update(active_form->selected);
+                               callbacks_update(active_form->selected);
+                       }
                        break;
        }
 
@@ -386,6 +397,8 @@
 {
        ewl_callback_del(w, EWL_CALLBACK_CONFIGURE, form_menu_configure);
        ewl_widget_hide(w);
+
+       ewl_widget_layer_set(EWL_IMENU(w)->base.popup, 1000);
 }
 
 static bool
@@ -534,6 +547,7 @@
                widget_deselect(w);
 
        inspector_update(active_form->selected);
+       callbacks_update(active_form->selected);
 }
 
 void
@@ -546,6 +560,7 @@
        widget_select(w);
 
        inspector_update(active_form->selected);
+       callbacks_update(active_form->selected);
 }
 
 void
@@ -559,6 +574,7 @@
        widget_deselect(w);
 
        inspector_update(active_form->selected);
+       callbacks_update(active_form->selected);
 }
 
 void
@@ -582,6 +598,7 @@
        }
 
        inspector_update(active_form->selected);
+       callbacks_update(active_form->selected);
 }
 
 Ecore_List *
@@ -672,6 +689,7 @@
        form_dirty_set(active_form);
 
        inspector_update(active_form->selected);
+       callbacks_update(active_form->selected);
 }
 
 int
===================================================================
RCS file: /cvsroot/enlightenment/misc/ewler/src/inspector.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- inspector.c 13 Aug 2005 00:10:39 -0000      1.14
+++ inspector.c 15 Aug 2005 04:49:12 -0000      1.15
@@ -265,7 +265,8 @@
 
                row = ewl_tree_row_add(EWL_TREE(tree), EWL_ROW(prow), 
row_items);
                ewl_widget_show(text);
-               ewl_widget_show(entry);
+               if( entry )
+                       ewl_widget_show(entry);
 
                if( elem->spec->type == EWLER_SPEC_ELEM_STRUCT ) {
                        ecore_list_prepend(prow_stack, prow);
===================================================================
RCS file: /cvsroot/enlightenment/misc/ewler/src/main.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- main.c      13 Aug 2005 00:10:39 -0000      1.11
+++ main.c      15 Aug 2005 04:49:12 -0000      1.12
@@ -65,7 +65,8 @@
                        projects_init(argv[1]) < 0 ||
                        forms_init() < 0 ||
                        tools_init() < 0 ||
-                       inspector_init() < 0 )
+                       inspector_init() < 0 ||
+                       callbacks_init() < 0 )
                exit( EXIT_FAILURE );
 
        ewl_main();
===================================================================
RCS file: /cvsroot/enlightenment/misc/ewler/src/project.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- project.c   13 Aug 2005 00:10:39 -0000      1.12
+++ project.c   15 Aug 2005 04:49:12 -0000      1.13
@@ -101,6 +101,7 @@
                                text = ewl_tree_row_column_get(EWL_ROW(row), 0);
                                name = ewl_text_text_get(EWL_TEXT(text));
                                ecore_hash_remove(active_project->files, name);
+                               FREE(name);
                                active_project->dirty = true;
                        }
 
@@ -649,6 +650,11 @@
        ewl_callback_append(item, EWL_CALLBACK_CLICKED, inspector_toggle, NULL);
        ewl_widget_show(item);
 
+       item = ewl_menu_item_new(NULL, "Callbacks");
+       ewl_container_child_append(EWL_CONTAINER(windows_menu), item);
+       ewl_callback_append(item, EWL_CALLBACK_CLICKED, callbacks_toggle, NULL);
+       ewl_widget_show(item);
+
        ewl_widget_show(windows_menu);
 
        ewl_widget_show(menu);
===================================================================
RCS file: /cvsroot/enlightenment/misc/ewler/src/widget.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- widget.c    13 Aug 2005 00:10:39 -0000      1.3
+++ widget.c    15 Aug 2005 04:49:12 -0000      1.4
@@ -120,7 +120,7 @@
        }
 
        ewl_object_current_geometry_get(EWL_OBJECT(ewler_w->w),
-                                                                               
                                                        &x, &y, &height, 
&width);
+                                                                               
                                                        &x, &y, &width, 
&height);
        ewl_object_preferred_inner_size_get(EWL_OBJECT(ewler_w->w), &pref_w, 
&pref_h);
 
        current = ecore_hash_get(ewler_w->elems, "current");
@@ -135,13 +135,13 @@
                        ewl_text_color_apply(EWL_TEXT(elem->text), 255, 0, 0, 
255, len);
                }
 
+               elem->info.ivalue = x;
+
                elem->changed = true;
                if( elem->entry )
                        ewl_text_text_set(EWL_TEXT(elem->entry), 
elem_to_s(elem));
        }
 
-       elem->info.ivalue = x;
-
        elem = ecore_hash_get(current->info.children, "y");
        if( elem->info.ivalue != y ) {
                if( elem->text && !elem->changed ) {
@@ -152,13 +152,13 @@
                        ewl_text_color_apply(EWL_TEXT(elem->text), 255, 0, 0, 
255, len);
                }
 
+               elem->info.ivalue = y;
+
                elem->changed = true;
                if( elem->entry )
                        ewl_text_text_set(EWL_TEXT(elem->entry), 
elem_to_s(elem));
        }
 
-       elem->info.ivalue = y;
-
        elem = ecore_hash_get(current->info.children, "w");
        if( elem->info.ivalue != width ) {
                if( elem->text && !elem->changed ) {
@@ -169,6 +169,8 @@
                        ewl_text_color_apply(EWL_TEXT(elem->text), 255, 0, 0, 
255, len);
                }
 
+               elem->info.ivalue = width;
+
                elem->changed = true;
                if( elem->entry )
                        ewl_text_text_set(EWL_TEXT(elem->entry), 
elem_to_s(elem));
@@ -186,6 +188,8 @@
                        ewl_text_color_apply(EWL_TEXT(elem->text), 255, 0, 0, 
255, len);
                }
 
+               elem->info.ivalue = height;
+
                elem->changed = true;
                if( elem->entry )
                        ewl_text_text_set(EWL_TEXT(elem->entry), 
elem_to_s(elem));
@@ -503,6 +507,7 @@
        Ewler_Widget *ewler_w = user_data;
        Ewl_Embed *embed;
        Ewl_Event_Mouse_Down *ev = ev_data;
+       bool multi;
 
        if( !ewler_w->selectable ||
                        widget_under_cursor )
@@ -520,19 +525,23 @@
        ewler_w->corners.u = CURRENT_X(w) + CURRENT_W(w);
        ewler_w->corners.v = CURRENT_Y(w) + CURRENT_H(w);
 
-       if( ev->button == 1 ) {
-               if( ev->modifiers & (EWL_KEY_MODIFIER_CTRL | 
EWL_KEY_MODIFIER_SHIFT) ) {
-                       form_toggle(ewler_w);
-               } else {
-                       Ecore_List *selected;
+       if( ev->modifiers & (EWL_KEY_MODIFIER_CTRL | EWL_KEY_MODIFIER_SHIFT) )
+               multi = true;
+       else
+               multi = false;
 
-                       selected = form_selected();
-                       if( selected &&
-                                       (ecore_list_nodes(selected) != 1 ||
-                                        ecore_list_goto_first(selected) != 
ewler_w) ) {
-                               form_deselect_all();
-                               form_select(ewler_w);
-                       }
+       if( ev->button == 1 && multi ) {
+               form_toggle(ewler_w);
+       } else if( ev->button == 1 ||
+                                                (!multi && 
!ecore_list_nodes(form_selected())) ) {
+               Ecore_List *selected;
+
+               selected = form_selected();
+               if( selected &&
+                               (ecore_list_nodes(selected) != 1 ||
+                                ecore_list_goto_first(selected) != ewler_w) ) {
+                       form_deselect_all();
+                       form_select(ewler_w);
                }
        }
 
@@ -563,6 +572,7 @@
 static EWL_CALLBACK_DEFN(widget_destroy)
 {
        Ewler_Widget *ewler_w;
+       int i;
 
        ewler_w = user_data;
        if( !ewler_w )
@@ -576,6 +586,10 @@
 
        ecore_hash_destroy(ewler_w->elems);
 
+       for( i=0;i<EWL_CALLBACK_MAX;i++ )
+               if( ewler_w->callbacks[i] )
+                       ecore_list_destroy(ewler_w->callbacks[i]);
+
        FREE(ewler_w);
 }
 




-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to