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]

Reply via email to