Enlightenment CVS committal

Author  : dj2
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_embed.c ewl_embed.h ewl_enums.h ewl_widget.c ewl_widget.h 


Log Message:
- move some globals from ewl_widget.c into the ewl_embed struct
- cleanup naming along the way
- flush out a bit more of the api for handling tab order

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_embed.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- ewl_embed.c 2 Oct 2005 06:23:48 -0000       1.9
+++ ewl_embed.c 14 Oct 2005 03:18:18 -0000      1.10
@@ -3,13 +3,8 @@
 #include "ewl_macros.h"
 #include "ewl_private.h"
 
-extern Ewl_Widget     *last_selected;
-extern Ewl_Widget     *last_key;
-extern Ewl_Widget     *last_focused;
-extern Ewl_Widget     *dnd_widget;
-
-Ecore_List       *ewl_embed_list = NULL;
-Evas_Smart       *embedded_smart = NULL;
+Ecore_List        *ewl_embed_list = NULL;
+static Evas_Smart *embedded_smart = NULL;
 
 static void ewl_embed_smart_add_cb(Evas_Object *obj);
 static void ewl_embed_smart_del_cb(Evas_Object *obj);
@@ -112,7 +107,7 @@
 
        ecore_list_append(ewl_embed_list, w);
 
-       w->tab_order = ecore_list_new();
+       w->tab_order = ecore_dlist_new();
        w->obj_cache = ecore_hash_new(ecore_str_hash, ecore_str_compare);
 
        DRETURN_INT(TRUE, DLEVEL_STABLE);
@@ -262,19 +257,18 @@
         * If a widget has been selected then we send the keystroke to the
         * appropriate widget.
         */
-       if (!last_key || !ewl_container_parent_of(EWL_WIDGET(embed),
-                               last_key)) {
-               if (last_selected)
-                       last_key = last_selected;
+       if (!embed->last.focused) {
+               if (embed->last.clicked)
+                       embed->last.focused = embed->last.clicked;
                else
-                       last_key = EWL_WIDGET(embed);
+                       embed->last.focused = EWL_WIDGET(embed);
        }
 
        /*
         * Dispatcher of key down events, these get sent to the last widget
         * selected, and every parent above it.
         */
-       temp = last_key;
+       temp = embed->last.focused;
        while (temp) {
                if (!(ewl_object_state_has(EWL_OBJECT(temp),
                                        EWL_FLAG_STATE_DISABLED)))
@@ -312,7 +306,7 @@
         * Dispatcher of key up events, these get sent to the last widget
         * selected, and every parent above it.
         */
-       temp = last_key;
+       temp = embed->last.focused;
        while (temp) {
                if (!(ewl_object_state_has(EWL_OBJECT(temp),
                                        EWL_FLAG_STATE_DISABLED)))
@@ -359,8 +353,8 @@
         * to triggering the callback to avoid funkiness if the callback
         * causes the widget to be destroyed.
         */
-       deselect = last_selected;
-       last_key = last_selected = widget;
+       deselect = embed->last.clicked;
+       embed->last.focused = embed->last.clicked = widget;
 
        ev.modifiers = mods;
        ev.x = x;
@@ -444,7 +438,7 @@
         * When the mouse is released the widget no longer has a pressed state,
         * the widget and its parents are notified in this change of state.
         */
-       temp = last_selected;
+       temp = embed->last.clicked;
        while (temp) {
                if (!(ewl_object_state_has(EWL_OBJECT(temp),
                                EWL_FLAG_STATE_DISABLED))) {
@@ -454,7 +448,6 @@
                                        EWL_CALLBACK_MOUSE_UP, &ev);
 
                }
-
                temp = temp->parent;
        }
 
@@ -487,8 +480,9 @@
         * Focus a new widget if the mouse isn't pressed on the currently
         * focused widget.
         */
-       if (!last_focused || !ewl_object_state_has(EWL_OBJECT(last_focused), 
EWL_FLAG_STATE_PRESSED)) {
-
+       if (!embed->last.mouse_in 
+                       || 
!ewl_object_state_has(EWL_OBJECT(embed->last.mouse_in), 
+                                                EWL_FLAG_STATE_PRESSED)) {
                widget = 
ewl_container_child_at_recursive_get(EWL_CONTAINER(embed),
                                x, y);
                if (!widget)
@@ -500,59 +494,56 @@
                 * Defocus all widgets up to the level of a shared parent of
                 * old and newly focused widgets.
                 */
-               while (last_focused && (widget != last_focused) &&
-                               !ewl_container_parent_of(last_focused, widget)) 
{
-                       ewl_object_state_remove(EWL_OBJECT(last_focused),
+               while (embed->last.mouse_in && (widget != embed->last.mouse_in) 
+                               && 
!ewl_container_parent_of(embed->last.mouse_in, widget)) {
+                       
ewl_object_state_remove(EWL_OBJECT(embed->last.mouse_in),
                                        EWL_FLAG_STATE_HILITED);
-                       ewl_callback_call(last_focused, EWL_CALLBACK_FOCUS_OUT);
-                       last_focused = last_focused->parent;
+                       ewl_callback_call(embed->last.mouse_in, 
EWL_CALLBACK_FOCUS_OUT);
+                       embed->last.mouse_in = embed->last.mouse_in->parent;
                }
-
-       }
-       else {
-               widget = last_focused;
        }
+       else 
+               widget = embed->last.mouse_in;
 
        /*
         * Pass out the movement event up the chain, allows parents to
         * react to mouse movement in their children.
         */
-       last_focused = widget;
-       while (last_focused) {
-
-               if (!(ewl_object_state_has(EWL_OBJECT(last_focused),
+       embed->last.mouse_in = widget;
+       while (embed->last.mouse_in) {
+               if (!(ewl_object_state_has(EWL_OBJECT(embed->last.mouse_in),
                                        EWL_FLAG_STATE_DISABLED))) {
 
                        /*
                         * First mouse move event in a widget marks it focused.
                         */
-                       if (!(ewl_object_state_has(EWL_OBJECT(last_focused),
+                       if 
(!(ewl_object_state_has(EWL_OBJECT(embed->last.mouse_in),
                                                EWL_FLAG_STATE_HILITED))) {
-                               ewl_object_state_add(EWL_OBJECT(last_focused),
+                               
ewl_object_state_add(EWL_OBJECT(embed->last.mouse_in),
                                                EWL_FLAG_STATE_HILITED);
-                               ewl_callback_call_with_event_data(last_focused,
+                               
ewl_callback_call_with_event_data(embed->last.mouse_in,
                                                EWL_CALLBACK_FOCUS_IN, &ev);
                        }
 
-                       ewl_callback_call_with_event_data(last_focused,
+                       ewl_callback_call_with_event_data(embed->last.mouse_in,
                                        EWL_CALLBACK_MOUSE_MOVE, &ev);
                }
-               last_focused = last_focused->parent;
+               embed->last.mouse_in = embed->last.mouse_in->parent;
        }
 
-       last_focused = widget;
+       embed->last.mouse_in = widget;
 
-       if (dnd_widget && ewl_object_state_has(EWL_OBJECT(dnd_widget),
+       if (embed->dnd_widget && 
ewl_object_state_has(EWL_OBJECT(embed->dnd_widget),
                                EWL_FLAG_STATE_DND))
-               ewl_callback_call_with_event_data(dnd_widget,
+               ewl_callback_call_with_event_data(embed->dnd_widget,
                                                  EWL_CALLBACK_MOUSE_MOVE, &ev);
+       else
+               embed->dnd_widget = NULL;
 
-       if (last_selected && ewl_object_state_has(EWL_OBJECT(last_selected),
+       if (embed->last.clicked && 
ewl_object_state_has(EWL_OBJECT(embed->last.clicked),
                                EWL_FLAG_STATE_PRESSED))
-               ewl_callback_call_with_event_data(last_selected,
+               ewl_callback_call_with_event_data(embed->last.clicked,
                                                  EWL_CALLBACK_MOUSE_MOVE, &ev);
-       else
-               dnd_widget = NULL;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -576,10 +567,10 @@
        ev.x = x;
        ev.y = y;
 
-       while (last_focused) {
-               ewl_callback_call_with_event_data(last_focused,
+       while (embed->last.mouse_in) {
+               ewl_callback_call_with_event_data(embed->last.mouse_in,
                                                  EWL_CALLBACK_FOCUS_OUT, &ev);
-               last_focused = last_focused->parent;
+               embed->last.mouse_in = embed->last.mouse_in->parent;
        }
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
@@ -608,7 +599,7 @@
        ev.z = z;
        ev.dir = dir;
 
-       w = last_focused;
+       w = embed->last.mouse_in;
        if (!w) {
                ewl_callback_call_with_event_data(EWL_WIDGET(embed),
                                                  EWL_CALLBACK_MOUSE_WHEEL,
@@ -743,24 +734,142 @@
 }
 
 /**
- * @param e: the embed that holds widgets to change tab order
+ * @param e: the embed that holds widgets 
  * @param w: the widget that will be moved to the front of the tab order list
  * @return Returns no value.
  * @brief Moves the widget @a w to the front of the tab order list.
  */
-void ewl_embed_tab_order_push(Ewl_Embed *e, Ewl_Widget *w)
+void ewl_embed_tab_order_prepend(Ewl_Embed *e, Ewl_Widget *w)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("e", e);
        DCHECK_PARAM_PTR("w", w);
 
+       ewl_embed_tab_order_insert(e, w, 0);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param e: The embed that holds the widgets
+ * @param w: The widget to be append to the tab order
+ * @return Returns no value.
+ * @brief Moves the widget @a w to the end of the tab order
+ */
+void ewl_embed_tab_order_append(Ewl_Embed *e, Ewl_Widget *w)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("e", e);
+       DCHECK_PARAM_PTR("w", w);
+
+       ewl_embed_tab_order_insert(e, w, ecore_list_nodes(e->tab_order));
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param e: The embed that holds the widgets
+ * @param w: The widget to insert into the tab order
+ * @param idx: The index to insert into
+ * @return Returns no value.
+ * @brief Moves the given widget @a w to the position @a idx
+ */
+void ewl_embed_tab_order_insert(Ewl_Embed *e, Ewl_Widget *w, unsigned int idx)
+{
+       int current_idx = 0;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("e", e);
+       DCHECK_PARAM_PTR("w", w);
+
        if (!ewl_container_parent_of(EWL_WIDGET(e), w))
                DRETURN(DLEVEL_STABLE);
 
-       if (ecore_list_goto(e->tab_order, w))
-               ecore_list_remove(e->tab_order);
+       current_idx = ecore_dlist_index(e->tab_order);
+
+       /* make sure this widget isn't already in the list */
+       if (ecore_dlist_goto(e->tab_order, w)) {
+               int del_idx;
+
+               /* if this widget was before or at our current focused
+                * widget then we need to decrement our counter */
+               del_idx = ecore_dlist_index(e->tab_order);
+               if (del_idx <= current_idx) current_idx --;
+
+               ecore_dlist_remove(e->tab_order);
+       }
+       
+       ecore_dlist_goto_index(e->tab_order, idx);
+       ecore_dlist_insert(e->tab_order, w);
+
+       /* if we inserted before or at our currently focused item then we
+        * need to advance our current item to the correct spot */
+       if (current_idx <= idx) current_idx ++;
+       ecore_dlist_goto_index(e->tab_order, current_idx);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param e: The embed to insert the widget into the tab order
+ * @param w: The widget ot insert into the tab order
+ * @param after: The widget to insert after
+ * @return Returns no value.
+ * @brief Inserts the @a w widget into the tab order after the @a after widget
+ */
+void ewl_embed_tab_order_insert_after(Ewl_Embed *e, Ewl_Widget *w, 
+                                       Ewl_Widget *after)
+{
+       int cur_idx, idx;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("e", e);
+       DCHECK_PARAM_PTR("w", w);
+       DCHECK_PARAM_PTR("after", after);
+
+       cur_idx = ecore_dlist_index(e->tab_order);
+       if (!ecore_dlist_goto(e->tab_order, after))
+       {
+               ewl_embed_tab_order_append(e, w);
+               DRETURN(DLEVEL_STABLE);
+       }
+
+       idx = ecore_dlist_index(e->tab_order);
+       ecore_dlist_goto_index(e->tab_order, cur_idx);
 
-       ecore_list_prepend(e->tab_order, w);
+       ewl_embed_tab_order_insert(e, w, idx + 1);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param e: The embed to insert the widget into the tab order
+ * @param w: The widget ot insert into the tab order
+ * @param before: The widget to insert after
+ * @return Returns no value.
+ * @brief Inserts the @a w widget into the tab order before the @a before 
widget
+ */
+void ewl_embed_tab_order_insert_before(Ewl_Embed *e, Ewl_Widget *w, 
+                                       Ewl_Widget *before)
+{
+       int cur_idx, idx;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("e", e);
+       DCHECK_PARAM_PTR("w", w);
+       DCHECK_PARAM_PTR("before", before);
+
+       cur_idx = ecore_dlist_index(e->tab_order);
+       if (!ecore_dlist_goto(e->tab_order, before))
+       {
+               ewl_embed_tab_order_prepend(e, w);
+               DRETURN(DLEVEL_STABLE);
+       }
+
+       idx = ecore_dlist_index(e->tab_order);
+       ecore_dlist_goto_index(e->tab_order, cur_idx);
+
+       ewl_embed_tab_order_insert(e, w, idx);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -777,8 +886,8 @@
        DCHECK_PARAM_PTR("e", e);
        DCHECK_PARAM_PTR("w", w);
 
-       if (ecore_list_goto(e->tab_order, w))
-               ecore_list_remove(e->tab_order);
+       if (ecore_dlist_goto(e->tab_order, w))
+               ecore_dlist_remove(e->tab_order);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -795,13 +904,87 @@
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("e", e);
 
-       if (!(w = ecore_list_next(e->tab_order))) {
-               ecore_list_goto_first(e->tab_order);
-               w = ecore_list_next(e->tab_order);
-       }
+       if (!(w = ecore_dlist_next(e->tab_order)))
+               ecore_dlist_goto_first(e->tab_order);
+
+       w = ecore_dlist_current(e->tab_order);
+       if (w) ewl_widget_focus_send(w);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param e: the embed to change focus of it's contained widgets
+ * @return Returns no value.
+ * @brief Changes focus to the next widget in the circular tab order list.
+ */
+void ewl_embed_tab_order_previous(Ewl_Embed *e)
+{
+       Ewl_Widget *w;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("e", e);
+
+       if (!(w = ecore_dlist_previous(e->tab_order)))
+               ecore_dlist_goto_last(e->tab_order);
+
+       w = ecore_dlist_current(e->tab_order);
+       if (w) ewl_widget_focus_send(w);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param embed: The embed to set the focused widget too
+ * @param w: The widget to set as having focus
+ * @return Returns no value.
+ */
+void ewl_embed_focused_widget_set(Ewl_Embed *embed, Ewl_Widget *w)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("embed", embed);
+       DCHECK_PARAM_PTR("w", w);
+
+       embed->last.focused = w;
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param embed: The embed to get the curerntly focused widget
+ * @return Returns the currently focused widget
+ */
+Ewl_Widget *ewl_embed_focused_widget_get(Ewl_Embed *embed)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+
+       DRETURN_PTR(embed->last.focused, DLEVEL_STABLE);
+}
+
+/**
+ * @param e: The embed to cleanup
+ * @param w: The wiget to check while cleaning up
+ * @return Returns no value.
+ * @brief This will check to see if the given widget is one of the last
+ * selected, clicked, mouse_in or the drag-n-drop widget and if so, set them
+ * to NULL
+ */
+void ewl_embed_info_widgets_cleanup(Ewl_Embed *e, Ewl_Widget *w)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("e", e);
+
+       if (w == e->last.focused)
+               e->last.focused = NULL;
+
+       if (w == e->last.clicked)
+               e->last.clicked = NULL;
+
+       if (w == e->last.mouse_in)
+               e->last.mouse_in = NULL;
 
-       if (w)
-               ewl_widget_focus_send(w);
+       if (w == e->dnd_widget)
+               e->dnd_widget = NULL;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -961,7 +1144,7 @@
        ecore_hash_destroy(emb->obj_cache);
        emb->obj_cache = NULL;
 
-       ecore_list_destroy(emb->tab_order);
+       ecore_dlist_destroy(emb->tab_order);
        emb->tab_order = NULL;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_embed.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- ewl_embed.h 27 Sep 2005 04:40:09 -0000      1.3
+++ ewl_embed.h 14 Oct 2005 03:18:19 -0000      1.4
@@ -52,12 +52,21 @@
 
        Evas_Object    *smart;       /**< Manipulate Ewl_Embed from evas */
        Evas_Object    *ev_clip;     /**< Clip box to receive evas events */
-       Ecore_List     *tab_order;   /**< Order of widgets to send focus */
+       Ecore_DList     *tab_order;   /**< Order of widgets to send focus */
 
        Ecore_Hash     *obj_cache;  /**< Hash of object queues for reuse */
 
        int             max_layer;   /**< The maximum widget layer used */
        int             focus;       /**< Indicates if it receives focus */
+
+       struct
+       {
+               Ewl_Widget *clicked;
+               Ewl_Widget *focused;
+               Ewl_Widget *mouse_in;
+       } last;
+
+       Ewl_Widget *dnd_widget;
 };
 
 Ewl_Widget     *ewl_embed_new(void);
@@ -91,9 +100,22 @@
 void            ewl_embed_object_cache(Ewl_Embed *e, Evas_Object *obj);
 Evas_Object    *ewl_embed_object_request(Ewl_Embed *e, char *type);
 
-void            ewl_embed_tab_order_next(Ewl_Embed *e);
+void            ewl_embed_tab_order_append(Ewl_Embed *e, Ewl_Widget *w);
+void           ewl_embed_tab_order_prepend(Ewl_Embed *e, Ewl_Widget *w);
+void           ewl_embed_tab_order_insert(Ewl_Embed *e, Ewl_Widget *w, 
+                                          unsigned int idx);
+void           ewl_embed_tab_order_insert_before(Ewl_Embed *e, Ewl_Widget *w,
+                                                Ewl_Widget *before);
+void           ewl_embed_tab_order_insert_after(Ewl_Embed *e, Ewl_Widget *w,
+                                                Ewl_Widget *after);
 void            ewl_embed_tab_order_remove(Ewl_Embed *e, Ewl_Widget *w);
-void            ewl_embed_tab_order_push(Ewl_Embed *e, Ewl_Widget *w);
+void            ewl_embed_tab_order_next(Ewl_Embed *e);
+void           ewl_embed_tab_order_previous(Ewl_Embed *e);
+
+void           ewl_embed_focused_widget_set(Ewl_Embed *e, Ewl_Widget *w);
+Ewl_Widget     *ewl_embed_focused_widget_get(Ewl_Embed *e);
+void           ewl_embed_info_widgets_cleanup(Ewl_Embed *e, Ewl_Widget *w);
+
 void            ewl_embed_coord_to_screen(Ewl_Embed *e, int xx, int yy,
                                          int *x, int *y);
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_enums.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- ewl_enums.h 10 Oct 2005 15:27:10 -0000      1.14
+++ ewl_enums.h 14 Oct 2005 03:18:19 -0000      1.15
@@ -146,7 +146,9 @@
        EWL_FLAG_STATE_PRESSED = 0x400000,
        EWL_FLAG_STATE_SELECTED = 0x8000000,
        EWL_FLAG_STATE_DND = 0x1000000,
-       EWL_FLAG_STATE_DISABLED = 0x2000000
+       EWL_FLAG_STATE_DISABLED = 0x2000000,
+
+       EWL_FLAG_STOP_TAB_FOCUS_CHANGE = 0x4000000 
 };
 
 #define EWL_FLAG_FILL_NORMAL (EWL_FLAG_FILL_FILL)
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_widget.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- ewl_widget.c        13 Oct 2005 19:50:17 -0000      1.22
+++ ewl_widget.c        14 Oct 2005 03:18:19 -0000      1.23
@@ -3,11 +3,6 @@
 #include "ewl_macros.h"
 #include "ewl_private.h"
 
-Ewl_Widget *last_selected = NULL;
-Ewl_Widget *last_key = NULL;
-Ewl_Widget *last_focused = NULL;
-Ewl_Widget *dnd_widget = NULL;
-
 static Ecore_Hash *ewl_widget_name_table = NULL;
 
 static void ewl_widget_theme_padding_get(Ewl_Widget *w, int *l, int *r,
@@ -308,6 +303,8 @@
  */
 void ewl_widget_hide(Ewl_Widget * w)
 {
+       Ewl_Embed *emb;
+
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
 
@@ -317,17 +314,8 @@
        if (HIDDEN(w))
                DRETURN(DLEVEL_STABLE);
 
-       /*
-        * These are only applicable to visible widgets.
-        */
-       if (w == last_selected)
-               last_selected = NULL;
-       if (w == last_key)
-               last_key = NULL;
-       if (w == last_focused)
-               last_focused = NULL;
-       if (w == dnd_widget)
-               dnd_widget = NULL;
+       emb = ewl_embed_widget_find(w);
+       ewl_embed_info_widgets_cleanup(emb, w);
 
        ewl_object_visible_remove(EWL_OBJECT(w), EWL_FLAG_VISIBLE_SHOWN);
 
@@ -788,20 +776,101 @@
  * @return Returns no value.
  * @brief Changes the order in the embed so @a w receives focus first on tab.
  *
+ * This moves the widget @a w to the end of the tab order list in the embed
+ * that holds it. 
+ */
+void ewl_widget_tab_order_append(Ewl_Widget *w)
+{
+       Ewl_Embed *emb;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("w", w);
+
+       emb = ewl_embed_widget_find(w);
+       ewl_embed_tab_order_append(emb, w);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param w: the widget to be moved to the front of the focus list
+ * @return Returns no value.
+ * @brief Changes the order in the embed so @a w receives focus first on tab.
+ *
  * This moves the widget @a w to the front of the tab order list in the embed
- * that holds it. This is the recommended method for manipulating tab order,
- * The embed versions should only be accessed internally if you understand
- * their ramifications.
+ * that holds it. 
+ */
+void ewl_widget_tab_order_prepend(Ewl_Widget *w)
+{
+       Ewl_Embed *emb;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("w", w);
+
+       emb = ewl_embed_widget_find(w);
+       ewl_embed_tab_order_prepend(emb, w);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param w: the widget to be moved to the front of the focus list
+ * @return Returns no value.
+ * @brief Changes the order in the embed so @a w receives focus first on tab.
+ *
+ * This moves the widget @a w to the given index in the tab order list in the 
embed
+ * that holds it. 
+ */
+void ewl_widget_tab_order_insert(Ewl_Widget *w, unsigned int idx)
+{
+       Ewl_Embed *emb;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("w", w);
+
+       emb = ewl_embed_widget_find(w);
+       ewl_embed_tab_order_insert(emb, w, idx);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param w: The widget to be inserted into the tab order
+ * @param before: The widget we are to be inserted before
+ * @return Returns no value.
+ * @brief Inserts the widget into the tab order before the @a before widget
  */
-void ewl_widget_tab_order_push(Ewl_Widget *w)
+void ewl_widget_tab_order_insert_before(Ewl_Widget *w, Ewl_Widget *before)
 {
-       Ewl_Embed *e;
+       Ewl_Embed *emb;
 
+       DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
+       DCHECK_PARAM_PTR("before", before);
+
+       emb = ewl_embed_widget_find(w);
+       ewl_embed_tab_order_insert_before(emb, w, before);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param w: The widget to insert into the tab order
+ * @param after: The widget to insert after
+ * @return Returns no value.
+ * @brief Insert the given widget into the tab order after the @a after
+ * widget
+ */
+void ewl_widget_tab_order_insert_after(Ewl_Widget *w, Ewl_Widget *after)
+{
+       Ewl_Embed *emb;
+
        DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("w", w);
+       DCHECK_PARAM_PTR("after", after);
 
-       e = ewl_embed_widget_find(w);
-       ewl_embed_tab_order_push(EWL_EMBED(e), w);
+       emb = ewl_embed_widget_find(w);
+       ewl_embed_tab_order_insert_after(emb, w, after);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -1006,9 +1075,12 @@
  */
 void ewl_widget_focus_send(Ewl_Widget *w)
 {
+       Ewl_Embed *emb;
+
        DENTER_FUNCTION(DLEVEL_STABLE);
 
-       last_key = w;
+       emb = ewl_embed_widget_find(w);
+       ewl_embed_focused_widget_set(emb, w);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -1017,11 +1089,17 @@
  * @return Returns the currnetly focused widget.
  * @brief Retrieve the currently focused widget.
  */
-Ewl_Widget *ewl_widget_focused_get()
+Ewl_Widget *ewl_widget_focused_get(void)
 {
+       Ewl_Embed *emb;
+       Ewl_Widget *w = NULL;
+
        DENTER_FUNCTION(DLEVEL_STABLE);
 
-       DRETURN_PTR(last_key, DLEVEL_STABLE);
+       emb = ewl_embed_widget_find(w);
+       w = ewl_embed_focused_widget_get(emb);
+
+       DRETURN_PTR(w, DLEVEL_STABLE);
 }
 
 /**
@@ -1174,6 +1252,7 @@
                                        void *user_data __UNUSED__)
 {
        Ewl_Container *pc;
+       Ewl_Embed *emb;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
@@ -1196,20 +1275,8 @@
        if (pc)
                ewl_container_child_hide_call(pc, w);
 
-       /*
-        * Cleanup a variety of references to that can be held.
-        */
-       if (last_selected == w)
-               last_selected = NULL;
-
-       if (last_key == w)
-               last_key = NULL;
-
-       if (last_focused == w)
-               last_focused = NULL;
-
-       if (dnd_widget == w)
-               dnd_widget = NULL;
+       emb = ewl_embed_widget_find(w);
+       ewl_embed_info_widgets_cleanup(emb, w);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_widget.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- ewl_widget.h        3 Oct 2005 06:43:07 -0000       1.15
+++ ewl_widget.h        14 Oct 2005 03:18:19 -0000      1.16
@@ -222,8 +222,15 @@
 unsigned int    ewl_widget_clipped_is(Ewl_Widget *w);
 
 void            ewl_widget_focus_send(Ewl_Widget *w);
+
 Ewl_Widget     *ewl_widget_focused_get(void);
-void            ewl_widget_tab_order_push(Ewl_Widget *w);
+
+void            ewl_widget_tab_order_append(Ewl_Widget *w);
+void            ewl_widget_tab_order_prepend(Ewl_Widget *w);
+void            ewl_widget_tab_order_insert(Ewl_Widget *w, unsigned int idx);
+void           ewl_widget_tab_order_insert_before(Ewl_Widget *w, Ewl_Widget 
*before);
+void           ewl_widget_tab_order_insert_after(Ewl_Widget *w, Ewl_Widget 
*after);
+void           ewl_widget_tab_order_remove(Ewl_Widget *w);
 
 void            ewl_widget_color_set(Ewl_Widget *w, int r, int g, 
                                                int b, int a);




-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to