This should fix the iconified menu segfaulting problem. The menu now get rebuilt when you middle click, if things have changed.

SVN revision: 5877
This commit is contained in:
rephorm 2002-01-28 05:41:29 +00:00 committed by rephorm
parent dd0f8bf0fd
commit 195f2407e9
4 changed files with 37 additions and 10 deletions

View File

@ -1218,7 +1218,9 @@ e_border_cleanup(E_Border *b)
D_ENTER;
e_match_save_props(b);
D("before notify\n");
e_observee_notify_observers(E_OBSERVEE(b), E_EVENT_BORDER_DELETE);
D("after notify\n");
while (b->menus)
{
E_Menu *m;

View File

@ -26,7 +26,7 @@ static void e_build_menu_gnome_apps_poll(int val, void *data);
static void e_build_menu_gnome_apps_build(E_Build_Menu *bm);
static E_Menu *e_build_menu_iconified_borders_build(E_Build_Menu *bm);
static void e_build_menu_iconified_borders_rebuild(E_Observer *observer, E_Observee *observee, E_Event_Type event);
static void e_build_menu_iconified_borders_changed(E_Observer *observer, E_Observee *observee, E_Event_Type event);
/* ------------ various callbacks ---------------------- */
@ -524,7 +524,8 @@ e_build_menu_new_from_iconified_borders()
bm = NEW(E_Build_Menu, 1);
ZERO(bm, E_Build_Menu, 1);
e_observer_init(E_OBSERVER(bm), E_EVENT_BORDER_ICONIFY | E_EVENT_BORDER_UNICONIFY | E_EVENT_BORDER_NEW, e_build_menu_iconified_borders_rebuild, (E_Cleanup_Func) e_build_menu_cleanup);
/* e_observer_init(E_OBSERVER(bm), E_EVENT_BORDER_ICONIFY | E_EVENT_BORDER_UNICONIFY | E_EVENT_BORDER_NEW, e_build_menu_iconified_borders_changed, (E_Cleanup_Func) e_build_menu_cleanup);*/
e_observer_init(E_OBSERVER(bm), E_EVENT_BORDER_ALL, e_build_menu_iconified_borders_changed, (E_Cleanup_Func) e_build_menu_cleanup);
for (l = e_border_get_borders_list(); l; l = l->next)
{
@ -538,8 +539,20 @@ e_build_menu_new_from_iconified_borders()
D_RETURN_(bm);
}
void
e_build_menu_iconified_borders_rebuild(E_Build_Menu *bm)
{
D_ENTER;
e_build_menu_unbuild(bm);
bm->menu = e_build_menu_iconified_borders_build(bm);
bm->changed = 0;
D_RETURN;
}
static void
e_build_menu_iconified_borders_rebuild(E_Observer *observer, E_Observee *observee, E_Event_Type event)
e_build_menu_iconified_borders_changed(E_Observer *observer, E_Observee *observee, E_Event_Type event)
{
E_Build_Menu *bm;
@ -551,15 +564,18 @@ e_build_menu_iconified_borders_rebuild(E_Observer *observer, E_Observee *observe
e_observer_register_observee(E_OBSERVER(observer), E_OBSERVEE(observee));
}
if (event & (E_EVENT_BORDER_ICONIFY | E_EVENT_BORDER_UNICONIFY))
else if (event & E_EVENT_BORDER_DELETE)
{
D("catch iconify, rebuild menu\n");
bm = (E_Build_Menu *) observer;
bm->changed = 1;
}
else if (event & (E_EVENT_BORDER_ICONIFY | E_EVENT_BORDER_UNICONIFY))
{
D("catch iconify, set menu to changed\n");
bm = (E_Build_Menu *)observer;
e_build_menu_unbuild(bm);
bm->menu = e_build_menu_iconified_borders_build(bm);
bm->changed = 1;
}
D_RETURN;
}

View File

@ -18,10 +18,13 @@ struct _E_Build_Menu
Evas_List menus;
Evas_List commands;
int changed;
};
E_Build_Menu *e_build_menu_new_from_db(char *file);
E_Build_Menu *e_build_menu_new_from_gnome_apps(char *dir);
E_Build_Menu *e_build_menu_new_from_iconified_borders();
void e_build_menu_iconified_borders_rebuild(E_Build_Menu *bm);
#endif

View File

@ -440,11 +440,17 @@ e_bg_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
D("building iconified windows menu\n");
buildmenu = e_build_menu_new_from_iconified_borders();
}
if (buildmenu && buildmenu->changed)
{
D("buildmenu changed! rebuild!\n");
e_build_menu_iconified_borders_rebuild(buildmenu);
}
if (buildmenu)
{
static E_Menu *menu = NULL;
menu = buildmenu->menu;
if (menu)
{
D("showing iconified window menu\n");