aboutsummaryrefslogtreecommitdiff
path: root/src/Screen.cc
diff options
context:
space:
mode:
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 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
861void BScreen::addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu) { 831void
862 menu->setInternalMenu(); 832BScreen::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
1405void BScreen::initMenus() { 1375void 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
1463void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { 1432void 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
1469void BScreen::removeConfigMenu(FbTk::Menu &menu) { 1438void 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());