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 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
846void BScreen::addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu) { 816void
847 menu->setInternalMenu(); 817BScreen::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
1394void BScreen::initMenus() { 1364void 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
1452void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { 1421void 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
1458void BScreen::removeConfigMenu(FbTk::Menu &menu) { 1427void 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());