Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: E.h config.c desktops.c ewins.h ipc.c menus-misc.c menus.c menus.h theme.c Log Message: Defer menu loading. Unload 5 min after last use. =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v retrieving revision 1.493 retrieving revision 1.494 diff -u -3 -r1.493 -r1.494 --- E.h 23 Sep 2005 16:12:13 -0000 1.493 +++ E.h 25 Sep 2005 00:50:52 -0000 1.494 @@ -1472,6 +1472,7 @@ void __PRINTF__ IpcPrintf(const char *fmt, ...); int HandleIPC(const char *params, Client * c); int EFunc(EWin * ewin, const char *params); +void EFuncDefer(EWin * ewin, const char *params); /* lang.c */ void LangInit(void); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/config.c,v retrieving revision 1.138 retrieving revision 1.139 diff -u -3 -r1.138 -r1.139 --- config.c 10 Sep 2005 18:24:20 -0000 1.138 +++ config.c 25 Sep 2005 00:50:52 -0000 1.139 @@ -198,7 +198,6 @@ static int ConfigFilePreparse(const char *path, const char *dest) { - static char have_epp = 0; char execline[FILEPATH_LEN_MAX]; const char *epp_path = ENLIGHTENMENT_BIN "/epp"; char *def_home, *def_user, *def_shell; @@ -206,17 +205,6 @@ if (EventDebug(EDBUG_TYPE_CONFIG)) Eprintf("ConfigFilePreparse %s->%s\n", path, dest); - if ((!have_epp) && (!(isfile(epp_path)) && (canexec(epp_path)))) - { - Alert(_("Help! Cannot find epp!\n" - "Enlightenment is looking for epp here:\n" "%s\n" - "This is a FATAL ERROR.\n" - "This is probably due to either the program not existing or\n" - "it not being able to be executed by you.\n"), epp_path); - SessionExit(EEXIT_ERROR, NULL); - } - have_epp = 1; - def_home = homedir(getuid()); def_user = username(getuid()); def_shell = usershell(getuid()); @@ -409,7 +397,7 @@ lang = Mode.locale.lang; if (!localized || !lang) { - if (isfile(s)) + if (isfile(s) && canread(s)) /* FIXME - Only one stat */ return Estrdup(s); else return NULL; @@ -432,7 +420,7 @@ continue; *p[i] = '\0'; - if (isfile(s)) + if (isfile(s) && canread(s)) /* FIXME - Only one stat */ return Estrdup(s); } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/desktops.c,v retrieving revision 1.182 retrieving revision 1.183 diff -u -3 -r1.182 -r1.183 --- desktops.c 18 Sep 2005 06:35:37 -0000 1.182 +++ desktops.c 25 Sep 2005 00:50:52 -0000 1.183 @@ -104,7 +104,7 @@ a = ActionCreate(EVENT_MOUSE_DOWN, 0, 0, 0, 2, 0, NULL, NULL); ActionclassAddAction(ac, a); - ActionAddTo(a, "menus show taskmenu"); + ActionAddTo(a, "menus show windowlist"); if (dsk->num > 0) { =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ewins.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- ewins.h 23 Sep 2005 16:12:13 -0000 1.14 +++ ewins.h 25 Sep 2005 00:50:52 -0000 1.15 @@ -215,6 +215,8 @@ #define EWIN_TYPE_ICONBOX 0x04 #define EWIN_TYPE_PAGER 0x08 +#define EwinGetDesk(ewin) EoGetDesk(ewin) + #define EwinIsMapped(ewin) (ewin->state.state >= EWIN_STATE_MAPPED) #define EwinIsInternal(ewin) (ewin->type != EWIN_TYPE_NORMAL) #define EwinIsTransientChild(ewin) (ewin->icccm.transient > 0) =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ipc.c,v retrieving revision 1.237 retrieving revision 1.238 diff -u -3 -r1.237 -r1.238 --- ipc.c 23 Sep 2005 16:12:13 -0000 1.237 +++ ipc.c 25 Sep 2005 00:50:52 -0000 1.238 @@ -1576,6 +1576,39 @@ return err; } +static void +doEFuncDeferred(int val __UNUSED__, void *data) +{ + void **prm = (void **)data; + EWin *ewin; + + ewin = prm[0]; + if (ewin && !EwinFindByPtr(ewin)) + return; + + EFunc(ewin, prm[1]); + + Efree(prm[1]); + Efree(data); +} + +void +EFuncDefer(EWin * ewin, const char *cmd) +{ + static int seqn = 0; + char s[32]; + void **prm; + + prm = Emalloc(2 * sizeof(void *)); + if (!prm) + return; + prm[0] = ewin; + prm[1] = Estrdup(cmd); + + Esnprintf(s, sizeof(s), "EFunc-%d", seqn++); + DoIn(s, 0.0, doEFuncDeferred, 0, prm); +} + static int ipccmp(void *p1, void *p2) { =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/menus-misc.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- menus-misc.c 10 Sep 2005 18:24:20 -0000 1.19 +++ menus-misc.c 25 Sep 2005 00:50:52 -0000 1.20 @@ -30,6 +30,11 @@ #include <errno.h> #include <sys/stat.h> +static Menu *MenuCreateFromFlatFile(const char *name, Menu * parent, + MenuStyle * ms, const char *file); +static Menu *MenuCreateFromDirectory(const char *name, Menu * parent, + MenuStyle * ms, const char *dir); + static MenuItem * MenuItemCreateFromBackground(const char *bgid, const char *file) { @@ -51,13 +56,13 @@ return mi; } -Menu * -MenuCreateFromDirectory(const char *name, Menu * parent, MenuStyle * ms, - const char *dir) +static int +MenuLoadFromDirectory(Menu * m) { Progressbar *p = NULL; - Menu *m, *mm; + Menu *mm; int i, num; + const char *dir; char **list, s[4096], ss[4096], cs[4096]; const char *ext; MenuItem *mi; @@ -65,8 +70,15 @@ const char *chmap = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; FILE *f; + time_t lastmod; - m = MenuCreate(name, NULL, parent, ms); + dir = MenuGetData(m); + lastmod = moddate(dir); + if (lastmod <= MenuGetTimestamp(m)) + return 0; + MenuSetTimestamp(m, lastmod); + + MenuEmpty(m, 0); if (stat(dir, &st) >= 0) { @@ -122,15 +134,16 @@ char tmp[4096]; word(s, 2, tmp); - Esnprintf(s, sizeof(s), "%s/%s:%s", dir, tmp, name); + Esnprintf(s, sizeof(s), "%s/%s:%s", dir, tmp, + MenuGetName(m)); Esnprintf(ss, sizeof(ss), "%s/%s", dir, tmp); - mm = MenuCreateFromDirectory(s, m, ms, ss); + mm = MenuCreateFromDirectory(s, m, NULL, ss); mi = MenuItemCreate(tmp, NULL, NULL, mm); MenuAddItem(m, mi); } } fclose(f); - return m; + return 1; } } @@ -156,8 +169,8 @@ ext = FileExtension(ss); if (S_ISDIR(st.st_mode)) { - Esnprintf(s, sizeof(s), "%s/%s:%s", dir, list[i], name); - mm = MenuCreateFromDirectory(s, m, ms, ss); + Esnprintf(s, sizeof(s), "%s/%s:%s", dir, list[i], MenuGetName(m)); + mm = MenuCreateFromDirectory(s, m, NULL, ss); mi = MenuItemCreate(list[i], NULL, NULL, mm); MenuAddItem(m, mi); if (f) @@ -229,6 +242,26 @@ if (list) StrlistFree(list, num); + return 1; +} + +static Menu * +MenuCreateFromDirectory(const char *name, Menu * parent, MenuStyle * ms, + const char *dir) +{ + static int calls = 0; + Menu *m; + + if (calls > 32) + return NULL; + calls++; + + m = MenuCreate(name, NULL, parent, ms); + MenuSetData(m, Estrdup(dir)); + MenuSetLoader(m, MenuLoadFromDirectory); + + calls--; + return m; } @@ -238,6 +271,7 @@ FILE *f; char first = 1; char s[4096]; + int count; f = fopen(file, "r"); if (!f) @@ -247,6 +281,7 @@ return; } + count = 0; while (fgets(s, 4096, f)) { s[strlen(s) - 1] = 0; @@ -272,7 +307,6 @@ MenuItem *mi; ImageClass *icc = NULL; Menu *mm; - static int count = 0; txt = field(s, 0); icon = field(s, 1); @@ -300,8 +334,7 @@ } else if ((act) && (!strcmp(act, "menu")) && (params)) { - Esnprintf(wd, sizeof(wd), "__FM.%s.%i", name, count); - count++; + Esnprintf(wd, sizeof(wd), "__FM.%s.%i", name, count++); mm = MenuCreateFromFlatFile(wd, m, NULL, params); if (mm) { @@ -328,53 +361,30 @@ fclose(f); } -static void -FileMenuUpdate(int val __UNUSED__, void *data) +static int +MenuLoadFromFlatFile(Menu * m) { - Menu *m; - time_t lastmod; - char s[4096]; const char *ff; - - m = (Menu *) data; - if (!m) - return; - - if (!FindItem(m, 0, LIST_FINDBY_POINTER, LIST_TYPE_MENU)) - return; - - /* if the menu is up dont update */ - if (MenusActive()) - goto done; + time_t lastmod; ff = MenuGetData(m); - if (!exists(ff)) - { - MenuHide(m); - MenuEmpty(m); - return; - } - lastmod = moddate(ff); - if (lastmod > MenuGetTimestamp(m)) - { - MenuSetTimestamp(m, lastmod); - MenuEmpty(m); - FillFlatFileMenu(m, MenuGetName(m), ff); - MenuRepack(m); - } + if (lastmod <= MenuGetTimestamp(m)) + return 0; + MenuSetTimestamp(m, lastmod); - done: - Esnprintf(s, sizeof(s), "__.%s", MenuGetName(m)); - DoIn(s, 5.0, FileMenuUpdate, 0, m); + MenuEmpty(m, 0); + FillFlatFileMenu(m, MenuGetName(m), ff); + + return 1; } -Menu * +static Menu * MenuCreateFromFlatFile(const char *name, Menu * parent, MenuStyle * ms, const char *file) { Menu *m = NULL; - char s[4096], *ff; + char *ff; static int calls = 0; if (calls > 32) @@ -385,17 +395,9 @@ if (!ff) goto done; - if (canread(ff)) - { - m = MenuCreate(name, NULL, parent, ms); - MenuSetTimestamp(m, moddate(ff)); - FillFlatFileMenu(m, MenuGetName(m), ff); - MenuSetData(m, ff); - Esnprintf(s, sizeof(s), "__.%s", MenuGetName(m)); - DoIn(s, 5.0, FileMenuUpdate, 0, m); - goto done; - } - Efree(ff); + m = MenuCreate(name, NULL, parent, ms); + MenuSetData(m, ff); + MenuSetLoader(m, MenuLoadFromFlatFile); done: calls--; @@ -403,7 +405,7 @@ return m; } -Menu * +static Menu * MenuCreateFromGnome(const char *name, Menu * parent, MenuStyle * ms, const char *dir) { @@ -520,23 +522,23 @@ return m; } -Menu * -MenuCreateFromThemes(const char *name, MenuStyle * ms) +static int +MenuLoadFromThemes(Menu * m) { - Menu *m; char **lst; int i, num; char ss[4096], *s; - MenuItem *mi; - m = MenuCreate(name, NULL, NULL, ms); + if (MenuGetTimestamp(m)) + return 0; + MenuSetTimestamp(m, 1); lst = ThemesList(&num); for (i = 0; i < num; i++) { s = fullfileof(lst[i]); - Esnprintf(ss, sizeof(ss), "themes use %s", s); + Esnprintf(ss, sizeof(ss), "theme use %s", s); mi = MenuItemCreate(s, NULL, ss, NULL); Efree(s); MenuAddItem(m, mi); @@ -544,6 +546,19 @@ if (lst) StrlistFree(lst, i); + return 1; +} + +static Menu * +MenuCreateFromThemes(const char *name, MenuStyle * ms) +{ + Menu *m; + + m = MenuCreate(name, NULL, NULL, ms); + MenuSetTitle(m, _("Themes")); + MenuSetInternal(m); + MenuSetLoader(m, MenuLoadFromThemes); + return m; } @@ -556,7 +571,7 @@ return 0; } -Menu * +static Menu * MenuCreateFromBorders(const char *name, MenuStyle * ms) { char s[128]; @@ -586,96 +601,152 @@ return m; } -Menu * -MenuCreateFromAllEWins(const char *name, MenuStyle * ms) +static int +MenuCheckShowEwinDesk(EWin * ewin, void *prm) +{ + if (!EwinGetName(ewin) || ewin->props.skip_winlist) + return 0; + return prm == NULL || EwinGetDesk(ewin) == prm; +} + +static void +MenuLoadFromEwins(Menu * m, int (*f) (EWin * ewin, void *prm), void *prm) { - Menu *m; EWin *const *lst; int i, num; char s[256]; - MenuItem *mi; - m = MenuCreate(name, NULL, NULL, ms); - lst = EwinListGetAll(&num); for (i = 0; i < num; i++) { - if (lst[i]->props.skip_winlist || !EwinGetName(lst[i])) + if (!f(lst[i], prm)) continue; Esnprintf(s, sizeof(s), "wop %#lx focus", _EwinGetClientXwin(lst[i])); mi = MenuItemCreate(EwinGetName(lst[i]), NULL, s, NULL); MenuAddItem(m, mi); } +} - return m; +static int +MenuLoadFromAllEwins(Menu * m) +{ + MenuEmpty(m, 0); + MenuLoadFromEwins(m, MenuCheckShowEwinDesk, NULL); + return 1; } -#if 0 /* Not used */ static Menu * -MenuCreateFromDesktopEWins(char *name, Menu * parent, MenuStyle * ms, int desk) +MenuCreateFromAllEWins(const char *name, MenuStyle * ms) { Menu *m; - EWin *const *lst; - int i, num; - char s[256]; + m = MenuCreate(name, NULL, NULL, ms); + MenuSetTitle(m, _("Window List")); + MenuSetInternal(m); + MenuSetDynamic(m); + MenuSetLoader(m, MenuLoadFromAllEwins); + + return m; +} + +static int +MenuLoadFromDesktops(Menu * m) +{ + Menu *mm; + unsigned int i; + char s[256]; MenuItem *mi; - m = MenuCreate(name, NULL, parent, ms); + MenuEmpty(m, 0); - lst = EwinListGetAll(&num); - for (i = 0; i < num; i++) + for (i = 0; i < DesksGetNumber(); i++) { - if (lst[i]->props.skip_winlist || !EwinGetName(lst[i]) || - EoGetDesk(lst[i]) != j) - continue; + mm = MenuCreate("__SUBMENUDESK_E", NULL, m, NULL); + Esnprintf(s, sizeof(s), "desk goto %i", i); + mi = MenuItemCreate(_("Go to this Desktop"), NULL, s, NULL); + MenuAddItem(mm, mi); + MenuLoadFromEwins(mm, MenuCheckShowEwinDesk, DeskGet(i)); - Esnprintf(s, sizeof(s), "%lu", _EwinGetClientXwin(lst[i])); - mi = MenuItemCreate(lst[i]->client.title, NULL, s, NULL); + Esnprintf(s, sizeof(s), _("Desktop %i"), i); + mi = MenuItemCreate(s, NULL, NULL, mm); MenuAddItem(m, mi); } - return m; + return 1; } -#endif -Menu * +static Menu * MenuCreateFromDesktops(const char *name, MenuStyle * ms) { - Menu *m, *mm; - EWin *const *lst; - int i, num; - unsigned int j; + Menu *m; + + m = MenuCreate(name, NULL, NULL, ms); + MenuSetTitle(m, _("Desks")); + MenuSetInternal(m); + MenuSetDynamic(m); + MenuSetLoader(m, MenuLoadFromDesktops); + + return m; +} + +static int +MenuLoadFromGroups(Menu * m) +{ + Menu *mm; + Group **lst; + int i, j, num; char s[256]; MenuItem *mi; - m = MenuCreate(name, NULL, NULL, ms); + MenuEmpty(m, 0); - lst = EwinListGetAll(&num); - for (j = 0; j < DesksGetNumber(); j++) + lst = (Group **) ListItemType(&num, LIST_TYPE_GROUP); + if (!lst) + return 1; + + for (i = 0; i < num; i++) { - mm = MenuCreate("__SUBMENUDESK_E", NULL, m, ms); + mm = MenuCreate("__SUBMENUGROUP_E", NULL, m, NULL); - Esnprintf(s, sizeof(s), "desk goto %i", j); - mi = MenuItemCreate(_("Go to this Desktop"), NULL, s, NULL); + Esnprintf(s, sizeof(s), "gop %li showhide", + _EwinGetClientXwin(lst[i]->members[0])); + mi = MenuItemCreate(_("Show/Hide this group"), NULL, s, NULL); + + Esnprintf(s, sizeof(s), "wop %#lx ic", + _EwinGetClientXwin(lst[i]->members[0])); + MenuAddItem(mm, mi); + mi = MenuItemCreate(_("Iconify this group"), NULL, s, NULL); MenuAddItem(mm, mi); - for (i = 0; i < num; i++) - { - if (lst[i]->props.skip_winlist || !EwinGetName(lst[i]) || - EoGetDesk(lst[i]) != DeskGet(j)) - continue; + for (j = 0; j < lst[i]->num_members; j++) + { Esnprintf(s, sizeof(s), "wop %#lx focus", - _EwinGetClientXwin(lst[i])); - mi = MenuItemCreate(EwinGetName(lst[i]), NULL, s, NULL); + _EwinGetClientXwin(lst[i]->members[j])); + mi = MenuItemCreate(EwinGetName(lst[i]->members[j]), NULL, + s, NULL); MenuAddItem(mm, mi); } - Esnprintf(s, sizeof(s), _("Desktop %i"), j); + Esnprintf(s, sizeof(s), _("Group %i"), i); mi = MenuItemCreate(s, NULL, NULL, mm); MenuAddItem(m, mi); } + Efree(lst); + + return 1; +} + +static Menu * +MenuCreateFromGroups(const char *name, MenuStyle * ms) +{ + Menu *m; + + m = MenuCreate(name, NULL, NULL, ms); + MenuSetTitle(m, _("Groups")); + MenuSetInternal(m); + MenuSetDynamic(m); + MenuSetLoader(m, MenuLoadFromGroups); return m; } @@ -704,129 +775,51 @@ } #endif -static Menu * -MenuCreateFromGroups(const char *name, MenuStyle * ms) +Menu * +MenusCreateInternal(const char *type, const char *name, const char *style, + const char *prm) { - Menu *m, *mm; - Group **lst; - int i, j, num; - char s[256]; + Menu *m; + MenuStyle *ms; - MenuItem *mi; + m = NULL; + ms = NULL; + if (style) + ms = FindItem(style, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - m = MenuCreate(name, NULL, NULL, ms); - - lst = (Group **) ListItemType(&num, LIST_TYPE_GROUP); - if (lst) + if (!strcmp(type, "file")) { - for (i = 0; i < num; i++) - { - mm = MenuCreate("__SUBMENUGROUP_E", NULL, m, ms); - - Esnprintf(s, sizeof(s), "gop %li showhide", - _EwinGetClientXwin(lst[i]->members[0])); - mi = MenuItemCreate(_("Show/Hide this group"), NULL, s, NULL); - - Esnprintf(s, sizeof(s), "wop %#lx ic", - _EwinGetClientXwin(lst[i]->members[0])); - MenuAddItem(mm, mi); - mi = MenuItemCreate(_("Iconify this group"), NULL, s, NULL); - MenuAddItem(mm, mi); - - for (j = 0; j < lst[i]->num_members; j++) - { - Esnprintf(s, sizeof(s), "wop %#lx focus", - _EwinGetClientXwin(lst[i]->members[j])); - mi = MenuItemCreate(EwinGetName(lst[i]->members[j]), NULL, - s, NULL); - MenuAddItem(mm, mi); - } - Esnprintf(s, sizeof(s), _("Group %i"), i); - mi = MenuItemCreate(s, NULL, NULL, mm); - MenuAddItem(m, mi); - } - Efree(lst); + m = MenuCreateFromFlatFile(name, NULL, ms, prm); } - - return m; -} - -#if 0 /* Not used */ -static Menu * -RefreshTaskMenu(int desk) -{ - char was = 0; - int lx = 0, ly = 0; - EWin *ewin; - - if (task_menu[desk]) + else if (!strcmp(type, "dirscan")) { - ewin = FindEwinByMenu(task_menu[desk]); - if ((task_menu[desk]->win) && (ewin)) - { - lx = ewin->x; - ly = ewin->y; - was = 1; - } - MenuDestroy(task_menu[desk]); + SoundPlay("SOUND_SCANNING"); + m = MenuCreateFromDirectory(name, NULL, ms, prm); } - task_menu[desk] = NULL; - if (!task_menu_style) + else if (!strcmp(type, "gnome")) { - return NULL; + m = MenuCreateFromGnome(name, NULL, ms, prm); } - task_menu[desk] = MenuCreateFromDesktopEWins("MENU", task_menu_style, desk); - if ((was) && (task_menu[desk])) + else if (!strcmp(type, "borders")) { - task_menu[desk]->internal = 1; - MenuShow(task_menu[desk], 1); - ewin = FindEwinByMenu(task_menu[desk]); - if (ewin) - { - EwinMove(ewin, lx, ly); - ShowEwin(ewin); - } - Mode.cur_menu[0] = task_menu[desk]; - Mode.cur_menu_depth = 1; - MenuShowMasker(task_menu[desk]); + m = MenuCreateFromBorders(name, ms); + } + else if (!strcmp(type, "themes")) + { + m = MenuCreateFromThemes(name, ms); + } + else if (!strcmp(type, "windowlist")) + { + m = MenuCreateFromAllEWins(name, ms); + } + else if (!strcmp(type, "deskmenu")) + { + m = MenuCreateFromDesktops(name, ms); + } + else if (!strcmp(type, "groupmenu")) + { + m = MenuCreateFromGroups(name, ms); } - return task_menu[desk]; -} - -void -ShowTaskMenu(void) -{ -} -#endif - -/* FIXME - Menus should have update function? */ -void ShowAllTaskMenu(void); -void ShowDeskMenu(void); -void ShowGroupMenu(void); - -void -ShowAllTaskMenu(void) -{ - static MenuStyle *ms = NULL; - static Menu *m = NULL; - - ShowInternalMenu(&m, &ms, "TASK_MENU", MenuCreateFromAllEWins); -} - -void -ShowDeskMenu(void) -{ - static MenuStyle *ms = NULL; - static Menu *m = NULL; - - ShowInternalMenu(&m, &ms, "DESK_MENU", MenuCreateFromDesktops); -} - -void -ShowGroupMenu(void) -{ - static MenuStyle *ms = NULL; - static Menu *m = NULL; - ShowInternalMenu(&m, &ms, "GROUP_MENU", MenuCreateFromGroups); + return m; } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/menus.c,v retrieving revision 1.213 retrieving revision 1.214 diff -u -3 -r1.213 -r1.214 --- menus.c 18 Sep 2005 06:35:38 -0000 1.213 +++ menus.c 25 Sep 2005 00:50:52 -0000 1.214 @@ -28,6 +28,7 @@ #include "menus.h" #include "tooltips.h" #include "xwin.h" +#include <time.h> #include <X11/keysym.h> #define DEBUG_MENU_EVENTS 0 @@ -78,22 +79,26 @@ struct _menu { char *name; + char *alias; char *title; MenuStyle *style; + MenuLoader *loader; EWin *ewin; int w, h; int num; MenuItem **items; Window win; PmapMask pmm; + char internal; /* Don't destroy when reloading */ + char dynamic; /* May be emptied on close */ char shown; char stuck; - char internal; /* Don't destroy when reloading */ char redraw; Menu *parent; Menu *child; MenuItem *sel_item; time_t last_change; + time_t last_access; void *data; unsigned int ref_count; }; @@ -166,7 +171,10 @@ m->stuck = 0; m->shown = 0; m->parent = NULL; + m->last_access = time(0); MenuHideChildren(m); + if (m->dynamic) + MenuEmpty(m, 0); } static void @@ -235,13 +243,16 @@ int w, h, mw, mh; /* from appearing offscreen */ int head_num = 0; - if ((m->num <= 0) || (!m->style)) + if (m->shown || !m->style) return; - if (m->shown) - return; + if (m->loader) + { + if (m->loader(m)) + MenuRealize(m); + } - if (m->stuck) + if (m->num <= 0) return; if (!m->win) @@ -341,10 +352,10 @@ } m->stuck = 0; - + m->shown = 1; + m->last_access = time(0); Mode_menus.just_shown = 1; - m->shown = 1; if (!Mode_menus.first) { Mode_menus.context_ewin = GetContextEwin(); @@ -402,16 +413,31 @@ } void -MenuSetName(Menu * m, const char *name) +MenuSetInternal(Menu * m) { - if (m->name) - Efree(m->name); - m->name = Estrdup(name); + m->internal = 1; +} +void +MenuSetDynamic(Menu * m) +{ + m->dynamic = 1; +} + +void +MenuSetName(Menu * m, const char *name) +{ + _EFDUP(m->name, name); AddItem(m, m->name, 0, LIST_TYPE_MENU); } void +MenuSetAlias(Menu * m, const char *alias) +{ + _EFDUP(m->alias, alias); +} + +void MenuSetTitle(Menu * m, const char *title) { _EFDUP(m->title, title); @@ -426,6 +452,12 @@ } void +MenuSetLoader(Menu * m, MenuLoader * loader) +{ + m->loader = loader; +} + +void MenuSetTimestamp(Menu * m, time_t t) { m->last_change = t; @@ -463,12 +495,6 @@ ms->ref_count++; } -int -MenuIsNotEmpty(const Menu * m) -{ - return m && (m->num > 0) && m->style; -} - Menu * MenuCreate(const char *name, const char *title, Menu * parent, MenuStyle * ms) { @@ -489,9 +515,10 @@ void MenuDestroy(Menu * m) { - int i, j; - char s[4096]; + if (!m) + return; + m = RemoveItemByPtr(m, LIST_TYPE_MENU); if (!m) return; @@ -500,39 +527,14 @@ if (m->win) EDestroyWindow(m->win); - Esnprintf(s, sizeof(s), "__.%s", m->name); - RemoveTimerEvent(s); - RemoveItemByPtr(m, LIST_TYPE_MENU); + MenuEmpty(m, 1); + if (m->name) Efree(m->name); + if (m->alias) + Efree(m->alias); if (m->title) Efree(m->title); - - for (i = 0; i < m->num; i++) - { - if (m->items[i]) - { - if (m->items[i]->child) - { - if (FindItem(m->items[i]->child, 0, LIST_FINDBY_POINTER, - LIST_TYPE_MENU)) - MenuDestroy(m->items[i]->child); - } - if (m->items[i]->text) - Efree(m->items[i]->text); - if (m->items[i]->params) - Efree(m->items[i]->params); - for (j = 0; j < 3; j++) - FreePmapMask(&(m->items[i]->pmm[j])); - if (m->items[i]->icon_iclass) - m->items[i]->icon_iclass->ref_count--; - if (m->items[i]) - Efree(m->items[i]); - } - } - - if (m->items) - Efree(m->items); if (m->data) Efree(m->data); FreePmapMask(&m->pmm); @@ -546,7 +548,7 @@ * imageclasses to knw to free them when not used */ void -MenuEmpty(Menu * m) +MenuEmpty(Menu * m, int destroying) { int i, j; @@ -562,8 +564,10 @@ Efree(m->items[i]->params); for (j = 0; j < 3; j++) FreePmapMask(&(m->items[i]->pmm[j])); - if (m->items[i]->win) + if (!destroying && m->items[i]->win) EDestroyWindow(m->items[i]->win); + if (m->items[i]->icon_iclass) + m->items[i]->icon_iclass->ref_count--; if (m->items[i]) Efree(m->items[i]); } @@ -622,11 +626,8 @@ { m->win = ECreateWindow(VRoot.win, 0, 0, 1, 1, 0); EventCallbackRegister(m->win, 0, MenuHandleEvents, m); - } - - if (m->title) - { - HintsSetWindowName(m->win, _(m->title)); + if (m->title) + HintsSetWindowName(m->win, _(m->title)); } maxh = maxw = 0; @@ -993,46 +994,27 @@ while (found_one); } -/* - * Internal menus - */ - static Menu * -RefreshInternalMenu(Menu * m, MenuStyle * ms, - Menu * (mcf) (const char *xxx, MenuStyle * ms)) +MenuFind(const char *name) { - char was = 0; - int lx = 0, ly = 0; - EWin *ewin; + Menu *m, **lst; + int i, num; - if (m) + lst = (Menu **) ListItemType(&num, LIST_TYPE_MENU); + for (i = 0; i < num; i++) { - ewin = m->ewin; - if ((m->win) && (ewin)) - { - lx = EoGetX(ewin); - ly = EoGetY(ewin); - was = 1; - } - MenuDestroy(m); - m = NULL; + m = lst[i]; + if ((m->name && !strcmp(name, m->name)) || + (m->alias && !strcmp(name, m->alias))) + goto done; } - if (!ms) - return NULL; + /* Not in list - try if we can load internal */ + m = MenusCreateInternal(name, name, NULL, NULL); - m = mcf("MENU", ms); - if ((was) && (m)) - { - m->internal = 1; - MenuShow(m, 1); - ewin = m->ewin; - if (ewin) - { - EwinMove(ewin, lx, ly); - ShowEwin(ewin); - } - } + done: + if (lst) + Efree(lst); return m; } @@ -1046,7 +1028,7 @@ if (MenusActive()) MenusHide(); - m = FindItem(name, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU); + m = MenuFind(name); if (!m) return; @@ -1054,35 +1036,6 @@ MenuShow(m, 0); } -void -ShowInternalMenu(Menu ** pm, MenuStyle ** pms, const char *style, - Menu * (mcf) (const char *name, MenuStyle * ms)) -{ - Menu *m = *pm; - MenuStyle *ms = *pms; - - /* Hide any menus currently up */ - if (MenusActive()) - MenusHide(); - - if (!ms) - { - ms = FindItem(style, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (!ms) - ms = FindItem("DEFAULT", 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (!ms) - return; - *pms = ms; - } - - *pm = m = RefreshInternalMenu(m, ms, mcf); - if (!m) - return; - - if (!m->ewin) - MenuShow(m, 0); -} - int MenusActive(void) { @@ -1210,9 +1163,9 @@ break; if (!mi->params) break; + EFuncDefer(Mode_menus.context_ewin, mi->params); MenusHide(); EobjsRepaint(); - EFunc(Mode_menus.context_ewin, mi->params); break; } } @@ -1246,10 +1199,9 @@ MenuDrawItem(m, mi, 1, STATE_HILITED); if ((mi->params) /* && (!Mode_menus.just_shown) */ ) { + EFuncDefer(Mode_menus.context_ewin, mi->params); MenusHide(); EobjsRepaint(); - EFunc(Mode_menus.context_ewin, mi->params); - return; } } } @@ -1856,62 +1808,12 @@ act = 0; break; case CONFIG_CLOSE: - if (m) - MenuRealize(m); err = 0; break; case MENU_PREBUILT: sscanf(s, "%i %4000s %4000s %4000s %4000s", &i1, s2, s3, s4, s5); - if (!strcmp(s4, "dirscan")) - { - ms = FindItem(s3, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (!ms) - ms = FindItem("DEFAULT", 0, LIST_FINDBY_NAME, - LIST_TYPE_MENU_STYLE); - - if (ms) - { - SoundPlay("SOUND_SCANNING"); - m = MenuCreateFromDirectory(s2, NULL, ms, s5); - } - } - else if (!strcmp(s4, "gnome")) - { - ms = FindItem(s3, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (ms) - m = MenuCreateFromGnome(s2, NULL, ms, s5); - } - else if (!strcmp(s4, "borders")) - { - ms = FindItem(s3, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (ms) - m = MenuCreateFromBorders(s2, ms); - } - else if (!strcmp(s4, "themes")) - { - ms = FindItem(s3, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (ms) - m = MenuCreateFromThemes(s2, ms); - } - else if (!strcmp(s4, "file")) - { - ms = FindItem(s3, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (ms) - m = MenuCreateFromFlatFile(s2, NULL, ms, s5); - } - else if (!strcmp(s4, "windowlist")) - { - ms = FindItem(s3, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (ms) - m = MenuCreateFromAllEWins(s2, ms); - } - else if (!strcmp(s4, "desktopwindowlist")) - { - ms = FindItem(s3, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (ms) - m = MenuCreateFromDesktops(s2, ms); - } + m = MenusCreateInternal(s4, s2, s3, s5); break; case CONFIG_CLASSNAME: if (!m) @@ -1920,11 +1822,9 @@ MenuSetName(m, s2); break; case MENU_USE_STYLE: - { - ms = FindItem(s2, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); - if (ms) - MenuSetStyle(m, ms); - } + ms = FindItem(s2, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE); + if (ms) + MenuSetStyle(m, ms); break; case MENU_TITLE: if (m) @@ -1982,12 +1882,13 @@ if (strcmp("NULL", s3)) ic = ImageclassFind(s3, 0); mm = FindItem(s2, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU); +#if 0 /* FIXME - Remove? */ /* if submenu empty - dont put it in - only if menu found */ - if (MenuIsNotEmpty(mm)) - { - mi = MenuItemCreate(atword(s, 4), ic, NULL, mm); - MenuAddItem(m, mi); - } + if (MenuIsEmpty(mm)) + break; +#endif + mi = MenuItemCreate(atword(s, 4), ic, NULL, mm); + MenuAddItem(m, mi); break; default: break; @@ -2002,6 +1903,32 @@ return err; } +static void +MenusTimeout(int val __UNUSED__, void *data __UNUSED__) +{ + Menu *m, **lst; + int i, num; + time_t ts; + + /* Unload contents if loadable and no access in > 5 min */ + ts = time(0); + lst = (Menu **) ListItemType(&num, LIST_TYPE_MENU); + for (i = 0; i < num; i++) + { + m = lst[i]; + if (!m->loader || m->shown || m->num == 0 || + m->last_access == 0 || ts - m->last_access < 300) + continue; + + MenuEmpty(m, 0); + m->last_change = 0; + m->last_access = 0; + } + if (lst) + Efree(lst); + DoIn("MenusCheck", 300.0, MenusTimeout, 0, NULL); +} + /* * Menus Module */ @@ -2015,6 +1942,10 @@ ConfigFileLoad("menus.cfg", NULL, MenuConfigLoad, 1); break; + case ESIGNAL_START: + DoIn("MenusCheck", 300.0, MenusTimeout, 0, NULL); + break; + case ESIGNAL_AREA_SWITCH_START: case ESIGNAL_DESK_SWITCH_START: MenusHide(); @@ -2054,11 +1985,10 @@ lst = (Menu **) ListItemType(&num, LIST_TYPE_MENU); for (i = 0; i < num; i++) { - IpcPrintf("%s\n", MenuGetName(lst[i])); + IpcPrintf("%s\n", lst[i]->name); } if (lst) Efree(lst); - } else if (!strncmp(cmd, "reload", 2)) { @@ -2067,36 +1997,10 @@ } else if (!strncmp(cmd, "show", 2)) { - /* FIXME - Menus should have update function? */ - void ShowAllTaskMenu(void); - void ShowDeskMenu(void); - void ShowGroupMenu(void); - - if (!strcmp(prm, "deskmenu")) - { - SoundPlay("SOUND_MENU_SHOW"); - ShowDeskMenu(); - } - else if (!strcmp(prm, "taskmenu")) - { - SoundPlay("SOUND_MENU_SHOW"); - ShowAllTaskMenu(); - } - else if (!strcmp(prm, "groupmenu")) - { - SoundPlay("SOUND_MENU_SHOW"); - ShowGroupMenu(); - } - else if (!strcmp(prm, "named")) - { - SoundPlay("SOUND_MENU_SHOW"); - MenusShowNamed(p); - } - else - { - SoundPlay("SOUND_MENU_SHOW"); - MenusShowNamed(prm); - } + if (strcmp(prm, "named")) + p = prm; + SoundPlay("SOUND_MENU_SHOW"); + MenusShowNamed(p); } } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/menus.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- menus.h 10 Sep 2005 18:24:20 -0000 1.1 +++ menus.h 25 Sep 2005 00:50:53 -0000 1.2 @@ -29,6 +29,8 @@ typedef struct _menuitem MenuItem; typedef struct _menustyle MenuStyle; +typedef int (MenuLoader) (Menu * m); + /* menus.c */ int MenuStyleConfigLoad(FILE * fs); @@ -36,39 +38,28 @@ Menu * parent, MenuStyle * ms); void MenuDestroy(Menu * m); void MenuHide(Menu * m); -void MenuEmpty(Menu * m); +void MenuEmpty(Menu * m, int destroying); void MenuRepack(Menu * m); MenuItem *MenuItemCreate(const char *text, ImageClass * ic, const char *action_params, Menu * child); +void MenuSetInternal(Menu * m); +void MenuSetDynamic(Menu * m); void MenuSetName(Menu * m, const char *name); +void MenuSetAlias(Menu * m, const char *alias); void MenuSetStyle(Menu * m, MenuStyle * ms); void MenuSetTitle(Menu * m, const char *title); void MenuSetData(Menu * m, char *data); +void MenuSetLoader(Menu * m, MenuLoader * loader); void MenuSetTimestamp(Menu * m, time_t t); +void MenuAddItem(Menu * m, MenuItem * mi); 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); +Menu *MenusCreateInternal(const char *type, const char *name, + const char *style, const char *prm); #endif /* _MENUS_H_ */ =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/theme.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -3 -r1.52 -r1.53 --- theme.c 21 Aug 2005 21:00:55 -0000 1.52 +++ theme.c 25 Sep 2005 00:50:53 -0000 1.53 @@ -476,7 +476,7 @@ IpcItem ThemeIpcArray[] = { { ThemesIpc, - "themes", "th", + "theme", "th", "Theme commands", " theme Show current theme\n" " theme list Show all themes\n" ------------------------------------------------------- SF.Net email is sponsored by: Tame your development challenges with Apache's Geronimo App Server. Download it for free - -and be entered to win a 42" plasma tv or your very own Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs