/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
openbox.c for the Openbox window manager
+ Copyright (c) 2006 Mikael Magnusson
Copyright (c) 2003 Ben Jansens
This program is free software; you can redistribute it and/or modify
# include <sys/stat.h>
# include <sys/types.h>
#endif
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/types.h>
+# include <sys/wait.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
+#include <errno.h>
#include <X11/cursorfont.h>
static gboolean xsync;
static gboolean reconfigure;
static gboolean restart;
-static char *restart_path;
+static gchar *restart_path;
static Cursor cursors[OB_NUM_CURSORS];
static KeyCode keys[OB_NUM_KEYS];
static gint exitcode = 0;
-static void signal_handler(int signal, gpointer data);
-static void parse_args(int argc, char **argv);
+static void signal_handler(gint signal, gpointer data);
+static void parse_args(gint argc, gchar **argv);
-int main(int argc, char **argv)
+gint main(gint argc, gchar **argv)
{
#ifdef DEBUG
ob_debug_show_output(TRUE);
/* initialize the locale */
if (!setlocale(LC_ALL, ""))
- g_warning("Couldn't set locale from environment.\n");
+ g_warning("Couldn't set locale from environment.\n");
bindtextdomain(PACKAGE_NAME, LOCALEDIR);
bind_textdomain_codeset(PACKAGE_NAME, "UTF-8");
textdomain(PACKAGE_NAME);
g_set_prgname(argv[0]);
- chdir(g_get_home_dir());
+ if (chdir(g_get_home_dir()) == -1)
+ g_warning("Unable to change to home directory (%s): %s",
+ g_get_home_dir(), g_strerror(errno));
parse_paths_startup();
ob_display = XOpenDisplay(NULL);
if (ob_display == NULL)
- ob_exit_with_error("Failed to open the display.");
+ ob_exit_with_error("Failed to open the display.");
if (fcntl(ConnectionNumber(ob_display), F_SETFD, 1) == -1)
ob_exit_with_error("Failed to set display as close-on-exec.");
ob_main_loop_signal_add(ob_main_loop, SIGINT, signal_handler, NULL, NULL);
ob_main_loop_signal_add(ob_main_loop, SIGHUP, signal_handler, NULL, NULL);
ob_main_loop_signal_add(ob_main_loop, SIGPIPE, signal_handler, NULL, NULL);
+ ob_main_loop_signal_add(ob_main_loop, SIGCHLD, signal_handler, NULL, NULL);
ob_screen = DefaultScreen(ob_display);
/* check for locale support */
if (!XSupportsLocale())
- g_warning("X server does not support locale.");
+ g_warning("X server does not support locale.");
if (!XSetLocaleModifiers(""))
- g_warning("Cannot set locale modifiers for the X server.");
+ g_warning("Cannot set locale modifiers for the X server.");
/* set our error handler */
XSetErrorHandler(xerror_handler);
if (restart) {
if (restart_path != NULL) {
- int argcp;
- char **argvp;
+ gint argcp;
+ gchar **argvp;
GError *err = NULL;
- /* run other shit */
+ /* run other window manager */
if (g_shell_parse_argv(restart_path, &argcp, &argvp, &err)) {
execvp(argvp[0], argvp);
g_strfreev(argvp);
} else {
g_warning("failed to execute '%s': %s", restart_path,
err->message);
+ g_error_free(err);
}
}
/* re-run me */
execvp(argv[0], argv); /* try how we were run */
- execlp(argv[0], g_path_get_basename(argv[0])); /* last resort */
+ execlp(argv[0], g_path_get_basename(argv[0]),
+ (char *)NULL); /* last resort */
}
return exitcode;
}
-static void signal_handler(int signal, gpointer data)
+static void signal_handler(gint signal, gpointer data)
{
- if (signal == SIGUSR1) {
+ switch (signal) {
+ case SIGUSR1:
ob_debug("Caught signal %d. Restarting.\n", signal);
ob_restart();
- } else if (signal == SIGUSR2) {
+ break;
+ case SIGUSR2:
ob_debug("Caught signal %d. Reconfiguring.\n", signal);
- ob_reconfigure();
- } else {
+ ob_reconfigure();
+ break;
+ case SIGCHLD:
+ /* reap children */
+ while (waitpid(-1, NULL, WNOHANG) > 0);
+ break;
+ default:
ob_debug("Caught signal %d. Exiting.\n", signal);
/* TERM and INT return a 0 code */
ob_exit(!(signal == SIGTERM || signal == SIGINT));
static void print_version()
{
g_print("Openbox %s\n", PACKAGE_VERSION);
- g_print("Copyright (c) 2003 Ben Jansens, and others\n\n");
+ g_print("Copyright (c) 2006 Mikael Magnusson\n");
+ g_print("Copyright (c) 2003 Ben Jansens\n\n");
g_print("This program comes with ABSOLUTELY NO WARRANTY.\n");
g_print("This is free software, and you are welcome to redistribute it\n");
g_print("under certain conditions. See the file COPYING for details.\n\n");
g_print(" --version Display the version and exit\n");
g_print(" --sync Run in synchronous mode (this is slow and "
"meant for\n"
- " debugging X routines)\n");
+ " debugging X routines)\n");
g_print(" --debug Display debugging output\n");
g_print("\nPlease report bugs at %s\n\n", PACKAGE_BUGREPORT);
}
-static void parse_args(int argc, char **argv)
+static void parse_args(gint argc, gchar **argv)
{
- int i;
+ gint i;
for (i = 1; i < argc; ++i) {
if (!strcmp(argv[i], "--version")) {