aboutsummaryrefslogtreecommitdiff
path: root/src/Screen.cc
diff options
context:
space:
mode:
authorPavel Labath <pavelo@centrum.sk>2011-07-02 15:21:24 (GMT)
committerPaul Tagliamonte <paultag@fluxbox.org>2012-04-07 02:11:29 (GMT)
commit34649e86c5cbe9c9f231c049a0844afdda5a7db9 (patch)
tree6e9696e36565e993185c9d265ca6542b77788fd9 /src/Screen.cc
parent0b0ee8dc504016ffad85ec1dd35875d273cf0179 (diff)
downloadfluxbox_paul-34649e86c5cbe9c9f231c049a0844afdda5a7db9.zip
fluxbox_paul-34649e86c5cbe9c9f231c049a0844afdda5a7db9.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 73ccb4c..78932ae 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"
@@ -427,7 +426,6 @@ BScreen::BScreen(FbTk::ResourceManager_base &rm,
427 m_current_workspace = m_workspaces_list.front(); 426 m_current_workspace = m_workspaces_list.front();
428 427
429 m_windowmenu.reset(createMenu("")); 428 m_windowmenu.reset(createMenu(""));
430 m_windowmenu->setInternalMenu();
431 m_windowmenu->setReloadHelper(new FbTk::AutoReloadHelper()); 429 m_windowmenu->setReloadHelper(new FbTk::AutoReloadHelper());
432 m_windowmenu->reloadHelper()->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<BScreen>(*this, &BScreen::rereadWindowMenu))); 430 m_windowmenu->reloadHelper()->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<BScreen>(*this, &BScreen::rereadWindowMenu)));
433 431
@@ -438,7 +436,6 @@ BScreen::BScreen(FbTk::ResourceManager_base &rm,
438 m_configmenu.reset(createMenu(_FB_XTEXT(Menu, Configuration, 436 m_configmenu.reset(createMenu(_FB_XTEXT(Menu, Configuration,
439 "Configuration", "Title of configuration menu"))); 437 "Configuration", "Title of configuration menu")));
440 setupConfigmenu(*m_configmenu.get()); 438 setupConfigmenu(*m_configmenu.get());
441 m_configmenu->setInternalMenu();
442 439
443 // check which desktop we should start on 440 // check which desktop we should start on
444 unsigned int first_desktop = 0; 441 unsigned int first_desktop = 0;
@@ -485,34 +482,7 @@ BScreen::~BScreen() {
485 // we need to destroy it before we destroy workspaces 482 // we need to destroy it before we destroy workspaces
486 m_workspacemenu.reset(0); 483 m_workspacemenu.reset(0);
487 484
488 if (m_extramenus.size()) { 485 m_extramenus.clear();
489 // check whether extramenus are included in windowmenu
490 // if not, we clean them ourselves
491 bool extramenus_in_windowmenu = false;
492 for (size_t i = 0, n = m_windowmenu->numberOfItems(); i < n; i++)
493 if (m_windowmenu->find(i)->submenu() == m_extramenus.begin()->second) {
494 extramenus_in_windowmenu = true;
495 break;
496 }
497
498 ExtraMenus::iterator mit = m_extramenus.begin();
499 ExtraMenus::iterator mit_end = m_extramenus.end();
500 for (; mit != mit_end; ++mit) {
501 // we set them to NOT internal so that they will be deleted when the
502 // menu is cleaned up. We can't delete them here because they are
503 // still in the menu
504 // (They need to be internal for most of the time so that if we
505 // rebuild the menu, then they won't be removed.
506 if (! extramenus_in_windowmenu) {
507 // not attached to our windowmenu
508 // so we clean it up
509 delete mit->second;
510 } else {
511 // let the parent clean it up
512 mit->second->setInternalMenu(false);
513 }
514 }
515 }
516 486
517 removeWorkspaceNames(); 487 removeWorkspaceNames();
518 using namespace FbTk::STLUtil; 488 using namespace FbTk::STLUtil;
@@ -540,9 +510,9 @@ BScreen::~BScreen() {
540 m_slit.reset(0); 510 m_slit.reset(0);
541 511
542 512
543 delete m_rootmenu.release(); 513 m_rootmenu.reset(0);
544 delete m_workspacemenu.release(); 514 m_workspacemenu.reset(0);
545 delete m_windowmenu.release(); 515 m_windowmenu.reset(0);
546 516
547 // TODO fluxgen: check if this is the right place 517 // TODO fluxgen: check if this is the right place
548 for (size_t i = 0; i < m_head_areas.size(); i++) 518 for (size_t i = 0; i < m_head_areas.size(); i++)
@@ -835,8 +805,8 @@ FbMenu *BScreen::createToggleMenu(const string &label) {
835 return menu; 805 return menu;
836} 806}
837 807
838void BScreen::addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu) { 808void
839 menu->setInternalMenu(); 809BScreen::addExtraWindowMenu(const FbTk::FbString &label, const FbTk::RefCount<FbTk::Menu> &menu) {
840 menu->disableTitle(); 810 menu->disableTitle();
841 m_extramenus.push_back(make_pair(label, menu)); 811 m_extramenus.push_back(make_pair(label, menu));
842 rereadWindowMenu(); 812 rereadWindowMenu();
@@ -1384,7 +1354,7 @@ void BScreen::reassociateWindow(FluxboxWindow *w, unsigned int wkspc_id,
1384} 1354}
1385 1355
1386void BScreen::initMenus() { 1356void BScreen::initMenus() {
1387 m_workspacemenu.reset(MenuCreator::createMenuType("workspacemenu", screenNumber())); 1357 m_workspacemenu = MenuCreator::createMenuType("workspacemenu", screenNumber());
1388 1358
1389 m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename()); 1359 m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename());
1390 m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename()); 1360 m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename());
@@ -1410,7 +1380,6 @@ void BScreen::rereadMenu() {
1410 FbTk::RefCount<FbTk::Command<void> > restart_fb(FbTk::CommandParser<void>::instance().parse("restart")); 1380 FbTk::RefCount<FbTk::Command<void> > restart_fb(FbTk::CommandParser<void>::instance().parse("restart"));
1411 FbTk::RefCount<FbTk::Command<void> > exit_fb(FbTk::CommandParser<void>::instance().parse("exit")); 1381 FbTk::RefCount<FbTk::Command<void> > exit_fb(FbTk::CommandParser<void>::instance().parse("exit"));
1412 FbTk::RefCount<FbTk::Command<void> > execute_xterm(FbTk::CommandParser<void>::instance().parse("exec xterm")); 1382 FbTk::RefCount<FbTk::Command<void> > execute_xterm(FbTk::CommandParser<void>::instance().parse("exec xterm"));
1413 m_rootmenu->setInternalMenu();
1414 m_rootmenu->insert("xterm", execute_xterm); 1383 m_rootmenu->insert("xterm", execute_xterm);
1415 m_rootmenu->insert(_FB_XTEXT(Menu, Reconfigure, "Reconfigure", 1384 m_rootmenu->insert(_FB_XTEXT(Menu, Reconfigure, "Reconfigure",
1416 "Reload Configuration command")), 1385 "Reload Configuration command")),
@@ -1441,16 +1410,16 @@ void BScreen::rereadWindowMenu() {
1441 MenuCreator::createMenu(*m_windowmenu, l, m_windowmenu->reloadHelper()); 1410 MenuCreator::createMenu(*m_windowmenu, l, m_windowmenu->reloadHelper());
1442} 1411}
1443 1412
1444void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { 1413void BScreen::addConfigMenu(const FbTk::FbString &label, const FbTk::RefCount<FbTk::Menu> &menu) {
1445 m_configmenu_list.push_back(make_pair(label, &menu)); 1414 m_configmenu_list.push_back(make_pair(label, menu));
1446 if (m_configmenu.get()) 1415 if (m_configmenu.get())
1447 setupConfigmenu(*m_configmenu.get()); 1416 setupConfigmenu(*m_configmenu.get());
1448} 1417}
1449 1418
1450void BScreen::removeConfigMenu(FbTk::Menu &menu) { 1419void BScreen::removeConfigMenu(const FbTk::RefCount<FbTk::Menu> &menu) {
1451 Configmenus::iterator erase_it = find_if(m_configmenu_list.begin(), 1420 Configmenus::iterator erase_it = find_if(m_configmenu_list.begin(),
1452 m_configmenu_list.end(), 1421 m_configmenu_list.end(),
1453 FbTk::Compose(bind2nd(equal_to<FbTk::Menu *>(), &menu), 1422 FbTk::Compose(bind2nd(equal_to<FbTk::RefCount<FbTk::Menu> >(), menu),
1454 FbTk::Select2nd<Configmenus::value_type>())); 1423 FbTk::Select2nd<Configmenus::value_type>()));
1455 if (erase_it != m_configmenu_list.end()) 1424 if (erase_it != m_configmenu_list.end())
1456 m_configmenu_list.erase(erase_it); 1425 m_configmenu_list.erase(erase_it);
@@ -1541,7 +1510,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1541 FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel, 1510 FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel,
1542 "Focus Model", 1511 "Focus Model",
1543 "Method used to give focus to windows"); 1512 "Method used to give focus to windows");
1544 FbTk::Menu *focus_menu = createMenu(focusmenu_label); 1513 FbTk::RefCount<FbTk::Menu> focus_menu( createMenu(focusmenu_label) );
1545 1514
1546#define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f)) 1515#define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f))
1547 1516
@@ -1598,7 +1567,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1598 1567
1599 FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu, 1568 FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu,
1600 "Maximize Options", "heading for maximization options"); 1569 "Maximize Options", "heading for maximization options");
1601 FbTk::Menu *maxmenu = createMenu(maxmenu_label); 1570 FbTk::RefCount<FbTk::Menu> maxmenu( createMenu(maxmenu_label) );
1602 1571
1603 _BOOLITEM(*maxmenu, Configmenu, FullMax, 1572 _BOOLITEM(*maxmenu, Configmenu, FullMax,
1604 "Full Maximization", "Maximise over slit, toolbar, etc", 1573 "Full Maximization", "Maximise over slit, toolbar, etc",
@@ -1624,9 +1593,9 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1624 FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu, 1593 FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu,
1625 "Tab Options", 1594 "Tab Options",
1626 "heading for tab-related options"); 1595 "heading for tab-related options");
1627 FbTk::Menu *tab_menu = createMenu(tabmenu_label); 1596 FbTk::RefCount<FbTk::Menu> tab_menu( createMenu(tabmenu_label) );
1628 FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"); 1597 FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu");
1629 FbTk::Menu *tabplacement_menu = createToggleMenu(tabplacement_label); 1598 FbTk::RefCount<FbTk::Menu> tabplacement_menu( createToggleMenu(tabplacement_label) );
1630 1599
1631 tab_menu->insert(tabplacement_label, tabplacement_menu); 1600 tab_menu->insert(tabplacement_label, tabplacement_menu);
1632 1601
@@ -1694,7 +1663,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1694 FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency, 1663 FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency,
1695 "Transparency", 1664 "Transparency",
1696 "Menu containing various transparency options"); 1665 "Menu containing various transparency options");
1697 FbTk::Menu *alpha_menu = createMenu(alphamenu_label); 1666 FbTk::RefCount<FbTk::Menu> alpha_menu( createMenu(alphamenu_label) );
1698 1667
1699 if (FbTk::Transparent::haveComposite(true)) { 1668 if (FbTk::Transparent::haveComposite(true)) {
1700 static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans()); 1669 static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans());