forked from enlightenment/enlightenment
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:
parent
dd0f8bf0fd
commit
195f2407e9
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue