This is the mail archive of the cygwin-xfree mailing list for the Cygwin XFree86 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Handle X server -displayfd option transparently


Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
---
 xinit.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 60 insertions(+), 8 deletions(-)

diff --git a/xinit.c b/xinit.c
index 918f83e..95ba13c 100644
--- a/xinit.c
+++ b/xinit.c
@@ -168,6 +168,11 @@ int serverpid = -1;
 int clientpid = -1;
 volatile int gotSignal = 0;
 
+static int original_displayfd = -1;
+static int server_displayfd_read = -1;
+static char server_displayfd_write[256];
+static char displayfd_buf[256];
+
 static void Execute ( char **vec, char **envp );
 static Bool waitforserver ( void );
 static Bool processTimeout ( int timeout, char *string );
@@ -319,14 +324,40 @@ main(int argc, char *argv[], char *envp[])
 	}
 	if (argc > 0 && (argv[0][0] == ':' && isdigit(argv[0][1])))
 		displayNum = *argv;
-	else
-		displayNum = *sptr++ = default_display;
 
 	start_of_server_args = (sptr - server);
 	while (--argc >= 0) {
+		/* Handle the -displayfd server argument transparently */
+		if ((argc > 0) && (strcmp(argv[0],"-displayfd") == 0))
+                  {
+                    int filedes[2];
+
+                    original_displayfd = atoi(argv[1]);
+
+                    if (pipe(filedes) == 0)
+                      {
+                        server_displayfd_read = filedes[0];
+                        sprintf(server_displayfd_write, "%d", filedes[1]);
+                        argv[1] = server_displayfd_write;
+                      }
+                    else
+                      {
+                        Fatal("pipe() for -displayfd failed");
+                      }
+                  }
+
 		server_args_given++;
 		*sptr++ = *argv++;
 	}
+
+        /*
+          if there was neither an explicit displayNum nor a
+          -displayfd option, add the default display number
+          to server arguments
+        */
+        if ((displayNum == NULL) && (original_displayfd == -1))
+          displayNum = *sptr++ = default_display;
+
 #ifdef STARTXWIN
 	*sptr++ = "-multiwindow";
 #endif
@@ -391,11 +422,6 @@ main(int argc, char *argv[], char *envp[])
 #endif
 
 	/*
-	 * put the display name into the environment
-	 */
-	set_environment ();
-
-	/*
 	 * Start the server and client.
 	 */
 #ifdef SIGCHLD
@@ -423,7 +449,7 @@ main(int argc, char *argv[], char *envp[])
 #endif
 #endif
 
-	if (XOpenDisplay(displayNum)) {
+	if (displayNum && XOpenDisplay(displayNum)) {
 		Error("Another X server instance is running on DISPLAY %s\r\n", displayNum);
 		exit(ERR_EXIT);
 	}
@@ -487,6 +513,32 @@ waitforserver(void)
 	sleep(2);
 #endif
 
+        if (server_displayfd_read != -1)
+          {
+            /* wait for the server to write the DISPLAY number to the displayfd pipe */
+            int length;
+
+            displayfd_buf[0] = ':';
+            length = read(server_displayfd_read, displayfd_buf+1, 255);
+
+            if (length < 0)
+              Fatal("reading displayfd pipe failed");
+            displayfd_buf[length] = '\0';
+
+            printf("read display number '%s' from X server\n", displayfd_buf);
+            displayNum = displayfd_buf;
+
+            /* write the DISPLAY received from the server to the original displayfd */
+            /* XXX: this should happen after connections are being accepted */
+            write(original_displayfd, displayfd_buf+1, length);
+            write(original_displayfd, "\n", 1);
+          }
+
+	/*
+	 * put the display name into the environment
+	 */
+	set_environment ();
+
 	for (cycles = 0; cycles < ncycles; cycles++) {
 		if ((xd = XOpenDisplay(displayNum))) {
 			return(TRUE);
-- 
1.7.1


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]