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