--- xinit-1.1.0/configure.ac.poke-ck 2008-06-12 21:26:07.000000000 +0200 +++ xinit-1.1.0/configure.ac 2009-04-13 07:56:19.000000000 +0200 @@ -123,7 +123,7 @@ AM_CONDITIONAL(LAUNCHD, [test "x$LAUNCHD" = "xyes"]) # Checks for pkg-config packages -PKG_CHECK_MODULES(XINIT, x11) +PKG_CHECK_MODULES(XINIT, x11 ck-connector) case $host_os in *bsd*) --- xinit-1.1.0/startx.cpp.poke-ck 2009-04-13 07:56:19.000000000 +0200 +++ xinit-1.1.0/startx.cpp 2009-04-13 07:56:19.000000000 +0200 @@ -144,6 +144,12 @@ #endif fi +if [ x"$display" != x ]; then + export DISPLAY=$display +else + export DISPLAY=:0 +fi + #if defined(__SCO__) || defined(__UNIXWARE__) XCOMM SCO -t option: do not start an X server --- xinit-1.1.0/xinit.c.poke-ck 2009-04-13 07:56:19.000000000 +0200 +++ xinit-1.1.0/xinit.c 2009-04-13 07:56:19.000000000 +0200 @@ -1,3 +1,4 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- /* $Xorg: xinit.c,v 1.5 2001/02/09 02:05:49 xorgcvs Exp $ */ /* $XdotOrg: $ */ @@ -39,6 +40,13 @@ #include <ctype.h> #include <stdint.h> +#define USE_CONKIT +#ifdef USE_CONKIT +#include <ck-connector.h> +#include <X11/Xatom.h> +static CkConnector *ckc = NULL; +#endif /* USE_CONKIT */ + #ifdef X_POSIX_C_SOURCE #define _POSIX_C_SOURCE X_POSIX_C_SOURCE #include <signal.h> @@ -521,6 +529,39 @@ return( serverpid != pidfound ); } + +#ifdef USE_CONKIT +static void +register_new_session_with_console_kit (void) +{ + static char conkitbuf[256]; + DBusError error; + + ckc = ck_connector_new (); + if (ckc == NULL) { + Error ("Cannot register with ConsoleKit: OOM creating CkConnector\n"); + goto out; + } + + dbus_error_init (&error); + if (!ck_connector_open_session (ckc, &error)) { + Error ("Cannot register with ConsoleKit: %s: %s\n", error.name, error.message); + goto out; + } + + /* If we managed to register with ConsoleKit, put the + * environment variable XDG_SESSION_COOKIE=cookie as second + * element in newenviron. See set_environment() where we + * earlier have made sure there is room... + */ + conkitbuf[sizeof (conkitbuf) - 1] = '\0'; + snprintf (conkitbuf, sizeof (conkitbuf) - 1, "XDG_SESSION_COOKIE=%s", ck_connector_get_cookie (ckc)); + newenviron[1] = conkitbuf; +out: + ; +} +#endif /* USE_CONKIT */ + static int startServer(char *server[]) { @@ -631,6 +672,12 @@ break; } +#ifdef USE_CONKIT + if (serverpid != -1 ) { + register_new_session_with_console_kit (); + } +#endif /* USE_CONKIT */ + return(serverpid); } @@ -783,6 +830,13 @@ clientpid); } +#ifdef USE_CONKIT + if (ckc != NULL) { + ck_connector_unref (ckc); + ckc = NULL; + } +#endif + if (serverpid < 0) return; errno = 0; @@ -819,6 +873,13 @@ * make a new copy of environment that has room for DISPLAY */ + +#ifdef USE_CONKIT +#define NUM_EXTRA_ENV_VARS 4 +#else +#define NUM_EXTRA_ENV_VARS 3 +#endif + static void set_environment(void) { @@ -830,11 +891,11 @@ for (oldPtr = environ; *oldPtr; oldPtr++) ; nenvvars = (oldPtr - environ); - newenviron = (char **) malloc ((nenvvars + 3) * sizeof(char **)); + newenviron = (char **) malloc ((nenvvars + NUM_EXTRA_ENV_VARS) * sizeof(char **)); if (!newenviron) { fprintf (stderr, "%s: unable to allocate %d pointers for environment\n", - program, nenvvars + 3); + program, nenvvars + NUM_EXTRA_ENV_VARS); exit (1); } @@ -843,9 +904,16 @@ newPtr = newenviron; *newPtr++ = displaybuf; +#ifdef USE_CONKIT + *newPtr++ = "XDG_SESSION_COOKIE="; +#endif + /* copy pointers to other variables */ for (oldPtr = environ; *oldPtr; oldPtr++) { if (strncmp (*oldPtr, "DISPLAY=", 8) != 0 +#ifdef USE_CONKIT + && strncmp (*oldPtr, "XDG_SESSION_COOKIE=", 19) != 0 +#endif && strncmp (*oldPtr, "WINDOWPATH=", 11) != 0) { *newPtr++ = *oldPtr; }