sugar-toolkit-gtk3/shell/ActivityHost.py
2006-07-08 15:47:51 +02:00

131 lines
3.7 KiB
Python

import dbus
import gtk
import gobject
from sugar.chat.ActivityChat import ActivityChat
from WindowManager import WindowManager
import sugar.util
class ActivityHostSignalHelper(gobject.GObject):
__gsignals__ = {
'shared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([]))
}
def __init__(self, parent):
gobject.GObject.__init__(self)
self._parent = parent
def emit_shared(self):
self.emit('shared')
class ActivityHost(dbus.service.Object):
def __init__(self, bus_name, default_type, activity_id = None):
if activity_id is None:
self._activity_id = sugar.util.unique_id()
else:
self._activity_id = activity_id
self._default_type = default_type
self.dbus_object_name = "/com/redhat/Sugar/Shell/Activities/%s" % self._activity_id
dbus.service.Object.__init__(self, bus_name, self.dbus_object_name)
self._signal_helper = ActivityHostSignalHelper(self)
self.peer_service = None
self._shared = False
self._create_chat()
def _create_chat(self):
self._activity_chat = ActivityChat(self)
def got_focus(self):
if self.peer_service != None:
self.peer_service.got_focus()
def lost_focus(self):
self.peer_service.lost_focus()
def get_chat(self):
return self._activity_chat
def get_default_type(self):
return self._default_type
def publish(self):
self._activity_chat.publish()
self.peer_service.publish()
def connect(self, signal, func):
self._signal_helper.connect(signal, func)
def get_id(self):
"""Interface-type function to match activity.Activity's
get_id() function."""
return self._activity_id
def default_type(self):
"""Interface-type function to match activity.Activity's
default_type() function."""
return self._default_type
def get_object_path(self):
return self.dbus_object_name
def get_shared(self):
"""Return True if this activity is shared, False if
it has not been shared yet."""
return self._shared
def _shared_signal(self):
self._shared = True
self._signal_helper.emit_shared()
@dbus.service.method("com.redhat.Sugar.Shell.ActivityHost")
def set_peer_service_name(self, peer_service_name, peer_object_name):
self.__peer_service_name = peer_service_name
self.__peer_object_name = peer_object_name
session_bus = dbus.SessionBus()
self.peer_service = dbus.Interface(session_bus.get_object( \
self.__peer_service_name, self.__peer_object_name), \
"com.redhat.Sugar.Activity")
session_bus.add_signal_receiver(self._shared_signal,
signal_name="ActivityShared",
dbus_interface="com.redhat.Sugar.Activity",
named_service=self.__peer_service_name,
path=self.__peer_object_name)
@dbus.service.method("com.redhat.Sugar.Shell.ActivityHost")
def set_has_changes(self, has_changes):
pass
@dbus.service.method("com.redhat.Sugar.Shell.ActivityHost")
def set_title(self, text):
pass
@dbus.service.method("com.redhat.Sugar.Shell.ActivityHost")
def set_icon(self, data, colorspace, has_alpha, bits_per_sample, width, height, rowstride):
pixstr = ""
for c in data:
# Work around for a bug in dbus < 0.61 where integers
# are not correctly marshalled
if c < 0:
c += 256
pixstr += chr(c)
pixbuf = gtk.gdk.pixbuf_new_from_data(pixstr, colorspace, has_alpha,
bits_per_sample, width, height, rowstride)
@dbus.service.method("com.redhat.Sugar.Shell.ActivityHost")
def shutdown(self):
for owner, activity in self.activity_container.activities[:]:
if activity == self:
self.activity_container.activities.remove((owner, activity))
for i in range(self.activity_container.notebook.get_n_pages()):
child = self.activity_container.notebook.get_nth_page(i)
if child == self.socket:
self.activity_container.notebook.remove_page(i)
break
del self