| OLD | NEW |
| (Empty) |
| 1 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
| 2 # See LICENSE for details. | |
| 3 | |
| 4 | |
| 5 """Start a L{twisted.manhole} client. | |
| 6 | |
| 7 @var toolkitPreference: A list of all toolkits we have front-ends for, with | |
| 8 the ones we most prefer to use listed first. | |
| 9 @type toolkitPreference: list of strings | |
| 10 """ | |
| 11 | |
| 12 import sys | |
| 13 | |
| 14 from twisted.python import usage | |
| 15 | |
| 16 # Prefer gtk2 because it is the way of the future! | |
| 17 toolkitPreference = ('gtk2', 'gtk1') | |
| 18 | |
| 19 class NoToolkitError(usage.UsageError): | |
| 20 wantToolkits = toolkitPreference | |
| 21 def __str__(self): | |
| 22 return ( | |
| 23 "I couldn't find any of these toolkits installed, and I need " | |
| 24 "one of them to run: %s" % (', '.join(self.wantToolkits),)) | |
| 25 | |
| 26 def bestToolkit(): | |
| 27 """The most-preferred available toolkit. | |
| 28 | |
| 29 @returntype: string | |
| 30 """ | |
| 31 avail = getAvailableToolkits() | |
| 32 for v in toolkitPreference: | |
| 33 if v in avail: | |
| 34 return v | |
| 35 else: | |
| 36 raise NoToolkitError | |
| 37 | |
| 38 _availableToolkits = None | |
| 39 def getAvailableToolkits(): | |
| 40 """Autodetect available toolkits. | |
| 41 | |
| 42 @returns: A list of usable toolkits. | |
| 43 @returntype: list of strings | |
| 44 """ | |
| 45 global _availableToolkits | |
| 46 # use cached result | |
| 47 if _availableToolkits is not None: | |
| 48 return _availableToolkits | |
| 49 | |
| 50 avail = [] | |
| 51 | |
| 52 # Recent GTK. | |
| 53 try: | |
| 54 import pygtk | |
| 55 except: | |
| 56 pass | |
| 57 else: | |
| 58 gtkvers = pygtk._get_available_versions().keys() | |
| 59 for v in gtkvers: | |
| 60 frontend = {'1.2': 'gtk1', | |
| 61 '2.0': 'gtk2'}.get(v) | |
| 62 if frontend is not None: | |
| 63 avail.append(frontend) | |
| 64 | |
| 65 if not avail: | |
| 66 # Older GTK | |
| 67 try: | |
| 68 # WARNING: It's entirely possible that this does something crappy, | |
| 69 # such as running gtk_init, which may have undesirable side | |
| 70 # effects if that's not the toolkit we end up using. | |
| 71 import gtk | |
| 72 except: | |
| 73 pass | |
| 74 else: | |
| 75 avail.append('gtk1') | |
| 76 | |
| 77 # There may be some "middle gtk" that got left out -- that is, a | |
| 78 # version of pygtk 1.99.x that happened before the pygtk module | |
| 79 # with its _get_available_versions was introduced. Chances are | |
| 80 # that the gtk2 front-end wouldn't work with it anyway, but it may | |
| 81 # get mis-identified it as gtk1. :( | |
| 82 | |
| 83 _availableToolkits = avail | |
| 84 return avail | |
| 85 | |
| 86 | |
| 87 def run(): | |
| 88 config = MyOptions() | |
| 89 try: | |
| 90 config.parseOptions() | |
| 91 except usage.UsageError, e: | |
| 92 print str(e) | |
| 93 print str(config) | |
| 94 sys.exit(1) | |
| 95 | |
| 96 try: | |
| 97 run = getattr(sys.modules[__name__], 'run_' + config.opts['toolkit']) | |
| 98 except AttributeError: | |
| 99 print "Sorry, no support for toolkit %r." % (config.opts['toolkit'],) | |
| 100 sys.exit(1) | |
| 101 | |
| 102 run(config) | |
| 103 | |
| 104 from twisted.internet import reactor | |
| 105 reactor.run() | |
| 106 | |
| 107 def run_gtk1(config): | |
| 108 # Put these off until after we parse options, so we know what reactor | |
| 109 # to install. | |
| 110 from twisted.internet import gtkreactor | |
| 111 gtkreactor.install() | |
| 112 from twisted.spread.ui import gtkutil | |
| 113 | |
| 114 # Put this off until after we parse options, or else gnome eats them. | |
| 115 # (http://www.daa.com.au/pipermail/pygtk/2002-December/004051.html) | |
| 116 sys.argv[:] = ['manhole'] | |
| 117 from twisted.manhole.ui import gtkmanhole | |
| 118 | |
| 119 i = gtkmanhole.Interaction() | |
| 120 lw = gtkutil.Login(i.connected, | |
| 121 i.client, | |
| 122 initialUser=config.opts['user'], | |
| 123 initialPassword=config.opts['password'], | |
| 124 initialService=config.opts['service'], | |
| 125 initialHostname=config.opts['host'], | |
| 126 initialPortno=config.opts['port'], | |
| 127 initialPerspective=config.opts['perspective']) | |
| 128 | |
| 129 i.loginWindow = lw | |
| 130 | |
| 131 lw.show_all() | |
| 132 | |
| 133 | |
| 134 def run_gtk2(config): | |
| 135 # Put these off until after we parse options, so we know what reactor | |
| 136 # to load. | |
| 137 from twisted.internet import gtk2reactor | |
| 138 gtk2reactor.install() | |
| 139 from twisted.spread.ui import gtk2util | |
| 140 | |
| 141 # Put this off until after we parse options, or else gnome eats them. | |
| 142 sys.argv[:] = ['manhole'] | |
| 143 from twisted.manhole.ui import gtk2manhole | |
| 144 | |
| 145 o = config.opts | |
| 146 defaults = { | |
| 147 'host': o['host'], | |
| 148 'port': o['port'], | |
| 149 'identityName': o['user'], | |
| 150 'password': o['password'], | |
| 151 'serviceName': o['service'], | |
| 152 'perspectiveName': o['perspective'] | |
| 153 } | |
| 154 w = gtk2manhole.ManholeWindow() | |
| 155 w.setDefaults(defaults) | |
| 156 w.login() | |
| 157 | |
| 158 | |
| 159 # from twisted.spread import pb | |
| 160 # can't do that, it installs a reactor. grr. | |
| 161 pbportno = 8787 | |
| 162 | |
| 163 class MyOptions(usage.Options): | |
| 164 optParameters=[("user", "u", "guest", "username"), | |
| 165 ("password", "w", "guest"), | |
| 166 ("service", "s", "twisted.manhole", "PB Service"), | |
| 167 ("host", "h", "localhost"), | |
| 168 ("port", "p", str(pbportno)), | |
| 169 ("perspective", "P", "", | |
| 170 "PB Perspective to ask for " | |
| 171 "(if different than username)"), | |
| 172 ("toolkit", "t", bestToolkit(), | |
| 173 "Front-end to use; one of %s" | |
| 174 % (' '.join(getAvailableToolkits()),)), | |
| 175 ] | |
| 176 | |
| 177 #zsh_altArgDescr = {"foo":"use this description for foo instead"} | |
| 178 #zsh_multiUse = ["foo", "bar"] | |
| 179 #zsh_mutuallyExclusive = [("foo", "bar"), ("bar", "baz")] | |
| 180 zsh_actions = {"host":"_hosts", | |
| 181 "toolkit":"(gtk1 gtk2)"} | |
| 182 #zsh_actionDescr = {"logfile":"log file name", "random":"random seed"} | |
| 183 | |
| 184 if __name__ == '__main__': | |
| 185 run() | |
| OLD | NEW |