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; D_ENTER;
e_match_save_props(b); 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) while (b->menus)
{ {
E_Menu *m; 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 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 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 ---------------------- */ /* ------------ various callbacks ---------------------- */
@ -524,7 +524,8 @@ e_build_menu_new_from_iconified_borders()
bm = NEW(E_Build_Menu, 1); bm = NEW(E_Build_Menu, 1);
ZERO(bm, 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) 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); 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 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; 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)); 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; bm = (E_Build_Menu *)observer;
e_build_menu_unbuild(bm); bm->changed = 1;
bm->menu = e_build_menu_iconified_borders_build(bm);
} }
D_RETURN; D_RETURN;
} }

View File

@ -18,10 +18,13 @@ struct _E_Build_Menu
Evas_List menus; Evas_List menus;
Evas_List commands; Evas_List commands;
int changed;
}; };
E_Build_Menu *e_build_menu_new_from_db(char *file); 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_gnome_apps(char *dir);
E_Build_Menu *e_build_menu_new_from_iconified_borders(); E_Build_Menu *e_build_menu_new_from_iconified_borders();
void e_build_menu_iconified_borders_rebuild(E_Build_Menu *bm);
#endif #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"); D("building iconified windows menu\n");
buildmenu = e_build_menu_new_from_iconified_borders(); 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) if (buildmenu)
{ {
static E_Menu *menu = NULL; static E_Menu *menu = NULL;
menu = buildmenu->menu; menu = buildmenu->menu;
if (menu) if (menu)
{ {
D("showing iconified window menu\n"); D("showing iconified window menu\n");