diff options
author | Pavel Labath <pavelo@centrum.sk> | 2011-07-02 15:21:24 (GMT) |
---|---|---|
committer | Pavel Labath <pavelo@centrum.sk> | 2011-07-02 15:21:24 (GMT) |
commit | 442e69c89b721329883113389f889675138e7da7 (patch) | |
tree | 211111eb98eb3da6155baea0a24c5cd9d8c6137d /src/Screen.cc | |
parent | bd94eaa6cadfd0a7d83f3068a84b27f987bdee4b (diff) | |
download | fluxbox_pavel-442e69c89b721329883113389f889675138e7da7.zip fluxbox_pavel-442e69c89b721329883113389f889675138e7da7.tar.bz2 |
Store menus if smart pointers (RefCount)
This was originally intended to be a bugfix for an memory error reported by valgrind (accessing
freed memory). While debugging it, I found the menu ownership semantics confusing
(setInternalMenu() et al.), so I decided to get rid of it and store it in smart pointers
everywhere.
Looking back, I'm not sure if this was worth all the trouble, but the good news is that the
valgrind error disappeared. :)
Diffstat (limited to 'src/Screen.cc')
-rw-r--r-- | src/Screen.cc | 63 |
1 files changed, 16 insertions, 47 deletions
diff --git a/src/Screen.cc b/src/Screen.cc index ca12cb3..563c1e6 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "FbTk/RadioMenuItem.hh" | 42 | #include "FbTk/RadioMenuItem.hh" |
43 | 43 | ||
44 | // menus | 44 | // menus |
45 | #include "FbMenu.hh" | ||
46 | #include "LayerMenu.hh" | 45 | #include "LayerMenu.hh" |
47 | 46 | ||
48 | #include "MenuCreator.hh" | 47 | #include "MenuCreator.hh" |
@@ -435,7 +434,6 @@ BScreen::BScreen(FbTk::ResourceManager_base &rm, | |||
435 | m_current_workspace = m_workspaces_list.front(); | 434 | m_current_workspace = m_workspaces_list.front(); |
436 | 435 | ||
437 | m_windowmenu.reset(createMenu("")); | 436 | m_windowmenu.reset(createMenu("")); |
438 | m_windowmenu->setInternalMenu(); | ||
439 | m_windowmenu->setReloadHelper(new FbTk::AutoReloadHelper()); | 437 | m_windowmenu->setReloadHelper(new FbTk::AutoReloadHelper()); |
440 | m_windowmenu->reloadHelper()->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<BScreen>(*this, &BScreen::rereadWindowMenu))); | 438 | m_windowmenu->reloadHelper()->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<BScreen>(*this, &BScreen::rereadWindowMenu))); |
441 | 439 | ||
@@ -446,7 +444,6 @@ BScreen::BScreen(FbTk::ResourceManager_base &rm, | |||
446 | m_configmenu.reset(createMenu(_FB_XTEXT(Menu, Configuration, | 444 | m_configmenu.reset(createMenu(_FB_XTEXT(Menu, Configuration, |
447 | "Configuration", "Title of configuration menu"))); | 445 | "Configuration", "Title of configuration menu"))); |
448 | setupConfigmenu(*m_configmenu.get()); | 446 | setupConfigmenu(*m_configmenu.get()); |
449 | m_configmenu->setInternalMenu(); | ||
450 | 447 | ||
451 | // check which desktop we should start on | 448 | // check which desktop we should start on |
452 | unsigned int first_desktop = 0; | 449 | unsigned int first_desktop = 0; |
@@ -493,34 +490,7 @@ BScreen::~BScreen() { | |||
493 | // we need to destroy it before we destroy workspaces | 490 | // we need to destroy it before we destroy workspaces |
494 | m_workspacemenu.reset(0); | 491 | m_workspacemenu.reset(0); |
495 | 492 | ||
496 | if (m_extramenus.size()) { | 493 | m_extramenus.clear(); |
497 | // check whether extramenus are included in windowmenu | ||
498 | // if not, we clean them ourselves | ||
499 | bool extramenus_in_windowmenu = false; | ||
500 | for (size_t i = 0, n = m_windowmenu->numberOfItems(); i < n; i++) | ||
501 | if (m_windowmenu->find(i)->submenu() == m_extramenus.begin()->second) { | ||
502 | extramenus_in_windowmenu = true; | ||
503 | break; | ||
504 | } | ||
505 | |||
506 | ExtraMenus::iterator mit = m_extramenus.begin(); | ||
507 | ExtraMenus::iterator mit_end = m_extramenus.end(); | ||
508 | for (; mit != mit_end; ++mit) { | ||
509 | // we set them to NOT internal so that they will be deleted when the | ||
510 | // menu is cleaned up. We can't delete them here because they are | ||
511 | // still in the menu | ||
512 | // (They need to be internal for most of the time so that if we | ||
513 | // rebuild the menu, then they won't be removed. | ||
514 | if (! extramenus_in_windowmenu) { | ||
515 | // not attached to our windowmenu | ||
516 | // so we clean it up | ||
517 | delete mit->second; | ||
518 | } else { | ||
519 | // let the parent clean it up | ||
520 | mit->second->setInternalMenu(false); | ||
521 | } | ||
522 | } | ||
523 | } | ||
524 | 494 | ||
525 | removeWorkspaceNames(); | 495 | removeWorkspaceNames(); |
526 | using namespace FbTk::STLUtil; | 496 | using namespace FbTk::STLUtil; |
@@ -548,9 +518,9 @@ BScreen::~BScreen() { | |||
548 | m_slit.reset(0); | 518 | m_slit.reset(0); |
549 | 519 | ||
550 | 520 | ||
551 | delete m_rootmenu.release(); | 521 | m_rootmenu.reset(0); |
552 | delete m_workspacemenu.release(); | 522 | m_workspacemenu.reset(0); |
553 | delete m_windowmenu.release(); | 523 | m_windowmenu.reset(0); |
554 | 524 | ||
555 | // TODO fluxgen: check if this is the right place | 525 | // TODO fluxgen: check if this is the right place |
556 | for (size_t i = 0; i < m_head_areas.size(); i++) | 526 | for (size_t i = 0; i < m_head_areas.size(); i++) |
@@ -843,8 +813,8 @@ FbMenu *BScreen::createToggleMenu(const string &label) { | |||
843 | return menu; | 813 | return menu; |
844 | } | 814 | } |
845 | 815 | ||
846 | void BScreen::addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu) { | 816 | void |
847 | menu->setInternalMenu(); | 817 | BScreen::addExtraWindowMenu(const FbTk::FbString &label, const FbTk::RefCount<FbTk::Menu> &menu) { |
848 | menu->disableTitle(); | 818 | menu->disableTitle(); |
849 | m_extramenus.push_back(make_pair(label, menu)); | 819 | m_extramenus.push_back(make_pair(label, menu)); |
850 | rereadWindowMenu(); | 820 | rereadWindowMenu(); |
@@ -1392,7 +1362,7 @@ void BScreen::reassociateWindow(FluxboxWindow *w, unsigned int wkspc_id, | |||
1392 | } | 1362 | } |
1393 | 1363 | ||
1394 | void BScreen::initMenus() { | 1364 | void BScreen::initMenus() { |
1395 | m_workspacemenu.reset(MenuCreator::createMenuType("workspacemenu", screenNumber())); | 1365 | m_workspacemenu = MenuCreator::createMenuType("workspacemenu", screenNumber()); |
1396 | 1366 | ||
1397 | m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename()); | 1367 | m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename()); |
1398 | m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename()); | 1368 | m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename()); |
@@ -1418,7 +1388,6 @@ void BScreen::rereadMenu() { | |||
1418 | FbTk::RefCount<FbTk::Command<void> > restart_fb(FbTk::CommandParser<void>::instance().parse("restart")); | 1388 | FbTk::RefCount<FbTk::Command<void> > restart_fb(FbTk::CommandParser<void>::instance().parse("restart")); |
1419 | FbTk::RefCount<FbTk::Command<void> > exit_fb(FbTk::CommandParser<void>::instance().parse("exit")); | 1389 | FbTk::RefCount<FbTk::Command<void> > exit_fb(FbTk::CommandParser<void>::instance().parse("exit")); |
1420 | FbTk::RefCount<FbTk::Command<void> > execute_xterm(FbTk::CommandParser<void>::instance().parse("exec xterm")); | 1390 | FbTk::RefCount<FbTk::Command<void> > execute_xterm(FbTk::CommandParser<void>::instance().parse("exec xterm")); |
1421 | m_rootmenu->setInternalMenu(); | ||
1422 | m_rootmenu->insert("xterm", execute_xterm); | 1391 | m_rootmenu->insert("xterm", execute_xterm); |
1423 | m_rootmenu->insert(_FB_XTEXT(Menu, Reconfigure, "Reconfigure", | 1392 | m_rootmenu->insert(_FB_XTEXT(Menu, Reconfigure, "Reconfigure", |
1424 | "Reload Configuration command")), | 1393 | "Reload Configuration command")), |
@@ -1449,16 +1418,16 @@ void BScreen::rereadWindowMenu() { | |||
1449 | MenuCreator::createMenu(*m_windowmenu, l, m_windowmenu->reloadHelper()); | 1418 | MenuCreator::createMenu(*m_windowmenu, l, m_windowmenu->reloadHelper()); |
1450 | } | 1419 | } |
1451 | 1420 | ||
1452 | void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { | 1421 | void BScreen::addConfigMenu(const FbTk::FbString &label, const FbTk::RefCount<FbTk::Menu> &menu) { |
1453 | m_configmenu_list.push_back(make_pair(label, &menu)); | 1422 | m_configmenu_list.push_back(make_pair(label, menu)); |
1454 | if (m_configmenu.get()) | 1423 | if (m_configmenu.get()) |
1455 | setupConfigmenu(*m_configmenu.get()); | 1424 | setupConfigmenu(*m_configmenu.get()); |
1456 | } | 1425 | } |
1457 | 1426 | ||
1458 | void BScreen::removeConfigMenu(FbTk::Menu &menu) { | 1427 | void BScreen::removeConfigMenu(const FbTk::RefCount<FbTk::Menu> &menu) { |
1459 | Configmenus::iterator erase_it = find_if(m_configmenu_list.begin(), | 1428 | Configmenus::iterator erase_it = find_if(m_configmenu_list.begin(), |
1460 | m_configmenu_list.end(), | 1429 | m_configmenu_list.end(), |
1461 | FbTk::Compose(bind2nd(equal_to<FbTk::Menu *>(), &menu), | 1430 | FbTk::Compose(bind2nd(equal_to<FbTk::RefCount<FbTk::Menu> >(), menu), |
1462 | FbTk::Select2nd<Configmenus::value_type>())); | 1431 | FbTk::Select2nd<Configmenus::value_type>())); |
1463 | if (erase_it != m_configmenu_list.end()) | 1432 | if (erase_it != m_configmenu_list.end()) |
1464 | m_configmenu_list.erase(erase_it); | 1433 | m_configmenu_list.erase(erase_it); |
@@ -1500,7 +1469,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1500 | FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel, | 1469 | FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel, |
1501 | "Focus Model", | 1470 | "Focus Model", |
1502 | "Method used to give focus to windows"); | 1471 | "Method used to give focus to windows"); |
1503 | FbTk::Menu *focus_menu = createMenu(focusmenu_label); | 1472 | FbTk::RefCount<FbTk::Menu> focus_menu( createMenu(focusmenu_label) ); |
1504 | 1473 | ||
1505 | #define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f)) | 1474 | #define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f)) |
1506 | 1475 | ||
@@ -1557,7 +1526,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1557 | 1526 | ||
1558 | FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu, | 1527 | FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu, |
1559 | "Maximize Options", "heading for maximization options"); | 1528 | "Maximize Options", "heading for maximization options"); |
1560 | FbTk::Menu *maxmenu = createMenu(maxmenu_label); | 1529 | FbTk::RefCount<FbTk::Menu> maxmenu( createMenu(maxmenu_label) ); |
1561 | 1530 | ||
1562 | _BOOLITEM(*maxmenu, Configmenu, FullMax, | 1531 | _BOOLITEM(*maxmenu, Configmenu, FullMax, |
1563 | "Full Maximization", "Maximise over slit, toolbar, etc", | 1532 | "Full Maximization", "Maximise over slit, toolbar, etc", |
@@ -1583,9 +1552,9 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1583 | FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu, | 1552 | FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu, |
1584 | "Tab Options", | 1553 | "Tab Options", |
1585 | "heading for tab-related options"); | 1554 | "heading for tab-related options"); |
1586 | FbTk::Menu *tab_menu = createMenu(tabmenu_label); | 1555 | FbTk::RefCount<FbTk::Menu> tab_menu( createMenu(tabmenu_label) ); |
1587 | FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"); | 1556 | FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"); |
1588 | FbTk::Menu *tabplacement_menu = createToggleMenu(tabplacement_label); | 1557 | FbTk::RefCount<FbTk::Menu> tabplacement_menu( createToggleMenu(tabplacement_label) ); |
1589 | 1558 | ||
1590 | tab_menu->insert(tabplacement_label, tabplacement_menu); | 1559 | tab_menu->insert(tabplacement_label, tabplacement_menu); |
1591 | 1560 | ||
@@ -1653,7 +1622,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1653 | FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency, | 1622 | FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency, |
1654 | "Transparency", | 1623 | "Transparency", |
1655 | "Menu containing various transparency options"); | 1624 | "Menu containing various transparency options"); |
1656 | FbTk::Menu *alpha_menu = createMenu(alphamenu_label); | 1625 | FbTk::RefCount<FbTk::Menu> alpha_menu( createMenu(alphamenu_label) ); |
1657 | 1626 | ||
1658 | if (FbTk::Transparent::haveComposite(true)) { | 1627 | if (FbTk::Transparent::haveComposite(true)) { |
1659 | static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans()); | 1628 | static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans()); |