summaryrefslogtreecommitdiff
path: root/gnu/packages/patches/slim-sigusr1.patch
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2014-02-09 23:20:42 +0100
committerLudovic Courtès <ludo@gnu.org>2014-02-09 23:20:42 +0100
commitf9ec07a9859c5b305105ab38bff3f3db0dcb842d (patch)
treee9c726ae0dd2831cd16e8c548a04d6f05f1190d6 /gnu/packages/patches/slim-sigusr1.patch
parent4cccb3617ee0e2344d0d986f3c60d97e77aa3249 (diff)
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.
Diffstat (limited to 'gnu/packages/patches/slim-sigusr1.patch')
-rw-r--r--gnu/packages/patches/slim-sigusr1.patch33
1 files changed, 33 insertions, 0 deletions
diff --git a/gnu/packages/patches/slim-sigusr1.patch b/gnu/packages/patches/slim-sigusr1.patch
new file mode 100644
index 0000000000..344b02933e
--- /dev/null
+++ b/gnu/packages/patches/slim-sigusr1.patch
@@ -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);