// -*- mode: C++; indent-tabs-mode: nil; -*-
-// main.cc for Epistory - a key handler for NETWM/EWMH window managers.
+// main.cc for Epistrophy - a key handler for NETWM/EWMH window managers.
// Copyright (c) 2002 - 2002 Ben Jansens <ben at orodu.net>
//
// Permission is hereby granted, free of charge, to any person obtaining a
# include <unistd.h>
#endif // HAVE_UNISTD_H
-#ifdef HAVE_SIGNAL_H
-# include <signal.h>
-#endif // HAVE_SIGNAL_H
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif // HAVE_STDIO_H
-#ifdef HAVE_SYS_SIGNAL_H
-# include <sys/signal.h>
-#endif // HAVE_SYS_SIGNAL_H
-
-#ifdef HAVE_LIBGEN_H
-# include <libgen.h>
-#endif // HAVE_LIBGEN_H
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif // HAVE_STDLIB_H
}
#include <iostream>
+#include <string>
using std::cout;
using std::endl;
+using std::string;
-bool _shutdown = false;
-char **_argv;
-
-#ifdef HAVE_SIGACTION
-static void signalhandler(int sig)
-#else // HAVE_SIGACTION
-static RETSIGTYPE signalhandler(int sig)
-#endif // HAVE_SIGACTION
-{
- switch (sig) {
- case SIGSEGV:
- cout << "Segmentation fault. Aborting and dumping core.\n";
- abort();
- case SIGHUP:
- cout << "Restarting on request.\n";
- execvp(_argv[0], _argv);
- execvp(basename(_argv[0]), _argv);
- }
- _shutdown = true;
-
-#ifndef HAVE_SIGACTION
- // assume broken, braindead sysv signal semantics
- signal(sig, (RETSIGTYPE (*)(int)) signalhandler);
-#endif // HAVE_SIGACTION
-}
-
-int main(int, char **argv) {
- _argv = argv;
+#include "../../version.h"
+#include "epist.hh"
-#ifdef HAVE_SIGACTION
- struct sigaction action;
+static void usage();
- action.sa_handler = signalhandler;
- action.sa_mask = sigset_t();
- action.sa_flags = SA_NOCLDSTOP | SA_NODEFER;
+int main(int argc, char **argv) {
+ // parse the command line
+ char *display_name = 0;
+ char *rc_file = 0;
- sigaction(SIGPIPE, &action, NULL);
- sigaction(SIGSEGV, &action, NULL);
- sigaction(SIGFPE, &action, NULL);
- sigaction(SIGTERM, &action, NULL);
- sigaction(SIGINT, &action, NULL);
- sigaction(SIGHUP, &action, NULL);
-#else // !HAVE_SIGACTION
- signal(SIGPIPE, (RETSIGTYPE (*)(int)) signalhandler);
- signal(SIGSEGV, (RETSIGTYPE (*)(int)) signalhandler);
- signal(SIGFPE, (RETSIGTYPE (*)(int)) signalhandler);
- signal(SIGTERM, (RETSIGTYPE (*)(int)) signalhandler);
- signal(SIGINT, (RETSIGTYPE (*)(int)) signalhandler);
- signal(SIGHUP, (RETSIGTYPE (*)(int)) signalhandler);
-#endif // HAVE_SIGACTION
-
- while (! _shutdown) {
- usleep(500);
+ for (int i = 1; i < argc; ++i) {
+ const string argvi(argv[i]);
+ if (argvi == "-display") {
+ if (++i >= argc) {
+ fprintf(stderr, "error: '-display' requires an argument\n");
+ exit(1);
+ }
+ display_name = argv[i];
+ } else if (argvi == "-rc") {
+ if (++i >= argc) {
+ fprintf(stderr, "error: '-rc' requires an argument\n");
+ exit(1);
+ }
+ rc_file = argv[i];
+ } else if (argvi == "-help") {
+ usage();
+ } else if (argvi == "-version") {
+ fprintf(stderr, "epist - shipped with openbox %s\n",
+ OPENBOX_VERSION);
+ exit(0);
+ }
+ else
+ usage();
}
+
+ epist ep(argv, display_name, rc_file);
+ ep.eventLoop();
return 0;
}
+
+static void usage()
+{
+ cout << "usage: epist OPTIONS" << endl;
+ cout << endl;
+ cout << "Options:" << endl;
+ cout <<
+ " -rc RCFILE Specifies the path to an alternate rc file to load"
+ << endl <<
+ " -display DISPLAY Specifies the X display to run on" << endl <<
+ " -help Display this help and exit" << endl <<
+ " -version Display the version and exit" << endl <<
+ endl;
+ exit(0);
+}