Close LP #238518. We now support profiles with spaces in their name. Additionally this fixes some use_custom_command related bugs.

This commit is contained in:
Chris Jones 2008-06-15 11:15:45 +01:00
parent 68870905f8
commit e35709e5e0
2 changed files with 41 additions and 7 deletions

View File

@ -366,18 +366,29 @@ text/plain
args = self.command args = self.command
shell = self.command[0] shell = self.command[0]
elif self.conf.use_custom_command: elif self.conf.use_custom_command:
dbg ('spawn_child: using custom command: %s'%self.conf.custom_commanD) dbg ('spawn_child: using custom command: %s'%self.conf.custom_command)
args = self.conf.custom_command.split () args = self.conf.custom_command.split ()
shell = args[0] shell = args[0]
try: try:
if os.environ['PATH'] == "":
raise (ValueError)
paths = os.environ['PATH'].split(':') paths = os.environ['PATH'].split(':')
except: except:
paths = ['/usr/local', '/usr', '/'] paths = ['/usr/local/bin', '/usr/bin', '/bin']
dbg ('spawn_child: found paths: "%s"'%paths)
if self.conf.use_custom_command and shell[0] != '/':
for path in paths:
print ('spawn_child: looking for "%s"'%os.path.join (path, shell))
if os.path.exists (os.path.join (path, shell)):
shell = os.path.join (path, shell)
break
if not self.command and not os.path.exists (shell): if not self.command and not os.path.exists (shell):
dbg ('spawn_child: hunting for a command') dbg ('spawn_child: hunting for a command')
shell = os.getenv ('SHELL') or '' shell = os.getenv ('SHELL') or ''
args = []
if not os.path.exists (shell): if not os.path.exists (shell):
shell = pwd.getpwuid (os.getuid ())[6] or '' shell = pwd.getpwuid (os.getuid ())[6] or ''
if not os.path.exists (shell): if not os.path.exists (shell):
@ -916,10 +927,12 @@ class Terminator:
try: try:
import gconf import gconf
store = config.TerminatorConfValuestoreGConf () if self.profile:
self.profile = gconf.escape_key (self.profile, -1)
store = config.TerminatorConfValuestoreGConf (self.profile)
store.set_reconfigure_callback (self.reconfigure_vtes) store.set_reconfigure_callback (self.reconfigure_vtes)
dbg ('Terminator__init__: comparing %s and %s'%(profile, store.profile.split ('/').pop ())) dbg ('Terminator__init__: comparing %s and %s'%(self.profile, store.profile.split ('/').pop ()))
if profile == store.profile.split ('/').pop (): if self.profile == store.profile.split ('/').pop ():
# If we have been given a profile, and we loaded it, we should be higher priority than RC # If we have been given a profile, and we loaded it, we should be higher priority than RC
dbg ('Terminator__init__: placing GConf before RC') dbg ('Terminator__init__: placing GConf before RC')
stores.insert (0, store) stores.insert (0, store)
@ -1675,6 +1688,23 @@ if __name__ == '__main__':
del (parser.rargs[0]) del (parser.rargs[0])
setattr(parser.values, option.dest, value) setattr(parser.values, option.dest, value)
def profile_cb (option, opt, value, parser):
assert value is None
value = ''
while parser.rargs:
arg = parser.rargs[0]
print 'profile_cb: %s (%s)'%(arg, arg[0])
if arg[0] != '-':
print 'profile_cb: Adding argument'
if len (value) > 0:
value = '%s %s'%(value, arg)
else:
value = '%s'%arg
del (parser.rargs[0])
else:
break
setattr (parser.values, option.dest, value)
usage = "usage: %prog [options]" usage = "usage: %prog [options]"
parser = OptionParser (usage) parser = OptionParser (usage)
parser.add_option ("-v", "--version", action="store_true", dest="version", help="Display program version") parser.add_option ("-v", "--version", action="store_true", dest="version", help="Display program version")
@ -1682,7 +1712,7 @@ if __name__ == '__main__':
parser.add_option ("-m", "--maximise", action="store_true", dest="maximise", help="Open the %s window maximised"%APP_NAME.capitalize()) parser.add_option ("-m", "--maximise", action="store_true", dest="maximise", help="Open the %s window maximised"%APP_NAME.capitalize())
parser.add_option ("-f", "--fullscreen", action="store_true", dest="fullscreen", help="Set the window into fullscreen mode") parser.add_option ("-f", "--fullscreen", action="store_true", dest="fullscreen", help="Set the window into fullscreen mode")
parser.add_option ("-b", "--borderless", action="store_true", dest="borderless", help="Turn off the window's borders") parser.add_option ("-b", "--borderless", action="store_true", dest="borderless", help="Turn off the window's borders")
parser.add_option ("-p", "--profile", dest="profile", help="Specify a GNOME Terminal profile to emulate") parser.add_option ("-p", "--profile", dest="profile", action="callback", callback=profile_cb, help="Specify a GNOME Terminal profile to emulate")
parser.add_option ("-e", "--command", dest="command", help="Execute the argument to this option inside the terminal") parser.add_option ("-e", "--command", dest="command", help="Execute the argument to this option inside the terminal")
parser.add_option ("-x", "--execute", dest="execute", action="callback", callback=execute_cb, help="Execute the remainder of the command line inside the terminal") parser.add_option ("-x", "--execute", dest="execute", action="callback", callback=execute_cb, help="Execute the remainder of the command line inside the terminal")
@ -1705,6 +1735,7 @@ if __name__ == '__main__':
"Make sure DISPLAY is properly set") "Make sure DISPLAY is properly set")
sys.exit(1) sys.exit(1)
print 'profile_cb: settled on profile: "%s"'%options.profile
term = Terminator (options.profile, command, options.fullscreen, options.maximise, options.borderless) term = Terminator (options.profile, command, options.fullscreen, options.maximise, options.borderless)
gtk.main () gtk.main ()

View File

@ -208,9 +208,12 @@ class TerminatorConfValuestoreGConf (TerminatorConfValuestore):
self._gt_dir = self.defaults['gt_dir'] self._gt_dir = self.defaults['gt_dir']
self._profile_dir = self.defaults['profile_dir'] self._profile_dir = self.defaults['profile_dir']
dbg ('VSGConf: Profile requested is: "%s"'%profile)
if not profile: if not profile:
profile = self.client.get_string (self._gt_dir + '/global/default_profile') profile = self.client.get_string (self._gt_dir + '/global/default_profile')
dbg ('VSGConf: Profile bet on is: "%s"'%profile)
profiles = self.client.get_list (self._gt_dir + '/global/profile_list','string') profiles = self.client.get_list (self._gt_dir + '/global/profile_list','string')
dbg ('VSGConf: Found profiles: "%s"'%profiles)
#set up the active encoding list #set up the active encoding list
self.active_encodings = self.client.get_list (self._gt_dir + '/global/active_encodings', 'string') self.active_encodings = self.client.get_list (self._gt_dir + '/global/active_encodings', 'string')
@ -225,7 +228,7 @@ class TerminatorConfValuestoreGConf (TerminatorConfValuestore):
else: else:
# We're a bit stuck, there is no profile in the list # We're a bit stuck, there is no profile in the list
# FIXME: Find a better way to handle this than setting a non-profile # FIXME: Find a better way to handle this than setting a non-profile
dbg ("No profile found, deleting __getattr__") dbg ("VSGConf: No profile found, deleting __getattr__")
del (self.__getattr__) del (self.__getattr__)
self.client.add_dir (self.profile, gconf.CLIENT_PRELOAD_RECURSIVE) self.client.add_dir (self.profile, gconf.CLIENT_PRELOAD_RECURSIVE)