aboutsummaryrefslogtreecommitdiff
path: root/src/fluxbox.cc
diff options
context:
space:
mode:
authorMathias Gumz <akira at fluxbox dot org>2010-09-18 15:51:30 (GMT)
committerMathias Gumz <akira at fluxbox dot org>2010-09-18 15:51:30 (GMT)
commit0ef76292c5447127dc3fd39d6272f6d88a63d145 (patch)
tree167e28347f69bcc8db8dfc38f04a01f70f21df2b /src/fluxbox.cc
parentc9c741c88da3cc5e74f0399c3c5c1f0e70163a7a (diff)
downloadfluxbox_pavel-0ef76292c5447127dc3fd39d6272f6d88a63d145.zip
fluxbox_pavel-0ef76292c5447127dc3fd39d6272f6d88a63d145.tar.bz2
changed the way we create the '~/.fluxbox' directory to avoid race conditions
before bringing up the first instance of Fluxbox we prepare the directory and the files it needs. if the config version of exiting files is lower than what we expect, we upgrade the config files. after that we bring up Fluxbox. the old way was problematic because setupConfigFiles() calls 'fluxbox-update_configs' which does its job in the background while fluxbox continues to boot. 'fluxbox-update_configs' sends a USR2 signal to the booting fluxbox (it might even be finished, no one knows) which triggers 'load_rc()' which triggered 'setupConfigFiles()' again which might trigger 'fluxbox-update_configs' again (on my machine 'fluxbox-update_configs' was called 3 times and left a pretty crippled 'keys' file when it was done). bootstrapping before bringing up fluxbox resolves the issue. as a bonus: no need to send USR2 to fluxbox to reload the config file because fluxbox has not even tried to read it yet.
Diffstat (limited to 'src/fluxbox.cc')
-rw-r--r--src/fluxbox.cc103
1 files changed, 16 insertions, 87 deletions
diff --git a/src/fluxbox.cc b/src/fluxbox.cc
index 78a482e..ac18281 100644
--- a/src/fluxbox.cc
+++ b/src/fluxbox.cc
@@ -185,13 +185,17 @@ int handleXErrors(Display *d, XErrorEvent *e) {
185//static singleton var 185//static singleton var
186Fluxbox *Fluxbox::s_singleton=0; 186Fluxbox *Fluxbox::s_singleton=0;
187 187
188Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name, 188Fluxbox::Fluxbox(int argc, char **argv,
189 const char *rcfilename, bool xsync) 189 const std::string& dpy_name,
190 : FbTk::App(dpy_name), 190 const std::string& rc_path, const std::string& rc_filename, bool xsync)
191 : FbTk::App(dpy_name.c_str()),
191 m_fbatoms(FbAtoms::instance()), 192 m_fbatoms(FbAtoms::instance()),
192 m_resourcemanager(rcfilename, true), 193 m_resourcemanager(rc_filename.c_str(), true),
193 // TODO: shouldn't need a separate one for screen 194 // TODO: shouldn't need a separate one for screen
194 m_screen_rm(m_resourcemanager), 195 m_screen_rm(m_resourcemanager),
196
197 m_RC_PATH(rc_path),
198 m_RC_INIT_FILE("init"),
195 m_rc_ignoreborder(m_resourcemanager, false, "session.ignoreBorder", "Session.IgnoreBorder"), 199 m_rc_ignoreborder(m_resourcemanager, false, "session.ignoreBorder", "Session.IgnoreBorder"),
196 m_rc_pseudotrans(m_resourcemanager, false, "session.forcePseudoTransparency", "Session.forcePseudoTransparency"), 200 m_rc_pseudotrans(m_resourcemanager, false, "session.forcePseudoTransparency", "Session.forcePseudoTransparency"),
197 m_rc_colors_per_channel(m_resourcemanager, 4, 201 m_rc_colors_per_channel(m_resourcemanager, 4,
@@ -199,11 +203,11 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name,
199 m_rc_double_click_interval(m_resourcemanager, 250, "session.doubleClickInterval", "Session.DoubleClickInterval"), 203 m_rc_double_click_interval(m_resourcemanager, 250, "session.doubleClickInterval", "Session.DoubleClickInterval"),
200 m_rc_tabs_padding(m_resourcemanager, 0, "session.tabPadding", "Session.TabPadding"), 204 m_rc_tabs_padding(m_resourcemanager, 0, "session.tabPadding", "Session.TabPadding"),
201 m_rc_stylefile(m_resourcemanager, DEFAULTSTYLE, "session.styleFile", "Session.StyleFile"), 205 m_rc_stylefile(m_resourcemanager, DEFAULTSTYLE, "session.styleFile", "Session.StyleFile"),
202 m_rc_styleoverlayfile(m_resourcemanager, "~/." + realProgramName("fluxbox") + "/overlay", "session.styleOverlay", "Session.StyleOverlay"), 206 m_rc_styleoverlayfile(m_resourcemanager, m_RC_PATH + "/overlay", "session.styleOverlay", "Session.StyleOverlay"),
203 m_rc_menufile(m_resourcemanager, DEFAULTMENU, "session.menuFile", "Session.MenuFile"), 207 m_rc_menufile(m_resourcemanager, m_RC_PATH + "/menu", "session.menuFile", "Session.MenuFile"),
204 m_rc_keyfile(m_resourcemanager, DEFAULTKEYSFILE, "session.keyFile", "Session.KeyFile"), 208 m_rc_keyfile(m_resourcemanager, m_RC_PATH + "/keys", "session.keyFile", "Session.KeyFile"),
205 m_rc_slitlistfile(m_resourcemanager, "~/." + realProgramName("fluxbox") + "/slitlist", "session.slitlistFile", "Session.SlitlistFile"), 209 m_rc_slitlistfile(m_resourcemanager, m_RC_PATH + "/slitlist", "session.slitlistFile", "Session.SlitlistFile"),
206 m_rc_appsfile(m_resourcemanager, "~/." + realProgramName("fluxbox") + "/apps", "session.appsFile", "Session.AppsFile"), 210 m_rc_appsfile(m_resourcemanager, m_RC_PATH + "/apps", "session.appsFile", "Session.AppsFile"),
207 m_rc_tabs_attach_area(m_resourcemanager, ATTACH_AREA_WINDOW, "session.tabsAttachArea", "Session.TabsAttachArea"), 211 m_rc_tabs_attach_area(m_resourcemanager, ATTACH_AREA_WINDOW, "session.tabsAttachArea", "Session.TabsAttachArea"),
208 m_rc_cache_life(m_resourcemanager, 5, "session.cacheLife", "Session.CacheLife"), 212 m_rc_cache_life(m_resourcemanager, 5, "session.cacheLife", "Session.CacheLife"),
209 m_rc_cache_max(m_resourcemanager, 200, "session.cacheMax", "Session.CacheMax"), 213 m_rc_cache_max(m_resourcemanager, 200, "session.cacheMax", "Session.CacheMax"),
@@ -213,16 +217,14 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name,
213 m_keyscreen(0), 217 m_keyscreen(0),
214 m_last_time(0), 218 m_last_time(0),
215 m_masked(0), 219 m_masked(0),
216 m_rc_file(rcfilename ? rcfilename : ""), 220 m_rc_file(rc_filename),
217 m_argv(argv), m_argc(argc), 221 m_argv(argv), m_argc(argc),
218 m_showing_dialog(false), 222 m_showing_dialog(false),
219 m_starting(true), 223 m_starting(true),
220 m_restarting(false), 224 m_restarting(false),
221 m_shutdown(false), 225 m_shutdown(false),
222 m_server_grabs(0), 226 m_server_grabs(0),
223 m_randr_event_type(0), 227 m_randr_event_type(0) {
224 m_RC_PATH(realProgramName("fluxbox")),
225 m_RC_INIT_FILE("init") {
226 228
227 _FB_USES_NLS; 229 _FB_USES_NLS;
228 if (s_singleton != 0) 230 if (s_singleton != 0)
@@ -288,8 +290,6 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name,
288 290
289 grab(); 291 grab();
290 292
291 setupConfigFiles();
292
293 if (! XSupportsLocale()) 293 if (! XSupportsLocale())
294 cerr<<_FB_CONSOLETEXT(Fluxbox, WarningLocale, 294 cerr<<_FB_CONSOLETEXT(Fluxbox, WarningLocale,
295 "Warning: X server does not support locale", 295 "Warning: X server does not support locale",
@@ -512,76 +512,6 @@ void Fluxbox::ungrab() {
512 m_server_grabs = 0; 512 m_server_grabs = 0;
513} 513}
514 514
515/**
516 setup the configutation files in
517 home directory
518*/
519void Fluxbox::setupConfigFiles() {
520
521 string dirname = getDefaultDataFilename("");
522
523 // is file/dir already there?
524 const bool create_dir = FbTk::FileUtil::isDirectory(dirname.c_str());
525
526 struct CFInfo {
527 bool create_file;
528 const char* default_name;
529 const std::string filename;
530 } cfiles[] = {
531 { create_dir, DEFAULT_INITFILE, getDefaultDataFilename(m_RC_INIT_FILE) },
532 { create_dir, DEFAULTKEYSFILE, getDefaultDataFilename("keys") },
533 { create_dir, DEFAULTMENU, getDefaultDataFilename("menu") },
534 { create_dir, DEFAULT_APPSFILE, getDefaultDataFilename("apps") },
535 { create_dir, DEFAULT_OVERLAY, getDefaultDataFilename("overlay") },
536 { create_dir, DEFAULT_WINDOWMENU, getDefaultDataFilename("windowmenu") }
537 };
538 const size_t nr_of_cfiles = sizeof(cfiles)/sizeof(CFInfo);
539
540 if (create_dir) { // check if anything with those name exists, if not create new
541 for (size_t i = 0; i < nr_of_cfiles; ++i) {
542 cfiles[i].create_file = access(cfiles[i].filename.c_str(), F_OK);
543 }
544 } else{
545 fbdbg<<"Creating dir: " << dirname.c_str() << endl;
546 _FB_USES_NLS;
547 // create directory with perm 700
548 if (mkdir(dirname.c_str(), 0700)) {
549 fprintf(stderr, _FB_CONSOLETEXT(Fluxbox, ErrorCreatingDirectory,
550 "Can't create %s directory",
551 "Can't create a directory, one %s for directory name").c_str(),
552 dirname.c_str());
553 cerr<<endl;
554 return;
555 }
556 }
557
558 // copy default files if needed
559 for (size_t i = 0; i < nr_of_cfiles; ++i) {
560 if (cfiles[i].create_file) {
561 FbTk::FileUtil::copyFile(cfiles[i].default_name, cfiles[i].filename.c_str());
562 }
563 }
564
565#define CONFIG_VERSION 13
566 FbTk::Resource<int> config_version(m_resourcemanager, 0,
567 "session.configVersion", "Session.ConfigVersion");
568 if (*config_version < CONFIG_VERSION) {
569 // configs are out of date, so run fluxbox-update_configs
570
571 string commandargs = realProgramName("fluxbox-update_configs");
572 commandargs += " -rc " + cfiles[0].filename;
573
574#ifdef HAVE_GETPID
575 // add the fluxbox pid so fbuc can have us reload rc if necessary
576 commandargs += " -pid ";
577 commandargs += FbTk::StringUtil::number2String(getpid());
578#endif // HAVE_GETPID
579
580 FbCommands::ExecuteCmd fbuc(commandargs, 0);
581 fbuc.execute();
582 }
583}
584
585void Fluxbox::handleEvent(XEvent * const e) { 515void Fluxbox::handleEvent(XEvent * const e) {
586 _FB_USES_NLS; 516 _FB_USES_NLS;
587 m_last_event = *e; 517 m_last_event = *e;
@@ -1216,7 +1146,7 @@ string Fluxbox::getRcFilename() {
1216 1146
1217/// Provides default filename of data file 1147/// Provides default filename of data file
1218string Fluxbox::getDefaultDataFilename(const char *name) const { 1148string Fluxbox::getDefaultDataFilename(const char *name) const {
1219 return (getenv("HOME") + string("/.") + m_RC_PATH + string("/") + name); 1149 return m_RC_PATH + string("/") + name;
1220} 1150}
1221 1151
1222/// loads resources 1152/// loads resources
@@ -1311,7 +1241,6 @@ void Fluxbox::load_rc(BScreen &screen) {
1311} 1241}
1312 1242
1313void Fluxbox::reconfigure() { 1243void Fluxbox::reconfigure() {
1314 setupConfigFiles();
1315 load_rc(); 1244 load_rc();
1316 m_reconfigure_wait = true; 1245 m_reconfigure_wait = true;
1317 m_reconfig_timer.start(); 1246 m_reconfig_timer.start();