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;
|
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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue