From af7a2aef84263c1fc3a39216ffad64ca01ea4b34 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan <fourdan.olivier@wanadoo.fr> Date: Fri, 20 Dec 2002 12:05:53 +0000 Subject: [PATCH] Change startup behaviour so that xfwm4 turns into a deamon once initialization is performed. *Beware* requires libxfcegui4 >= 0.0.9 (Old svn revision: 10802) --- configure | 2 +- configure.in | 2 +- src/main.c | 65 +++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/configure b/configure index b150d3dc6..97f9588d7 100755 --- a/configure +++ b/configure @@ -4700,7 +4700,7 @@ fi; GLIB_REQUIRED_VERSION=2.0.0 GTK_REQUIRED_VERSION=2.0.0 PANGO_REQUIRED_VERSION=1.0.0 -LIBXFCEGUI4_REQUIRED_VERSION=0.0.8 +LIBXFCEGUI4_REQUIRED_VERSION=0.0.9 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index ef5b22877..02a786ccd 100644 --- a/configure.in +++ b/configure.in @@ -32,7 +32,7 @@ AC_ARG_ENABLE(debug, [ --enable-debug use this option if you want to debug xfwm GLIB_REQUIRED_VERSION=2.0.0 GTK_REQUIRED_VERSION=2.0.0 PANGO_REQUIRED_VERSION=1.0.0 -LIBXFCEGUI4_REQUIRED_VERSION=0.0.8 +LIBXFCEGUI4_REQUIRED_VERSION=0.0.9 AC_DEFINE_UNQUOTED(GLIB_REQUIRED_VERSION, $GLIB_REQUIRED_VERSION, [Define glib required version.]) AC_DEFINE_UNQUOTED(GTK_REQUIRED_VERSION, $GTK_REQUIRED_VERSION, [Define gtk required version.]) diff --git a/src/main.c b/src/main.c index 5330d68a3..ff421e8f0 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,17 @@ # include "config.h" #endif +#include <unistd.h> +#include <signal.h> +#include <sys/types.h> + #include <gtk/gtk.h> #include <gdk/gdk.h> #include <gdk/gdkx.h> #include <glib.h> #include <X11/Xlib.h> #include <libxfcegui4/libxfcegui4.h> + #include "main.h" #include "events.h" #include "frame.h" @@ -64,7 +69,7 @@ int shape, shape_event; Cursor resize_cursor[7], move_cursor, root_cursor; SessionClient *client_session; -int handleXError(Display * dpy, XErrorEvent * err) +static int handleXError(Display * dpy, XErrorEvent * err) { switch (err->error_code) { @@ -82,7 +87,7 @@ int handleXError(Display * dpy, XErrorEvent * err) return 0; } -void cleanUp() +static void cleanUp() { int i; @@ -113,7 +118,7 @@ static void session_die(gpointer client_data) gdk_flush(); } -void handleSignal(int sig) +static void handleSignal(int sig) { DBG("entering handleSignal\n"); @@ -137,7 +142,7 @@ void handleSignal(int sig) } } -void initialize(int argc, char **argv) +static int initialize(int argc, char **argv) { PangoLayout *layout; struct sigaction act; @@ -196,7 +201,10 @@ void initialize(int argc, char **argv) XDefineCursor(dpy, root, root_cursor); - initEventFilter(MAIN_EVENT_MASK, NULL, "xfwm"); + if (!initEventFilter(MAIN_EVENT_MASK, NULL, "xfwm")) + { + return (-1); + } pushEventFilter(xfwm4_event_filter, NULL); gnome_win = getDefaultXWindow(); @@ -235,13 +243,54 @@ void initialize(int argc, char **argv) g_object_unref(G_OBJECT(layout)); clientFrameAll(); + return (0); } -int main(int argc, char **argv) +static void p_action(int sig) { - initialize(argc, argv); - gtk_main(); +} + +int run_daemon(int argc, char **argv) +{ + pid_t ppid; + int status = initialize(argc, argv); + ppid = getppid(); + kill(ppid, SIGUSR1); + if (status < 0) + { + g_error("Another Window Manager is already running"); + } + else + { + gtk_main(); + } cleanUp(); g_message("xfwm4 terminated\n"); return 0; } + +int main(int argc, char **argv) +{ + pid_t pid, ppid; + static struct sigaction pact, cact; + + /* set SIGUSR1 action for parent */ ; + pact.sa_handler = p_action; + sigaction(SIGUSR1, &pact, NULL); + + switch (pid = fork()) + { + case -1: + perror("fork()"); + exit(1); + break; + case 0: /* child */ + return run_daemon(argc, argv); + break; + default: /* parent */ + pause(); /* wait for child signal */ + g_message("init complete."); + } + return 0; +} + -- GitLab