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 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()); |