Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        E.h Makefile.am config.c edge.c icccm.c iconify.c menus-misc.c 
        menus.c pager.c 
Added Files:
        menus.h 


Log Message:
Menus: Delay sub-menu closing, link menus in stead of using global array, split 
off menus.h, cleanups.
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v
retrieving revision 1.489
retrieving revision 1.490
diff -u -3 -r1.489 -r1.490
--- E.h 4 Sep 2005 12:43:12 -0000       1.489
+++ E.h 10 Sep 2005 18:24:20 -0000      1.490
@@ -326,9 +326,6 @@
  */
 
 typedef struct _ewin EWin;
-typedef struct _menu Menu;
-typedef struct _menuitem MenuItem;
-typedef struct _menustyle MenuStyle;
 typedef struct _dialog Dialog;
 typedef struct _ditem DItem;
 typedef struct _snapshot Snapshot;
@@ -1547,48 +1544,6 @@
 char              **StrlistDecodeEscaped(const char *str, int *pnum);
 char              **StrlistFromString(const char *str, int delim, int *num);
 
-/* menus.c */
-int                 MenuStyleConfigLoad(FILE * fs);
-
-Menu               *MenuCreate(const char *name, const char *title,
-                              Menu * parent, MenuStyle * ms);
-void                MenuDestroy(Menu * m);
-void                MenuHide(Menu * m);
-void                MenuEmpty(Menu * m);
-void                MenuRepack(Menu * m);
-MenuItem           *MenuItemCreate(const char *text, ImageClass * ic,
-                                  const char *action_params, Menu * child);
-void                MenuSetName(Menu * m, const char *name);
-void                MenuSetStyle(Menu * m, MenuStyle * ms);
-void                MenuSetTitle(Menu * m, const char *title);
-void                MenuSetData(Menu * m, char *data);
-void                MenuSetTimestamp(Menu * m, time_t t);
-const char         *MenuGetName(const Menu * m);
-const char         *MenuGetData(const Menu * m);
-time_t              MenuGetTimestamp(const Menu * m);
-int                 MenuIsNotEmpty(const Menu * m);
-void                MenuAddItem(Menu * m, MenuItem * mi);
-void                ShowInternalMenu(Menu ** pm, MenuStyle ** pms,
-                                    const char *style,
-                                    Menu * (mcf) (const char *name,
-                                                  MenuStyle * ms));
-
-int                 MenusActive(void);
-
-/* menus-misc.c */
-Menu               *MenuCreateFromDirectory(const char *name, Menu * parent,
-                                           MenuStyle * ms, const char *dir);
-Menu               *MenuCreateFromFlatFile(const char *name, Menu * parent,
-                                          MenuStyle * ms, const char *file);
-Menu               *MenuCreateFromGnome(const char *name, Menu * parent,
-                                       MenuStyle * ms, const char *dir);
-Menu               *MenuCreateFromAllEWins(const char *name, MenuStyle * ms);
-Menu               *MenuCreateFromDesktopEWins(const char *name, MenuStyle * 
ms,
-                                              int desk);
-Menu               *MenuCreateFromDesktops(const char *name, MenuStyle * ms);
-Menu               *MenuCreateFromThemes(const char *name, MenuStyle * ms);
-Menu               *MenuCreateFromBorders(const char *name, MenuStyle * ms);
-
 /* misc.c */
 void                Quicksort(void **a, int l, int r,
                              int (*CompareFunc) (void *d1, void *d2));
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/Makefile.am,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -3 -r1.54 -r1.55
--- Makefile.am 4 Sep 2005 07:27:17 -0000       1.54
+++ Makefile.am 10 Sep 2005 18:24:20 -0000      1.55
@@ -75,6 +75,7 @@
        main.c                  \
        memory.c                \
        menus.c                 \
+       menus.h                 \
        menus-misc.c            \
        misc.c                  \
        mod-misc.c              \
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/config.c,v
retrieving revision 1.137
retrieving revision 1.138
diff -u -3 -r1.137 -r1.138
--- config.c    21 Aug 2005 21:00:54 -0000      1.137
+++ config.c    10 Sep 2005 18:24:20 -0000      1.138
@@ -24,6 +24,7 @@
 #include "E.h"
 #include "buttons.h"
 #include "conf.h"
+#include "menus.h"
 #include "tooltips.h"
 #include <ctype.h>
 
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/edge.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- edge.c      4 Sep 2005 07:27:18 -0000       1.21
+++ edge.c      10 Sep 2005 18:24:20 -0000      1.22
@@ -24,6 +24,7 @@
 #include "E.h"
 #include "desktops.h"
 #include "ewins.h"
+#include "menus.h"             /* FIXME - Should not be here */
 #include "xwin.h"
 
 /* FIXME: Screen resizing not handled. */
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/icccm.c,v
retrieving revision 1.109
retrieving revision 1.110
diff -u -3 -r1.109 -r1.110
--- icccm.c     4 Sep 2005 07:27:19 -0000       1.109
+++ icccm.c     10 Sep 2005 18:24:20 -0000      1.110
@@ -283,9 +283,6 @@
        return;
      }
 
-   if (MenusActive())
-      return;
-
    ICCCM_GetColormap(ewin);
 
    if (EwinIsInternal(ewin))
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/iconify.c,v
retrieving revision 1.175
retrieving revision 1.176
diff -u -3 -r1.175 -r1.176
--- iconify.c   4 Sep 2005 07:27:19 -0000       1.175
+++ iconify.c   10 Sep 2005 18:24:20 -0000      1.176
@@ -27,6 +27,7 @@
 #include "emodule.h"
 #include "ewins.h"
 #include "icons.h"
+#include "menus.h"
 #include "tooltips.h"
 #include "xwin.h"
 #include <math.h>
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/menus-misc.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- menus-misc.c        4 Sep 2005 07:27:20 -0000       1.18
+++ menus-misc.c        10 Sep 2005 18:24:20 -0000      1.19
@@ -25,6 +25,7 @@
 #include "conf.h"
 #include "desktops.h"
 #include "ewins.h"
+#include "menus.h"
 #include "xwin.h"
 #include <errno.h>
 #include <sys/stat.h>
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/menus.c,v
retrieving revision 1.211
retrieving revision 1.212
diff -u -3 -r1.211 -r1.212
--- menus.c     21 Aug 2005 13:21:48 -0000      1.211
+++ menus.c     10 Sep 2005 18:24:20 -0000      1.212
@@ -24,6 +24,7 @@
 #include "E.h"
 #include "emodule.h"
 #include "ewins.h"
+#include "menus.h"
 #include "tooltips.h"
 #include "xwin.h"
 #include <X11/keysym.h>
@@ -32,12 +33,11 @@
 
 struct
 {
+   Menu               *first;
+   Menu               *active;
    EWin               *context_ewin;
-   int                 current_depth;
-   Menu               *list[256];
-   char                clicked;
-   char                just_shown;
    EObj               *cover_win;
+   char                just_shown;
 } Mode_menus;
 
 struct _menustyle
@@ -90,6 +90,7 @@
    char                internal;       /* Don't destroy when reloading */
    char                redraw;
    Menu               *parent;
+   Menu               *child;
    MenuItem           *sel_item;
    time_t              last_change;
    void               *data;
@@ -104,7 +105,8 @@
 static void         MenuRedraw(Menu * m);
 static void         MenuRealize(Menu * m);
 static void         MenuActivateItem(Menu * m, MenuItem * mi);
-static void         MenuDrawItem(Menu * m, MenuItem * mi, char shape);
+static void         MenuDrawItem(Menu * m, MenuItem * mi, char shape,
+                                int state);
 
 static void         MenuHandleEvents(XEvent * ev, void *m);
 static void         MenuItemHandleEvents(XEvent * ev, void *mi);
@@ -112,15 +114,44 @@
 
 static void         MenusHide(void);
 
