All pastes #583815 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-06-22 15:00 UTC
rendered paste body
--- a/src/display.c
+++ b/src/display.c
@@ -46,6 +46,8 @@
 
 #include <compiz.h>
 
+extern Bool noLibGLFallback;
+
 static unsigned int virtualModMask[] = {
     CompAltMask, CompMetaMask, CompSuperMask, CompHyperMask,
     CompModeSwitchMask, CompNumLockMask, CompScrollLockMask
@@ -2513,6 +2515,17 @@ addDisplay (char *name,
 	return FALSE;
     }
 
+    if (!noLibGLFallback)
+    {
+	int major, minor;
+
+	if (!glXQueryVersion (dpy, &major, &minor))
+	    return FALSE;
+
+	if (major < 2 || minor < 4)
+	    return FALSE;
+    }
+
     compDisplayInitOptions (d, plugin, nPlugin);
 
     snprintf (d->displayString, 255, "DISPLAY=%s", DisplayString (dpy));
diff --git a/src/main.c b/src/main.c
index ec50353..f87bd90 100644
--- a/src/main.c
+++ b/src/main.c
@@ -86,6 +86,8 @@ Bool noDetection = FALSE;
 Bool useCow = TRUE;
 #endif
 
+Bool noLibGLFallback = FALSE;
+
 static void
 usage (void)
 {
@@ -226,6 +228,10 @@ main (int argc, char **argv)
 	    if (i + 1 < argc)
 		backgroundImage = argv[++i];
 	}
+	else if (!strcmp (argv[i], "--no-libgl-fallback"))
+	{
+	    noLibGLFallback = TRUE;
+	}
 	else if (*argv[i] == '-')
 	{
 	    fprintf (stderr, "%s: Unknown option '%s'\n", programName, argv[i]);
@@ -237,11 +243,32 @@ main (int argc, char **argv)
 	}
     }
 
+    if (noLibGLFallback)
+	unsetenv ("LD_PRELOAD");
+
     if (!disableSm)
 	initSession (clientId);
 
     if (!addDisplay (displayName, plugin, nPlugin))
+    {
+	if (!noLibGLFallback)
+	{
+	    char *arg[argc + 2];
+	    static const char *libindirect_libgl = "/usr/$LIB/libIndirectGL.so.1";
+
+	    memcpy (arg, argv, sizeof (char *) * argc);
+
+	    arg[argc] = "--no-libgl-fallback";
+	    arg[argc + 1] = NULL;
+
+	    fprintf (stderr, "%s: Trying '%s'\n", programName, libindirect_libgl);
+
+	    setenv ("LD_PRELOAD", libindirect_libgl, TRUE);
+	    execvp (arg[0], arg);
+	}
+
 	return 1;
+    }
 
     eventLoop ();