make apps file keywords case insensitive, plus check it for reload before save on close and other save events
simonb simonb
2 files changed,
104 insertions(+),
82 deletions(-)
M
ChangeLog
→
ChangeLog
@@ -1,5 +1,9 @@
(Format: Year/Month/Day) Changes for 0.9.16: +*06/05/01: + * Make apps file keywords case insensitive, plus reload it (if newer) + before save on close and remember menu events (Simon) + Remember.cc *06/04/26: * Fix resizing of client window when autogroup from apps (Simon) Window.cc
M
src/Remember.cc
→
src/Remember.cc
@@ -49,7 +49,6 @@ #ifndef _GNU_SOURCE
#define _GNU_SOURCE #endif // _GNU_SOURCE - #include <iostream> #include <fstream> #include <string>@@ -60,6 +59,10 @@
using namespace std; namespace { + +bool getuint(const char *val, unsigned int &ret) { + return (sscanf(val, "%ui", &ret) == 1); +} class RememberMenuItem : public FbTk::MenuItem { public:@@ -93,6 +96,8 @@ return false;
} void click(int button, int time) { + // reconfigure only does stuff if the apps file has changed + Remember::instance().reconfigure(); if (WindowCmd<void>::window() != 0) { if (isSelected()) { Remember::instance().forgetAttrib(WindowCmd<void>::window()->winClient(), m_attrib);@@ -154,7 +159,7 @@ // return true if all ok, false on error
bool handleStartupItem(const string &line, int offset) { int next = 0; string str; - int screen = 0; + unsigned int screen = 0; // accept some options, for now only "screen=NN" // these option are given in parentheses before the command@@ -168,9 +173,8 @@ int pos = str.find('=');
bool error = false; if (pos > 0) { option = str.substr(0, pos); - if (option == "screen") { - FbTk_istringstream iss(str.c_str() + pos + 1); - iss >> screen; + if (strcasecmp(option.c_str(), "screen") == 0) { + error = getuint(str.c_str() + pos + 1, screen); } else { error = true; }@@ -337,45 +341,50 @@ }
} else continue; //read next line + bool had_error = false; + if (!str_key.size()) continue; //read next line - if (str_key == "Workspace") { + if (strcasecmp(str_key.c_str(), "Workspace") == 0) { unsigned int w; - FbTk_istringstream iss(str_label.c_str()); - iss >> w; - app.rememberWorkspace(w); - } else if (str_key == "Head") { - int h = atoi(str_label.c_str()); - app.rememberHead(h); - } else if (str_key == "Layer") { + if (getuint(str_label.c_str(), w)) + app.rememberWorkspace(w); + else + had_error = true; + } else if (strcasecmp(str_key.c_str(), "Head") == 0) { + unsigned int h; + if (getuint(str_label.c_str(), h)) + app.rememberHead(h); + else + had_error = true; + } else if (strcasecmp(str_key.c_str(), "Layer") == 0) { unsigned int l; - if (str_label == "DESKTOP") { + if (strcasecmp(str_label.c_str(), "DESKTOP") == 0) { l = Layer::DESKTOP; - } else if (str_label == "BOTTOM") { + } else if (strcasecmp(str_label.c_str(), "BOTTOM") == 0) { l = Layer::BOTTOM; - } else if (str_label == "NORMAL") { + } else if (strcasecmp(str_label.c_str(), "NORMAL") == 0) { l = Layer::NORMAL; - } else if (str_label == "TOP") { + } else if (strcasecmp(str_label.c_str(), "TOP") == 0) { l = Layer::TOP; - } else if (str_label == "DOCK") { + } else if (strcasecmp(str_label.c_str(), "DOCK") == 0) { l = Layer::DOCK; - } else if (str_label == "ABOVEDOCK") { + } else if (strcasecmp(str_label.c_str(), "ABOVEDOCK") == 0) { l = Layer::ABOVE_DOCK; - } else if (str_label == "MENU") { + } else if (strcasecmp(str_label.c_str(), "MENU") == 0) { l = Layer::MENU; - } else { - FbTk_istringstream iss(str_label.c_str()); - iss >> l; + } else if (!getuint(str_label.c_str(), l)) { + had_error = true; } - app.rememberLayer(l); - } else if (str_key == "Dimensions") { + if (!had_error) + app.rememberLayer(l); + } else if (strcasecmp(str_key.c_str(), "Dimensions") == 0) { unsigned int h,w; - FbTk_istringstream iss(str_label.c_str()); - iss >> w >> h; - - app.rememberDimensions(w, h); - - } else if (str_key == "Position") { + if (sscanf(str_label.c_str(), "%i %i", &w, &h) == 2) + app.rememberDimensions(w, h); + else + had_error = true; + } else if (strcasecmp(str_key.c_str(), "Position") == 0) { unsigned int r= 0; unsigned int x= 0; unsigned int y= 0;@@ -384,55 +393,55 @@ // in ::rememberPosition
if ( str_option.length() ) { - if ( str_option == "UPPERLEFT" ) r= POS_UPPERLEFT; - else if ( str_option == "UPPERRIGHT" ) r= POS_UPPERRIGHT; - else if ( str_option == "LOWERLEFT" ) r= POS_LOWERLEFT; - else if ( str_option == "LOWERRIGHT" ) r= POS_LOWERRIGHT; - else if ( str_option == "CENTER" ) r= POS_CENTER; - else if ( str_option == "WINCENTER" ) r= POS_WINCENTER; - else { - FbTk_istringstream iss_r(str_option.c_str()); - iss_r >> r; + if (strcasecmp(str_option.c_str(), "UPPERLEFT") == 0) r= POS_UPPERLEFT; + else if (strcasecmp(str_option.c_str(), "UPPERRIGHT") == 0) r= POS_UPPERRIGHT; + else if (strcasecmp(str_option.c_str(), "LOWERLEFT") == 0) r= POS_LOWERLEFT; + else if (strcasecmp(str_option.c_str(), "LOWERRIGHT") == 0) r= POS_LOWERRIGHT; + else if (strcasecmp(str_option.c_str(), "CENTER") == 0) r= POS_CENTER; + else if (strcasecmp(str_option.c_str(), "WINCENTER") == 0) r= POS_WINCENTER; + else if (!getuint(str_option.c_str(), r)) { + had_error = 1; } } - FbTk_istringstream iss_xy(str_label.c_str()); - iss_xy >> x >> y; - app.rememberPosition(x, y, r); - } else if (str_key == "Shaded") { - app.rememberShadedstate((str_label=="yes")); - } else if (str_key == "Tab") { - app.rememberTabstate((str_label=="yes")); - } else if (str_key == "FocusHidden") { - app.rememberFocusHiddenstate((str_label=="yes")); - } else if (str_key == "IconHidden") { - app.rememberIconHiddenstate((str_label=="yes")); - } else if (str_key == "Hidden") { - app.rememberIconHiddenstate((str_label=="yes")); - app.rememberFocusHiddenstate((str_label=="yes")); - } else if (str_key == "Deco") { - if (str_label == "NONE") { + if (!had_error && sscanf(str_label.c_str(), "%i %i", &x, &y) == 2) + app.rememberPosition(x, y, r); + else + had_error = true; + } else if (strcasecmp(str_key.c_str(), "Shaded") == 0) { + app.rememberShadedstate((strcasecmp(str_label.c_str(), "yes") == 0)); + } else if (strcasecmp(str_key.c_str(), "Tab") == 0) { + app.rememberTabstate((strcasecmp(str_label.c_str(), "yes") == 0)); + } else if (strcasecmp(str_key.c_str(), "FocusHidden") == 0) { + app.rememberFocusHiddenstate((strcasecmp(str_label.c_str(), "yes") == 0)); + } else if (strcasecmp(str_key.c_str(), "IconHidden") == 0) { + app.rememberIconHiddenstate((strcasecmp(str_label.c_str(), "yes") == 0)); + } else if (strcasecmp(str_key.c_str(), "Hidden") == 0) { + app.rememberIconHiddenstate((strcasecmp(str_label.c_str(), "yes") == 0)); + app.rememberFocusHiddenstate((strcasecmp(str_label.c_str(), "yes") == 0)); + } else if (strcasecmp(str_key.c_str(), "Deco") == 0) { + if (strcasecmp(str_label.c_str(), "NONE") == 0) { app.rememberDecostate((unsigned int) 0); - } else if (str_label == "NORMAL") { + } else if (strcasecmp(str_label.c_str(), "NORMAL") == 0) { app.rememberDecostate((unsigned int) 0xfffffff); - } else if (str_label == "TINY") { + } else if (strcasecmp(str_label.c_str(), "TINY") == 0) { app.rememberDecostate((unsigned int) FluxboxWindow::DECORM_TITLEBAR | FluxboxWindow::DECORM_ICONIFY | FluxboxWindow::DECORM_MENU | FluxboxWindow::DECORM_TAB ); - } else if (str_label == "TOOL") { + } else if (strcasecmp(str_label.c_str(), "TOOL") == 0) { app.rememberDecostate((unsigned int) FluxboxWindow::DECORM_TITLEBAR | FluxboxWindow::DECORM_MENU ); - } else if (str_label == "BORDER") { + } else if (strcasecmp(str_label.c_str(), "BORDER") == 0) { app.rememberDecostate((unsigned int) FluxboxWindow::DECORM_BORDER | FluxboxWindow::DECORM_MENU ); - } else if (str_label == "TAB") { + } else if (strcasecmp(str_label.c_str(), "TAB") == 0) { app.rememberDecostate((unsigned int) FluxboxWindow::DECORM_BORDER | FluxboxWindow::DECORM_MENU@@ -440,28 +449,25 @@ | FluxboxWindow::DECORM_TAB
); } else { unsigned int mask; - const char * str = str_label.c_str(); - // it'll have at least one char and \0, so this is safe - FbTk_istringstream iss(str); - // check for hex - if (str[0] == '0' && str[1] == 'x') { - iss.seekg(2); - iss >> hex; - } - iss >> mask ; - app.rememberDecostate(mask); + if (getuint(str_label.c_str(), mask)) + app.rememberDecostate(mask); + else + had_error = 1; } - } else if (str_key == "Sticky") { - app.rememberStuckstate((str_label=="yes")); - } else if (str_key == "Jump") { - app.rememberJumpworkspace((str_label=="yes")); - } else if (str_key == "Close") { - app.rememberSaveOnClose((str_label=="yes")); - } else if (str_key == "end") { + } else if (strcasecmp(str_key.c_str(), "Sticky") == 0) { + app.rememberStuckstate((strcasecmp(str_label.c_str(), "yes") == 0)); + } else if (strcasecmp(str_key.c_str(), "Jump") == 0) { + app.rememberJumpworkspace((strcasecmp(str_label.c_str(), "yes") == 0)); + } else if (strcasecmp(str_key.c_str(), "Close") == 0) { + app.rememberSaveOnClose((strcasecmp(str_label.c_str(), "yes") == 0)); + } else if (strcasecmp(str_key.c_str(), "end") == 0) { return row; } else { cerr << _FBTEXT(Remember, Unknown, "Unknown apps key", "apps entry type not known")<<" = " << str_key << endl; } + if (had_error) { + cerr<<"Error parsing apps entry: ("<<line<<")"<<endl; + } } } return row;@@ -545,7 +551,7 @@ int pos = FbTk::StringUtil::getStringBetween(key,
line.c_str(), '[', ']'); - if (pos > 0 && key == "app") { + if (pos > 0 && strcasecmp(key.c_str(), "app") == 0) { ClientPattern *pat = new ClientPattern(line.c_str() + pos); if (!in_group) { if ((err = pat->error()) == 0) {@@ -562,13 +568,13 @@ }
} else { grouped_pats.push_back(pat); } - } else if (pos > 0 && key == "startup") { + } else if (pos > 0 && strcasecmp(key.c_str(), "startup") == 0) { if (!handleStartupItem(line, pos)) { cerr<<"Error reading apps file at line "<<row<<"."<<endl; } // save the item even if it was bad (aren't we nice) m_startups.push_back(line.substr(pos)); - } else if (pos > 0 && key == "group") { + } else if (pos > 0 && strcasecmp(key.c_str(), "group") == 0) { in_group = true; } else if (in_group) { // otherwise assume that it is the start of the attributes@@ -593,7 +599,7 @@
// we hit end... probably don't have attribs for the group // so finish it off with an empty application // otherwise parse the app - if (!(pos>0 && key == "end")) { + if (!(pos>0 && strcasecmp(key.c_str(), "end") == 0)) { row += parseApp(apps_file, *app, &line); } in_group = false;@@ -745,6 +751,11 @@ case (FluxboxWindow::DECORM_BORDER
| FluxboxWindow::DECORM_MENU): apps_file << " [Deco]\t{BORDER}" << endl; break; + case (FluxboxWindow::DECORM_BORDER + | FluxboxWindow::DECORM_MENU + | FluxboxWindow::DECORM_TAB): + apps_file << " [Deco]\t{TAB}" << endl; + break; default: apps_file << " [Deco]\t{0x"<<hex<<a.decostate<<dec<<"}"<<endl; break;@@ -775,6 +786,12 @@ apps_file << " [Close]\t{" << ((a.save_on_close)?"yes":"no") << "}" << endl;
} apps_file << "[end]" << endl; } + apps_file.close(); + + time_t timestamp = FbTk::FileUtil::getLastStatusChangeTimestamp(apps_string.c_str()); + if (timestamp > 0) + m_last_timestamp = timestamp; + } bool Remember::isRemembered(WinClient &winclient, Attribute attrib) {@@ -1040,6 +1057,7 @@ }
} void Remember::updateClientClose(WinClient &winclient) { + reconfigure(); // reload if it's changed Application *app = find(winclient); if (app && (app->save_on_close_remember && app->save_on_close)) {