Author: Travis Watkins Description: Add all relevant checks from compiz-manager to compiz itself Compiz already checks for almost everything it needs so there is no need to check twice. Origin: vendor, ubuntu (1:0.8.4-0ubuntu4) --- compiz.orig/src/main.c +++ compiz/src/main.c @@ -75,6 +75,13 @@ Bool useCow = TRUE; CompMetadata coreMetadata; +char *blacklist[] = { + "8086:3577", /* Intel 830MG, 845G (LP: #259385) */ + "8086:2562", + + NULL +}; + static void usage (void) { @@ -159,6 +166,28 @@ logLevelToString (CompLogLevel level) return "Unknown"; } +void +launchFallbackWM (void) +{ + char *fallback = NULL; + + if (getenv ("KDE_FULL_SESSION") != NULL) + fallback = "kwin"; + else if (getenv ("GNOME_DESKTOP_SESSION_ID") != NULL) + fallback = "metacity"; + else if (access ("/usr/bin/xfwm4", F_OK) == 0) + fallback = "xfwm4"; + + printf ("\nLaunching fallback window manager\n"); + if (fallback != NULL) + execlp (fallback, fallback, "--replace", (char *)NULL); + else + execlp ("xterm", "xterm", (char *)NULL); + + /* we should never get here but if we do just exit */ + exit (EXIT_FAILURE); +} + static void signalHandler (int sig) { @@ -168,6 +197,9 @@ signalHandler (int sig) case SIGCHLD: waitpid (-1, &status, WNOHANG | WUNTRACED); break; + case SIGSEGV: + launchFallbackWM (); + break; case SIGHUP: restartSignal = TRUE; break; @@ -261,15 +293,35 @@ main (int argc, char **argv) Bool disableSm = FALSE; char *clientId = NULL; char *refreshRateArg = NULL; + char *command; programName = argv[0]; programArgc = argc; programArgv = argv; + if (getenv ("GNOME_DESKTOP_SESSION_ID") != NULL && + strcmp (getenv ("GNOME_DESKTOP_SESSION_ID"), "Failsafe") == 0) + { + printf ("Detected GNOME failsafe session.\n"); + launchFallbackWM (); + } + + for (i = 0; blacklist[i] != NULL; i++) + { + asprintf (&command, "lspci -n | grep -q %s", blacklist[i]); + if (system(command) == 0) + { + printf ("Blacklisted PCI ID %s detected\n", blacklist[i]); + launchFallbackWM (); + } + free (command); + } + signal (SIGHUP, signalHandler); signal (SIGCHLD, signalHandler); signal (SIGINT, signalHandler); signal (SIGTERM, signalHandler); + signal (SIGSEGV, signalHandler); emptyRegion.rects = &emptyRegion.extents; emptyRegion.numRects = 0; @@ -288,6 +340,13 @@ main (int argc, char **argv) memset (&ctx, 0, sizeof (ctx)); + /* if no options are passed run with defaults */ + if (argc == 1) + { + useDesktopHints = FALSE; + replaceCurrentWm = TRUE; + } + for (i = 1; i < argc; i++) { if (!strcmp (argv[i], "--help")) @@ -394,6 +453,16 @@ main (int argc, char **argv) } } + /* add in default plugins if none are given */ + if (nPlugin == 0) + { + plugin[nPlugin++] = "ccp"; + plugin[nPlugin++] = "move"; + plugin[nPlugin++] = "resize"; + plugin[nPlugin++] = "place"; + plugin[nPlugin++] = "decoration"; + } + if (refreshRateArg) { ctx.refreshRateData = malloc (strlen (refreshRateArg) + 256); @@ -465,10 +534,20 @@ main (int argc, char **argv) coreInitialized = TRUE; if (!disableSm) + { + if (clientId == NULL) + { + char *desktop_autostart_id = getenv ("DESKTOP_AUTOSTART_ID"); + if (desktop_autostart_id != NULL) + clientId = strdup (desktop_autostart_id); + unsetenv ("DESKTOP_AUTOSTART_ID"); + } + initSession (clientId); + } if (!addDisplay (displayName)) - return 1; + launchFallbackWM (); eventLoop (); --- compiz.orig/src/screen.c +++ compiz/src/screen.c @@ -1722,7 +1722,7 @@ addScreen (CompDisplay *display, Window *children; unsigned int nchildren; int defaultDepth, nvisinfo, nElements, value, i; - const char *glxExtensions, *glExtensions; + const char *glxExtensions, *glExtensions, *glRenderer; XSetWindowAttributes attrib; GLfloat globalAmbient[] = { 0.1f, 0.1f, 0.1f, 0.1f }; GLfloat ambientLight[] = { 0.0f, 0.0f, 0.0f, 0.0f }; @@ -1989,6 +1989,34 @@ addScreen (CompDisplay *display, glxExtensions = glXQueryExtensionsString (dpy, screenNum); if (!strstr (glxExtensions, "GLX_EXT_texture_from_pixmap")) { + /* try again with indirect rendering */ + if (!indirectRendering) + { + char **copy; + + copy = (char **)malloc ((programArgc + 2) * sizeof (char *)); + for (i = 0; i < programArgc; i++) + { + copy[i] = strdup (programArgv[i]); + } + copy[i++] = "--indirect-rendering"; + copy[i] = NULL; + execvp (programName, copy); + + /* if we made it here execvp failed */ + for (i = 0; copy[i] != NULL; i++) + { + free (copy[i]); + } + free (copy); + + compLogMessage ("core", CompLogLevelFatal, + "Failed to launch with --indirect-rendering"); + XFree (visinfo); + + return FALSE; + } + compLogMessage ("core", CompLogLevelFatal, "GLX_EXT_texture_from_pixmap is missing"); XFree (visinfo); @@ -2074,6 +2102,16 @@ addScreen (CompDisplay *display, return FALSE; } + glRenderer = (const char *) glGetString (GL_RENDERER); + if (glRenderer != NULL && + (strcmp (glRenderer, "Software Rasterizer") == 0 || + strcmp (glRenderer, "Mesa X11") == 0)) + { + compLogMessage ("core", CompLogLevelFatal, + "Software rendering detected."); + return FALSE; + } + s->textureNonPowerOfTwo = 0; if (strstr (glExtensions, "GL_ARB_texture_non_power_of_two")) s->textureNonPowerOfTwo = 1; --- compiz.orig/src/texture.c +++ compiz/src/texture.c @@ -33,6 +33,8 @@ #include +void launchFallbackWM (void); + static CompMatrix _identity_matrix = { 1.0f, 0.0f, 0.0f, 1.0f, @@ -244,13 +246,21 @@ bindPixmapToTexture (CompScreen *screen CompFBConfig *config = &screen->glxPixmapFBConfigs[depth]; int attribs[7], i = 0; + if (width > screen->maxTextureSize || height > screen->maxTextureSize) + { + compLogMessage ("core", CompLogLevelWarn, + "Exceeded max texture size"); + + launchFallbackWM (); + } + if (!config->fbConfig) { compLogMessage ("core", CompLogLevelWarn, "No GLXFBConfig for depth %d", depth); - return FALSE; + launchFallbackWM (); } attribs[i++] = GLX_TEXTURE_FORMAT_EXT; @@ -295,7 +305,7 @@ bindPixmapToTexture (CompScreen *screen compLogMessage ("core", CompLogLevelWarn, "glXCreatePixmap failed"); - return FALSE; + launchFallbackWM (); } if (!target) @@ -345,7 +355,7 @@ bindPixmapToTexture (CompScreen *screen (*screen->destroyPixmap) (screen->display->display, texture->pixmap); texture->pixmap = None; - return FALSE; + launchFallbackWM (); } if (!texture->name)