~ruther/guix-local

f9ec07a9859c5b305105ab38bff3f3db0dcb842d — Ludovic Courtès 12 years ago 4cccb36
gnu: slim: Work around flaky synchronization with the X server.

* gnu/packages/patches/slim-sigusr1.patch: New file.
* gnu/packages/slim.scm (slim): Use it.
* gnu-system.am (dist_patch_DATA): Add it.
3 files changed, 36 insertions(+), 1 deletions(-)

M gnu-system.am
A gnu/packages/patches/slim-sigusr1.patch
M gnu/packages/slim.scm
M gnu-system.am => gnu-system.am +1 -0
@@ 299,6 299,7 @@ dist_patch_DATA =						\
  gnu/packages/patches/scheme48-tests.patch			\
  gnu/packages/patches/slim-session.patch			\
  gnu/packages/patches/slim-config.patch			\
  gnu/packages/patches/slim-sigusr1.patch			\
  gnu/packages/patches/tcsh-fix-autotest.patch			\
  gnu/packages/patches/teckit-cstdio.patch			\
  gnu/packages/patches/valgrind-glibc.patch			\

A gnu/packages/patches/slim-sigusr1.patch => gnu/packages/patches/slim-sigusr1.patch +33 -0
@@ 0,0 1,33 @@
This patch fixes SLiM so it really waits for the X server to be ready
before attempting to connect to it.  Indeed, the X server notices that
its parent process has a handler for SIGUSR1, and consequently sends it
SIGUSR1 when it's ready to accept connections.

The problem was that SLiM doesn't pay attention to SIGUSR1.  So in practice,
if X starts slowly, then SLiM gets ECONNREFUSED a couple of time on
/tmp/.X11-unix/X0, then goes on trying to connect to localhost:6000,
where nobody answers; eventually, it times out and tries again on
/tmp/.X11-unix/X0, and finally it shows up on the screen.

Patch by L. Courtès.

--- slim-1.3.6/app.cpp	2014-02-05 15:27:20.000000000 +0100
+++ slim-1.3.6/app.cpp	2014-02-09 22:42:04.000000000 +0100
@@ -119,7 +119,9 @@ void CatchSignal(int sig) {
 	exit(ERR_EXIT);
 }
 
+static volatile int got_sigusr1 = 0;
 void User1Signal(int sig) {
+	got_sigusr1 = 1;
 	signal(sig, User1Signal);
 }
 
@@ -884,6 +886,7 @@ int App::WaitForServer() {
 	int	ncycles	 = 120;
 	int	cycles;
 
+	while (!got_sigusr1);
 	for(cycles = 0; cycles < ncycles; cycles++) {
 		if((Dpy = XOpenDisplay(DisplayName))) {
 			XSetIOErrorHandler(xioerror);

M gnu/packages/slim.scm => gnu/packages/slim.scm +2 -1
@@ 46,7 46,8 @@
	     (sha256
	      (base32 "1pqhk22jb4aja4hkrm7rjgbgzjyh7i4zswdgf5nw862l2znzxpi1"))
             (patches (map search-patch
                           (list "slim-config.patch" "slim-session.patch")))))
                           (list "slim-config.patch" "slim-session.patch"
                                 "slim-sigusr1.patch")))))
    (build-system cmake-build-system)
    (inputs `(("linux-pam" ,linux-pam)
	      ("libpng" ,libpng)