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-11-01 09:57:20 (GMT)
commitf2709b26d8af7292f750fc05525ac90ad0d99c41 (patch)
tree794903544922abe2b90af6250de24124cd94d546 /src/Screen.cc
parent0584414d3845239202d5ea02da2ce6fb5b1b0cbb (diff)
downloadfluxbox_pavel-f2709b26d8af7292f750fc05525ac90ad0d99c41.zip
fluxbox_pavel-f2709b26d8af7292f750fc05525ac90ad0d99c41.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 2f83047..a5b7d59 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);
@@ -1492,7 +1461,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1492 FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel, 1461 FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel,
1493 "Focus Model", 1462 "Focus Model",
1494 "Method used to give focus to windows"); 1463 "Method used to give focus to windows");
1495 FbTk::Menu *focus_menu = createMenu(focusmenu_label); 1464 FbTk::RefCount<FbTk::Menu> focus_menu( createMenu(focusmenu_label) );
1496 1465
1497#define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f)) 1466#define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f))
1498 1467
@@ -1549,7 +1518,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1549 1518
1550 FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu, 1519 FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu,
1551 "Maximize Options", "heading for maximization options"); 1520 "Maximize Options", "heading for maximization options");
1552 FbTk::Menu *maxmenu = createMenu(maxmenu_label); 1521 FbTk::RefCount<FbTk::Menu> maxmenu( createMenu(maxmenu_label) );
1553 1522
1554 _BOOLITEM(*maxmenu, Configmenu, FullMax, 1523 _BOOLITEM(*maxmenu, Configmenu, FullMax,
1555 "Full Maximization", "Maximise over slit, toolbar, etc", 1524 "Full Maximization", "Maximise over slit, toolbar, etc",
@@ -1575,9 +1544,9 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1575 FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu, 1544 FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu,
1576 "Tab Options", 1545 "Tab Options",
1577 "heading for tab-related options"); 1546 "heading for tab-related options");
1578 FbTk::Menu *tab_menu = createMenu(tabmenu_label); 1547 FbTk::RefCount<FbTk::Menu> tab_menu( createMenu(tabmenu_label) );
1579 FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"); 1548 FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu");
1580 FbTk::Menu *tabplacement_menu = createToggleMenu(tabplacement_label); 1549 FbTk::RefCount<FbTk::Menu> tabplacement_menu( createToggleMenu(tabplacement_label) );
1581 1550
1582 tab_menu->insert(tabplacement_label, tabplacement_menu); 1551 tab_menu->insert(tabplacement_label, tabplacement_menu);
1583 1552
@@ -1645,7 +1614,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1645 FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency, 1614 FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency,
1646 "Transparency", 1615 "Transparency",
1647 "Menu containing various transparency options"); 1616 "Menu containing various transparency options");
1648 FbTk::Menu *alpha_menu = createMenu(alphamenu_label); 1617 FbTk::RefCount<FbTk::Menu> alpha_menu( createMenu(alphamenu_label) );
1649 1618
1650 if (FbTk::Transparent::haveComposite(true)) { 1619 if (FbTk::Transparent::haveComposite(true)) {
1651 static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans()); 1620 static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans());