2003-04-27 01:51:04 +00:00
// main.cc for Fluxbox Window manager
2006-02-16 06:53:05 +00:00
// Copyright (c) 2001 - 2006 Henrik Kinnunen (fluxgen at fluxbox dot org)
2005-01-18 19:06:04 +00:00
// and 2003-2005 Simon Bowden (rathnor at users.sourceforge.net)
2001-12-11 20:47:02 +00:00
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2003-05-16 00:46:41 +00:00
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
2001-12-11 20:47:02 +00:00
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
2010-09-18 15:51:30 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif // HAVE_CONFIG_H
2001-12-11 20:47:02 +00:00
# include "fluxbox.hh"
2003-05-16 00:46:41 +00:00
# include "version.h"
2003-07-18 15:44:36 +00:00
# include "defaults.hh"
2004-01-11 13:12:02 +00:00
2010-09-18 15:51:30 +00:00
# include "Debug.hh"
2003-08-28 23:18:37 +00:00
# include "FbTk/Theme.hh"
2004-06-07 11:46:05 +00:00
# include "FbTk/I18n.hh"
2008-06-03 08:07:14 +00:00
# include "FbTk/CommandParser.hh"
2010-09-18 15:51:30 +00:00
# include "FbTk/FileUtil.hh"
2011-10-31 15:17:28 +00:00
# include "FbTk/StringUtil.hh"
2001-12-11 20:47:02 +00:00
2002-08-13 23:56:02 +00:00
//use GNU extensions
# ifndef _GNU_SOURCE
# define _GNU_SOURCE
# endif // _GNU_SOURCE
2004-08-31 15:26:40 +00:00
# ifdef HAVE_CSTDLIB
# include <cstdlib>
# else
# include <stdlib.h>
# endif
2007-04-17 07:52:40 +00:00
2007-12-14 22:21:39 +00:00
# ifdef HAVE_CSTRING
# include <cstring>
# else
# include <string.h>
# endif
2011-09-10 18:17:57 +00:00
# ifdef HAVE_UNISTD_H
# include <unistd.h>
# endif
2010-09-18 15:51:30 +00:00
# ifdef HAVE_SYS_STAT_H
# include <sys/types.h>
# include <sys/stat.h>
# endif // HAVE_SYS_STAT_H
2003-05-16 00:46:41 +00:00
# include <fstream>
2002-10-13 21:48:28 +00:00
# include <stdexcept>
2003-01-09 18:28:48 +00:00
# include <typeinfo>
2002-10-13 21:48:28 +00:00
2006-10-27 06:57:43 +00:00
using std : : cout ;
using std : : cerr ;
using std : : endl ;
using std : : string ;
using std : : ostream ;
using std : : ofstream ;
using std : : streambuf ;
using std : : auto_ptr ;
using std : : out_of_range ;
using std : : runtime_error ;
using std : : bad_cast ;
using std : : bad_alloc ;
using std : : exception ;
static void showInfo ( ostream & ostr ) {
2004-06-07 11:46:05 +00:00
_FB_USES_NLS ;
2010-09-18 15:27:28 +00:00
ostr < <
_FB_CONSOLETEXT ( Common , FluxboxVersion , " Fluxbox version " , " Fluxbox version heading " )
< < " : "
< < __fluxbox_version < < endl ;
2005-02-03 16:46:46 +00:00
2009-03-03 10:43:57 +00:00
if ( strlen ( gitrevision ( ) ) > 0 )
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , SvnRevision , " GIT Revision " , " Revision number in GIT repositary " )
< < " : "
< < gitrevision ( ) < < endl ;
2004-02-28 10:32:06 +00:00
# if defined(__DATE__) && defined(__TIME__)
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , Compiled , " Compiled " , " Time fluxbox was compiled " )
< < " : "
< < __DATE__
< < " "
< < __TIME__ < < endl ;
2003-05-16 00:46:41 +00:00
# endif
2004-02-28 10:32:06 +00:00
# ifdef __fluxbox_compiler
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , Compiler , " Compiler " , " Compiler used to build fluxbox " )
< < " : "
< < __fluxbox_compiler < < endl ;
2004-02-28 10:32:06 +00:00
# endif // __fluxbox_compiler
# ifdef __fluxbox_compiler_version
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , CompilerVersion , " Compiler version " , " Compiler version used to build fluxbox " )
< < " : "
< < __fluxbox_compiler_version < < endl ;
2004-02-28 10:32:06 +00:00
# endif // __fluxbox_compiler_version
2003-05-16 00:46:41 +00:00
2010-09-18 15:27:28 +00:00
ostr < < endl
< < _FB_CONSOLETEXT ( Common , Defaults , " Defaults " , " Default values compiled in " )
< < " : " < < endl ;
2004-10-18 01:26:54 +00:00
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , DefaultMenuFile , " menu " , " default menu file (right aligned - make sure same width as other default values) " )
< < " : "
2011-10-31 15:17:28 +00:00
< < FbTk : : StringUtil : : expandFilename ( DEFAULTMENU ) < < endl ;
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , DefaultStyle , " style " , " default style (right aligned - make sure same width as other default values) " )
< < " : "
2011-10-31 15:17:28 +00:00
< < FbTk : : StringUtil : : expandFilename ( DEFAULTSTYLE ) < < endl ;
2004-10-18 01:26:54 +00:00
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , DefaultKeyFile , " keys " , " default key file (right aligned - make sure same width as other default values) " )
< < " : "
2011-10-31 15:17:28 +00:00
< < FbTk : : StringUtil : : expandFilename ( DEFAULTKEYSFILE ) < < endl ;
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , DefaultInitFile , " init " , " default init file (right aligned - make sure same width as other default values) " )
< < " : "
2011-10-31 15:17:28 +00:00
< < FbTk : : StringUtil : : expandFilename ( DEFAULT_INITFILE ) < < endl ;
2005-07-07 12:14:55 +00:00
# ifdef NLS
2010-09-18 15:27:28 +00:00
ostr < < _FB_CONSOLETEXT ( Common , DefaultLocalePath , " nls " , " location for localization files (right aligned - make sure same width as other default values) " )
< < " : "
2011-10-31 15:17:28 +00:00
< < FbTk : : StringUtil : : expandFilename ( LOCALEPATH ) < < endl ;
2005-07-07 12:14:55 +00:00
# endif
2003-07-18 15:44:36 +00:00
2003-05-16 00:46:41 +00:00
const char NOT [ ] = " - " ;
2010-09-18 15:27:28 +00:00
ostr < < endl
< < _FB_CONSOLETEXT ( Common , CompiledOptions , " Compiled options " , " Options used when compiled " )
< < " ( " < < NOT < < " => "
< < _FB_CONSOLETEXT ( Common , Disabled , " disabled " , " option is turned off " ) < < " ): " < < endl
< <
2006-06-21 14:41:16 +00:00
/**** NOTE: This list is in alphabetical order! ****/
2010-09-05 06:49:13 +00:00
# ifndef HAVE_FRIBIDI
2010-09-18 15:27:28 +00:00
NOT < <
2010-09-05 06:49:13 +00:00
# endif
2010-09-18 15:27:28 +00:00
" BIDI " < < endl < <
2010-09-05 06:49:13 +00:00
2003-05-16 00:46:41 +00:00
# ifndef DEBUG
2010-09-18 15:27:28 +00:00
NOT < <
2004-10-18 01:26:54 +00:00
# endif // DEBUG
2010-09-18 15:27:28 +00:00
" DEBUG " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef USE_NEWWMSPEC
2010-09-18 15:27:28 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // USE_NEWWMSPEC
2010-09-18 15:27:28 +00:00
" EWMH " < < endl < <
2003-07-11 15:03:02 +00:00
2004-12-21 23:42:09 +00:00
# ifndef HAVE_IMLIB2
NOT < <
# endif // HAVE_IMLIB2
2010-09-18 15:27:28 +00:00
" IMLIB2 " < < endl < <
2004-12-21 23:42:09 +00:00
2006-06-21 14:41:16 +00:00
# ifndef NLS
2003-05-16 00:46:41 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // NLS
2010-09-18 15:27:28 +00:00
" NLS " < < endl < <
2003-07-11 15:03:02 +00:00
2003-05-16 00:46:41 +00:00
# ifndef REMEMBER
2010-09-18 15:27:28 +00:00
NOT < <
2003-05-16 00:46:41 +00:00
# endif // REMEMBER
2010-09-18 15:27:28 +00:00
" REMEMBER " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef HAVE_XRENDER
2010-09-18 15:27:28 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // HAVE_XRENDER
2010-09-18 15:27:28 +00:00
" RENDER " < < endl < <
2006-06-21 14:41:16 +00:00
2003-05-16 00:46:41 +00:00
# ifndef SHAPE
2010-09-18 15:27:28 +00:00
NOT < <
2003-05-16 00:46:41 +00:00
# endif // SHAPE
2010-09-18 15:27:28 +00:00
" SHAPE " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef SLIT
2010-09-18 15:27:28 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // SLIT
2010-09-18 15:27:28 +00:00
" SLIT " < < endl < <
2006-06-21 14:41:16 +00:00
# ifndef USE_TOOLBAR
2010-09-18 15:27:28 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // USE_TOOLBAR
2010-09-18 15:27:28 +00:00
" TOOLBAR " < < endl < <
2006-06-21 14:41:16 +00:00
2003-05-16 00:46:41 +00:00
# ifndef USE_XFT
2010-09-18 15:27:28 +00:00
NOT < <
2003-05-16 00:46:41 +00:00
# endif // USE_XFT
2010-09-18 15:27:28 +00:00
" XFT " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef XINERAMA
2010-09-18 15:27:28 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // XINERAMA
2010-09-18 15:27:28 +00:00
" XINERAMA " < < endl < <
2006-06-21 14:41:16 +00:00
2003-05-16 00:46:41 +00:00
# ifndef USE_XMB
2010-09-18 15:27:28 +00:00
NOT < <
2003-05-16 00:46:41 +00:00
# endif // USE_XMB
2010-09-18 15:27:28 +00:00
" XMB " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef HAVE_XPM
2010-09-18 15:27:28 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // HAVE_XPM
2010-09-18 15:27:28 +00:00
" XPM " < < endl
2006-06-21 14:41:16 +00:00
2010-09-18 15:27:28 +00:00
< < endl ;
2003-05-16 00:46:41 +00:00
}
2001-12-11 20:47:02 +00:00
2010-09-17 13:51:16 +00:00
struct Options {
2010-10-13 13:48:29 +00:00
Options ( ) : xsync ( false ) {
2010-09-18 15:51:30 +00:00
2010-10-13 13:48:29 +00:00
const char * env ;
env = getenv ( " DISPLAY " ) ;
2011-10-28 20:44:46 +00:00
if ( env & & strlen ( env ) > 0 ) {
2010-10-13 13:48:29 +00:00
session_display . assign ( env ) ;
}
2011-10-28 21:15:13 +00:00
# ifdef _WIN32
env = getenv ( " USERPROFILE " ) ;
# else
2010-10-13 13:48:29 +00:00
env = getenv ( " HOME " ) ;
2011-10-28 21:15:13 +00:00
# endif
2011-10-28 20:44:46 +00:00
if ( env & & strlen ( env ) > 0 ) {
2010-10-13 13:48:29 +00:00
rc_path . assign ( std : : string ( env ) + " /. " + realProgramName ( " fluxbox " ) ) ;
rc_file = rc_path + " /init " ;
}
2010-09-18 15:51:30 +00:00
}
2010-10-13 13:48:29 +00:00
2010-09-17 13:51:16 +00:00
std : : string session_display ;
2010-09-18 15:51:30 +00:00
std : : string rc_path ;
2010-09-17 13:51:16 +00:00
std : : string rc_file ;
std : : string log_filename ;
bool xsync ;
} ;
2004-10-18 01:26:54 +00:00
2010-09-17 13:51:16 +00:00
static void parseOptions ( int argc , char * * argv , Options & opts ) {
2001-12-11 20:47:02 +00:00
2004-06-07 11:46:05 +00:00
_FB_USES_NLS ;
2004-10-18 01:26:54 +00:00
2002-12-01 13:42:15 +00:00
int i ;
for ( i = 1 ; i < argc ; + + i ) {
2007-04-17 07:52:40 +00:00
string arg ( argv [ i ] ) ;
2008-10-04 21:32:20 +00:00
if ( arg = = " -rc " | | arg = = " --rc " ) {
2002-12-01 13:42:15 +00:00
// look for alternative rc file to use
if ( ( + + i ) > = argc ) {
2006-06-21 14:41:16 +00:00
cerr < < _FB_CONSOLETEXT ( main , RCRequiresArg ,
2006-10-27 06:57:43 +00:00
" error: '-rc' requires an argument " , " the -rc option requires a file argument " ) < < endl ;
2007-04-17 07:52:40 +00:00
exit ( EXIT_FAILURE ) ;
2002-12-01 13:42:15 +00:00
}
2010-09-17 13:51:16 +00:00
opts . rc_file = argv [ i ] ;
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -display " | | arg = = " --display " ) {
2002-12-01 13:42:15 +00:00
// check for -display option... to run on a display other than the one
// set by the environment variable DISPLAY
if ( ( + + i ) > = argc ) {
2006-06-21 14:41:16 +00:00
cerr < < _FB_CONSOLETEXT ( main , DISPLAYRequiresArg ,
2004-06-07 11:46:05 +00:00
" error: '-display' requires an argument " ,
" " ) < < endl ;
2007-04-17 07:52:40 +00:00
exit ( EXIT_FAILURE ) ;
2002-12-01 13:42:15 +00:00
}
2010-09-17 13:51:16 +00:00
opts . session_display = argv [ i ] ;
2010-09-17 21:43:24 +00:00
if ( ! FbTk : : App : : setenv ( " DISPLAY " , argv [ i ] ) ) {
2006-06-21 14:41:16 +00:00
cerr < < _FB_CONSOLETEXT ( main , WarnDisplayEnv ,
2004-06-07 11:46:05 +00:00
" warning: couldn't set environment variable 'DISPLAY' " ,
" " ) < < endl ;
2002-12-01 13:42:15 +00:00
perror ( " putenv() " ) ;
}
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -version " | | arg = = " -v " | | arg = = " --version " ) {
2002-12-01 13:42:15 +00:00
// print current version string
2011-02-23 16:15:19 +00:00
cout < < " Fluxbox " < < __fluxbox_version < < " : (c) 2001-2011 Fluxbox Team " < < endl < < endl ;
2007-04-17 07:52:40 +00:00
exit ( EXIT_SUCCESS ) ;
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -log " | | arg = = " --log " ) {
2007-04-24 19:38:40 +00:00
if ( + + i > = argc ) {
2006-06-21 14:41:16 +00:00
cerr < < _FB_CONSOLETEXT ( main , LOGRequiresArg , " error: '-log' needs an argument " , " " ) < < endl ;
2007-04-17 07:52:40 +00:00
exit ( EXIT_FAILURE ) ;
2003-05-16 00:46:41 +00:00
}
2010-09-17 13:51:16 +00:00
opts . log_filename = argv [ i ] ;
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -sync " | | arg = = " --sync " ) {
2010-09-17 13:51:16 +00:00
opts . xsync = true ;
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -help " | | arg = = " -h " | | arg = = " --help " ) {
2002-12-01 13:42:15 +00:00
// print program usage and command line options
2006-06-21 14:41:16 +00:00
printf ( _FB_CONSOLETEXT ( main , Usage ,
2011-02-23 20:42:51 +00:00
" Fluxbox %s : (c) %s Fluxbox Team \n "
2006-04-22 09:49:05 +00:00
" Website: http://www.fluxbox.org/ \n \n "
2006-03-18 22:21:49 +00:00
" -display <string> \t \t use display connection. \n "
" -screen <all|int,int,int> \t run on specified screens only. \n "
" -rc <string> \t \t \t use alternate resource file. \n "
" -version \t \t \t display version and exit. \n "
" -info \t \t \t \t display some useful information. \n "
2008-06-03 08:07:14 +00:00
" -list-commands \t \t \t list all valid key commands. \n "
2008-08-22 13:12:01 +00:00
" -sync \t \t \t \t synchronize with X server for debugging. \n "
2006-03-18 22:21:49 +00:00
" -log <filename> \t \t \t log output to file. \n "
" -help \t \t \t \t display this help text and exit. \n \n " ,
2004-06-07 11:46:05 +00:00
2006-05-20 15:08:14 +00:00
" Main usage string. Please lay it out nicely. There is one %s that is given the version " ) . c_str ( ) ,
2011-02-23 20:42:51 +00:00
__fluxbox_version , " 2001-2011 " ) ;
2007-04-17 07:52:40 +00:00
exit ( EXIT_SUCCESS ) ;
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -info " | | arg = = " -i " | | arg = = " --info " ) {
2003-05-16 00:46:41 +00:00
showInfo ( cout ) ;
2007-04-17 07:52:40 +00:00
exit ( EXIT_SUCCESS ) ;
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -list-commands " | | arg = = " --list-commands " ) {
2008-06-03 08:07:14 +00:00
FbTk : : CommandParser < void > : : CreatorMap cmap = FbTk : : CommandParser < void > : : instance ( ) . creatorMap ( ) ;
FbTk : : CommandParser < void > : : CreatorMap : : const_iterator it = cmap . begin ( ) ;
const FbTk : : CommandParser < void > : : CreatorMap : : const_iterator it_end = cmap . end ( ) ;
for ( ; it ! = it_end ; + + it )
cout < < it - > first < < endl ;
exit ( EXIT_SUCCESS ) ;
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -verbose " | | arg = = " --verbose " ) {
2003-08-28 23:18:37 +00:00
FbTk : : ThemeManager : : instance ( ) . setVerbose ( true ) ;
2002-12-01 13:42:15 +00:00
}
}
2010-09-17 13:51:16 +00:00
}
2011-10-28 17:16:10 +00:00
# ifdef _WIN32
/**
Wrapper function for Windows builds - mkdir takes only one param .
*/
static int mkdir ( const char * dirname , int /*permissions*/ ) {
return mkdir ( dirname ) ;
}
# endif
2010-09-17 13:51:16 +00:00
2010-09-18 15:51:30 +00:00
/**
setup the configutation files in
home directory
*/
void setupConfigFiles ( const std : : string & dirname , const std : : string & rc ) {
_FB_USES_NLS ;
const bool has_dir = FbTk : : FileUtil : : isDirectory ( dirname . c_str ( ) ) ;
struct CFInfo {
bool create_file ;
const char * default_name ;
const std : : string filename ;
} cfiles [ ] = {
{ ! has_dir , DEFAULT_INITFILE , rc } ,
{ ! has_dir , DEFAULTKEYSFILE , dirname + " /keys " } ,
{ ! has_dir , DEFAULTMENU , dirname + " /menu " } ,
{ ! has_dir , DEFAULT_APPSFILE , dirname + " /apps " } ,
{ ! has_dir , DEFAULT_OVERLAY , dirname + " /overlay " } ,
{ ! has_dir , DEFAULT_WINDOWMENU , dirname + " /windowmenu " }
} ;
const size_t nr_of_cfiles = sizeof ( cfiles ) / sizeof ( CFInfo ) ;
if ( has_dir ) { // check if anything with these names exists, if not create new
for ( size_t i = 0 ; i < nr_of_cfiles ; + + i ) {
cfiles [ i ] . create_file = access ( cfiles [ i ] . filename . c_str ( ) , F_OK ) ;
}
} else {
fbdbg < < " Creating dir: " < < dirname < < endl ;
if ( mkdir ( dirname . c_str ( ) , 0700 ) ) {
fprintf ( stderr , _FB_CONSOLETEXT ( Fluxbox , ErrorCreatingDirectory ,
" Can't create %s directory " ,
" Can't create a directory, one %s for directory name " ) . c_str ( ) ,
dirname . c_str ( ) ) ;
cerr < < endl ;
return ;
}
}
2011-09-10 18:17:57 +00:00
bool sync_fs = false ;
2010-09-18 15:51:30 +00:00
// copy default files if needed
for ( size_t i = 0 ; i < nr_of_cfiles ; + + i ) {
if ( cfiles [ i ] . create_file ) {
2011-10-31 15:17:28 +00:00
FbTk : : FileUtil : : copyFile ( FbTk : : StringUtil : : expandFilename ( cfiles [ i ] . default_name ) . c_str ( ) , cfiles [ i ] . filename . c_str ( ) ) ;
2011-09-10 18:17:57 +00:00
sync_fs = true ;
2010-09-18 15:51:30 +00:00
}
}
2011-10-28 17:15:48 +00:00
# ifdef HAVE_SYNC
2011-09-10 18:17:57 +00:00
if ( sync_fs ) {
sync ( ) ;
}
2011-10-28 17:15:48 +00:00
# endif
2010-09-18 15:51:30 +00:00
}
// configs might be out of date, so run fluxbox-update_configs
// if necassary.
void updateConfigFilesIfNeeded ( const std : : string & rc_file ) {
const int CONFIG_VERSION = 13 ; // TODO: move this to 'defaults.hh' or 'config.h'
FbTk : : ResourceManager r_mgr ( rc_file . c_str ( ) , false ) ;
FbTk : : Resource < int > c_version ( r_mgr , 0 , " session.configVersion " , " Session.ConfigVersion " ) ;
if ( ! r_mgr . load ( rc_file . c_str ( ) ) ) {
_FB_USES_NLS ;
cerr < < _FB_CONSOLETEXT ( Fluxbox , CantLoadRCFile , " Failed to load database " , " " )
< < " : "
< < rc_file < < endl ;
return ;
}
if ( * c_version < CONFIG_VERSION ) {
fbdbg < < " updating config files from version "
< < * c_version
< < " to "
< < CONFIG_VERSION
< < endl ;
string commandargs = realProgramName ( " fluxbox-update_configs " ) ;
commandargs + = " -rc " + rc_file ;
2010-10-13 13:48:29 +00:00
if ( system ( commandargs . c_str ( ) ) ) {
fbdbg < < " running ' "
< < commandargs
< < " ' failed. " < < endl ;
}
2011-10-28 17:15:48 +00:00
# ifdef HAVE_SYNC
2011-09-10 18:17:57 +00:00
sync ( ) ;
2011-10-28 17:15:48 +00:00
# endif // HAVE_SYNC
2010-09-18 15:51:30 +00:00
}
}
2010-09-17 13:51:16 +00:00
int main ( int argc , char * * argv ) {
FbTk : : NLSInit ( " fluxbox.cat " ) ;
Options opts ;
parseOptions ( argc , argv , opts ) ;
2001-12-11 20:47:02 +00:00
2003-05-07 22:19:59 +00:00
# ifdef __EMX__
2002-12-01 13:42:15 +00:00
_chdir2 ( getenv ( " X11ROOT " ) ) ;
2001-12-11 20:47:02 +00:00
# endif // __EMX__
2003-05-16 00:46:41 +00:00
streambuf * outbuf = 0 ;
streambuf * errbuf = 0 ;
2010-09-17 13:51:16 +00:00
ofstream log_file ( opts . log_filename . c_str ( ) ) ;
_FB_USES_NLS ;
2003-05-16 00:46:41 +00:00
// setup log file
2010-09-17 13:51:16 +00:00
if ( log_file . is_open ( ) ) {
2010-09-18 15:27:28 +00:00
cerr < < _FB_CONSOLETEXT ( main , LoggingTo , " Logging to " , " Logging to a file " )
< < " : "
< < opts . log_filename < < endl ;
log_file < < " ------------------------------------------ " < < endl ;
log_file < < _FB_CONSOLETEXT ( main , LogFile , " Log File " , " " )
< < " : "
< < opts . log_filename < < endl ;
2003-05-16 00:46:41 +00:00
showInfo ( log_file ) ;
2010-09-18 15:27:28 +00:00
log_file < < " ------------------------------------------ " < < endl ;
2003-05-16 00:46:41 +00:00
// setup log to use cout and cerr stream
outbuf = cout . rdbuf ( log_file . rdbuf ( ) ) ;
errbuf = cerr . rdbuf ( log_file . rdbuf ( ) ) ;
}
2010-09-17 13:51:16 +00:00
int exitcode = EXIT_FAILURE ;
2010-09-18 15:51:30 +00:00
setupConfigFiles ( opts . rc_path , opts . rc_file ) ;
updateConfigFilesIfNeeded ( opts . rc_file ) ;
auto_ptr < Fluxbox > fluxbox ;
2002-12-01 13:42:15 +00:00
try {
2004-10-18 01:26:54 +00:00
2010-09-17 13:51:16 +00:00
fluxbox . reset ( new Fluxbox ( argc , argv ,
2010-09-18 15:51:30 +00:00
opts . session_display ,
opts . rc_path ,
opts . rc_file ,
2010-09-17 13:51:16 +00:00
opts . xsync ) ) ;
2002-12-01 13:42:15 +00:00
fluxbox - > eventLoop ( ) ;
2003-05-16 00:46:41 +00:00
2004-10-18 01:26:54 +00:00
exitcode = EXIT_SUCCESS ;
2003-05-16 00:46:41 +00:00
2006-10-27 06:57:43 +00:00
} catch ( out_of_range & oor ) {
2010-09-18 15:27:28 +00:00
cerr < < " Fluxbox: "
< < _FB_CONSOLETEXT ( main , ErrorOutOfRange , " Out of range " , " Error message " )
< < " : "
< < oor . what ( ) < < endl ;
2006-10-27 06:57:43 +00:00
} catch ( runtime_error & re ) {
2010-09-18 15:27:28 +00:00
cerr < < " Fluxbox: "
< < _FB_CONSOLETEXT ( main , ErrorRuntime , " Runtime error " , " Error message " )
< < " : "
< < re . what ( ) < < endl ;
2006-10-27 06:57:43 +00:00
} catch ( bad_cast & bc ) {
2010-09-18 15:27:28 +00:00
cerr < < " Fluxbox: "
< < _FB_CONSOLETEXT ( main , ErrorBadCast , " Bad cast " , " Error message " )
< < " : "
< < bc . what ( ) < < endl ;
2006-10-27 06:57:43 +00:00
} catch ( bad_alloc & ba ) {
2010-09-18 15:27:28 +00:00
cerr < < " Fluxbox: "
< < _FB_CONSOLETEXT ( main , ErrorBadAlloc , " Bad Alloc " , " Error message " )
< < " : "
< < ba . what ( ) < < endl ;
2006-10-27 06:57:43 +00:00
} catch ( exception & e ) {
2010-09-18 15:27:28 +00:00
cerr < < " Fluxbox: "
< < _FB_CONSOLETEXT ( main , ErrorStandardException , " Standard Exception " , " Error message " )
< < " : "
< < e . what ( ) < < endl ;
2006-10-27 06:57:43 +00:00
} catch ( string error_str ) {
2010-09-18 15:27:28 +00:00
cerr < < _FB_CONSOLETEXT ( Common , Error , " Error " , " Error message header " )
< < " : "
< < error_str < < endl ;
2002-12-01 13:42:15 +00:00
} catch ( . . . ) {
2010-09-18 15:27:28 +00:00
cerr < < " Fluxbox: "
< < _FB_CONSOLETEXT ( main , ErrorUnknown , " Unknown error " , " Error message " )
< < " . " < < endl ;
2002-12-02 22:02:35 +00:00
abort ( ) ;
2002-12-01 13:42:15 +00:00
}
2004-10-18 01:26:54 +00:00
2004-11-24 11:46:07 +00:00
bool restarting = false ;
2006-10-27 06:57:43 +00:00
string restart_argument ;
2004-11-24 11:46:07 +00:00
if ( fluxbox . get ( ) ) {
restarting = fluxbox - > isRestarting ( ) ;
2006-10-27 06:57:43 +00:00
restart_argument = fluxbox - > getRestartArgument ( ) ;
2004-11-24 11:46:07 +00:00
}
2004-10-18 01:26:54 +00:00
2004-01-11 13:12:02 +00:00
// destroy fluxbox
fluxbox . reset ( 0 ) ;
2003-05-16 00:46:41 +00:00
// restore cout and cin streams
if ( outbuf ! = 0 )
cout . rdbuf ( outbuf ) ;
if ( errbuf ! = 0 )
cerr . rdbuf ( errbuf ) ;
2006-05-22 15:09:21 +00:00
FbTk : : FbStringUtil : : shutdown ( ) ;
2004-10-18 01:26:54 +00:00
if ( restarting ) {
2007-07-31 23:16:05 +00:00
if ( ! restart_argument . empty ( ) ) {
const char * shell = getenv ( " SHELL " ) ;
if ( ! shell )
shell = " /bin/sh " ;
2008-01-25 07:21:35 +00:00
execlp ( shell , shell , " -c " , restart_argument . c_str ( ) , ( const char * ) NULL ) ;
perror ( restart_argument . c_str ( ) ) ;
2004-10-18 01:26:54 +00:00
}
// fall back in case the above execlp doesn't work
execvp ( argv [ 0 ] , argv ) ;
2006-04-25 02:11:19 +00:00
perror ( argv [ 0 ] ) ;
const char * basename = FbTk : : StringUtil : : basename ( argv [ 0 ] ) . c_str ( ) ;
execvp ( basename , argv ) ;
perror ( basename ) ;
2004-10-18 01:26:54 +00:00
}
2002-12-03 01:46:28 +00:00
return exitcode ;
2001-12-11 20:47:02 +00:00
}
2007-04-24 19:38:40 +00:00