2003-04-27 01:51:04 +00:00
|
|
|
// main.cc for Fluxbox Window manager
|
2003-05-16 00:46:41 +00:00
|
|
|
// 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,
|
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-02-28 10:32:06 +00:00
|
|
|
// $Id: main.cc,v 1.29 2004/02/28 10:32:06 fluxgen Exp $
|
2001-12-11 20:47:02 +00:00
|
|
|
|
|
|
|
#include "fluxbox.hh"
|
2003-06-12 14:37:21 +00:00
|
|
|
#include "I18n.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"
|
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
|
|
|
|
|
|
|
|
#include <cstdio>
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <cstring>
|
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) {
|
|
|
|
ostr<<"Fluxbox version: "<<__fluxbox_version<<endl;
|
2004-02-28 10:32:06 +00:00
|
|
|
#if defined(__DATE__) && defined(__TIME__)
|
2003-05-16 00:46:41 +00:00
|
|
|
ostr<<"Compiled: "<<__DATE__<<" "<<__TIME__<<endl;
|
|
|
|
#endif
|
2004-02-28 10:32:06 +00:00
|
|
|
#ifdef __fluxbox_compiler
|
|
|
|
ostr<<"Compiler: "<<__fluxbox_compiler<<endl;
|
|
|
|
#endif // __fluxbox_compiler
|
|
|
|
#ifdef __fluxbox_compiler_version
|
|
|
|
ostr<<"Compiler version: "<<__fluxbox_compiler_version<<endl;
|
|
|
|
#endif // __fluxbox_compiler_version
|
2003-05-16 00:46:41 +00:00
|
|
|
|
2003-07-18 15:44:36 +00:00
|
|
|
ostr<<endl<<"Defaults:"<<endl;
|
|
|
|
ostr<<" menu: "<<DEFAULTMENU<<endl;
|
|
|
|
ostr<<" style: "<<DEFAULTSTYLE<<endl;
|
|
|
|
|
|
|
|
ostr<<" keys: "<<DEFAULTKEYSFILE<<endl;
|
|
|
|
ostr<<" init: "<<DEFAULT_INITFILE<<endl;
|
|
|
|
|
2003-05-16 00:46:41 +00:00
|
|
|
const char NOT[] = "-";
|
2003-07-18 15:44:36 +00:00
|
|
|
ostr<<endl<<"Compiled options ("<<NOT<<" => disabled): "<<endl<<
|
2003-05-16 00:46:41 +00:00
|
|
|
#ifndef DEBUG
|
|
|
|
NOT<<
|
|
|
|
#endif // DEBUG
|
|
|
|
"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
|
|
|
|
2003-05-16 00:46:41 +00:00
|
|
|
#ifndef USE_GNOME
|
|
|
|
NOT<<
|
|
|
|
#endif // USE_GNOME
|
|
|
|
"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) {
|
2002-01-09 14:11:20 +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
|
|
|
|
2002-12-09 22:51:23 +00:00
|
|
|
NLSInit("fluxbox.cat");
|
2003-05-16 00:46:41 +00:00
|
|
|
I18n &i18n = *I18n::instance();
|
2001-12-11 20:47:02 +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) {
|
|
|
|
fprintf(stderr,
|
2003-05-16 00:46:41 +00:00
|
|
|
i18n.getMessage(FBNLS::mainSet, FBNLS::mainRCRequiresArg,
|
2002-12-02 22:02:35 +00:00
|
|
|
"error: '-rc' requires and argument\n"));
|
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) {
|
|
|
|
fprintf(stderr,
|
2003-05-16 00:46:41 +00:00
|
|
|
i18n.getMessage(FBNLS::mainSet, FBNLS::mainDISPLAYRequiresArg,
|
2002-12-02 22:02:35 +00:00
|
|
|
"error: '-display' requires an argument\n"));
|
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()))) {
|
2002-12-01 13:42:15 +00:00
|
|
|
fprintf(stderr,
|
2003-05-16 00:46:41 +00:00
|
|
|
i18n.
|
|
|
|
getMessage(FBNLS::mainSet, FBNLS::mainWarnDisplaySet,
|
2002-12-02 22:02:35 +00:00
|
|
|
"warning: couldn't set environment variable 'DISPLAY'\n"));
|
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);
|
2003-05-16 00:46:41 +00:00
|
|
|
} else if (strcmp(argv[i], "-log") == 0 ) {
|
|
|
|
if (i + 1 >= argc) {
|
2003-12-09 08:48:08 +00:00
|
|
|
cerr<<"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
|
2003-05-16 00:46:41 +00:00
|
|
|
printf(i18n.
|
|
|
|
getMessage(FBNLS::mainSet, FBNLS::mainUsage,
|
|
|
|
"Fluxbox %s : (c) %s Henrik Kinnunen\n"
|
|
|
|
"Website: http://www.fluxbox.org/ \n\n"
|
2002-12-02 22:02:35 +00:00
|
|
|
" -display <string>\t\tuse display connection.\n"
|
|
|
|
" -rc <string>\t\t\tuse alternate resource file.\n"
|
|
|
|
" -version\t\t\tdisplay version and exit.\n"
|
2003-05-16 00:46:41 +00:00
|
|
|
" -info\t\t\t\tdisplay some useful information.\n"
|
|
|
|
"\t-log <filename>\t\t\tlog output to file.\n"
|
2002-12-02 22:02:35 +00:00
|
|
|
" -help\t\t\t\tdisplay this help text and exit.\n\n"),
|
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) {
|
|
|
|
cerr<<"Loggin to: "<<log_filename<<endl;
|
|
|
|
log_file<<"------------------------------------------"<<endl;
|
|
|
|
log_file<<"Logfile: "<<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 {
|
2001-12-11 20:47:02 +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
|
|
|
|
2002-12-03 01:46:28 +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) {
|
2002-12-01 13:42:15 +00:00
|
|
|
cerr<<"Fluxbox: Out of range: "<<oor.what()<<endl;
|
2002-12-02 22:02:35 +00:00
|
|
|
} catch (std::runtime_error &re) {
|
2002-12-01 13:42:15 +00:00
|
|
|
cerr<<"Fluxbox: Runtime error: "<<re.what()<<endl;
|
2002-12-02 22:02:35 +00:00
|
|
|
} catch (std::bad_cast &bc) {
|
|
|
|
cerr<<"Fluxbox: Bad cast: "<<bc.what()<<endl;
|
|
|
|
} catch (std::bad_alloc &ba) {
|
|
|
|
cerr<<"Fluxbox: Bad Alloc: "<<ba.what()<<endl;
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
cerr<<"Fluxbox: Standard exception: "<<e.what()<<endl;
|
|
|
|
} catch (std::string error_str) {
|
|
|
|
cerr<<"Error: "<<error_str<<endl;
|
2002-12-01 13:42:15 +00:00
|
|
|
} catch (...) {
|
|
|
|
cerr<<"Fluxbox: Unknown error."<<endl;
|
2002-12-02 22:02:35 +00:00
|
|
|
abort();
|
2002-12-01 13:42:15 +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);
|
|
|
|
|
2002-12-03 01:46:28 +00:00
|
|
|
return exitcode;
|
2001-12-11 20:47:02 +00:00
|
|
|
}
|