#!/usr/bin/env python
import gtk
import sys
import gobject
import gettext
import subprocess
import time
import gconf
import os
_ = gettext.gettext
gettext.bindtextdomain("fusion-desktop-effects", "@prefix@/share/locale")
gettext.textdomain("fusion-desktop-effects")
COMPIZ_LAUNCHER = "compiz-manager"
COMPIZ_WM = "compiz-fusion-gtk"
WM_KEY = "/desktop/gnome/session/required_components/windowmanager"
BANNER = "@datadir@/cf_logo.png"
def enable_compiz():
gc = gconf.client_get_default()
gc.set_string(WM_KEY,COMPIZ_WM)
def compiz_enabled():
gc = gconf.client_get_default()
return gc.get_string(WM_KEY) == COMPIZ_WM
def enable_metacity():
subprocess.Popen(["metacity","--replace"])
gc = gconf.client_get_default()
gc.set_string(WM_KEY,"metacity")
def command_exists(cmd):
for p in os.environ['PATH'].split(':'):
if os.path.exists(os.path.join(p,cmd)):
return True
return False
class MainWindow:
def __init__(self):
self.window = gtk.Dialog()
self.window.set_title(_("Compiz Fusion"))
self.togglebutton = gtk.ToggleButton(_("Enable Compiz Fusion Desktop Effects"))
self.window.set_resizable(False)
if compiz_enabled():
self.togglebutton.set_active(True)
self.togglebutton.connect('toggled',self.on_toggle)
heading = gtk.Label(_("Desktop Effects"))
heading.set_use_markup(True)
heading.set_alignment(0,0)
hbox = gtk.HBox(homogeneous=False,spacing=0)
self.window.vbox.pack_start(hbox,padding=10)
vbox = gtk.VBox(homogeneous=False,spacing=0)
img = gtk.Image()
img.set_from_file(BANNER)
vbox.pack_start(img)
hbox.pack_start(vbox,padding=10)
vbox.pack_start(heading)
vbox.pack_start(self.togglebutton)
prefimg = gtk.Image()
prefimg.set_from_icon_name('gtk-preferences',1)
morebutton = self.window.add_button(_('_Advanced'),0)
morebutton.set_property('image',prefimg)
expertbutton = self.window.add_button(_('_Expert'),0)
expertimg = gtk.Image()
expertimg.set_from_icon_name('preferences-desktop-personal',1)
expertbutton.set_property('image',expertimg)
closebutton = self.window.add_button(gtk.STOCK_CLOSE,0)
closebutton.connect('clicked',self.destroy)
if not command_exists('simple-ccsm'):
morebutton.set_sensitive(False)
if not command_exists('ccsm'):
expertbutton.set_sensitive(False)
morebutton.connect('clicked',self.launch_sccsm)
expertbutton.connect('clicked',self.launch_ccsm)
self.window.show_all()
self.window.connect('destroy',self.destroy)
def destroy(self,widget):
sys.exit(0)
def on_toggle(self,widget):
if widget.get_active():
process = subprocess.Popen([COMPIZ_LAUNCHER,'--replace'])
procpoll = None
for i in range(0,5):
time.sleep(1)
procpoll = process.poll()
if not procpoll:
td = TimeoutDialog(self.togglebutton)
td.run()
else:
enable_metacity()
def launch_sccsm(self,widget):
subprocess.Popen(['simple-ccsm'])
def launch_ccsm(self,widget):
subprocess.Popen(['ccsm'])
class TimeoutDialog:
def __init__(self,togglebutton):
self.togglebutton = togglebutton
self.window = gtk.Dialog()
self.window.set_resizable(False)
self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
self.window.set_title(_("Keep Settings"))
mainbox = gtk.HBox(homogeneous=False,spacing=0)
self.window.vbox.pack_start(mainbox,padding=10)
iconimg = gtk.Image()
iconimg.set_from_icon_name('gtk-dialog-question',6)
mainbox.pack_start(iconimg,padding=5)
vbox = gtk.VBox(homogeneous=False,spacing=0)
heading = gtk.Label(_("Do you want to keep these settings?"))
heading.set_use_markup(True)
vbox.pack_start(heading)
self.label = gtk.Label(_("Testing the new settings. If you don't respond in 30 seconds, the previous settings will be restored."))
self.label.set_line_wrap(True)
vbox.pack_start(self.label)
mainbox.pack_start(vbox)
savebutton = self.window.add_button(_("Keep Settings"),0)
cancelbutton = self.window.add_button(_("Use Previous Settings"),0)
savebutton.connect('clicked',self.save)
cancelbutton.connect('clicked',self.cancel)
self.window.show_all()
def save(self,widget):
self._apply()
gobject.source_remove(self.timeoutloop)
self.window.destroy()
def _apply(self):
enable_compiz()
def cancel(self,widget):
self._revert()
self.window.destroy()
def _revert(self):
enable_metacity()
def run(self):
timerdata = dict(timer=0,endtime=30)
self.timeoutloop = gobject.timeout_add(1000, self.updatelabel,timerdata)
def updatelabel(self,timerdata):
timeleft = timerdata['endtime'] - timerdata['timer']
self.label.set_label(_("Testing the new settings. If you don't respond in %d seconds, the previous settings will be restored." % timeleft))
timerdata['timer'] += 1
if timeleft < 0:
self._revert()
return False
else: return True
a = MainWindow()
gtk.main()