-static Menu        *active_menu = NULL;
-static MenuItem    *active_item = NULL;
+static MenuItem    *
+MenuFindItemByChild(Menu * m, Menu * mc)
+{
+   int                 i;
+
+   if (!mc)
+      return (m->num) ? m->items[0] : NULL;
+
+   for (i = 0; i < m->num; i++)
+     {
+       if (mc == m->items[i]->child)
+          return m->items[i];
+     }
+
+   return NULL;
+}
+
+static void
+MenuHideChildren(Menu * m)
+{
+   if (!m->child)
+      return;
+
+   MenuHide(m->child);
+   m->child = NULL;
+}
 
 void
 MenuHide(Menu * m)
 {
    EWin               *ewin;
 
-   MenuActivateItem(m, NULL);
+   if (!m)
+      return;
+
+   if (m->sel_item)
+      MenuDrawItem(m, m->sel_item, 1, STATE_NORMAL);
+   m->sel_item = NULL;
 
    ewin = m->ewin;
    if (ewin)
@@ -133,6 +164,8 @@
 
    m->stuck = 0;
    m->shown = 0;
+   m->parent = NULL;
+   MenuHideChildren(m);
 }
 
 static void
@@ -153,11 +186,10 @@
 static void
 MenuEwinClose(EWin * ewin)
 {
-   if ((Menu *) (ewin->data) == active_menu)
+   if ((Menu *) (ewin->data) == Mode_menus.active)
      {
        GrabKeyboardRelease();
-       active_menu = NULL;
-       active_item = NULL;
+       Mode_menus.active = NULL;
      }
 
    ewin->data = NULL;
@@ -312,7 +344,7 @@
    Mode_menus.just_shown = 1;
 
    m->shown = 1;
-   if (Mode_menus.current_depth == 0)
+   if (!Mode_menus.first)
      {
        Mode_menus.context_ewin = GetContextEwin();
 #if 0
@@ -320,11 +352,8 @@
                EwinGetName(Mode_menus.context_ewin));
 #endif
        ESync();
-#if 1                          /* ??? */
-       Mode_menus.list[0] = m;
-       Mode_menus.current_depth = 1;
+       Mode_menus.first = m;
        MenuShowMasker(m);
-#endif
        TooltipsEnable(0);
        GrabKeyboardSet(m->win);
      }
@@ -816,21 +845,23 @@
        EShapeCombineMask(m->win, ShapeBounding, 0, 0, m->pmm.mask, ShapeSet);
        EClearWindow(m->win);
        for (i = 0; i < m->num; i++)
-          MenuDrawItem(m, m->items[i], 0);
+          MenuDrawItem(m, m->items[i], 0, -1);
      }
    else
      {
        for (i = 0; i < m->num; i++)
-          MenuDrawItem(m, m->items[i], 0);
+          MenuDrawItem(m, m->items[i], 0, -1);
        EShapePropagate(m->win);
      }
 }
 
 static void
-MenuDrawItem(Menu * m, MenuItem * mi, char shape)
+MenuDrawItem(Menu * m, MenuItem * mi, char shape, int state)
 {
    PmapMask           *mi_pmm;
 
+   if (state >= 0)
+      mi->state = state;
    mi_pmm = &(mi->pmm[(int)(mi->state)]);
 
    if (!mi_pmm->pmap)
@@ -889,17 +920,6 @@
 
    if ((shape) && (m->style->use_item_bg))
       EShapePropagate(m->win);
-
-   if (mi->state == STATE_HILITED)
-     {
-       active_item = mi;
-       if (active_menu != m)
-         {
-            active_menu = m;
-            GrabKeyboardRelease();
-            GrabKeyboardSet(m->win);
-         }
-     }
 }
 
 static void
