moved commandline parsing to its own function

This commit is contained in:
Mathias Gumz 2010-09-17 15:51:16 +02:00
parent e84c64f7be
commit d3eabeb805
2 changed files with 132 additions and 86 deletions

View file

@ -183,7 +183,7 @@ int calcSquareDistance(int x1, int y1, int x2, int y2) {
class TabPlacementMenuItem: public FbTk::RadioMenuItem { class TabPlacementMenuItem: public FbTk::RadioMenuItem {
public: public:
TabPlacementMenuItem(const FbTk::FbString & label, BScreen &screen, TabPlacementMenuItem(FbTk::FbString & label, BScreen &screen,
FbWinFrame::TabPlacement place, FbWinFrame::TabPlacement place,
FbTk::RefCount<FbTk::Command<void> > &cmd): FbTk::RefCount<FbTk::Command<void> > &cmd):
FbTk::RadioMenuItem(label, cmd), FbTk::RadioMenuItem(label, cmd),
@ -208,28 +208,6 @@ void clampMenuDelay(int& delay) {
delay = FbTk::Util::clamp(delay, 0, 5000); delay = FbTk::Util::clamp(delay, 0, 5000);
} }
struct TabPlacementString {
FbWinFrame::TabPlacement placement;
const char* str;
};
const TabPlacementString placement_strings[] = {
{ FbWinFrame::TOPLEFT, "TopLeft" },
{ FbWinFrame::TOP, "Top" },
{ FbWinFrame::TOPRIGHT, "TopRight" },
{ FbWinFrame::BOTTOMLEFT, "BottomLeft" },
{ FbWinFrame::BOTTOM, "Bottom" },
{ FbWinFrame::BOTTOMRIGHT, "BottomRight" },
{ FbWinFrame::LEFTBOTTOM, "LeftBottom" },
{ FbWinFrame::LEFT, "Left" },
{ FbWinFrame::LEFTTOP, "LeftTop" },
{ FbWinFrame::RIGHTBOTTOM, "RightBottom" },
{ FbWinFrame::RIGHT, "Right" },
{ FbWinFrame::RIGHTTOP, "RightTop" }
};
} // end anonymous namespace } // end anonymous namespace
@ -239,24 +217,76 @@ namespace FbTk {
template<> template<>
string FbTk::Resource<FbWinFrame::TabPlacement>:: string FbTk::Resource<FbWinFrame::TabPlacement>::
getString() const { getString() const {
switch (m_value) {
size_t i = (m_value == FbTk::Util::clamp(m_value, FbWinFrame::TOPLEFT, FbWinFrame::RIGHTTOP) case FbWinFrame::TOPLEFT:
? m_value return string("TopLeft");
: FbWinFrame::DEFAULT) - 1; break;
return placement_strings[i].str; case FbWinFrame::BOTTOMLEFT:
return string("BottomLeft");
break;
case FbWinFrame::TOP:
return string("Top");
break;
case FbWinFrame::BOTTOM:
return string("Bottom");
break;
case FbWinFrame::TOPRIGHT:
return string("TopRight");
break;
case FbWinFrame::BOTTOMRIGHT:
return string("BottomRight");
break;
case FbWinFrame::LEFTTOP:
return string("LeftTop");
break;
case FbWinFrame::LEFT:
return string("Left");
break;
case FbWinFrame::LEFTBOTTOM:
return string("LeftBottom");
break;
case FbWinFrame::RIGHTTOP:
return string("RightTop");
break;
case FbWinFrame::RIGHT:
return string("Right");
break;
case FbWinFrame::RIGHTBOTTOM:
return string("RightBottom");
break;
}
//default string
return string("TopLeft");
} }
template<> template<>
void FbTk::Resource<FbWinFrame::TabPlacement>:: void FbTk::Resource<FbWinFrame::TabPlacement>::
setFromString(const char *strval) { setFromString(const char *strval) {
if (strcasecmp(strval, "TopLeft") == 0)
size_t i; m_value = FbWinFrame::TOPLEFT;
for (i = 0; i < sizeof(placement_strings)/sizeof(TabPlacementString); ++i) { else if (strcasecmp(strval, "BottomLeft") == 0)
if (strcasecmp(strval, placement_strings[i].str) == 0) { m_value = FbWinFrame::BOTTOMLEFT;
m_value = placement_strings[i].placement; else if (strcasecmp(strval, "Top") == 0)
return; m_value = FbWinFrame::TOP;
} else if (strcasecmp(strval, "Bottom") == 0)
} m_value = FbWinFrame::BOTTOM;
else if (strcasecmp(strval, "TopRight") == 0)
m_value = FbWinFrame::TOPRIGHT;
else if (strcasecmp(strval, "BottomRight") == 0)
m_value = FbWinFrame::BOTTOMRIGHT;
else if (strcasecmp(strval, "LeftTop") == 0)
m_value = FbWinFrame::LEFTTOP;
else if (strcasecmp(strval, "Left") == 0)
m_value = FbWinFrame::LEFT;
else if (strcasecmp(strval, "LeftBottom") == 0)
m_value = FbWinFrame::LEFTBOTTOM;
else if (strcasecmp(strval, "RightTop") == 0)
m_value = FbWinFrame::RIGHTTOP;
else if (strcasecmp(strval, "Right") == 0)
m_value = FbWinFrame::RIGHT;
else if (strcasecmp(strval, "RightBottom") == 0)
m_value = FbWinFrame::RIGHTBOTTOM;
else
setDefaultValue(); setDefaultValue();
} }
@ -1619,41 +1649,41 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
tab_width_item->setCommand(save_and_reconftabs); tab_width_item->setCommand(save_and_reconftabs);
tab_menu->insert(tab_width_item); tab_menu->insert(tab_width_item);
// menu is 3 wide, 5 down
struct PlacementP {
const FbTk::FbString label;
FbWinFrame::TabPlacement placement;
};
static const PlacementP place_menu[] = {
{ _FB_XTEXT(Align, TopLeft, "Top Left", "Top Left"), FbWinFrame::TOPLEFT}, typedef pair<FbTk::FbString, FbWinFrame::TabPlacement> PlacementP;
{ _FB_XTEXT(Align, LeftTop, "Left Top", "Left Top"), FbWinFrame::LEFTTOP}, typedef list<PlacementP> Placements;
{ _FB_XTEXT(Align, LeftCenter, "Left Center", "Left Center"), FbWinFrame::LEFT}, Placements place_menu;
{ _FB_XTEXT(Align, LeftBottom, "Left Bottom", "Left Bottom"), FbWinFrame::LEFTBOTTOM},
{ _FB_XTEXT(Align, BottomLeft, "Bottom Left", "Bottom Left"), FbWinFrame::BOTTOMLEFT}, // menu is 3 wide, 5 down
{ _FB_XTEXT(Align, TopCenter, "Top Center", "Top Center"), FbWinFrame::TOP}, place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopLeft, "Top Left", "Top Left"), FbWinFrame::TOPLEFT));
{ "", FbWinFrame::TOPLEFT}, place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftTop, "Left Top", "Left Top"), FbWinFrame::LEFTTOP));
{ "", FbWinFrame::TOPLEFT}, place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftCenter, "Left Center", "Left Center"), FbWinFrame::LEFT));
{ "", FbWinFrame::TOPLEFT}, place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftBottom, "Left Bottom", "Left Bottom"), FbWinFrame::LEFTBOTTOM));
{ _FB_XTEXT(Align, BottomCenter, "Bottom Center", "Bottom Center"), FbWinFrame::BOTTOM}, place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomLeft, "Bottom Left", "Bottom Left"), FbWinFrame::BOTTOMLEFT));
{ _FB_XTEXT(Align, TopRight, "Top Right", "Top Right"), FbWinFrame::TOPRIGHT}, place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopCenter, "Top Center", "Top Center"), FbWinFrame::TOP));
{ _FB_XTEXT(Align, RightTop, "Right Top", "Right Top"), FbWinFrame::RIGHTTOP}, place_menu.push_back(PlacementP("", FbWinFrame::TOPLEFT));
{ _FB_XTEXT(Align, RightCenter, "Right Center", "Right Center"), FbWinFrame::RIGHT}, place_menu.push_back(PlacementP("", FbWinFrame::TOPLEFT));
{ _FB_XTEXT(Align, RightBottom, "Right Bottom", "Right Bottom"), FbWinFrame::RIGHTBOTTOM}, place_menu.push_back(PlacementP("", FbWinFrame::TOPLEFT));
{ _FB_XTEXT(Align, BottomRight, "Bottom Right", "Bottom Right"), FbWinFrame::BOTTOMRIGHT} place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomCenter, "Bottom Center", "Bottom Center"), FbWinFrame::BOTTOM));
}; place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopRight, "Top Right", "Top Right"), FbWinFrame::TOPRIGHT));
place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightTop, "Right Top", "Right Top"), FbWinFrame::RIGHTTOP));
place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightCenter, "Right Center", "Right Center"), FbWinFrame::RIGHT));
place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightBottom, "Right Bottom", "Right Bottom"), FbWinFrame::RIGHTBOTTOM));
place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomRight, "Bottom Right", "Bottom Right"), FbWinFrame::BOTTOMRIGHT));
tabplacement_menu->setMinimumSublevels(3); tabplacement_menu->setMinimumSublevels(3);
// create items in sub menu // create items in sub menu
for (size_t i=0; i< sizeof(place_menu)/sizeof(PlacementP); ++i) { for (size_t i=0; i<15; ++i) {
const PlacementP& p = place_menu[i]; FbTk::FbString &str = place_menu.front().first;
if (p.label == "") { FbWinFrame::TabPlacement placement = place_menu.front().second;
tabplacement_menu->insert(p.label); if (str == "") {
tabplacement_menu->insert("");
tabplacement_menu->setItemEnabled(i, false); tabplacement_menu->setItemEnabled(i, false);
} else } else {
tabplacement_menu->insert(new TabPlacementMenuItem(p.label, *this, p.placement, save_and_reconftabs)); tabplacement_menu->insert(new TabPlacementMenuItem(str, *this, placement, save_and_reconftabs));
}
place_menu.pop_front();
} }
tabplacement_menu->updateMenu(); tabplacement_menu->updateMenu();
menu.insert(tabmenu_label, tab_menu); menu.insert(tabmenu_label, tab_menu);

