From 0dcaf314f7933a6852bd45ea1d6705bfb5659443 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Wed, 9 Aug 2006 18:29:33 +0200 Subject: [PATCH] Several fixes and cleanups --- shell/ActivityHost.py | 13 +++++++------ shell/PresenceView.py | 2 +- shell/Shell.py | 4 ++-- sugar/activity/Activity.py | 32 +++++++++++++++---------------- sugar/activity/ActivityFactory.py | 7 ++++--- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/shell/ActivityHost.py b/shell/ActivityHost.py index f2287c49..c5c03358 100644 --- a/shell/ActivityHost.py +++ b/shell/ActivityHost.py @@ -5,18 +5,19 @@ from sugar.activity import Activity from PeopleWindow import PeopleWindow class ActivityHost: - def __init__(self, shell, xid): + def __init__(self, shell, window): self._shell = shell - self._xid = xid - + + xid = window.get_xid() + bus = dbus.SessionBus() - path = Activity.ACTIVITY_SERVICE_PATH + "/%s" % xid - proxy_obj = bus.get_object(Activity.ACTIVITY_SERVICE_NAME, path) + proxy_obj = bus.get_object(Activity.get_service_name(xid), + Activity.get_object_path(xid)) self._activity = dbus.Interface(proxy_obj, Activity.ACTIVITY_INTERFACE) self._id = self._activity.get_id() self._default_type = self._activity.get_default_type() - self._window = gtk.gdk.window_foreign_new(xid) + self._window = gtk.gdk.window_foreign_new(window.get_xid()) self._people_window = PeopleWindow(shell, self) def get_id(self): diff --git a/shell/PresenceView.py b/shell/PresenceView.py index 4ecb7990..692d8361 100644 --- a/shell/PresenceView.py +++ b/shell/PresenceView.py @@ -111,7 +111,7 @@ class PresenceView(gtk.VBox): if buddy: chat_service = buddy.get_service_of_type(BuddyChat.SERVICE_TYPE) activity = self._shell.start_activity('com.redhat.Sugar.ChatActivity') - #activity.execute('start', [chat_service.object_path()]) + activity.execute('start', [chat_service.object_path()]) def __buddy_icon_changed_cb(self, buddy): it = self._get_iter_for_buddy(buddy) diff --git a/shell/Shell.py b/shell/Shell.py index a2398099..7b8074a6 100755 --- a/shell/Shell.py +++ b/shell/Shell.py @@ -17,6 +17,7 @@ from sugar.presence.PresenceService import PresenceService from ActivityHost import ActivityHost from ChatController import ChatController from sugar.activity import ActivityFactory +from sugar.activity import Activity class ShellDbusService(dbus.service.Object): def __init__(self, shell, bus_name): @@ -73,8 +74,7 @@ class Shell: def __window_opened_cb(self, screen, window): if window.get_window_type() == wnck.WINDOW_NORMAL: - xid = window.get_xid() - self._hosts[xid] = ActivityHost(self, xid) + self._hosts[window.get_xid()] = ActivityHost(self, window) def __window_closed_cb(self, screen, window): if window.get_window_type() == wnck.WINDOW_NORMAL: diff --git a/sugar/activity/Activity.py b/sugar/activity/Activity.py index ec745b29..cc7d9332 100644 --- a/sugar/activity/Activity.py +++ b/sugar/activity/Activity.py @@ -1,3 +1,5 @@ +import os + import dbus import dbus.service import gtk @@ -10,25 +12,23 @@ ACTIVITY_SERVICE_NAME = "org.laptop.Activity" ACTIVITY_SERVICE_PATH = "/org/laptop/Activity" ACTIVITY_INTERFACE = "org.laptop.Activity" +def get_service_name(xid): + return ACTIVITY_SERVICE_NAME + '%d' % xid + +def get_object_path(xid): + return ACTIVITY_SERVICE_PATH + "/%s" % xid + + class ActivityDbusService(dbus.service.Object): """Base dbus service object that each Activity uses to export dbus methods. The dbus service is separate from the actual Activity object so that we can tightly control what stuff passes through the dbus python bindings.""" - def __init__(self, pservice, xid, activity): + def start(self, pservice, activity): self._activity = activity self._pservice = pservice - bus = dbus.SessionBus() - service_name = ACTIVITY_SERVICE_NAME - self._object_path = ACTIVITY_SERVICE_PATH + "/%s" % xid - service = dbus.service.BusName(service_name, bus=bus) - dbus.service.Object.__init__(self, service, self._object_path) - - def get_object_path(self): - return self._object_path - @dbus.service.method(ACTIVITY_INTERFACE) def share(self): """Called by the shell to request the activity to share itself on the network.""" @@ -68,7 +68,7 @@ class ActivityDbusService(dbus.service.Object): class Activity(gtk.Window): """Base Activity class that all other Activities derive from.""" - def __init__(self, service = None): + def __init__(self): gtk.Window.__init__(self) self._shared = False @@ -82,17 +82,17 @@ class Activity(gtk.Window): group.realize() self.window.set_group(group.window) - self._bus = ActivityDbusService(self._pservice, self.window.xid, self) + bus = dbus.SessionBus() + xid = self.window.xid + bus_name = dbus.service.BusName(get_service_name(xid), bus=bus) + self._bus = ActivityDbusService(bus_name, get_object_path(xid)) + self._bus.start(self._pservice, self) def __del__(self): if self._bus: del self._bus self._bus = None - def get_object_path(self): - """Returns the path of the activity dbus service""" - return self._bus.get_object_path() - def set_default_type(self, default_type): """Set the activity default type. diff --git a/sugar/activity/ActivityFactory.py b/sugar/activity/ActivityFactory.py index e6cac082..3d47def1 100644 --- a/sugar/activity/ActivityFactory.py +++ b/sugar/activity/ActivityFactory.py @@ -38,7 +38,7 @@ class ActivityFactory(dbus.service.Object): @dbus.service.method("com.redhat.Sugar.ActivityFactory") def create(self): activity = self._class() - return activity.get_object_path() + return activity.window.xid def create(activity_name): """Create a new activity from his name.""" @@ -50,10 +50,11 @@ def create(activity_name): proxy_obj = bus.get_object(factory_name, factory_path) factory = dbus.Interface(proxy_obj, "com.redhat.Sugar.ActivityFactory") - activity_path = factory.create() + xid = factory.create() bus = dbus.SessionBus() - proxy_obj = bus.get_object(Activity.ACTIVITY_SERVICE_NAME, activity_path) + proxy_obj = bus.get_object(Activity.get_service_name(xid), + Activity.get_object_path(xid)) activity = dbus.Interface(proxy_obj, Activity.ACTIVITY_INTERFACE) return activity