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.
# 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
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"
2001-12-11 20:47:02 +00:00
2002-08-13 23:56:02 +00:00
# ifdef HAVE_CONFIG_H
2002-10-13 21:48:28 +00:00
# include "config.h"
2002-08-13 23:56:02 +00:00
# endif // HAVE_CONFIG_H
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
2001-12-11 20:47:02 +00:00
# include <iostream>
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 ;
2006-06-21 14:41:16 +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 )
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__)
2006-06-21 14:41:16 +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
2006-06-21 14:41:16 +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
2006-10-27 06:57:43 +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
2006-06-21 14:41:16 +00:00
ostr < < endl < < _FB_CONSOLETEXT ( Common , Defaults , " Defaults " , " Default values compiled in " ) < < " : " < < endl ;
2004-10-18 01:26:54 +00:00
2006-06-21 14:41:16 +00:00
ostr < < _FB_CONSOLETEXT ( Common , DefaultMenuFile , " menu " , " default menu file (right aligned - make sure same width as other default values) " ) < < " : " < < DEFAULTMENU < < endl ;
ostr < < _FB_CONSOLETEXT ( Common , DefaultStyle , " style " , " default style (right aligned - make sure same width as other default values) " ) < < " : " < < DEFAULTSTYLE < < endl ;
2004-10-18 01:26:54 +00:00
2006-06-21 14:41:16 +00:00
ostr < < _FB_CONSOLETEXT ( Common , DefaultKeyFile , " keys " , " default key file (right aligned - make sure same width as other default values) " ) < < " : " < < DEFAULTKEYSFILE < < endl ;
ostr < < _FB_CONSOLETEXT ( Common , DefaultInitFile , " init " , " default init file (right aligned - make sure same width as other default values) " ) < < " : " < < DEFAULT_INITFILE < < endl ;
2005-07-07 12:14:55 +00:00
# ifdef NLS
2006-06-21 14:41:16 +00:00
ostr < < _FB_CONSOLETEXT ( Common , DefaultLocalePath , " nls " , " location for localization files (right aligned - make sure same width as other default values) " ) < < " : " < < 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 [ ] = " - " ;
2004-06-07 11:46:05 +00:00
ostr < < endl < <
2006-06-21 14:41:16 +00:00
_FB_CONSOLETEXT ( Common , CompiledOptions , " Compiled options " , " Options used when compiled " )
2004-06-07 11:46:05 +00:00
< < " ( " < < NOT < < " => " < <
2006-06-21 14:41:16 +00:00
_FB_CONSOLETEXT ( Common , Disabled , " disabled " , " option is turned off " ) < < " ): " < < endl < <
/**** NOTE: This list is in alphabetical order! ****/
2003-05-16 00:46:41 +00:00
# ifndef DEBUG
NOT < <
2004-10-18 01:26:54 +00:00
# endif // DEBUG
2003-05-16 00:46:41 +00:00
" DEBUG " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef USE_NEWWMSPEC
2003-07-11 15:03:02 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // USE_NEWWMSPEC
" EWMH " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef USE_GNOME
2003-05-16 00:46:41 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // USE_GNOME
" GNOME " < < endl < <
2003-07-11 15:03:02 +00:00
2004-12-21 23:42:09 +00:00
# ifndef HAVE_IMLIB2
NOT < <
# endif // HAVE_IMLIB2
" IMLIB2 " < < endl < <
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
" NLS " < < endl < <
2003-07-11 15:03:02 +00:00
2003-05-16 00:46:41 +00:00
# ifndef REMEMBER
NOT < <
# endif // REMEMBER
" REMEMBER " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef HAVE_XRENDER
NOT < <
# endif // HAVE_XRENDER
" RENDER " < < endl < <
2003-05-16 00:46:41 +00:00
# ifndef SHAPE
NOT < <
# endif // SHAPE
" SHAPE " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef SLIT
NOT < <
# endif // SLIT
" SLIT " < < endl < <
# ifndef USE_TOOLBAR
NOT < <
# endif // USE_TOOLBAR
" TOOLBAR " < < endl < <
2003-05-16 00:46:41 +00:00
# ifndef USE_XFT
NOT < <
# endif // USE_XFT
" XFT " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef XINERAMA
NOT < <
# endif // XINERAMA
" XINERAMA " < < endl < <
2003-05-16 00:46:41 +00:00
# ifndef USE_XMB
NOT < <
# endif // USE_XMB
" XMB " < < endl < <
2003-07-11 15:03:02 +00:00
2006-06-21 14:41:16 +00:00
# ifndef HAVE_XPM
2003-05-16 00:46:41 +00:00
NOT < <
2006-06-21 14:41:16 +00:00
# endif // HAVE_XPM
" XPM " < < endl < <
2003-07-11 15:03:02 +00:00
2003-05-16 00:46:41 +00:00
endl ;
}
2001-12-11 20:47:02 +00:00
int main ( int argc , char * * argv ) {
2004-10-18 01:26:54 +00:00
2007-04-24 19:38:40 +00:00
string session_display ( " " ) ;
2006-10-27 06:57:43 +00:00
string rc_file ;
string log_filename ;
2008-08-22 13:12:01 +00:00
bool xsync = false ;
2001-12-11 20:47:02 +00:00
2004-06-07 11:46:05 +00:00
FbTk : : NLSInit ( " fluxbox.cat " ) ;
_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
}
2007-04-24 19:38:40 +00:00
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
}
2007-04-24 19:38:40 +00:00
session_display = argv [ i ] ;
2006-10-27 06:57:43 +00:00
string display_env = " DISPLAY= " + session_display ;
2003-05-16 00:46:41 +00:00
if ( putenv ( const_cast < char * > ( display_env . c_str ( ) ) ) ) {
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
2008-05-31 10:07:10 +00:00
cout < < " Fluxbox " < < __fluxbox_version < < " : (c) 2001-2008 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
}
2007-04-24 19:38:40 +00:00
log_filename = argv [ i ] ;
2008-10-04 21:32:20 +00:00
} else if ( arg = = " -sync " | | arg = = " --sync " ) {
2008-08-22 13:12:01 +00:00
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 ,
2004-06-07 11:46:05 +00:00
" Fluxbox %s : (c) %s Henrik Kinnunen \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 ( ) ,
2008-05-31 10:07:10 +00:00
__fluxbox_version , " 2001-2008 " ) ;
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
}
}
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__
2006-10-27 06:57:43 +00:00
auto_ptr < Fluxbox > fluxbox ;
2002-12-03 01:46:28 +00:00
int exitcode = EXIT_FAILURE ;
2003-05-16 00:46:41 +00:00
streambuf * outbuf = 0 ;
streambuf * errbuf = 0 ;
ofstream log_file ( log_filename . c_str ( ) ) ;
// setup log file
if ( log_file ) {
2006-06-21 14:41:16 +00:00
cerr < < _FB_CONSOLETEXT ( main , LoggingTo , " Logging to " , " Logging to a file " ) < < " : " < < log_filename < < endl ;
2003-05-16 00:46:41 +00:00
log_file < < " ------------------------------------------ " < < endl ;
2006-06-21 14:41:16 +00:00
log_file < < _FB_CONSOLETEXT ( main , LogFile , " Log File " , " " ) < < " : " < < log_filename < < endl ;
2003-05-16 00:46:41 +00:00
showInfo ( log_file ) ;
log_file < < " ------------------------------------------ " < < endl ;
// setup log to use cout and cerr stream
outbuf = cout . rdbuf ( log_file . rdbuf ( ) ) ;
errbuf = cerr . rdbuf ( log_file . rdbuf ( ) ) ;
}
2002-12-01 13:42:15 +00:00
try {
2004-10-18 01:26:54 +00:00
2008-08-22 13:12:01 +00:00
fluxbox . reset ( new Fluxbox ( argc , argv , session_display . c_str ( ) ,
rc_file . c_str ( ) , 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 ) {
2006-06-21 14:41:16 +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 ) {
2006-06-21 14:41:16 +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 ) {
cerr < < " Fluxbox: " < < _FB_CONSOLETEXT ( main , ErrorBadCast , " Bad cast " , " Error message " ) < < " : " < < bc . what ( ) < < endl ;
} catch ( bad_alloc & ba ) {
2006-06-21 14:41:16 +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 ) {
2006-06-21 14:41:16 +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 ) {
2006-06-21 14:41:16 +00:00
cerr < < _FB_CONSOLETEXT ( Common , Error , " Error " , " Error message header " ) < < " : " < < error_str < < endl ;
2002-12-01 13:42:15 +00:00
} catch ( . . . ) {
2006-06-21 14:41:16 +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