-// -*- mode: C++; indent-tabs-mode: nil; -*-
+// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
-#include "../version.h"
+/*! @file main.cc
+ @brief Main entry point for the application
+*/
#ifdef HAVE_CONFIG_H
# include "../config.h"
#endif // HAVE_CONFIG_H
extern "C" {
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif // HAVE_LOCALE_H
+
#ifdef HAVE_STDIO_H
-# include <stdio.h>
+# include <stdio.h>
#endif // HAVE_STDIO_H
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif // HAVE_STDLIB_H
-
-#ifdef HAVE_STRING_H
-# include <string.h>
-#endif // HAVE_STRING_H
-
#ifdef HAVE_UNISTD_H
-#include <sys/types.h>
+# include <sys/types.h>
+# include <unistd.h>
#endif // HAVE_UNISTD_H
-#ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif // HAVE_SYS_PARAM_H
+#include "gettext.h"
}
-#include <string>
-using std::string;
-
-#include "blackbox.hh"
-
-
-static void showHelp(int exitval) {
- // print program usage and command line options
- printf("Openbox %s : (c) 2002 - 2002 Ben Jansens\n"
- " -display <string>\t\tuse display connection.\n"
- " -rc <string>\t\t\tuse alternate resource file.\n"
- " -menu <string>\t\tuse alternate menu file.\n"
- " -version\t\t\tdisplay version and exit.\n"
- " -help\t\t\t\tdisplay this help text and exit.\n\n",
- OPENBOX_VERSION);
-
- // some people have requested that we print out compile options
- // as well
- printf("Compile time options:\n"
- " Debugging:\t\t\t%s\n"
- " Shape:\t\t\t%s\n"
- " Xft:\t\t\t\t%s\n"
- " Xinerama:\t\t\t%s\n"
- " 8bpp Ordered Dithering:\t%s\n\n",
-#ifdef DEBUG
- "yes",
-#else // !DEBUG
- "no",
-#endif // DEBUG
-
-#ifdef SHAPE
- "yes",
-#else // !SHAPE
- "no",
-#endif // SHAPE
-
-#ifdef XFT
- "yes",
-#else // !XFT
- "no",
-#endif // XFT
-
-#ifdef XINERAMA
- "yes",
-#else // !XINERAMA
- "no",
-#endif // XINERAMA
-
-#ifdef ORDEREDPSEUDO
- "yes"
-#else // !ORDEREDPSEUDO
- "no"
-#endif // ORDEREDPSEUDO
- );
-
- ::exit(exitval);
-}
+#include "openbox.hh"
+#include "otk/util.hh"
int main(int argc, char **argv) {
- char *session_display = (char *) 0;
- char *rc_file = (char *) 0;
- char *menu_file = (char *) 0;
-
- for (int i = 1; i < argc; ++i) {
- if (! strcmp(argv[i], "-rc")) {
- // look for alternative rc file to use
-
- if ((++i) >= argc) {
- fprintf(stderr, "error: '-rc' requires and argument\n");
-
- ::exit(1);
- }
-
- rc_file = argv[i];
- } else if (! strcmp(argv[i], "-menu")) {
- // look for alternative menu file to use
-
- if ((++i) >= argc) {
- fprintf(stderr, "error: '-menu' requires and argument\n");
-
- ::exit(1);
- }
-
- menu_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, "error: '-display' requires an argument\n");
-
- ::exit(1);
- }
-
- session_display = argv[i];
- string dtmp = "DISPLAY=";
- dtmp += session_display;
-
- if (putenv(const_cast<char*>(dtmp.c_str()))) {
- fprintf(stderr,
- "warning: couldn't set environment variable 'DISPLAY'\n");
- perror("putenv()");
- }
- } else if (! strcmp(argv[i], "-version")) {
- // print current version string
- printf("Openbox %s : (c) 2002 - 2002 Ben Jansens\n",
- OPENBOX_VERSION);
-
- ::exit(0);
- } else if (! strcmp(argv[i], "-help")) {
- showHelp(0);
- } else { // invalid command line option
- showHelp(-1);
+ // initialize the locale
+ if (!setlocale(LC_ALL, ""))
+ printf("Couldn't set locale from environment.\n");
+ bindtextdomain(PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset(PACKAGE, "UTF-8");
+ textdomain(PACKAGE);
+
+ ob::Openbox *openbox = new ob::Openbox(argc, argv);
+ openbox->eventLoop();
+
+ if (openbox->doRestart()) {
+ std::string prog = openbox->restartProgram();
+
+ delete openbox; // shutdown the current one!
+
+ if (!prog.empty()) {
+ execl("/bin/sh", "/bin/sh", "-c", prog.c_str(), NULL);
+ perror(prog.c_str());
}
+
+ // fall back in case the above execlp doesn't work
+ execvp(argv[0], argv);
+ execvp(otk::basename(argv[0]).c_str(), argv);
}
-#ifdef __EMX__
- _chdir2(getenv("X11ROOT"));
-#endif // __EMX__
-
- Blackbox blackbox(argv, session_display, rc_file);
- blackbox.eventLoop();
-
- return(0);
+ delete openbox; // shutdown
}