You are not logged in.

#1 2009-06-27 23:32:26

markg85
Member
Registered: 2009-06-27
Posts: 149

[FIXED] Compiz runs only with emerald and crashes with metacity

Hey,

I currently try to use a metacity theme and have compiz enabled but apparently that's something compiz doesn't really like.
One think i noticed in fusion-icon is that the entire metacity option under: "Select Window Devorator" is just not there.. (or was that always the case?)

Oke, things i have done so far:
- Search this forum (obviously) nothing found with a solution
- Searched the wiki (same results)
- in gconf-editor /desktop/gnome/session/required_components/windowmanager set to compiz (like said in the Compiz wiki page on archlinux.org
- disabled metacity as compositing manager (tried with enabled as well but the same results)
- right now i have the compiz bash script from ubuntu (tweaked a little) and that starts up compiz just fine but not with metacity
And incase you want the script:

#!/bin/sh
# Compiz Manager wrapper script
# 
# Copyright (c) 2007 Kristian Lyngstøl <kristian@bohemians.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
#
# Contributions by: Treviño (3v1n0) <trevi55@gmail.com>, Ubuntu Packages
#
# Much of this code is based on Beryl code, also licensed under the GPL.
# This script will detect what options we need to pass to compiz to get it
# started, and start a default plugin and possibly window decorator.
# 


COMPIZ_BIN_PATH="/usr/bin/" # For window decorators and compiz
PLUGIN_PATH="/usr/lib/compiz/" 
GLXINFO="/usr/bin/glxinfo"
KWIN="/usr/bin/kwin"
METACITY="/usr/bin/metacity"
XFWM="/usr/bin/xfwm"
COMPIZ_NAME="compiz" # Final name for compiz (compiz.real) 

# For Xgl LD_PRELOAD
LIBGL_NVIDIA="/usr/lib/nvidia/libGL.so.1.2.xlibmesa"
LIBGL_FGLRX="/usr/lib/fglrx/libGL.so.1.2.xlibmesa"

# Minimum amount of memory (in kilo bytes) that nVidia cards need
# to be allowed to start
# Set to 262144 to require 256MB
NVIDIA_MEMORY="65536" # 64MB
NVIDIA_SETTINGS="nvidia-settings" # Assume it's in the path by default

# For detecting what driver is in use, the + is for one or more /'s
XORG_DRIVER_PATH="/usr/lib/xorg/modules/drivers/+"
FALLBACKWM="xterm"
if [ x"$KDE_FULL_SESSION" = x"true" ]; then 
        FALLBACKWM="${KWIN}";
elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then 
        FALLBACKWM="${METACITY}"
elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1; then 
        FALLBACKWM="${XFWM}"
fi

FALLBACKWM_OPTIONS="--replace $@"

# Driver whitelist
WHITELIST="nvidia intel ati radeon i810 fglrx"

# blacklist based on the pci ids 
# See http://wiki.compiz-fusion.org/Hardware/Blacklist for details
#T="   1002:5954 1002:5854 1002:5955" # ati rs480
#T="$T 1002:4153" # ATI Rv350
#T="$T 8086:2982 8086:2992 8086:29a2 8086:2a02 8086:2a12"  # intel 965
T="$T 8086:2a02 " # Intel GM965
T="$T 8086:3577 8086:2562 " # Intel 830MG, 845G (LP: #259385)
BLACKLIST_PCIIDS="$T"
unset T

COMPIZ_OPTIONS="--ignore-desktop-hints --replace"
COMPIZ_PLUGINS="core"
ENV=""

# Use emerald by default if it exist
USE_EMERALD="yes"

# No indirect by default
INDIRECT="no"

# Default X.org log if xset q doesn't reveal it
XORG_DEFAULT_LOG="/var/log/Xorg.0.log"

# Set to yes to enable verbose
VERBOSE="yes"

# Echos the arguments if verbose
verbose()
{
    if [ "x$VERBOSE" = "xyes" ]; then
        printf "$*"
    fi
}

# abort script and run fallback windowmanager
abort_with_fallback_wm()
{
    if [ "x$SKIP_CHECKS" = "xyes" ]; then
        verbose "SKIP_CHECKS is yes, so continuing despite problems.\n"
        return 0;
    fi
    
    if [ "x$CM_DRY" = "xyes" ]; then
        verbose "Dry run failed: Problems detected with 3D support.'n"
        exit 1;
    fi

    verbose "aborting and using fallback: $FALLBACKWM \n"

    if [ -x $FALLBACKWM ]; then
        exec $FALLBACKWM $FALLBACKWM_OPTIONS
    else
        printf "no $FALLBACKWM found, exiting\n"
        exit 1
    fi
}

# Check if we run with the Software Rasterizer, this happens e.g.
# when a second screen session is opened via f-u-a on intel
check_software_rasterizer()
{
    verbose "Checking for Software Rasterizer: "
    if glxinfo 2> /dev/null | egrep -q '^OpenGL renderer string: Software Rasterizer' ; then
        verbose "present. \n";
        return 0;
    else
        verbose "Not present. \n"
        return 1;
    fi

}

# Check for non power of two texture support
check_npot_texture()
{
    verbose "Checking for non power of two support: "
    if glxinfo 2> /dev/null | egrep -q '(GL_ARB_texture_non_power_of_two|GL_NV_texture_rectangle|GL_EXT_texture_rectangle|GL_ARB_texture_rectangle)' ; then
        verbose "present. \n";
        return 0;
    else
        verbose "Not present. \n"
        return 1;
    fi

}

# Check for presence of FBConfig
check_fbconfig()
{
    verbose "Checking for FBConfig: "
    if [ "$INDIRECT" = "yes" ]; then
        $GLXINFO -i | grep -q GLX.*fbconfig 
        FB=$?
    else
        $GLXINFO | grep -q GLX.*fbconfig 
        FB=$?
    fi

    if [ $FB = "0" ]; then
        unset FB
        verbose "present. \n"
        return 0;
    else
        unset FB
        verbose "not present. \n"
        return 1;
    fi
}


# Check for TFP
check_tfp()
{
    verbose "Checking for texture_from_pixmap: "
    if [ $($GLXINFO 2>/dev/null | grep -c GLX_EXT_texture_from_pixmap) -gt 2 ] ; then
        verbose "present. \n"
        return 0;
    else
        verbose "not present. \n"
        if [ "$INDIRECT" = "yes" ]; then
            unset LIBGL_ALWAYS_INDIRECT
            INDIRECT="no"
            return 1;
        else
            verbose "Trying again with indirect rendering:\n";
            INDIRECT="yes"
            export LIBGL_ALWAYS_INDIRECT=1
            check_tfp;
            return $?
        fi
    fi
}

# Check wether the composite extension is present
check_composite()
{
    verbose "Checking for Composite extension: "
    if xdpyinfo -queryExtensions | grep -q Composite ; then
        verbose "present. \n";
        return 0;
    else
        verbose "not present. \n";
        return 1;
    fi
}

# Detects if Xgl is running
check_xgl()
{
    verbose "Checking for Xgl: "
    if xvinfo | grep -q Xgl ; then
        verbose "present. \n"
        return 0;
    else
        verbose "not present. \n"
        return 1;
    fi
}

# Check if the nVidia card has enough video ram to make sense
check_nvidia_memory()
{
    if [ ! -x "$NVIDIA_SETTINGS" ]; then
    return 0
    fi

    MEM=$(${NVIDIA_SETTINGS} -q VideoRam | egrep Attribute\ \'VideoRam\'\ .*: | cut -d: -f3 | sed 's/[^0-9]//g')
    if [ $MEM -lt $NVIDIA_MEMORY ]; then
        verbose "Less than ${NVIDIA_MEMORY}kb of memory and nVidia";
        return 1;
    fi
    return 0;
}

# Check for existence if NV-GLX
check_nvidia()
{
    if [ ! -z $NVIDIA_INTERNAL_TEST ]; then
        return $NVIDIA_INTERNAL_TEST;
    fi
    verbose "Checking for nVidia: "
    if xdpyinfo | grep -q NV-GLX ; then
        verbose "present. \n"
        NVIDIA_INTERNAL_TEST=0
        return 0;
    else
        verbose "not present. \n"
        NVIDIA_INTERNAL_TEST=1
        return 1;
    fi
}

# Check if the max texture size is large enough compared to the resolution
check_texture_size()
{
    # Check how many screens we've got and iterate over them
    N=$(xdpyinfo | grep -i "number of screens" | sed 's/.*[^0-9]//g')
    for i in $(seq 1 $N); do
        verbose "Checking screen $i"
        TEXTURE_LIMIT=$(glxinfo -l | grep GL_MAX_TEXTURE_SIZE | sed -n "$i s/^.*=[^0-9]//g p")
        RESOLUTION=$(xdpyinfo | grep -i dimensions: | sed -n -e "$i s/^ *dimensions: *\([0-9]*x[0-9]*\) pixels.*/\1/ p")
        VRES=$(echo $RESOLUTION | sed 's/.*x//')
        HRES=$(echo $RESOLUTION | sed 's/x.*//')
        verbose "Comparing resolution ($RESOLUTION) to maximum 3D texture size ($TEXTURE_LIMIT): ";
        if [ $VRES -gt $TEXTURE_LIMIT ] || [ $HRES -gt $TEXTURE_LIMIT ]; then
        verbose "Failed.\n"
        return 1;
        fi
        verbose "Passed.\n"
    done
    return 0
}

# check driver whitelist
running_under_whitelisted_driver()
{
    LOG=$(xset q|grep "Log file"|awk '{print $3}')
    if [ "$LOG" = "" ]; then
        verbose "xset q doesn't reveal the location of the log file. Using fallback $XORG_DEFAULT_LOG \n"
        LOG=$XORG_DEFAULT_LOG;
    fi
    if [ -z "$LOG" ];then
        verbose "AIEEEEH, no Log file found \n"
        verbose "$(xset q) \n"
    return 0
    fi
    for DRV in ${WHITELIST}; do
        if egrep -q "Loading ${XORG_DRIVER_PATH}${DRV}_drv\.so" $LOG &&
           ! egrep -q "Unloading ${XORG_DRIVER_PATH}${DRV}_drv\.so" $LOG; 
        then
            return 0
        fi
    done
    verbose "No whitelisted driver found\n"
    return 1
}

# check pciid blacklist
have_blacklisted_pciid()
{
    OUTPUT=$(lspci -n)
    for ID in ${BLACKLIST_PCIIDS}; do
        if echo "$OUTPUT" | egrep -q "$ID"; then
            verbose "Blacklisted PCIID '$ID' found \n"
            return 0
        fi
    done
    OUTPUT=$(lspci -vn | grep -i VGA)
    verbose "Detected PCI ID for VGA: $OUTPUT\n"
    return 1
}

build_env()
{
    if check_nvidia; then
        ENV="__GL_YIELD=NOTHING "
    fi
    if [ "$INDIRECT" = "yes" ]; then
        ENV="$ENV LIBGL_ALWAYS_INDIRECT=1 "
    fi
    if check_xgl; then
        if [ -f ${LIBGL_NVIDIA} ]; then
            ENV="$ENV LD_PRELOAD=${LIBGL_NVIDIA}"
            verbose "Enabling Xgl with nVidia drivers...\n"
        fi
        if [ -f ${LIBGL_FGLRX} ]; then
            ENV="$ENV LD_PRELOAD=${LIBGL_FGLRX}"
            verbose "Enabling Xgl with fglrx ATi drivers...\n"
        fi
    fi

    ENV="$ENV FROM_WRAPPER=yes"

    if [ -n "$ENV" ]; then
        export $ENV
    fi
}

build_args()
{
    if [ "x$INDIRECT" = "xyes" ]; then
        COMPIZ_OPTIONS="$COMPIZ_OPTIONS --indirect-rendering "
    fi
    if [ ! -z "$DESKTOP_AUTOSTART_ID" ]; then
        COMPIZ_OPTIONS="$COMPIZ_OPTIONS --sm-client-id $DESKTOP_AUTOSTART_ID"
    fi
    if check_nvidia; then
        if [ "x$INDIRECT" != "xyes" ]; then
            COMPIZ_OPTIONS="$COMPIZ_OPTIONS --loose-binding"
        fi
    fi
}

####################
# Execution begins here.

# Read configuration from XDG paths
if [ -z "$XDG_CONFIG_DIRS" ]; then
    test -f /etc/xdg/compiz/compiz-manager && . /etc/xdg/compiz/compiz-manager
    for f in /etc/xdg/compiz/compiz-manager.d/*; do
        test -e $f && . $f
    done
else
        OLD_IFS=$IFS
        IFS=:
        for CONFIG_DIR in $XDG_CONFIG_DIRS
        do
                test -f $CONFIG_DIR/compiz/compiz-manager && . $CONFIG_DIR/compiz/compiz-manager
        for f in $CONFIG_DIRS/compiz/compiz-manager.d/*; do
                    test -e $f && . $f
        done
        done
        IFS=$OLD_IFS
        unset OLD_IFS
fi

if [ -z "$XDG_CONFIG_HOME" ]; then
    test -f $HOME/.config/compiz/compiz-manager && . $HOME/.config/compiz/compiz-manager
else
    test -f $XDG_CONFIG_HOME/compiz/compiz-manager && .  $XDG_CONFIG_HOME/compiz/compiz-manager
fi

# Don't use compiz when running the failsafe session
if [ "x$GNOME_DESKTOP_SESSION_ID" = "xFailsafe" ]; then
    abort_with_fallback_wm
fi

if [ "x$LIBGL_ALWAYS_INDIRECT" = "x1" ]; then
    INDIRECT="yes";
fi

# if we run under Xgl, we can skip some tests here
if ! check_xgl; then
    # if vesa or vga are in use, do not even try glxinfo (LP#119341)
    if ! running_under_whitelisted_driver || have_blacklisted_pciid; then
        abort_with_fallback_wm
    fi
    # check if we have the required bits to run compiz and if not, 
    # fallback
    if ! check_tfp || ! check_npot_texture || ! check_composite || ! check_texture_size; then
        abort_with_fallback_wm
    fi

    # check if we run with software rasterizer and if so, bail out
    if check_software_rasterizer; then
        verbose "Software rasterizer detected, aborting"
        abort_with_fallback_wm
    fi

    if check_nvidia && ! check_nvidia_memory; then
        abort_with_fallback_wm
    fi

    if ! check_fbconfig; then
        abort_with_fallback_wm
    fi
fi

# load the ccp plugin if present and fallback to plain gconf if not
if [ -f ${PLUGIN_PATH}libccp.so ]; then
    COMPIZ_PLUGINS="$COMPIZ_PLUGINS ccp"
elif [ -f ${PLUGIN_PATH}libgconf.so ]; then
    COMPIZ_PLUGINS="$COMPIZ_PLUGINS glib gconf"
fi

# enable gnomecompat if we run under gnome
if [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ] && [ ! -e ~/.compiz-gnomecompat ]; then 
        verbose "running under gnome seesion, checking for gnomecompat\n"
    if ! gconftool -g /apps/compiz/general/allscreens/options/active_plugins|grep -q gnomecompat; then
        verbose "adding missing gnomecompat\n"
        V=$(gconftool -g /apps/compiz/general/allscreens/options/active_plugins|sed s/mousepoll,/mousepoll,gnomecompat,/)
           if ! echo $V|grep -q gnomecompat; then
               verbose "can not add gnomecompat, reseting\n"
               gconftool --unset /apps/compiz/general/allscreens/options/active_plugins
           else
            gconftool -s /apps/compiz/general/allscreens/options/active_plugins --type list --list-type=string $V
           fi
           touch ~/.compiz-gnomecompat
    fi
fi

# get environment
build_env
build_args

if [ "x$CM_DRY" = "xyes" ]; then
    verbose "Dry run finished: everything should work with regards to Compiz and 3D.\n"
    verbose "Execute: ${COMPIZ_BIN_PATH}${COMPIZ_NAME} $COMPIZ_OPTIONS "$@" $COMPIZ_PLUGINS \n"
    exit 0;
fi

${COMPIZ_BIN_PATH}${COMPIZ_NAME} $COMPIZ_OPTIONS "$@" $COMPIZ_PLUGINS || exec $FALLBACKWM $FALLBACKWM_OPTIONS

That's it so far.

So again what i try to do is running compiz with metacity decorations.

I hope someone can help me here,
Mark.

Last edited by markg85 (2009-06-28 00:26:04)

Offline

#2 2009-06-27 23:56:44

whoops
Member
Registered: 2009-03-19
Posts: 891

Re: [FIXED] Compiz runs only with emerald and crashes with metacity

Wait, what, I thought metacity isn't as window decorator, it is a window manager, right? I don't really get what you're trying to do... maybe install compiz-decorator-gtk and use it instead of emerald?

edit: aaah, yes, I think you're missing compiz-decorator-gtk, try that, look at fusion icon "window decorator" option again.

Last edited by whoops (2009-06-27 23:58:11)

Offline

#3 2009-06-28 00:25:21

markg85
Member
Registered: 2009-06-27
Posts: 149

Re: [FIXED] Compiz runs only with emerald and crashes with metacity

whoops wrote:

Wait, what, I thought metacity isn't as window decorator, it is a window manager, right? I don't really get what you're trying to do... maybe install compiz-decorator-gtk and use it instead of emerald?

edit: aaah, yes, I think you're missing compiz-decorator-gtk, try that, look at fusion icon "window decorator" option again.

Strange.. i was under the impression that pacman -S compiz-fusion would install GTK and QT decorators... guess not.
This issue is fixed now. Running metacity decorations now WITH compiz.

Offline

Board footer

Powered by FluxBB