all repos — fluxbox @ f6a072430d4de159e229d6172adc5ba5ae985512

custom fork of the fluxbox windowmanager

fix memory leaks in menu code
simonb simonb
commit

f6a072430d4de159e229d6172adc5ba5ae985512

parent

731f0deaafff3a4fe4353bbfc421a5dc3d5a2337

7 files changed, 26 insertions(+), 11 deletions(-)

jump to
M ChangeLogChangeLog

@@ -1,6 +1,8 @@

(Format: Year/Month/Day) Changes for 0.9.16: *06/04/24: + * Fix memory leaks & other errors in Menu code (Simon) + Screen.cc Slit.cc Toolbar.cc fluxbox.cc MenuCreator.cc FbTk/Menu.cc * Use external tabs by default (Simon) - they provide a unique look to fluxbox - backwards compatible with 0.1.14 ("stable")
M src/FbTk/Menu.ccsrc/FbTk/Menu.cc

@@ -232,14 +232,16 @@

if (item) { menuitems.erase(it); - if (!m_internal_menu && item->submenu() != 0) { + if (item->submenu() != 0) { Menu *tmp = item->submenu(); - // if menu is interal we should just hide it instead + // if menu is internal we should just hide it instead // if destroying it if (! tmp->m_internal_menu) { delete tmp; - } else - tmp->internal_hide(); + } + // We can't internal_hide here, as the child may be deleted! +// } else +// tmp->internal_hide(); }
M src/MenuCreator.ccsrc/MenuCreator.cc

@@ -454,7 +454,6 @@ return new WorkspaceMenu(*screen);

} else if (type == "windowmenu") { FbTk::Menu *menu = screen->createMenu(""); - menu->removeAll(); // clear old items menu->disableTitle(); // not titlebar if (screen->windowMenuFilename().empty() || ! createWindowMenuFromFile(screen->windowMenuFilename(), *menu, true)) {
M src/Screen.ccsrc/Screen.cc

@@ -728,6 +728,7 @@ menu->disableTitle();

m_extramenus.push_back(std::make_pair(label, menu)); // recreate window menu m_windowmenu.reset(MenuCreator::createMenuType("windowmenu", screenNumber())); + m_windowmenu->setInternalMenu(); } void BScreen::removeExtraWindowMenu(FbTk::Menu *menu) {

@@ -739,6 +740,7 @@ if (it != m_extramenus.end())

m_extramenus.erase(it); // recreate window menu m_windowmenu.reset(MenuCreator::createMenuType("windowmenu", screenNumber())); + m_windowmenu->setInternalMenu(); } void BScreen::hideMenus() {

@@ -827,6 +829,7 @@ m_workspacemenu->reconfigure();

m_configmenu->reconfigure(); // recreate window menu m_windowmenu.reset(MenuCreator::createMenuType("windowmenu", screenNumber())); + m_windowmenu->setInternalMenu(); // We need to check to see if the timestamps // changed before we actually can restore the menus

@@ -1501,6 +1504,7 @@

void BScreen::initMenus() { m_workspacemenu.reset(MenuCreator::createMenuType("workspacemenu", screenNumber())); m_windowmenu.reset(MenuCreator::createMenuType("windowmenu", screenNumber())); + m_windowmenu->setInternalMenu(); initMenu(); }

@@ -1554,6 +1558,7 @@ FbTk::Compose(bind2nd(equal_to<FbTk::Menu *>(), &menu),

FbTk::Select2nd<Configmenus::value_type>())); if (erase_it != m_configmenu_list.end()) m_configmenu_list.erase(erase_it); + setupConfigmenu(*m_configmenu.get()); }
M src/Slit.ccsrc/Slit.cc

@@ -347,6 +347,9 @@ clearStrut();

if (frame.pixmap != 0) screen().imageControl().removeImage(frame.pixmap); + // otherwise it will try to access it on deletion + screen().removeConfigMenu(m_slitmenu); + shutdown(); }
M src/Toolbar.ccsrc/Toolbar.cc

@@ -252,6 +252,7 @@ m_placementmenu.setLabel(_FBTEXT(Toolbar, Placement, "Toolbar Placement", "Title of toolbar placement menu"));

m_layermenu.setInternalMenu(); m_placementmenu.setInternalMenu(); + m_toolbarmenu.setInternalMenu(); setupMenus(); // add menu to screen screen().addConfigMenu(_FBTEXT(Toolbar, Toolbar, "Toolbar", "title of toolbar menu item"), menu());

@@ -287,6 +288,8 @@ FbTk::EventManager::instance()->remove(window());

// remove menu items before we delete tools so we dont end up // with dangling pointers to old submenu items (internal menus) // from the tools + screen().removeConfigMenu(menu()); + menu().removeAll(); deleteItems();
M src/fluxbox.ccsrc/fluxbox.cc

@@ -418,12 +418,6 @@ while (!m_toolbars.empty()) {

delete m_toolbars.back(); m_toolbars.pop_back(); } - - // destroy screens - while (!m_screen_list.empty()) { - delete m_screen_list.back(); - m_screen_list.pop_back(); - } // destroy atomhandlers for (AtomHandlerContainerIt it= m_atomhandler.begin();

@@ -432,6 +426,13 @@ it++) {

delete (*it).first; } m_atomhandler.clear(); + + // destroy screens (after others, as they may do screen things) + while (!m_screen_list.empty()) { + delete m_screen_list.back(); + m_screen_list.pop_back(); + } + clearMenuFilenames(); }