[Sugar-devel] [PATCH sugar-toolkit] Restructure for new /usr/bin/sugar-activity behaviour

Daniel Drake dsd at laptop.org
Fri Dec 9 16:26:33 EST 2011


This patch accompanies a sugar patch titled
"sugar-activity: make independent of sugar-toolkit GTK versions"

The core Activity-instantiating functionality of main.py has been moved
into the sugar-activity binary and can be removed from here.

The remaining functionality (and everything that is GTK-specific) is moved
into the Activity class in this commit.

This is needed to make /usr/bin/sugar-activity independent of sugar/sugar3
and GTK2/GTK3, which is a crucial step for GTK3 activity support.

Signed-off-by: Daniel Drake <dsd at laptop.org>
---
 src/sugar/activity/Makefile.am |    1 -
 src/sugar/activity/activity.py |   22 ++++++
 src/sugar/activity/main.py     |  160 ----------------------------------------
 3 files changed, 22 insertions(+), 161 deletions(-)
 delete mode 100644 src/sugar/activity/main.py

diff --git a/src/sugar/activity/Makefile.am b/src/sugar/activity/Makefile.am
index 2c2eff1..f3a663a 100644
--- a/src/sugar/activity/Makefile.am
+++ b/src/sugar/activity/Makefile.am
@@ -7,6 +7,5 @@ sugar_PYTHON =              \
 	activityservice.py      \
 	bundlebuilder.py        \
 	i18n.py			\
-	main.py                 \
 	namingalert.py          \
 	widgets.py
diff --git a/src/sugar/activity/activity.py b/src/sugar/activity/activity.py
index 6548b61..5844506 100644
--- a/src/sugar/activity/activity.py
+++ b/src/sugar/activity/activity.py
@@ -70,8 +70,10 @@ from telepathy.interfaces import CHANNEL, \
 from telepathy.constants import CONNECTION_HANDLE_TYPE_CONTACT
 from telepathy.constants import CONNECTION_HANDLE_TYPE_ROOM
 
+import sugar
 from sugar import util
 from sugar.presence import presenceservice
+from sugar.activity import i18n
 from sugar.activity.activityservice import ActivityService
 from sugar.activity.namingalert import NamingAlert
 from sugar.graphics import style
@@ -258,6 +260,23 @@ class Activity(Window, gtk.Container):
             the base class __init()__ before doing Activity specific things.
 
         """
+
+        # Stuff that needs to be done early
+
+        locale_path = i18n.get_locale_path(self.get_bundle_id())
+        gettext.bindtextdomain(self.get_bundle_id(), locale_path)
+        gettext.bindtextdomain('sugar-toolkit', sugar.locale_path)
+        gettext.textdomain(self.get_bundle_id())
+
+        icons_path = os.path.join(get_bundle_path(), 'icons')
+        gtk.icon_theme_get_default().append_search_path(icons_path)
+
+        # This code can be removed when we grow an xsettings daemon (the GTK+
+        # init routines will then automatically figure out the font settings)
+        settings = gtk.settings_get_default()
+        settings.set_property('gtk-font-name',
+                              '%s %f' % (style.FONT_FACE, style.FONT_SIZE))
+
         Window.__init__(self)
 
         if 'SUGAR_ACTIVITY_ROOT' in os.environ:
@@ -348,6 +367,9 @@ class Activity(Window, gtk.Container):
                                            self.__jobject_updated_cb)
         self.set_title(self._jobject.metadata['title'])
 
+    def run_main_loop(self):
+        gtk.main()
+
     def _initialize_journal_object(self):
         title = _('%s Activity') % get_bundle_name()
         client = gconf.client_get_default()
diff --git a/src/sugar/activity/main.py b/src/sugar/activity/main.py
deleted file mode 100644
index d2a9302..0000000
--- a/src/sugar/activity/main.py
+++ /dev/null
@@ -1,160 +0,0 @@
-# Copyright (C) 2008 Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import os
-import sys
-import gettext
-from optparse import OptionParser
-
-import gtk
-import dbus
-import dbus.service
-import dbus.glib
-
-import sugar
-from sugar.activity import activityhandle
-from sugar.activity import i18n
-from sugar.bundle.activitybundle import ActivityBundle
-from sugar.graphics import style
-from sugar import logger
-
-
-def create_activity_instance(constructor, handle):
-    activity = constructor(handle)
-    activity.show()
-
-
-def get_single_process_name(bundle_id):
-    return bundle_id
-
-
-def get_single_process_path(bundle_id):
-    return '/' + bundle_id.replace('.', '/')
-
-
-class SingleProcess(dbus.service.Object):
-
-    def __init__(self, name_service, constructor):
-        self.constructor = constructor
-
-        bus = dbus.SessionBus()
-        bus_name = dbus.service.BusName(name_service, bus=bus)
-        object_path = get_single_process_path(name_service)
-        dbus.service.Object.__init__(self, bus_name, object_path)
-
-    @dbus.service.method('org.laptop.SingleProcess', in_signature='a{sv}')
-    def create(self, handle_dict):
-        handle = activityhandle.create_from_dict(handle_dict)
-        create_activity_instance(self.constructor, handle)
-
-
-def main():
-    parser = OptionParser()
-    parser.add_option('-b', '--bundle-id', dest='bundle_id',
-                      help='identifier of the activity bundle')
-    parser.add_option('-a', '--activity-id', dest='activity_id',
-                      help='identifier of the activity instance')
-    parser.add_option('-o', '--object-id', dest='object_id',
-                      help='identifier of the associated datastore object')
-    parser.add_option('-u', '--uri', dest='uri',
-                      help='URI to load')
-    parser.add_option('-s', '--single-process', dest='single_process',
-                      action='store_true',
-                      help='start all the instances in the same process')
-    parser.add_option('-i', '--invited', dest='invited',
-                      action='store_true', default=False,
-                      help='the activity is being launched for handling an '
-                           'invite from the network')
-    (options, args) = parser.parse_args()
-
-    logger.start()
-
-    if 'SUGAR_BUNDLE_PATH' not in os.environ:
-        print 'SUGAR_BUNDLE_PATH is not defined in the environment.'
-        sys.exit(1)
-
-    if len(args) == 0:
-        print 'A python class must be specified as first argument.'
-        sys.exit(1)
-
-    bundle_path = os.environ['SUGAR_BUNDLE_PATH']
-    sys.path.append(bundle_path)
-
-    bundle = ActivityBundle(bundle_path)
-
-    os.environ['SUGAR_BUNDLE_ID'] = bundle.get_bundle_id()
-    os.environ['SUGAR_BUNDLE_NAME'] = bundle.get_name()
-    os.environ['SUGAR_BUNDLE_VERSION'] = str(bundle.get_activity_version())
-
-    gtk.icon_theme_get_default().append_search_path(bundle.get_icons_path())
-
-    # This code can be removed when we grow an xsettings daemon (the GTK+
-    # init routines will then automatically figure out the font settings)
-    settings = gtk.settings_get_default()
-    settings.set_property('gtk-font-name',
-                          '%s %f' % (style.FONT_FACE, style.FONT_SIZE))
-
-    locale_path = i18n.get_locale_path(bundle.get_bundle_id())
-
-    gettext.bindtextdomain(bundle.get_bundle_id(), locale_path)
-    gettext.bindtextdomain('sugar-toolkit', sugar.locale_path)
-    gettext.textdomain(bundle.get_bundle_id())
-
-    splitted_module = args[0].rsplit('.', 1)
-    module_name = splitted_module[0]
-    class_name = splitted_module[1]
-
-    module = __import__(module_name)
-    for comp in module_name.split('.')[1:]:
-        module = getattr(module, comp)
-
-    activity_constructor = getattr(module, class_name)
-    activity_handle = activityhandle.ActivityHandle(
-            activity_id=options.activity_id,
-            object_id=options.object_id, uri=options.uri,
-            invited=options.invited)
-
-    if options.single_process is True:
-        sessionbus = dbus.SessionBus()
-
-        service_name = get_single_process_name(options.bundle_id)
-        service_path = get_single_process_path(options.bundle_id)
-
-        bus_object = sessionbus.get_object(
-                'org.freedesktop.DBus', '/org/freedesktop/DBus')
-        try:
-            name = bus_object.GetNameOwner(
-                    service_name, dbus_interface='org.freedesktop.DBus')
-        except  dbus.DBusException:
-            name = None
-
-        if not name:
-            SingleProcess(service_name, activity_constructor)
-        else:
-            single_process = sessionbus.get_object(service_name, service_path)
-            single_process.create(activity_handle.get_dict(),
-                                  dbus_interface='org.laptop.SingleProcess')
-
-            print 'Created %s in a single process.' % service_name
-            sys.exit(0)
-
-    if hasattr(module, 'start'):
-        module.start()
-
-    create_activity_instance(activity_constructor, activity_handle)
-
-    gtk.main()
-- 
1.7.7.3



More information about the Sugar-devel mailing list