Clutter.main() does not work with telepathy, but you are right it does
indeed work with dbus. In fact I tested the example program that comes
with python-dbus and it works fine.
Here is the modified (to use clutter.main()) example-signal-recipient.py
(you need example-signal-emitter.py to be running somewhere)
#!/usr/bin/env python
usage = """Usage:
python example-signal-emitter.py &
python example-signal-recipient.py
python example-signal-recipient.py --exit-service
"""
import sys
import traceback
import gobject
import clutter
import dbus
import dbus.mainloop.glib
def handle_reply(msg):
print msg
def handle_error(e):
print str(e)
def emit_signal():
#call the emitHelloSignal method
object.emitHelloSignal(dbus_interface="com.example.TestService")
#reply_handler = handle_reply, error_handler =
handle_error)
# exit after waiting a short time for the signal
gobject.timeout_add(2000, clutter.main_quit)
if sys.argv[1:] == ['--exit-service']:
object.Exit(dbus_interface='com.example.TestService')
return False
def hello_signal_handler(hello_string):
print ("Received signal (by connecting using remote object) and it
says: "
+ hello_string)
def catchall_signal_handler(*args, **kwargs):
print ("Caught signal (in catchall handler) "
+ kwargs['dbus_interface'] + "." + kwargs['member'])
for arg in args:
print " " + str(arg)
def catchall_hello_signals_handler(hello_string):
print "Received a hello signal and it says " + hello_string
def catchall_testservice_interface_handler(hello_string, dbus_message):
print "com.example.TestService interface says " + hello_string + "
when it sent signal " + dbus_message.get_member()
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
try:
object =
bus.get_object("com.example.TestService","/com/example/TestService/objec
t")
object.connect_to_signal("HelloSignal", hello_signal_handler,
dbus_interface="com.example.TestService", arg0="Hello")
except dbus.DBusException:
traceback.print_exc()
print usage
sys.exit(1)
#lets make a catchall
bus.add_signal_receiver(catchall_signal_handler,
interface_keyword='dbus_interface', member_keyword='member')
bus.add_signal_receiver(catchall_hello_signals_handler,
dbus_interface = "com.example.TestService", signal_name = "HelloSignal")
bus.add_signal_receiver(catchall_testservice_interface_handler,
dbus_interface = "com.example.TestService",
message_keyword='dbus_message')
# Tell the remote object to emit the signal after a short delay
gobject.timeout_add(2000, emit_signal)
#loop = gobject.MainLoop()
#loop.run()
clutter.main()
I have no idea why telepathy does not want to work the same way.
Thanks for your responses!
Ashwin
-----Original Message-----
From: Emmanuele Bassi [mailto:[EMAIL PROTECTED]
Sent: Tuesday, January 29, 2008 6:24 PM
To: [email protected]
Subject: Re: [clutter] clutter+gobject+dbus+mainloop integration
On Tue, 2008-01-29 at 08:27 +0000, Ross Burton wrote:
> On Mon, 2008-01-28 at 19:13 -0500, Kashyap Ashwin wrote:
> > In the above program, if I call clutter.main(), telepathy simply
> > refuses to run.
> >
> > My theory is that both clutter.main() and gobject.MainLoop()
> > eventually get a new gobject main loop, but the path is different. I
> > have a feeling this is somehow due to some ugly Python problem, but
if
> > you have a clue on why this happens, please let me know.
>
> The clutter loop is a glib main loop, yes. Try removing
clutter.main()
> and just using a gobject main loop. I'm not exactly an expert in the
> clutter main loop details (hopefully Emmanuele will reply too) but
that
> might work.
yes: you just spin a main loop, and it will "just work"(tm).
if you are not running the clutter main loop, though, but you are still
controlling the stage with clutter (that is: you are not embedding the
stage window inside another windowing environment like gtk+) then you
will have to intercept the CLUTTER_DELETE event (using a handler for
the ::event or the ::captured-event signals), stop *your* main loop
there and return True - otherwise clutter will assume that its main loop
is the one that's spinning, and will try and stop it, causing an
assertion failure (this is done as a sanity check). this is also the
case when running another main loop implementation with GMainLoop
support, like POE in Perl and twisted in Python.
caveat: this happens with clutter trunk, not with the stable branch; in
the stable branch you cannot do that and you either embed clutter inside
gtk+ and spin the gtk+ main loop, or you simply don't use another main
loop.
in any case: why isn't telepathy able to use the current main loop? I
guess d-bus can use the gtk+ main loop, so I don't understand why it
shouldn't be working with clutter's main loop as well.
ciao,
Emmanuele.
--
Emmanuele Bassi, OpenedHand Ltd.
Unit R, Homesdale Business Centre
216-218 Homesdale Rd., Bromley - BR12QZ
http://www.o-hand.com
--
To unsubscribe send a mail to [EMAIL PROTECTED]
--
To unsubscribe send a mail to [EMAIL PROTECTED]