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