@@ -1065,33 +1085,18 @@
 int
 MenusActive(void)
 {
-   return Mode_menus.current_depth;
+   return Mode_menus.first != NULL;
 }
 
 static void
 MenusHide(void)
 {
-   int                 i;
-
-   while (RemoveTimerEvent("SUBMENU_SHOW"))
-      ;
+   RemoveTimerEvent("SUBMENU_SHOW");
 
-   for (i = 0; i < Mode_menus.current_depth; i++)
-     {
-       if (!Mode_menus.list[i]->stuck)
-          MenuHide(Mode_menus.list[i]);
-     }
+   MenuHide(Mode_menus.first);
+   Mode_menus.first = NULL;
    MenuHideMasker();
-   Mode_menus.current_depth = 0;
-   Mode_menus.clicked = 0;
    TooltipsEnable(1);
-
-#if 0
-   /* If all done properly this shouldn't be necessary... */
-   GrabKeyboardRelease();
-   active_menu = NULL;
-   active_item = NULL;
-#endif
 }
 
 /*
@@ -1121,23 +1126,6 @@
    return NULL;
 }
 
-static MenuItem    *
-MenuFindParentItem(Menu * m)
-{
-   int                 i;
-   Menu               *mp;
-
-   mp = m->parent;
-   if (mp == NULL)
-      return NULL;
-
-   for (i = 0; i < mp->num; i++)
-      if (mp->items[i]->child == m)
-        return mp->items[i];
-
-   return NULL;
-}
-
 static              KeySym
 MenuKeyPressConversion(KeySym key)
 {
@@ -1167,10 +1155,10 @@
    EWin               *ewin;
 
    mi = NULL;
-   if (active_menu)
+   if (Mode_menus.active)
      {
-       m = active_menu;
-       mi = active_item;
+       m = Mode_menus.active;
+       mi = m->sel_item;
      }
 
    /* NB! m != NULL */
@@ -1181,17 +1169,23 @@
      case XK_Escape:
        MenusHide();
        break;
+
      case XK_Down:
       check_next:
        mi = MenuFindNextItem(m, mi, 1);
        goto check_activate;
+
      case XK_Up:
        mi = MenuFindNextItem(m, mi, -1);
        goto check_activate;
+
      case XK_Left:
-       mi = MenuFindParentItem(m);
        m = m->parent;
-       goto check_menu;
+       if (!m)
+          break;
+       mi = m->sel_item;
+       goto check_activate;
+
      case XK_Right:
        if (mi == NULL)
           goto check_next;
@@ -1201,19 +1195,15 @@
        ewin = m->ewin;
        if (ewin == NULL || !EwinIsMapped(ewin))
           break;
-       mi = m->items[0];
-       goto check_menu;
-      check_menu:
-       if (!m)
-          break;
+       mi = MenuFindItemByChild(m, m->child);
        goto check_activate;
+
       check_activate:
        if (!mi)
           break;
-       if (active_menu && active_item && active_menu != m)
-          MenuActivateItem(active_menu, NULL);
        MenuActivateItem(m, mi);
        break;
+
      case XK_Return:
        if (!mi)
           break;
@@ -1230,47 +1220,11 @@
 MenuItemEventMouseDown(MenuItem * mi, XEvent * ev __UNUSED__)
 {
    Menu               *m;
-   EWin               *ewin;
 
    Mode_menus.just_shown = 0;
 
    m = mi->menu;
-   mi->state = STATE_CLICKED;
-   MenuDrawItem(m, mi, 1);
-
-   if (mi->child && mi->child->shown == 0)
-     {
-       int                 mx, my, mw, mh;
-       EWin               *ewin2;
-
-       ewin = m->ewin;
-       if (ewin)
-         {
-            EGetGeometry(mi->win, NULL, &mx, &my, &mw, &mh, NULL, NULL);
-#if 1                          /* Whatgoesonhere ??? */
-            MenuShow(mi->child, 1);
-            ewin2 = mi->child->ewin;
-            if (ewin2)
-              {
-                 EwinMove(ewin2,
-                          EoGetX(ewin) + ewin->border->border.left + mx + mw,
-                          EoGetY(ewin) + ewin->border->border.top + my -
-                          ewin2->border->border.top);
-                 RaiseEwin(ewin2);
-                 ShowEwin(ewin2);
-                 if (Conf.menus.animate)
-                    EwinUnShade(ewin2);
-                 Mode_menus.list[Mode_menus.current_depth++] = mi->child;
-              }
-#else
-            ewin2 = mi->child->ewin;
-            if (!ewin2)
-               MenuShow(mi->child, 1);
-#endif
-         }
-     }
-
-   return;
+   MenuDrawItem(m, mi, 1, STATE_CLICKED);
 }
 
 static void
@@ -1288,8 +1242,7 @@
 
    if ((m) && (mi->state))
      {
-       mi->state = STATE_HILITED;
-       MenuDrawItem(m, mi, 1);
+       MenuDrawItem(m, mi, 1, STATE_HILITED);
        if ((mi->params) /* && (!Mode_menus.just_shown) */ )
          {
             MenusHide();
@@ -1475,21 +1428,54 @@
 static void
 MenusSetEvents(int on)
 {
-   int                 i, j;
+   int                 i;
    Menu               *m;
    long                event_mask;
 
    event_mask = (on) ? MENU_ITEM_EVENT_MASK : 0;
 
-   for (i = 0; i < Mode_menus.current_depth; i++)
+   for (m = Mode_menus.first; m; m = m->child)
      {
-       m = Mode_menus.list[i];
-       if (!m)
-          continue;
+       for (i = 0; i < m->num; i++)
+          ESelectInput(m->items[i]->win, event_mask);
+     }
+}
 
-       for (j = 0; j < m->num; j++)
-          ESelectInput(m->items[j]->win, event_mask);
+static void
+MenuSelectItem(Menu * m, MenuItem * mi, int focus)
+{
+   if (mi && focus)
+     {
+       if (Mode_menus.active != m)
+         {
+            Mode_menus.active = m;
+            GrabKeyboardRelease();
+            GrabKeyboardSet(m->win);
+         }
      }
+
+   if (mi == m->sel_item)
+      return;
+
+   if (m->sel_item)
+      MenuDrawItem(m, m->sel_item, 1, STATE_NORMAL);
+
+   if (mi)
+      MenuDrawItem(m, mi, 1, STATE_HILITED);
+
+   m->sel_item = mi;
+}
+
+static void
+MenuSelectItemByChild(Menu * m, Menu * mc)
+{
+   MenuItem           *mi;
+
+   mi = MenuFindItemByChild(m, mc);
+   if (!mi)
+      return;
+
+   MenuSelectItem(m, mi, 0);
 }
 
 static void
@@ -1515,6 +1501,16 @@
       return;
 
    mi = data->mi;
+   if (!mi)
+      return;
+
+   if (mi->child != m->child)
+      MenuHide(m->child);
+   m->child = mi->child;
+   if (!mi->child)
+      return;
+
+   mi->child->parent = m;
    MenuShow(mi->child, 1);
    ewin2 = mi->child->ewin;
    if (!ewin2 || !EwinFindByPtr(ewin2))
@@ -1532,11 +1528,8 @@
 
    if (Conf.menus.onscreen)
      {
-       EWin               *menus[256];
-       int                 fx[256];
-       int                 fy[256];
-       int                 tx[256];
-       int                 ty[256];
+       EWin               *menus[256], *etmp;
+       int                 fx[256], fy[256], tx[256], ty[256];
        int                 i, ww, hh;
        int                 xdist = 0, ydist = 0;
 
@@ -1553,27 +1546,23 @@
 
        if ((xdist != 0) || (ydist != 0))
          {
-            for (i = 0; i < Mode_menus.current_depth; i++)
+            i = 0;
+            for (m = Mode_menus.first; m; m = m->child)
               {
-                 menus[i] = NULL;
-                 if (Mode_menus.list[i])
-                   {
-                      ewin = Mode_menus.list[i]->ewin;
-                      if (ewin)
-                        {
-                           menus[i] = ewin;
-                           fx[i] = EoGetX(ewin);
-                           fy[i] = EoGetY(ewin);
-                           tx[i] = EoGetX(ewin) + xdist;
-                           ty[i] = EoGetY(ewin) + ydist;
-                        }
-                   }
+                 etmp = m->ewin;
+                 if (!etmp || etmp == ewin2)
+                    break;
+                 menus[i] = etmp;
+                 fx[i] = EoGetX(etmp);
+                 fy[i] = EoGetY(etmp);
+                 tx[i] = EoGetX(etmp) + xdist;
+                 ty[i] = EoGetY(etmp) + ydist;
+                 i++;
               }
 
             /* Disable menu item events while sliding */
             MenusSetEvents(0);
-            SlideEwinsTo(menus, fx, fy, tx, ty, Mode_menus.current_depth,
-                         Conf.shadespeed);
+            SlideEwinsTo(menus, fx, fy, tx, ty, i, Conf.shadespeed);
             MenusSetEvents(1);
 
             if (Conf.menus.warp)
@@ -1590,61 +1579,35 @@
 
    if (Conf.menus.animate)
       EwinUnShade(ewin2);
-
-   if (Mode_menus.list[Mode_menus.current_depth - 1] != mi->child)
-      Mode_menus.list[Mode_menus.current_depth++] = mi->child;
 }
 
 static void
 MenuActivateItem(Menu * m, MenuItem * mi)
 {
    static struct _mdata mdata;
-   int                 i, j;
+   MenuItem           *mi_prev;
 
-   if (m->sel_item)
-     {
-       m->sel_item->state = STATE_NORMAL;
-       MenuDrawItem(m, m->sel_item, 1);
-     }
+   mi_prev = m->sel_item;
 
-   m->sel_item = mi;
+   if (m->child)
+      MenuSelectItem(m->child, NULL, 0);
+   MenuSelectItem(m, mi, 1);
+   if (m->parent)
+      MenuSelectItemByChild(m->parent, m);
 
-   if (mi == NULL)
+   if (mi == mi_prev)
       return;
 
-   mi->state = STATE_HILITED;
-   MenuDrawItem(m, mi, 1);
+   if (mi && !mi->child && mi_prev && !mi_prev->child)
+      return;
 
    RemoveTimerEvent("SUBMENU_SHOW");
 
-   for (i = 0; i < Mode_menus.current_depth; i++)
+   if ((mi && mi->child && !mi->child->shown) || (mi && mi->child != m->child))
      {
-       if (Mode_menus.list[i] == m)
-         {
-            if ((!mi->child) ||
-                ((mi->child) && (Mode_menus.list[i + 1] != mi->child)))
-              {
-                 for (j = i + 1; j < Mode_menus.current_depth; j++)
-                    MenuHide(Mode_menus.list[j]);
-                 Mode_menus.current_depth = i + 1;
-                 i = Mode_menus.current_depth;
-                 break;
-              }
-         }
-     }
-
-   if ((mi->child) && (!mi->child->shown) && MenusActive())
-     {
-       EWin               *ewin;
-
-       mi->child->parent = m;
-       ewin = m->ewin;
-       if (ewin)
-         {
-            mdata.m = m;
-            mdata.mi = mi;
-            DoIn("SUBMENU_SHOW", 0.2, SubmenuShowTimeout, 0, &mdata);
-         }
+       mdata.m = m;
+       mdata.mi = mi;
+       DoIn("SUBMENU_SHOW", 0.2, SubmenuShowTimeout, 0, &mdata);
      }
 }
 
@@ -1663,7 +1626,8 @@
    if (ev->xcrossing.detail == NotifyInferior)
       return;
 
-   MenuActivateItem(mi->menu, NULL);
+   if (!mi->child)
+      MenuSelectItem(mi->menu, NULL, 0);
 }
 
 static void
@@ -2080,8 +2044,7 @@
 
    if (!p || cmd[0] == '?')
      {
-       IpcPrintf("Menus - depth=%d, clicked=%d\n",
-                 Mode_menus.current_depth, Mode_menus.clicked);
+       IpcPrintf("Menus - active=%d\n", MenusActive());
      }
    else if (!strncmp(cmd, "list", 2))
      {
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/pager.c,v
retrieving revision 1.176
retrieving revision 1.177
diff -u -3 -r1.176 -r1.177
--- pager.c     4 Sep 2005 07:27:20 -0000       1.176
+++ pager.c     10 Sep 2005 18:24:20 -0000      1.177
@@ -26,6 +26,7 @@
 #include "emodule.h"
 #include "ewins.h"
 #include "hiwin.h"
+#include "menus.h"
 #include "tooltips.h"
 #include "xwin.h"
 




-------------------------------------------------------
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