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 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 | ||
838 | void BScreen::addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu) { | 808 | void |
839 | menu->setInternalMenu(); | 809 | BScreen::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 | ||
1386 | void BScreen::initMenus() { | 1356 | void 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 | ||
1444 | void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { | 1413 | void 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 | ||
1450 | void BScreen::removeConfigMenu(FbTk::Menu &menu) { | 1419 | void 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()); |