diff options
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 ae31806..d19a0b4 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" |
@@ -453,7 +452,6 @@ BScreen::BScreen(FbTk::ResourceManager_base &rm, | |||
453 | m_current_workspace = m_workspaces_list.front(); | 452 | m_current_workspace = m_workspaces_list.front(); |
454 | 453 | ||
455 | m_windowmenu.reset(createMenu("")); | 454 | m_windowmenu.reset(createMenu("")); |
456 | m_windowmenu->setInternalMenu(); | ||
457 | m_windowmenu->setReloadHelper(new FbTk::AutoReloadHelper()); | 455 | m_windowmenu->setReloadHelper(new FbTk::AutoReloadHelper()); |
458 | m_windowmenu->reloadHelper()->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<BScreen>(*this, &BScreen::rereadWindowMenu))); | 456 | m_windowmenu->reloadHelper()->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<BScreen>(*this, &BScreen::rereadWindowMenu))); |
459 | 457 | ||
@@ -464,7 +462,6 @@ BScreen::BScreen(FbTk::ResourceManager_base &rm, | |||
464 | m_configmenu.reset(createMenu(_FB_XTEXT(Menu, Configuration, | 462 | m_configmenu.reset(createMenu(_FB_XTEXT(Menu, Configuration, |
465 | "Configuration", "Title of configuration menu"))); | 463 | "Configuration", "Title of configuration menu"))); |
466 | setupConfigmenu(*m_configmenu.get()); | 464 | setupConfigmenu(*m_configmenu.get()); |
467 | m_configmenu->setInternalMenu(); | ||
468 | 465 | ||
469 | // check which desktop we should start on | 466 | // check which desktop we should start on |
470 | unsigned int first_desktop = 0; | 467 | unsigned int first_desktop = 0; |
@@ -510,34 +507,7 @@ BScreen::~BScreen() { | |||
510 | // we need to destroy it before we destroy workspaces | 507 | // we need to destroy it before we destroy workspaces |
511 | m_workspacemenu.reset(0); | 508 | m_workspacemenu.reset(0); |
512 | 509 | ||
513 | if (m_extramenus.size()) { | 510 | m_extramenus.clear(); |
514 | // check whether extramenus are included in windowmenu | ||
515 | // if not, we clean them ourselves | ||
516 | bool extramenus_in_windowmenu = false; | ||
517 | for (size_t i = 0, n = m_windowmenu->numberOfItems(); i < n; i++) | ||
518 | if (m_windowmenu->find(i)->submenu() == m_extramenus.begin()->second) { | ||
519 | extramenus_in_windowmenu = true; | ||
520 | break; | ||
521 | } | ||
522 | |||
523 | ExtraMenus::iterator mit = m_extramenus.begin(); | ||
524 | ExtraMenus::iterator mit_end = m_extramenus.end(); | ||
525 | for (; mit != mit_end; ++mit) { | ||
526 | // we set them to NOT internal so that they will be deleted when the | ||
527 | // menu is cleaned up. We can't delete them here because they are | ||
528 | // still in the menu | ||
529 | // (They need to be internal for most of the time so that if we | ||
530 | // rebuild the menu, then they won't be removed. | ||
531 | if (! extramenus_in_windowmenu) { | ||
532 | // not attached to our windowmenu | ||
533 | // so we clean it up | ||
534 | delete mit->second; | ||
535 | } else { | ||
536 | // let the parent clean it up | ||
537 | mit->second->setInternalMenu(false); | ||
538 | } | ||
539 | } | ||
540 | } | ||
541 | 511 | ||
542 | removeWorkspaceNames(); | 512 | removeWorkspaceNames(); |
543 | using namespace FbTk::STLUtil; | 513 | using namespace FbTk::STLUtil; |
@@ -565,9 +535,9 @@ BScreen::~BScreen() { | |||
565 | m_slit.reset(0); | 535 | m_slit.reset(0); |
566 | 536 | ||
567 | 537 | ||
568 | delete m_rootmenu.release(); | 538 | m_rootmenu.reset(0); |
569 | delete m_workspacemenu.release(); | 539 | m_workspacemenu.reset(0); |
570 | delete m_windowmenu.release(); | 540 | m_windowmenu.reset(0); |
571 | 541 | ||
572 | // TODO fluxgen: check if this is the right place | 542 | // TODO fluxgen: check if this is the right place |
573 | for (size_t i = 0; i < m_head_areas.size(); i++) | 543 | for (size_t i = 0; i < m_head_areas.size(); i++) |
@@ -858,8 +828,8 @@ FbMenu *BScreen::createToggleMenu(const string &label) { | |||
858 | return menu; | 828 | return menu; |
859 | } | 829 | } |
860 | 830 | ||
861 | void BScreen::addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu) { | 831 | void |
862 | menu->setInternalMenu(); | 832 | BScreen::addExtraWindowMenu(const FbTk::FbString &label, const FbTk::RefCount<FbTk::Menu> &menu) { |
863 | menu->disableTitle(); | 833 | menu->disableTitle(); |
864 | m_extramenus.push_back(make_pair(label, menu)); | 834 | m_extramenus.push_back(make_pair(label, menu)); |
865 | rereadWindowMenu(); | 835 | rereadWindowMenu(); |
@@ -1403,7 +1373,7 @@ void BScreen::reassociateWindow(FluxboxWindow *w, unsigned int wkspc_id, | |||
1403 | } | 1373 | } |
1404 | 1374 | ||
1405 | void BScreen::initMenus() { | 1375 | void BScreen::initMenus() { |
1406 | m_workspacemenu.reset(MenuCreator::createMenuType("workspacemenu", screenNumber())); | 1376 | m_workspacemenu = MenuCreator::createMenuType("workspacemenu", screenNumber()); |
1407 | 1377 | ||
1408 | m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename()); | 1378 | m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename()); |
1409 | m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename()); | 1379 | m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename()); |
@@ -1429,7 +1399,6 @@ void BScreen::rereadMenu() { | |||
1429 | FbTk::RefCount<FbTk::Command<void> > restart_fb(FbTk::CommandParser<void>::instance().parse("restart")); | 1399 | FbTk::RefCount<FbTk::Command<void> > restart_fb(FbTk::CommandParser<void>::instance().parse("restart")); |
1430 | FbTk::RefCount<FbTk::Command<void> > exit_fb(FbTk::CommandParser<void>::instance().parse("exit")); | 1400 | FbTk::RefCount<FbTk::Command<void> > exit_fb(FbTk::CommandParser<void>::instance().parse("exit")); |
1431 | FbTk::RefCount<FbTk::Command<void> > execute_xterm(FbTk::CommandParser<void>::instance().parse("exec xterm")); | 1401 | FbTk::RefCount<FbTk::Command<void> > execute_xterm(FbTk::CommandParser<void>::instance().parse("exec xterm")); |
1432 | m_rootmenu->setInternalMenu(); | ||
1433 | m_rootmenu->insert("xterm", execute_xterm); | 1402 | m_rootmenu->insert("xterm", execute_xterm); |
1434 | m_rootmenu->insert(_FB_XTEXT(Menu, Reconfigure, "Reconfigure", | 1403 | m_rootmenu->insert(_FB_XTEXT(Menu, Reconfigure, "Reconfigure", |
1435 | "Reload Configuration command")), | 1404 | "Reload Configuration command")), |
@@ -1460,16 +1429,16 @@ void BScreen::rereadWindowMenu() { | |||
1460 | MenuCreator::createMenu(*m_windowmenu, l, m_windowmenu->reloadHelper()); | 1429 | MenuCreator::createMenu(*m_windowmenu, l, m_windowmenu->reloadHelper()); |
1461 | } | 1430 | } |
1462 | 1431 | ||
1463 | void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { | 1432 | void BScreen::addConfigMenu(const FbTk::FbString &label, const FbTk::RefCount<FbTk::Menu> &menu) { |
1464 | m_configmenu_list.push_back(make_pair(label, &menu)); | 1433 | m_configmenu_list.push_back(make_pair(label, menu)); |
1465 | if (m_configmenu.get()) | 1434 | if (m_configmenu.get()) |
1466 | setupConfigmenu(*m_configmenu.get()); | 1435 | setupConfigmenu(*m_configmenu.get()); |
1467 | } | 1436 | } |
1468 | 1437 | ||
1469 | void BScreen::removeConfigMenu(FbTk::Menu &menu) { | 1438 | void BScreen::removeConfigMenu(const FbTk::RefCount<FbTk::Menu> &menu) { |
1470 | Configmenus::iterator erase_it = find_if(m_configmenu_list.begin(), | 1439 | Configmenus::iterator erase_it = find_if(m_configmenu_list.begin(), |
1471 | m_configmenu_list.end(), | 1440 | m_configmenu_list.end(), |
1472 | FbTk::Compose(bind2nd(equal_to<FbTk::Menu *>(), &menu), | 1441 | FbTk::Compose(bind2nd(equal_to<FbTk::RefCount<FbTk::Menu> >(), menu), |
1473 | FbTk::Select2nd<Configmenus::value_type>())); | 1442 | FbTk::Select2nd<Configmenus::value_type>())); |
1474 | if (erase_it != m_configmenu_list.end()) | 1443 | if (erase_it != m_configmenu_list.end()) |
1475 | m_configmenu_list.erase(erase_it); | 1444 | m_configmenu_list.erase(erase_it); |
@@ -1560,7 +1529,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1560 | FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel, | 1529 | FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel, |
1561 | "Focus Model", | 1530 | "Focus Model", |
1562 | "Method used to give focus to windows"); | 1531 | "Method used to give focus to windows"); |
1563 | FbTk::Menu *focus_menu = createMenu(focusmenu_label); | 1532 | FbTk::RefCount<FbTk::Menu> focus_menu( createMenu(focusmenu_label) ); |
1564 | 1533 | ||
1565 | #define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f)) | 1534 | #define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f)) |
1566 | 1535 | ||
@@ -1628,7 +1597,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1628 | 1597 | ||
1629 | FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu, | 1598 | FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu, |
1630 | "Maximize Options", "heading for maximization options"); | 1599 | "Maximize Options", "heading for maximization options"); |
1631 | FbTk::Menu *maxmenu = createMenu(maxmenu_label); | 1600 | FbTk::RefCount<FbTk::Menu> maxmenu( createMenu(maxmenu_label) ); |
1632 | 1601 | ||
1633 | _BOOLITEM(*maxmenu, Configmenu, FullMax, | 1602 | _BOOLITEM(*maxmenu, Configmenu, FullMax, |
1634 | "Full Maximization", "Maximise over slit, toolbar, etc", | 1603 | "Full Maximization", "Maximise over slit, toolbar, etc", |
@@ -1654,9 +1623,9 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1654 | FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu, | 1623 | FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu, |
1655 | "Tab Options", | 1624 | "Tab Options", |
1656 | "heading for tab-related options"); | 1625 | "heading for tab-related options"); |
1657 | FbTk::Menu *tab_menu = createMenu(tabmenu_label); | 1626 | FbTk::RefCount<FbTk::Menu> tab_menu( createMenu(tabmenu_label) ); |
1658 | FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"); | 1627 | FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"); |
1659 | FbTk::Menu *tabplacement_menu = createToggleMenu(tabplacement_label); | 1628 | FbTk::RefCount<FbTk::Menu> tabplacement_menu( createToggleMenu(tabplacement_label) ); |
1660 | 1629 | ||
1661 | tab_menu->insert(tabplacement_label, tabplacement_menu); | 1630 | tab_menu->insert(tabplacement_label, tabplacement_menu); |
1662 | 1631 | ||
@@ -1724,7 +1693,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1724 | FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency, | 1693 | FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency, |
1725 | "Transparency", | 1694 | "Transparency", |
1726 | "Menu containing various transparency options"); | 1695 | "Menu containing various transparency options"); |
1727 | FbTk::Menu *alpha_menu = createMenu(alphamenu_label); | 1696 | FbTk::RefCount<FbTk::Menu> alpha_menu( createMenu(alphamenu_label) ); |
1728 | 1697 | ||
1729 | if (FbTk::Transparent::haveComposite(true)) { | 1698 | if (FbTk::Transparent::haveComposite(true)) { |
1730 | static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans()); | 1699 | static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans()); |