# 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 # 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, see . # # Author(s): crdlb, nesl247 # # Copyright 2007 Christopher Williams import os from execute import run tfp = 'GLX_EXT_texture_from_pixmap' GDSID = 'GNOME_DESKTOP_SESSION_ID' 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' else: 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 ' else: 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') else: 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') else: 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:]) else: 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' else: self.tfp = 'direct' ## Xgl if 'Xgl' in self.xvinfo: self.Xgl = True else: 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' else: print(' ... nor with indirect rendering, this isn\'t going to work!') # If using Xgl with a proprietary driver, exports LD_PRELOAD= 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] else: # 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()