fluxbox/src/main.cc

301 lines
10 KiB
C++
Raw Normal View History

2003-04-27 01:51:04 +00:00
// main.cc for Fluxbox Window manager
// Copyright (c) 2001 - 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net)
// and 2003 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,
// 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.
// $Id: main.cc,v 1.33 2004/10/18 01:26:54 akir Exp $
2001-12-11 20:47:02 +00:00
#include "fluxbox.hh"
#include "version.h"
#include "defaults.hh"
2004-01-11 13:12:02 +00:00
#include "FbTk/Theme.hh"
2004-06-07 11:46:05 +00:00
#include "FbTk/I18n.hh"
#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>
#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;
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;
#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
2004-06-07 11:46:05 +00:00
ostr<<endl<<_FBTEXT(Common, Defaults, "Defaults", "Default values compiled in")<<":"<<endl;
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-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;
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<<
#ifndef DEBUG
NOT<<
#endif // DEBUG
"DEBUG"<<endl<<
2003-07-11 15:03:02 +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<<
#ifndef HAVE_XPM
NOT<<
#endif // HAVE_XPM
"XPM"<<endl<<
2003-07-11 15:03:02 +00:00
#ifndef USE_GNOME
NOT<<
#endif // USE_GNOME
"GNOME"<<endl<<
2003-07-11 15:03:02 +00:00
#ifndef KDE
NOT<<
#endif // KDE
"KDE"<<endl<<
2003-07-11 15:03:02 +00:00
#ifndef USE_NEWWMSPEC
NOT<<
#endif // USE_NEWWMSPEC
"EWMH"<<endl<<
2003-07-11 15:03:02 +00:00
#ifndef REMEMBER
NOT<<
#endif // REMEMBER
"REMEMBER"<<endl<<
2003-07-11 15:03:02 +00:00
#ifndef SHAPE
NOT<<
#endif // SHAPE
"SHAPE"<<endl<<
2003-07-11 15:03:02 +00:00
#ifndef USE_XFT
NOT<<
#endif // USE_XFT
"XFT"<<endl<<
2003-07-11 15:03:02 +00:00
#ifndef USE_XMB
NOT<<
#endif // USE_XMB
"XMB"<<endl<<
2003-07-11 15:03:02 +00:00
#ifndef XINERAMA
NOT<<
#endif // XINERAMA
"XINERAMA"<<endl<<
2003-07-11 15:03:02 +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) {
std::string session_display = "";
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;
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];
std::string display_env = "DISPLAY=" + session_display;
if (putenv(const_cast<char *>(display_env.c_str()))) {
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
2004-01-12 12:25:16 +00:00
cout<<"Fluxbox "<<__fluxbox_version<<" : (c) 2001-2004 Henrik Kinnunen "<<endl<<endl;
2002-12-01 13:42:15 +00:00
exit(0);
} 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;
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\tuse display connection.\n"
"\t-rc <string>\t\t\tuse alternate resource file.\n"
"\t-version\t\t\tdisplay version and exit.\n"
"\t-info\t\t\t\tdisplay some useful information.\n"
"\t-log <filename>\t\t\tlog output to file.\n"
"\t-help\t\t\t\tdisplay 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");
exit(0);
} else if (strcmp(argv[i], "-info") == 0 || strcmp(argv[i], "-i") == 0) {
showInfo(cout);
2003-07-10 12:01:17 +00:00
exit(0);
} 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__
std::auto_ptr<Fluxbox> fluxbox;
2002-12-03 01:46:28 +00:00
int exitcode=EXIT_FAILURE;
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;
log_file<<"------------------------------------------"<<endl;
2004-06-07 11:46:05 +00:00
log_file<<_FBTEXT(main, LogFile, "Log File", "")<<": "<<log_filename<<endl;
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 {
fluxbox.reset(new Fluxbox(argc, argv, session_display.c_str(), rc_file.c_str()));
2002-12-01 13:42:15 +00:00
fluxbox->eventLoop();
exitcode = EXIT_SUCCESS;
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
}
bool restarting = fluxbox->isRestarting();
const std::string restart_argument(fluxbox->getRestartArgument());
2004-01-11 13:12:02 +00:00
// destroy fluxbox
fluxbox.reset(0);
// restore cout and cin streams
if (outbuf != 0)
cout.rdbuf(outbuf);
if (errbuf != 0)
cerr.rdbuf(errbuf);
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
}