Public feed #723962

Something

public text v1 · immutable
Raw Edit
·published 2007-10-03 05:45 UTC
rendered paste body
import pygtk
pygtk.require('2.0')
import gtk
import gtk.glade
import gtk.gdk as gdk
import gobject
import compizconfig
from execute import run
from subprocess import Popen
import ccm

class Base:

	def SystemInfoCheck(self):

		self.glxinfo = run('glxinfo', 'output')
		self.xvinfo = run('xvinfo', 'output')
		self.xdpyinfo = run('xdpyinfo', 'output')

		# We need to check if TFP is direct or Indirect

		self.tfp = False
		if self.glxinfo.count('GLX_EXT_texture_from_pixmap') == 0:
			self.tfp = 'none'
		elif self.glxinfo.count('GLX_EXT_texture_from_pixmap') < 3:
			self.tfp = 'indirect'
		else:
			self.tfp = 'direct'


		# Because Xgl is an entirely new server, we need to check for it first

		if 'Xgl' in self.xvinfo:
			self.XglIsActive = True
			self.possible = True
			self.StartupCommand = "compiz --replace ccp"
		else:
			self.XglIsActive = False

		if self.XglIsActive == True:
			self.RenderingPathString = '<b>Xgl</b>. Desktop effects are provided by an OpenGL overlay. You may notice slowness with 3D applications and Video'
		else:
			if self.tfp == 'direct':
				self.RenderingPathString = '<b>Direct Rendering.</b> Desktop effects are provided by your graphics card. You may experience driver glitches.'
				self.possible = True
			elif self.tfp == 'indirect':
				self.RenderingPathString = 'X.org <b>AIGLX</b>. Some 3D applications and video may not display correctly when desktop effects are enabled'
				self.possible = True
			elif self.tfp == 'none':
				self.RenderingPathString = 'Desktop effects cannot be enabled. You will need to configure your X server'
				self.possible = False

		line = [l for l in self.glxinfo.splitlines() if 'OpenGL renderer string:' in l]
		if line:
			self.GlxRenderer = ' '.join(line[0].split()[4:])

		if 'Intel' in self.GlxRenderer:
			self.StartupCommand = "INTEL_BATCH=1 LIBGL_ALWAYS_INDIRECT=1 compiz --replace ccp"

		elif 'ATI' in self.GlxRenderer:
			self.StartupCommand = "LIBGL_ALWAYS_INDIRECT=1 compiz --replace ccp"

		elif 'NVIDIA' in self.GlxRenderer:
			if self.tfp == "direct":
				self.StartupCommand = "__GL_YEILD='NOTHING' compiz --replace --loose-binding ccp"
			elif self.tfp == "indirect":
				self.StartupCommand = "LIBGL_ALWAYS_INDIRECT=1 compiz --replace ccp"

		print "For reference, your startup command is:" + " " + self.StartupCommand

	def delete(self, widget, event=None):
		gtk.main_quit()
		return False

	def openccsm(self, widget, event=None):
		run("ccsm")
		gtk.main_quit()
		return False

	def openemerald(self, widget, event=None):
		run("emerald-theme-manager")

	def EnableDisableCompiz(self, widget, event=None):

		# First, we need to check if we are enabling or disabling

		EnabledOrDisabled = self.EnableEffects.get_active()

		# If it is disabled, we kill compiz, wait - then (FIXME) execute metacity

		if EnabledOrDisabled == False:
			run(['killall', 'compiz'])
			run(['metacity', '--replace'])
		elif EnabledOrDisabled == True:
			run(['killall', 'metacity'])
			run("compiz-manager")

	def __init__(self):

		self.SystemInfoCheck()

		self.gladefile = gtk.glade.XML('compiz-fusion-settings.glade')

		self.context = compizconfig.Context (basic_metadata = True)
		self.core = self.context.Plugins["core"]


		# When the window is closed, the app is closed. 
		self.Window = self.gladefile.get_widget('CompizFusionConfigWindow')
		self.Window.connect("delete_event", self.delete)

		# When we click the button, the app is closed
		self.QuitButton = self.gladefile.get_widget('QuitButton')
		self.QuitButton.connect("clicked", self.delete)

		# When we click 'Open CCSM, this window closes
		self.OpenCCSMButton = self.gladefile.get_widget('OpenCCSMButton')
		self.OpenCCSMButton.connect("clicked", self.openccsm)

		## Other Stuff

		# We need to import the notebook, and grab the tab to set some text and stuff

		self.NoteBook = self.gladefile.get_widget('FlipPages')
		self.NoteBook.connect('switch-page', self.CreateTitle)
		self.TitleLabel = self.gladefile.get_widget('CurrentTabLabel')
		self.TitleImage = self.gladefile.get_widget('CurrentTabImage')

		# Nice Function

		self.CreateTitle("signal", 0, 0)

		## The "General" Tab

		# Enable Desktop Effects

		self.EnableEffects = self.gladefile.get_widget('EnableFXCheckButton')
		if run(['pgrep', 'compiz'], 'call', quiet=True) == 0:
			self.EffectsAreEnabled = True
		else:
			self.EffectsAreEnabled = False

		self.EnableEffects.set_active(self.EffectsAreEnabled)
		self.EnableEffects.connect("clicked", self.EnableDisableCompiz)
		

		# The Rendering Path Identifier

		self.RenderingPathIdentifier = self.gladefile.get_widget('RenderingMethod')
		self.RenderingPathIdentifier.set_text(self.RenderingPathString)
		self.RenderingPathIdentifier.set_use_markup(True)

		# The "Configure" Button

		self.ConfigureButton = self.gladefile.get_widget('ConfigureDesktopButton')

		# The "Theme" Button

		self.ThemeButton = self.gladefile.get_widget('ThemeButton')
		self.ThemeButton.connect("clicked", self.openemerald)

		# Gfx card identifier

		self.GraphicsAdaptorIdentifier = self.gladefile.get_widget('GraphicsCard')
		self.GraphicsAdaptorIdentifier.set_use_markup(True)
		# Xgl screws up some stuff in glxinfo, putting "Generic Graphics Card" there.
		# We need to notify the user that the graphics card cannot be displayed at the
		# moment
		if self.XglIsActive == True:
			self.GraphicsAdaptorIdentifier.set_text("Xgl is currently enabled. Therefore, your graphics card cannot be determined at this time. If you want to know your graphics card's model, disable Xgl")
		else:
			self.GraphicsAdaptorIdentifier.set_text(self.GlxRenderer)

		# Gfx Card Image

		self.DisplayImage = self.gladefile.get_widget('MonitorImage')
		self.DisplayImage.set_from_file('images/display.png')

		# Rendering Path Image

		self.RenderImage = self.gladefile.get_widget('RenderingMethodImage')
		self.RenderImage.set_from_file('images/Rendering.svg')


		# Lighting Check Box
		self.LightingCheckBox = self.gladefile.get_widget('EnableLighting')
		self.OldLightingBool = self.core.Screens[0]["lighting"].Value
		self.LightingCheckBox.set_active(self.OldLightingBool)
		self.LightingCheckBox.connect("clicked", self.LightingToggled)

		# VSync Check Box
		self.VSyncCheckBox = self.gladefile.get_widget('VSyncEnable')
		self.OldVSyncBool = self.core.Screens[0]["sync_to_vblank"].Value
		self.VSyncCheckBox.set_active(self.OldVSyncBool)
		self.VSyncCheckBox.connect("clicked", self.VSyncToggled)

		# Now for the hard part - The Texture Filter
		self.TextureFilterCombo = self.gladefile.get_widget('TextureFilteringCombo')
		self.OldTextureFilteringComboValue = self.core.Display["texture_filter"].Value
		self.TextureFilterCombo.set_active(self.OldTextureFilteringComboValue)
		self.TextureFilterCombo.connect("changed", self.TextureFilterModified)

		## The 'Windows' Tab

		self.text = self.context.Plugins["text"]
		self.switcher = self.context.Plugins["switcher"]
		self.ring = self.context.Plugins["ring"]
		self.shift = self.context.Plugins["shift"]
		self.scale = self.context.Plugins["scale"]
		self.scalefilter = self.context.Plugins["scalefilter"]
		self.scaleaddon = self.context.Plugins["scaleaddon"]
		self.thumbnail = self.context.Plugins["thumbnail"]
		self.group = self.context.Plugins["group"]
		self.extrawm = self.context.Plugins["extrawm"]
		self.widget = self.context.Plugins["widget"]
		self.expo = self.context.Plugins["expo"]

		# Which Switcher to use

		self.UseFlatSwitcher = self.gladefile.get_widget('AppSwitcherTypeFlat')
		self.UseRingSwitcher = self.gladefile.get_widget('AppSwitcherTypeRing')
		self.UseFlipSwitcher = self.gladefile.get_widget('AppSwitcherTypeFlip')
		self.UseCoverSwitcher = self.gladefile.get_widget('AppSwitcherTypeCover')

		# Here, we determine which of the switchers is the 'Active'
		# one, and hence we set the key. The only problem is that
		# flat switcher must be active by default if all switchers are enabled
		# already.

		if (self.switcher.Enabled == True):
			self.UseFlatSwitcher.set_active(True)
			self.CurSwitcherKey = self.switcher.Display["next_key"].Value
			self.ring.Enabled = False
			self.shift.Enabled = False
			self.context.Write()
		elif (self.ring.Enabled == True):
			self.UseRingSwitcher.set_active(True)
			self.CurSwitcherKey = self.ring.Display["next_key"].Value
			self.switcher.Enabled = False
			self.shift.Enabled = False
			self.context.Write()
		elif (self.shift.Enabled == True):
			self.CurSwitcherKey = self.shift.Display["next_key"].Value
			self.ring.Enabled = False
			self.switcher.Enabled = False
			self.context.Write
			if (self.shift.Screens[0]["mode"].Value == 0):
				self.UseCoverSwitcher.set_active(True)
			else:
				self.UseFlipSwitcher.set_active(True)

		# Now we need to connect these with some functions that will do stuff. Whoppe!

		self.UseFlatSwitcher.connect("clicked", self.SwitcherModeChanged)
		self.UseRingSwitcher.connect("clicked", self.SwitcherModeChanged)
		self.UseFlipSwitcher.connect("clicked", self.SwitcherModeChanged)
		self.UseCoverSwitcher.connect("clicked", self.SwitcherModeChanged)

		# Here we are going to do the screencorners. What we need to do here is
		# check every possible option to see if a screencorner is set for that widget

		# First, we need to set options up

		self.ScaleCurrent = self.scale.Display["initiate_edge"]
		self.ScaleAll = self.scale.Display["initiate_all_edge"]
		self.ScaleApp = self.scale.Display["initiate_group_edge"]
		self.ShowDesktop = self.core.Display["show_desktop_edge"]
		self.ExpoEdge = self.expo.Display["expo_edge"]
		self.Widgets = self.widget.Display["toggle_edge"]
		self.Nothing = "Nothing"

		# Now we need to create a dictionary that relates the option names back to the numbers

		self.ScreenCornerPlugins = [self.Nothing, self.ScaleCurrent, self.ScaleAll, self.ScaleApp, self.ExpoEdge, self.ShowDesktop, self.Widgets]

		# Now, we create a loop to find out which number has which option
		for OptionName in self.ScreenCornerPlugins:
			if OptionName != "Nothing":
				if OptionName.Value == "TopRight":
					self.CurTopRight = self.ScreenCornerPlugins.index(OptionName)
					self.TopRightOldOption = OptionName
					break
				else:
					self.CurTopRight = 0
					self.TopRightOldOption = "Nothing"

		for OptionName in self.ScreenCornerPlugins:
			if OptionName != "Nothing":
				if OptionName.Value == "TopLeft":
					self.CurTopLeft = self.ScreenCornerPlugins.index(OptionName)
					self.TopLeftOldOption = OptionName
					break
				else:
					self.CurTopLeft = 0
					self.TopLeftOldOption = "Nothing"



		for OptionName in self.ScreenCornerPlugins:
			if OptionName != "Nothing":
				if OptionName.Value == "BottomRight":
					self.CurBottomRight = self.ScreenCornerPlugins.index(OptionName)
					self.BottomRightOldOption = OptionName
					break
				else:
					self.CurBottomRight = 0
				self.BottomRightOldOption = "Nothing"

		for OptionName in self.ScreenCornerPlugins:
			if OptionName != "Nothing":
				if OptionName.Value == "BottomLeft":
					print OptionName.Value
					self.CurBottomLeft = self.ScreenCornerPlugins.index(OptionName)
					self.BottomLeftOldOption = OptionName
					break
				else:
					self.CurBottomLeft = 0
					self.BottomLeftOldOption = "Nothing"

		# Now that we know which screencorner contains what option,
		# we can set up each widget to contain each option by default

		self.TopLeftSelect = self.gladefile.get_widget('TopLeftEdgeSelect')
		if (self.CurTopLeft != None):
			self.TopLeftSelect.set_active(self.CurTopLeft)
		else:
			self.TopLeftSelect.set_active(0)
		self.TopLeftSelect.connect("changed", self.TopLeftSelectChanged)

		self.TopRightSelect = self.gladefile.get_widget('TopRightEdgeSelect')
		if (self.CurTopRight != None):
			self.TopRightSelect.set_active(self.CurTopRight)
		else:
			self.TopRightSelect.set_active(0)
		self.TopRightSelect.connect("changed", self.TopRightSelectChanged)

		self.BottomLeftSelect = self.gladefile.get_widget('BottomLeftEdgeSelect')
		if (self.CurBottomLeft != None):
			self.BottomLeftSelect.set_active(self.CurBottomLeft)
		else:
			self.BottomLeftSelect.set_active(0)
		self.BottomLeftSelect.connect("changed", self.BottomLeftSelectChanged)

		self.BottomRightSelect = self.gladefile.get_widget('BottomRightEdgeSelect')
		if (self.CurBottomRight != None):
			self.BottomRightSelect.set_active(self.CurBottomRight)
		else:
			self.BottomRightSelect.set_active(0)
		self.BottomRightSelect.connect("changed", self.BottomRightSelectChanged)

		# The 'App switch with' entry

		self.SwitcherKey = self.gladefile.get_widget('AppSwitcherKey')
		self.SwitcherKey.set_text(self.CurSwitcherKey)
		self.SwitcherKey.connect("activate", self.SwitcherKeyChanged)

		# Allow grouping / allow tabbing

		self.AllowTabbing = self.gladefile.get_widget('AllowTabbingCheckBox')
		self.AllowTabbingOld = self.group.Screens[0]["autotab_create"].Value
		self.AllowTabbing.set_active(self.AllowTabbingOld)
		self.AllowTabbing.connect("clicked", self.AllowTabbingToggled)

		self.AllowGrouping = self.gladefile.get_widget('AllowGroupingCheckBox')
		self.AllowGroupingOld = self.group.Enabled
		self.AllowGrouping.set_active(self.AllowGroupingOld)
		self.AllowGrouping.connect("clicked", self.AllowGroupingToggled)
		# A little statement to make inactive the "Tabbing" combox
		# as it is required by group
		if (self.AllowGrouping.get_active() == False):
			self.AllowTabbing.set_sensitive(False)
		else:
			self.AllowTabbing.set_sensitive(True)

		# Scale information

		self.ScaleInfo = self.gladefile.get_widget('TextScale')
		# FIXME : We are currently only checking scalefilter
		if (self.scalefilter.Enabled == True):
			self.OldScaleInfoBool = True
			self.text.Enabled = True
			self.scaleaddon.Enabled = True
			self.scalefilter.Enabled = True
			self.context.Write()
		else:
			self.OldScaleInfoBool = False
			self.scaleaddon.Enabled = False
			self.scalefilter.Enabled = False
			self.context.Write()
		self.ScaleInfo.set_active(self.OldScaleInfoBool)
		self.ScaleInfo.connect("clicked", self.ScaleInfoToggled)

		# Window Thumbnails

		self.WinThumbnails = self.gladefile.get_widget('Thumbnails')
		if (self.thumbnail.Enabled == True):
			self.OldThumbnailBool = True
			self.text.Enabled
			self.context.Write()
		else:
			self.OldThumbnailBool = False
		self.WinThumbnails.set_active(self.OldThumbnailBool)
		self.WinThumbnails.connect("clicked", self.WinThumbnailsToggled)

		# FullScreen Key

		self.FullscreenKey = self.gladefile.get_widget('FullscreenEntry')
		self.FullscreenOld = self.extrawm.Display["toggle_fullscreen_key"].Value
		self.FullscreenKey.set_text(self.FullscreenOld)
		self.FullscreenKey.connect("activate", self.FullscreenKeyChanged)

		# Sticky Key

		self.StickyKey = self.gladefile.get_widget('StickEntry')
		self.StickyOld = self.extrawm.Display["toggle_sticky_key"].Value
		self.StickyKey.set_text(self.StickyOld)
		self.StickyKey.connect("activate", self.StickyKeyChanged)


		# Desktop Tab

		self.cube = self.context.Plugins["cube"]
		self.rotate = self.context.Plugins["rotate"]
		self.wall = self.context.Plugins["wall"]
		self.plane = self.context.Plugins["plane"]
		self.cubereflex = self.context.Plugins["cubereflex"]
		self.TD = self.context.Plugins["3d"]
		self.gears = self.context.Plugins["gears"]
		self.atlantis = self.context.Plugins["atlantis"]


		# HSize Config

		self.Hsize = self.gladefile.get_widget('DesktopSizeX')
		self.OldHsize = self.core.Screens[0]["hsize"].Value
		self.Hsize.set_value(self.OldHsize)
		self.Hsize.connect('format-value', self.HsizeChanged)

		# VSize Config

		self.Vsize = self.gladefile.get_widget('DesktopSizeY')
		self.OldVsize = self.core.Screens[0]["vsize"].Value
		self.Vsize.set_value(self.OldVsize)
		self.Vsize.connect('format-value', self.VsizeChanged)

		# Desktop Appearance

		self.DesktopAppearance = self.gladefile.get_widget('DesktopAppearanceCombo')
		if (self.cube.Enabled == True):
			self.desktopactive = 0
			self.CurrentlyActive = "cube"
			self.rotate.Enabled = True
			self.wall.Enabled = False
			self.plane.Enabled = False
			self.expo.Enabled = True
			self.context.Write()
		elif (self.wall.Enabled == True):
			self.desktopactive = 1
			self.CurrentlyActive = "wall"
			self.cube.Enabled = False
			self.rotate.Enabled = False
			self.plane.Enabled = False
			self.expo.Enabled = True
			self.TD.Enabled = False
			self.atlantis.Enabled = False
			self.gears.Enabled = False
			self.cubereflex.Enabled = False
		elif (self.plane.Enabled == True):
			self.desktopactive = 2
			self.CurrentlyActive = "plane"
			self.cube.Enabled = False
			self.rotate.Enabled = False
			self.plane.Enabled = False
			self.expo.Enabled = False
			self.TD.Enabled = False
			self.atlantis.Enabled = False
			self.gears.Enabled = False
			self.cubereflex.Enabled = False

		self.DesktopAppearance.set_active(self.desktopactive)	
		self.DesktopAppearance.connect('changed', self.DesktopAppearanceChanged)

		# Expo Reflex

		self.ExpoReflexCheck = self.gladefile.get_widget('ReflectionCheck')
		self.OldExpoReflexValue = self.expo.Display["reflection"].Value
		self.ExpoReflexCheck.set_active(self.OldExpoReflexValue)
		self.ExpoReflexCheck.connect('clicked', self.ExpoReflexToggled)

		# Cube Reflex

		self.CubeReflexCheck = self.gladefile.get_widget('CubeReflectionCheck')
		self.OldCubeReflexValue = self.cubereflex.Enabled
		self.CubeReflexCheck.set_active(self.OldCubeReflexValue)
		self.CubeReflexCheck.connect('clicked', self.
CubeReflexToggled)

		# Cube Transparency

		self.TransCube = self.gladefile.get_widget('CubeTransparency')
		self.OldTransCubeValue = self.cube.Screens[0]["active_opacity"].Value
		self.TransCube.set_value(self.OldTransCubeValue)
		self.TransCube.connect('format-value', self.TransCubeValueChanged)

		# I love you glade ;-)
		self.gladefile.get_widget('CompizFusionConfigWindow').show_all()
		if self.RenderingPathString != 'none':
			self.ConfigureButton.hide()
		else:
			self.ConfigureButton.show()

		if self.possible == False:
			self.EnableEffects.set_sensitive(False)

		# Effects Settings

		self.wobbly = self.context.Plugins["wobbly"]
		self.animation = self.context.Plugins["animation"]
		self.resize = self.context.Plugins["resize"]
		

		# Move Effect Combo
		self.MoveEffect = self.gladefile.get_widget('MoveCombo')
		if self.wobbly.Enabled == True:
			self.MoveEffect.set_active(1)
		else:
			self.MoveEffect.set_active(0)
		self.MoveEffect.connect("changed", self.MoveEffectChanged)

		# Resize Effect Combo

		self.ResizeEffect = self.gladefile.get_widget('ResizeCombo')
		self.OldResizeEffectValue = self.resize.Display["mode"].Value
		self.ResizeEffect.set_active(self.OldResizeEffectValue)
		self.ResizeEffect.connect("changed", self.ResizeEffectChanged)

		# Animation Boxes. Thanks to marex for the functions

		self.FillAnimationBoxes()

		self.CreateCombo = self.gladefile.get_widget('CreateCombo')
		self.CreateCombo.connect('changed', self.AnimationBoxChanged, "open_effects")

		self.CloseCombo = self.gladefile.get_widget('CloseCombo')
		self.CloseCombo.connect('changed', self.AnimationBoxChanged, "close_effects")

		self.MinimizeCombo = self.gladefile.get_widget('MinimizeCombo')
		self.MinimizeCombo.connect('changed', self.AnimationBoxChanged, "minimize_effects")

		self.ShadeCombo = self.gladefile.get_widget('ShadeCombo')
		self.ShadeCombo.connect('changed', self.AnimationBoxChanged, "shade_effects")

		self.FocusCombo = self.gladefile.get_widget('FocusCombo')
		self.ShadeCombo.connect('changed', self.AnimationBoxChanged, "shade_effects")

	def CreateTitle(self, signal, page, page_num):
		print page_num
		if page_num == 0:
			self.TitleLabel.set_text('<b>General Graphics Options</b>')
			self.TitleLabel.set_use_markup(True)
			self.TitleImage.set_from_file('images/general.svg')
		if page_num == 1:
			self.TitleLabel.set_text('<b>Configure how your windows are managed</b>')
			self.TitleLabel.set_use_markup(True)
			self.TitleImage.set_from_file('images/windowman.svg')
		if page_num == 2:
			self.TitleLabel.set_text('<b>Configure how your desktops are managed</b>')
			self.TitleLabel.set_use_markup(True)
			self.TitleImage.set_from_file('images/desktopman.svg')
		if page_num == 3:
			self.TitleLabel.set_text('<b>Configure various effects</b>')
			self.TitleLabel.set_use_markup(True)
			self.TitleImage.set_from_file('images/effects.svg')
		if page_num == 4:
			self.TitleLabel.set_text('<b>Make your desktop more usable and accessible</b>')
			self.TitleLabel.set_use_markup(True)
			self.TitleImage.set_from_file('images/access.svg')
		

	# Here begins the area where widgets are and options are checked if
	# they are unequal and if so, the option is changed to match the widget.
	# Some areas may require conversion of intergers to strings, so that both
	# the widget and the settings value can make sense

	# Core Options

	def LightingToggled(self, signal):

		LightingToggledCurrentValue = self.LightingCheckBox.get_active()
		LightingToggledCompizValue = self.core.Screens[0]["lighting"].Value

		if (LightingToggledCurrentValue != LightingToggledCompizValue):
			self.core.Screens[0]["lighting"].Value = LightingToggledCurrentValue
			self.context.Write()

	def VSyncToggled(self, signal):

		VSyncToggledCurrentValue = self.VSyncCheckBox.get_active()
		VSyncToggledCompizValue = self.core.Screens[0]["sync_to_vblank"].Value

		if (VSyncToggledCurrentValue != VSyncToggledCompizValue):
			self.core.Screens[0]["sync_to_vblank"].Value = VSyncToggledCurrentValue
			self.context.Write()

	def TextureFilterModified(self, signal):

		TextureFilterModifiedCurrentValue = self.TextureFilterCombo.get_active()
		TextureFilterModifiedCompizValue = self.core.Display["texture_filter"].Value

		if (TextureFilterModifiedCurrentValue != TextureFilterModifiedCompizValue):
			self.core.Display["texture_filter"].Value = TextureFilterModifiedCurrentValue
			self.context.Write()

	# Windows Options

	def SwitcherModeChanged(self, signal):

		# Check to see which radio button is active and 
		# enable / disable plugins accordingly

		if (self.UseFlatSwitcher.get_active() == True):
			self.CurSwitcherKey = self.switcher.Display["next_key"].Value
			self.SwitcherKey.set_text(self.CurSwitcherKey)
			self.switcher.Enabled = True
			self.ring.Enabled = False
			self.shift.Enabled = False
			self.context.Write()
		elif (self.UseRingSwitcher.get_active() == True):
			self.CurSwitcherKey = self.ring.Display["next_key"].Value
			self.SwitcherKey.set_text(self.CurSwitcherKey)
			self.ring.Enabled = True
			self.switcher.Enabled = False
			self.shift.Enabled = False
			self.context.Write()
		elif (self.UseFlipSwitcher.get_active() == True):
			self.CurSwitcherKey = self.shift.Display["next_key"].Value
			self.SwitcherKey.set_text(self.CurSwitcherKey)
			self.shift.Enabled = True
			# Because Flip and Cover are not separate plugins,
			# we need to set an option here
			self.shift.Screens[0]["mode"].Value = 1
			self.switcher.Enabled = False
			self.ring.Enabled = False
			self.context.Write()
		elif (self.UseCoverSwitcher.get_active() == True):
			self.CurSwitcherKey = self.shift.Display["next_key"].Value
			self.SwitcherKey.set_text(self.CurSwitcherKey)
			self.shift.Enabled = True
			self.shift.Screens[0]["mode"].Value = 0
			self.switcher.Enabled = False
			self.ring.Enabled = False
			self.context.Write()

	def SwitcherKeyChanged(self, signal):

		ValueInBox = self.SwitcherKey.get_text()

		if (self.UseFlatSwitcher.get_active() == True):
			FlatSwitcherValue = self.switcher.Display["next_key"].Value
			if (FlatSwitcherValue !=ValueInBox):
				self.switcher.Display["next_key"].Value = ValueInBox
			self.context.Write()
		if (self.UseRingSwitcher.get_active() == True):
			RingSwitcherValue = self.ring.Display["next_key"].Value
			if (RingSwitcherValue !=ValueInBox):
				self.ring.Display["next_key"].Value = ValueInBox
			self.context.Write()
		if (self.UseFlipSwitcher.get_active() == True):
			FlipSwitcherValue = self.shift.Display["next_key"].Value
			if (FlipSwitcherValue !=ValueInBox):
				self.shift.Display["next_key"].Value = ValueInBox
			self.context.Write()
		if (self.UseCoverSwitcher.get_active() == True):
			CoverSwitcherValue = self.shift.Display["next_key"].Value
			if (CoverSwitcherValue !=ValueInBox):
				self.shift.Display["next_key"].Value = ValueInBox
			self.context.Write()

	def TopLeftSelectChanged(self, signal):

		self.GlobalUpdater = Updater()

		CurrentValue = self.TopLeftSelect.get_active()
		for OptionName in self.ScreenCornerPlugins:
			if OptionName != "Nothing":
				if OptionName.Value == "TopLeft":
					CompizValue = self.ScreenCornerPlugins.index(OptionName)
				# Otherwise, compizvalue is none
				else:
					CompizValue = 0

		for OptionName in self.ScreenCornerPlugins:
			# First, we need to disable the old option.
			if self.TopLeftOldOption != "Nothing":
				self.TopLeftOldOption.Value = "Disabled"
				self.context.Write()
			if self.ScreenCornerPlugins.index(OptionName) == CurrentValue:
				if CurrentValue != 0:
					Setting = OptionName
					Edge = "TopLeft"
					Conflict = ccm.ActionConflict(Setting, edges = Edge)
					if Conflict.Resolve(self.GlobalUpdater):
						OptionName.Value = Edge
						self.TopLeftOldOption = OptionName
						self.context.Write()
					break
				else:
					break


	def TopRightSelectChanged(self, signal):

		self.GlobalUpdater = Updater()

		CurrentValue = self.TopRightSelect.get_active()
		for OptionName in self.ScreenCornerPlugins:
			if OptionName != "Nothing":
				if OptionName.Value == "TopRight":
					CompizValue = self.ScreenCornerPlugins.index(OptionName)
				# Otherwise, compizvalue is none
				else:
					CompizValue = 0

		for OptionName in self.ScreenCornerPlugins:
			# First, we need to disable the old option.
			if self.TopRightOldOption != "Nothing":
				self.TopRightOldOption.Value = "Disabled"
				self.context.Write()
			if self.ScreenCornerPlugins.index(OptionName) == CurrentValue:
				if CurrentValue != 0:
					Setting = OptionName
					Edge = "TopRight"
					Conflict = ActionConflict(Setting, edges = Edge)
					if Conflict.Resolve(self.GlobalUpdater):
						OptionName.Value = Edge
						self.TopRightOldOption = OptionName
						self.context.Write()
					break
				else:
					break

	def BottomLeftSelectChanged(self, signal):

		self.GlobalUpdater = Updater()

		CurrentValue = self.BottomLeftSelect.get_active()
		for OptionName in self.ScreenCornerPlugins:
			if OptionName != "Nothing":
				if OptionName.Value == "BottomLeft":
					CompizValue = self.ScreenCornerPlugins.index(OptionName)
				# Otherwise, compizvalue is none
				else:
					CompizValue = 0

		for OptionName in self.ScreenCornerPlugins:
			# First, we need to disable the old option.
			if self.TopLeftOldOption != "Nothing":
				self.TopLeftOldOption.Value = "Disabled"
				self.context.Write()
			if self.ScreenCornerPlugins.index(OptionName) == CurrentValue:
				if CurrentValue != 0:
					Setting = OptionName
					Edge = "BottomLeft"
					Conflict = ActionConflict(Setting, edges = Edge)
					if Conflict.Resolve(self.GlobalUpdater):
						OptionName.Value = Edge
						self.TopLeftOldOption = OptionName
						self.context.Write()
					break
				else:
					break

	def BottomRightSelectChanged(self, signal):

		self.GlobalUpdater = Updater()

		CurrentValue = self.BottomRightSelect.get_active()
		for OptionName in self.ScreenCornerPlugins:
			if OptionName != "Nothing":
				if OptionName.Value == "BottomRight":
					CompizValue = self.ScreenCornerPlugins.index(OptionName)
				# Otherwise, compizvalue is none
				else:
					CompizValue = 0

		for OptionName in self.ScreenCornerPlugins:
			# First, we need to disable the old option.
			if self.BottomRightOldOption != "Nothing":
				self.BottomRightOldOption.Value = "Disabled"
				self.context.Write()
			if self.ScreenCornerPlugins.index(OptionName) == CurrentValue:
				if CurrentValue != 0:
					Setting = OptionName
					Edge = "BottomRight"
					Conflict = ActionConflict(Setting, edges = Edge)
					if Conflict.Resolve(self.GlobalUpdater):
						OptionName.Value = Edge
						self.BottomRightOldOption = OptionName
						self.context.Write()
					break
				else:
					break

	# Allow Grouping / Tabbing Options

	def AllowGroupingToggled(self, signal):

		CurrentValue = self.AllowGrouping.get_active()
		CompizValue = self.group.Enabled

		if (CurrentValue != CompizValue):
			self.group.Enabled = CurrentValue
			self.context.Write()

	def AllowTabbingToggled(self, signal):

		CurrentValue = self.AllowTabbing.get_active()
		CompizValue = self.group.Screens[0]["autotab_create"].Value

		if (CurrentValue != CompizValue):
			self.group.Screens[0]["autotab_create"].Value = CurrentValue
			self.context.Write()

	# Fullscreen Key

	def FullscreenKeyChanged(self, signal):

		CurrentValue = self.FullscreenKey.get_text()
		CompizValue = self.extrawm.Display["toggle_fullscreen_key"].Value

		if (CurrentValue != CompizValue):
			self.extrawm.Display["toggle_fullscreen_key"].Value = CurrentValue
			self.context.Write()


	def StickyKeyChanged(self, signal):

		CurrentValue = self.StickyKey.get_text()
		CompizValue = self.extrawm.Display["toggle_sticky_key"].Value

		if (CurrentValue != CompizValue):
			self.extrawm.Display["toggle_sticky_key"].Value = CurrentValue
			self.context.Write()

	# Desktop Options

	def DesktopAppearanceChanged(self, signal):

		# To do this properly, we need to determine whether Wall, Cube
		# or Plane are active. Earlier, I set a string to determine which
		# compiz option was the active one
		
		CurrentValue = self.DesktopAppearance.get_active()
		if (CurrentValue == 0):
			CurrentlySelected = "cube"
		elif (CurrentValue == 1):
			CurrentlySelected = "wall"
		elif (CurrentValue == 2):
			CurrentlySelected = "plane"

		# Enable / Disable Plugins accordingly
		if (CurrentlySelected == "cube"):
			self.wall.Enabled = False
			self.cube.Enabled = True
			self.rotate.Enabled = True
			self.plane.Enabled = False
			self.expo.Enabled = True
			self.context.Write()
		elif (CurrentlySelected == "wall"):
			self.rotate.Enabled = False
			self.plane.Enabled = False
			self.expo.Enabled = True
			self.TD.Enabled = False
			self.atlantis.Enabled = False
			self.gears.Enabled = False
			self.cubereflex.Enabled = False
			self.cube.Enabled = False
			self.wall.Enabled = True
			self.context.Write()
		elif (CurrentlySelected == "plane"):
			self.plane.Enabled = True
			self.rotate.Enabled = False
			self.expo.Enabled = False
			self.TD.Enabled = False
			self.atlantis.Enabled = False
			self.gears.Enabled = False
			self.cubereflex.Enabled = False	
			self.cube.Enabled = False
			self.wall.Enabled = False
			self.context.Write()

	def HsizeChanged(self, signal, arg=None):

		CurrentSize = self.Hsize.get_value()
		CompizSize = self.core.Screens[0]["hsize"].Value

		if (CurrentSize != CompizSize):

			self.core.Screens[0]["hsize"].Value = CurrentSize
			self.context.Write()

	def VsizeChanged(self, signal, arg=None):

		CurrentSize = self.Vsize.get_value()
		CompizSize = self.core.Screens[0]["vsize"].Value

		if (CurrentSize != CompizSize):

			self.core.Screens[0]["vsize"].Value = CurrentSize
			self.context.Write()

	def TransCubeValueChanged(self, signal, arg=None):

		CurrentValue = self.TransCube.get_value()
		CompizValue = self.cube.Screens[0]["active_opacity"].Value

		if (CurrentValue != CompizValue):

			self.cube.Screens[0]["active_opacity"].Value = CurrentValue
			self.context.Write()

	def ExpoReflexToggled(self, signal):

		CurrentValue = self.ExpoReflexCheck.get_active()
		CompizValue = self.expo.Display["reflection"].Value

		if (CurrentValue != CompizValue):
			self.expo.Display["reflection"].Value = CurrentValue
			self.context.Write()

	def CubeReflexToggled(self, signal):

		CurrentValue = self.CubeReflexCheck.get_active()
		CompizValue = self.cubereflex.Enabled

		if (CurrentValue != CompizValue):
			self.cubereflex.Enabled = CurrentValue
			self.context.Write()

	def ScaleInfoToggled(self, signal):

		CurrentValue = self.ScaleInfo.get_active()
		if (self.scalefilter.Enabled == True) or (self.scaleaddon.Enabled == True):
			CompizValue = True
		else:
			CompizValue = False

		if (CurrentValue != CompizValue):
			if CurrentValue == True:
				self.text.Enabled = True
				self.scalefilter.Enabled = True
				self.scaleaddon.Enabled = True
				self.context.Write()
			else:
				self.scalefilter.Enabled = False
				self.scaleaddon.Enabled = False
				self.context.Write()

	def WinThumbnailsToggled(self, signal):

		CurrentValue = self.WinThumbnails.get_active()
		CompizValue = self.thumbnail.Enabled

		if (CurrentValue != CompizValue):
			if CurrentValue == True:
				self.text.Enabled = True
				self.thumbnail.Enabled = True
				self.context.Write()
			else:
				self.text.Enabled = False
				self.thumbnail.Enabled = False
				self.context.Write()

	# Effects Options

	def MoveEffectChanged(self, signal):

		if self.MoveEffect.get_active() == 0:
			self.wobbly.Enabled = False
			self.context.Write()
		elif self.MoveEffect.get_active() == 1:
			self.wobbly.Enabled = True
			self.context.Write()

	def ResizeEffectChanged(self, signal):

		self.resize.Display["mode"].Value = self.ResizeEffect.get_active()
		self.context.Write()

	# Animation Boxes. Thanks to marex's 'simple-ccsm' for these

	def SetupBoxModel(self, box):
		store = gtk.ListStore(gobject.TYPE_STRING)
		box.set_model(store)
		cell = gtk.CellRendererText()
		box.pack_start(cell, True)
		box.add_attribute(cell, 'text', 0)

	def FillAnimationBoxes(self):
		plugin = self.context.Plugins['animation']
        
		boxes = {}
		boxes['CloseCombo'] =  "close_effects"
		boxes['CreateCombo'] = "open_effects"
		boxes['MinimizeCombo'] = "minimize_effects"
		boxes['ShadeCombo'] = "shade_effects"
		boxes['FocusCombo'] = "focus_effects"

		set = plugin.Screens[0]["close_effects"]
		print set.Info[1][2]

		for boxName, settingName in boxes.items():
			print boxName + " has " + settingName

		for boxName, settingName in boxes.items():
			box = self.gladefile.get_widget(boxName)
			setting = plugin.Screens[0][settingName]
			items = sorted(setting.Info[1][2].items(), ccm.EnumSettingSortCompare)
			#if settingName == "close_effects":
			#	items = ["None", "Random", "Airplane", "Beam Up", "Burn", "Curved Fold", "Domino", "Dream", "Explode", "Fade", "Fold", "Glide 1", "Glide 2", "Horizontal Folds", "Leaf Spread", "Magic Lamp", "RAZR", "Sidekick", "Skewer", "Vacuum", "Wave", "Zoom"]
			#if settingName == "open_effects":
			#	items = ["None", "Random", "Airplane", "Beam Up", "Burn", "Curved Fold", "Domino", "Dream", "Explode", "Fade", "Fold", "Glide 1", "Glide 2", "Horizontal Folds", "Leaf Spread", "Magic Lamp", "RAZR", "Sidekick", "Skewer", "Vacuum", "Wave", "Zoom"]
			#if settingName == "minimize_effects":
			#	items = ["None", "Random", "Airplane", "Beam Up", "Burn", "Curved Fold", "Domino", "Dream", "Explode", "Fade", "Fold", "Glide 1", "Glide 2", "Horizontal Folds", "Leaf Spread", "Magic Lamp", "RAZR", "Sidekick", "Skewer", "Zoom"]
			#if settingName == "shade_effects":
			#	items = ["None", "Random", "Curved Fold", "Horizontal Folds", "Roll Up"]
			#if settingName == "focus_effects":
			#	items = ["None", "Dodge", "Fade", "Wave"]
			self.SetupBoxModel(box)
			for key in items:
				box.append_text(key)
			if len(setting.Value):
				box.set_active(setting.Value[0])
			else:
				box.set_active(0)

	def AnimationBoxChanged(self, widget, settingName):
		newval = widget.get_active_text()
		plugin = self.context.Plugins['animation']
		setting = plugin.Screens[0][settingName]
		value = setting.Value
		if len(value) >= 1:
           		value[0] = setting.Info[1][2][newval]
           		setting.Value = value
			setting.Value = widget.get_active()
			self.context.Write()
		else:
			for setting in plugin.Groups[setting.Group][setting.SubGroup].Screens[0].values():
				setting.Reset()
				self.context.Write()
				self.AnimationBoxChanged(widget, settingName)




	
if __name__=='__main__':
	Base()
	gtk.main()