summaryrefslogtreecommitdiff
path: root/xnest-plugin/XnestDis.c
diff options
context:
space:
mode:
Diffstat (limited to 'xnest-plugin/XnestDis.c')
-rw-r--r--xnest-plugin/XnestDis.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/xnest-plugin/XnestDis.c b/xnest-plugin/XnestDis.c
index b93a20f..a53203b 100644
--- a/xnest-plugin/XnestDis.c
+++ b/xnest-plugin/XnestDis.c
@@ -34,19 +34,47 @@ The Open Group.
* Utility functions and global variable to manage display numbers
***********************************************************************/
-/* maximum numbers of concurrent instances */
-#define MAX_PLUGINS 10
+/* maximum numbers of concurrent instances (per machine) */
+#define MAX_PLUGINS 128
-/* start from 5 to avoid possible conflict with multi-display X server */
-#define XNEST_OFFSET 5
+/* start from 80 to avoid possible conflict with multi-display X server
+ * like SunRay,LTSP, etc.*/
+#define XNEST_OFFSET 80
/* global allowing to know which display numbers are in use */
-static int16 xnest_display_numbers[MAX_PLUGINS];
+static char xnest_display_numbers[MAX_PLUGINS];
void
RxpInitXnestDisplayNumbers()
{
- memset(xnest_display_numbers, 0, sizeof(int16) * MAX_PLUGINS);
+ memset(xnest_display_numbers, 0, sizeof(char) * MAX_PLUGINS);
+}
+
+static
+Bool IsDisplayNumFree(int id)
+{
+ char fnamebuf[256];
+ struct stat sbuf;
+ int res;
+
+ /* /tmp/.X%d-lock is more or less the official way... */
+ sprintf(fnamebuf, "/tmp/.X%d-lock", id);
+ res = stat(fnamebuf, &sbuf);
+ if (res == 0)
+ return False;
+
+ /* ... but then we have to test for the old stuff, too... ;-( */
+ sprintf(fnamebuf, "/tmp/.X11-pipe/X%d", id);
+ res = stat(fnamebuf, &sbuf);
+ if (res == 0)
+ return False;
+
+ sprintf(fnamebuf, "/tmp/.X11-unix/X%d", id);
+ res = stat(fnamebuf, &sbuf);
+ if (res == 0)
+ return False;
+
+ return True;
}
/* function returning first display number available */
@@ -55,7 +83,8 @@ RxpXnestDisplayNumber()
{
int i;
for (i = 0; i < MAX_PLUGINS; i++)
- if (xnest_display_numbers[i] == 0) {
+ if ((xnest_display_numbers[i] == 0) &&
+ IsDisplayNumFree(i + XNEST_OFFSET)) {
xnest_display_numbers[i] = 1;
return i + XNEST_OFFSET;
}