diff options
author | Mathias Gumz <akira at fluxbox dot org> | 2010-09-17 13:51:16 (GMT) |
---|---|---|
committer | Mathias Gumz <akira at fluxbox dot org> | 2010-09-17 13:51:16 (GMT) |
commit | d3eabeb805fdbd162c0743ed86a67e014e37c097 (patch) | |
tree | de06d61dd922934e739b9a33008c2da4f721b9d2 | |
parent | e84c64f7be701e04ec2a2e0fbf980aa4fc9685ad (diff) | |
download | fluxbox-d3eabeb805fdbd162c0743ed86a67e014e37c097.zip fluxbox-d3eabeb805fdbd162c0743ed86a67e014e37c097.tar.bz2 |
moved commandline parsing to its own function
-rw-r--r-- | src/Screen.cc | 162 | ||||
-rw-r--r-- | src/main.cc | 56 |
2 files changed, 132 insertions, 86 deletions
diff --git a/src/Screen.cc b/src/Screen.cc index daa87dc..0677a14 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -183,7 +183,7 @@ int calcSquareDistance(int x1, int y1, int x2, int y2) { | |||
183 | 183 | ||
184 | class TabPlacementMenuItem: public FbTk::RadioMenuItem { | 184 | class TabPlacementMenuItem: public FbTk::RadioMenuItem { |
185 | public: | 185 | public: |
186 | TabPlacementMenuItem(const FbTk::FbString & label, BScreen &screen, | 186 | TabPlacementMenuItem(FbTk::FbString & label, BScreen &screen, |
187 | FbWinFrame::TabPlacement place, | 187 | FbWinFrame::TabPlacement place, |
188 | FbTk::RefCount<FbTk::Command<void> > &cmd): | 188 | FbTk::RefCount<FbTk::Command<void> > &cmd): |
189 | FbTk::RadioMenuItem(label, cmd), | 189 | FbTk::RadioMenuItem(label, cmd), |
@@ -208,28 +208,6 @@ void clampMenuDelay(int& delay) { | |||
208 | delay = FbTk::Util::clamp(delay, 0, 5000); | 208 | delay = FbTk::Util::clamp(delay, 0, 5000); |
209 | } | 209 | } |
210 | 210 | ||
211 | |||
212 | struct TabPlacementString { | ||
213 | FbWinFrame::TabPlacement placement; | ||
214 | const char* str; | ||
215 | }; | ||
216 | |||
217 | const TabPlacementString placement_strings[] = { | ||
218 | { FbWinFrame::TOPLEFT, "TopLeft" }, | ||
219 | { FbWinFrame::TOP, "Top" }, | ||
220 | { FbWinFrame::TOPRIGHT, "TopRight" }, | ||
221 | { FbWinFrame::BOTTOMLEFT, "BottomLeft" }, | ||
222 | { FbWinFrame::BOTTOM, "Bottom" }, | ||
223 | { FbWinFrame::BOTTOMRIGHT, "BottomRight" }, | ||
224 | { FbWinFrame::LEFTBOTTOM, "LeftBottom" }, | ||
225 | { FbWinFrame::LEFT, "Left" }, | ||
226 | { FbWinFrame::LEFTTOP, "LeftTop" }, | ||
227 | { FbWinFrame::RIGHTBOTTOM, "RightBottom" }, | ||
228 | { FbWinFrame::RIGHT, "Right" }, | ||
229 | { FbWinFrame::RIGHTTOP, "RightTop" } | ||
230 | }; | ||
231 | |||
232 | |||
233 | } // end anonymous namespace | 211 | } // end anonymous namespace |
234 | 212 | ||
235 | 213 | ||
@@ -239,25 +217,77 @@ namespace FbTk { | |||
239 | template<> | 217 | template<> |
240 | string FbTk::Resource<FbWinFrame::TabPlacement>:: | 218 | string FbTk::Resource<FbWinFrame::TabPlacement>:: |
241 | getString() const { | 219 | getString() const { |
242 | 220 | switch (m_value) { | |
243 | size_t i = (m_value == FbTk::Util::clamp(m_value, FbWinFrame::TOPLEFT, FbWinFrame::RIGHTTOP) | 221 | case FbWinFrame::TOPLEFT: |
244 | ? m_value | 222 | return string("TopLeft"); |
245 | : FbWinFrame::DEFAULT) - 1; | 223 | break; |
246 | return placement_strings[i].str; | 224 | case FbWinFrame::BOTTOMLEFT: |
225 | return string("BottomLeft"); | ||
226 | break; | ||
227 | case FbWinFrame::TOP: | ||
228 | return string("Top"); | ||
229 | break; | ||
230 | case FbWinFrame::BOTTOM: | ||
231 | return string("Bottom"); | ||
232 | break; | ||
233 | case FbWinFrame::TOPRIGHT: | ||
234 | return string("TopRight"); | ||
235 | break; | ||
236 | case FbWinFrame::BOTTOMRIGHT: | ||
237 | return string("BottomRight"); | ||
238 | break; | ||
239 | case FbWinFrame::LEFTTOP: | ||
240 | return string("LeftTop"); | ||
241 | break; | ||
242 | case FbWinFrame::LEFT: | ||
243 | return string("Left"); | ||
244 | break; | ||
245 | case FbWinFrame::LEFTBOTTOM: | ||
246 | return string("LeftBottom"); | ||
247 | break; | ||
248 | case FbWinFrame::RIGHTTOP: | ||
249 | return string("RightTop"); | ||
250 | break; | ||
251 | case FbWinFrame::RIGHT: | ||
252 | return string("Right"); | ||
253 | break; | ||
254 | case FbWinFrame::RIGHTBOTTOM: | ||
255 | return string("RightBottom"); | ||
256 | break; | ||
257 | } | ||
258 | //default string | ||
259 | return string("TopLeft"); | ||
247 | } | 260 | } |
248 | 261 | ||
249 | template<> | 262 | template<> |
250 | void FbTk::Resource<FbWinFrame::TabPlacement>:: | 263 | void FbTk::Resource<FbWinFrame::TabPlacement>:: |
251 | setFromString(const char *strval) { | 264 | setFromString(const char *strval) { |
252 | 265 | if (strcasecmp(strval, "TopLeft") == 0) | |
253 | size_t i; | 266 | m_value = FbWinFrame::TOPLEFT; |
254 | for (i = 0; i < sizeof(placement_strings)/sizeof(TabPlacementString); ++i) { | 267 | else if (strcasecmp(strval, "BottomLeft") == 0) |
255 | if (strcasecmp(strval, placement_strings[i].str) == 0) { | 268 | m_value = FbWinFrame::BOTTOMLEFT; |
256 | m_value = placement_strings[i].placement; | 269 | else if (strcasecmp(strval, "Top") == 0) |
257 | return; | 270 | m_value = FbWinFrame::TOP; |
258 | } | 271 | else if (strcasecmp(strval, "Bottom") == 0) |
259 | } | 272 | m_value = FbWinFrame::BOTTOM; |
260 | setDefaultValue(); | 273 | else if (strcasecmp(strval, "TopRight") == 0) |
274 | m_value = FbWinFrame::TOPRIGHT; | ||
275 | else if (strcasecmp(strval, "BottomRight") == 0) | ||
276 | m_value = FbWinFrame::BOTTOMRIGHT; | ||
277 | else if (strcasecmp(strval, "LeftTop") == 0) | ||
278 | m_value = FbWinFrame::LEFTTOP; | ||
279 | else if (strcasecmp(strval, "Left") == 0) | ||
280 | m_value = FbWinFrame::LEFT; | ||
281 | else if (strcasecmp(strval, "LeftBottom") == 0) | ||
282 | m_value = FbWinFrame::LEFTBOTTOM; | ||
283 | else if (strcasecmp(strval, "RightTop") == 0) | ||
284 | m_value = FbWinFrame::RIGHTTOP; | ||
285 | else if (strcasecmp(strval, "Right") == 0) | ||
286 | m_value = FbWinFrame::RIGHT; | ||
287 | else if (strcasecmp(strval, "RightBottom") == 0) | ||
288 | m_value = FbWinFrame::RIGHTBOTTOM; | ||
289 | else | ||
290 | setDefaultValue(); | ||
261 | } | 291 | } |
262 | 292 | ||
263 | } // end namespace FbTk | 293 | } // end namespace FbTk |
@@ -1619,41 +1649,41 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) { | |||
1619 | tab_width_item->setCommand(save_and_reconftabs); | 1649 | tab_width_item->setCommand(save_and_reconftabs); |
1620 | tab_menu->insert(tab_width_item); | 1650 | tab_menu->insert(tab_width_item); |
1621 | 1651 | ||
1652 | |||
1653 | typedef pair<FbTk::FbString, FbWinFrame::TabPlacement> PlacementP; | ||
1654 | typedef list<PlacementP> Placements; | ||
1655 | Placements place_menu; | ||
1656 | |||
1622 | // menu is 3 wide, 5 down | 1657 | // menu is 3 wide, 5 down |
1623 | struct PlacementP { | 1658 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopLeft, "Top Left", "Top Left"), FbWinFrame::TOPLEFT)); |
1624 | const FbTk::FbString label; | 1659 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftTop, "Left Top", "Left Top"), FbWinFrame::LEFTTOP)); |
1625 | FbWinFrame::TabPlacement placement; | 1660 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftCenter, "Left Center", "Left Center"), FbWinFrame::LEFT)); |
1626 | }; | 1661 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftBottom, "Left Bottom", "Left Bottom"), FbWinFrame::LEFTBOTTOM)); |
1627 | static const PlacementP place_menu[] = { | 1662 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomLeft, "Bottom Left", "Bottom Left"), FbWinFrame::BOTTOMLEFT)); |
1628 | 1663 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopCenter, "Top Center", "Top Center"), FbWinFrame::TOP)); | |
1629 | { _FB_XTEXT(Align, TopLeft, "Top Left", "Top Left"), FbWinFrame::TOPLEFT}, | 1664 | place_menu.push_back(PlacementP("", FbWinFrame::TOPLEFT)); |
1630 | { _FB_XTEXT(Align, LeftTop, "Left Top", "Left Top"), FbWinFrame::LEFTTOP}, | 1665 | place_menu.push_back(PlacementP("", FbWinFrame::TOPLEFT)); |
1631 | { _FB_XTEXT(Align, LeftCenter, "Left Center", "Left Center"), FbWinFrame::LEFT}, | 1666 | place_menu.push_back(PlacementP("", FbWinFrame::TOPLEFT)); |
1632 | { _FB_XTEXT(Align, LeftBottom, "Left Bottom", "Left Bottom"), FbWinFrame::LEFTBOTTOM}, | 1667 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomCenter, "Bottom Center", "Bottom Center"), FbWinFrame::BOTTOM)); |
1633 | { _FB_XTEXT(Align, BottomLeft, "Bottom Left", "Bottom Left"), FbWinFrame::BOTTOMLEFT}, | 1668 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopRight, "Top Right", "Top Right"), FbWinFrame::TOPRIGHT)); |
1634 | { _FB_XTEXT(Align, TopCenter, "Top Center", "Top Center"), FbWinFrame::TOP}, | 1669 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightTop, "Right Top", "Right Top"), FbWinFrame::RIGHTTOP)); |
1635 | { "", FbWinFrame::TOPLEFT}, | 1670 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightCenter, "Right Center", "Right Center"), FbWinFrame::RIGHT)); |
1636 | { "", FbWinFrame::TOPLEFT}, | 1671 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightBottom, "Right Bottom", "Right Bottom"), FbWinFrame::RIGHTBOTTOM)); |
1637 | { "", FbWinFrame::TOPLEFT}, | 1672 | place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomRight, "Bottom Right", "Bottom Right"), FbWinFrame::BOTTOMRIGHT)); |
1638 | { _FB_XTEXT(Align, BottomCenter, "Bottom Center", "Bottom Center"), FbWinFrame::BOTTOM}, | ||
1639 | { _FB_XTEXT(Align, TopRight, "Top Right", "Top Right"), FbWinFrame::TOPRIGHT}, | ||
1640 | { _FB_XTEXT(Align, RightTop, "Right Top", "Right Top"), FbWinFrame::RIGHTTOP}, | ||
1641 | { _FB_XTEXT(Align, RightCenter, "Right Center", "Right Center"), FbWinFrame::RIGHT}, | ||
1642 | { _FB_XTEXT(Align, RightBottom, "Right Bottom", "Right Bottom"), FbWinFrame::RIGHTBOTTOM}, | ||
1643 | { _FB_XTEXT(Align, BottomRight, "Bottom Right", "Bottom Right"), FbWinFrame::BOTTOMRIGHT} | ||
1644 | }; | ||
1645 | 1673 | ||
1646 | tabplacement_menu->setMinimumSublevels(3); | 1674 | tabplacement_menu->setMinimumSublevels(3); |
1647 | // create items in sub menu | 1675 | // create items in sub menu |
1648 | for (size_t i=0; i< sizeof(place_menu)/sizeof(PlacementP); ++i) { | 1676 | for (size_t i=0; i<15; ++i) { |
1649 | const PlacementP& p = place_menu[i]; | 1677 | FbTk::FbString &str = place_menu.front().first; |
1650 | if (p.label == "") { | 1678 | FbWinFrame::TabPlacement placement = place_menu.front().second; |
1651 | tabplacement_menu->insert(p.label); | 1679 | if (str == "") { |
1680 | tabplacement_menu->insert(""); | ||
1652 | tabplacement_menu->setItemEnabled(i, false); | 1681 | tabplacement_menu->setItemEnabled(i, false); |
1653 | } else | 1682 | } else { |
1654 | tabplacement_menu->insert(new TabPlacementMenuItem(p.label, *this, p.placement, save_and_reconftabs)); | 1683 | tabplacement_menu->insert(new TabPlacementMenuItem(str, *this, placement, save_and_reconftabs)); |
1684 | } | ||
1685 | place_menu.pop_front(); | ||
1655 | } | 1686 | } |
1656 | |||
1657 | tabplacement_menu->updateMenu(); | 1687 | tabplacement_menu->updateMenu(); |
1658 | 1688 | ||
1659 | menu.insert(tabmenu_label, tab_menu); | 1689 | menu.insert(tabmenu_label, tab_menu); |
diff --git a/src/main.cc b/src/main.cc index d65212b..dc42b27 100644 --- a/src/main.cc +++ b/src/main.cc | |||
@@ -182,14 +182,15 @@ static void showInfo(ostream &ostr) { | |||
182 | endl; | 182 | endl; |
183 | } | 183 | } |
184 | 184 | ||
185 | int main(int argc, char **argv) { | 185 | struct Options { |
186 | std::string session_display; | ||
187 | std::string rc_file; | ||
188 | std::string log_filename; | ||
189 | bool xsync; | ||
190 | }; | ||
186 | 191 | ||
187 | string session_display(""); | 192 | static void parseOptions(int argc, char** argv, Options& opts) { |
188 | string rc_file; | ||
189 | string log_filename; | ||
190 | bool xsync = false; | ||
191 | 193 | ||
192 | FbTk::NLSInit("fluxbox.cat"); | ||
193 | _FB_USES_NLS; | 194 | _FB_USES_NLS; |
194 | 195 | ||
195 | int i; | 196 | int i; |
@@ -204,7 +205,7 @@ int main(int argc, char **argv) { | |||
204 | exit(EXIT_FAILURE); | 205 | exit(EXIT_FAILURE); |
205 | } | 206 | } |
206 | 207 | ||
207 | rc_file = argv[i]; | 208 | opts.rc_file = argv[i]; |
208 | } else if (arg == "-display" || arg == "--display") { | 209 | } else if (arg == "-display" || arg == "--display") { |
209 | // check for -display option... to run on a display other than the one | 210 | // check for -display option... to run on a display other than the one |
210 | // set by the environment variable DISPLAY | 211 | // set by the environment variable DISPLAY |
@@ -216,8 +217,8 @@ int main(int argc, char **argv) { | |||
216 | exit(EXIT_FAILURE); | 217 | exit(EXIT_FAILURE); |
217 | } | 218 | } |
218 | 219 | ||
219 | session_display = argv[i]; | 220 | opts.session_display = argv[i]; |
220 | string display_env = "DISPLAY=" + session_display; | 221 | string display_env = "DISPLAY=" + opts.session_display; |
221 | if (putenv(const_cast<char *>(display_env.c_str()))) { | 222 | if (putenv(const_cast<char *>(display_env.c_str()))) { |
222 | cerr<<_FB_CONSOLETEXT(main, WarnDisplayEnv, | 223 | cerr<<_FB_CONSOLETEXT(main, WarnDisplayEnv, |
223 | "warning: couldn't set environment variable 'DISPLAY'", | 224 | "warning: couldn't set environment variable 'DISPLAY'", |
@@ -226,16 +227,16 @@ int main(int argc, char **argv) { | |||
226 | } | 227 | } |
227 | } else if (arg == "-version" || arg == "-v" || arg == "--version") { | 228 | } else if (arg == "-version" || arg == "-v" || arg == "--version") { |
228 | // print current version string | 229 | // print current version string |
229 | cout << "Fluxbox " << __fluxbox_version << " : (c) 2001-2008 Fluxbox Team " << endl << endl; | 230 | cout << "Fluxbox " << __fluxbox_version << " : (c) 2001-2010 Fluxbox Team " << endl << endl; |
230 | exit(EXIT_SUCCESS); | 231 | exit(EXIT_SUCCESS); |
231 | } else if (arg == "-log" || arg == "--log") { | 232 | } else if (arg == "-log" || arg == "--log") { |
232 | if (++i >= argc) { | 233 | if (++i >= argc) { |
233 | cerr<<_FB_CONSOLETEXT(main, LOGRequiresArg, "error: '-log' needs an argument", "")<<endl; | 234 | cerr<<_FB_CONSOLETEXT(main, LOGRequiresArg, "error: '-log' needs an argument", "")<<endl; |
234 | exit(EXIT_FAILURE); | 235 | exit(EXIT_FAILURE); |
235 | } | 236 | } |
236 | log_filename = argv[i]; | 237 | opts.log_filename = argv[i]; |
237 | } else if (arg == "-sync" || arg == "--sync") { | 238 | } else if (arg == "-sync" || arg == "--sync") { |
238 | xsync = true; | 239 | opts.xsync = true; |
239 | } else if (arg == "-help" || arg == "-h" || arg == "--help") { | 240 | } else if (arg == "-help" || arg == "-h" || arg == "--help") { |
240 | // print program usage and command line options | 241 | // print program usage and command line options |
241 | printf(_FB_CONSOLETEXT(main, Usage, | 242 | printf(_FB_CONSOLETEXT(main, Usage, |
@@ -252,7 +253,7 @@ int main(int argc, char **argv) { | |||
252 | "-help\t\t\t\tdisplay this help text and exit.\n\n", | 253 | "-help\t\t\t\tdisplay this help text and exit.\n\n", |
253 | 254 | ||
254 | "Main usage string. Please lay it out nicely. There is one %s that is given the version").c_str(), | 255 | "Main usage string. Please lay it out nicely. There is one %s that is given the version").c_str(), |
255 | __fluxbox_version, "2001-2008"); | 256 | __fluxbox_version, "2001-2010"); |
256 | exit(EXIT_SUCCESS); | 257 | exit(EXIT_SUCCESS); |
257 | } else if (arg == "-info" || arg == "-i" || arg == "--info") { | 258 | } else if (arg == "-info" || arg == "-i" || arg == "--info") { |
258 | showInfo(cout); | 259 | showInfo(cout); |
@@ -268,23 +269,34 @@ int main(int argc, char **argv) { | |||
268 | FbTk::ThemeManager::instance().setVerbose(true); | 269 | FbTk::ThemeManager::instance().setVerbose(true); |
269 | } | 270 | } |
270 | } | 271 | } |
272 | } | ||
273 | |||
274 | |||
275 | |||
276 | int main(int argc, char **argv) { | ||
277 | |||
278 | FbTk::NLSInit("fluxbox.cat"); | ||
279 | |||
280 | Options opts; | ||
281 | parseOptions(argc, argv, opts); | ||
271 | 282 | ||
272 | #ifdef __EMX__ | 283 | #ifdef __EMX__ |
273 | _chdir2(getenv("X11ROOT")); | 284 | _chdir2(getenv("X11ROOT")); |
274 | #endif // __EMX__ | 285 | #endif // __EMX__ |
275 | auto_ptr<Fluxbox> fluxbox; | 286 | auto_ptr<Fluxbox> fluxbox; |
276 | int exitcode=EXIT_FAILURE; | ||
277 | 287 | ||
278 | streambuf *outbuf = 0; | 288 | streambuf *outbuf = 0; |
279 | streambuf *errbuf = 0; | 289 | streambuf *errbuf = 0; |
280 | 290 | ||
281 | ofstream log_file(log_filename.c_str()); | 291 | ofstream log_file(opts.log_filename.c_str()); |
292 | |||
293 | _FB_USES_NLS; | ||
282 | 294 | ||
283 | // setup log file | 295 | // setup log file |
284 | if (log_file) { | 296 | if (log_file.is_open()) { |
285 | cerr<<_FB_CONSOLETEXT(main, LoggingTo, "Logging to", "Logging to a file")<<": "<<log_filename<<endl; | 297 | cerr<<_FB_CONSOLETEXT(main, LoggingTo, "Logging to", "Logging to a file")<<": "<<opts.log_filename<<endl; |
286 | log_file<<"------------------------------------------"<<endl; | 298 | log_file<<"------------------------------------------"<<endl; |
287 | log_file<<_FB_CONSOLETEXT(main, LogFile, "Log File", "")<<": "<<log_filename<<endl; | 299 | log_file<<_FB_CONSOLETEXT(main, LogFile, "Log File", "")<<": "<<opts.log_filename<<endl; |
288 | showInfo(log_file); | 300 | showInfo(log_file); |
289 | log_file<<"------------------------------------------"<<endl; | 301 | log_file<<"------------------------------------------"<<endl; |
290 | // setup log to use cout and cerr stream | 302 | // setup log to use cout and cerr stream |
@@ -292,10 +304,14 @@ int main(int argc, char **argv) { | |||
292 | errbuf = cerr.rdbuf(log_file.rdbuf()); | 304 | errbuf = cerr.rdbuf(log_file.rdbuf()); |
293 | } | 305 | } |
294 | 306 | ||
307 | int exitcode = EXIT_FAILURE; | ||
308 | |||
295 | try { | 309 | try { |
296 | 310 | ||
297 | fluxbox.reset(new Fluxbox(argc, argv, session_display.c_str(), | 311 | fluxbox.reset(new Fluxbox(argc, argv, |
298 | rc_file.c_str(), xsync)); | 312 | opts.session_display.c_str(), |
313 | opts.rc_file.c_str(), | ||
314 | opts.xsync)); | ||
299 | fluxbox->eventLoop(); | 315 | fluxbox->eventLoop(); |
300 | 316 | ||
301 | exitcode = EXIT_SUCCESS; | 317 | exitcode = EXIT_SUCCESS; |