From ba48602aa9bf137c778078fa7fcaff4a2f2ad7f4 Mon Sep 17 00:00:00 2001 From: imdano <> Date: Tue, 17 Jul 2007 07:19:10 +0000 Subject: [PATCH] fixed a screw up in my indentation in edgy.py, changed tabs to 4 spaces everywhere it wasn't already --- autoconnect.py | 4 +- dapper.py | 26 ++--- edgy.py | 281 ++++++++++++++++++++++++------------------------- misc.py | 220 +++++++++++++++++++------------------- tray.py | 6 +- 5 files changed, 267 insertions(+), 270 deletions(-) diff --git a/autoconnect.py b/autoconnect.py index 58529a2..89143a4 100644 --- a/autoconnect.py +++ b/autoconnect.py @@ -4,7 +4,7 @@ import gobject import dbus import dbus.service if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): - import dbus.glib + import dbus.glib ############# #declare our connections to our daemon. @@ -21,4 +21,4 @@ wired = dbus.Interface(proxy_obj, 'org.wicd.daemon.wired') print daemon.Hello() if wireless.CheckIfWirelessConnecting() == False and wired.CheckIfWiredConnecting() == False: - print wireless.AutoConnect(True) + print wireless.AutoConnect(True) diff --git a/dapper.py b/dapper.py index ec25ddc..5c7c57d 100644 --- a/dapper.py +++ b/dapper.py @@ -5,30 +5,30 @@ ## but that is not the preferred method import os,sys if __name__ == '__main__': - os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) import gtk import egg.trayicon import gobject, dbus, dbus.service if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): - import dbus.glib + import dbus.glib ############# #declare the connections to our daemon. #without them nothing useful will happen #the daemon should be running as root bus = dbus.SystemBus() try: - print 'attempting to connect daemon...' - proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') - print 'success' + print 'attempting to connect daemon...' + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + print 'success' except: - print 'daemon not running, running gksudo ./daemon.py...' - import misc,time - misc.PromptToStartDaemon() - time.sleep(1) - try: - proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') - except: - print 'daemon still not running, aborting.' + print 'daemon not running, running gksudo ./daemon.py...' + import misc,time + misc.PromptToStartDaemon() + time.sleep(1) + try: + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + except: + print 'daemon still not running, aborting.' #daemon = dbus.Interface(proxy_obj, 'org.wicd.daemon') wireless = dbus.Interface(proxy_obj, 'org.wicd.daemon.wireless') wired = dbus.Interface(proxy_obj, 'org.wicd.daemon.wired') diff --git a/edgy.py b/edgy.py index 7bc44bc..1d5afb1 100755 --- a/edgy.py +++ b/edgy.py @@ -16,10 +16,10 @@ ######## import os,sys if __name__ == '__main__': - os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) import gtk, gobject, dbus, dbus.service, os, sys, locale, gettext, signal, time if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): - import dbus.glib + import dbus.glib ############# #declare the connections to our daemon. @@ -28,18 +28,18 @@ if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): #some connections aren't used so they are commented bus = dbus.SystemBus() try: - print 'attempting to connect daemon...' - proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') - print 'success' + print 'attempting to connect daemon...' + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + print 'success' except: - print 'daemon not running, running gksudo ./daemon.py...' - import misc - misc.PromptToStartDaemon() - time.sleep(5) - try: - proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') - except: - print 'daemon still not running, aborting.' + print 'daemon not running, running gksudo ./daemon.py...' + import misc + misc.PromptToStartDaemon() + time.sleep(5) + try: + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + except: + print 'daemon still not running, aborting.' daemon = dbus.Interface(proxy_obj, 'org.wicd.daemon') # Had to uncomment it wireless = dbus.Interface(proxy_obj, 'org.wicd.daemon.wireless') wired = dbus.Interface(proxy_obj, 'org.wicd.daemon.wired') @@ -50,10 +50,10 @@ local_path = os.path.realpath(os.path.dirname(sys.argv[0])) + '/translations' langs = [] lc, encoding = locale.getdefaultlocale() if (lc): - langs = [lc] + langs = [lc] osLanguage = os.environ.get('LANGUAGE', None) if (osLanguage): - langs += osLanguage.split(":") + langs += osLanguage.split(":") langs += ["en_US"] lang = gettext.translation('wicd', local_path, languages=langs, fallback = True) _ = lang.gettext @@ -68,146 +68,143 @@ pic=None lastWinId = 0 def open_wicd_gui(): - global lastWinId - ret = 0 - if lastWinId != 0: - os.kill(lastWinId,signal.SIGQUIT) - ret = os.waitpid(lastWinId,0)[1] - lastWinId = 0 - if ret == 0: - lastWinId = os.spawnlpe(os.P_NOWAIT, './gui.py', os.environ) + global lastWinId + ret = 0 + if lastWinId != 0: + os.kill(lastWinId,signal.SIGQUIT) + ret = os.waitpid(lastWinId,0)[1] + lastWinId = 0 + if ret == 0: + lastWinId = os.spawnlpe(os.P_NOWAIT, './gui.py', os.environ) def set_signal_image(): - global LastStrength - global stillWired #keeps us from resetting the wired info over and over - global network #declared as global so it gets initialized before initial use + global LastStrength + global stillWired #keeps us from resetting the wired info over and over + global network #declared as global so it gets initialized before initial use - # Disable logging if debugging isn't on to prevent log spam - if not daemon.GetDebugMode(): - config.DisableLogging() - - wired_ip = wired.GetWiredIP() - if wired.CheckPluggedIn() == True and wired_ip: - if stillWired == False: # Only set image/tooltip if it hasn't been set already - tr.set_from_file("images/wired.png") - tr.set_tooltip(language['connected_to_wired'].replace('$A',wired_ip)) - stillWired = True - lock = '' - else: - stillWired = False - - wireless_ip = wireless.GetWirelessIP() - #If ip returns as None, we are probably returning from hibernation and need to force signal to 0 to avoid crashing - if wireless_ip != None: - signal = int(wireless.GetCurrentSignalStrength()) - else: - signal = 0 - - #only update if the signal strength has changed because doing I/O calls is expensive, - #and the icon flickers - if (signal != LastStrength or network != wireless.GetCurrentNetwork()) and wireless_ip != None: - LastStrength = signal - lock = '' #set the string to '' so that when it is put in "high-signal" + lock + ".png", there will be nothing - curNetID = wireless.GetCurrentNetworkID() #the network ID needs to be checked because a negative value here will break the tray - if signal > 0 and curNetID > -1 and wireless.GetWirelessProperty(curNetID,"encryption"): - lock = '-lock' #set the string to '-lock' so that it will display the lock picture - network = str(wireless.GetCurrentNetwork()) - tr.set_tooltip(language['connected_to_wireless'].replace('$A',network).replace('$B',str(signal)).replace('$C',str(wireless_ip))) - if signal > 75: - tr.set_from_file("images/high-signal" + lock + ".png") - elif signal > 50: - tr.set_from_file("images/good-signal" + lock + ".png") - elif signal > 25: - tr.set_from_file("images/low-signal" + lock + ".png") - elif signal > 0: - tr.set_from_file("images/bad-signal" + lock + ".png") - elif signal == 0: - tr.set_from_file("images/no-signal.png") - elif wireless_ip == None: - tr.set_from_file("images/no-signal.png") - tr.set_tooltip(language['not_connected']) - #Auto-reconnect code - not sure how well this works. I know that without the ForcedDisconnect check it reconnects you when - #a disconnect is forced. People who have disconnection problems need to test it to determine if it actually works. - #First it will attempt to reconnect to the last known wireless network, and if that fails it should run a scan and try to - #connect to any network set to autoconnect. It will continuously rescan until a network is found or the user manually reconnects - #This behavior could prove to be annoying, so we'll keep it in the experimental build for now - if wireless.GetAutoReconnect() == True and wireless.CheckIfWirelessConnecting() == False and wireless.GetForcedDisconnect() == False: - curNetID = wireless.GetCurrentNetworkID() - if curNetID > -1: #value of -1 is typically caused by hibernation and breaks the tray if passed to daemon - wireless.ConnectWireless(wireless.GetCurrentNetworkID()) - if wireless.GetCurrentSignalStrength() != 0: - print "Successfully autoreconnected." - else: - print "Couldn't reconnect to last used network, scanning for an autoconnect network..." - print wireless.AutoConnect(True) - else: - print "Scanning for an autoconnect network..." - print wireless.AutoConnect(True) + # Disable logging if debugging isn't on to prevent log spam + if not daemon.GetDebugMode(): + config.DisableLogging() + + wired_ip = wired.GetWiredIP() + if wired.CheckPluggedIn() == True and wired_ip: + if stillWired == False: # Only set image/tooltip if it hasn't been set already + tr.set_from_file("images/wired.png") + tr.set_tooltip(language['connected_to_wired'].replace('$A',wired_ip)) + stillWired = True + lock = '' + else: + stillWired = False + wireless_ip = wireless.GetWirelessIP() + #If ip returns as None, we are probably returning from hibernation and need to force signal to 0 to avoid crashing + if wireless_ip != None: + signal = int(wireless.GetCurrentSignalStrength()) + else: + signal = 0 + + #only update if the signal strength has changed because doing I/O calls is expensive, + #and the icon flickers + if (signal != LastStrength or network != wireless.GetCurrentNetwork()) and wireless_ip != None: + LastStrength = signal + lock = '' #set the string to '' so that when it is put in "high-signal" + lock + ".png", there will be nothing + curNetID = wireless.GetCurrentNetworkID() #the network ID needs to be checked because a negative value here will break the tray + if signal > 0 and curNetID > -1 and wireless.GetWirelessProperty(curNetID,"encryption"): + lock = '-lock' #set the string to '-lock' so that it will display the lock picture + network = str(wireless.GetCurrentNetwork()) + tr.set_tooltip(language['connected_to_wireless'].replace('$A',network).replace('$B',str(signal)).replace('$C',str(wireless_ip))) + if signal > 75: + tr.set_from_file("images/high-signal" + lock + ".png") + elif signal > 50: + tr.set_from_file("images/good-signal" + lock + ".png") + elif signal > 25: + tr.set_from_file("images/low-signal" + lock + ".png") + elif signal > 0: + tr.set_from_file("images/bad-signal" + lock + ".png") + elif signal == 0: + tr.set_from_file("images/no-signal.png") + #Auto-reconnect code - not sure how well this works. I know that without the ForcedDisconnect check it reconnects you when + #a disconnect is forced. People who have disconnection problems need to test it to determine if it actually works. + #First it will attempt to reconnect to the last known wireless network, and if that fails it should run a scan and try to + #connect to any network set to autoconnect. It will continuously rescan until a network is found or the user manually reconnects + #This behavior could prove to be annoying, so we'll keep it in the experimental build for now + if wireless.GetAutoReconnect() == True and wireless.CheckIfWirelessConnecting() == False and wireless.GetForcedDisconnect() == False: + curNetID = wireless.GetCurrentNetworkID() + if curNetID > -1: #value of -1 is typically caused by hibernation and breaks the tray if passed to daemon + wireless.ConnectWireless(wireless.GetCurrentNetworkID()) + if wireless.GetCurrentSignalStrength() != 0: + print "Successfully autoreconnected." + else: + print "Couldn't reconnect to last used network, scanning for an autoconnect network..." + print wireless.AutoConnect(True) + + elif wireless_ip == None: + tr.set_from_file("images/no-signal.png") + tr.set_tooltip(language['not_connected']) - if not daemon.GetDebugMode(): - config.EnableLogging() + if not daemon.GetDebugMode(): + config.EnableLogging() - return True + return True class TrackerStatusIcon(gtk.StatusIcon): - def __init__(self): - gtk.StatusIcon.__init__(self) - menu = ''' - - - - - - - - - - - ''' - actions = [ - ('Menu', None, 'Menu'), - ('Connect', gtk.STOCK_CONNECT, '_Connect...', None, 'Connect to network', self.on_preferences), - ('About', gtk.STOCK_ABOUT, '_About...', None, 'About wicd-tray-icon', self.on_about), - ('Quit',gtk.STOCK_QUIT,'_Quit',None,'Quit wicd-tray-icon', self.on_quit), - - ] - ag = gtk.ActionGroup('Actions') - ag.add_actions(actions) - self.manager = gtk.UIManager() - self.manager.insert_action_group(ag, 0) - self.manager.add_ui_from_string(menu) - self.menu = self.manager.get_widget('/Menubar/Menu/About').props.parent - self.current_icon_path = '' - self.set_from_file("images/no-signal.png") - self.set_visible(True) - self.connect('activate', self.on_activate) - self.connect('popup-menu', self.on_popup_menu) + def __init__(self): + gtk.StatusIcon.__init__(self) + menu = ''' + + + + + + + + + + + ''' + actions = [ + ('Menu', None, 'Menu'), + ('Connect', gtk.STOCK_CONNECT, '_Connect...', None, 'Connect to network', self.on_preferences), + ('About', gtk.STOCK_ABOUT, '_About...', None, 'About wicd-tray-icon', self.on_about), + ('Quit',gtk.STOCK_QUIT,'_Quit',None,'Quit wicd-tray-icon', self.on_quit), + + ] + ag = gtk.ActionGroup('Actions') + ag.add_actions(actions) + self.manager = gtk.UIManager() + self.manager.insert_action_group(ag, 0) + self.manager.add_ui_from_string(menu) + self.menu = self.manager.get_widget('/Menubar/Menu/About').props.parent + self.current_icon_path = '' + self.set_from_file("images/no-signal.png") + self.set_visible(True) + self.connect('activate', self.on_activate) + self.connect('popup-menu', self.on_popup_menu) - def on_activate(self, data): - open_wicd_gui() + def on_activate(self, data): + open_wicd_gui() - def on_quit(self,widget): - sys.exit() + def on_quit(self,widget): + sys.exit() - def on_popup_menu(self, status, button, time): - self.menu.popup(None, None, None, button, time) + def on_popup_menu(self, status, button, time): + self.menu.popup(None, None, None, button, time) - def on_preferences(self, data): - open_wicd_gui() + def on_preferences(self, data): + open_wicd_gui() - def on_about(self, data): - dialog = gtk.AboutDialog() - dialog.set_name('wicd tray icon') - dialog.set_version('0.2') - dialog.set_comments('an icon that shows your network connectivity') - dialog.set_website('http://wicd.sourceforge.net') - dialog.run() - dialog.destroy() + def on_about(self, data): + dialog = gtk.AboutDialog() + dialog.set_name('wicd tray icon') + dialog.set_version('0.2') + dialog.set_comments('an icon that shows your network connectivity') + dialog.set_website('http://wicd.sourceforge.net') + dialog.run() + dialog.destroy() - def set_from_file(self,path): - if path != self.current_icon_path: - self.current_icon_path = path - gtk.StatusIcon.set_from_file(self,path) + def set_from_file(self,path): + if path != self.current_icon_path: + self.current_icon_path = path + gtk.StatusIcon.set_from_file(self,path) LastStrength = -2 stillWired = False diff --git a/misc.py b/misc.py index 675e44c..fbcb624 100644 --- a/misc.py +++ b/misc.py @@ -2,138 +2,138 @@ #pretty much useless to anyone else... #but if it is useful, feel free to use under the terms of the GPL # -# This is released under the -# GNU General Public License -# The terms can be found at -# http://www.gnu.org/copyleft/gpl.html +# This is released under the +# GNU General Public License +# The terms can be found at +# http://www.gnu.org/copyleft/gpl.html # -# Copyright (C) 2007 Adam Blackburn +# Copyright (C) 2007 Adam Blackburn # import os,sys if __name__ == '__main__': - os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) import re def Run(cmd,include_std_error=False): - if not include_std_error: - f = os.popen( cmd , "r") - return f.read() - else: - input,out_err = os.popen4( cmd, 'r') - return out_err.read() + if not include_std_error: + f = os.popen( cmd , "r") + return f.read() + else: + input,out_err = os.popen4( cmd, 'r') + return out_err.read() def IsValidIP(ip): - if ip != None: #make sure there is an IP - if ip.count('.') == 3: #make sure the IP can be parsed (or at least it has the proper dots) - ipNumbers = ip.split('.') #split it up - if not '' in ipNumbers: #make sure the IP isn't something like 127..0.1 - return ipNumbers - return False + if ip != None: #make sure there is an IP + if ip.count('.') == 3: #make sure the IP can be parsed (or at least it has the proper dots) + ipNumbers = ip.split('.') #split it up + if not '' in ipNumbers: #make sure the IP isn't something like 127..0.1 + return ipNumbers + return False def PromptToStartDaemon(): - gksudo_args = ['gksudo', '--message', 'Wicd needs to access your computer\'s network cards.','--','./daemon.py'] - os.spawnvpe(os.P_NOWAIT, 'gksudo', gksudo_args, os.environ) + gksudo_args = ['gksudo', '--message', 'Wicd needs to access your computer\'s network cards.','--','./daemon.py'] + os.spawnvpe(os.P_NOWAIT, 'gksudo', gksudo_args, os.environ) def RunRegex(regex,string): - m = regex.search( string ) - if m: - return m.groups()[0] - else: - return None + m = regex.search( string ) + if m: + return m.groups()[0] + else: + return None def WriteLine(file,text): - file.write(text + "\n") + file.write(text + "\n") def ReadFile(filename): - if not os.path.exists(filename): - return None - file = open(filename,'r') - data = file.read().strip() - file.close() - return str(data) + if not os.path.exists(filename): + return None + file = open(filename,'r') + data = file.read().strip() + file.close() + return str(data) def Noneify(variable): - #set string Nones to real Nones - if variable == "None" or variable == "": - return None - if variable == "True": # or variable == "1": # or variable == 1: - return True - if variable == "False": #or variable == "0": # or variable == 0: - return False - #if str(variable).isdigit() == True: - # return int(variable) - if str(variable) == "1": - return True - if str(variable) == "0": - return False - #otherwise... - return variable + #set string Nones to real Nones + if variable == "None" or variable == "": + return None + if variable == "True": # or variable == "1": # or variable == 1: + return True + if variable == "False": #or variable == "0": # or variable == 0: + return False + #if str(variable).isdigit() == True: + # return int(variable) + if str(variable) == "1": + return True + if str(variable) == "0": + return False + #otherwise... + return variable def ParseEncryption(network): - #list = open("encryption/templates/active","r") - #types = list.readlines() - #for i in types: - enctemplate = open("encryption/templates/" + network["enctype"]) - template = enctemplate.readlines() - #set these to nothing so that we can hold them outside the loop - z = "ap_scan=1\n" - y = 0 - #loop through the lines in the template, selecting ones to use - for x in template: - x = x.strip("\n") - if y>4: - #blah blah replace stuff - x = x.replace("$_SCAN","0") - for t in network: - if Noneify(network[t]) != None: #don't bother if z's value is None cause it will cause errors - x = x.replace("$_" + str(t).upper(),str(network[t])) - z = z + "\n" + x - y+=1 - #write the data to the files - #then chmod them so they can't be read by evil little munchkins - fileness = open("encryption/configurations/" + network["bssid"].replace(":","").lower(),"w") - os.chmod("encryption/configurations/" + network["bssid"].replace(":","").lower(),0600) - os.chown("encryption/configurations/" + network["bssid"].replace(":","").lower(), 0, 0) - #we could do this above, but we'd like to permod (permission mod) them before we write, so that it can't be read - fileness.write(z) - fileness.close() + #list = open("encryption/templates/active","r") + #types = list.readlines() + #for i in types: + enctemplate = open("encryption/templates/" + network["enctype"]) + template = enctemplate.readlines() + #set these to nothing so that we can hold them outside the loop + z = "ap_scan=1\n" + y = 0 + #loop through the lines in the template, selecting ones to use + for x in template: + x = x.strip("\n") + if y>4: + #blah blah replace stuff + x = x.replace("$_SCAN","0") + for t in network: + if Noneify(network[t]) != None: #don't bother if z's value is None cause it will cause errors + x = x.replace("$_" + str(t).upper(),str(network[t])) + z = z + "\n" + x + y+=1 + #write the data to the files + #then chmod them so they can't be read by evil little munchkins + fileness = open("encryption/configurations/" + network["bssid"].replace(":","").lower(),"w") + os.chmod("encryption/configurations/" + network["bssid"].replace(":","").lower(),0600) + os.chown("encryption/configurations/" + network["bssid"].replace(":","").lower(), 0, 0) + #we could do this above, but we'd like to permod (permission mod) them before we write, so that it can't be read + fileness.write(z) + fileness.close() def LoadEncryptionMethods(): - encryptionTypes = {} - types = open("encryption/templates/active","r") - enctypes = types.readlines() - for x in enctypes: - #skip some lines, we don't care who the author is/was, etc - #we don't care about version either - x = x.strip("\n") - current = open("encryption/templates/" + x,"r") - line = current.readlines() - typeID = len(encryptionTypes) #this is so we know where in the array to add data - encryptionTypes[typeID] = {} - encryptionTypes[typeID][0] = line[0][7:].strip("\n") - encryptionTypes[typeID][1] = x - encryptionTypes[typeID][2] = {} - requiredFields = line[3][8:] - requiredFields = requiredFields.strip("\n") - requiredFields = requiredFields.split(" ") - index = -1 - for current in requiredFields: - #the pretty names will start with an * so we can - #seperate them with that - if current[0] == "*": - #make underscores spaces - #and remove the * - encryptionTypes[typeID][2][index][0] = current.replace("_"," ").lstrip("*") - else: - #add to the list of things that are required - index = len(encryptionTypes[typeID][2]) - encryptionTypes[typeID][2][index] = {} - encryptionTypes[typeID][2][index][1] = current - return encryptionTypes + encryptionTypes = {} + types = open("encryption/templates/active","r") + enctypes = types.readlines() + for x in enctypes: + #skip some lines, we don't care who the author is/was, etc + #we don't care about version either + x = x.strip("\n") + current = open("encryption/templates/" + x,"r") + line = current.readlines() + typeID = len(encryptionTypes) #this is so we know where in the array to add data + encryptionTypes[typeID] = {} + encryptionTypes[typeID][0] = line[0][7:].strip("\n") + encryptionTypes[typeID][1] = x + encryptionTypes[typeID][2] = {} + requiredFields = line[3][8:] + requiredFields = requiredFields.strip("\n") + requiredFields = requiredFields.split(" ") + index = -1 + for current in requiredFields: + #the pretty names will start with an * so we can + #seperate them with that + if current[0] == "*": + #make underscores spaces + #and remove the * + encryptionTypes[typeID][2][index][0] = current.replace("_"," ").lstrip("*") + else: + #add to the list of things that are required + index = len(encryptionTypes[typeID][2]) + encryptionTypes[typeID][2][index] = {} + encryptionTypes[typeID][2][index][1] = current + return encryptionTypes def noneToString(text): - '''used for putting text in a text box if the value to put in is 'None' the box will be blank''' - if text == None or text == "None" or text == "": - return "None" - else: - return str(text) + '''used for putting text in a text box if the value to put in is 'None' the box will be blank''' + if text == None or text == "None" or text == "": + return "None" + else: + return str(text) diff --git a/tray.py b/tray.py index f9385c5..e060956 100644 --- a/tray.py +++ b/tray.py @@ -1,9 +1,9 @@ #!/usr/bin/python import os,sys if __name__ == '__main__': - os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) import gtk if gtk.gtk_version[0] >= 2 and gtk.gtk_version[1] >= 10: - import edgy + import edgy else: - import dapper + import dapper