You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.6 KiB

# This file is part of Fusion-icon.
# Fusion-icon 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.
# Fusion-icon is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# 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, see <>.
# Author(s): crdlb, nesl247
# Copyright 2007 Christopher Williams <>
import os
from execute import run
tfp = 'GLX_EXT_texture_from_pixmap'
class Environment:
'''Detects properties of the enviroment, and provides a set() method that uses this information to export environment variables needed to start compiz.'''
def __init__(self):
'''desktop: current desktop enviroment used to choose interface, fallback wm, and default decorator
failsafe: boolean, True if in a failsafe session, currently only supports gnome failsafe mode.
glxinfo: output of glxinfo command
indirect_glxinfo: output of glxinfo with LIBGL_ALWAYS_INDIRECT
xvinfo: output of xvinfo
glx_vendor: 'client glx vendor:' usually one of SGI (for mesa-based drivers), NVIDIA Corporation, or ATI.
tfp: 'direct' if texture_from_pixmap is present with direct rendering (implying presence with indirect as well), 'indirect' if only present with indirect context, False if not present at all
Xgl: True in Xgl'''
# Check gnome- and kde-specific vars, then try generic 'DESKTOP_SESSION'
if GDSID in os.environ:
self.desktop = 'gnome'
elif 'TDE_FULL_SESSION' in os.environ:
self.desktop = 'kde'
self.desktop = os.environ.get('DESKTOP_SESSION', 'unknown')
self.failsafe = False
if self.desktop == 'gnome' and GDSID in os.environ and os.environ[GDSID] == 'failsafe':
self.failsafe = True
if self.failsafe:
failsafe_str = 'failsafe '
failsafe_str = ''
print(' * Detected Session: %s%s' %(failsafe_str, self.desktop))
## Save the output of glxinfo and xvinfo for later use:
# don't try to run glxinfo unless it's installed
if run(['which', 'glxinfo'], 'call', quiet=True) == 0:
self.glxinfo = run('glxinfo', 'output')
raise SystemExit(' * Error: glxinfo not installed!')
# make a temp environment
indirect_environ = os.environ.copy()
indirect_environ['LIBGL_ALWAYS_INDIRECT'] = '1'
self.indirect_glxinfo = run('glxinfo', 'output', env=indirect_environ)
if run(['which', 'xvinfo'], 'call', quiet=True) == 0:
self.xvinfo = run('xvinfo', 'output')
raise SystemExit(' * Error: xvinfo not installed!')
line = [l for l in self.glxinfo.splitlines() if 'client glx vendor string:' in l]
if line:
self.glx_vendor = ' '.join(line[0].split()[4:])
self.glx_vendor = ''
## Texture From Pixmap / Indirect
self.tfp = False
if self.glxinfo.count(tfp) < 3:
if self.indirect_glxinfo.count(tfp) == 3:
self.tfp = 'indirect'
self.tfp = 'direct'
## Xgl
if 'Xgl' in self.xvinfo:
self.Xgl = True
self.Xgl = False
def set(self):
'''Trigger all environment checks'''
# Check for Intel and export INTEL_BATCH
if 'Intel' in self.glxinfo:
print(' * Intel detected, exporting: INTEL_BATCH=1')
os.environ['INTEL_BATCH'] = '1'
# Check TFP and export LIBGL_ALWAYS_INDIRECT if needed
if self.tfp != 'direct':
print(' * No %s with direct rendering context' %tfp)
if self.tfp == 'indirect':
print(' ... present with indirect rendering, exporting: LIBGL_ALWAYS_INDIRECT=1')
os.environ['LIBGL_ALWAYS_INDIRECT'] = '1'
print(' ... nor with indirect rendering, this isn\'t going to work!')
# If using Xgl with a proprietary driver, exports LD_PRELOAD=<mesa libGL>
if self.Xgl and self.glx_vendor != 'SGI':
print(' * Non-mesa driver on Xgl detected')
from .data import mesa_libgl_locations
location = [l for l in mesa_libgl_locations if os.path.exists(l)]
if location:
print(' ... exporting: LD_PRELOAD=%s' %location[0])
os.environ['LD_PRELOAD'] = location[0]
# kindly let the user know... but don't abort (maybe it will work :> )
print(' ... no mesa libGL found for preloading, this may not work!')
# Check for nvidia on Xorg
if not self.Xgl and self.glx_vendor == 'NVIDIA Corporation':
print(' * NVIDIA on Xorg detected, exporting: __GL_YIELD=NOTHING')
os.environ['__GL_YIELD'] = 'NOTHING'
env = Environment()