aboutsummaryrefslogtreecommitdiff
path: root/src/Screen.cc
diff options
context:
space:
mode:
authorPavel Labath <pavelo@centrum.sk>2011-07-02 15:21:24 (GMT)
committerPavel Labath <pavelo@centrum.sk>2011-07-02 15:21:24 (GMT)
commit442e69c89b721329883113389f889675138e7da7 (patch)
tree211111eb98eb3da6155baea0a24c5cd9d8c6137d /src/Screen.cc
parentbd94eaa6cadfd0a7d83f3068a84b27f987bdee4b (diff)
downloadfluxbox_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.cc63
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
846void BScreen::addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu) { 816void
847 menu->setInternalMenu(); 817BScreen::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
1394void BScreen::initMenus() { 1364void 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
1452void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { 1421void 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
1458void BScreen::removeConfigMenu(FbTk::Menu &menu) { 1427void 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());