1
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
"""Start a L{twisted.manhole} client.
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
14
from twisted.python import usage
16
# Prefer gtk2 because it is the way of the future!
17
toolkitPreference = ('gtk2', 'gtk1')
19
class NoToolkitError(usage.UsageError):
20
wantToolkits = toolkitPreference
23
"I couldn't find any of these toolkits installed, and I need "
24
"one of them to run: %s" % (', '.join(self.wantToolkits),))
27
"""The most-preferred available toolkit.
31
avail = getAvailableToolkits()
32
for v in toolkitPreference:
38
_availableToolkits = None
39
def getAvailableToolkits():
40
"""Autodetect available toolkits.
42
@returns: A list of usable toolkits.
43
@returntype: list of strings
45
global _availableToolkits
47
if _availableToolkits is not None:
48
return _availableToolkits
58
gtkvers = pygtk._get_available_versions().keys()
60
frontend = {'1.2': 'gtk1',
62
if frontend is not None:
63
avail.append(frontend)
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.
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. :(
83
_availableToolkits = avail
91
except usage.UsageError, e:
97
run = getattr(sys.modules[__name__], 'run_' + config.opts['toolkit'])
98
except AttributeError:
99
print "Sorry, no support for toolkit %r." % (config.opts['toolkit'],)
104
from twisted.internet import reactor
107
def run_gtk1(config):
108
# Put these off until after we parse options, so we know what reactor
110
from twisted.internet import gtkreactor
112
from twisted.spread.ui import gtkutil
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
119
i = gtkmanhole.Interaction()
120
lw = gtkutil.Login(i.connected,
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'])
134
def run_gtk2(config):
135
# Put these off until after we parse options, so we know what reactor
137
from twisted.internet import gtk2reactor
138
gtk2reactor.install()
139
from twisted.spread.ui import gtk2util
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
149
'identityName': o['user'],
150
'password': o['password'],
151
'serviceName': o['service'],
152
'perspectiveName': o['perspective']
154
w = gtk2manhole.ManholeWindow()
155
w.setDefaults(defaults)
159
# from twisted.spread import pb
160
# can't do that, it installs a reactor. grr.
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()),)),
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"}
184
if __name__ == '__main__':