View file

@ -182,14 +182,15 @@ static void showInfo(ostream &ostr) {
endl; endl;
} }
int main(int argc, char **argv) { struct Options {
std::string session_display;
std::string rc_file;
std::string log_filename;
bool xsync;
};
string session_display(""); static void parseOptions(int argc, char** argv, Options& opts) {
string rc_file;
string log_filename;
bool xsync = false;
FbTk::NLSInit("fluxbox.cat");
_FB_USES_NLS; _FB_USES_NLS;
int i; int i;
@ -204,7 +205,7 @@ int main(int argc, char **argv) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
rc_file = argv[i]; opts.rc_file = argv[i];
} else if (arg == "-display" || arg == "--display") { } else if (arg == "-display" || arg == "--display") {
// check for -display option... to run on a display other than the one // check for -display option... to run on a display other than the one
// set by the environment variable DISPLAY // set by the environment variable DISPLAY
@ -216,8 +217,8 @@ int main(int argc, char **argv) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
session_display = argv[i]; opts.session_display = argv[i];
string display_env = "DISPLAY=" + session_display; string display_env = "DISPLAY=" + opts.session_display;
if (putenv(const_cast<char *>(display_env.c_str()))) { if (putenv(const_cast<char *>(display_env.c_str()))) {
cerr<<_FB_CONSOLETEXT(main, WarnDisplayEnv, cerr<<_FB_CONSOLETEXT(main, WarnDisplayEnv,
"warning: couldn't set environment variable 'DISPLAY'", "warning: couldn't set environment variable 'DISPLAY'",
@ -226,16 +227,16 @@ int main(int argc, char **argv) {
} }
} else if (arg == "-version" || arg == "-v" || arg == "--version") { } else if (arg == "-version" || arg == "-v" || arg == "--version") {
// print current version string // print current version string
cout << "Fluxbox " << __fluxbox_version << " : (c) 2001-2008 Fluxbox Team " << endl << endl; cout << "Fluxbox " << __fluxbox_version << " : (c) 2001-2010 Fluxbox Team " << endl << endl;
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} else if (arg == "-log" || arg == "--log") { } else if (arg == "-log" || arg == "--log") {
if (++i >= argc) { if (++i >= argc) {
cerr<<_FB_CONSOLETEXT(main, LOGRequiresArg, "error: '-log' needs an argument", "")<<endl; cerr<<_FB_CONSOLETEXT(main, LOGRequiresArg, "error: '-log' needs an argument", "")<<endl;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
log_filename = argv[i]; opts.log_filename = argv[i];
} else if (arg == "-sync" || arg == "--sync") { } else if (arg == "-sync" || arg == "--sync") {
xsync = true; opts.xsync = true;
} else if (arg == "-help" || arg == "-h" || arg == "--help") { } else if (arg == "-help" || arg == "-h" || arg == "--help") {
// print program usage and command line options // print program usage and command line options
printf(_FB_CONSOLETEXT(main, Usage, printf(_FB_CONSOLETEXT(main, Usage,
@ -252,7 +253,7 @@ int main(int argc, char **argv) {
"-help\t\t\t\tdisplay this help text and exit.\n\n", "-help\t\t\t\tdisplay this help text and exit.\n\n",
"Main usage string. Please lay it out nicely. There is one %s that is given the version").c_str(), "Main usage string. Please lay it out nicely. There is one %s that is given the version").c_str(),
__fluxbox_version, "2001-2008"); __fluxbox_version, "2001-2010");
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} else if (arg == "-info" || arg == "-i" || arg == "--info") { } else if (arg == "-info" || arg == "-i" || arg == "--info") {
showInfo(cout); showInfo(cout);
@ -268,23 +269,34 @@ int main(int argc, char **argv) {
FbTk::ThemeManager::instance().setVerbose(true); FbTk::ThemeManager::instance().setVerbose(true);
} }
} }
}
int main(int argc, char **argv) {
FbTk::NLSInit("fluxbox.cat");
Options opts;
parseOptions(argc, argv, opts);
#ifdef __EMX__ #ifdef __EMX__
_chdir2(getenv("X11ROOT")); _chdir2(getenv("X11ROOT"));
#endif // __EMX__ #endif // __EMX__
auto_ptr<Fluxbox> fluxbox; auto_ptr<Fluxbox> fluxbox;
int exitcode=EXIT_FAILURE;
streambuf *outbuf = 0; streambuf *outbuf = 0;
streambuf *errbuf = 0; streambuf *errbuf = 0;
ofstream log_file(log_filename.c_str()); ofstream log_file(opts.log_filename.c_str());
_FB_USES_NLS;
// setup log file // setup log file
if (log_file) { if (log_file.is_open()) {
cerr<<_FB_CONSOLETEXT(main, LoggingTo, "Logging to", "Logging to a file")<<": "<<log_filename<<endl; cerr<<_FB_CONSOLETEXT(main, LoggingTo, "Logging to", "Logging to a file")<<": "<<opts.log_filename<<endl;
log_file<<"------------------------------------------"<<endl; log_file<<"------------------------------------------"<<endl;
log_file<<_FB_CONSOLETEXT(main, LogFile, "Log File", "")<<": "<<log_filename<<endl; log_file<<_FB_CONSOLETEXT(main, LogFile, "Log File", "")<<": "<<opts.log_filename<<endl;
showInfo(log_file); showInfo(log_file);
log_file<<"------------------------------------------"<<endl; log_file<<"------------------------------------------"<<endl;
// setup log to use cout and cerr stream // setup log to use cout and cerr stream
@ -292,10 +304,14 @@ int main(int argc, char **argv) {
errbuf = cerr.rdbuf(log_file.rdbuf()); errbuf = cerr.rdbuf(log_file.rdbuf());
} }
int exitcode = EXIT_FAILURE;
try { try {
fluxbox.reset(new Fluxbox(argc, argv, session_display.c_str(), fluxbox.reset(new Fluxbox(argc, argv,
rc_file.c_str(), xsync)); opts.session_display.c_str(),
opts.rc_file.c_str(),
opts.xsync));
fluxbox->eventLoop(); fluxbox->eventLoop();
exitcode = EXIT_SUCCESS; exitcode = EXIT_SUCCESS;