2003-04-27 01:51:04 +00:00
// main.cc for Fluxbox Window manager
2005-01-24 18:34:57 +00:00
// Copyright (c) 2001 - 2005 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.
2004-11-19 11:37:27 +00:00
// $Id$
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
2003-08-28 23:18:37 +00:00
# include "FbTk/Theme.hh"
2004-06-07 11:46:05 +00:00
# include "FbTk/I18n.hh"
2004-10-18 01:26:54 +00:00
# include "FbTk/StringUtil.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_CSTDIO
# include <cstdio>
# else
# include <stdio.h>
# endif
# ifdef HAVE_CSTDLIB
# include <cstdlib>
# else
# include <stdlib.h>
# endif
# 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
2001-12-11 20:47:02 +00:00
using namespace std ;
2003-05-16 00:46:41 +00:00
void showInfo ( ostream & ostr ) {
2004-06-07 11:46:05 +00:00
_FB_USES_NLS ;
ostr < < _FBTEXT ( Common , FluxboxVersion , " Fluxbox version " , " Fluxbox version heading " ) < < " : " < < __fluxbox_version < < endl ;
2004-02-28 10:32:06 +00:00
# if defined(__DATE__) && defined(__TIME__)
2004-06-07 11:46:05 +00:00
ostr < < _FBTEXT ( 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
2004-06-07 11:46:05 +00:00
ostr < < _FBTEXT ( 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
2004-06-07 11:46:05 +00:00
ostr < < _FBTEXT ( 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
2004-06-07 11:46:05 +00:00
ostr < < endl < < _FBTEXT ( Common , Defaults , " Defaults " , " Default values compiled in " ) < < " : " < < endl ;
2004-10-18 01:26:54 +00:00
2004-06-07 11:46:05 +00:00
ostr < < _FBTEXT ( Common , DefaultMenuFile , " menu " , " default menu file (right aligned - make sure same width as other default values) " ) < < " : " < < DEFAULTMENU < < endl ;
ostr < < _FBTEXT ( 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
2004-06-07 11:46:05 +00:00
ostr < < _FBTEXT ( Common , DefaultKeyFile , " keys " , " default key file (right aligned - make sure same width as other default values) " ) < < " : " < < DEFAULTKEYSFILE < < endl ;
ostr < < _FBTEXT ( Common , DefaultInitFile , " init " , " default init file (right aligned - make sure same width as other default values) " ) < < " : " < < DEFAULT_INITFILE < < endl ;
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 < <
_FBTEXT ( Common , CompiledOptions , " Compiled options " , " Options used when compiled " )
< < " ( " < < NOT < < " => " < <
_FBTEXT ( Common , Disabled , " disabled " , " option is turned off " ) < < " ): " < < endl < <
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
2003-05-16 00:46:41 +00:00
# ifndef SLIT
NOT < <
# endif // SLIT
" SLIT " < < endl < <
2003-07-11 15:03:02 +00:00
# ifndef USE_TOOLBAR
NOT < <
# endif // USE_TOOLBAR
" TOOLBAR " < < endl < <
2003-05-16 00:46:41 +00:00
# ifndef HAVE_XPM
NOT < <
# endif // HAVE_XPM
" XPM " < < 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 < <
2003-05-16 00:46:41 +00:00
# ifndef USE_GNOME
NOT < <
2004-10-18 01:26:54 +00:00
# endif // USE_GNOME
2003-05-16 00:46:41 +00:00
" GNOME " < < endl < <
2003-07-11 15:03:02 +00:00
2003-05-16 00:46:41 +00:00
# ifndef KDE
NOT < <
# endif // KDE
" KDE " < < endl < <
2003-07-11 15:03:02 +00:00
2003-05-16 00:46:41 +00:00
# ifndef USE_NEWWMSPEC
NOT < <
# endif // USE_NEWWMSPEC
" EWMH " < < 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
2003-05-16 00:46:41 +00:00
# ifndef SHAPE
NOT < <
# endif // SHAPE
" SHAPE " < < endl < <
2003-07-11 15:03:02 +00:00
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
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
2003-05-16 00:46:41 +00:00
# ifndef XINERAMA
NOT < <
# endif // XINERAMA
" XINERAMA " < < endl < <
2003-07-11 15:03:02 +00:00
2003-05-16 00:46:41 +00:00
# ifndef HAVE_XRENDER
NOT < <
# endif // HAVE_XRENDER
" RENDER " < < endl < <
endl ;
}
2001-12-11 20:47:02 +00:00
int main ( int argc , char * * argv ) {
2004-10-18 01:26:54 +00:00
2003-10-02 16:14:41 +00:00
std : : string session_display = " " ;
2003-05-16 00:46:41 +00:00
std : : string rc_file ;
std : : string log_filename ;
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 ) {
if ( ! strcmp ( argv [ i ] , " -rc " ) ) {
// look for alternative rc file to use
if ( ( + + i ) > = argc ) {
2004-06-07 11:46:05 +00:00
cerr < < _FBTEXT ( main , RCRequiresArg ,
" error: '-rc' requires an argument " , " the -rc option requires a file argument " ) < < endl ; ;
2002-12-01 13:42:15 +00:00
exit ( 1 ) ;
}
rc_file = argv [ i ] ;
} else if ( ! strcmp ( argv [ i ] , " -display " ) ) {
// check for -display option... to run on a display other than the one
// set by the environment variable DISPLAY
if ( ( + + i ) > = argc ) {
2004-06-07 11:46:05 +00:00
cerr < < _FBTEXT ( main , DISPLAYRequiresArg ,
" error: '-display' requires an argument " ,
" " ) < < endl ;
2002-12-01 13:42:15 +00:00
exit ( 1 ) ;
}
session_display = argv [ i ] ;
2003-05-16 00:46:41 +00:00
std : : string display_env = " DISPLAY= " + session_display ;
if ( putenv ( const_cast < char * > ( display_env . c_str ( ) ) ) ) {
2004-10-11 22:48:35 +00:00
cerr < < _FBTEXT ( 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() " ) ;
}
2003-05-07 22:19:59 +00:00
} else if ( strcmp ( argv [ i ] , " -version " ) = = 0 | | strcmp ( argv [ i ] , " -v " ) = = 0 ) {
2002-12-01 13:42:15 +00:00
// print current version string
2005-01-18 19:06:04 +00:00
cout < < " Fluxbox " < < __fluxbox_version < < " : (c) 2001-2005 Henrik Kinnunen " < < endl < < endl ;
2002-12-01 13:42:15 +00:00
exit ( 0 ) ;
2003-05-16 00:46:41 +00:00
} else if ( strcmp ( argv [ i ] , " -log " ) = = 0 ) {
if ( i + 1 > = argc ) {
2004-06-07 11:46:05 +00:00
cerr < < _FBTEXT ( main , LOGRequiresArg , " error: '-log' needs an argument " , " " ) < < endl ;
2003-05-16 00:46:41 +00:00
exit ( 1 ) ;
}
log_filename = argv [ + + i ] ;
2003-05-07 22:19:59 +00:00
} else if ( strcmp ( argv [ i ] , " -help " ) = = 0 | | strcmp ( argv [ i ] , " -h " ) = = 0 ) {
2002-12-01 13:42:15 +00:00
// print program usage and command line options
2004-06-07 11:46:05 +00:00
printf ( _FBTEXT ( main , Usage ,
" Fluxbox %s : (c) %s Henrik Kinnunen \n "
" Website: http://www.fluxbox.org/ \n \n "
" \t -display <string> \t \t use display connection. \n "
" \t -rc <string> \t \t \t use alternate resource file. \n "
" \t -version \t \t \t display version and exit. \n "
" \t -info \t \t \t \t display some useful information. \n "
" \t -log <filename> \t \t \t log output to file. \n "
" \t -help \t \t \t \t display this help text and exit. \n \n " ,
" Main usage string. Please lay it out nicely. There is one %s that is given the version " ) ,
2004-01-11 16:14:41 +00:00
__fluxbox_version , " 2001-2004 " ) ;
2003-05-16 00:46:41 +00:00
exit ( 0 ) ;
2003-05-07 23:17:24 +00:00
} else if ( strcmp ( argv [ i ] , " -info " ) = = 0 | | strcmp ( argv [ i ] , " -i " ) = = 0 ) {
2003-05-16 00:46:41 +00:00
showInfo ( cout ) ;
2003-07-10 12:01:17 +00:00
exit ( 0 ) ;
2003-08-28 23:18:37 +00:00
} else if ( strcmp ( argv [ i ] , " -verbose " ) = = 0 ) {
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__
2003-05-16 00:46:41 +00:00
std : : 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 ) {
2004-06-07 11:46:05 +00:00
cerr < < _FBTEXT ( main , LoggingTo , " Logging to " , " Logging to a file " ) < < " : " < < log_filename < < endl ;
2003-05-16 00:46:41 +00:00
log_file < < " ------------------------------------------ " < < endl ;
2004-06-07 11:46:05 +00:00
log_file < < _FBTEXT ( 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
2003-05-16 00:46:41 +00:00
fluxbox . reset ( new Fluxbox ( argc , argv , session_display . c_str ( ) , rc_file . c_str ( ) ) ) ;
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
2002-12-02 22:02:35 +00:00
} catch ( std : : out_of_range & oor ) {
2004-06-07 11:46:05 +00:00
cerr < < " Fluxbox: " < < _FBTEXT ( main , ErrorOutOfRange , " Out of range " , " Error message " ) < < " : " < < oor . what ( ) < < endl ;
2002-12-02 22:02:35 +00:00
} catch ( std : : runtime_error & re ) {
2004-06-07 11:46:05 +00:00
cerr < < " Fluxbox: " < < _FBTEXT ( main , ErrorRuntime , " Runtime error " , " Error message " ) < < " : " < < re . what ( ) < < endl ;
2002-12-02 22:02:35 +00:00
} catch ( std : : bad_cast & bc ) {
2004-06-07 11:46:05 +00:00
cerr < < " Fluxbox: " < < _FBTEXT ( main , ErrorBadCast , " Bad cast " , " Error message " ) < < " : " < < bc . what ( ) < < endl ;
2002-12-02 22:02:35 +00:00
} catch ( std : : bad_alloc & ba ) {
2004-06-07 11:46:05 +00:00
cerr < < " Fluxbox: " < < _FBTEXT ( main , ErrorBadAlloc , " Bad Alloc " , " Error message " ) < < " : " < < ba . what ( ) < < endl ;
2002-12-02 22:02:35 +00:00
} catch ( std : : exception & e ) {
2004-06-07 11:46:05 +00:00
cerr < < " Fluxbox: " < < _FBTEXT ( main , ErrorStandardException , " Standard Exception " , " Error message " ) < < " : " < < e . what ( ) < < endl ;
2002-12-02 22:02:35 +00:00
} catch ( std : : string error_str ) {
2004-06-07 11:46:05 +00:00
cerr < < _FBTEXT ( Common , Error , " Error " , " Error message header " ) < < " : " < < error_str < < endl ;
2002-12-01 13:42:15 +00:00
} catch ( . . . ) {
2004-06-07 11:46:05 +00:00
cerr < < " Fluxbox: " < < _FBTEXT ( 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 ;
std : : string restart_argument ;
if ( fluxbox . get ( ) ) {
restarting = fluxbox - > isRestarting ( ) ;
restart_argument = fluxbox - > getRestartArgument ( ) ;
}
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 ) ;
2004-10-18 01:26:54 +00:00
if ( restarting ) {
if ( restart_argument . c_str ( ) ) {
execlp ( restart_argument . c_str ( ) , restart_argument . c_str ( ) , 0 ) ;
perror ( restart_argument . c_str ( ) ) ;
}
// fall back in case the above execlp doesn't work
execvp ( argv [ 0 ] , argv ) ;
execvp ( FbTk : : StringUtil : : basename ( argv [ 0 ] ) . c_str ( ) , argv ) ;
}
2002-12-03 01:46:28 +00:00
return exitcode ;
2001-12-11 20:47:02 +00:00
}