From 7debbae5bdb8e8ec759e76d655f3b970613e3fb4 Mon Sep 17 00:00:00 2001 From: fluxgen <fluxgen> Date: Thu, 9 Jan 2003 17:41:02 +0000 Subject: removed iconmenu, changed workspacemenu and rootmenu to FbTk Menu and removed setAutoGroupWindow, disabled Stylemenu --- src/Screen.cc | 299 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 163 insertions(+), 136 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index 7a8ef48..c1543d7 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Screen.cc,v 1.94 2003/01/07 02:06:06 fluxgen Exp $ +// $Id: Screen.cc,v 1.95 2003/01/09 17:41:02 fluxgen Exp $ #include "Screen.hh" @@ -33,16 +33,15 @@ #include "Toolbar.hh" #include "Window.hh" #include "Workspace.hh" -#include "Rootmenu.hh" #include "Workspacemenu.hh" #include "Configmenu.hh" -#include "Iconmenu.hh" #include "StringUtil.hh" #include "Netizen.hh" #include "DirHelper.hh" #include "WinButton.hh" #include "SimpleCommand.hh" #include "MenuTheme.hh" +#include "FbCommands.hh" //use GNU extensions #ifndef _GNU_SOURCE @@ -131,6 +130,9 @@ int dcmp(const void *one, const void *two) { return (strcmp((*(char **) one), (*(char **) two))); } +FbTk::Menu *createMenuFromScreen(BScreen &screen) { + return new FbTk::Menu(*screen.menuTheme(), screen.getScreenNumber(), *screen.getImageControl()); +} }; //---------- resource manipulators --------- @@ -235,6 +237,38 @@ getString() { return string("BottomCenter"); } +namespace { +class AddWorkspaceCmd:public FbTk::Command { +public: + explicit AddWorkspaceCmd(BScreen &scrn):m_screen(scrn) { } + void execute() { + m_screen.addWorkspace(); + } +private: + BScreen &m_screen; +}; + +class RemoveLastWorkspaceCmd:public FbTk::Command { +public: + explicit RemoveLastWorkspaceCmd(BScreen &scrn):m_screen(scrn) { } + void execute() { + m_screen.removeLastWorkspace(); + } +private: + BScreen &m_screen; +}; + +void setupWorkspacemenu(BScreen &scr, FbTk::Menu &menu) { + menu.removeAll(); // clear all items + using namespace FbTk; + + RefCount<Command> new_workspace(new AddWorkspaceCmd(scr)); + RefCount<Command> remove_last(new RemoveLastWorkspaceCmd(scr)); + menu.insert("New Workspace", new_workspace); + menu.insert("Remove Last", remove_last); +} + +}; BScreen::ScreenResource::ScreenResource(ResourceManager &rm, const std::string &scrname, const std::string &altscrname): @@ -275,7 +309,7 @@ BScreen::BScreen(ResourceManager &rm, m_currentworkspace_sig(*this), // current workspace signal theme(0), m_windowtheme(scrn), m_menutheme(new FbTk::MenuTheme(scrn)), - resource(rm, screenname, altscreenname) + resource(rm, screenname, altscreenname) { Display *disp = BaseDisplay::getXDisplay(); @@ -297,9 +331,9 @@ BScreen::BScreen(ResourceManager &rm, fprintf(stderr, i18n-> getMessage( - FBNLS::ScreenSet, FBNLS::ScreenManagingScreen, - "BScreen::BScreen: managing screen %d " - "using visual 0x%lx, depth %d\n"), + FBNLS::ScreenSet, FBNLS::ScreenManagingScreen, + "BScreen::BScreen: managing screen %d " + "using visual 0x%lx, depth %d\n"), getScreenNumber(), XVisualIDFromVisual(getVisual()), getDepth()); @@ -341,8 +375,8 @@ BScreen::BScreen(ResourceManager &rm, } const char *s = i18n->getMessage( - FBNLS::ScreenSet, FBNLS::ScreenPositionLength, - "W: 0000 x H: 0000"); // W is wide! + FBNLS::ScreenSet, FBNLS::ScreenPositionLength, + "W: 0000 x H: 0000"); // W is wide! int l = strlen(s); @@ -388,8 +422,9 @@ BScreen::BScreen(ResourceManager &rm, } } - workspacemenu = new Workspacemenu(this); - m_iconmenu = new Iconmenu(this); + workspacemenu.reset(new FbTk::Menu(*m_menutheme, scrn, *image_control)); + setupWorkspacemenu(*this, *workspacemenu); + configmenu = new Configmenu(this); Workspace *wkspc = (Workspace *) 0; @@ -405,13 +440,6 @@ BScreen::BScreen(ResourceManager &rm, workspacemenu->insert(wkspc->name().c_str(), &wkspc->menu()); } - workspacemenu->insert(i18n-> - getMessage( - FBNLS::IconSet, FBNLS::IconIcons, - "Icons"), - m_iconmenu); - workspacemenu->update(); - current_workspace = workspacesList.front(); workspacemenu->setItemSelected(2, true); @@ -476,7 +504,7 @@ BScreen::BScreen(ResourceManager &rm, continue; if (attrib.map_state != IsUnmapped) { - FluxboxWindow *win = createWindow(children[i]); + FluxboxWindow *win = createWindow(children[i]); if (win) { XMapRequestEvent mre; @@ -530,8 +558,6 @@ BScreen::~BScreen() { } netizenList.clear(); - delete workspacemenu; - delete m_iconmenu; delete configmenu; delete image_control; @@ -560,7 +586,7 @@ unsigned int BScreen::getMaxBottom() const { } void BScreen::iconUpdate() { - m_iconmenu->update(); + } void BScreen::reconfigure() { @@ -632,7 +658,6 @@ void BScreen::reconfigure() { //reconfigure menus workspacemenu->reconfigure(); - m_iconmenu->reconfigure(); configmenu->reconfigure(); @@ -698,8 +723,6 @@ void BScreen::addIcon(FluxboxWindow *w) { iconList.push_back(w); - m_iconmenu->insert(w->getIconTitle().c_str()); - m_iconmenu->update(); m_toolbar->addIcon(w); } @@ -719,8 +742,6 @@ void BScreen::removeIcon(FluxboxWindow *w) { } } - m_iconmenu->remove(w->getWindowNumber()); - m_iconmenu->update(); m_toolbar->delIcon(w); Icons::iterator it = iconList.begin(); @@ -1130,8 +1151,6 @@ void BScreen::raiseWindows(const Workspace::Stack &workspace_stack) { Window session_stack[(workspace_stack.size() + workspacesList.size() + rootmenuList.size() + 30)]; int i = 0; - XRaiseWindow(getBaseDisplay()->getXDisplay(), m_iconmenu->windowID()); - session_stack[i++] = m_iconmenu->windowID(); Workspaces::iterator wit = workspacesList.begin(); Workspaces::iterator wit_end = workspacesList.end(); @@ -1359,7 +1378,7 @@ void BScreen::initMenu() { while (m_rootmenu->numberOfItems()) m_rootmenu->remove(0); } else - m_rootmenu.reset(new Rootmenu(this)); + m_rootmenu.reset(new FbTk::Menu(*m_menutheme.get(), getScreenNumber(), *getImageControl())); bool defaultMenu = true; Fluxbox * const fb = Fluxbox::instance(); @@ -1383,7 +1402,7 @@ void BScreen::initMenu() { err = StringUtil::getStringBetween(label, line.c_str()+pos, '(', ')'); if (err>0) { m_rootmenu->setLabel(label.c_str()); - defaultMenu = parseMenuFile(menu_file, m_rootmenu.get(), row); + defaultMenu = parseMenuFile(menu_file, *m_rootmenu.get(), row); } else cerr<<"Error in menufile. Line("<<row<<")"<<endl; break; @@ -1393,8 +1412,8 @@ void BScreen::initMenu() { } else { fprintf(stderr, i18n->getMessage( - FBNLS::ScreenSet, FBNLS::ScreenEmptyMenuFile, - "%s: Empty menu file"), + FBNLS::ScreenSet, FBNLS::ScreenEmptyMenuFile, + "%s: Empty menu file"), fb->getMenuFilename()); } menu_file.close(); @@ -1403,28 +1422,28 @@ void BScreen::initMenu() { } if (defaultMenu) { + FbTk::RefCount<FbTk::Command> restart_fb(new FbCommands::RestartFluxboxCmd()); + FbTk::RefCount<FbTk::Command> exit_fb(new FbCommands::ExitFluxboxCmd()); + FbTk::RefCount<FbTk::Command> execute_xterm(new FbCommands::ExecuteCmd("xterm")); m_rootmenu->setInternalMenu(); m_rootmenu->insert(i18n->getMessage( - FBNLS::ScreenSet, FBNLS::Screenxterm, - "xterm"), - BScreen::EXECUTE, - i18n->getMessage( - FBNLS::ScreenSet, FBNLS::Screenxterm, - "xterm")); + FBNLS::ScreenSet, FBNLS::Screenxterm, + "xterm"), + execute_xterm); m_rootmenu->insert(i18n->getMessage( - FBNLS::ScreenSet, FBNLS::ScreenRestart, - "Restart"), - BScreen::RESTART); + FBNLS::ScreenSet, FBNLS::ScreenRestart, + "Restart"), + restart_fb); m_rootmenu->insert(i18n->getMessage( - FBNLS::ScreenSet, FBNLS::ScreenExit, - "Exit"), - BScreen::EXIT); + FBNLS::ScreenSet, FBNLS::ScreenExit, + "Exit"), + exit_fb); } else fb->saveMenuFilename(fb->getMenuFilename()); } // looks through a menufile and adds correct items to the root-menu. -bool BScreen::parseMenuFile(ifstream &file, Rootmenu *menu, int &row) { +bool BScreen::parseMenuFile(ifstream &file, FbTk::Menu &menu, int &row) { string line; @@ -1454,69 +1473,73 @@ bool BScreen::parseMenuFile(ifstream &file, Rootmenu *menu, int &row) { I18n *i18n = I18n::instance(); if (str_key == "end") { - return ((menu->numberOfItems() == 0) ? true : false); + return ((menu.numberOfItems() == 0) ? true : false); } else if (str_key == "nop") { - menu->insert(str_label.c_str()); + menu.insert(str_label.c_str()); } else if (str_key == "exec") { // exec if (!(str_label.size() && str_cmd.size())) { fprintf(stderr, i18n->getMessage( - FBNLS::ScreenSet, FBNLS::ScreenEXECError, - "BScreen::parseMenuFile: [exec] error, " - "no menu label and/or command defined\n")); + FBNLS::ScreenSet, FBNLS::ScreenEXECError, + "BScreen::parseMenuFile: [exec] error, " + "no menu label and/or command defined\n")); cerr<<"Row: "<<row<<endl; - } else - menu->insert(str_label.c_str(), BScreen::EXECUTE, str_cmd.c_str()); - + } else { + FbTk::RefCount<FbTk::Command> exec_cmd(new FbCommands::ExecuteCmd(str_cmd)); + menu.insert(str_label.c_str(), exec_cmd); + } } else if (str_key == "exit") { // exit if (!str_label.size()) { fprintf(stderr, i18n->getMessage( - FBNLS::ScreenSet, FBNLS::ScreenEXITError, - "BScreen::parseMenuFile: [exit] error, " - "no menu label defined\n")); - cerr<<"Row: "<<row<<endl; - } else - menu->insert(str_label.c_str(), BScreen::EXIT); - } // end of exit - else if (str_key == "style") { // style - if (!( str_label.size() && str_cmd.size())) { - fprintf(stderr, - i18n-> - getMessage( - FBNLS::ScreenSet, FBNLS::ScreenSTYLEError, - "BScreen::parseMenuFile: [style] error, " - "no menu label and/or filename defined\n")); + FBNLS::ScreenSet, FBNLS::ScreenEXITError, + "BScreen::parseMenuFile: [exit] error, " + "no menu label defined\n")); cerr<<"Row: "<<row<<endl; } else { - // perform shell style ~ home directory expansion - // and insert style - menu->insert(str_label.c_str(), BScreen::SETSTYLE, - StringUtil::expandFilename(str_cmd).c_str()); - + FbTk::RefCount<FbTk::Command> exit_fb_cmd(new FbCommands::ExitFluxboxCmd()); + menu.insert(str_label.c_str(), exit_fb_cmd); } - } // end of style - - else if (str_key == "config") { - if (! str_label.size()) { - fprintf(stderr, - i18n-> - getMessage( - FBNLS::ScreenSet, FBNLS::ScreenCONFIGError, - "BScreen::parseMenufile: [config] error, " - "no label defined")); - cerr<<"Row: "<<row<<endl; - } else - menu->insert(str_label.c_str(), configmenu); - } // end of config + } // end of exit + /*else if (str_key == "style") { // style + if (!( str_label.size() && str_cmd.size())) { + fprintf(stderr, + i18n-> + getMessage( + FBNLS::ScreenSet, FBNLS::ScreenSTYLEError, + "BScreen::parseMenuFile: [style] error, " + "no menu label and/or filename defined\n")); + cerr<<"Row: "<<row<<endl; + } else { + // perform shell style ~ home directory expansion + // and insert style + menu->insert(str_label.c_str(), BScreen::SETSTYLE, + StringUtil::expandFilename(str_cmd).c_str()); + + } + } // end of style + */ + /* else if (str_key == "config") { + if (! str_label.size()) { + fprintf(stderr, + i18n-> + getMessage( + FBNLS::ScreenSet, FBNLS::ScreenCONFIGError, + "BScreen::parseMenufile: [config] error, " + "no label defined")); + cerr<<"Row: "<<row<<endl; + } else + menu.insert(str_label.c_str(), configmenu); + } // end of config + */ else if ( str_key == "include") { // include if (!str_label.size()) { fprintf(stderr, i18n-> getMessage( - FBNLS::ScreenSet, FBNLS::ScreenINCLUDEError, - "BScreen::parseMenuFile: [include] error, " - "no filename defined\n")); + FBNLS::ScreenSet, FBNLS::ScreenINCLUDEError, + "BScreen::parseMenuFile: [include] error, " + "no filename defined\n")); cerr<<"Row: "<<row<<endl; } else { // start of else 'x' // perform shell style ~ home directory expansion @@ -1532,9 +1555,9 @@ bool BScreen::parseMenuFile(ifstream &file, Rootmenu *menu, int &row) { fprintf(stderr, i18n-> getMessage( - FBNLS::ScreenSet, FBNLS::ScreenINCLUDEErrorReg, - "BScreen::parseMenuFile: [include] error: " - "'%s' is not a regular file\n"), newfile.c_str()); + FBNLS::ScreenSet, FBNLS::ScreenINCLUDEErrorReg, + "BScreen::parseMenuFile: [include] error: " + "'%s' is not a regular file\n"), newfile.c_str()); cerr<<"Row: "<<row<<endl; } @@ -1554,21 +1577,21 @@ bool BScreen::parseMenuFile(ifstream &file, Rootmenu *menu, int &row) { fprintf(stderr, i18n-> getMessage( - FBNLS::ScreenSet, FBNLS::ScreenSUBMENUError, - "BScreen::parseMenuFile: [submenu] error, " - "no menu label defined\n")); + FBNLS::ScreenSet, FBNLS::ScreenSUBMENUError, + "BScreen::parseMenuFile: [submenu] error, " + "no menu label defined\n")); cerr<<"Row: "<<row<<endl; } else { - Rootmenu *submenu = new Rootmenu(this); + FbTk::Menu *submenu = createMenuFromScreen(*this); if (str_cmd.size()) submenu->setLabel(str_cmd.c_str()); else submenu->setLabel(str_label.c_str()); - parseMenuFile(file, submenu, row); + parseMenuFile(file, *submenu, row); submenu->update(); - menu->insert(str_label.c_str(), submenu); + menu.insert(str_label.c_str(), submenu); rootmenuList.push_back(submenu); } @@ -1578,15 +1601,17 @@ bool BScreen::parseMenuFile(ifstream &file, Rootmenu *menu, int &row) { fprintf(stderr, i18n-> getMessage( - FBNLS::ScreenSet, FBNLS::ScreenRESTARTError, - "BScreen::parseMenuFile: [restart] error, " - "no menu label defined\n")); + FBNLS::ScreenSet, FBNLS::ScreenRESTARTError, + "BScreen::parseMenuFile: [restart] error, " + "no menu label defined\n")); cerr<<"Row: "<<row<<endl; } else { - if (str_cmd.size()) - menu->insert(str_label.c_str(), BScreen::RESTARTOTHER, str_cmd.c_str()); - else - menu->insert(str_label.c_str(), BScreen::RESTART); + /* if (str_cmd.size()) + menu.insert(str_label.c_str(), BScreen::RESTARTOTHER, str_cmd.c_str()); + else + */ + FbTk::RefCount<FbTk::Command> restart_fb(new FbCommands::RestartFluxboxCmd()); + menu.insert(str_label.c_str(), restart_fb); } } // end of restart else if (str_key == "reconfig") { // reconf @@ -1594,48 +1619,50 @@ bool BScreen::parseMenuFile(ifstream &file, Rootmenu *menu, int &row) { fprintf(stderr, i18n-> getMessage( - FBNLS::ScreenSet, FBNLS::ScreenRECONFIGError, - "BScreen::parseMenuFile: [reconfig] error, " - "no menu label defined\n")); + FBNLS::ScreenSet, FBNLS::ScreenRECONFIGError, + "BScreen::parseMenuFile: [reconfig] error, " + "no menu label defined\n")); cerr<<"Row: "<<row<<endl; - } else - menu->insert(str_label.c_str(), BScreen::RECONFIGURE); + } else { + FbTk::RefCount<FbTk::Command> reconfig_fb_cmd(new FbCommands::ReconfigureFluxboxCmd()); + menu.insert(str_label.c_str(), reconfig_fb_cmd); + } } // end of reconf - else if (str_key == "stylesdir" || str_key == "stylesmenu") { - bool newmenu = (str_key == "stylesmenu"); - if (!( str_label.size() && str_cmd.size()) && newmenu) { - fprintf(stderr, - i18n-> - getMessage( - FBNLS::ScreenSet, FBNLS::ScreenSTYLESDIRError, - "BScreen::parseMenuFile: [stylesdir/stylesmenu]" - " error, no directory defined\n")); - cerr<<"Row: "<<row<<endl; - } else { // else 'y' - createStyleMenu(menu, newmenu, str_label.c_str(), - (newmenu) ? str_cmd.c_str() : str_label.c_str()); - } // end of else 'y' - } // end of stylesdir + /* else if (str_key == "stylesdir" || str_key == "stylesmenu") { + bool newmenu = (str_key == "stylesmenu"); + if (!( str_label.size() && str_cmd.size()) && newmenu) { + fprintf(stderr, + i18n-> + getMessage( + FBNLS::ScreenSet, FBNLS::ScreenSTYLESDIRError, + "BScreen::parseMenuFile: [stylesdir/stylesmenu]" + " error, no directory defined\n")); + cerr<<"Row: "<<row<<endl; + } else { // else 'y' + createStyleMenu(menu, newmenu, str_label.c_str(), + (newmenu) ? str_cmd.c_str() : str_label.c_str()); + } // end of else 'y' + } */// end of stylesdir else if (str_key == "workspaces") { if (!str_label.size()) { fprintf(stderr, i18n->getMessage( - FBNLS::ScreenSet, FBNLS::ScreenWORKSPACESError, - "BScreen:parseMenuFile: [workspaces] error, " - "no menu label defined\n")); + FBNLS::ScreenSet, FBNLS::ScreenWORKSPACESError, + "BScreen:parseMenuFile: [workspaces] error, " + "no menu label defined\n")); cerr<<"Row: "<<row<<endl; } else - menu->insert(str_label.c_str(), workspacemenu); + menu.insert(str_label.c_str(), workspacemenu.get()); } // end of work } } } - return ((menu->numberOfItems() == 0) ? true : false); + return ((menu.numberOfItems() == 0) ? true : false); } -void BScreen::createStyleMenu(Rootmenu *menu, bool newmenu, const char *label, const char *directory) { - +void BScreen::createStyleMenu(FbTk::Menu &menu, bool newmenu, const char *label, const char *directory) { + /* // perform shell style ~ home directory expansion string stylesdir(StringUtil::expandFilename(directory ? directory : "")); @@ -1684,7 +1711,7 @@ void BScreen::createStyleMenu(Rootmenu *menu, bool newmenu, const char *label, c if (newmenu) { stylesmenu->setLabel(label); menu->insert(label, stylesmenu); - rootmenuList.push_back(stylesmenu); + // rootmenuList.push_back(stylesmenu); } Fluxbox::instance()->saveMenuFilename(stylesdir.c_str()); @@ -1705,7 +1732,7 @@ void BScreen::createStyleMenu(Rootmenu *menu, bool newmenu, const char *label, c "BScreen::parseMenuFile: [stylesdir/stylesmenu]" " error, %s does not exist\n"), stylesdir.c_str()); } // end of 'stat' - + */ } void BScreen::shutdown() { -- cgit v0.11.2