From 195f2407e918ed9669a4dae2d4247df57b7f5be7 Mon Sep 17 00:00:00 2001 From: rephorm Date: Mon, 28 Jan 2002 05:41:29 +0000 Subject: [PATCH] This should fix the iconified menu segfaulting problem. The menu now get rebuilt when you middle click, if things have changed. SVN revision: 5877 --- src/border.c | 4 +++- src/menubuild.c | 32 ++++++++++++++++++++++++-------- src/menubuild.h | 3 +++ src/view.c | 8 +++++++- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/border.c b/src/border.c index 53173a30f..7cd8c79ee 100644 --- a/src/border.c +++ b/src/border.c @@ -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; diff --git a/src/menubuild.c b/src/menubuild.c index 94d034fd6..086022d49 100644 --- a/src/menubuild.c +++ b/src/menubuild.c @@ -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; } diff --git a/src/menubuild.h b/src/menubuild.h index fe6584f79..c5057dd45 100644 --- a/src/menubuild.h +++ b/src/menubuild.h @@ -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 diff --git a/src/view.c b/src/view.c index 678a0717a..8fb5f3bf3 100644 --- a/src/view.c +++ b/src/view.c @@ -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");